ETH Price: $3,591.94 (-2.78%)

Token

ERC-20: EUV - 1 (EUV-1)
 

Overview

Max Total Supply

311,719.486525 EUV-1

Holders

320

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,000 EUV-1

Value
$0.00
0x95dd65f86280e7f5810da2d0dc20df17ed2cbd19
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:
UVPool

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-14
*/

// File: contracts/interfaces/IUVReserveFactory.sol


pragma solidity ^0.8.12;

interface IUVReserveFactory {
    function createReserve(
        address _fundWallet,
        address _pool,
        address _manager
    ) external;

    function addPoolRole(uint8 _orderNumber, address _manager) external;

    function removePoolRole(uint8 _orderNumber, address _manager) external;

    function addRole(address _addr) external;

    function removeRole(address _addr) external;

    function getPoolsLength() external view returns (uint256);

    function getPoolInfo(uint8 _orderNumber)
        external
        view
        returns (
            address _poolReserve,
            address _poolTP,
            address _manager,
            address _fundWallet
        );
}

// File: contracts/interfaces/IUVPool.sol


pragma solidity ^0.8.12;

interface IUVPool {
    function deposit(uint256 amount) external;

    function initialize(
        uint8 _orderNumber,
        uint256 _amountLimited,
        uint256 _minimumDeposit,
        address _fundWallet,
        address _factoryReserve,
        uint64 _poolOpenTime
    ) external;

    function transferForInvestment(
        address _tokenAddress,
        uint256 _amount,
        address _receiver
    ) external;

    function getReserve() external returns (address);

    function buyToken(
        uint256 _amountIn,
        uint256 _amountOutMin,
        address _tokenIn,
        bytes calldata _path,
        uint256 _deadline
    ) external;

    function setFundWallet(address _fundWallet) external;

    function setMinimumDeposit(uint256 _minimumDeposit) external;

    function openPool() external;

    function closePool() external;

    function setFeeCreator(uint256 _feeCreator) external;

    function addManager(address _manager) external;

    function removeManager(address _manager) external;

    function addInvestmentAddress(address _investmentAddress) external;

    function removeInvestmentAddress(address _investmentAddress) external;

    function createVote(
        uint8 _orderNumber,
        uint64 _startTimestamp,
        uint64 _endTimestamp
    ) external payable;

    function closeVote(uint8 _orderNumber) external;

    function voting(uint8 _orderNumber, uint8 _optionId) external;

    event Deposit(address indexed sender, uint256 amount);
    event BuyToken(address indexed tokenAddress, uint256 amount);
    event BuyBNB(uint256 amount);

    event CreateVote(uint8 voteId, uint64 startTimestamp, uint64 endTimestamp);
    event Voting(
        address indexed voter,
        uint256 amount,
        uint64 timestamp,
        uint8 optionId,
        uint64 voteCount
    );
    event CloseVote(uint8 voteId);
}

// File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol


pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

// File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol


pragma solidity >=0.7.5;
pragma abicoder v2;


/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}

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


// OpenZeppelin Contracts (last updated v4.6.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/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/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_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);
    }
}

// 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/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.7.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:
 *
 * ```
 * 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}:
 *
 * ```
 * 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.
 */
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(uint160(account), 20),
                        " 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.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.6.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: @uniswap/v3-periphery/contracts/libraries/TransferHelper.sol


pragma solidity >=0.6.0;


library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'STE');
    }
}

// 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.7.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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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;
        }
        _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;
        _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;
        }
        _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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/UVPool.sol


pragma solidity ^0.8.12;











contract UVPool is ERC20, ERC20Burnable, Ownable, AccessControl, IUVPool {
    using SafeMath for uint256;

    struct WhiteList {
        uint256 limitDeposit; 
        uint64 startTimeDeposit; 
        uint64 closeTimeDeposit;
    }

    struct Vote {
        string name;
        uint64 startTimestamp;
        uint64 endTimestamp;
        bool isActive;
        uint64 voteCount;
    }

    struct VoteInfo {
        uint64 timestamp;
        uint256 amount;
        uint8 optionId;
        address voter;
    }
    uint256 public feeCreator = 1 ether;
    mapping(uint8 => Vote) public allVotes;
    mapping(uint8 => mapping(address => VoteInfo)) public allVoters;
    mapping(uint8 => mapping(uint64 => VoteInfo)) public allVotersIndex;

    uint8 private constant PERCENT_FEE = 250;

    bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
    
    address public constant SWAP_ROUTER_ADDRESS =
        0xE592427A0AEce92De3Edee1F18E0157C05861564;
    address public constant stableCoin =
        0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

    uint64 public poolOpenTime;
    mapping(address => WhiteList) public whiteList;

    mapping(address => uint256) private _balances;
    mapping(address => bool) public investmentAddreses;
    ISwapRouter public swapRouter;
    address public factory;
    address public factoryReserve;
    address public fundWallet;
    uint256 public currentSizePool = 0;
    uint256 public maxSizePool;
    uint8 public orderNumber;
    uint256 public minimumDeposit;
    bool public isClose = false;
    bool public pausedTransfer = false;
    bool public voteCreateable = true;

    constructor(uint8 _orderNumber)
        ERC20(
            string.concat("EUV - ", Strings.toString(_orderNumber)),
            string.concat("EUV-", Strings.toString(_orderNumber))
        )
    {
        factory = msg.sender;
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MANAGER_ROLE, msg.sender);
    }

    // called once by the factory at time of deployment
    function initialize(
        uint8 _orderNumber,
        uint256 _amountLimited,
        uint256 _minimumDeposit,
        address _fundWallet,
        address _factoryReserve,
        uint64 _poolOpenTime
    ) external {
        require(msg.sender == factory, "FORBIDDEN"); // sufficient check
        minimumDeposit = _minimumDeposit;
        maxSizePool = _amountLimited;
        orderNumber = _orderNumber;
        swapRouter = ISwapRouter(SWAP_ROUTER_ADDRESS);
        poolOpenTime = _poolOpenTime;
        fundWallet = _fundWallet;
        factoryReserve = _factoryReserve;
    }

    receive() external payable {}

    fallback() external payable {}

    // Transfer tokens to fund wallet process projects vesting
    function transferForInvestment(
        address _tokenAddress,
        uint256 _amount,
        address _receiver
    ) external onlyRole(MANAGER_ROLE) {
        require(_receiver != address(0), "receiver address is zero");
        require(
            investmentAddreses[_receiver],
            "receiver is not investment address"
        );
        if (_tokenAddress == address(0)) {
            TransferHelper.safeTransferETH(_receiver, _amount);
        } else {
            TransferHelper.safeTransfer(_tokenAddress, _receiver, _amount);
        }
    }

    // Add white list for user
    function addsWhiteList(
        address[] memory _users,
        uint256 _limitDeposit,
        uint64 _startTimeDeposit,
        uint64 _closeTimeDeposit
    ) external onlyRole(MANAGER_ROLE) {
        require(_users.length > 0, "users is empty");
        require(_limitDeposit > 0, "limit deposit is zero");
        require(_startTimeDeposit > 0, "start time deposit is zero");
        require(_closeTimeDeposit > 0, "close time deposit is zero");
        require(
            _closeTimeDeposit > _startTimeDeposit,
            "close time deposit must be greater than start time deposit"
        );
        for (uint256 index = 0; index < _users.length; index++) {
            whiteList[_users[index]] = WhiteList({
                limitDeposit: _limitDeposit,
                startTimeDeposit: _startTimeDeposit,
                closeTimeDeposit: _closeTimeDeposit
            });
        }
    }

    // user in white list can deposit before pool open
    function wlDeposit(uint256 _amount) external {
        require(!isClose, "Pool is closed");
        require(_amount > 0, "Amount must be greater than zero");
        require(
            block.timestamp <= whiteList[msg.sender].closeTimeDeposit,
            "Deposit time is over"
        );
        require(
            block.timestamp >= whiteList[msg.sender].startTimeDeposit,
            "Deposit time is not start"
        );
        require(
            whiteList[msg.sender].limitDeposit >= _amount,
            "Deposit amount is over limit"
        );
        require(
            currentSizePool.add(_amount) <= maxSizePool,
            "Deposit amount is over limit"
        );
        require(_amount >= minimumDeposit, "Not enough");
        
        uint256 amount6Decimals = _amount.div(10**12);
        IERC20(stableCoin).transferFrom(msg.sender, address(this), amount6Decimals);
        _mint(msg.sender, _amount);
        _balances[msg.sender] = _balances[msg.sender].add(_amount);
        _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000));
        _balances[fundWallet] = _balances[fundWallet].add(
            _amount.mul(PERCENT_FEE).div(1000)
        );
        currentSizePool = currentSizePool.add(_amount);
        whiteList[msg.sender].limitDeposit = whiteList[msg.sender]
            .limitDeposit
            .sub(_amount);

        emit Deposit(msg.sender, _amount);
    }

    // Deposit stable coin to the pool
    function deposit(uint256 _amount) public {
        require(!isClose, "Pool is closed");
        require(maxSizePool >= currentSizePool.add(_amount), "Pool is full");
        require(_amount >= minimumDeposit, "Not enough");
        require(
            block.timestamp >= poolOpenTime,
            "Pool is not open yet, please wait"
        );

        uint256 amount6Decimals = _amount.div(10**12);
        IERC20(stableCoin).transferFrom(msg.sender, address(this), amount6Decimals);
        _mint(msg.sender, _amount);
        _balances[msg.sender] = _balances[msg.sender].add(_amount);
        _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000));
        _balances[fundWallet] = _balances[fundWallet].add(
            _amount.mul(PERCENT_FEE).div(1000)
        );

        currentSizePool += _amount;

        emit Deposit(msg.sender, _amount);
    }

    // Get pool reserved
    function getReserve() public view returns (address) {
        (address _poolReserved, , , ) = IUVReserveFactory(factoryReserve)
            .getPoolInfo(orderNumber);
        return _poolReserved;
    }

    // swap any token on uniswap
    function buyToken(
        uint256 _amountIn,
        uint256 _amountOutMin,
        address _tokenIn,
        bytes calldata _path,
        uint256 _deadline
    ) public onlyRole(MANAGER_ROLE) {
        require(isClose, "Pool is not closed");
        address _poolReserved = getReserve();

        TransferHelper.safeApprove(_tokenIn, address(swapRouter), _amountIn);

        ISwapRouter.ExactInputParams memory params = ISwapRouter
            .ExactInputParams({
                path: _path,
                recipient: _poolReserved,
                deadline: _deadline,
                amountIn: _amountIn,
                amountOutMinimum: _amountOutMin
            });

        // Executes the swap.
        uint256 realAmount = swapRouter.exactInput(params);

        emit BuyToken(_tokenIn, realAmount);
    }

    // toggles the paused state of the transfer function
    function togglePausedTransfer() public onlyRole(MANAGER_ROLE) {
        pausedTransfer = !pausedTransfer;
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(pausedTransfer == false, "ERC20: transfer is paused");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            amount <= _balances[sender],
            "ERC20: amount must be less or equal to balance"
        );

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        return _balances[owner];
    }

    // Add investment address
    function addInvestmentAddress(address _investmentAddress) public onlyOwner {
        investmentAddreses[_investmentAddress] = true;
    }

    // Remove investment address
    function removeInvestmentAddress(address _investmentAddress)
        public
        onlyOwner
    {
        investmentAddreses[_investmentAddress] = false;
    }

    // Set the fund wallet
    function setFundWallet(address _fundWallet) public onlyOwner {
        fundWallet = _fundWallet;
    }

    // Set the factory Reserve
    function setFactoryReserve(address _factoryReserve)
        public
        onlyRole(MANAGER_ROLE)
    {
        factoryReserve = _factoryReserve;
    }

    // Set minimum deposit amount
    function setMinimumDeposit(uint256 _minimumDeposit)
        public
        onlyRole(MANAGER_ROLE)
    {
        minimumDeposit = _minimumDeposit;
    }

    // open the pool
    function openPool() public onlyRole(MANAGER_ROLE) {
        isClose = false;
    }

    // close the pool
    function closePool() public onlyRole(MANAGER_ROLE) {
        isClose = true;
    }

    // get detail Vote
    function getVote(uint8 _orderNumber) public view returns (Vote memory) {
        return allVotes[_orderNumber];
    }

    // Set fee creator
    function setFeeCreator(uint256 _feeCreator) public onlyRole(MANAGER_ROLE) {
        feeCreator = _feeCreator;
    }

    // Add wallet to manager role
    function addManager(address _manager) public onlyOwner {
        _setupRole(MANAGER_ROLE, _manager);
    }

    // Remove wallet from manager role
    function removeManager(address _manager) public onlyOwner {
        revokeRole(MANAGER_ROLE, _manager);
    }

    // get detail VoteInfo by orderNumber
    function getVoteInfo(uint8 _orderNumber, address _user)
        public
        view
        returns (VoteInfo memory)
    {
        return allVoters[_orderNumber][_user];
    }

    // create a new vote
    function createVote(
        uint8 _orderNumber,
        uint64 _startTimestamp,
        uint64 _endTimestamp
    ) public payable {
        require(voteCreateable, "Vote is not createable");
        require(isClose, "Pool is not closed");
        if (hasRole(MANAGER_ROLE, msg.sender)) {} else {
            require(
                msg.value >= feeCreator,
                "You need to pay fee to create vote"
            );
            uint256 balance = balanceOf(msg.sender);
            require(
                balance >= totalSupply().div(10) ||
                    hasRole(MANAGER_ROLE, msg.sender),
                "You need to have 10% of total supply"
            );
        }

        allVotes[_orderNumber].startTimestamp = _startTimestamp;
        allVotes[_orderNumber].endTimestamp = _endTimestamp;
        allVotes[_orderNumber].isActive = true;
        voteCreateable = false;

        emit CreateVote(_orderNumber, _startTimestamp, _endTimestamp);
    }

    // close a vote
    function closeVote(uint8 _orderNumber) public onlyRole(MANAGER_ROLE) {
        allVotes[_orderNumber].isActive = false;
        voteCreateable = true;
        emit CloseVote(_orderNumber);
    }

    // voting for a option
    function voting(uint8 _orderNumber, uint8 _optionId) public {
        require(isClose, "This Pool is closed");
        require(allVotes[_orderNumber].isActive, "This Vote is closed");
        require(
            allVoters[_orderNumber][msg.sender].timestamp == 0,
            "You have voted"
        );
        require(
            allVoters[_orderNumber][msg.sender].amount == 0,
            "You have voted"
        );
        uint256 _amountBalance = balanceOf(msg.sender);

        transferFrom(msg.sender, address(this), _amountBalance);
        allVotes[_orderNumber].voteCount += 1;

        allVoters[_orderNumber][msg.sender] = VoteInfo({
            amount: _amountBalance,
            timestamp: uint64(block.timestamp),
            optionId: _optionId,
            voter: msg.sender
        });
        allVotersIndex[_orderNumber][
            allVotes[_orderNumber].voteCount
        ] = VoteInfo({
            amount: _amountBalance,
            timestamp: uint64(block.timestamp),
            optionId: _optionId,
            voter: msg.sender
        });

        emit Voting(
            msg.sender,
            _amountBalance,
            uint64(block.timestamp),
            _optionId,
            allVotes[_orderNumber].voteCount
        );
    }

    // internal release token after vote closed
    function releaseTokenAfterVote(
        uint8 _orderNumber,
        uint64 _from,
        uint64 _to
    ) external onlyRole(MANAGER_ROLE) {
        require(!allVotes[_orderNumber].isActive, "This Vote is still active");
        for (uint64 i = _from; i < _to; i++) {
            _transfer(
                address(this),
                allVotersIndex[_orderNumber][i].voter,
                allVotersIndex[_orderNumber][i].amount
            );
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBNB","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"}],"name":"CloseVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimestamp","type":"uint64"}],"name":"CreateVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"},{"indexed":false,"internalType":"uint8","name":"optionId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"voteCount","type":"uint64"}],"name":"Voting","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"addInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_limitDeposit","type":"uint256"},{"internalType":"uint64","name":"_startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"_closeTimeDeposit","type":"uint64"}],"name":"addsWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"allVoters","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"allVotersIndex","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"allVotes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"bytes","name":"_path","type":"bytes"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"closeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_startTimestamp","type":"uint64"},{"internalType":"uint64","name":"_endTimestamp","type":"uint64"}],"name":"createVote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSizePool","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":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint8","name":"_orderNumber","type":"uint8"}],"name":"getVote","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"internalType":"struct UVPool.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoteInfo","outputs":[{"components":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"internalType":"struct UVPool.VoteInfo","name":"","type":"tuple"}],"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":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint256","name":"_amountLimited","type":"uint256"},{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"address","name":"_factoryReserve","type":"address"},{"internalType":"uint64","name":"_poolOpenTime","type":"uint64"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investmentAddreses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClose","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderNumber","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolOpenTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_from","type":"uint64"},{"internalType":"uint64","name":"_to","type":"uint64"}],"name":"releaseTokenAfterVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"removeInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_factoryReserve","type":"address"}],"name":"setFactoryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeCreator","type":"uint256"}],"name":"setFeeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundWallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePausedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"transferForInvestment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"voteCreateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint8","name":"_optionId","type":"uint8"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"uint256","name":"limitDeposit","type":"uint256"},{"internalType":"uint64","name":"startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"closeTimeDeposit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"wlDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052670de0b6b3a764000060075560006013556017805462ffffff1916620100001790553480156200003357600080fd5b506040516200485c3803806200485c833981016040819052620000569162000436565b6200006f8160ff166200016960201b62002b771760201c565b604051602001620000819190620004a0565b604051602081830303815290604052620000a98260ff166200016960201b62002b771760201c565b604051602001620000bb9190620004bd565b60408051601f198184030181529190528151620000e090600390602085019062000390565b508051620000f690600490602084019062000390565b505050620001136200010d6200028660201b60201c565b6200028a565b601080546001600160a01b031916339081179091556200013690600090620002dc565b620001627f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0833620002dc565b50620005ee565b6060816200018e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620001be5780620001a581620004ee565b9150620001b69050600a8362000522565b915062000192565b6000816001600160401b03811115620001db57620001db62000539565b6040519080825280601f01601f19166020018201604052801562000206576020820181803683370190505b5090505b84156200027e576200021e6001836200054f565b91506200022d600a8662000569565b6200023a90603062000580565b60f81b8183815181106200025257620002526200059b565b60200101906001600160f81b031916908160001a90535062000276600a8662000522565b94506200020a565b949350505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002e88282620002ec565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620002e85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200034c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8280546200039e90620005b1565b90600052602060002090601f016020900481019282620003c257600085556200040d565b82601f10620003dd57805160ff19168380011785556200040d565b828001600101855582156200040d579182015b828111156200040d578251825591602001919060010190620003f0565b506200041b9291506200041f565b5090565b5b808211156200041b576000815560010162000420565b6000602082840312156200044957600080fd5b815160ff811681146200045b57600080fd5b9392505050565b6000815160005b8181101562000485576020818501810151868301520162000469565b8181111562000495576000828601525b509290920192915050565b65022aaab1016960d51b815260006200045b600683018462000462565b634555562d60e01b815260006200045b600483018462000462565b634e487b7160e01b600052601160045260246000fd5b6000600019821415620005055762000505620004d8565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200053457620005346200050c565b500490565b634e487b7160e01b600052604160045260246000fd5b600082821015620005645762000564620004d8565b500390565b6000826200057b576200057b6200050c565b500690565b60008219821115620005965762000596620004d8565b500190565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620005c657607f821691505b60208210811415620005e857634e487b7160e01b600052602260045260246000fd5b50919050565b61425e80620005fe6000396000f3fe6080604052600436106103c35760003560e01c806370a08231116101f0578063b6b55f251161010c578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610db1578063ec87621c14610dc6578063f2fde38b14610de8578063fcf4850414610e08578063febc6c4d14610e2857005b8063de09ee2414610d2c578063df75254014610d4c578063e40366c814610d61578063e78ec42e14610d9157005b8063cdae1104116100de578063cdae110414610cad578063cfc9fc4514610ccc578063d547741f14610cec578063dd62ed3e14610d0c57005b8063b6b55f2514610c2d578063c31c9c0714610c4d578063c345cafd14610c6d578063c45a015514610c8d57005b806391d1485411610189578063a217fddf1161015b578063a217fddf14610b9e578063a457c2d714610bb3578063a9059cbb14610bd3578063ac18de4314610bf3578063b04dd81b14610c1357005b806391d1485414610b2157806395d89b4114610b41578063992642e514610b565780639e0b65a614610b7e57005b806387e49c15116101c257806387e49c1514610aa55780638da5cb5b14610ac55780639040d55314610ae35780639194da6314610af957005b806370a0823114610a09578063715018a614610a3f57806379cc679014610a545780638635a57014610a7457005b8063373b4979116102df578063589666f911610278578063664a1ad61161024a578063664a1ad6146108bb57806366805de5146108db5780636943ca2b146108f05780636ae17b1b1461098f5780636d2dd6ba146109f357005b8063589666f91461085a57806359bf5d391461087a578063636bfbab1461088f5780636376539f146108a557005b806342966c68116102b157806342966c68146107c25780634777dbfe146107e257806350885acc1461081a57806355ce3b9a1461083a57005b8063373b49791461072a5780633805ab831461074a57806339509351146107825780633fa8ffa6146107a257005b806319157eaa1161035c5780632d06177a1161032e5780632d06177a1461063b5780632f2ff15d1461065b578063313ce5671461067b57806336568abe1461069d578063372c12b1146106bd57005b806319157eaa146104e95780631c52d6b6146104fc57806323b872dd146105eb578063248a9ca31461060b57005b80630d54538c116103955780630d54538c14610463578063124474a7146104835780631338f493146104b057806318160ddd146104ca57005b806301ffc9a7146103cc57806306fdde0314610401578063095ea7b3146104235780630bd541241461044357005b366103ca57005b005b3480156103d857600080fd5b506103ec6103e736600461395b565b610e48565b60405190151581526020015b60405180910390f35b34801561040d57600080fd5b50610416610e7f565b6040516103f891906139dd565b34801561042f57600080fd5b506103ec61043e366004613a15565b610f11565b34801561044f57600080fd5b506103ca61045e366004613a41565b610f29565b34801561046f57600080fd5b506103ca61047e366004613a86565b610f55565b34801561048f57600080fd5b506104a361049e366004613ac9565b61105f565b6040516103f89190613ae4565b3480156104bc57600080fd5b506017546103ec9060ff1681565b3480156104d657600080fd5b506002545b6040519081526020016103f8565b6103ca6104f7366004613a86565b611182565b34801561050857600080fd5b506105a3610517366004613b47565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b6040516103f8919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b3480156105f757600080fd5b506103ec610606366004613b7e565b6113d4565b34801561061757600080fd5b506104db610626366004613bbf565b60009081526006602052604090206001015490565b34801561064757600080fd5b506103ca610656366004613a41565b6113e1565b34801561066757600080fd5b506103ca610676366004613bd8565b611404565b34801561068757600080fd5b5060125b60405160ff90911681526020016103f8565b3480156106a957600080fd5b506103ca6106b8366004613bd8565b61142e565b3480156106c957600080fd5b506107056106d8366004613a41565b600c60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103f8565b34801561073657600080fd5b506103ca610745366004613c13565b6114ac565b34801561075657600080fd5b5060115461076a906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b34801561078e57600080fd5b506103ec61079d366004613a15565b611753565b3480156107ae57600080fd5b506103ca6107bd366004613bbf565b611775565b3480156107ce57600080fd5b506103ca6107dd366004613bbf565b611b96565b3480156107ee57600080fd5b50600b54610802906001600160401b031681565b6040516001600160401b0390911681526020016103f8565b34801561082657600080fd5b506103ca610835366004613bbf565b611ba0565b34801561084657600080fd5b506103ca610855366004613a41565b611bbe565b34801561086657600080fd5b506103ca610875366004613d02565b611be8565b34801561088657600080fd5b5061076a611d92565b34801561089b57600080fd5b506104db60165481565b3480156108b157600080fd5b506104db60145481565b3480156108c757600080fd5b5060125461076a906001600160a01b031681565b3480156108e757600080fd5b506103ca611e14565b3480156108fc57600080fd5b5061095461090b366004613b47565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b031660608201526080016103f8565b34801561099b57600080fd5b506109546109aa366004613da2565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b3480156109ff57600080fd5b506104db60135481565b348015610a1557600080fd5b506104db610a24366004613a41565b6001600160a01b03166000908152600d602052604090205490565b348015610a4b57600080fd5b506103ca611e3c565b348015610a6057600080fd5b506103ca610a6f366004613a15565b611e50565b348015610a8057600080fd5b50610a94610a8f366004613ac9565b611e65565b6040516103f8959493929190613dd5565b348015610ab157600080fd5b506103ca610ac0366004613a41565b611f32565b348015610ad157600080fd5b506005546001600160a01b031661076a565b348015610aef57600080fd5b506104db60075481565b348015610b0557600080fd5b5061076a73e592427a0aece92de3edee1f18e0157c0586156481565b348015610b2d57600080fd5b506103ec610b3c366004613bd8565b611f6d565b348015610b4d57600080fd5b50610416611f98565b348015610b6257600080fd5b5061076a73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b348015610b8a57600080fd5b506103ca610b99366004613e1a565b611fa7565b348015610baa57600080fd5b506104db600081565b348015610bbf57600080fd5b506103ec610bce366004613a15565b6120b6565b348015610bdf57600080fd5b506103ec610bee366004613a15565b61213c565b348015610bff57600080fd5b506103ca610c0e366004613a41565b612152565b348015610c1f57600080fd5b5060155461068b9060ff1681565b348015610c3957600080fd5b506103ca610c48366004613bbf565b612172565b348015610c5957600080fd5b50600f5461076a906001600160a01b031681565b348015610c7957600080fd5b506103ca610c88366004613e5c565b61240e565b348015610c9957600080fd5b5060105461076a906001600160a01b031681565b348015610cb957600080fd5b506017546103ec90610100900460ff1681565b348015610cd857600080fd5b506103ca610ce7366004613e86565b6128b6565b348015610cf857600080fd5b506103ca610d07366004613bd8565b61298e565b348015610d1857600080fd5b506104db610d27366004613ef0565b6129b3565b348015610d3857600080fd5b506103ca610d47366004613a41565b6129de565b348015610d5857600080fd5b506103ca612a07565b348015610d6d57600080fd5b506103ec610d7c366004613a41565b600e6020526000908152604090205460ff1681565b348015610d9d57600080fd5b506103ca610dac366004613bbf565b612a3d565b348015610dbd57600080fd5b506103ca612a5b565b348015610dd257600080fd5b506104db60008051602061420983398151915281565b348015610df457600080fd5b506103ca610e03366004613a41565b612a80565b348015610e1457600080fd5b506103ca610e23366004613ac9565b612af6565b348015610e3457600080fd5b506017546103ec9062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e7957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610e8e90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90613f0e565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b600033610f1f818585612c7c565b5060019392505050565b610f31612da1565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600080516020614209833981519152610f6d81612dfb565b60ff808516600090815260086020526040902060010154600160801b90041615610fde5760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110585760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110469130916101009091046001600160a01b031690612e05565b8061105081613f5f565b915050610fe0565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110b690613f0e565b80601f01602080910402602001604051908101604052809291908181526020018280546110e290613f0e565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60175462010000900460ff166111d35760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610fd5565b60175460ff1661121a5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b61123260008051602061420983398151915233611f6d565b1561123c57611335565b6007543410156112995760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610fd5565b336000908152600d60205260409020546002546112ba90600a905b906130aa565b811015806112db57506112db60008051602061420983398151915233611f6d565b6113335760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610fd5565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556017805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f1f848484612e05565b6113e9612da1565b611401600080516020614209833981519152826130bd565b50565b60008281526006602052604090206001015461141f81612dfb565b61142983836130c3565b505050565b6001600160a01b038116331461149e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610fd5565b6114a88282613149565b5050565b6000805160206142098339815191526114c481612dfb565b60008551116115065760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610fd5565b6000841161154e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610fd5565b6000836001600160401b0316116115a75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b6000826001600160401b0316116116005760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b826001600160401b0316826001600160401b0316116116875760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610fd5565b60005b855181101561174b576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600c60008884815181106116d6576116d6613f86565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061174381613f9c565b91505061168a565b505050505050565b600033610f1f81858561176683836129b3565b6117709190613fb7565b612c7c565b60175460ff16156117b95760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b600081116118095760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610fd5565b336000908152600c6020526040902060010154600160401b90046001600160401b03164211156118725760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610fd5565b336000908152600c60205260409020600101546001600160401b03164210156118dd5760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610fd5565b336000908152600c602052604090205481111561193c5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b60145460135461194c90836131b0565b111561199a5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b6016548110156119d95760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b60006119ea8264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190613fcf565b50611a7a33836131bc565b336000908152600d6020526040902054611a9490836131b0565b336000908152600d6020526040902055601254611aca906001600160a01b0316611ac56103e86112b48660fa61329b565b6131bc565b611aff611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040902054906131b0565b6012546001600160a01b03166000908152600d6020526040902055601354611b2790836131b0565b601355336000908152600c6020526040902054611b4490836132a7565b336000818152600c6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b8a9085815260200190565b60405180910390a25050565b61140133826132b3565b600080516020614209833981519152611bb881612dfb565b50600755565b611bc6612da1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614209833981519152611c0081612dfb565b60175460ff16611c475760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b6000611c51611d92565b600f54909150611c6c9087906001600160a01b03168a613401565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052600f54925163c04b8d5960e01b8152939450909291169063c04b8d5990611cfe908590600401613ff1565b6020604051808303816000875af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190614049565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7e91815260200190565b60405180910390a250505050505050505050565b6011546015546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614062565b5091949350505050565b600080516020614209833981519152611e2c81612dfb565b506017805460ff19166001179055565b611e44612da1565b611e4e60006134fa565b565b611e5b82338361354c565b6114a882826132b3565b600860205260009081526040902080548190611e8090613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eac90613f0e565b8015611ef95780601f10611ece57610100808354040283529160200191611ef9565b820191906000526020600020905b815481529060010190602001808311611edc57829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b600080516020614209833981519152611f4a81612dfb565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610e8e90613f0e565b600080516020614209833981519152611fbf81612dfb565b6001600160a01b0382166120155760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610fd5565b6001600160a01b0382166000908152600e602052604090205460ff166120885760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0384166120a5576120a082846135c0565b6120b0565b6120b0848385613663565b50505050565b600033816120c482866129b3565b9050838110156121245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fd5565b6121318286868403612c7c565b506001949350505050565b6000612149338484612e05565b50600192915050565b61215a612da1565b6114016000805160206142098339815191528261298e565b60175460ff16156121b65760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b6013546121c390826131b0565b60145410156122035760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610fd5565b6016548110156122425760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b600b546001600160401b03164210156122a75760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610fd5565b60006122b88264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d9190613fcf565b5061234833836131bc565b336000908152600d602052604090205461236290836131b0565b336000908152600d6020526040902055601254612393906001600160a01b0316611ac56103e86112b48660fa61329b565b6123a7611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040812091909155601380548492906123d7908490613fb7565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b8a565b60175460ff166124565760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff808316600090815260086020526040902060010154600160801b9004166124b75760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020546001600160401b03161561251c5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020600101541561257b5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b336000818152600d6020526040902054906125979030836113d4565b5060ff83166000908152600860205260409020600190810180546011906125cf908490600160881b90046001600160401b03166140c1565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128a994939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6010546001600160a01b031633146128fc5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610fd5565b6016939093556014939093556015805460ff90951660ff1990951694909417909355600f80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600b80546001600160401b0390931667ffffffffffffffff1990931692909217909155601280546001600160a01b0394851690831617905560118054929093169116179055565b6000828152600660205260409020600101546129a981612dfb565b6114298383613149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129e6612da1565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b600080516020614209833981519152612a1f81612dfb565b506017805461ff001981166101009182900460ff1615909102179055565b600080516020614209833981519152612a5581612dfb565b50601655565b600080516020614209833981519152612a7381612dfb565b506017805460ff19169055565b612a88612da1565b6001600160a01b038116612aed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fd5565b611401816134fa565b600080516020614209833981519152612b0e81612dfb565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556017805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081612b9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612bc55780612baf81613f9c565b9150612bbe9050600a83614102565b9150612b9f565b6000816001600160401b03811115612bdf57612bdf613bfd565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b5090505b8415612c7457612c1e600183614116565b9150612c2b600a8661412d565b612c36906030613fb7565b60f81b818381518110612c4b57612c4b613f86565b60200101906001600160f81b031916908160001a905350612c6d600a86614102565b9450612c0d565b949350505050565b6001600160a01b038316612cde5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fd5565b6001600160a01b038216612d3f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fd5565b611401813361375c565b6001600160a01b038316612e695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610fd5565b6001600160a01b038216612ecb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610fd5565b601754610100900460ff1615612f235760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610fd5565b60008111612f855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610fd5565b6001600160a01b0383166000908152600d60205260409020548111156130045760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610fd5565b6001600160a01b0383166000908152600d602052604090205461302790826132a7565b6001600160a01b038085166000908152600d6020526040808220939093559084168152205461305690826131b0565b6001600160a01b038084166000818152600d602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d949085815260200190565b60006130b68284614102565b9392505050565b6114a882825b6130cd8282611f6d565b6114a85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131053390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131538282611f6d565b156114a85760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130b68284613fb7565b6001600160a01b0382166132125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610fd5565b80600260008282546132249190613fb7565b90915550506001600160a01b03821660009081526020819052604081208054839290613251908490613fb7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006130b68284614141565b60006130b68284614116565b6001600160a01b0382166133135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610fd5565b6001600160a01b038216600090815260208190526040902054818110156133875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610fd5565b6001600160a01b03831660009081526020819052604081208383039055600280548492906133b6908490614116565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161345d9190614160565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b50915091508180156134c95750805115806134c95750808060200190518101906134c99190613fcf565b6110585760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610fd5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061355884846129b3565b905060001981146120b057818110156135b35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610fd5565b6120b08484848403612c7c565b604080516000808252602082019092526001600160a01b0384169083906040516135ea9190614160565b60006040518083038185875af1925050503d8060008114613627576040519150601f19603f3d011682016040523d82523d6000602084013e61362c565b606091505b50509050806114295760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610fd5565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916136bf9190614160565b6000604051808303816000865af19150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081801561372b57508051158061372b57508080602001905181019061372b9190613fcf565b6110585760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610fd5565b6137668282611f6d565b6114a85761377e816001600160a01b031660146137c0565b6137898360206137c0565b60405160200161379a92919061417c565b60408051601f198184030181529082905262461bcd60e51b8252610fd5916004016139dd565b606060006137cf836002614141565b6137da906002613fb7565b6001600160401b038111156137f1576137f1613bfd565b6040519080825280601f01601f19166020018201604052801561381b576020820181803683370190505b509050600360fc1b8160008151811061383657613836613f86565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061386557613865613f86565b60200101906001600160f81b031916908160001a9053506000613889846002614141565b613894906001613fb7565b90505b600181111561390c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138c8576138c8613f86565b1a60f81b8282815181106138de576138de613f86565b60200101906001600160f81b031916908160001a90535060049490941c93613905816141f1565b9050613897565b5083156130b65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fd5565b60006020828403121561396d57600080fd5b81356001600160e01b0319811681146130b657600080fd5b60005b838110156139a0578181015183820152602001613988565b838111156120b05750506000910152565b600081518084526139c9816020860160208601613985565b601f01601f19169290920160200192915050565b6020815260006130b660208301846139b1565b6001600160a01b038116811461140157600080fd5b8035613a10816139f0565b919050565b60008060408385031215613a2857600080fd5b8235613a33816139f0565b946020939093013593505050565b600060208284031215613a5357600080fd5b81356130b6816139f0565b803560ff81168114613a1057600080fd5b80356001600160401b0381168114613a1057600080fd5b600080600060608486031215613a9b57600080fd5b613aa484613a5e565b9250613ab260208501613a6f565b9150613ac060408501613a6f565b90509250925092565b600060208284031215613adb57600080fd5b6130b682613a5e565b602081526000825160a06020840152613b0060c08401826139b1565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613b5a57600080fd5b613b6383613a5e565b91506020830135613b73816139f0565b809150509250929050565b600080600060608486031215613b9357600080fd5b8335613b9e816139f0565b92506020840135613bae816139f0565b929592945050506040919091013590565b600060208284031215613bd157600080fd5b5035919050565b60008060408385031215613beb57600080fd5b823591506020830135613b73816139f0565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613c2957600080fd5b84356001600160401b0380821115613c4057600080fd5b818701915087601f830112613c5457600080fd5b8135602082821115613c6857613c68613bfd565b8160051b604051601f19603f83011681018181108682111715613c8d57613c8d613bfd565b60405292835281830193508481018201928b841115613cab57600080fd5b948201945b83861015613cd057613cc186613a05565b85529482019493820193613cb0565b9850508801359550613ce9925050604087019050613a6f565b9150613cf760608601613a6f565b905092959194509250565b60008060008060008060a08789031215613d1b57600080fd5b86359550602087013594506040870135613d34816139f0565b935060608701356001600160401b0380821115613d5057600080fd5b818901915089601f830112613d6457600080fd5b813581811115613d7357600080fd5b8a6020828501011115613d8557600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613db557600080fd5b613dbe83613a5e565b9150613dcc60208401613a6f565b90509250929050565b60a081526000613de860a08301886139b1565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613e2f57600080fd5b8335613e3a816139f0565b9250602084013591506040840135613e51816139f0565b809150509250925092565b60008060408385031215613e6f57600080fd5b613e7883613a5e565b9150613dcc60208401613a5e565b60008060008060008060c08789031215613e9f57600080fd5b613ea887613a5e565b955060208701359450604087013593506060870135613ec6816139f0565b92506080870135613ed6816139f0565b9150613ee460a08801613a6f565b90509295509295509295565b60008060408385031215613f0357600080fd5b8235613b63816139f0565b600181811c90821680613f2257607f821691505b60208210811415613f4357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681811415613f7c57613f7c613f49565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fb057613fb0613f49565b5060010190565b60008219821115613fca57613fca613f49565b500190565b600060208284031215613fe157600080fd5b815180151581146130b657600080fd5b602081526000825160a0602084015261400d60c08401826139b1565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561405b57600080fd5b5051919050565b6000806000806080858703121561407857600080fd5b8451614083816139f0565b6020860151909450614094816139f0565b60408601519093506140a5816139f0565b60608601519092506140b6816139f0565b939692955090935050565b60006001600160401b038083168185168083038211156140e3576140e3613f49565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082614111576141116140ec565b500490565b60008282101561412857614128613f49565b500390565b60008261413c5761413c6140ec565b500690565b600081600019048311821515161561415b5761415b613f49565b500290565b60008251614172818460208701613985565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516141b4816017850160208801613985565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141e5816028840160208801613985565b01602801949350505050565b60008161420057614200613f49565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a26469706673582212205e7097b4f91470c91f0e29b95afab1d26949239c5e480fab23a3641b7c015caf64736f6c634300080c00330000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x6080604052600436106103c35760003560e01c806370a08231116101f0578063b6b55f251161010c578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610db1578063ec87621c14610dc6578063f2fde38b14610de8578063fcf4850414610e08578063febc6c4d14610e2857005b8063de09ee2414610d2c578063df75254014610d4c578063e40366c814610d61578063e78ec42e14610d9157005b8063cdae1104116100de578063cdae110414610cad578063cfc9fc4514610ccc578063d547741f14610cec578063dd62ed3e14610d0c57005b8063b6b55f2514610c2d578063c31c9c0714610c4d578063c345cafd14610c6d578063c45a015514610c8d57005b806391d1485411610189578063a217fddf1161015b578063a217fddf14610b9e578063a457c2d714610bb3578063a9059cbb14610bd3578063ac18de4314610bf3578063b04dd81b14610c1357005b806391d1485414610b2157806395d89b4114610b41578063992642e514610b565780639e0b65a614610b7e57005b806387e49c15116101c257806387e49c1514610aa55780638da5cb5b14610ac55780639040d55314610ae35780639194da6314610af957005b806370a0823114610a09578063715018a614610a3f57806379cc679014610a545780638635a57014610a7457005b8063373b4979116102df578063589666f911610278578063664a1ad61161024a578063664a1ad6146108bb57806366805de5146108db5780636943ca2b146108f05780636ae17b1b1461098f5780636d2dd6ba146109f357005b8063589666f91461085a57806359bf5d391461087a578063636bfbab1461088f5780636376539f146108a557005b806342966c68116102b157806342966c68146107c25780634777dbfe146107e257806350885acc1461081a57806355ce3b9a1461083a57005b8063373b49791461072a5780633805ab831461074a57806339509351146107825780633fa8ffa6146107a257005b806319157eaa1161035c5780632d06177a1161032e5780632d06177a1461063b5780632f2ff15d1461065b578063313ce5671461067b57806336568abe1461069d578063372c12b1146106bd57005b806319157eaa146104e95780631c52d6b6146104fc57806323b872dd146105eb578063248a9ca31461060b57005b80630d54538c116103955780630d54538c14610463578063124474a7146104835780631338f493146104b057806318160ddd146104ca57005b806301ffc9a7146103cc57806306fdde0314610401578063095ea7b3146104235780630bd541241461044357005b366103ca57005b005b3480156103d857600080fd5b506103ec6103e736600461395b565b610e48565b60405190151581526020015b60405180910390f35b34801561040d57600080fd5b50610416610e7f565b6040516103f891906139dd565b34801561042f57600080fd5b506103ec61043e366004613a15565b610f11565b34801561044f57600080fd5b506103ca61045e366004613a41565b610f29565b34801561046f57600080fd5b506103ca61047e366004613a86565b610f55565b34801561048f57600080fd5b506104a361049e366004613ac9565b61105f565b6040516103f89190613ae4565b3480156104bc57600080fd5b506017546103ec9060ff1681565b3480156104d657600080fd5b506002545b6040519081526020016103f8565b6103ca6104f7366004613a86565b611182565b34801561050857600080fd5b506105a3610517366004613b47565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b6040516103f8919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b3480156105f757600080fd5b506103ec610606366004613b7e565b6113d4565b34801561061757600080fd5b506104db610626366004613bbf565b60009081526006602052604090206001015490565b34801561064757600080fd5b506103ca610656366004613a41565b6113e1565b34801561066757600080fd5b506103ca610676366004613bd8565b611404565b34801561068757600080fd5b5060125b60405160ff90911681526020016103f8565b3480156106a957600080fd5b506103ca6106b8366004613bd8565b61142e565b3480156106c957600080fd5b506107056106d8366004613a41565b600c60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103f8565b34801561073657600080fd5b506103ca610745366004613c13565b6114ac565b34801561075657600080fd5b5060115461076a906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b34801561078e57600080fd5b506103ec61079d366004613a15565b611753565b3480156107ae57600080fd5b506103ca6107bd366004613bbf565b611775565b3480156107ce57600080fd5b506103ca6107dd366004613bbf565b611b96565b3480156107ee57600080fd5b50600b54610802906001600160401b031681565b6040516001600160401b0390911681526020016103f8565b34801561082657600080fd5b506103ca610835366004613bbf565b611ba0565b34801561084657600080fd5b506103ca610855366004613a41565b611bbe565b34801561086657600080fd5b506103ca610875366004613d02565b611be8565b34801561088657600080fd5b5061076a611d92565b34801561089b57600080fd5b506104db60165481565b3480156108b157600080fd5b506104db60145481565b3480156108c757600080fd5b5060125461076a906001600160a01b031681565b3480156108e757600080fd5b506103ca611e14565b3480156108fc57600080fd5b5061095461090b366004613b47565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b031660608201526080016103f8565b34801561099b57600080fd5b506109546109aa366004613da2565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b3480156109ff57600080fd5b506104db60135481565b348015610a1557600080fd5b506104db610a24366004613a41565b6001600160a01b03166000908152600d602052604090205490565b348015610a4b57600080fd5b506103ca611e3c565b348015610a6057600080fd5b506103ca610a6f366004613a15565b611e50565b348015610a8057600080fd5b50610a94610a8f366004613ac9565b611e65565b6040516103f8959493929190613dd5565b348015610ab157600080fd5b506103ca610ac0366004613a41565b611f32565b348015610ad157600080fd5b506005546001600160a01b031661076a565b348015610aef57600080fd5b506104db60075481565b348015610b0557600080fd5b5061076a73e592427a0aece92de3edee1f18e0157c0586156481565b348015610b2d57600080fd5b506103ec610b3c366004613bd8565b611f6d565b348015610b4d57600080fd5b50610416611f98565b348015610b6257600080fd5b5061076a73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b348015610b8a57600080fd5b506103ca610b99366004613e1a565b611fa7565b348015610baa57600080fd5b506104db600081565b348015610bbf57600080fd5b506103ec610bce366004613a15565b6120b6565b348015610bdf57600080fd5b506103ec610bee366004613a15565b61213c565b348015610bff57600080fd5b506103ca610c0e366004613a41565b612152565b348015610c1f57600080fd5b5060155461068b9060ff1681565b348015610c3957600080fd5b506103ca610c48366004613bbf565b612172565b348015610c5957600080fd5b50600f5461076a906001600160a01b031681565b348015610c7957600080fd5b506103ca610c88366004613e5c565b61240e565b348015610c9957600080fd5b5060105461076a906001600160a01b031681565b348015610cb957600080fd5b506017546103ec90610100900460ff1681565b348015610cd857600080fd5b506103ca610ce7366004613e86565b6128b6565b348015610cf857600080fd5b506103ca610d07366004613bd8565b61298e565b348015610d1857600080fd5b506104db610d27366004613ef0565b6129b3565b348015610d3857600080fd5b506103ca610d47366004613a41565b6129de565b348015610d5857600080fd5b506103ca612a07565b348015610d6d57600080fd5b506103ec610d7c366004613a41565b600e6020526000908152604090205460ff1681565b348015610d9d57600080fd5b506103ca610dac366004613bbf565b612a3d565b348015610dbd57600080fd5b506103ca612a5b565b348015610dd257600080fd5b506104db60008051602061420983398151915281565b348015610df457600080fd5b506103ca610e03366004613a41565b612a80565b348015610e1457600080fd5b506103ca610e23366004613ac9565b612af6565b348015610e3457600080fd5b506017546103ec9062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e7957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610e8e90613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90613f0e565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b600033610f1f818585612c7c565b5060019392505050565b610f31612da1565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600080516020614209833981519152610f6d81612dfb565b60ff808516600090815260086020526040902060010154600160801b90041615610fde5760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110585760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110469130916101009091046001600160a01b031690612e05565b8061105081613f5f565b915050610fe0565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110b690613f0e565b80601f01602080910402602001604051908101604052809291908181526020018280546110e290613f0e565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60175462010000900460ff166111d35760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610fd5565b60175460ff1661121a5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b61123260008051602061420983398151915233611f6d565b1561123c57611335565b6007543410156112995760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610fd5565b336000908152600d60205260409020546002546112ba90600a905b906130aa565b811015806112db57506112db60008051602061420983398151915233611f6d565b6113335760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610fd5565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556017805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f1f848484612e05565b6113e9612da1565b611401600080516020614209833981519152826130bd565b50565b60008281526006602052604090206001015461141f81612dfb565b61142983836130c3565b505050565b6001600160a01b038116331461149e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610fd5565b6114a88282613149565b5050565b6000805160206142098339815191526114c481612dfb565b60008551116115065760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610fd5565b6000841161154e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610fd5565b6000836001600160401b0316116115a75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b6000826001600160401b0316116116005760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610fd5565b826001600160401b0316826001600160401b0316116116875760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610fd5565b60005b855181101561174b576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600c60008884815181106116d6576116d6613f86565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061174381613f9c565b91505061168a565b505050505050565b600033610f1f81858561176683836129b3565b6117709190613fb7565b612c7c565b60175460ff16156117b95760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b600081116118095760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610fd5565b336000908152600c6020526040902060010154600160401b90046001600160401b03164211156118725760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610fd5565b336000908152600c60205260409020600101546001600160401b03164210156118dd5760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610fd5565b336000908152600c602052604090205481111561193c5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b60145460135461194c90836131b0565b111561199a5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610fd5565b6016548110156119d95760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b60006119ea8264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190613fcf565b50611a7a33836131bc565b336000908152600d6020526040902054611a9490836131b0565b336000908152600d6020526040902055601254611aca906001600160a01b0316611ac56103e86112b48660fa61329b565b6131bc565b611aff611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040902054906131b0565b6012546001600160a01b03166000908152600d6020526040902055601354611b2790836131b0565b601355336000908152600c6020526040902054611b4490836132a7565b336000818152600c6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b8a9085815260200190565b60405180910390a25050565b61140133826132b3565b600080516020614209833981519152611bb881612dfb565b50600755565b611bc6612da1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614209833981519152611c0081612dfb565b60175460ff16611c475760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610fd5565b6000611c51611d92565b600f54909150611c6c9087906001600160a01b03168a613401565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052600f54925163c04b8d5960e01b8152939450909291169063c04b8d5990611cfe908590600401613ff1565b6020604051808303816000875af1158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190614049565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7e91815260200190565b60405180910390a250505050505050505050565b6011546015546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0a9190614062565b5091949350505050565b600080516020614209833981519152611e2c81612dfb565b506017805460ff19166001179055565b611e44612da1565b611e4e60006134fa565b565b611e5b82338361354c565b6114a882826132b3565b600860205260009081526040902080548190611e8090613f0e565b80601f0160208091040260200160405190810160405280929190818152602001828054611eac90613f0e565b8015611ef95780601f10611ece57610100808354040283529160200191611ef9565b820191906000526020600020905b815481529060010190602001808311611edc57829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b600080516020614209833981519152611f4a81612dfb565b50601180546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610e8e90613f0e565b600080516020614209833981519152611fbf81612dfb565b6001600160a01b0382166120155760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610fd5565b6001600160a01b0382166000908152600e602052604090205460ff166120885760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0384166120a5576120a082846135c0565b6120b0565b6120b0848385613663565b50505050565b600033816120c482866129b3565b9050838110156121245760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fd5565b6121318286868403612c7c565b506001949350505050565b6000612149338484612e05565b50600192915050565b61215a612da1565b6114016000805160206142098339815191528261298e565b60175460ff16156121b65760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610fd5565b6013546121c390826131b0565b60145410156122035760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610fd5565b6016548110156122425760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610fd5565b600b546001600160401b03164210156122a75760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610fd5565b60006122b88264e8d4a510006130aa565b6040516323b872dd60e01b81523360048201523060248201526044810182905290915073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906323b872dd906064016020604051808303816000875af1158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d9190613fcf565b5061234833836131bc565b336000908152600d602052604090205461236290836131b0565b336000908152600d6020526040902055601254612393906001600160a01b0316611ac56103e86112b48660fa61329b565b6123a7611ade6103e86112b48560fa61329b565b6012546001600160a01b03166000908152600d6020526040812091909155601380548492906123d7908490613fb7565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b8a565b60175460ff166124565760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff808316600090815260086020526040902060010154600160801b9004166124b75760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020546001600160401b03161561251c5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b60ff821660009081526009602090815260408083203384529091529020600101541561257b5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610fd5565b336000818152600d6020526040902054906125979030836113d4565b5060ff83166000908152600860205260409020600190810180546011906125cf908490600160881b90046001600160401b03166140c1565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128a994939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6010546001600160a01b031633146128fc5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610fd5565b6016939093556014939093556015805460ff90951660ff1990951694909417909355600f80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600b80546001600160401b0390931667ffffffffffffffff1990931692909217909155601280546001600160a01b0394851690831617905560118054929093169116179055565b6000828152600660205260409020600101546129a981612dfb565b6114298383613149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129e6612da1565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b600080516020614209833981519152612a1f81612dfb565b506017805461ff001981166101009182900460ff1615909102179055565b600080516020614209833981519152612a5581612dfb565b50601655565b600080516020614209833981519152612a7381612dfb565b506017805460ff19169055565b612a88612da1565b6001600160a01b038116612aed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fd5565b611401816134fa565b600080516020614209833981519152612b0e81612dfb565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556017805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081612b9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612bc55780612baf81613f9c565b9150612bbe9050600a83614102565b9150612b9f565b6000816001600160401b03811115612bdf57612bdf613bfd565b6040519080825280601f01601f191660200182016040528015612c09576020820181803683370190505b5090505b8415612c7457612c1e600183614116565b9150612c2b600a8661412d565b612c36906030613fb7565b60f81b818381518110612c4b57612c4b613f86565b60200101906001600160f81b031916908160001a905350612c6d600a86614102565b9450612c0d565b949350505050565b6001600160a01b038316612cde5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fd5565b6001600160a01b038216612d3f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fd5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fd5565b611401813361375c565b6001600160a01b038316612e695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610fd5565b6001600160a01b038216612ecb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610fd5565b601754610100900460ff1615612f235760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610fd5565b60008111612f855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610fd5565b6001600160a01b0383166000908152600d60205260409020548111156130045760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610fd5565b6001600160a01b0383166000908152600d602052604090205461302790826132a7565b6001600160a01b038085166000908152600d6020526040808220939093559084168152205461305690826131b0565b6001600160a01b038084166000818152600d602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d949085815260200190565b60006130b68284614102565b9392505050565b6114a882825b6130cd8282611f6d565b6114a85760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131053390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131538282611f6d565b156114a85760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130b68284613fb7565b6001600160a01b0382166132125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610fd5565b80600260008282546132249190613fb7565b90915550506001600160a01b03821660009081526020819052604081208054839290613251908490613fb7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006130b68284614141565b60006130b68284614116565b6001600160a01b0382166133135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610fd5565b6001600160a01b038216600090815260208190526040902054818110156133875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610fd5565b6001600160a01b03831660009081526020819052604081208383039055600280548492906133b6908490614116565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161345d9190614160565b6000604051808303816000865af19150503d806000811461349a576040519150601f19603f3d011682016040523d82523d6000602084013e61349f565b606091505b50915091508180156134c95750805115806134c95750808060200190518101906134c99190613fcf565b6110585760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610fd5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061355884846129b3565b905060001981146120b057818110156135b35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610fd5565b6120b08484848403612c7c565b604080516000808252602082019092526001600160a01b0384169083906040516135ea9190614160565b60006040518083038185875af1925050503d8060008114613627576040519150601f19603f3d011682016040523d82523d6000602084013e61362c565b606091505b50509050806114295760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610fd5565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916136bf9190614160565b6000604051808303816000865af19150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081801561372b57508051158061372b57508080602001905181019061372b9190613fcf565b6110585760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610fd5565b6137668282611f6d565b6114a85761377e816001600160a01b031660146137c0565b6137898360206137c0565b60405160200161379a92919061417c565b60408051601f198184030181529082905262461bcd60e51b8252610fd5916004016139dd565b606060006137cf836002614141565b6137da906002613fb7565b6001600160401b038111156137f1576137f1613bfd565b6040519080825280601f01601f19166020018201604052801561381b576020820181803683370190505b509050600360fc1b8160008151811061383657613836613f86565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061386557613865613f86565b60200101906001600160f81b031916908160001a9053506000613889846002614141565b613894906001613fb7565b90505b600181111561390c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138c8576138c8613f86565b1a60f81b8282815181106138de576138de613f86565b60200101906001600160f81b031916908160001a90535060049490941c93613905816141f1565b9050613897565b5083156130b65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fd5565b60006020828403121561396d57600080fd5b81356001600160e01b0319811681146130b657600080fd5b60005b838110156139a0578181015183820152602001613988565b838111156120b05750506000910152565b600081518084526139c9816020860160208601613985565b601f01601f19169290920160200192915050565b6020815260006130b660208301846139b1565b6001600160a01b038116811461140157600080fd5b8035613a10816139f0565b919050565b60008060408385031215613a2857600080fd5b8235613a33816139f0565b946020939093013593505050565b600060208284031215613a5357600080fd5b81356130b6816139f0565b803560ff81168114613a1057600080fd5b80356001600160401b0381168114613a1057600080fd5b600080600060608486031215613a9b57600080fd5b613aa484613a5e565b9250613ab260208501613a6f565b9150613ac060408501613a6f565b90509250925092565b600060208284031215613adb57600080fd5b6130b682613a5e565b602081526000825160a06020840152613b0060c08401826139b1565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613b5a57600080fd5b613b6383613a5e565b91506020830135613b73816139f0565b809150509250929050565b600080600060608486031215613b9357600080fd5b8335613b9e816139f0565b92506020840135613bae816139f0565b929592945050506040919091013590565b600060208284031215613bd157600080fd5b5035919050565b60008060408385031215613beb57600080fd5b823591506020830135613b73816139f0565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613c2957600080fd5b84356001600160401b0380821115613c4057600080fd5b818701915087601f830112613c5457600080fd5b8135602082821115613c6857613c68613bfd565b8160051b604051601f19603f83011681018181108682111715613c8d57613c8d613bfd565b60405292835281830193508481018201928b841115613cab57600080fd5b948201945b83861015613cd057613cc186613a05565b85529482019493820193613cb0565b9850508801359550613ce9925050604087019050613a6f565b9150613cf760608601613a6f565b905092959194509250565b60008060008060008060a08789031215613d1b57600080fd5b86359550602087013594506040870135613d34816139f0565b935060608701356001600160401b0380821115613d5057600080fd5b818901915089601f830112613d6457600080fd5b813581811115613d7357600080fd5b8a6020828501011115613d8557600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613db557600080fd5b613dbe83613a5e565b9150613dcc60208401613a6f565b90509250929050565b60a081526000613de860a08301886139b1565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613e2f57600080fd5b8335613e3a816139f0565b9250602084013591506040840135613e51816139f0565b809150509250925092565b60008060408385031215613e6f57600080fd5b613e7883613a5e565b9150613dcc60208401613a5e565b60008060008060008060c08789031215613e9f57600080fd5b613ea887613a5e565b955060208701359450604087013593506060870135613ec6816139f0565b92506080870135613ed6816139f0565b9150613ee460a08801613a6f565b90509295509295509295565b60008060408385031215613f0357600080fd5b8235613b63816139f0565b600181811c90821680613f2257607f821691505b60208210811415613f4357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681811415613f7c57613f7c613f49565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613fb057613fb0613f49565b5060010190565b60008219821115613fca57613fca613f49565b500190565b600060208284031215613fe157600080fd5b815180151581146130b657600080fd5b602081526000825160a0602084015261400d60c08401826139b1565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561405b57600080fd5b5051919050565b6000806000806080858703121561407857600080fd5b8451614083816139f0565b6020860151909450614094816139f0565b60408601519093506140a5816139f0565b60608601519092506140b6816139f0565b939692955090935050565b60006001600160401b038083168185168083038211156140e3576140e3613f49565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082614111576141116140ec565b500490565b60008282101561412857614128613f49565b500390565b60008261413c5761413c6140ec565b500690565b600081600019048311821515161561415b5761415b613f49565b500290565b60008251614172818460208701613985565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516141b4816017850160208801613985565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516141e5816028840160208801613985565b01602801949350505050565b60008161420057614200613f49565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a26469706673582212205e7097b4f91470c91f0e29b95afab1d26949239c5e480fab23a3641b7c015caf64736f6c634300080c0033

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

0000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _orderNumber (uint8): 1

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


Deployed Bytecode Sourcemap

53657:14575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24911:204;;;;;;;;;;-1:-1:-1;24911:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;24911:204:0;;;;;;;;41624:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43975:201::-;;;;;;;;;;-1:-1:-1;43975:201:0;;;;;:::i;:::-;;:::i;63141:139::-;;;;;;;;;;-1:-1:-1;63141:139:0;;;;;:::i;:::-;;:::i;67754:475::-;;;;;;;;;;-1:-1:-1;67754:475:0;;;;;:::i;:::-;;:::i;64284:119::-;;;;;;;;;;-1:-1:-1;64284:119:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55231:27::-;;;;;;;;;;-1:-1:-1;55231:27:0;;;;;;;;42744:108;;;;;;;;;;-1:-1:-1;42832:12:0;;42744:108;;;3829:25:1;;;3817:2;3802:18;42744:108:0;3683:177:1;65129:998:0;;;;;;:::i;:::-;;:::i;64913:182::-;;;;;;;;;;-1:-1:-1;64913:182:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65057:23:0;;;;;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;65057:30:0;;;;;;;;;;;65050:37;;;;;;;;;-1:-1:-1;;;;;65050:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64913:182;;;;;;;4408:13:1;;-1:-1:-1;;;;;4404:38:1;4386:57;;4499:4;4487:17;;;4481:24;4459:20;;;4452:54;4566:4;4554:17;;;4548:24;4574:4;4544:35;4522:20;;;4515:65;4640:4;4628:17;;;4622:24;-1:-1:-1;;;;;4618:50:1;4596:20;;;4589:80;;;;4373:3;4358:19;;4187:488;61985:225:0;;;;;;;;;;-1:-1:-1;61985:225:0;;;;;:::i;:::-;;:::i;26747:131::-;;;;;;;;;;-1:-1:-1;26747:131:0;;;;;:::i;:::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;;26747:131;64595:108;;;;;;;;;;-1:-1:-1;64595:108:0;;;;;:::i;:::-;;:::i;27188:147::-;;;;;;;;;;-1:-1:-1;27188:147:0;;;;;:::i;:::-;;:::i;42586:93::-;;;;;;;;;;-1:-1:-1;42669:2:0;42586:93;;;6000:4:1;5988:17;;;5970:36;;5958:2;5943:18;42586:93:0;5828:184:1;28332:218:0;;;;;;;;;;-1:-1:-1;28332:218:0;;;;;:::i;:::-;;:::i;54793:46::-;;;;;;;;;;-1:-1:-1;54793:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54793:46:0;;;;-1:-1:-1;;;54793:46:0;;;;;;;;;6215:25:1;;;-1:-1:-1;;;;;6313:15:1;;;6308:2;6293:18;;6286:43;6365:15;;6345:18;;;6338:43;6203:2;6188:18;54793:46:0;6017:370:1;57115:921:0;;;;;;;;;;-1:-1:-1;57115:921:0;;;;;:::i;:::-;;:::i;55022:29::-;;;;;;;;;;-1:-1:-1;55022:29:0;;;;-1:-1:-1;;;;;55022:29:0;;;;;;-1:-1:-1;;;;;8029:32:1;;;8011:51;;7999:2;7984:18;55022:29:0;7865:203:1;45460:238:0;;;;;;;;;;-1:-1:-1;45460:238:0;;;;;:::i;:::-;;:::i;58100:1440::-;;;;;;;;;;-1:-1:-1;58100:1440:0;;;;;:::i;:::-;;:::i;52993:91::-;;;;;;;;;;-1:-1:-1;52993:91:0;;;;;:::i;:::-;;:::i;54760:26::-;;;;;;;;;;-1:-1:-1;54760:26:0;;;;-1:-1:-1;;;;;54760:26:0;;;;;;-1:-1:-1;;;;;8420:31:1;;;8402:50;;8390:2;8375:18;54760:26:0;8258:200:1;64435:117:0;;;;;;;;;;-1:-1:-1;64435:117:0;;;;;:::i;:::-;;:::i;63524:104::-;;;;;;;;;;-1:-1:-1;63524:104:0;;;;;:::i;:::-;;:::i;60747:844::-;;;;;;;;;;-1:-1:-1;60747:844:0;;;;;:::i;:::-;;:::i;60499:206::-;;;;;;;;;;;;;:::i;55195:29::-;;;;;;;;;;;;;;;;55131:26;;;;;;;;;;;;;;;;55058:25;;;;;;;;;;-1:-1:-1;55058:25:0;;;;-1:-1:-1;;;;;55058:25:0;;;64168:84;;;;;;;;;;;;;:::i;54287:63::-;;;;;;;;;;-1:-1:-1;54287:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54287:63:0;;;;;;;;;;;;-1:-1:-1;;;;;54287:63:0;;;;;;;-1:-1:-1;;;;;9643:31:1;;;9625:50;;9706:2;9691:18;;9684:34;;;;9766:4;9754:17;;;9734:18;;;9727:45;;;;-1:-1:-1;;;;;9808:32:1;9803:2;9788:18;;9781:60;9612:3;9597:19;54287:63:0;9400:447:1;54357:67:0;;;;;;;;;;-1:-1:-1;54357:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54357:67:0;;;;;;;;;;;;-1:-1:-1;;;;;54357:67:0;;;55090:34;;;;;;;;;;;;;;;;62987:115;;;;;;;;;;-1:-1:-1;62987:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;63078:16:0;63051:7;63078:16;;;:9;:16;;;;;;;62987:115;32476:103;;;;;;;;;;;;;:::i;53403:164::-;;;;;;;;;;-1:-1:-1;53403:164:0;;;;;:::i;:::-;;:::i;54242:38::-;;;;;;;;;;-1:-1:-1;54242:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;63668:156::-;;;;;;;;;;-1:-1:-1;63668:156:0;;;;;:::i;:::-;;:::i;31828:87::-;;;;;;;;;;-1:-1:-1;31901:6:0;;-1:-1:-1;;;;;31901:6:0;31828:87;;54200:35;;;;;;;;;;;;;;;;54559:97;;;;;;;;;;;;54614:42;54559:97;;25207:147;;;;;;;;;;-1:-1:-1;25207:147:0;;;;;:::i;:::-;;:::i;41843:104::-;;;;;;;;;;;;;:::i;54663:88::-;;;;;;;;;;;;54709:42;54663:88;;56501:574;;;;;;;;;;-1:-1:-1;56501:574:0;;;;;:::i;:::-;;:::i;24312:49::-;;;;;;;;;;-1:-1:-1;24312:49:0;24357:4;24312:49;;46201:436;;;;;;;;;;-1:-1:-1;46201:436:0;;;;;:::i;:::-;;:::i;61778:199::-;;;;;;;;;;-1:-1:-1;61778:199:0;;;;;:::i;:::-;;:::i;64751:111::-;;;;;;;;;;-1:-1:-1;64751:111:0;;;;;:::i;:::-;;:::i;55164:24::-;;;;;;;;;;-1:-1:-1;55164:24:0;;;;;;;;59588:877;;;;;;;;;;-1:-1:-1;59588:877:0;;;;;:::i;:::-;;:::i;54957:29::-;;;;;;;;;;-1:-1:-1;54957:29:0;;;;-1:-1:-1;;;;;54957:29:0;;;66390:1307;;;;;;;;;;-1:-1:-1;66390:1307:0;;;;;:::i;:::-;;:::i;54993:22::-;;;;;;;;;;-1:-1:-1;54993:22:0;;;;-1:-1:-1;;;;;54993:22:0;;;55265:34;;;;;;;;;;-1:-1:-1;55265:34:0;;;;;;;;;;;55753:601;;;;;;;;;;-1:-1:-1;55753:601:0;;;;;:::i;:::-;;:::i;27628:149::-;;;;;;;;;;-1:-1:-1;27628:149:0;;;;;:::i;:::-;;:::i;43504:151::-;;;;;;;;;;-1:-1:-1;43504:151:0;;;;;:::i;:::-;;:::i;63322:166::-;;;;;;;;;;-1:-1:-1;63322:166:0;;;;;:::i;:::-;;:::i;61657:113::-;;;;;;;;;;;;;:::i;54900:50::-;;;;;;;;;;-1:-1:-1;54900:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63867:156;;;;;;;;;;-1:-1:-1;63867:156:0;;;;;:::i;:::-;;:::i;64053:84::-;;;;;;;;;;;;;:::i;54482:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;54482:64:0;;32734:201;;;;;;;;;;-1:-1:-1;32734:201:0;;;;;:::i;:::-;;:::i;66156:198::-;;;;;;;;;;-1:-1:-1;66156:198:0;;;;;:::i;:::-;;:::i;55306:33::-;;;;;;;;;;-1:-1:-1;55306:33:0;;;;;;;;;;;24911:204;24996:4;-1:-1:-1;;;;;;25020:47:0;;-1:-1:-1;;;25020:47:0;;:87;;-1:-1:-1;;;;;;;;;;15848:40:0;;;25071:36;25013:94;24911:204;-1:-1:-1;;24911:204:0:o;41624:100::-;41678:13;41711:5;41704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41624:100;:::o;43975:201::-;44058:4;22200:10;44114:32;22200:10;44130:7;44139:6;44114:8;:32::i;:::-;-1:-1:-1;44164:4:0;;43975:201;-1:-1:-1;;;43975:201:0:o;63141:139::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;63227:38:0::1;;::::0;;;:18:::1;:38;::::0;;;;:45;;-1:-1:-1;;63227:45:0::1;63268:4;63227:45;::::0;;63141:139::o;67754:475::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;67917:22:::1;::::0;;::::1;;::::0;;;:8:::1;:22;::::0;;;;:31:::1;;::::0;-1:-1:-1;;;67917:31:0;::::1;;67916:32;67908:70;;;::::0;-1:-1:-1;;;67908:70:0;;13290:2:1;67908:70:0::1;::::0;::::1;13272:21:1::0;13329:2;13309:18;;;13302:30;13368:27;13348:18;;;13341:55;13413:18;;67908:70:0::1;;;;;;;;;68005:5:::0;67989:233:::1;68016:3;-1:-1:-1::0;;;;;68012:7:0::1;:1;-1:-1:-1::0;;;;;68012:7:0::1;;67989:233;;;68101:28;::::0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;68101:31:0;::::1;::::0;;;;;;;:37:::1;::::0;::::1;::::0;::::1;68157:38:::0;;::::1;::::0;68041:169:::1;::::0;68077:4:::1;::::0;68101:37:::1;::::0;;::::1;-1:-1:-1::0;;;;;68101:37:0::1;::::0;68041:9:::1;:169::i;:::-;68021:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67989:233;;;;67754:475:::0;;;;:::o;64284:119::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64373:22:0;;;;;;;:8;:22;;;;;;;64366:29;;;;;;;;;;;;64373:22;;64366:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64366:29:0;;;-1:-1:-1;;64366:29:0;;;;;;-1:-1:-1;;;;;64366:29:0;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;-1:-1:-1;;;64366:29:0;;;;;;;;;;64284:119;-1:-1:-1;;64284:119:0:o;65129:998::-;65283:14;;;;;;;65275:49;;;;-1:-1:-1;;;65275:49:0;;13990:2:1;65275:49:0;;;13972:21:1;14029:2;14009:18;;;14002:30;-1:-1:-1;;;14048:18:1;;;14041:52;14110:18;;65275:49:0;13788:346:1;65275:49:0;65343:7;;;;65335:38;;;;-1:-1:-1;;;65335:38:0;;14341:2:1;65335:38:0;;;14323:21:1;14380:2;14360:18;;;14353:30;-1:-1:-1;;;14399:18:1;;;14392:48;14457:18;;65335:38:0;14139:342:1;65335:38:0;65388:33;-1:-1:-1;;;;;;;;;;;65410:10:0;65388:7;:33::i;:::-;65384:450;;;;;;65485:10;;65472:9;:23;;65446:119;;;;-1:-1:-1;;;65446:119:0;;14688:2:1;65446:119:0;;;14670:21:1;14727:2;14707:18;;;14700:30;14766:34;14746:18;;;14739:62;-1:-1:-1;;;14817:18:1;;;14810:32;14859:19;;65446:119:0;14486:398:1;65446:119:0;65608:10;65580:15;63078:16;;;:9;:16;;;;;;42832:12;;65671:21;;65689:2;;65671:13;:17;;:21::i;:::-;65660:7;:32;;:90;;;;65717:33;-1:-1:-1;;;;;;;;;;;65739:10:0;65717:7;:33::i;:::-;65634:188;;;;-1:-1:-1;;;65634:188:0;;15091:2:1;65634:188:0;;;15073:21:1;15130:2;15110:18;;;15103:30;15169:34;15149:18;;;15142:62;-1:-1:-1;;;15220:18:1;;;15213:34;15264:19;;65634:188:0;14889:400:1;65634:188:0;65431:403;65384:450;65846:22;;;;;;;:8;:22;;;;;;;;;:37;;:55;;-1:-1:-1;;;;;;;;;65912:51:0;;;-1:-1:-1;;;65912:51:0;;-1:-1:-1;;;;;;65912:51:0;;;65846:55;;;65912:51;;;;;;;65974:38;;;;-1:-1:-1;;;65974:38:0;;;;66023:14;:22;;-1:-1:-1;;66023:22:0;;;66063:56;;15488:36:1;;;15577:18;;;15570:43;15629:18;;;15622:43;66063:56:0;;;;;;15476:2:1;66063:56:0;;;65129:998;;;:::o;61985:225::-;62125:4;62142:36;62152:6;62160:9;62171:6;62142:9;:36::i;64595:108::-;31714:13;:11;:13::i;:::-;64661:34:::1;-1:-1:-1::0;;;;;;;;;;;64686:8:0::1;64661:10;:34::i;:::-;64595:108:::0;:::o;27188:147::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;24803:16;24814:4;24803:10;:16::i;:::-;27302:25:::1;27313:4;27319:7;27302:10;:25::i;:::-;27188:147:::0;;;:::o;28332:218::-;-1:-1:-1;;;;;28428:23:0;;22200:10;28428:23;28420:83;;;;-1:-1:-1;;;28420:83:0;;15878:2:1;28420:83:0;;;15860:21:1;15917:2;15897:18;;;15890:30;15956:34;15936:18;;;15929:62;-1:-1:-1;;;16007:18:1;;;16000:45;16062:19;;28420:83:0;15676:411:1;28420:83:0;28516:26;28528:4;28534:7;28516:11;:26::i;:::-;28332:218;;:::o;57115:921::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;57348:1:::1;57332:6;:13;:17;57324:44;;;::::0;-1:-1:-1;;;57324:44:0;;16294:2:1;57324:44:0::1;::::0;::::1;16276:21:1::0;16333:2;16313:18;;;16306:30;-1:-1:-1;;;16352:18:1;;;16345:44;16406:18;;57324:44:0::1;16092:338:1::0;57324:44:0::1;57403:1;57387:13;:17;57379:51;;;::::0;-1:-1:-1;;;57379:51:0;;16637:2:1;57379:51:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:51;16756:18;;57379:51:0::1;16435:345:1::0;57379:51:0::1;57469:1;57449:17;-1:-1:-1::0;;;;;57449:21:0::1;;57441:60;;;::::0;-1:-1:-1;;;57441:60:0;;16987:2:1;57441:60:0::1;::::0;::::1;16969:21:1::0;17026:2;17006:18;;;16999:30;17065:28;17045:18;;;17038:56;17111:18;;57441:60:0::1;16785:350:1::0;57441:60:0::1;57540:1;57520:17;-1:-1:-1::0;;;;;57520:21:0::1;;57512:60;;;::::0;-1:-1:-1;;;57512:60:0;;17342:2:1;57512:60:0::1;::::0;::::1;17324:21:1::0;17381:2;17361:18;;;17354:30;17420:28;17400:18;;;17393:56;17466:18;;57512:60:0::1;17140:350:1::0;57512:60:0::1;57625:17;-1:-1:-1::0;;;;;57605:37:0::1;:17;-1:-1:-1::0;;;;;57605:37:0::1;;57583:145;;;::::0;-1:-1:-1;;;57583:145:0;;17697:2:1;57583:145:0::1;::::0;::::1;17679:21:1::0;17736:2;17716:18;;;17709:30;17775:34;17755:18;;;17748:62;17846:28;17826:18;;;17819:56;17892:19;;57583:145:0::1;17495:422:1::0;57583:145:0::1;57744:13;57739:290;57771:6;:13;57763:5;:21;57739:290;;;57837:180;;;;;;;;57880:13;57837:180;;;;57930:17;-1:-1:-1::0;;;;;57837:180:0::1;;;;;57984:17;-1:-1:-1::0;;;;;57837:180:0::1;;;::::0;57810:9:::1;:24;57820:6;57827:5;57820:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;57810:24:0::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;57810:24:0;:207;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;57810:207:0;;::::1;-1:-1:-1::0;;;57810:207:0::1;-1:-1:-1::0;;;;;;57810:207:0;;;;::::1;::::0;;;;;;;::::1;::::0;;57786:7;::::1;::::0;::::1;:::i;:::-;;;;57739:290;;;;57115:921:::0;;;;;:::o;45460:238::-;45548:4;22200:10;45604:64;22200:10;45620:7;45657:10;45629:25;22200:10;45620:7;45629:9;:25::i;:::-;:38;;;;:::i;:::-;45604:8;:64::i;58100:1440::-;58165:7;;;;58164:8;58156:35;;;;-1:-1:-1;;;58156:35:0;;18529:2:1;58156:35:0;;;18511:21:1;18568:2;18548:18;;;18541:30;-1:-1:-1;;;18587:18:1;;;18580:44;18641:18;;58156:35:0;18327:338:1;58156:35:0;58220:1;58210:7;:11;58202:56;;;;-1:-1:-1;;;58202:56:0;;18872:2:1;58202:56:0;;;18854:21:1;;;18891:18;;;18884:30;18950:34;18930:18;;;18923:62;19002:18;;58202:56:0;18670:356:1;58202:56:0;58320:10;58310:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;58310:38:0;;-1:-1:-1;;;;;58310:38:0;58291:15;:57;;58269:127;;;;-1:-1:-1;;;58269:127:0;;19233:2:1;58269:127:0;;;19215:21:1;19272:2;19252:18;;;19245:30;-1:-1:-1;;;19291:18:1;;;19284:50;19351:18;;58269:127:0;19031:344:1;58269:127:0;58458:10;58448:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;;;58448:38:0;58429:15;:57;;58407:132;;;;-1:-1:-1;;;58407:132:0;;19582:2:1;58407:132:0;;;19564:21:1;19621:2;19601:18;;;19594:30;19660:27;19640:18;;;19633:55;19705:18;;58407:132:0;19380:349:1;58407:132:0;58582:10;58572:21;;;;:9;:21;;;;;:34;:45;-1:-1:-1;58572:45:0;58550:123;;;;-1:-1:-1;;;58550:123:0;;19936:2:1;58550:123:0;;;19918:21:1;19975:2;19955:18;;;19948:30;20014;19994:18;;;19987:58;20062:18;;58550:123:0;19734:352:1;58550:123:0;58738:11;;58706:15;;:28;;58726:7;58706:19;:28::i;:::-;:43;;58684:121;;;;-1:-1:-1;;;58684:121:0;;19936:2:1;58684:121:0;;;19918:21:1;19975:2;19955:18;;;19948:30;20014;19994:18;;;19987:58;20062:18;;58684:121:0;19734:352:1;58684:121:0;58835:14;;58824:7;:25;;58816:48;;;;-1:-1:-1;;;58816:48:0;;20293:2:1;58816:48:0;;;20275:21:1;20332:2;20312:18;;;20305:30;-1:-1:-1;;;20351:18:1;;;20344:40;20401:18;;58816:48:0;20091:334:1;58816:48:0;58885:23;58911:19;:7;58923:6;58911:11;:19::i;:::-;58941:75;;-1:-1:-1;;;58941:75:0;;58973:10;58941:75;;;20670:34:1;58993:4:0;20720:18:1;;;20713:43;20772:18;;;20765:34;;;58885:45:0;;-1:-1:-1;54709:42:0;;58941:31;;20605:18:1;;58941:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59027:26;59033:10;59045:7;59027:5;:26::i;:::-;59098:10;59088:21;;;;:9;:21;;;;;;:34;;59114:7;59088:25;:34::i;:::-;59074:10;59064:21;;;;:9;:21;;;;;:58;59139:10;;59133:53;;-1:-1:-1;;;;;59139:10:0;59151:34;59180:4;59151:24;:7;54470:3;59151:11;:24::i;:34::-;59133:5;:53::i;:::-;59221:85;59261:34;59290:4;59261:24;:7;54470:3;59261:11;:24::i;:34::-;59231:10;;-1:-1:-1;;;;;59231:10:0;59221:21;;;;:9;:21;;;;;;;:25;:85::i;:::-;59207:10;;-1:-1:-1;;;;;59207:10:0;59197:21;;;;:9;:21;;;;;:109;59335:15;;:28;;59355:7;59335:19;:28::i;:::-;59317:15;:46;59421:10;59411:21;;;;:9;:21;;;;;:48;:75;;59478:7;59411:66;:75::i;:::-;59384:10;59374:21;;;;:9;:21;;;;;;;:112;;;;59504:28;;;;;;59524:7;3829:25:1;;3817:2;3802:18;;3683:177;59504:28:0;;;;;;;;58145:1395;58100:1440;:::o;52993:91::-;53049:27;22200:10;53069:6;53049:5;:27::i;64435:117::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64520:10:0::1;:24:::0;64435:117::o;63524:104::-;31714:13;:11;:13::i;:::-;63596:10:::1;:24:::0;;-1:-1:-1;;;;;;63596:24:0::1;-1:-1:-1::0;;;;;63596:24:0;;;::::1;::::0;;;::::1;::::0;;63524:104::o;60747:844::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;60967:7:::1;::::0;::::1;;60959:38;;;::::0;-1:-1:-1;;;60959:38:0;;14341:2:1;60959:38:0::1;::::0;::::1;14323:21:1::0;14380:2;14360:18;;;14353:30;-1:-1:-1;;;14399:18:1;;;14392:48;14457:18;;60959:38:0::1;14139:342:1::0;60959:38:0::1;61008:21;61032:12;:10;:12::i;:::-;61102:10;::::0;61008:36;;-1:-1:-1;61057:68:0::1;::::0;61084:8;;-1:-1:-1;;;;;61102:10:0::1;61115:9:::0;61057:26:::1;:68::i;:::-;61183:258;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;61138:42:::1;::::0;61183:258;;;61251:5;;;;;;61183:258;;61251:5;;;;61183:258;::::1;;::::0;::::1;::::0;;;-1:-1:-1;61183:258:0;;;-1:-1:-1;;;;;;;;61183:258:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;61506:10:::1;::::0;:29;;-1:-1:-1;;;61506:29:0;;61138:303;;-1:-1:-1;61183:258:0;;61506:10;::::1;::::0;:21:::1;::::0;:29:::1;::::0;61138:303;;61506:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61485:50;;61562:8;-1:-1:-1::0;;;;;61553:30:0::1;;61572:10;61553:30;;;;3829:25:1::0;;3817:2;3802:18;;3683:177;61553:30:0::1;;;;;;;;60948:643;;;60747:844:::0;;;;;;;:::o;60499:206::-;60612:14;;60654:11;;60594:72;;-1:-1:-1;;;60594:72:0;;60654:11;;;;60594:72;;;5970:36:1;60542:7:0;;;;-1:-1:-1;;;;;60612:14:0;;;;60594:59;;5943:18:1;;60594:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60562:104:0;;60499:206;-1:-1:-1;;;;60499:206:0:o;64168:84::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64230:7:0::1;:14:::0;;-1:-1:-1;;64230:14:0::1;64240:4;64230:14;::::0;;64168:84::o;32476:103::-;31714:13;:11;:13::i;:::-;32541:30:::1;32568:1;32541:18;:30::i;:::-;32476:103::o:0;53403:164::-;53480:46;53496:7;22200:10;53519:6;53480:15;:46::i;:::-;53537:22;53543:7;53552:6;53537:5;:22::i;54242:38::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54242:38:0;;;;;;;-1:-1:-1;;;;;;;54242:38:0;;;;-1:-1:-1;;;54242:38:0;;;;;;-1:-1:-1;;;54242:38:0;;;;-1:-1:-1;;;54242:38:0;;;;:::o;63668:156::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;63784:14:0::1;:32:::0;;-1:-1:-1;;;;;;63784:32:0::1;-1:-1:-1::0;;;;;63784:32:0;;;::::1;::::0;;;::::1;::::0;;63668:156::o;25207:147::-;25293:4;25317:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;25317:29:0;;;;;;;;;;;;;;;25207:147::o;41843:104::-;41899:13;41932:7;41925:14;;;;;:::i;56501:574::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;;;;;56676:23:0;::::1;56668:60;;;::::0;-1:-1:-1;;;56668:60:0;;22798:2:1;56668:60:0::1;::::0;::::1;22780:21:1::0;22837:2;22817:18;;;22810:30;22876:26;22856:18;;;22849:54;22920:18;;56668:60:0::1;22596:348:1::0;56668:60:0::1;-1:-1:-1::0;;;;;56761:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;56739:113;;;::::0;-1:-1:-1;;;56739:113:0;;23151:2:1;56739:113:0::1;::::0;::::1;23133:21:1::0;23190:2;23170:18;;;23163:30;23229:34;23209:18;;;23202:62;-1:-1:-1;;;23280:18:1;;;23273:32;23322:19;;56739:113:0::1;22949:398:1::0;56739:113:0::1;-1:-1:-1::0;;;;;56867:27:0;::::1;56863:205;;56911:50;56942:9;56953:7;56911:30;:50::i;:::-;56863:205;;;56994:62;57022:13;57037:9;57048:7;56994:27;:62::i;:::-;56501:574:::0;;;;:::o;46201:436::-;46294:4;22200:10;46294:4;46377:25;22200:10;46394:7;46377:9;:25::i;:::-;46350:52;;46441:15;46421:16;:35;;46413:85;;;;-1:-1:-1;;;46413:85:0;;23554:2:1;46413:85:0;;;23536:21:1;23593:2;23573:18;;;23566:30;23632:34;23612:18;;;23605:62;-1:-1:-1;;;23683:18:1;;;23676:35;23728:19;;46413:85:0;23352:401:1;46413:85:0;46534:60;46543:5;46550:7;46578:15;46559:16;:34;46534:8;:60::i;:::-;-1:-1:-1;46625:4:0;;46201:436;-1:-1:-1;;;;46201:436:0:o;61778:199::-;61883:4;61905:42;22200:10;61929:9;61940:6;61905:9;:42::i;:::-;-1:-1:-1;61965:4:0;61778:199;;;;:::o;64751:111::-;31714:13;:11;:13::i;:::-;64820:34:::1;-1:-1:-1::0;;;;;;;;;;;64845:8:0::1;64820:10;:34::i;59588:877::-:0;59649:7;;;;59648:8;59640:35;;;;-1:-1:-1;;;59640:35:0;;18529:2:1;59640:35:0;;;18511:21:1;18568:2;18548:18;;;18541:30;-1:-1:-1;;;18587:18:1;;;18580:44;18641:18;;59640:35:0;18327:338:1;59640:35:0;59709:15;;:28;;59729:7;59709:19;:28::i;:::-;59694:11;;:43;;59686:68;;;;-1:-1:-1;;;59686:68:0;;23960:2:1;59686:68:0;;;23942:21:1;23999:2;23979:18;;;23972:30;-1:-1:-1;;;24018:18:1;;;24011:42;24070:18;;59686:68:0;23758:336:1;59686:68:0;59784:14;;59773:7;:25;;59765:48;;;;-1:-1:-1;;;59765:48:0;;20293:2:1;59765:48:0;;;20275:21:1;20332:2;20312:18;;;20305:30;-1:-1:-1;;;20351:18:1;;;20344:40;20401:18;;59765:48:0;20091:334:1;59765:48:0;59865:12;;-1:-1:-1;;;;;59865:12:0;59846:15;:31;;59824:114;;;;-1:-1:-1;;;59824:114:0;;24301:2:1;59824:114:0;;;24283:21:1;24340:2;24320:18;;;24313:30;24379:34;24359:18;;;24352:62;-1:-1:-1;;;24430:18:1;;;24423:31;24471:19;;59824:114:0;24099:397:1;59824:114:0;59951:23;59977:19;:7;59989:6;59977:11;:19::i;:::-;60007:75;;-1:-1:-1;;;60007:75:0;;60039:10;60007:75;;;20670:34:1;60059:4:0;20720:18:1;;;20713:43;20772:18;;;20765:34;;;59951:45:0;;-1:-1:-1;54709:42:0;;60007:31;;20605:18:1;;60007:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60093:26;60099:10;60111:7;60093:5;:26::i;:::-;60164:10;60154:21;;;;:9;:21;;;;;;:34;;60180:7;60154:25;:34::i;:::-;60140:10;60130:21;;;;:9;:21;;;;;:58;60205:10;;60199:53;;-1:-1:-1;;;;;60205:10:0;60217:34;60246:4;60217:24;:7;54470:3;60217:11;:24::i;60199:53::-;60287:85;60327:34;60356:4;60327:24;:7;54470:3;60327:11;:24::i;60287:85::-;60273:10;;-1:-1:-1;;;;;60273:10:0;60263:21;;;;:9;:21;;;;;:109;;;;60385:15;:26;;60404:7;;60263:21;60385:26;;60404:7;;60385:26;:::i;:::-;;;;-1:-1:-1;;60429:28:0;;3829:25:1;;;60437:10:0;;60429:28;;3817:2:1;3802:18;60429:28:0;3683:177:1;66390:1307:0;66469:7;;;;66461:39;;;;-1:-1:-1;;;66461:39:0;;24703:2:1;66461:39:0;;;24685:21:1;24742:2;24722:18;;;24715:30;-1:-1:-1;;;24761:18:1;;;24754:49;24820:18;;66461:39:0;24501:343:1;66461:39:0;66519:22;;;;;;;;:8;:22;;;;;:31;;;-1:-1:-1;;;66519:31:0;;;66511:63;;;;-1:-1:-1;;;66511:63:0;;25051:2:1;66511:63:0;;;25033:21:1;25090:2;25070:18;;;25063:30;-1:-1:-1;;;25109:18:1;;;25102:49;25168:18;;66511:63:0;24849:343:1;66511:63:0;66607:23;;;;;;;:9;:23;;;;;;;;66631:10;66607:35;;;;;;;:45;-1:-1:-1;;;;;66607:45:0;:50;66585:114;;;;-1:-1:-1;;;66585:114:0;;25399:2:1;66585:114:0;;;25381:21:1;25438:2;25418:18;;;25411:30;-1:-1:-1;;;25457:18:1;;;25450:44;25511:18;;66585:114:0;25197:338:1;66585:114:0;66732:23;;;;;;;:9;:23;;;;;;;;66756:10;66732:35;;;;;;;:42;;;:47;66710:111;;;;-1:-1:-1;;;66710:111:0;;25399:2:1;66710:111:0;;;25381:21:1;25438:2;25418:18;;;25411:30;-1:-1:-1;;;25457:18:1;;;25450:44;25511:18;;66710:111:0;25197:338:1;66710:111:0;66867:10;66832:22;63078:16;;;:9;:16;;;;;;;66891:55;;66924:4;63078:16;66891:12;:55::i;:::-;-1:-1:-1;66957:22:0;;;;;;;:8;:22;;;;;66993:1;66957:32;;;:37;;:32;;:37;;66993:1;;-1:-1:-1;;;66957:37:0;;-1:-1:-1;;;;;66957:37:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;66957:37:0;;;;;-1:-1:-1;;;;;66957:37:0;;;;;;67045:173;;;;;;;;67124:15;-1:-1:-1;;;;;67045:173:0;;;;;67077:14;67045:173;;;;67165:9;67045:173;;;;;;67196:10;-1:-1:-1;;;;;67045:173:0;;;;67007:9;:23;67017:12;67007:23;;;;;;;;;;;;;;;:35;67031:10;-1:-1:-1;;;;;67007:35:0;-1:-1:-1;;;;;67007:35:0;;;;;;;;;;;;:211;;;;;;;;;;;;;-1:-1:-1;;;;;67007:211:0;;;;;-1:-1:-1;;;;;67007:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67007:211:0;;;;;-1:-1:-1;;;;;67007:211:0;;;;;;;;;67318:173;;;;;;;;67397:15;-1:-1:-1;;;;;67318:173:0;;;;;67350:14;67318:173;;;;67438:9;67318:173;;;;;;67469:10;-1:-1:-1;;;;;67318:173:0;;;;67229:14;:28;67244:12;67229:28;;;;;;;;;;;;;;;:86;67272:8;:22;67281:12;67272:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;67272:32:0;-1:-1:-1;;;;;67229:86:0;-1:-1:-1;;;;;67229:86:0;;;;;;;;;;;;:262;;;;;;;;;;;;;-1:-1:-1;;;;;67229:262:0;;;;;-1:-1:-1;;;;;67229:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67229:262:0;;;;;-1:-1:-1;;;;;67229:262:0;;;;;;;;;67530:10;-1:-1:-1;;;;;67509:180:0;;67555:14;67591:15;67622:9;67646:8;:22;67655:12;67646:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;67646:32:0;67509:180;;;;;;;;26004:25:1;;;-1:-1:-1;;;;;26102:15:1;;;26097:2;26082:18;;26075:43;26166:4;26154:17;;;;26149:2;26134:18;;26127:45;26208:15;26203:2;26188:18;;26181:43;25991:3;25976:19;;25781:449;67509:180:0;;;;;;;;66450:1247;66390:1307;;:::o;55753:601::-;56013:7;;-1:-1:-1;;;;;56013:7:0;55999:10;:21;55991:43;;;;-1:-1:-1;;;55991:43:0;;26437:2:1;55991:43:0;;;26419:21:1;26476:1;26456:18;;;26449:29;-1:-1:-1;;;26494:18:1;;;26487:39;26543:18;;55991:43:0;26235:332:1;55991:43:0;56065:14;:32;;;;56108:11;:28;;;;56147:11;:26;;;;;;-1:-1:-1;;56147:26:0;;;;;;;;;;56184:10;:45;;-1:-1:-1;;;;;;56184:45:0;;;54614:42;56184:45;;;;56240:12;:28;;-1:-1:-1;;;;;56240:28:0;;;-1:-1:-1;;56240:28:0;;;;;;;;;;56279:10;:24;;-1:-1:-1;;;;;56279:24:0;;;;;;;;;56314:14;:32;;;;;;;;;;;55753:601::o;27628:149::-;26821:7;26848:12;;;:6;:12;;;;;:22;;;24803:16;24814:4;24803:10;:16::i;:::-;27743:26:::1;27755:4;27761:7;27743:11;:26::i;43504:151::-:0;-1:-1:-1;;;;;43620:18:0;;;43593:7;43620:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;43504:151::o;63322:166::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;63434:38:0::1;63475:5;63434:38:::0;;;:18:::1;:38;::::0;;;;:46;;-1:-1:-1;;63434:46:0::1;::::0;;63322:166::o;61657:113::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;61748:14:0::1;::::0;;-1:-1:-1;;61730:32:0;::::1;61748:14;::::0;;;::::1;;;61747:15;61730:32:::0;;::::1;;::::0;;61657:113::o;63867:156::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;63983:14:0::1;:32:::0;63867:156::o;64053:84::-;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;-1:-1:-1;64114:7:0::1;:15:::0;;-1:-1:-1;;64114:15:0::1;::::0;;64053:84::o;32734:201::-;31714:13;:11;:13::i;:::-;-1:-1:-1;;;;;32823:22:0;::::1;32815:73;;;::::0;-1:-1:-1;;;32815:73:0;;26774:2:1;32815:73:0::1;::::0;::::1;26756:21:1::0;26813:2;26793:18;;;26786:30;26852:34;26832:18;;;26825:62;-1:-1:-1;;;26903:18:1;;;26896:36;26949:19;;32815:73:0::1;26572:402:1::0;32815:73:0::1;32899:28;32918:8;32899:18;:28::i;66156:198::-:0;-1:-1:-1;;;;;;;;;;;24803:16:0;24814:4;24803:10;:16::i;:::-;66236:22:::1;::::0;::::1;66270:5;66236:22:::0;;;:8:::1;:22;::::0;;;;;;;;:31:::1;;:39:::0;;-1:-1:-1;;;;66236:39:0::1;::::0;;66286:14:::1;:21:::0;;-1:-1:-1;;66286:21:0::1;::::0;::::1;::::0;;66323:23;;5970:36:1;;;66323:23:0::1;::::0;5943:18:1;66323:23:0::1;;;;;;;66156:198:::0;;:::o;16333:723::-;16389:13;16610:10;16606:53;;-1:-1:-1;;16637:10:0;;;;;;;;;;;;-1:-1:-1;;;16637:10:0;;;;;16333:723::o;16606:53::-;16684:5;16669:12;16725:78;16732:9;;16725:78;;16758:8;;;;:::i;:::-;;-1:-1:-1;16781:10:0;;-1:-1:-1;16789:2:0;16781:10;;:::i;:::-;;;16725:78;;;16813:19;16845:6;-1:-1:-1;;;;;16835:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16835:17:0;;16813:39;;16863:154;16870:10;;16863:154;;16897:11;16907:1;16897:11;;:::i;:::-;;-1:-1:-1;16966:10:0;16974:2;16966:5;:10;:::i;:::-;16953:24;;:2;:24;:::i;:::-;16940:39;;16923:6;16930;16923:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16923:56:0;;;;;;;;-1:-1:-1;16994:11:0;17003:2;16994:11;;:::i;:::-;;;16863:154;;;17041:6;16333:723;-1:-1:-1;;;;16333:723:0:o;49826:380::-;-1:-1:-1;;;;;49962:19:0;;49954:68;;;;-1:-1:-1;;;49954:68:0;;27685:2:1;49954:68:0;;;27667:21:1;27724:2;27704:18;;;27697:30;27763:34;27743:18;;;27736:62;-1:-1:-1;;;27814:18:1;;;27807:34;27858:19;;49954:68:0;27483:400:1;49954:68:0;-1:-1:-1;;;;;50041:21:0;;50033:68;;;;-1:-1:-1;;;50033:68:0;;28090:2:1;50033:68:0;;;28072:21:1;28129:2;28109:18;;;28102:30;28168:34;28148:18;;;28141:62;-1:-1:-1;;;28219:18:1;;;28212:32;28261:19;;50033:68:0;27888:398:1;50033:68:0;-1:-1:-1;;;;;50114:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;50166:32;;3829:25:1;;;50166:32:0;;3802:18:1;50166:32:0;;;;;;;;49826:380;;;:::o;31993:132::-;31901:6;;-1:-1:-1;;;;;31901:6:0;22200:10;32057:23;32049:68;;;;-1:-1:-1;;;32049:68:0;;28493:2:1;32049:68:0;;;28475:21:1;;;28512:18;;;28505:30;28571:34;28551:18;;;28544:62;28623:18;;32049:68:0;28291:356:1;25658:105:0;25725:30;25736:4;22200:10;25725;:30::i;62218:761::-;-1:-1:-1;;;;;62367:20:0;;62359:70;;;;-1:-1:-1;;;62359:70:0;;28854:2:1;62359:70:0;;;28836:21:1;28893:2;28873:18;;;28866:30;28932:34;28912:18;;;28905:62;-1:-1:-1;;;28983:18:1;;;28976:35;29028:19;;62359:70:0;28652:401:1;62359:70:0;-1:-1:-1;;;;;62448:23:0;;62440:71;;;;-1:-1:-1;;;62440:71:0;;29260:2:1;62440:71:0;;;29242:21:1;29299:2;29279:18;;;29272:30;29338:34;29318:18;;;29311:62;-1:-1:-1;;;29389:18:1;;;29382:33;29432:19;;62440:71:0;29058:399:1;62440:71:0;62530:14;;;;;;;:23;62522:61;;;;-1:-1:-1;;;62522:61:0;;29664:2:1;62522:61:0;;;29646:21:1;29703:2;29683:18;;;29676:30;29742:27;29722:18;;;29715:55;29787:18;;62522:61:0;29462:349:1;62522:61:0;62611:1;62602:6;:10;62594:64;;;;-1:-1:-1;;;62594:64:0;;30018:2:1;62594:64:0;;;30000:21:1;30057:2;30037:18;;;30030:30;30096:34;30076:18;;;30069:62;-1:-1:-1;;;30147:18:1;;;30140:39;30196:19;;62594:64:0;29816:405:1;62594:64:0;-1:-1:-1;;;;;62701:17:0;;;;;;:9;:17;;;;;;62691:27;;;62669:123;;;;-1:-1:-1;;;62669:123:0;;30428:2:1;62669:123:0;;;30410:21:1;30467:2;30447:18;;;30440:30;30506:34;30486:18;;;30479:62;-1:-1:-1;;;30557:18:1;;;30550:44;30611:19;;62669:123:0;30226:410:1;62669:123:0;-1:-1:-1;;;;;62825:17:0;;;;;;:9;:17;;;;;;:29;;62847:6;62825:21;:29::i;:::-;-1:-1:-1;;;;;62805:17:0;;;;;;;:9;:17;;;;;;:49;;;;62888:20;;;;;;;:32;;62913:6;62888:24;:32::i;:::-;-1:-1:-1;;;;;62865:20:0;;;;;;;:9;:20;;;;;;;:55;;;;62936:35;;;;;;;;;;62964:6;3829:25:1;;3817:2;3802:18;;3683:177;10929:98:0;10987:7;11014:5;11018:1;11014;:5;:::i;:::-;11007:12;10929:98;-1:-1:-1;;;10929:98:0:o;29257:112::-;29336:25;29347:4;29353:7;29929:238;30013:22;30021:4;30027:7;30013;:22::i;:::-;30008:152;;30052:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30052:29:0;;;;;;;;;:36;;-1:-1:-1;;30052:36:0;30084:4;30052:36;;;30135:12;22200:10;;22120:98;30135:12;-1:-1:-1;;;;;30108:40:0;30126:7;-1:-1:-1;;;;;30108:40:0;30120:4;30108:40;;;;;;;;;;29929:238;;:::o;30347:239::-;30431:22;30439:4;30445:7;30431;:22::i;:::-;30427:152;;;30502:5;30470:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30470:29:0;;;;;;;;;;:37;;-1:-1:-1;;30470:37:0;;;30527:40;22200:10;;30470:12;;30527:40;;30502:5;30527:40;30347:239;;:::o;9792:98::-;9850:7;9877:5;9881:1;9877;:5;:::i;48065:399::-;-1:-1:-1;;;;;48149:21:0;;48141:65;;;;-1:-1:-1;;;48141:65:0;;30843:2:1;48141:65:0;;;30825:21:1;30882:2;30862:18;;;30855:30;30921:33;30901:18;;;30894:61;30972:18;;48141:65:0;30641:355:1;48141:65:0;48297:6;48281:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;48314:18:0;;:9;:18;;;;;;;;;;:28;;48336:6;;48314:9;:28;;48336:6;;48314:28;:::i;:::-;;;;-1:-1:-1;;48358:37:0;;3829:25:1;;;-1:-1:-1;;;;;48358:37:0;;;48375:1;;48358:37;;3817:2:1;3802:18;48358:37:0;;;;;;;28332:218;;:::o;10530:98::-;10588:7;10615:5;10619:1;10615;:5;:::i;10173:98::-;10231:7;10258:5;10262:1;10258;:5;:::i;48797:591::-;-1:-1:-1;;;;;48881:21:0;;48873:67;;;;-1:-1:-1;;;48873:67:0;;31376:2:1;48873:67:0;;;31358:21:1;31415:2;31395:18;;;31388:30;31454:34;31434:18;;;31427:62;-1:-1:-1;;;31505:18:1;;;31498:31;31546:19;;48873:67:0;31174:397:1;48873:67:0;-1:-1:-1;;;;;49040:18:0;;49015:22;49040:18;;;;;;;;;;;49077:24;;;;49069:71;;;;-1:-1:-1;;;49069:71:0;;31778:2:1;49069:71:0;;;31760:21:1;31817:2;31797:18;;;31790:30;31856:34;31836:18;;;31829:62;-1:-1:-1;;;31907:18:1;;;31900:32;31949:19;;49069:71:0;31576:398:1;49069:71:0;-1:-1:-1;;;;;49176:18:0;;:9;:18;;;;;;;;;;49197:23;;;49176:44;;49242:12;:22;;49214:6;;49176:9;49242:22;;49214:6;;49242:22;:::i;:::-;;;;-1:-1:-1;;49282:37:0;;3829:25:1;;;49308:1:0;;-1:-1:-1;;;;;49282:37:0;;;;;3817:2:1;3802:18;49282:37:0;;;;;;;27188:147;;;:::o;38058:314::-;38222:58;;;-1:-1:-1;;;;;32171:32:1;;;38222:58:0;;;32153:51:1;32220:18;;;;32213:34;;;38222:58:0;;;;;;;;;;32126:18:1;;;;38222:58:0;;;;;;;-1:-1:-1;;;;;38222:58:0;-1:-1:-1;;;38222:58:0;;;38211:70;;-1:-1:-1;;;;38211:10:0;;;;:70;;38222:58;38211:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38175:106;;;;38300:7;:57;;;;-1:-1:-1;38312:11:0;;:16;;:44;;;38343:4;38332:24;;;;;;;;;;;;:::i;:::-;38292:72;;;;-1:-1:-1;;;38292:72:0;;32739:2:1;38292:72:0;;;32721:21:1;32778:1;32758:18;;;32751:29;-1:-1:-1;;;32796:18:1;;;32789:32;32838:18;;38292:72:0;32537:325:1;33095:191:0;33188:6;;;-1:-1:-1;;;;;33205:17:0;;;-1:-1:-1;;;;;;33205:17:0;;;;;;;33238:40;;33188:6;;;33205:17;33188:6;;33238:40;;33169:16;;33238:40;33158:128;33095:191;:::o;50497:453::-;50632:24;50659:25;50669:5;50676:7;50659:9;:25::i;:::-;50632:52;;-1:-1:-1;;50699:16:0;:37;50695:248;;50781:6;50761:16;:26;;50753:68;;;;-1:-1:-1;;;50753:68:0;;33069:2:1;50753:68:0;;;33051:21:1;33108:2;33088:18;;;33081:30;33147:31;33127:18;;;33120:59;33196:18;;50753:68:0;32867:353:1;50753:68:0;50865:51;50874:5;50881:7;50909:6;50890:16;:25;50865:8;:51::i;38568:168::-;38681:12;;;38641;38681;;;;;;;;;-1:-1:-1;;;;;38659:7:0;;;38674:5;;38659:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38640:54;;;38713:7;38705:23;;;;-1:-1:-1;;;38705:23:0;;33427:2:1;38705:23:0;;;33409:21:1;33466:1;33446:18;;;33439:29;-1:-1:-1;;;33484:18:1;;;33477:33;33527:18;;38705:23:0;33225:326:1;37382:316:0;37547:59;;;-1:-1:-1;;;;;32171:32:1;;;37547:59:0;;;32153:51:1;32220:18;;;;32213:34;;;37547:59:0;;;;;;;;;;32126:18:1;;;;37547:59:0;;;;;;;-1:-1:-1;;;;;37547:59:0;-1:-1:-1;;;37547:59:0;;;37536:71;;-1:-1:-1;;;;37536:10:0;;;;:71;;37547:59;37536:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37500:107;;;;37626:7;:57;;;;-1:-1:-1;37638:11:0;;:16;;:44;;;37669:4;37658:24;;;;;;;;;;;;:::i;:::-;37618:72;;;;-1:-1:-1;;;37618:72:0;;33758:2:1;37618:72:0;;;33740:21:1;33797:1;33777:18;;;33770:29;-1:-1:-1;;;33815:18:1;;;33808:32;33857:18;;37618:72:0;33556:325:1;26053:505:0;26142:22;26150:4;26156:7;26142;:22::i;:::-;26137:414;;26330:41;26358:7;-1:-1:-1;;;;;26330:41:0;26368:2;26330:19;:41::i;:::-;26444:38;26472:4;26479:2;26444:19;:38::i;:::-;26235:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26235:270:0;;;;;;;;;;-1:-1:-1;;;26181:358:0;;;;;;;:::i;17634:451::-;17709:13;17735:19;17767:10;17771:6;17767:1;:10;:::i;:::-;:14;;17780:1;17767:14;:::i;:::-;-1:-1:-1;;;;;17757:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17757:25:0;;17735:47;;-1:-1:-1;;;17793:6:0;17800:1;17793:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17793:15:0;;;;;;;;;-1:-1:-1;;;17819:6:0;17826:1;17819:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17819:15:0;;;;;;;;-1:-1:-1;17850:9:0;17862:10;17866:6;17862:1;:10;:::i;:::-;:14;;17875:1;17862:14;:::i;:::-;17850:26;;17845:135;17882:1;17878;:5;17845:135;;;-1:-1:-1;;;17930:5:0;17938:3;17930:11;17917:25;;;;;;;:::i;:::-;;;;17905:6;17912:1;17905:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;17905:37:0;;;;;;;;-1:-1:-1;17967:1:0;17957:11;;;;;17885:3;;;:::i;:::-;;;17845:135;;;-1:-1:-1;17998:10:0;;17990:55;;;;-1:-1:-1;;;17990:55:0;;35020:2:1;17990:55:0;;;35002:21:1;;;35039:18;;;35032:30;35098:34;35078:18;;;35071:62;35150:18;;17990:55:0;34818:356:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:258;569:1;579:113;593:6;590:1;587:13;579:113;;;669:11;;;663:18;650:11;;;643:39;615:2;608:10;579:113;;;710:6;707:1;704:13;701:48;;;-1:-1:-1;;745:1:1;727:16;;720:27;497:258::o;760:::-;802:3;840:5;834:12;867:6;862:3;855:19;883:63;939:6;932:4;927:3;923:14;916:4;909:5;905:16;883:63;:::i;:::-;1000:2;979:15;-1:-1:-1;;975:29:1;966:39;;;;1007:4;962:50;;760:258;-1:-1:-1;;760:258:1:o;1023:220::-;1172:2;1161:9;1154:21;1135:4;1192:45;1233:2;1222:9;1218:18;1210:6;1192:45;:::i;1248:131::-;-1:-1:-1;;;;;1323:31:1;;1313:42;;1303:70;;1369:1;1366;1359:12;1384:134;1452:20;;1481:31;1452:20;1481:31;:::i;:::-;1384:134;;;:::o;1523:315::-;1591:6;1599;1652:2;1640:9;1631:7;1627:23;1623:32;1620:52;;;1668:1;1665;1658:12;1620:52;1707:9;1694:23;1726:31;1751:5;1726:31;:::i;:::-;1776:5;1828:2;1813:18;;;;1800:32;;-1:-1:-1;;;1523:315:1:o;1843:247::-;1902:6;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;2010:9;1997:23;2029:31;2054:5;2029:31;:::i;2095:156::-;2161:20;;2221:4;2210:16;;2200:27;;2190:55;;2241:1;2238;2231:12;2256:171;2323:20;;-1:-1:-1;;;;;2372:30:1;;2362:41;;2352:69;;2417:1;2414;2407:12;2432:326;2505:6;2513;2521;2574:2;2562:9;2553:7;2549:23;2545:32;2542:52;;;2590:1;2587;2580:12;2542:52;2613:27;2630:9;2613:27;:::i;:::-;2603:37;;2659;2692:2;2681:9;2677:18;2659:37;:::i;:::-;2649:47;;2715:37;2748:2;2737:9;2733:18;2715:37;:::i;:::-;2705:47;;2432:326;;;;;:::o;2763:182::-;2820:6;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:27;2929:9;2912:27;:::i;2950:728::-;3123:2;3112:9;3105:21;3086:4;3161:6;3155:13;3204:4;3199:2;3188:9;3184:18;3177:32;3232:52;3279:3;3268:9;3264:19;3250:12;3232:52;:::i;:::-;3218:66;;3333:2;3325:6;3321:15;3315:22;-1:-1:-1;;;;;3430:2:1;3414:14;3410:23;3405:2;3394:9;3390:18;3383:51;3498:2;3492;3484:6;3480:15;3474:22;3470:31;3465:2;3454:9;3450:18;3443:59;3571:2;3563:6;3559:15;3553:22;3546:30;3539:38;3533:3;3522:9;3518:19;3511:67;3645:2;3638:3;3630:6;3626:16;3620:23;3616:32;3609:4;3598:9;3594:20;3587:62;;;3666:6;3658:14;;;2950:728;;;;:::o;3865:317::-;3931:6;3939;3992:2;3980:9;3971:7;3967:23;3963:32;3960:52;;;4008:1;4005;3998:12;3960:52;4031:27;4048:9;4031:27;:::i;:::-;4021:37;;4108:2;4097:9;4093:18;4080:32;4121:31;4146:5;4121:31;:::i;:::-;4171:5;4161:15;;;3865:317;;;;;:::o;4680:456::-;4757:6;4765;4773;4826:2;4814:9;4805:7;4801:23;4797:32;4794:52;;;4842:1;4839;4832:12;4794:52;4881:9;4868:23;4900:31;4925:5;4900:31;:::i;:::-;4950:5;-1:-1:-1;5007:2:1;4992:18;;4979:32;5020:33;4979:32;5020:33;:::i;:::-;4680:456;;5072:7;;-1:-1:-1;;;5126:2:1;5111:18;;;;5098:32;;4680:456::o;5141:180::-;5200:6;5253:2;5241:9;5232:7;5228:23;5224:32;5221:52;;;5269:1;5266;5259:12;5221:52;-1:-1:-1;5292:23:1;;5141:180;-1:-1:-1;5141:180:1:o;5508:315::-;5576:6;5584;5637:2;5625:9;5616:7;5612:23;5608:32;5605:52;;;5653:1;5650;5643:12;5605:52;5689:9;5676:23;5666:33;;5749:2;5738:9;5734:18;5721:32;5762:31;5787:5;5762:31;:::i;6392:127::-;6453:10;6448:3;6444:20;6441:1;6434:31;6484:4;6481:1;6474:15;6508:4;6505:1;6498:15;6524:1336;6633:6;6641;6649;6657;6710:3;6698:9;6689:7;6685:23;6681:33;6678:53;;;6727:1;6724;6717:12;6678:53;6767:9;6754:23;-1:-1:-1;;;;;6837:2:1;6829:6;6826:14;6823:34;;;6853:1;6850;6843:12;6823:34;6891:6;6880:9;6876:22;6866:32;;6936:7;6929:4;6925:2;6921:13;6917:27;6907:55;;6958:1;6955;6948:12;6907:55;6994:2;6981:16;7016:4;7039:2;7035;7032:10;7029:36;;;7045:18;;:::i;:::-;7091:2;7088:1;7084:10;7123:2;7117:9;7186:2;7182:7;7177:2;7173;7169:11;7165:25;7157:6;7153:38;7241:6;7229:10;7226:22;7221:2;7209:10;7206:18;7203:46;7200:72;;;7252:18;;:::i;:::-;7288:2;7281:22;7338:18;;;7372:15;;;;-1:-1:-1;7414:11:1;;;7410:20;;;7442:19;;;7439:39;;;7474:1;7471;7464:12;7439:39;7498:11;;;;7518:148;7534:6;7529:3;7526:15;7518:148;;;7600:23;7619:3;7600:23;:::i;:::-;7588:36;;7551:12;;;;7644;;;;7518:148;;;7685:6;-1:-1:-1;;7723:18:1;;7710:32;;-1:-1:-1;7761:37:1;;-1:-1:-1;;7794:2:1;7779:18;;;-1:-1:-1;7761:37:1;:::i;:::-;7751:47;;7817:37;7850:2;7839:9;7835:18;7817:37;:::i;:::-;7807:47;;6524:1336;;;;;;;:::o;8463:932::-;8569:6;8577;8585;8593;8601;8609;8662:3;8650:9;8641:7;8637:23;8633:33;8630:53;;;8679:1;8676;8669:12;8630:53;8715:9;8702:23;8692:33;;8772:2;8761:9;8757:18;8744:32;8734:42;;8826:2;8815:9;8811:18;8798:32;8839:31;8864:5;8839:31;:::i;:::-;8889:5;-1:-1:-1;8945:2:1;8930:18;;8917:32;-1:-1:-1;;;;;8998:14:1;;;8995:34;;;9025:1;9022;9015:12;8995:34;9063:6;9052:9;9048:22;9038:32;;9108:7;9101:4;9097:2;9093:13;9089:27;9079:55;;9130:1;9127;9120:12;9079:55;9170:2;9157:16;9196:2;9188:6;9185:14;9182:34;;;9212:1;9209;9202:12;9182:34;9257:7;9252:2;9243:6;9239:2;9235:15;9231:24;9228:37;9225:57;;;9278:1;9275;9268:12;9225:57;9309:2;9305;9301:11;9291:21;;9331:6;9321:16;;;;;9384:3;9373:9;9369:19;9356:33;9346:43;;8463:932;;;;;;;;:::o;9852:254::-;9917:6;9925;9978:2;9966:9;9957:7;9953:23;9949:32;9946:52;;;9994:1;9991;9984:12;9946:52;10017:27;10034:9;10017:27;:::i;:::-;10007:37;;10063;10096:2;10085:9;10081:18;10063:37;:::i;:::-;10053:47;;9852:254;;;;;:::o;10111:575::-;10360:3;10349:9;10342:22;10323:4;10381:46;10422:3;10411:9;10407:19;10399:6;10381:46;:::i;:::-;-1:-1:-1;;;;;10500:15:1;;;10495:2;10480:18;;10473:43;10552:15;;;10547:2;10532:18;;10525:43;-1:-1:-1;10611:14:1;;10604:22;10599:2;10584:18;;10577:50;10664:15;;;10658:3;10643:19;;;10636:44;;;;10373:54;10111:575;-1:-1:-1;10111:575:1:o;10691:456::-;10768:6;10776;10784;10837:2;10825:9;10816:7;10812:23;10808:32;10805:52;;;10853:1;10850;10843:12;10805:52;10892:9;10879:23;10911:31;10936:5;10911:31;:::i;:::-;10961:5;-1:-1:-1;11013:2:1;10998:18;;10985:32;;-1:-1:-1;11069:2:1;11054:18;;11041:32;11082:33;11041:32;11082:33;:::i;:::-;11134:7;11124:17;;;10691:456;;;;;:::o;11379:252::-;11443:6;11451;11504:2;11492:9;11483:7;11479:23;11475:32;11472:52;;;11520:1;11517;11510:12;11472:52;11543:27;11560:9;11543:27;:::i;:::-;11533:37;;11589:36;11621:2;11610:9;11606:18;11589:36;:::i;11636:669::-;11737:6;11745;11753;11761;11769;11777;11830:3;11818:9;11809:7;11805:23;11801:33;11798:53;;;11847:1;11844;11837:12;11798:53;11870:27;11887:9;11870:27;:::i;:::-;11860:37;;11944:2;11933:9;11929:18;11916:32;11906:42;;11995:2;11984:9;11980:18;11967:32;11957:42;;12049:2;12038:9;12034:18;12021:32;12062:31;12087:5;12062:31;:::i;:::-;12112:5;-1:-1:-1;12169:3:1;12154:19;;12141:33;12183;12141;12183;:::i;:::-;12235:7;-1:-1:-1;12261:38:1;12294:3;12279:19;;12261:38;:::i;:::-;12251:48;;11636:669;;;;;;;;:::o;12310:388::-;12378:6;12386;12439:2;12427:9;12418:7;12414:23;12410:32;12407:52;;;12455:1;12452;12445:12;12407:52;12494:9;12481:23;12513:31;12538:5;12513:31;:::i;12703:380::-;12782:1;12778:12;;;;12825;;;12846:61;;12900:4;12892:6;12888:17;12878:27;;12846:61;12953:2;12945:6;12942:14;12922:18;12919:38;12916:161;;;12999:10;12994:3;12990:20;12987:1;12980:31;13034:4;13031:1;13024:15;13062:4;13059:1;13052:15;12916:161;;12703:380;;;:::o;13442:127::-;13503:10;13498:3;13494:20;13491:1;13484:31;13534:4;13531:1;13524:15;13558:4;13555:1;13548:15;13574:209;13612:3;-1:-1:-1;;;;;13693:2:1;13686:5;13682:14;13720:2;13711:7;13708:15;13705:41;;;13726:18;;:::i;:::-;13775:1;13762:15;;13574:209;-1:-1:-1;;;13574:209:1:o;17922:127::-;17983:10;17978:3;17974:20;17971:1;17964:31;18014:4;18011:1;18004:15;18038:4;18035:1;18028:15;18054:135;18093:3;-1:-1:-1;;18114:17:1;;18111:43;;;18134:18;;:::i;:::-;-1:-1:-1;18181:1:1;18170:13;;18054:135::o;18194:128::-;18234:3;18265:1;18261:6;18258:1;18255:13;18252:39;;;18271:18;;:::i;:::-;-1:-1:-1;18307:9:1;;18194:128::o;20810:277::-;20877:6;20930:2;20918:9;20909:7;20905:23;20901:32;20898:52;;;20946:1;20943;20936:12;20898:52;20978:9;20972:16;21031:5;21024:13;21017:21;21010:5;21007:32;20997:60;;21053:1;21050;21043:12;21092:651;21287:2;21276:9;21269:21;21250:4;21325:6;21319:13;21368:4;21363:2;21352:9;21348:18;21341:32;21396:52;21443:3;21432:9;21428:19;21414:12;21396:52;:::i;:::-;21382:66;;21529:1;21525;21520:3;21516:11;21512:19;21506:2;21498:6;21494:15;21488:22;21484:48;21479:2;21468:9;21464:18;21457:76;21587:2;21579:6;21575:15;21569:22;21564:2;21553:9;21549:18;21542:50;21647:2;21639:6;21635:15;21629:22;21623:3;21612:9;21608:19;21601:51;21708:3;21700:6;21696:16;21690:23;21683:4;21672:9;21668:20;21661:53;21731:6;21723:14;;;21092:651;;;;:::o;21748:184::-;21818:6;21871:2;21859:9;21850:7;21846:23;21842:32;21839:52;;;21887:1;21884;21877:12;21839:52;-1:-1:-1;21910:16:1;;21748:184;-1:-1:-1;21748:184:1:o;21937:654::-;22034:6;22042;22050;22058;22111:3;22099:9;22090:7;22086:23;22082:33;22079:53;;;22128:1;22125;22118:12;22079:53;22160:9;22154:16;22179:31;22204:5;22179:31;:::i;:::-;22279:2;22264:18;;22258:25;22229:5;;-1:-1:-1;22292:33:1;22258:25;22292:33;:::i;:::-;22396:2;22381:18;;22375:25;22344:7;;-1:-1:-1;22409:33:1;22375:25;22409:33;:::i;:::-;22513:2;22498:18;;22492:25;22461:7;;-1:-1:-1;22526:33:1;22492:25;22526:33;:::i;:::-;21937:654;;;;-1:-1:-1;21937:654:1;;-1:-1:-1;;21937:654:1:o;25540:236::-;25579:3;-1:-1:-1;;;;;25652:2:1;25649:1;25645:10;25682:2;25679:1;25675:10;25713:3;25709:2;25705:12;25700:3;25697:21;25694:47;;;25721:18;;:::i;:::-;25757:13;;25540:236;-1:-1:-1;;;;25540:236:1:o;26979:127::-;27040:10;27035:3;27031:20;27028:1;27021:31;27071:4;27068:1;27061:15;27095:4;27092:1;27085:15;27111:120;27151:1;27177;27167:35;;27182:18;;:::i;:::-;-1:-1:-1;27216:9:1;;27111:120::o;27236:125::-;27276:4;27304:1;27301;27298:8;27295:34;;;27309:18;;:::i;:::-;-1:-1:-1;27346:9:1;;27236:125::o;27366:112::-;27398:1;27424;27414:35;;27429:18;;:::i;:::-;-1:-1:-1;27463:9:1;;27366:112::o;31001:168::-;31041:7;31107:1;31103;31099:6;31095:14;31092:1;31089:21;31084:1;31077:9;31070:17;31066:45;31063:71;;;31114:18;;:::i;:::-;-1:-1:-1;31154:9:1;;31001:168::o;32258:274::-;32387:3;32425:6;32419:13;32441:53;32487:6;32482:3;32475:4;32467:6;32463:17;32441:53;:::i;:::-;32510:16;;;;;32258:274;-1:-1:-1;;32258:274:1:o;33886:786::-;34297:25;34292:3;34285:38;34267:3;34352:6;34346:13;34368:62;34423:6;34418:2;34413:3;34409:12;34402:4;34394:6;34390:17;34368:62;:::i;:::-;-1:-1:-1;;;34489:2:1;34449:16;;;34481:11;;;34474:40;34539:13;;34561:63;34539:13;34610:2;34602:11;;34595:4;34583:17;;34561:63;:::i;:::-;34644:17;34663:2;34640:26;;33886:786;-1:-1:-1;;;;33886:786:1:o;34677:136::-;34716:3;34744:5;34734:39;;34753:18;;:::i;:::-;-1:-1:-1;;;34789:18:1;;34677:136::o

Swarm Source

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