POL Price: $0.580793 (-10.85%)
 

Overview

Max Total Supply

2,956,332.826778541768508959 pBORA

Holders

1,222 (0.00%)

Total Transfers

-

Market

Price

$0.1348 @ 0.232048 POL (-15.61%)

Onchain Market Cap

$398,430.89

Circulating Supply Market Cap

$146,002,825.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

pBORA token is a Polygon Network token that can be used on BORA PORTAL to enjoy BORA PORTAL's multi-chain services and blockchain games.

Market

Volume (24H):$18,076,157.00
Market Capitalization:$146,002,825.00
Circulating Supply:1,099,750,000.00 pBORA
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
Bora20v2

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 50 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2023-04-20
*/

// SPDX-License-Identifier: MIT
// 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/[email protected]

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/utils/introspection/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/math/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

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(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

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/security/[email protected]

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

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/[email protected]

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV // Deprecated in v4.8
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

pragma solidity ^0.8.0;





/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File Projects/BoraV2.1/contracts/Bora20v2.sol

pragma solidity 0.8.9;







interface IBoraV2FeeCalculate {
    // function calcAmount(uint256 amount) external view returns (uint256, uint256);
    // function calcAmount(uint256 amount, uint256 _feeRatio) external pure returns (uint256, uint256);
    function calcAmount(uint256 amount, address from, address to, bytes32 _feeInfo) external view returns (uint256, uint256, address, bool);
}

interface IBoraV2FeeDistributor {
    function distributeFees() external returns (bool);
}

contract LockedToken {
    using SafeERC20 for IERC20;
    IERC20 private _token;
    address public immutable donor;
    address public immutable beneficiary;
    uint256 public immutable releaseTime;
    bool public immutable revocable;
    address public immutable system;

    event Claim(address beneficiary, uint256 amount, uint256 releaseTime);
    event Revoke(address donor, uint256 amount);

    constructor(address pToken, address pDonor, address pBeneficiary, uint256 pReleaseTime, bool pRevocable, address pSystem) {
        // require(address(token) != address(0), "LockedToken: token is zero address");
        require(pDonor != address(0), "LockedToken: donor is zero address");
        require(pBeneficiary != address(0), "LockedToken: beneficiary is zero address");
        require(pSystem != address(0), "LockedToken: system is zero address");
        require(pReleaseTime > block.timestamp, "LockedToken: release time is before current time");

        _token = IERC20(pToken);
        donor = pDonor;
        beneficiary = pBeneficiary;
        releaseTime = pReleaseTime;
        revocable = pRevocable;
        system = pSystem;
    }

    function token() public view returns (IERC20) {
        return _token;
    }

    function balanceOf() public view returns (uint256) {
        return _token.balanceOf(address(this));
    }

    function getInfo() external view returns (address, address, uint256, bool, uint256, address) {
        return (donor, beneficiary, releaseTime, revocable, _token.balanceOf(address(this)), system);
    }

    function revoke() public {
        require(revocable, "LockedToken: tokens are not revocable");
        require((msg.sender == donor) || (msg.sender == system), "LockedToken: only donor|system can revoke");

        uint256 amount = _token.balanceOf(address(this));
        require(amount > 0, "LockedToken: no tokens to revoke");

        _token.safeTransfer(donor, amount);
        emit Revoke(donor, amount);
    }

    // claim is intended to be called by anyone after the release time, because the beneficiary is already claimed and cannot be changed.
    function claim() public {
        require(block.timestamp >= releaseTime, "LockedToken: current time is before release time");

        uint256 amount = _token.balanceOf(address(this));
        require(amount > 0, "LockedToken: no tokens to claim");

        _token.safeTransfer(beneficiary, amount);
        emit Claim(beneficiary, amount, releaseTime);
    }
}

contract Bora20v2 is ERC20, ERC20Burnable, AccessControl, Pausable, Ownable, ERC20Permit {
    using SafeERC20 for IERC20;

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant SYSTEM_ROLE = keccak256("SYSTEM_ROLE");

    // bytes32 public constant CALL_TRANS = keccak256("CALL_TRANS");
    // bytes32 public constant CALL_MINT = keccak256("CALL_MINT");

    uint256 private _totalSupplyCap; // refer : ERC20Capped.sol

    mapping(address => bool) private _blacklist;
    bool public useWhitelisted = false;
    mapping(address => bool) private _whitelist;

    struct FeeStruct {
        bool isSet; // false : fee = 0, true : apply fee
        bool isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        uint256 feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        address feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        bytes32 feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        address feeReceiver; // Fee Receiver Address
        bool isFeeReceiverContract; // in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        uint256 lastUpdated;
    }

    struct FeeDistStruct {
        uint256 amount;
        uint256 fee;
        address feeReceiver;
        bool isDistributor;
    }

    FeeStruct public transFeeInfo;
    FeeStruct public mintFeeInfo;

    struct TransferStruct {
        uint256 oneTimeMaxAmount; // max amount per transferation
        uint256 oneDayMaxAmount; // max transfer amount per day
        uint256 oneDayUnit; // 86400 = 1 day (for Test, 3600 = 1 hour)
        uint256 currentDay; // use block.timestamp.div(oneDayUnit) to check current day
        uint256 currentDayAmount; // transfer amount of current day
    }

    TransferStruct public transferInfo;
    TransferStruct public mintInfo;

    bool private _destroyFlag = false; // for test only!

    struct ContractInfo {
        uint256 BappNo;
        string BappName;
        string SCVersion;
    }

    ContractInfo public contractInfo;

    constructor(uint256 initialSupply, string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); // Admin
        _grantRole(PAUSER_ROLE, _msgSender()); // Admin
        _grantRole(MINTER_ROLE, _msgSender()); // System + Mint + Burn
        _grantRole(SYSTEM_ROLE, _msgSender()); // System

        mintInfo.oneTimeMaxAmount = 99999999999999999999 * 10 ** decimals();
        mintInfo.oneDayMaxAmount = 99999999999999999999 * 10 ** decimals();
        mintInfo.oneDayUnit = 86400;

        transFeeInfo.isSet = false;
        mintFeeInfo.isSet = false;

        uint256 mintAmount = initialSupply > 0 ? initialSupply : 1205750000 * 10 ** decimals();
        _totalSupplyCap = mintAmount;
        _mint(_msgSender(), mintAmount);
        emit SupplyChanged("MINT", _msgSender(), mintAmount, totalSupply(), block.timestamp);

        mintInfo.oneTimeMaxAmount = 1000000 * 10 ** decimals();
        mintInfo.oneDayMaxAmount = 500000 * 10 ** decimals();
        mintInfo.currentDayAmount = 0;
        emit MintInfoChanged(_msgSender(), mintInfo.oneTimeMaxAmount, mintInfo.oneDayMaxAmount, mintInfo.oneDayUnit, block.timestamp);

        transferInfo.oneTimeMaxAmount = 1000000 * 10 ** decimals();
        transferInfo.oneDayMaxAmount = 500000 * 10 ** decimals();
        transferInfo.oneDayUnit = 86400;
        transferInfo.currentDayAmount = 0;
        emit TransferInfoChanged(_msgSender(), transferInfo.oneTimeMaxAmount, transferInfo.oneDayMaxAmount, transferInfo.oneDayUnit, block.timestamp);

        contractInfo.BappNo = 1000;
        contractInfo.BappName = name;
        contractInfo.SCVersion = "2.1.0";

        // Setting Account For Test

        // addAdmin(0x507c5bAAE6DD008924b8754e4101510e131303b9);
        // addAdmin(0xf58451B68870f90DB17aCFB3954806DAe47058dE);

        // grantRole(PAUSER_ROLE, 0x764a118Aa7857f56ddD272725539b65Aa04083cB);        // Admin
        // grantRole(MINTER_ROLE, 0x7080de4124d5119B6054bD35bE9749EbcCa0E577);        // System + Mint + Burn
        // grantRole(SYSTEM_ROLE, 0xF64D9d628ECcdb9381cC18d7C819F45FE0786F5D);        // System

        // transfer(0x507c5bAAE6DD008924b8754e4101510e131303b9, 100 * 10**18);
        // transfer(0xf58451B68870f90DB17aCFB3954806DAe47058dE, 100 * 10**18);
        // transfer(0x764a118Aa7857f56ddD272725539b65Aa04083cB, 100 * 10**18);
        // transfer(0x7080de4124d5119B6054bD35bE9749EbcCa0E577, 100 * 10**18);
        // transfer(0xF64D9d628ECcdb9381cC18d7C819F45FE0786F5D, 100 * 10**18);
        // transfer(0xA68a0b5b8F0521c8f9B39feC45FF1C39D3Be5259, 100 * 10**18);

        // _destroyFlag = true;
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function transferInternal(address from, address to, uint256 amount) private whenNotPaused returns (bool) {
        if (!transFeeInfo.isSet) {
            // if transFeeInfo is not setted
            _transfer(from, to, amount);
        } else {
            FeeDistStruct memory _feeDist = _calcFeeDistribution(transFeeInfo, amount, from, to);
            _transfer(from, to, _feeDist.amount);

            if (_feeDist.fee > 0) {
                _transfer(from, _feeDist.feeReceiver, _feeDist.fee);
                // if (Address.isContract(transFeeInfo.feeReceiver)) {
                //     IBoraV2FeeDistributor(transFeeInfo.feeReceiver).distributeFees();
                // }
                if (_feeDist.isDistributor) {
                    require(IBoraV2FeeDistributor(_feeDist.feeReceiver).distributeFees(), "BORA: failed to distribute fees");
                }
            }
        }
        return true;
    }

    function transfer(address to, uint256 amount) public override whenNotPaused checkWhitelisted(to) returns (bool) {
        return transferInternal(_msgSender(), to, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public override whenNotPaused checkWhitelisted(to) returns (bool) {
        _spendAllowance(from, _msgSender(), amount);
        return transferInternal(from, to, amount);
    }

    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) checkBlacklisted(to) {
        require(totalSupply() + amount <= totalSupplyCap(), "ERC20Capped: totalSupplyCap exceeded"); // refer : ERC20Capped.sol

        FeeDistStruct memory _feeDist;
        uint256 _nowDatetime = block.timestamp;

        if (!mintFeeInfo.isSet) {
            // if mintFeeInfo is not setted
            _feeDist.amount = amount;
            _mint(to, _feeDist.amount);
        } else {
            _feeDist = _calcFeeDistribution(mintFeeInfo, amount, _msgSender(), to);
            _mint(to, _feeDist.amount);

            if (_feeDist.fee > 0) {
                _mint(_feeDist.feeReceiver, _feeDist.fee);
                emit SupplyChanged("MINT", _feeDist.feeReceiver, _feeDist.fee, totalSupply(), _nowDatetime);
                if (_feeDist.isDistributor) {
                    IBoraV2FeeDistributor(_feeDist.feeReceiver).distributeFees();
                }
            }
        }
        emit SupplyChanged("MINT", to, _feeDist.amount, totalSupply(), _nowDatetime);
    }

    function burnBySystem(address account, uint256 amount) public onlyRole(SYSTEM_ROLE) {
        _burn(account, amount);
        emit SupplyChanged("BURN", account, amount, totalSupply(), block.timestamp);
    }

    function burn(uint256 amount) public override onlyRole(MINTER_ROLE) {
        ERC20Burnable.burn(amount);
        emit SupplyChanged("BURN", _msgSender(), amount, totalSupply(), block.timestamp);
    }

    function burnFrom(address account, uint256 amount) public override onlyRole(MINTER_ROLE) {
        ERC20Burnable.burnFrom(account, amount);
        emit SupplyChanged("BURN.FROM", account, amount, totalSupply(), block.timestamp);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes minting and burning. (+ transferFrom())
     *
     * Calling conditions:
     * - transfer : _beforeTokenTransfer(from, to, amount);  [when `from` and `to` are both non-zero]
     * - mint     : _beforeTokenTransfer(address(0), account, amount);
     * - burn     : _beforeTokenTransfer(account, address(0), amount);
     *
     * override : ERC20Pausable.sol
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override whenNotPaused checkBlacklisted(from) {
        super._beforeTokenTransfer(from, to, amount);

        if (to != address(0)) {
            TransferStruct storage _transferInfo = from != address(0) ? transferInfo : mintInfo;
            require(amount <= _transferInfo.oneTimeMaxAmount, "BORA: one time transfer limit exceeded");
            _checkDayMaxAmount(_transferInfo, amount);
            //"BORA: Can't transfer any more !! (oneDayMaxAmount)");
        }
    }

    /* ========== VIEWS ========== */
    function _calcFeeDistribution(FeeStruct memory feeInfo, uint256 amount, address from, address to) internal view returns (FeeDistStruct memory feeDist) {
        if (feeInfo.isSet) {
            if (feeInfo.isInnerLogic) {
                // (feeInfo.isSet=true && feeInfo.isInnerLogic=true) : use a internal logic
                (feeDist.amount, feeDist.fee) = _calcAmount(amount, feeInfo.feeRatio);
                feeDist.feeReceiver = feeInfo.feeReceiver;
                feeDist.isDistributor = feeInfo.isFeeReceiverContract;
            } else {
                // (feeInfo.isSet=true && feeInfo.isInnerLogic=false) : use a external logic
                (feeDist.amount, feeDist.fee, feeDist.feeReceiver, feeDist.isDistributor) = IBoraV2FeeCalculate(feeInfo.feeCalcAddress).calcAmount(amount, from, to, feeInfo.feeCalcCallBytes);
            }
        } else {
            feeDist.amount = amount;
        }

        return feeDist;
    }

    function _calcAmount(uint256 amount, uint256 feeRatio) internal pure returns (uint256, uint256) {
        uint256 _fee = (amount * feeRatio) / 10000;
        uint256 _amount = amount - _fee;
        return (_amount, _fee);
    }

    function _checkDayMaxAmount(TransferStruct storage _limit, uint256 amount) internal {
        uint256 nowDayTime = block.timestamp / _limit.oneDayUnit;
        if (_limit.currentDay != nowDayTime) {
            _limit.currentDay = nowDayTime;
            _limit.currentDayAmount = 0;
        }
        uint256 checkAmount = _limit.currentDayAmount + amount;
        require(checkAmount <= _limit.oneDayMaxAmount, "BORA: one day transfer limit exceeded");
        _limit.currentDayAmount = checkAmount;
    }

    function isWhitelisted(address _account) public view returns (bool) {
        if (useWhitelisted) {
            return _whitelist[_account];
        }
        return true;
    }

    function isBlacklisted(address account) public view returns (bool) {
        return _blacklist[account];
    }

    function setUseWhitelisted(bool flag) external onlyRole(SYSTEM_ROLE) {
        require(useWhitelisted != flag, "BORA: Status is already set to the desired state");
        useWhitelisted = flag;
        emit UseWhitelistedStatusChanged(_msgSender(), useWhitelisted);
    }

    function setWhitelist(address _account, bool flag) public onlyRole(SYSTEM_ROLE) returns (bool) {
        _whitelist[_account] = flag;
        emit WhitelistUpdated(_account, flag, block.timestamp);
        return true;
    }

    function setMultipleWhitelist(address[] memory _accountList, bool flag) external onlyRole(SYSTEM_ROLE) returns (bool) {
        for (uint256 i = 0; i < _accountList.length; i++) {
            setWhitelist(_accountList[i], flag);
        }
        return true;
    }

    function totalSupplyCap() public view returns (uint256) {
        return _totalSupplyCap;
    }

    function utilDiffTime(uint256 _checkTimestamp) public view returns (uint256, uint256) {
        require(_checkTimestamp > block.timestamp, "BORA: checkTime is before current time");
        uint256 nowDayTime = block.timestamp;
        uint256 chkDayTime = _checkTimestamp;
        uint256 nowDay = nowDayTime / 86400;
        uint256 chkDay = chkDayTime / 86400;
        return (chkDay - nowDay, chkDayTime - nowDayTime);
    }

    function utilDiffTime2(uint256 _timestamp1, uint256 _timestamp2) external pure returns (uint256, uint256) {
        require(_timestamp2 >= _timestamp1, "BORA: _timestamp2 is before _timestamp1");
        uint256 chkDay1 = _timestamp1 / 86400;
        uint256 chkDay2 = _timestamp2 / 86400;
        return (chkDay2 - chkDay1, _timestamp2 - _timestamp1);
    }

    function utilUnitConvert(uint256 _value) external pure returns (uint256, uint256, uint256) {
        return (_value, _value * 10 ** 9, _value * 10 ** 18);
    }

    function tokenLockInfo(LockedToken _lockToken) external view returns (address, address, address, uint256, bool, uint256, uint256) {
        uint256 _diffDay;
        (_diffDay, ) = utilDiffTime(_lockToken.releaseTime());
        return (address(_lockToken.token()), _lockToken.donor(), _lockToken.beneficiary(), _lockToken.releaseTime(), _lockToken.revocable(), _lockToken.balanceOf(), _diffDay);
    }

    /* ========== FUNCTIONS ========== */

    function multiTransfers(address[] memory recipients, uint256[] memory amount) public returns (bool) {
        require(recipients.length == amount.length, "BORA: Input arrays must be the same length");
        for (uint256 i = 0; i < recipients.length; i++) {
            require(transfer(recipients[i], amount[i]), "BORA: failed to transfer");
        }
        return true;
    }

    function multiTransferFroms(address[] memory senders, address[] memory recipients, uint256[] memory amount) public returns (bool) {
        require(senders.length == recipients.length && recipients.length == amount.length, "BORA: Input arrays must be the same length");
        for (uint256 i = 0; i < senders.length; i++) {
            require(transferFrom(senders[i], recipients[i], amount[i]), "BORA: failed to transfer");
        }
        return true;
    }

    function tokenLock(address _donor, address _beneficiary, uint256 _amount, uint256 _duration, uint256 _durationUnit, bool _revocable) public onlyRole(SYSTEM_ROLE) returns (LockedToken) {
        uint256 releaseTime = block.timestamp + (_duration * _durationUnit);
        LockedToken lockedToken = new LockedToken(address(this), _donor, _beneficiary, releaseTime, _revocable, address(this));
        transferInternal(_msgSender(), address(lockedToken), _amount);
        emit TokenLock(address(lockedToken), _donor, _beneficiary, lockedToken.balanceOf(), releaseTime, _revocable, address(this), block.timestamp);
        return lockedToken;
    }

    function tokenLockClaim(LockedToken _lockToken) public {
        _lockToken.claim();
    }

    function multiTokenLockClaim(LockedToken[] memory _lockToken) external {
        for (uint256 i = 0; i < _lockToken.length; i++) {
            tokenLockClaim(_lockToken[i]);
        }
    }

    function tokenLockRevoke(LockedToken _lockToken) public onlyRole(SYSTEM_ROLE) {
        _lockToken.revoke();
    }

    function multiTokenLockRevoke(LockedToken[] memory _lockToken) external onlyRole(SYSTEM_ROLE) {
        for (uint256 i = 0; i < _lockToken.length; i++) {
            tokenLockRevoke(_lockToken[i]);
        }
    }

    /* ========== FUNCTIONS : Setting ========== */

    function setMintInfo(uint256 _oneTimeMaxAmount, uint256 _oneDayMaxAmount, uint256 _oneDayUnit) external onlyRole(SYSTEM_ROLE) returns (bool) {
        mintInfo.oneTimeMaxAmount = _oneTimeMaxAmount;
        mintInfo.oneDayMaxAmount = _oneDayMaxAmount;
        mintInfo.oneDayUnit = _oneDayUnit;
        emit MintInfoChanged(_msgSender(), _oneTimeMaxAmount, _oneDayMaxAmount, _oneDayUnit, block.timestamp);
        return true;
    }

    function setTransferInfo(uint256 _oneTimeMaxAmount, uint256 _oneDayMaxAmount, uint256 _oneDayUnit) external onlyRole(SYSTEM_ROLE) returns (bool) {
        transferInfo.oneTimeMaxAmount = _oneTimeMaxAmount;
        transferInfo.oneDayMaxAmount = _oneDayMaxAmount;
        transferInfo.oneDayUnit = _oneDayUnit;
        emit TransferInfoChanged(_msgSender(), _oneTimeMaxAmount, _oneDayMaxAmount, _oneDayUnit, block.timestamp);
        return true;
    }

    function setContractInfo(uint256 _bappNo, string calldata _bappName, string calldata _scVersion) external onlyRole(SYSTEM_ROLE) returns (bool) {
        contractInfo.BappNo = _bappNo;
        contractInfo.BappName = _bappName;
        contractInfo.SCVersion = _scVersion;
        return true;
    }

    function setBlacklist(address _account, bool _isBlacklist) external onlyRole(SYSTEM_ROLE) returns (bool) {
        _blacklist[_account] = _isBlacklist;
        emit BlacklistUpdated(_account, _isBlacklist, block.timestamp);
        return true;
    }

    function setTotalSupplyCap(uint256 _supplyCap) external onlyRole(SYSTEM_ROLE) returns (bool) {
        _totalSupplyCap = _supplyCap;
        emit CapChanged(_msgSender(), _supplyCap, block.timestamp);
        return true;
    }

    function setFeeInfoForTransfer(bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract) external onlyRole(SYSTEM_ROLE) returns (bool) {
        require(_feeRatio <= 5000, "BORA: Check a fee ratio (0~5000, 50%)");
        transFeeInfo.isSet = _isSet; // false : fee = 0, true : apply fee
        transFeeInfo.isInnerLogic = _isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        transFeeInfo.feeRatio = _feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        transFeeInfo.feeCalcAddress = _feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        transFeeInfo.feeCalcCallBytes = _feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        transFeeInfo.feeReceiver = _feeReceiver; // for Internal : Fee Receiver Address
        transFeeInfo.isFeeReceiverContract = _isFeeReceiverContract; // for Internal : in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        transFeeInfo.lastUpdated = block.timestamp;
        emit FeeInfoChanged("FeeTrans", _isSet, _isInnerLogic, _feeRatio, _feeCalcAddress, _feeCalcCallBytes, _feeReceiver, _isFeeReceiverContract, block.timestamp);
        return true;
    }

    function setFeeInfoForMint(bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract) external onlyRole(SYSTEM_ROLE) returns (bool) {
        require(_feeRatio <= 5000, "BORA: Check a fee ratio (0~5000, 50%)");
        mintFeeInfo.isSet = _isSet; // false : fee = 0, true : apply fee
        mintFeeInfo.isInnerLogic = _isInnerLogic; // Location a Fee Calculate logic : true=internal, false=external
        mintFeeInfo.feeRatio = _feeRatio; // for Internal (100% = 10000, 50% = 5000, 10% = 1000, 1% = 100, 0.1% = 10, 0.01% = 1)
        mintFeeInfo.feeCalcAddress = _feeCalcAddress; // for External : BoraV2FeeCalculate Smart Contract Address
        mintFeeInfo.feeCalcCallBytes = _feeCalcCallBytes; // for External : BoraV2FeeCalculate Call Command Bytes
        mintFeeInfo.feeReceiver = _feeReceiver; // for Internal : Fee Receiver Address
        mintFeeInfo.isFeeReceiverContract = _isFeeReceiverContract; // for Internal : in case of the Fee Receiver Address is contract ( calls feeDistributor.distributeFees() )
        mintFeeInfo.lastUpdated = block.timestamp;
        emit FeeInfoChanged("FeeMint", _isSet, _isInnerLogic, _feeRatio, _feeCalcAddress, _feeCalcCallBytes, _feeReceiver, _isFeeReceiverContract, block.timestamp);
        return true;
    }

    /* ========== RESTRICTED FUNCTIONS ========== */

    /** @dev For withdrawl a blackmoney or For migrate to New Token */
    function zTransferByAdmin(address _from, address _to, uint256 _amount) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        _transfer(_from, _to, _amount);
        emit TransferByAdmin(_from, _to, _amount, _msgSender(), block.timestamp);
        return true;
    }

    function zRecoverTokenByAdmin(address _tokenAddress, uint256 _tokenAmount) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        IERC20(_tokenAddress).safeTransfer(owner(), _tokenAmount);
        emit RecoveredByAdmin(_tokenAddress, _msgSender(), _tokenAmount, block.timestamp);
        return true;
    }

    function zRecoverTokenALLByAdmin(address _tokenAddress) external onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        require(zRecoverTokenByAdmin(_tokenAddress, IERC20(_tokenAddress).balanceOf(address(this))), "BORA: Error zRecoverTokenByAdmin()");
        return true;
    }

    function addAdmin(address _account) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        require(_account != address(0), "BORA: add admin of the zero address");
        grantRole(DEFAULT_ADMIN_ROLE, _account); // Admin
        grantRole(PAUSER_ROLE, _account); // Admin
        grantRole(MINTER_ROLE, _account); // System + Mint + Burn
        grantRole(SYSTEM_ROLE, _account); // System
        emit RoleChanged("addAdmin", _msgSender(), _account, block.timestamp);
        return true;
    }

    function renounceAdmin() public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        return revokeAdmin(_msgSender());
    }

    function revokeAdmin(address _account) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) {
        require(_account != owner(), "BORA: Owner can't revoke AdminRole");
        revokeRole(PAUSER_ROLE, _account); // Admin
        revokeRole(MINTER_ROLE, _account); // System + Mint + Burn
        revokeRole(SYSTEM_ROLE, _account); // System
        revokeRole(DEFAULT_ADMIN_ROLE, _account); // Admin
        emit RoleChanged("revokeAdmin", _msgSender(), _account, block.timestamp);
        return true;
    }

    function transferOwnership(address _account) public override onlyOwner {
        addAdmin(_account);
        Ownable.transferOwnership(_account);
    }

    function renounceOwnership() public view override onlyOwner {
        revert("BORA: renounceOwnership is disabled");
    }

    /* ========== for test only! ========== */

    function setDestroyFlag(bool destroyFlag) public onlyOwner {
        _destroyFlag = destroyFlag;
    }

    function zDestroy() public onlyOwner {
        require(_destroyFlag, "BORA: Check the destroy flag");
        selfdestruct(payable(msg.sender));
    }

    /* ========== Modifier ======== */

    modifier checkWhitelisted(address _account) {
        require(isWhitelisted(_account), "BORA: Address is not a whitelisted address");
        _;
    }

    modifier checkBlacklisted(address _account) {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || !isBlacklisted(_account), "BORA: Address is a blacklisted address");
        _;
    }

    /* ========== EVENTS ========== */

    event TokenLock(address indexed token, address indexed donor, address indexed beneficiary, uint256 amount, uint256 releaseTime, bool _revocable, address _system, uint256 logTime);
    event SupplyChanged(string indexed cmdType, address indexed to, uint256 amount, uint256 afterTotalSupply, uint256 logTime);
    event RoleChanged(string indexed role, address indexed granter, address indexed grantee, uint256 logTime);
    event CapChanged(address indexed account, uint256 cap, uint256 logTime);
    event FeeInfoChanged(string indexed feeType, bool _isSet, bool _isInnerLogic, uint256 _feeRatio, address _feeCalcAddress, bytes32 _feeCalcCallBytes, address _feeReceiver, bool _isFeeReceiverContract, uint256 logTime);
    event MintInfoChanged(address indexed account, uint256 oneTimeMaxAmount, uint256 oneDayMaxAmount, uint256 oneDayUnit, uint256 logTime);
    event TransferInfoChanged(address indexed account, uint256 oneTimeMaxAmount, uint256 oneDayMaxAmount, uint256 oneDayUnit, uint256 logTime);
    event BlacklistUpdated(address indexed account, bool isBlacklist, uint256 logTime);
    event TransferByAdmin(address indexed from, address indexed to, uint256 indexed amount, address admin, uint256 logTime);
    event RecoveredByAdmin(address indexed token, address indexed receiver, uint256 amount, uint256 logTime);
    event UseWhitelistedStatusChanged(address indexed operatorAddress, bool useWhitelisted);
    event WhitelistUpdated(address indexed account, bool isWhitelist, uint256 logTime);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklist","type":"bool"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"CapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"feeType","type":"string"},{"indexed":false,"internalType":"bool","name":"_isSet","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feeCalcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_feeReceiver","type":"address"},{"indexed":false,"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"FeeInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"MintInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"RecoveredByAdmin","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":"string","name":"role","type":"string"},{"indexed":true,"internalType":"address","name":"granter","type":"address"},{"indexed":true,"internalType":"address","name":"grantee","type":"address"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"RoleChanged","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":"string","name":"cmdType","type":"string"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"afterTotalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"SupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"donor","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_revocable","type":"bool"},{"indexed":false,"internalType":"address","name":"_system","type":"address"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"TokenLock","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"TransferByAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"TransferInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operatorAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"useWhitelisted","type":"bool"}],"name":"UseWhitelistedStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelist","type":"bool"},{"indexed":false,"internalType":"uint256","name":"logTime","type":"uint256"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"burnBySystem","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":[],"name":"contractInfo","outputs":[{"internalType":"uint256","name":"BappNo","type":"uint256"},{"internalType":"string","name":"BappName","type":"string"},{"internalType":"string","name":"SCVersion","type":"string"}],"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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeInfo","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"bool","name":"isInnerLogic","type":"bool"},{"internalType":"uint256","name":"feeRatio","type":"uint256"},{"internalType":"address","name":"feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"bool","name":"isFeeReceiverContract","type":"bool"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintInfo","outputs":[{"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"currentDayAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract LockedToken[]","name":"_lockToken","type":"address[]"}],"name":"multiTokenLockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken[]","name":"_lockToken","type":"address[]"}],"name":"multiTokenLockRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"senders","type":"address[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"multiTransferFroms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"multiTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"revokeAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_account","type":"address"},{"internalType":"bool","name":"_isBlacklist","type":"bool"}],"name":"setBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bappNo","type":"uint256"},{"internalType":"string","name":"_bappName","type":"string"},{"internalType":"string","name":"_scVersion","type":"string"}],"name":"setContractInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"destroyFlag","type":"bool"}],"name":"setDestroyFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSet","type":"bool"},{"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"internalType":"address","name":"_feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"_feeReceiver","type":"address"},{"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"}],"name":"setFeeInfoForMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSet","type":"bool"},{"internalType":"bool","name":"_isInnerLogic","type":"bool"},{"internalType":"uint256","name":"_feeRatio","type":"uint256"},{"internalType":"address","name":"_feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"_feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"_feeReceiver","type":"address"},{"internalType":"bool","name":"_isFeeReceiverContract","type":"bool"}],"name":"setFeeInfoForTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayUnit","type":"uint256"}],"name":"setMintInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accountList","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setMultipleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setTotalSupplyCap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"_oneDayUnit","type":"uint256"}],"name":"setTransferInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setUseWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_donor","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_durationUnit","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"}],"name":"tokenLock","outputs":[{"internalType":"contract LockedToken","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract LockedToken","name":"_lockToken","type":"address"}],"name":"tokenLockRevoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transFeeInfo","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"bool","name":"isInnerLogic","type":"bool"},{"internalType":"uint256","name":"feeRatio","type":"uint256"},{"internalType":"address","name":"feeCalcAddress","type":"address"},{"internalType":"bytes32","name":"feeCalcCallBytes","type":"bytes32"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"bool","name":"isFeeReceiverContract","type":"bool"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferInfo","outputs":[{"internalType":"uint256","name":"oneTimeMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayMaxAmount","type":"uint256"},{"internalType":"uint256","name":"oneDayUnit","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"currentDayAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_checkTimestamp","type":"uint256"}],"name":"utilDiffTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp1","type":"uint256"},{"internalType":"uint256","name":"_timestamp2","type":"uint256"}],"name":"utilDiffTime2","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"utilUnitConvert","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"zDestroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"zRecoverTokenALLByAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"zRecoverTokenByAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"zTransferByAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

610140604052600b805460ff199081169091556023805490911690553480156200002857600080fd5b5060405162006bdd38038062006bdd8339810160408190526200004b9162000a35565b8180604051806040016040528060018152602001603160f81b8152508484816003908051906020019062000081929190620008c2565b50805162000097906004906020840190620008c2565b50506006805460ff1916905550620000af336200047d565b815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c09485019091528151919095012090529190915261012052506200014c600033620004d7565b620001787f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620004d7565b620001a47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620004d7565b620001d07f5719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f33620004d7565b620001de6012600a62000bbc565b620001f39068056bc75e2d630fffff62000bd4565b601e55620002046012600a62000bbc565b620002199068056bc75e2d630fffff62000bd4565b601f5562015180602055600d805460ff1990811690915560138054909116905560008362000265576200024f6012600a62000bbc565b6200025f906347de48f062000bd4565b62000267565b835b600981905590506200027a338262000562565b604051631352539560e21b815233906004016040519081900390207f57d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac4683620002c160025490565b604080519283526020830191909152429082015260600160405180910390a3620002ee6012600a62000bbc565b620002fd90620f424062000bd4565b601e556200030e6012600a62000bbc565b6200031d906207a12062000bd4565b601f55600060225533601e54601f546020805460408051948552918401929092528201524260608201526001600160a01b0391909116907ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d779060800160405180910390a26200038f6012600a62000bbc565b6200039e90620f424062000bd4565b601955620003af6012600a62000bbc565b620003be906207a12062000bd4565b601a5562015180601b556000601d5533601954601a54601b5460408051938452602084019290925282820152426060830152516001600160a01b0392909216917fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a9181900360800190a26103e8602455825162000443906025906020860190620008c2565b50604080518082019091526005808252640322e312e360dc1b60209092019182526200047291602691620008c2565b505050505062000c71565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004e3828262000637565b6200055e5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200051d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b038216620005be5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620005cc6000838362000664565b8060026000828254620005e0919062000bf6565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b6200066e620007c0565b826200067c60003362000637565b80620006a157506001600160a01b0381166000908152600a602052604090205460ff16155b620006fe5760405162461bcd60e51b815260206004820152602660248201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160448201526564647265737360d01b6064820152608401620005b5565b62000716848484620007bb60201b620014041760201c565b6001600160a01b03831615620007b55760006001600160a01b0385166200073f57601e62000742565b60195b8054909150831115620007a75760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b6064820152608401620005b5565b620007b381846200080a565b505b50505050565b505050565b60065460ff1615620008085760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620005b5565b565b60008260020154426200081e919062000c11565b9050808360030154146200083b5760038301819055600060048401555b60008284600401546200084f919062000bf6565b90508360010154811115620008b55760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b6064820152608401620005b5565b6004909301929092555050565b828054620008d09062000c34565b90600052602060002090601f016020900481019282620008f457600085556200093f565b82601f106200090f57805160ff19168380011785556200093f565b828001600101855582156200093f579182015b828111156200093f57825182559160200191906001019062000922565b506200094d92915062000951565b5090565b5b808211156200094d576000815560010162000952565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200099057600080fd5b81516001600160401b0380821115620009ad57620009ad62000968565b604051601f8301601f19908116603f01168101908282118183101715620009d857620009d862000968565b81604052838152602092508683858801011115620009f557600080fd5b600091505b8382101562000a195785820183015181830184015290820190620009fa565b8382111562000a2b5760008385830101525b9695505050505050565b60008060006060848603121562000a4b57600080fd5b835160208501519093506001600160401b038082111562000a6b57600080fd5b62000a79878388016200097e565b9350604086015191508082111562000a9057600080fd5b5062000a9f868287016200097e565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000b0057816000190482111562000ae45762000ae462000aa9565b8085161562000af257918102915b93841c939080029062000ac4565b509250929050565b60008262000b19575060016200065e565b8162000b28575060006200065e565b816001811462000b41576002811462000b4c5762000b6c565b60019150506200065e565b60ff84111562000b605762000b6062000aa9565b50506001821b6200065e565b5060208310610133831016604e8410600b841016171562000b91575081810a6200065e565b62000b9d838362000abf565b806000190482111562000bb45762000bb462000aa9565b029392505050565b600062000bcd60ff84168362000b08565b9392505050565b600081600019048311821515161562000bf15762000bf162000aa9565b500290565b6000821982111562000c0c5762000c0c62000aa9565b500190565b60008262000c2f57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168062000c4957607f821691505b6020821081141562000c6b57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051615f1c62000cc1600039600061300b0152600061305a0152600061303501526000612f8c01526000612fb701526000612fe20152615f1c6000f3fe60806040523480156200001157600080fd5b5060043610620003f95760003560e01c806379cc67901162000215578063b66248011162000127578063dbcc52e911620000b6578063dbcc52e91462000a6f578063dd62ed3e1462000a86578063e2814de71462000a9d578063e63ab1e91462000ab4578063f2fde38b1462000acb578063f904371b1462000ae2578063f9123b0b1462000af9578063f951a8421462000b10578063fe575a871462000b2757600080fd5b8063b662480114620009ae578063bb102aea14620009c5578063c3da8a6b14620009ce578063c96a679c14620009e5578063cc51f1bb14620009fc578063d505accf1462000a13578063d53913931462000a2a578063d547741f1462000a41578063d71770f31462000a5857600080fd5b8063a1dc12c911620001a4578063a1dc12c914620008f6578063a217fddf146200090d578063a3f2da7b1462000916578063a457c2d7146200092d578063a9059cbb1462000944578063aa8496c3146200095b578063aabfc36f1462000965578063abc8adae146200097c578063aebdcd2a146200099757600080fd5b806379cc6790146200083b5780637a9db9da14620008525780637ecebe00146200087a5780638456cb5914620008915780638bad0c0a146200089b5780638da5cb5b14620008a557806391d1485414620008be578063940fa2a714620008d557806395d89b4114620008ec57600080fd5b806336568abe116200030f57806353d6fd59116200029e57806353d6fd59146200075957806355fd58b614620007705780635c975abb146200079d5780636177e0db14620007a957806361b746c314620007c05780637048027514620007d757806370a0823114620007ee578063715018a6146200081a57806375071d2a146200082457600080fd5b806336568abe14620006a05780633950935114620006b75780633af32abf14620006ce5780633c6e8af614620006e55780633f4ba83a14620006f357806340c10f1914620006fd57806342966c6814620007145780634481c93d146200072b578063455c1182146200074257600080fd5b8063248a9ca3116200038c578063248a9ca3146200052c5780632b29105814620005525780632d34567014620005965780632eb164b814620005ad5780632f2ff15d146200060d5780632f645bf01462000626578063313ce567146200066f57806331d05b11146200067f5780633644e515146200069657600080fd5b806301ffc9a714620003fe57806306fdde03146200042a578063095ea7b31462000443578063153b0d1e146200045a57806315c43aaf146200047157806318160ddd146200048c57806319e85a24146200049f5780631ffa454d14620004fe57806323b872dd1462000515575b600080fd5b620004156200040f3660046200421a565b62000b3e565b60405190151581526020015b60405180910390f35b6200043462000b76565b604051620004219190620042a3565b6200041562000454366004620042ce565b62000c10565b620004156200046b3660046200430c565b62000c2a565b6200047b62000cb5565b60405162000421939291906200434a565b6002545b60405190815260200162000421565b600d54600e54600f54601054601154601254620004e89560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516200042198979695949392919062004383565b620004156200050f36600462004518565b62000dea565b6200041562000526366004620045a9565b62000ed4565b620004906200053d366004620045ef565b60009081526005602052604090206001015490565b601e54601f546020546021546022546200056d949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00162000421565b62000415620005a736600462004609565b62000f2e565b620005c4620005be36600462004609565b6200107c565b604080516001600160a01b0398891681529688166020880152949096169385019390935260608401919091521515608083015260a082015260c081019190915260e00162000421565b620006246200061e36600462004629565b620013db565b005b601354601454601554601654601754601854620004e89560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516012815260200162000421565b6200041562000690366004620045ef565b62001409565b620004906200146e565b62000624620006b136600462004629565b6200147f565b62000415620006c8366004620042ce565b62001501565b62000415620006df36600462004609565b62001529565b600b54620004159060ff1681565b620006246200155f565b620006246200070e366004620042ce565b62001587565b6200062462000725366004620045ef565b62001877565b620006246200073c36600462004651565b620018ee565b6200041562000753366004620042ce565b6200190b565b620004156200076a3660046200430c565b6200198b565b620007876200078136600462004671565b62001a09565b6040805192835260208301919091520162000421565b60065460ff1662000415565b62000624620007ba36600462004609565b62001aba565b62000415620007d136600462004609565b62001b12565b62000415620007e836600462004609565b62001c09565b62000490620007ff36600462004609565b6001600160a01b031660009081526020819052604090205490565b6200062462001d00565b6200049060008051602062005e4783398151915281565b620006246200084c366004620042ce565b62001d5f565b6200086962000863366004620045ef565b62001de9565b604051620004219392919062004694565b620004906200088b36600462004609565b62001e1f565b6200062462001e3e565b6200041562001e63565b620008af62001e83565b604051620004219190620046aa565b62000415620008cf36600462004629565b62001e97565b620008af620008e6366004620046be565b62001ec2565b6200043462002063565b62000415620009073660046200472c565b62002074565b62000490600081565b620006246200092736600462004759565b620020f3565b620004156200093e366004620042ce565b62002157565b6200041562000955366004620042ce565b620021d8565b6200062462002224565b6200041562000976366004620047f2565b62002285565b601954601a54601b54601c54601d546200056d949392919085565b62000415620009a836600462004881565b620023a7565b62000624620009bf36600462004759565b6200240f565b60095462000490565b62000624620009df36600462004609565b62002458565b62000415620009f6366004620048cd565b620024cc565b6200041562000a0d366004620047f2565b62002577565b6200062462000a2436600462004937565b6200263f565b6200049060008051602062005e8783398151915281565b6200062462000a5236600462004629565b620027af565b6200078762000a69366004620045ef565b620027d8565b6200062462000a80366004620042ce565b62002888565b6200049062000a97366004620049b4565b620028c7565b6200041562000aae36600462004a2b565b620028f2565b6200049060008051602062005e6783398151915281565b6200062462000adc36600462004609565b6200293f565b6200062462000af336600462004651565b62002960565b6200041562000b0a3660046200472c565b62002a40565b6200041562000b21366004620045a9565b62002ab3565b6200041562000b3836600462004609565b62002b30565b60006001600160e01b03198216637965db0b60e01b148062000b7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805462000b879062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000bb59062004aab565b801562000c065780601f1062000bda5761010080835404028352916020019162000c06565b820191906000526020600020905b81548152906001019060200180831162000be857829003601f168201915b5050505050905090565b60003362000c2081858562002b4e565b5060019392505050565b600060008051602062005e4783398151915262000c478162002c6f565b6001600160a01b0384166000818152600a6020908152604091829020805460ff1916871515908117909155825190815242918101919091527fdb76f617e04ebf72dc17dbe8376979b98408ad67557ef09c5272f7156d8123e891015b60405180910390a25060019392505050565b602480546025805491929162000ccb9062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000cf99062004aab565b801562000d4a5780601f1062000d1e5761010080835404028352916020019162000d4a565b820191906000526020600020905b81548152906001019060200180831162000d2c57829003601f168201915b50505050509080600201805462000d619062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000d8f9062004aab565b801562000de05780601f1062000db45761010080835404028352916020019162000de0565b820191906000526020600020905b81548152906001019060200180831162000dc257829003601f168201915b5050505050905083565b60008251845114801562000dff575081518351145b62000e275760405162461bcd60e51b815260040162000e1e9062004ae2565b60405180910390fd5b60005b845181101562000ec95762000e9585828151811062000e4d5762000e4d62004b2c565b602002602001015185838151811062000e6a5762000e6a62004b2c565b602002602001015185848151811062000e875762000e8762004b2c565b602002602001015162000ed4565b62000eb45760405162461bcd60e51b815260040162000e1e9062004b42565b8062000ec08162004b8a565b91505062000e2a565b506001949350505050565b600062000ee062002c7b565b8262000eec8162001529565b62000f0b5760405162461bcd60e51b815260040162000e1e9062004ba8565b62000f1885338562002cc5565b62000f2585858562002d46565b95945050505050565b60008062000f3c8162002c6f565b62000f4662001e83565b6001600160a01b0316836001600160a01b0316141562000fb45760405162461bcd60e51b815260206004820152602260248201527f424f52413a204f776e65722063616e2774207265766f6b652041646d696e526f6044820152616c6560f01b606482015260840162000e1e565b62000fcf60008051602062005e6783398151915284620027af565b62000fea60008051602062005e8783398151915284620027af565b6200100560008051602062005e4783398151915284620027af565b62001012600084620027af565b6040516a3932bb37b5b2a0b236b4b760a91b81526001600160a01b038416903390600b015b604051908190038120428252907f462b260bb7f1f6a55b13af8a2b24801cc187d85f27af3308bca5428016aa2ad79060200160405180910390a4600191505b50919050565b60008060008060008060008062001101896001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b158015620010c657600080fd5b505afa158015620010db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a69919062004bf2565b5080915050886001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200114057600080fd5b505afa15801562001155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117b919062004c0c565b896001600160a01b03166325223bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015620011b557600080fd5b505afa158015620011ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011f0919062004c0c565b8a6001600160a01b03166338af3eed6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122a57600080fd5b505afa1580156200123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001265919062004c0c565b8b6001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200129f57600080fd5b505afa158015620012b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012da919062004bf2565b8c6001600160a01b031663872a78106040518163ffffffff1660e01b815260040160206040518083038186803b1580156200131457600080fd5b505afa15801562001329573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200134f919062004c2c565b8d6001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200138957600080fd5b505afa1580156200139e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013c4919062004bf2565b949e939d50919b5099509750909550909350915050565b600082815260056020526040902060010154620013f88162002c6f565b62001404838362002ef5565b505050565b600060008051602062005e47833981519152620014268162002c6f565b60098390556040805184815242602082015233917f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f5910160405180910390a250600192915050565b60006200147a62002f7f565b905090565b6001600160a01b0381163314620014f15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840162000e1e565b620014fd8282620030a8565b5050565b60003362000c20818585620015178383620028c7565b62001523919062004c4c565b62002b4e565b600b5460009060ff16156200155757506001600160a01b03166000908152600c602052604090205460ff1690565b506001919050565b60008051602062005e678339815191526200157a8162002c6f565b6200158462003112565b50565b60008051602062005e87833981519152620015a28162002c6f565b82620015b060003362001e97565b80620015c45750620015c28162002b30565b155b620015e35760405162461bcd60e51b815260040162000e1e9062004c67565b60095483620015f160025490565b620015fd919062004c4c565b1115620016595760405162461bcd60e51b8152602060048201526024808201527f45524332304361707065643a20746f74616c537570706c7943617020657863656044820152631959195960e21b606482015260840162000e1e565b620016636200413d565b601354429060ff1662001685578482526200167f868662003162565b62001816565b60408051610100808201835260135460ff80821615158452919004811615156020830152601454928201929092526015546001600160a01b039081166060830152601654608083015260175490811660a0830152600160a01b9004909116151560c082015260185460e0820152620017009086338962003222565b91506200171286836000015162003162565b6020820151156200181657620017318260400151836020015162003162565b81604001516001600160a01b03166040516200174d9062004cad565b604051809103902060008051602062005ec783398151915284602001516200177460025490565b85604051620017869392919062004694565b60405180910390a3816060015115620018165781604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620017d957600080fd5b505af1158015620017ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001814919062004c2c565b505b856001600160a01b03166040516200182e9062004cad565b604051809103902060008051602062005ec783398151915284600001516200185560025490565b85604051620018679392919062004694565b60405180910390a3505050505050565b60008051602062005e87833981519152620018928162002c6f565b6200189d8262003346565b6040513390620018ad9062004cbd565b604051809103902060008051602062005ec783398151915284620018d060025490565b42604051620018e29392919062004694565b60405180910390a35050565b620018f862003352565b6023805460ff1916911515919091179055565b600080620019198162002c6f565b620019396200192762001e83565b6001600160a01b0386169085620033b5565b33604080518581524260208201526001600160a01b03928316928716917fca81413c83be0d2ac60c79c3d479764ee578f53cee6ab69fe49e123137679184910160405180910390a35060019392505050565b600060008051602062005e47833981519152620019a88162002c6f565b6001600160a01b0384166000818152600c6020908152604091829020805460ff1916871515908117909155825190815242918101919091527f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae45910162000ca3565b6000808383101562001a6e5760405162461bcd60e51b815260206004820152602760248201527f424f52413a205f74696d657374616d7032206973206265666f7265205f74696d604482015266657374616d703160c81b606482015260840162000e1e565b600062001a7f620151808662004ccd565b9050600062001a92620151808662004ccd565b905062001aa0828262004cf0565b62001aac878762004cf0565b9350935050505b9250929050565b806001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001af657600080fd5b505af115801562001b0b573d6000803e3d6000fd5b5050505050565b60008062001b208162002c6f565b62001ba783846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b539190620046aa565b60206040518083038186803b15801562001b6c57600080fd5b505afa15801562001b81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000753919062004bf2565b62001c005760405162461bcd60e51b815260206004820152602260248201527f424f52413a204572726f72207a5265636f766572546f6b656e427941646d696e604482015261282960f01b606482015260840162000e1e565b50600192915050565b60008062001c178162002c6f565b6001600160a01b03831662001c7b5760405162461bcd60e51b815260206004820152602360248201527f424f52413a206164642061646d696e206f6620746865207a65726f206164647260448201526265737360e81b606482015260840162000e1e565b62001c88600084620013db565b62001ca360008051602062005e6783398151915284620013db565b62001cbe60008051602062005e8783398151915284620013db565b62001cd960008051602062005e4783398151915284620013db565b6040516730b23220b236b4b760c11b81526001600160a01b03841690339060080162001037565b62001d0a62003352565b60405162461bcd60e51b815260206004820152602360248201527f424f52413a2072656e6f756e63654f776e6572736869702069732064697361626044820152621b195960ea1b606482015260840162000e1e565b60008051602062005e8783398151915262001d7a8162002c6f565b62001d8683836200340f565b604051684255524e2e46524f4d60b81b81526001600160a01b038416906009015b604051809103902060008051602062005ec78339815191528462001dca60025490565b4260405162001ddc9392919062004694565b60405180910390a3505050565b600080808362001dfe81633b9aca0062004d0a565b62001e1286670de0b6b3a764000062004d0a565b9250925092509193909250565b6001600160a01b03811660009081526007602052604081205462000b70565b60008051602062005e6783398151915262001e598162002c6f565b6200158462003428565b60008062001e718162002c6f565b62001e7c3362000f2e565b91505b5090565b60065461010090046001600160a01b031690565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600060008051602062005e4783398151915262001edf8162002c6f565b600062001eed858762004d0a565b62001ef9904262004c4c565b90506000308a8a84883060405162001f119062004170565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c001604051809103906000f08015801562001f65573d6000803e3d6000fd5b50905062001f7533828a62002d46565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03167f024f9ed25691e6727f00b4c6c166398e2c933d5bd747f9433582f71f219d41ca846001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b15801562001fef57600080fd5b505afa15801562002004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200202a919062004bf2565b60408051918252602082018890528a15159082015230606082015242608082015260a00160405180910390a49998505050505050505050565b60606004805462000b879062004aab565b600060008051602062005e47833981519152620020918162002c6f565b601e859055601f849055602083815560408051878152918201869052810184905242606082015233907ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d77906080015b60405180910390a2506001949350505050565b60008051602062005e478339815191526200210e8162002c6f565b60005b825181101562001404576200214283828151811062002134576200213462004b2c565b602002602001015162002458565b806200214e8162004b8a565b91505062002111565b60003381620021678286620028c7565b905083811015620021c95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000e1e565b62000ec9828686840362002b4e565b6000620021e462002c7b565b82620021f08162001529565b6200220f5760405162461bcd60e51b815260040162000e1e9062004ba8565b6200221c33858562002d46565b949350505050565b6200222e62003352565b60235460ff16620022825760405162461bcd60e51b815260206004820152601c60248201527f424f52413a20436865636b207468652064657374726f7920666c616700000000604482015260640162000e1e565b33ff5b600060008051602062005e47833981519152620022a28162002c6f565b611388871115620022c75760405162461bcd60e51b815260040162000e1e9062004d2c565b600d805461ffff19168a151561ff001916176101008a151502179055600e879055600f80546001600160a01b0319166001600160a01b03888116919091179091556010869055601180549186166001600160a81b031990921691909117600160a01b8515150217905542601255604051674665655472616e7360c01b81526008015b60405180910390207f0d2a3399263c99ba6a4f9d6d3adbfac6ed4fb0c99f9051245682d05e3166c7628a8a8a8a8a8a8a426040516200239098979695949392919062004383565b60405180910390a250600198975050505050505050565b600060008051602062005e47833981519152620023c48162002c6f565b60005b845181101562000ec957620023f9858281518110620023ea57620023ea62004b2c565b6020026020010151856200198b565b5080620024068162004b8a565b915050620023c7565b60005b8151811015620014fd576200244382828151811062002435576200243562004b2c565b602002602001015162001aba565b806200244f8162004b8a565b91505062002412565b60008051602062005e47833981519152620024738162002c6f565b816001600160a01b031663b6549f756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620024af57600080fd5b505af1158015620024c4573d6000803e3d6000fd5b505050505050565b60008151835114620024f25760405162461bcd60e51b815260040162000e1e9062004ae2565b60005b835181101562000c20576200254384828151811062002518576200251862004b2c565b602002602001015184838151811062002535576200253562004b2c565b6020026020010151620021d8565b620025625760405162461bcd60e51b815260040162000e1e9062004b42565b806200256e8162004b8a565b915050620024f5565b600060008051602062005e47833981519152620025948162002c6f565b611388871115620025b95760405162461bcd60e51b815260040162000e1e9062004d2c565b6013805461ffff19168a151561ff001916176101008a1515021790556014879055601580546001600160a01b0319166001600160a01b03888116919091179091556016869055601780549186166001600160a81b031990921691909117600160a01b851515021790554260185560405166119959535a5b9d60ca1b815260070162002349565b83421115620026915760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640162000e1e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888620026c28c62003468565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006200271f826200348f565b905060006200273182878787620034e0565b9050896001600160a01b0316816001600160a01b031614620027965760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640162000e1e565b620027a38a8a8a62002b4e565b50505050505050505050565b600082815260056020526040902060010154620027cc8162002c6f565b620014048383620030a8565b6000804283116200283b5760405162461bcd60e51b815260206004820152602660248201527f424f52413a20636865636b54696d65206973206265666f72652063757272656e604482015265742074696d6560d01b606482015260840162000e1e565b428360006200284e620151808462004ccd565b9050600062002861620151808462004ccd565b90506200286f828262004cf0565b6200287b858562004cf0565b9550955050505050915091565b60008051602062005e47833981519152620028a38162002c6f565b620028af83836200350c565b826001600160a01b031660405162001da79062004cbd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600060008051602062005e478339815191526200290f8162002c6f565b602487905562002922602587876200417e565b5062002931602685856200417e565b506001979650505050505050565b6200294962003352565b620029548162001c09565b5062001584816200363f565b60008051602062005e478339815191526200297b8162002c6f565b600b5460ff1615158215151415620029ef5760405162461bcd60e51b815260206004820152603060248201527f424f52413a2053746174757320697320616c72656164792073657420746f207460448201526f6865206465736972656420737461746560801b606482015260840162000e1e565b600b805483151560ff1990911681179091556040805160ff909216151582525133917f6a86c4141333b7d70b3318fe955888876e95dc7fc9c7625c95b48107a79ccd2c919081900360200190a25050565b600060008051602062005e4783398151915262002a5d8162002c6f565b6019859055601a849055601b839055604080518681526020810186905290810184905242606082015233907fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a90608001620020e0565b60008062002ac18162002c6f565b62002ace858585620036bb565b82846001600160a01b0316866001600160a01b03167fe48cca0c9e2ad7911c80a4f7cc507e91e7acd69dae400e5cb4a70dc326d19bcf62002b0c3390565b4260405162002b1d92919062004d71565b60405180910390a4506001949350505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b6001600160a01b03831662002bb25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000e1e565b6001600160a01b03821662002c155760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000e1e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910162001ddc565b62001584813362003862565b60065460ff161562002cc35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000e1e565b565b600062002cd38484620028c7565b9050600019811462002d40578181101562002d315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000e1e565b62002d40848484840362002b4e565b50505050565b600062002d5262002c7b565b600d5460ff1662002d705762002d6a848484620036bb565b62000c20565b604080516101008082018352600d5460ff80821615158452919004811615156020830152600e5492820192909252600f546001600160a01b039081166060830152601054608083015260115490811660a0830152600160a01b9004909116151560c082015260125460e082015260009062002dee9084878762003222565b905062002e0185858360000151620036bb565b60208101511562000ec95762002e218582604001518360200151620036bb565b80606001511562000ec95780604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562002e6c57600080fd5b505af115801562002e81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ea7919062004c2c565b62000ec95760405162461bcd60e51b815260206004820152601f60248201527f424f52413a206661696c656420746f2064697374726962757465206665657300604482015260640162000e1e565b62002f01828262001e97565b620014fd5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905562002f3b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801562002fd957507f000000000000000000000000000000000000000000000000000000000000000046145b156200300457507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b620030b4828262001e97565b15620014fd5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6200311c620038c6565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051620031589190620046aa565b60405180910390a1565b6001600160a01b038216620031ba5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000e1e565b620031c86000838362003911565b8060026000828254620031dc919062004c4c565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602062005ea7833981519152910160405180910390a35050565b6200322c6200413d565b8451156200333b578460200151156200327b576200324f848660400151620039f9565b6020830152815260a08501516001600160a01b0316604082015260c0850151151560608201526200221c565b606085015160808601516040516341c7c70d60e11b8152600481018790526001600160a01b0386811660248301528581166044830152606482019290925291169063838f8e1a9060840160806040518083038186803b158015620032de57600080fd5b505afa158015620032f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003319919062004d8a565b151560608501526001600160a01b03166040840152602083015281526200221c565b838152949350505050565b6200158433826200350c565b336200335d62001e83565b6001600160a01b03161462002cc35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000e1e565b620014048363a9059cbb60e01b8484604051602401620033d792919062004d71565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003a34565b6200341c82338362002cc5565b620014fd82826200350c565b6200343262002c7b565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620031493390565b6001600160a01b038116600090815260076020526040902080546001810182559062001076565b600062000b706200349f62002f7f565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000620034f38787878762003b0d565b91509150620035028162003bcc565b5095945050505050565b6001600160a01b0382166200356e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840162000e1e565b6200357c8260008362003911565b6001600160a01b03821660009081526020819052604090205481811015620035f25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840162000e1e565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602062005ea7833981519152910160405180910390a3505050565b6200364962003352565b6001600160a01b038116620036b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000e1e565b620015848162003d28565b6001600160a01b038316620037215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000e1e565b6001600160a01b038216620037855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000e1e565b6200379283838362003911565b6001600160a01b038316600090815260208190526040902054818110156200380c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000e1e565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602062005ea7833981519152910160405180910390a362002d40565b6200386e828262001e97565b620014fd576200387e8162003d82565b6200388b83602062003d95565b6040516020016200389e92919062004dda565b60408051601f198184030181529082905262461bcd60e51b825262000e1e91600401620042a3565b60065460ff1662002cc35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640162000e1e565b6200391b62002c7b565b826200392960003362001e97565b806200393d57506200393b8162002b30565b155b6200395c5760405162461bcd60e51b815260040162000e1e9062004c67565b6001600160a01b0383161562002d405760006001600160a01b0385166200398557601e62003988565b60195b8054909150831115620039ed5760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b606482015260840162000e1e565b62001b0b818462003f55565b6000808061271062003a0c858762004d0a565b62003a18919062004ccd565b9050600062003a28828762004cf0565b96919550909350505050565b600062003a8b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200400d9092919063ffffffff16565b80519091501562001404578080602001905181019062003aac919062004c2c565b620014045760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000e1e565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111562003b3c575060009050600362003bc3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562003b91573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662003bbc5760006001925092505062003bc3565b9150600090505b94509492505050565b600081600481111562003be35762003be362004e4d565b141562003bed5750565b600181600481111562003c045762003c0462004e4d565b141562003c4f5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640162000e1e565b600281600481111562003c665762003c6662004e4d565b141562003cb65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000e1e565b600381600481111562003ccd5762003ccd62004e4d565b1415620015845760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000e1e565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606062000b706001600160a01b03831660145b6060600062003da683600262004d0a565b62003db390600262004c4c565b6001600160401b0381111562003dcd5762003dcd620043c9565b6040519080825280601f01601f19166020018201604052801562003df8576020820181803683370190505b509050600360fc1b8160008151811062003e165762003e1662004b2c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062003e485762003e4862004b2c565b60200101906001600160f81b031916908160001a905350600062003e6e84600262004d0a565b62003e7b90600162004c4c565b90505b600181111562003efd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062003eb35762003eb362004b2c565b1a60f81b82828151811062003ecc5762003ecc62004b2c565b60200101906001600160f81b031916908160001a90535060049490941c9362003ef58162004e63565b905062003e7e565b50831562003f4e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000e1e565b9392505050565b600082600201544262003f69919062004ccd565b90508083600301541462003f865760038301819055600060048401555b600082846004015462003f9a919062004c4c565b90508360010154811115620040005760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b606482015260840162000e1e565b6004909301929092555050565b60606200221c848460008585600080866001600160a01b0316858760405162004037919062004e7d565b60006040518083038185875af1925050503d806000811462004076576040519150601f19603f3d011682016040523d82523d6000602084013e6200407b565b606091505b50915091506200408e8783838762004099565b979650505050505050565b606083156200410a57825162004102576001600160a01b0385163b620041025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000e1e565b50816200221c565b6200221c8383815115620041215781518083602001fd5b8060405162461bcd60e51b815260040162000e1e9190620042a3565b6040518060800160405280600081526020016000815260200160006001600160a01b031681526020016000151581525090565b610fab8062004e9c83390190565b8280546200418c9062004aab565b90600052602060002090601f016020900481019282620041b05760008555620041fb565b82601f10620041cb5782800160ff19823516178555620041fb565b82800160010185558215620041fb579182015b82811115620041fb578235825591602001919060010190620041de565b5062001e7f9291505b8082111562001e7f576000815560010162004204565b6000602082840312156200422d57600080fd5b81356001600160e01b03198116811462003f4e57600080fd5b60005b838110156200426357818101518382015260200162004249565b8381111562002d405750506000910152565b600081518084526200428f81602086016020860162004246565b601f01601f19169290920160200192915050565b60208152600062003f4e602083018462004275565b6001600160a01b03811681146200158457600080fd5b60008060408385031215620042e257600080fd5b8235620042ef81620042b8565b946020939093013593505050565b80151581146200158457600080fd5b600080604083850312156200432057600080fd5b82356200432d81620042b8565b915060208301356200433f81620042fd565b809150509250929050565b83815260606020820152600062004365606083018562004275565b828103604084015262004379818562004275565b9695505050505050565b9715158852951515602088015260408701949094526001600160a01b03928316606087015260808601919091521660a0840152151560c083015260e08201526101000190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200440a576200440a620043c9565b604052919050565b60006001600160401b038211156200442e576200442e620043c9565b5060051b60200190565b600082601f8301126200444a57600080fd5b81356020620044636200445d8362004412565b620043df565b82815260059290921b840181019181810190868411156200448357600080fd5b8286015b84811015620044ab5780356200449d81620042b8565b835291830191830162004487565b509695505050505050565b600082601f830112620044c857600080fd5b81356020620044db6200445d8362004412565b82815260059290921b84018101918181019086841115620044fb57600080fd5b8286015b84811015620044ab5780358352918301918301620044ff565b6000806000606084860312156200452e57600080fd5b83356001600160401b03808211156200454657600080fd5b620045548783880162004438565b945060208601359150808211156200456b57600080fd5b620045798783880162004438565b935060408601359150808211156200459057600080fd5b506200459f86828701620044b6565b9150509250925092565b600080600060608486031215620045bf57600080fd5b8335620045cc81620042b8565b92506020840135620045de81620042b8565b929592945050506040919091013590565b6000602082840312156200460257600080fd5b5035919050565b6000602082840312156200461c57600080fd5b813562003f4e81620042b8565b600080604083850312156200463d57600080fd5b8235915060208301356200433f81620042b8565b6000602082840312156200466457600080fd5b813562003f4e81620042fd565b600080604083850312156200468557600080fd5b50508035926020909101359150565b9283526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b60008060008060008060c08789031215620046d857600080fd5b8635620046e581620042b8565b95506020870135620046f781620042b8565b945060408701359350606087013592506080870135915060a08701356200471e81620042fd565b809150509295509295509295565b6000806000606084860312156200474257600080fd5b505081359360208301359350604090920135919050565b600060208083850312156200476d57600080fd5b82356001600160401b038111156200478457600080fd5b8301601f810185136200479657600080fd5b8035620047a76200445d8262004412565b81815260059190911b82018301908381019087831115620047c757600080fd5b928401925b828410156200408e578335620047e281620042b8565b82529284019290840190620047cc565b600080600080600080600060e0888a0312156200480e57600080fd5b87356200481b81620042fd565b965060208801356200482d81620042fd565b95506040880135945060608801356200484681620042b8565b93506080880135925060a08801356200485f81620042b8565b915060c08801356200487181620042fd565b8091505092959891949750929550565b600080604083850312156200489557600080fd5b82356001600160401b03811115620048ac57600080fd5b620048ba8582860162004438565b92505060208301356200433f81620042fd565b60008060408385031215620048e157600080fd5b82356001600160401b0380821115620048f957600080fd5b620049078683870162004438565b935060208501359150808211156200491e57600080fd5b506200492d85828601620044b6565b9150509250929050565b600080600080600080600060e0888a0312156200495357600080fd5b87356200496081620042b8565b965060208801356200497281620042b8565b95506040880135945060608801359350608088013560ff811681146200499757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215620049c857600080fd5b8235620049d581620042b8565b915060208301356200433f81620042b8565b60008083601f840112620049fa57600080fd5b5081356001600160401b0381111562004a1257600080fd5b60208301915083602082850101111562001ab357600080fd5b60008060008060006060868803121562004a4457600080fd5b8535945060208601356001600160401b038082111562004a6357600080fd5b62004a7189838a01620049e7565b9096509450604088013591508082111562004a8b57600080fd5b5062004a9a88828901620049e7565b969995985093965092949392505050565b600181811c9082168062004ac057607f821691505b602082108114156200107657634e487b7160e01b600052602260045260246000fd5b6020808252602a908201527f424f52413a20496e70757420617272617973206d7573742062652074686520736040820152690c2daca40d8cadccee8d60b31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252601890820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060001982141562004ba15762004ba162004b74565b5060010190565b6020808252602a908201527f424f52413a2041646472657373206973206e6f7420612077686974656c6973746040820152696564206164647265737360b01b606082015260800190565b60006020828403121562004c0557600080fd5b5051919050565b60006020828403121562004c1f57600080fd5b815162003f4e81620042b8565b60006020828403121562004c3f57600080fd5b815162003f4e81620042fd565b6000821982111562004c625762004c6262004b74565b500190565b60208082526026908201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160408201526564647265737360d01b606082015260800190565b631352539560e21b815260040190565b63212aa92760e11b815260040190565b60008262004ceb57634e487b7160e01b600052601260045260246000fd5b500490565b60008282101562004d055762004d0562004b74565b500390565b600081600019048311821515161562004d275762004d2762004b74565b500290565b60208082526025908201527f424f52413a20436865636b20612066656520726174696f2028307e353030302c604082015264203530252960d81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b6000806000806080858703121562004da157600080fd5b8451935060208501519250604085015162004dbc81620042b8565b606086015190925062004dcf81620042fd565b939692955090935050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81526000835162004e0e81601785016020880162004246565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162004e4181602884016020880162004246565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60008162004e755762004e7562004b74565b506000190190565b6000825162004e9181846020870162004246565b919091019291505056fe6101206040523480156200001257600080fd5b5060405162000fab38038062000fab83398101604081905262000035916200022b565b6001600160a01b0385166200009c5760405162461bcd60e51b815260206004820152602260248201527f4c6f636b6564546f6b656e3a20646f6e6f72206973207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b038416620001055760405162461bcd60e51b815260206004820152602860248201527f4c6f636b6564546f6b656e3a2062656e6566696369617279206973207a65726f604482015267206164647265737360c01b606482015260840162000093565b6001600160a01b038116620001695760405162461bcd60e51b815260206004820152602360248201527f4c6f636b6564546f6b656e3a2073797374656d206973207a65726f206164647260448201526265737360e81b606482015260840162000093565b428311620001d35760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2072656c656173652074696d652069732062656660448201526f6f72652063757272656e742074696d6560801b606482015260840162000093565b600080546001600160a01b0319166001600160a01b0397881617905593851660805291841660a05260c052151560e0521661010052620002a9565b80516001600160a01b03811681146200022657600080fd5b919050565b60008060008060008060c087890312156200024557600080fd5b62000250876200020e565b955062000260602088016200020e565b945062000270604088016200020e565b935060608701519250608087015180151581146200028d57600080fd5b91506200029d60a088016200020e565b90509295509295509295565b60805160a05160c05160e05161010051610c5d6200034e600039600081816101970152818161054101526106a4015260008181610160015281816104a401526105ee0152600081816101c6015281816101fb015281816103ca015261048201526000818160d50152818161036c0152818161039f015261046001526000818160980152818161043e015281816106720152818161080901526108510152610c5d6000f3fe608060405234801561001057600080fd5b506004361061008e5760003560e01c806325223bd41461009357806338af3eed146100d05780634e71d92d146100f75780635a9b0b8914610101578063722713f714610145578063872a78101461015b57806395bf75fd14610192578063b6549f75146101b9578063b91d4001146101c1578063fc0c546a146101e8575b600080fd5b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100c79190610b39565b60405180910390f35b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6100ff6101f9565b005b610109610421565b604080516001600160a01b03978816815295871660208701528501939093529015156060840152608083015290911660a082015260c0016100c7565b61014d610566565b6040519081526020016100c7565b6101827f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016100c7565b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6100ff6105ec565b61014d7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03166100ba565b7f00000000000000000000000000000000000000000000000000000000000000004210156102875760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2063757272656e742074696d652069732062656660448201526f6f72652072656c656173652074696d6560801b60648201526084015b60405180910390fd5b600080546040516370a0823160e01b81526001600160a01b03909116906370a08231906102b8903090600401610b39565b60206040518083038186803b1580156102d057600080fd5b505afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103089190610b4d565b90506000811161035a5760405162461bcd60e51b815260206004820152601f60248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f20636c61696d00604482015260640161027e565b600054610391906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008361087f565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7906060015b60405180910390a150565b600080546040516370a0823160e01b8152829182918291829182917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316906370a08231906104e2903090600401610b39565b60206040518083038186803b1580156104fa57600080fd5b505afa15801561050e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105329190610b4d565b939a92995090975095509093507f000000000000000000000000000000000000000000000000000000000000000092509050565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610597903090600401610b39565b60206040518083038186803b1580156105af57600080fd5b505afa1580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e79190610b4d565b905090565b7f00000000000000000000000000000000000000000000000000000000000000006106675760405162461bcd60e51b815260206004820152602560248201527f4c6f636b6564546f6b656e3a20746f6b656e7320617265206e6f74207265766f6044820152646361626c6560d81b606482015260840161027e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806106c65750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6107245760405162461bcd60e51b815260206004820152602960248201527f4c6f636b6564546f6b656e3a206f6e6c7920646f6e6f727c73797374656d2063604482015268616e207265766f6b6560b81b606482015260840161027e565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610755903090600401610b39565b60206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a59190610b4d565b9050600081116107f75760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f207265766f6b65604482015260640161027e565b60005461082e906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008361087f565b7fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b7f000000000000000000000000000000000000000000000000000000000000000082604051610416929190610b66565b6108d58363a9059cbb60e01b848460405160240161089e929190610b66565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526108da565b505050565b600061092f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166109ac9092919063ffffffff16565b8051909150156108d5578080602001905181019061094d9190610b7f565b6108d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161027e565b60606109bb84846000856109c3565b949350505050565b606082471015610a245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161027e565b600080866001600160a01b03168587604051610a409190610bd8565b60006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b5091509150610a9387838387610a9e565b979650505050505050565b60608315610b0a578251610b03576001600160a01b0385163b610b035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161027e565b50816109bb565b6109bb8383815115610b1f5781518083602001fd5b8060405162461bcd60e51b815260040161027e9190610bf4565b6001600160a01b0391909116815260200190565b600060208284031215610b5f57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610b9157600080fd5b81518015158114610ba157600080fd5b9392505050565b60005b83811015610bc3578181015183820152602001610bab565b83811115610bd2576000848401525b50505050565b60008251610bea818460208701610ba8565b9190910192915050565b6020815260008251806020840152610c13816040850160208701610ba8565b601f01601f1916919091016040019291505056fea2646970667358221220f2b80a15b364789fb7f50c933467ceba01e4d0efa87bac8c4a2651d08cb93dc764736f6c634300080900335719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef57d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac46a264697066735822122008604fa074d2590e5530159ca81959bf22622f4d69ab8fdf5f6cd7174bb8595064736f6c634300080900330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000570424f5241000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000570424f5241000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620003f95760003560e01c806379cc67901162000215578063b66248011162000127578063dbcc52e911620000b6578063dbcc52e91462000a6f578063dd62ed3e1462000a86578063e2814de71462000a9d578063e63ab1e91462000ab4578063f2fde38b1462000acb578063f904371b1462000ae2578063f9123b0b1462000af9578063f951a8421462000b10578063fe575a871462000b2757600080fd5b8063b662480114620009ae578063bb102aea14620009c5578063c3da8a6b14620009ce578063c96a679c14620009e5578063cc51f1bb14620009fc578063d505accf1462000a13578063d53913931462000a2a578063d547741f1462000a41578063d71770f31462000a5857600080fd5b8063a1dc12c911620001a4578063a1dc12c914620008f6578063a217fddf146200090d578063a3f2da7b1462000916578063a457c2d7146200092d578063a9059cbb1462000944578063aa8496c3146200095b578063aabfc36f1462000965578063abc8adae146200097c578063aebdcd2a146200099757600080fd5b806379cc6790146200083b5780637a9db9da14620008525780637ecebe00146200087a5780638456cb5914620008915780638bad0c0a146200089b5780638da5cb5b14620008a557806391d1485414620008be578063940fa2a714620008d557806395d89b4114620008ec57600080fd5b806336568abe116200030f57806353d6fd59116200029e57806353d6fd59146200075957806355fd58b614620007705780635c975abb146200079d5780636177e0db14620007a957806361b746c314620007c05780637048027514620007d757806370a0823114620007ee578063715018a6146200081a57806375071d2a146200082457600080fd5b806336568abe14620006a05780633950935114620006b75780633af32abf14620006ce5780633c6e8af614620006e55780633f4ba83a14620006f357806340c10f1914620006fd57806342966c6814620007145780634481c93d146200072b578063455c1182146200074257600080fd5b8063248a9ca3116200038c578063248a9ca3146200052c5780632b29105814620005525780632d34567014620005965780632eb164b814620005ad5780632f2ff15d146200060d5780632f645bf01462000626578063313ce567146200066f57806331d05b11146200067f5780633644e515146200069657600080fd5b806301ffc9a714620003fe57806306fdde03146200042a578063095ea7b31462000443578063153b0d1e146200045a57806315c43aaf146200047157806318160ddd146200048c57806319e85a24146200049f5780631ffa454d14620004fe57806323b872dd1462000515575b600080fd5b620004156200040f3660046200421a565b62000b3e565b60405190151581526020015b60405180910390f35b6200043462000b76565b604051620004219190620042a3565b6200041562000454366004620042ce565b62000c10565b620004156200046b3660046200430c565b62000c2a565b6200047b62000cb5565b60405162000421939291906200434a565b6002545b60405190815260200162000421565b600d54600e54600f54601054601154601254620004e89560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516200042198979695949392919062004383565b620004156200050f36600462004518565b62000dea565b6200041562000526366004620045a9565b62000ed4565b620004906200053d366004620045ef565b60009081526005602052604090206001015490565b601e54601f546020546021546022546200056d949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00162000421565b62000415620005a736600462004609565b62000f2e565b620005c4620005be36600462004609565b6200107c565b604080516001600160a01b0398891681529688166020880152949096169385019390935260608401919091521515608083015260a082015260c081019190915260e00162000421565b620006246200061e36600462004629565b620013db565b005b601354601454601554601654601754601854620004e89560ff8082169661010090920481169591946001600160a01b0392831694909392811692600160a01b9091049091169088565b6040516012815260200162000421565b6200041562000690366004620045ef565b62001409565b620004906200146e565b62000624620006b136600462004629565b6200147f565b62000415620006c8366004620042ce565b62001501565b62000415620006df36600462004609565b62001529565b600b54620004159060ff1681565b620006246200155f565b620006246200070e366004620042ce565b62001587565b6200062462000725366004620045ef565b62001877565b620006246200073c36600462004651565b620018ee565b6200041562000753366004620042ce565b6200190b565b620004156200076a3660046200430c565b6200198b565b620007876200078136600462004671565b62001a09565b6040805192835260208301919091520162000421565b60065460ff1662000415565b62000624620007ba36600462004609565b62001aba565b62000415620007d136600462004609565b62001b12565b62000415620007e836600462004609565b62001c09565b62000490620007ff36600462004609565b6001600160a01b031660009081526020819052604090205490565b6200062462001d00565b6200049060008051602062005e4783398151915281565b620006246200084c366004620042ce565b62001d5f565b6200086962000863366004620045ef565b62001de9565b604051620004219392919062004694565b620004906200088b36600462004609565b62001e1f565b6200062462001e3e565b6200041562001e63565b620008af62001e83565b604051620004219190620046aa565b62000415620008cf36600462004629565b62001e97565b620008af620008e6366004620046be565b62001ec2565b6200043462002063565b62000415620009073660046200472c565b62002074565b62000490600081565b620006246200092736600462004759565b620020f3565b620004156200093e366004620042ce565b62002157565b6200041562000955366004620042ce565b620021d8565b6200062462002224565b6200041562000976366004620047f2565b62002285565b601954601a54601b54601c54601d546200056d949392919085565b62000415620009a836600462004881565b620023a7565b62000624620009bf36600462004759565b6200240f565b60095462000490565b62000624620009df36600462004609565b62002458565b62000415620009f6366004620048cd565b620024cc565b6200041562000a0d366004620047f2565b62002577565b6200062462000a2436600462004937565b6200263f565b6200049060008051602062005e8783398151915281565b6200062462000a5236600462004629565b620027af565b6200078762000a69366004620045ef565b620027d8565b6200062462000a80366004620042ce565b62002888565b6200049062000a97366004620049b4565b620028c7565b6200041562000aae36600462004a2b565b620028f2565b6200049060008051602062005e6783398151915281565b6200062462000adc36600462004609565b6200293f565b6200062462000af336600462004651565b62002960565b6200041562000b0a3660046200472c565b62002a40565b6200041562000b21366004620045a9565b62002ab3565b6200041562000b3836600462004609565b62002b30565b60006001600160e01b03198216637965db0b60e01b148062000b7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805462000b879062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000bb59062004aab565b801562000c065780601f1062000bda5761010080835404028352916020019162000c06565b820191906000526020600020905b81548152906001019060200180831162000be857829003601f168201915b5050505050905090565b60003362000c2081858562002b4e565b5060019392505050565b600060008051602062005e4783398151915262000c478162002c6f565b6001600160a01b0384166000818152600a6020908152604091829020805460ff1916871515908117909155825190815242918101919091527fdb76f617e04ebf72dc17dbe8376979b98408ad67557ef09c5272f7156d8123e891015b60405180910390a25060019392505050565b602480546025805491929162000ccb9062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000cf99062004aab565b801562000d4a5780601f1062000d1e5761010080835404028352916020019162000d4a565b820191906000526020600020905b81548152906001019060200180831162000d2c57829003601f168201915b50505050509080600201805462000d619062004aab565b80601f016020809104026020016040519081016040528092919081815260200182805462000d8f9062004aab565b801562000de05780601f1062000db45761010080835404028352916020019162000de0565b820191906000526020600020905b81548152906001019060200180831162000dc257829003601f168201915b5050505050905083565b60008251845114801562000dff575081518351145b62000e275760405162461bcd60e51b815260040162000e1e9062004ae2565b60405180910390fd5b60005b845181101562000ec95762000e9585828151811062000e4d5762000e4d62004b2c565b602002602001015185838151811062000e6a5762000e6a62004b2c565b602002602001015185848151811062000e875762000e8762004b2c565b602002602001015162000ed4565b62000eb45760405162461bcd60e51b815260040162000e1e9062004b42565b8062000ec08162004b8a565b91505062000e2a565b506001949350505050565b600062000ee062002c7b565b8262000eec8162001529565b62000f0b5760405162461bcd60e51b815260040162000e1e9062004ba8565b62000f1885338562002cc5565b62000f2585858562002d46565b95945050505050565b60008062000f3c8162002c6f565b62000f4662001e83565b6001600160a01b0316836001600160a01b0316141562000fb45760405162461bcd60e51b815260206004820152602260248201527f424f52413a204f776e65722063616e2774207265766f6b652041646d696e526f6044820152616c6560f01b606482015260840162000e1e565b62000fcf60008051602062005e6783398151915284620027af565b62000fea60008051602062005e8783398151915284620027af565b6200100560008051602062005e4783398151915284620027af565b62001012600084620027af565b6040516a3932bb37b5b2a0b236b4b760a91b81526001600160a01b038416903390600b015b604051908190038120428252907f462b260bb7f1f6a55b13af8a2b24801cc187d85f27af3308bca5428016aa2ad79060200160405180910390a4600191505b50919050565b60008060008060008060008062001101896001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b158015620010c657600080fd5b505afa158015620010db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a69919062004bf2565b5080915050886001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200114057600080fd5b505afa15801562001155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117b919062004c0c565b896001600160a01b03166325223bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015620011b557600080fd5b505afa158015620011ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011f0919062004c0c565b8a6001600160a01b03166338af3eed6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122a57600080fd5b505afa1580156200123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001265919062004c0c565b8b6001600160a01b031663b91d40016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200129f57600080fd5b505afa158015620012b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012da919062004bf2565b8c6001600160a01b031663872a78106040518163ffffffff1660e01b815260040160206040518083038186803b1580156200131457600080fd5b505afa15801562001329573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200134f919062004c2c565b8d6001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200138957600080fd5b505afa1580156200139e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013c4919062004bf2565b949e939d50919b5099509750909550909350915050565b600082815260056020526040902060010154620013f88162002c6f565b62001404838362002ef5565b505050565b600060008051602062005e47833981519152620014268162002c6f565b60098390556040805184815242602082015233917f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f5910160405180910390a250600192915050565b60006200147a62002f7f565b905090565b6001600160a01b0381163314620014f15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840162000e1e565b620014fd8282620030a8565b5050565b60003362000c20818585620015178383620028c7565b62001523919062004c4c565b62002b4e565b600b5460009060ff16156200155757506001600160a01b03166000908152600c602052604090205460ff1690565b506001919050565b60008051602062005e678339815191526200157a8162002c6f565b6200158462003112565b50565b60008051602062005e87833981519152620015a28162002c6f565b82620015b060003362001e97565b80620015c45750620015c28162002b30565b155b620015e35760405162461bcd60e51b815260040162000e1e9062004c67565b60095483620015f160025490565b620015fd919062004c4c565b1115620016595760405162461bcd60e51b8152602060048201526024808201527f45524332304361707065643a20746f74616c537570706c7943617020657863656044820152631959195960e21b606482015260840162000e1e565b620016636200413d565b601354429060ff1662001685578482526200167f868662003162565b62001816565b60408051610100808201835260135460ff80821615158452919004811615156020830152601454928201929092526015546001600160a01b039081166060830152601654608083015260175490811660a0830152600160a01b9004909116151560c082015260185460e0820152620017009086338962003222565b91506200171286836000015162003162565b6020820151156200181657620017318260400151836020015162003162565b81604001516001600160a01b03166040516200174d9062004cad565b604051809103902060008051602062005ec783398151915284602001516200177460025490565b85604051620017869392919062004694565b60405180910390a3816060015115620018165781604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620017d957600080fd5b505af1158015620017ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001814919062004c2c565b505b856001600160a01b03166040516200182e9062004cad565b604051809103902060008051602062005ec783398151915284600001516200185560025490565b85604051620018679392919062004694565b60405180910390a3505050505050565b60008051602062005e87833981519152620018928162002c6f565b6200189d8262003346565b6040513390620018ad9062004cbd565b604051809103902060008051602062005ec783398151915284620018d060025490565b42604051620018e29392919062004694565b60405180910390a35050565b620018f862003352565b6023805460ff1916911515919091179055565b600080620019198162002c6f565b620019396200192762001e83565b6001600160a01b0386169085620033b5565b33604080518581524260208201526001600160a01b03928316928716917fca81413c83be0d2ac60c79c3d479764ee578f53cee6ab69fe49e123137679184910160405180910390a35060019392505050565b600060008051602062005e47833981519152620019a88162002c6f565b6001600160a01b0384166000818152600c6020908152604091829020805460ff1916871515908117909155825190815242918101919091527f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae45910162000ca3565b6000808383101562001a6e5760405162461bcd60e51b815260206004820152602760248201527f424f52413a205f74696d657374616d7032206973206265666f7265205f74696d604482015266657374616d703160c81b606482015260840162000e1e565b600062001a7f620151808662004ccd565b9050600062001a92620151808662004ccd565b905062001aa0828262004cf0565b62001aac878762004cf0565b9350935050505b9250929050565b806001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001af657600080fd5b505af115801562001b0b573d6000803e3d6000fd5b5050505050565b60008062001b208162002c6f565b62001ba783846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b539190620046aa565b60206040518083038186803b15801562001b6c57600080fd5b505afa15801562001b81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000753919062004bf2565b62001c005760405162461bcd60e51b815260206004820152602260248201527f424f52413a204572726f72207a5265636f766572546f6b656e427941646d696e604482015261282960f01b606482015260840162000e1e565b50600192915050565b60008062001c178162002c6f565b6001600160a01b03831662001c7b5760405162461bcd60e51b815260206004820152602360248201527f424f52413a206164642061646d696e206f6620746865207a65726f206164647260448201526265737360e81b606482015260840162000e1e565b62001c88600084620013db565b62001ca360008051602062005e6783398151915284620013db565b62001cbe60008051602062005e8783398151915284620013db565b62001cd960008051602062005e4783398151915284620013db565b6040516730b23220b236b4b760c11b81526001600160a01b03841690339060080162001037565b62001d0a62003352565b60405162461bcd60e51b815260206004820152602360248201527f424f52413a2072656e6f756e63654f776e6572736869702069732064697361626044820152621b195960ea1b606482015260840162000e1e565b60008051602062005e8783398151915262001d7a8162002c6f565b62001d8683836200340f565b604051684255524e2e46524f4d60b81b81526001600160a01b038416906009015b604051809103902060008051602062005ec78339815191528462001dca60025490565b4260405162001ddc9392919062004694565b60405180910390a3505050565b600080808362001dfe81633b9aca0062004d0a565b62001e1286670de0b6b3a764000062004d0a565b9250925092509193909250565b6001600160a01b03811660009081526007602052604081205462000b70565b60008051602062005e6783398151915262001e598162002c6f565b6200158462003428565b60008062001e718162002c6f565b62001e7c3362000f2e565b91505b5090565b60065461010090046001600160a01b031690565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600060008051602062005e4783398151915262001edf8162002c6f565b600062001eed858762004d0a565b62001ef9904262004c4c565b90506000308a8a84883060405162001f119062004170565b6001600160a01b0396871681529486166020860152928516604085015260608401919091521515608083015290911660a082015260c001604051809103906000f08015801562001f65573d6000803e3d6000fd5b50905062001f7533828a62002d46565b50886001600160a01b03168a6001600160a01b0316826001600160a01b03167f024f9ed25691e6727f00b4c6c166398e2c933d5bd747f9433582f71f219d41ca846001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b15801562001fef57600080fd5b505afa15801562002004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200202a919062004bf2565b60408051918252602082018890528a15159082015230606082015242608082015260a00160405180910390a49998505050505050505050565b60606004805462000b879062004aab565b600060008051602062005e47833981519152620020918162002c6f565b601e859055601f849055602083815560408051878152918201869052810184905242606082015233907ffb4739cbf78270c890b5ad2f418812e621fd0063a955081e78f87e50ecb65d77906080015b60405180910390a2506001949350505050565b60008051602062005e478339815191526200210e8162002c6f565b60005b825181101562001404576200214283828151811062002134576200213462004b2c565b602002602001015162002458565b806200214e8162004b8a565b91505062002111565b60003381620021678286620028c7565b905083811015620021c95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000e1e565b62000ec9828686840362002b4e565b6000620021e462002c7b565b82620021f08162001529565b6200220f5760405162461bcd60e51b815260040162000e1e9062004ba8565b6200221c33858562002d46565b949350505050565b6200222e62003352565b60235460ff16620022825760405162461bcd60e51b815260206004820152601c60248201527f424f52413a20436865636b207468652064657374726f7920666c616700000000604482015260640162000e1e565b33ff5b600060008051602062005e47833981519152620022a28162002c6f565b611388871115620022c75760405162461bcd60e51b815260040162000e1e9062004d2c565b600d805461ffff19168a151561ff001916176101008a151502179055600e879055600f80546001600160a01b0319166001600160a01b03888116919091179091556010869055601180549186166001600160a81b031990921691909117600160a01b8515150217905542601255604051674665655472616e7360c01b81526008015b60405180910390207f0d2a3399263c99ba6a4f9d6d3adbfac6ed4fb0c99f9051245682d05e3166c7628a8a8a8a8a8a8a426040516200239098979695949392919062004383565b60405180910390a250600198975050505050505050565b600060008051602062005e47833981519152620023c48162002c6f565b60005b845181101562000ec957620023f9858281518110620023ea57620023ea62004b2c565b6020026020010151856200198b565b5080620024068162004b8a565b915050620023c7565b60005b8151811015620014fd576200244382828151811062002435576200243562004b2c565b602002602001015162001aba565b806200244f8162004b8a565b91505062002412565b60008051602062005e47833981519152620024738162002c6f565b816001600160a01b031663b6549f756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620024af57600080fd5b505af1158015620024c4573d6000803e3d6000fd5b505050505050565b60008151835114620024f25760405162461bcd60e51b815260040162000e1e9062004ae2565b60005b835181101562000c20576200254384828151811062002518576200251862004b2c565b602002602001015184838151811062002535576200253562004b2c565b6020026020010151620021d8565b620025625760405162461bcd60e51b815260040162000e1e9062004b42565b806200256e8162004b8a565b915050620024f5565b600060008051602062005e47833981519152620025948162002c6f565b611388871115620025b95760405162461bcd60e51b815260040162000e1e9062004d2c565b6013805461ffff19168a151561ff001916176101008a1515021790556014879055601580546001600160a01b0319166001600160a01b03888116919091179091556016869055601780549186166001600160a81b031990921691909117600160a01b851515021790554260185560405166119959535a5b9d60ca1b815260070162002349565b83421115620026915760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640162000e1e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888620026c28c62003468565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006200271f826200348f565b905060006200273182878787620034e0565b9050896001600160a01b0316816001600160a01b031614620027965760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640162000e1e565b620027a38a8a8a62002b4e565b50505050505050505050565b600082815260056020526040902060010154620027cc8162002c6f565b620014048383620030a8565b6000804283116200283b5760405162461bcd60e51b815260206004820152602660248201527f424f52413a20636865636b54696d65206973206265666f72652063757272656e604482015265742074696d6560d01b606482015260840162000e1e565b428360006200284e620151808462004ccd565b9050600062002861620151808462004ccd565b90506200286f828262004cf0565b6200287b858562004cf0565b9550955050505050915091565b60008051602062005e47833981519152620028a38162002c6f565b620028af83836200350c565b826001600160a01b031660405162001da79062004cbd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600060008051602062005e478339815191526200290f8162002c6f565b602487905562002922602587876200417e565b5062002931602685856200417e565b506001979650505050505050565b6200294962003352565b620029548162001c09565b5062001584816200363f565b60008051602062005e478339815191526200297b8162002c6f565b600b5460ff1615158215151415620029ef5760405162461bcd60e51b815260206004820152603060248201527f424f52413a2053746174757320697320616c72656164792073657420746f207460448201526f6865206465736972656420737461746560801b606482015260840162000e1e565b600b805483151560ff1990911681179091556040805160ff909216151582525133917f6a86c4141333b7d70b3318fe955888876e95dc7fc9c7625c95b48107a79ccd2c919081900360200190a25050565b600060008051602062005e4783398151915262002a5d8162002c6f565b6019859055601a849055601b839055604080518681526020810186905290810184905242606082015233907fd8474aa6fa3fe9dd94aacda2d6c5ceb9ff8c562f516ba218dac052128137f32a90608001620020e0565b60008062002ac18162002c6f565b62002ace858585620036bb565b82846001600160a01b0316866001600160a01b03167fe48cca0c9e2ad7911c80a4f7cc507e91e7acd69dae400e5cb4a70dc326d19bcf62002b0c3390565b4260405162002b1d92919062004d71565b60405180910390a4506001949350505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b6001600160a01b03831662002bb25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000e1e565b6001600160a01b03821662002c155760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000e1e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910162001ddc565b62001584813362003862565b60065460ff161562002cc35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000e1e565b565b600062002cd38484620028c7565b9050600019811462002d40578181101562002d315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000e1e565b62002d40848484840362002b4e565b50505050565b600062002d5262002c7b565b600d5460ff1662002d705762002d6a848484620036bb565b62000c20565b604080516101008082018352600d5460ff80821615158452919004811615156020830152600e5492820192909252600f546001600160a01b039081166060830152601054608083015260115490811660a0830152600160a01b9004909116151560c082015260125460e082015260009062002dee9084878762003222565b905062002e0185858360000151620036bb565b60208101511562000ec95762002e218582604001518360200151620036bb565b80606001511562000ec95780604001516001600160a01b031663bb57ad206040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562002e6c57600080fd5b505af115801562002e81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002ea7919062004c2c565b62000ec95760405162461bcd60e51b815260206004820152601f60248201527f424f52413a206661696c656420746f2064697374726962757465206665657300604482015260640162000e1e565b62002f01828262001e97565b620014fd5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905562002f3b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000306001600160a01b037f0000000000000000000000000ef39e52704ad52e2882bbfa6781167e1b6c45101614801562002fd957507f000000000000000000000000000000000000000000000000000000000000008946145b156200300457507fbf42d01e8b896f20049ff4f1ce6acb581e80803dec7e4463381342d7bc6b7ab290565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff666afeff38b1832b2e6fcf12f7ae0bc97a908694b6e64dfc9a1b28ef7b1fa66828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b620030b4828262001e97565b15620014fd5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6200311c620038c6565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051620031589190620046aa565b60405180910390a1565b6001600160a01b038216620031ba5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000e1e565b620031c86000838362003911565b8060026000828254620031dc919062004c4c565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602062005ea7833981519152910160405180910390a35050565b6200322c6200413d565b8451156200333b578460200151156200327b576200324f848660400151620039f9565b6020830152815260a08501516001600160a01b0316604082015260c0850151151560608201526200221c565b606085015160808601516040516341c7c70d60e11b8152600481018790526001600160a01b0386811660248301528581166044830152606482019290925291169063838f8e1a9060840160806040518083038186803b158015620032de57600080fd5b505afa158015620032f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003319919062004d8a565b151560608501526001600160a01b03166040840152602083015281526200221c565b838152949350505050565b6200158433826200350c565b336200335d62001e83565b6001600160a01b03161462002cc35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000e1e565b620014048363a9059cbb60e01b8484604051602401620033d792919062004d71565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262003a34565b6200341c82338362002cc5565b620014fd82826200350c565b6200343262002c7b565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620031493390565b6001600160a01b038116600090815260076020526040902080546001810182559062001076565b600062000b706200349f62002f7f565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000620034f38787878762003b0d565b91509150620035028162003bcc565b5095945050505050565b6001600160a01b0382166200356e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840162000e1e565b6200357c8260008362003911565b6001600160a01b03821660009081526020819052604090205481811015620035f25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840162000e1e565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602062005ea7833981519152910160405180910390a3505050565b6200364962003352565b6001600160a01b038116620036b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000e1e565b620015848162003d28565b6001600160a01b038316620037215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000e1e565b6001600160a01b038216620037855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000e1e565b6200379283838362003911565b6001600160a01b038316600090815260208190526040902054818110156200380c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000e1e565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602062005ea7833981519152910160405180910390a362002d40565b6200386e828262001e97565b620014fd576200387e8162003d82565b6200388b83602062003d95565b6040516020016200389e92919062004dda565b60408051601f198184030181529082905262461bcd60e51b825262000e1e91600401620042a3565b60065460ff1662002cc35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640162000e1e565b6200391b62002c7b565b826200392960003362001e97565b806200393d57506200393b8162002b30565b155b6200395c5760405162461bcd60e51b815260040162000e1e9062004c67565b6001600160a01b0383161562002d405760006001600160a01b0385166200398557601e62003988565b60195b8054909150831115620039ed5760405162461bcd60e51b815260206004820152602660248201527f424f52413a206f6e652074696d65207472616e73666572206c696d697420657860448201526518d95959195960d21b606482015260840162000e1e565b62001b0b818462003f55565b6000808061271062003a0c858762004d0a565b62003a18919062004ccd565b9050600062003a28828762004cf0565b96919550909350505050565b600062003a8b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200400d9092919063ffffffff16565b80519091501562001404578080602001905181019062003aac919062004c2c565b620014045760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000e1e565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111562003b3c575060009050600362003bc3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562003b91573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662003bbc5760006001925092505062003bc3565b9150600090505b94509492505050565b600081600481111562003be35762003be362004e4d565b141562003bed5750565b600181600481111562003c045762003c0462004e4d565b141562003c4f5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640162000e1e565b600281600481111562003c665762003c6662004e4d565b141562003cb65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000e1e565b600381600481111562003ccd5762003ccd62004e4d565b1415620015845760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000e1e565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606062000b706001600160a01b03831660145b6060600062003da683600262004d0a565b62003db390600262004c4c565b6001600160401b0381111562003dcd5762003dcd620043c9565b6040519080825280601f01601f19166020018201604052801562003df8576020820181803683370190505b509050600360fc1b8160008151811062003e165762003e1662004b2c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062003e485762003e4862004b2c565b60200101906001600160f81b031916908160001a905350600062003e6e84600262004d0a565b62003e7b90600162004c4c565b90505b600181111562003efd576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062003eb35762003eb362004b2c565b1a60f81b82828151811062003ecc5762003ecc62004b2c565b60200101906001600160f81b031916908160001a90535060049490941c9362003ef58162004e63565b905062003e7e565b50831562003f4e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000e1e565b9392505050565b600082600201544262003f69919062004ccd565b90508083600301541462003f865760038301819055600060048401555b600082846004015462003f9a919062004c4c565b90508360010154811115620040005760405162461bcd60e51b815260206004820152602560248201527f424f52413a206f6e6520646179207472616e73666572206c696d697420657863604482015264195959195960da1b606482015260840162000e1e565b6004909301929092555050565b60606200221c848460008585600080866001600160a01b0316858760405162004037919062004e7d565b60006040518083038185875af1925050503d806000811462004076576040519150601f19603f3d011682016040523d82523d6000602084013e6200407b565b606091505b50915091506200408e8783838762004099565b979650505050505050565b606083156200410a57825162004102576001600160a01b0385163b620041025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000e1e565b50816200221c565b6200221c8383815115620041215781518083602001fd5b8060405162461bcd60e51b815260040162000e1e9190620042a3565b6040518060800160405280600081526020016000815260200160006001600160a01b031681526020016000151581525090565b610fab8062004e9c83390190565b8280546200418c9062004aab565b90600052602060002090601f016020900481019282620041b05760008555620041fb565b82601f10620041cb5782800160ff19823516178555620041fb565b82800160010185558215620041fb579182015b82811115620041fb578235825591602001919060010190620041de565b5062001e7f9291505b8082111562001e7f576000815560010162004204565b6000602082840312156200422d57600080fd5b81356001600160e01b03198116811462003f4e57600080fd5b60005b838110156200426357818101518382015260200162004249565b8381111562002d405750506000910152565b600081518084526200428f81602086016020860162004246565b601f01601f19169290920160200192915050565b60208152600062003f4e602083018462004275565b6001600160a01b03811681146200158457600080fd5b60008060408385031215620042e257600080fd5b8235620042ef81620042b8565b946020939093013593505050565b80151581146200158457600080fd5b600080604083850312156200432057600080fd5b82356200432d81620042b8565b915060208301356200433f81620042fd565b809150509250929050565b83815260606020820152600062004365606083018562004275565b828103604084015262004379818562004275565b9695505050505050565b9715158852951515602088015260408701949094526001600160a01b03928316606087015260808601919091521660a0840152151560c083015260e08201526101000190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200440a576200440a620043c9565b604052919050565b60006001600160401b038211156200442e576200442e620043c9565b5060051b60200190565b600082601f8301126200444a57600080fd5b81356020620044636200445d8362004412565b620043df565b82815260059290921b840181019181810190868411156200448357600080fd5b8286015b84811015620044ab5780356200449d81620042b8565b835291830191830162004487565b509695505050505050565b600082601f830112620044c857600080fd5b81356020620044db6200445d8362004412565b82815260059290921b84018101918181019086841115620044fb57600080fd5b8286015b84811015620044ab5780358352918301918301620044ff565b6000806000606084860312156200452e57600080fd5b83356001600160401b03808211156200454657600080fd5b620045548783880162004438565b945060208601359150808211156200456b57600080fd5b620045798783880162004438565b935060408601359150808211156200459057600080fd5b506200459f86828701620044b6565b9150509250925092565b600080600060608486031215620045bf57600080fd5b8335620045cc81620042b8565b92506020840135620045de81620042b8565b929592945050506040919091013590565b6000602082840312156200460257600080fd5b5035919050565b6000602082840312156200461c57600080fd5b813562003f4e81620042b8565b600080604083850312156200463d57600080fd5b8235915060208301356200433f81620042b8565b6000602082840312156200466457600080fd5b813562003f4e81620042fd565b600080604083850312156200468557600080fd5b50508035926020909101359150565b9283526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b60008060008060008060c08789031215620046d857600080fd5b8635620046e581620042b8565b95506020870135620046f781620042b8565b945060408701359350606087013592506080870135915060a08701356200471e81620042fd565b809150509295509295509295565b6000806000606084860312156200474257600080fd5b505081359360208301359350604090920135919050565b600060208083850312156200476d57600080fd5b82356001600160401b038111156200478457600080fd5b8301601f810185136200479657600080fd5b8035620047a76200445d8262004412565b81815260059190911b82018301908381019087831115620047c757600080fd5b928401925b828410156200408e578335620047e281620042b8565b82529284019290840190620047cc565b600080600080600080600060e0888a0312156200480e57600080fd5b87356200481b81620042fd565b965060208801356200482d81620042fd565b95506040880135945060608801356200484681620042b8565b93506080880135925060a08801356200485f81620042b8565b915060c08801356200487181620042fd565b8091505092959891949750929550565b600080604083850312156200489557600080fd5b82356001600160401b03811115620048ac57600080fd5b620048ba8582860162004438565b92505060208301356200433f81620042fd565b60008060408385031215620048e157600080fd5b82356001600160401b0380821115620048f957600080fd5b620049078683870162004438565b935060208501359150808211156200491e57600080fd5b506200492d85828601620044b6565b9150509250929050565b600080600080600080600060e0888a0312156200495357600080fd5b87356200496081620042b8565b965060208801356200497281620042b8565b95506040880135945060608801359350608088013560ff811681146200499757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215620049c857600080fd5b8235620049d581620042b8565b915060208301356200433f81620042b8565b60008083601f840112620049fa57600080fd5b5081356001600160401b0381111562004a1257600080fd5b60208301915083602082850101111562001ab357600080fd5b60008060008060006060868803121562004a4457600080fd5b8535945060208601356001600160401b038082111562004a6357600080fd5b62004a7189838a01620049e7565b9096509450604088013591508082111562004a8b57600080fd5b5062004a9a88828901620049e7565b969995985093965092949392505050565b600181811c9082168062004ac057607f821691505b602082108114156200107657634e487b7160e01b600052602260045260246000fd5b6020808252602a908201527f424f52413a20496e70757420617272617973206d7573742062652074686520736040820152690c2daca40d8cadccee8d60b31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252601890820152772127a9209d103330b4b632b2103a37903a3930b739b332b960411b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060001982141562004ba15762004ba162004b74565b5060010190565b6020808252602a908201527f424f52413a2041646472657373206973206e6f7420612077686974656c6973746040820152696564206164647265737360b01b606082015260800190565b60006020828403121562004c0557600080fd5b5051919050565b60006020828403121562004c1f57600080fd5b815162003f4e81620042b8565b60006020828403121562004c3f57600080fd5b815162003f4e81620042fd565b6000821982111562004c625762004c6262004b74565b500190565b60208082526026908201527f424f52413a2041646472657373206973206120626c61636b6c6973746564206160408201526564647265737360d01b606082015260800190565b631352539560e21b815260040190565b63212aa92760e11b815260040190565b60008262004ceb57634e487b7160e01b600052601260045260246000fd5b500490565b60008282101562004d055762004d0562004b74565b500390565b600081600019048311821515161562004d275762004d2762004b74565b500290565b60208082526025908201527f424f52413a20436865636b20612066656520726174696f2028307e353030302c604082015264203530252960d81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b6000806000806080858703121562004da157600080fd5b8451935060208501519250604085015162004dbc81620042b8565b606086015190925062004dcf81620042fd565b939692955090935050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81526000835162004e0e81601785016020880162004246565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162004e4181602884016020880162004246565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b60008162004e755762004e7562004b74565b506000190190565b6000825162004e9181846020870162004246565b919091019291505056fe6101206040523480156200001257600080fd5b5060405162000fab38038062000fab83398101604081905262000035916200022b565b6001600160a01b0385166200009c5760405162461bcd60e51b815260206004820152602260248201527f4c6f636b6564546f6b656e3a20646f6e6f72206973207a65726f206164647265604482015261737360f01b60648201526084015b60405180910390fd5b6001600160a01b038416620001055760405162461bcd60e51b815260206004820152602860248201527f4c6f636b6564546f6b656e3a2062656e6566696369617279206973207a65726f604482015267206164647265737360c01b606482015260840162000093565b6001600160a01b038116620001695760405162461bcd60e51b815260206004820152602360248201527f4c6f636b6564546f6b656e3a2073797374656d206973207a65726f206164647260448201526265737360e81b606482015260840162000093565b428311620001d35760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2072656c656173652074696d652069732062656660448201526f6f72652063757272656e742074696d6560801b606482015260840162000093565b600080546001600160a01b0319166001600160a01b0397881617905593851660805291841660a05260c052151560e0521661010052620002a9565b80516001600160a01b03811681146200022657600080fd5b919050565b60008060008060008060c087890312156200024557600080fd5b62000250876200020e565b955062000260602088016200020e565b945062000270604088016200020e565b935060608701519250608087015180151581146200028d57600080fd5b91506200029d60a088016200020e565b90509295509295509295565b60805160a05160c05160e05161010051610c5d6200034e600039600081816101970152818161054101526106a4015260008181610160015281816104a401526105ee0152600081816101c6015281816101fb015281816103ca015261048201526000818160d50152818161036c0152818161039f015261046001526000818160980152818161043e015281816106720152818161080901526108510152610c5d6000f3fe608060405234801561001057600080fd5b506004361061008e5760003560e01c806325223bd41461009357806338af3eed146100d05780634e71d92d146100f75780635a9b0b8914610101578063722713f714610145578063872a78101461015b57806395bf75fd14610192578063b6549f75146101b9578063b91d4001146101c1578063fc0c546a146101e8575b600080fd5b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100c79190610b39565b60405180910390f35b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6100ff6101f9565b005b610109610421565b604080516001600160a01b03978816815295871660208701528501939093529015156060840152608083015290911660a082015260c0016100c7565b61014d610566565b6040519081526020016100c7565b6101827f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016100c7565b6100ba7f000000000000000000000000000000000000000000000000000000000000000081565b6100ff6105ec565b61014d7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03166100ba565b7f00000000000000000000000000000000000000000000000000000000000000004210156102875760405162461bcd60e51b815260206004820152603060248201527f4c6f636b6564546f6b656e3a2063757272656e742074696d652069732062656660448201526f6f72652072656c656173652074696d6560801b60648201526084015b60405180910390fd5b600080546040516370a0823160e01b81526001600160a01b03909116906370a08231906102b8903090600401610b39565b60206040518083038186803b1580156102d057600080fd5b505afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103089190610b4d565b90506000811161035a5760405162461bcd60e51b815260206004820152601f60248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f20636c61696d00604482015260640161027e565b600054610391906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008361087f565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602081018390527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7906060015b60405180910390a150565b600080546040516370a0823160e01b8152829182918291829182917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b0316906370a08231906104e2903090600401610b39565b60206040518083038186803b1580156104fa57600080fd5b505afa15801561050e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105329190610b4d565b939a92995090975095509093507f000000000000000000000000000000000000000000000000000000000000000092509050565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610597903090600401610b39565b60206040518083038186803b1580156105af57600080fd5b505afa1580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e79190610b4d565b905090565b7f00000000000000000000000000000000000000000000000000000000000000006106675760405162461bcd60e51b815260206004820152602560248201527f4c6f636b6564546f6b656e3a20746f6b656e7320617265206e6f74207265766f6044820152646361626c6560d81b606482015260840161027e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806106c65750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6107245760405162461bcd60e51b815260206004820152602960248201527f4c6f636b6564546f6b656e3a206f6e6c7920646f6e6f727c73797374656d2063604482015268616e207265766f6b6560b81b606482015260840161027e565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610755903090600401610b39565b60206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a59190610b4d565b9050600081116107f75760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6564546f6b656e3a206e6f20746f6b656e7320746f207265766f6b65604482015260640161027e565b60005461082e906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008361087f565b7fec9ab91322523c899ede7830ec9bfc992b5981cdcc27b91162fb23de5791117b7f000000000000000000000000000000000000000000000000000000000000000082604051610416929190610b66565b6108d58363a9059cbb60e01b848460405160240161089e929190610b66565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526108da565b505050565b600061092f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166109ac9092919063ffffffff16565b8051909150156108d5578080602001905181019061094d9190610b7f565b6108d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161027e565b60606109bb84846000856109c3565b949350505050565b606082471015610a245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161027e565b600080866001600160a01b03168587604051610a409190610bd8565b60006040518083038185875af1925050503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b5091509150610a9387838387610a9e565b979650505050505050565b60608315610b0a578251610b03576001600160a01b0385163b610b035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161027e565b50816109bb565b6109bb8383815115610b1f5781518083602001fd5b8060405162461bcd60e51b815260040161027e9190610bf4565b6001600160a01b0391909116815260200190565b600060208284031215610b5f57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610b9157600080fd5b81518015158114610ba157600080fd5b9392505050565b60005b83811015610bc3578181015183820152602001610bab565b83811115610bd2576000848401525b50505050565b60008251610bea818460208701610ba8565b9190910192915050565b6020815260008251806020840152610c13816040850160208701610ba8565b601f01601f1916919091016040019291505056fea2646970667358221220f2b80a15b364789fb7f50c933467ceba01e4d0efa87bac8c4a2651d08cb93dc764736f6c634300080900335719df9ef2c4678b547f89e4f5ae410dbf400fc51cf3ded434c55f6adea2c43f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef57d7aaba7c816a29cd10263482a5d2a41b847dfc3f44d5ae8dd46bf5d6dfac46a264697066735822122008604fa074d2590e5530159ca81959bf22622f4d69ab8fdf5f6cd7174bb8595064736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000570424f5241000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000570424f5241000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 0
Arg [1] : name (string): pBORA
Arg [2] : symbol (string): pBORA

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 70424f5241000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 70424f5241000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

88954:25331:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23238:204;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;23238:204:0;;;;;;;;39664:100;;;:::i;:::-;;;;;;;:::i;42015:201::-;;;;;;:::i;:::-;;:::i;106234:254::-;;;;;;:::i;:::-;;:::i;91211:32::-;;;:::i;:::-;;;;;;;;;:::i;40784:108::-;40872:12;;40784:108;;;2819:25:1;;;2807:2;2792:18;40784:108:0;2673:177:1;90484:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;90484:29:0;;;;;;;;;;-1:-1:-1;;;90484:29:0;;;;;;;;;;;;;;;;;;;;;;;:::i;103173:468::-;;;;;;:::i;:::-;;:::i;95279:244::-;;;;;;:::i;:::-;;:::i;25061:131::-;;;;;;:::i;:::-;25135:7;25162:12;;;:6;:12;;;;;:22;;;;25061:131;90998:30;;;;;;;;;;;;;;;;;;;;;;;7547:25:1;;;7603:2;7588:18;;7581:34;;;;7631:18;;;7624:34;;;;7689:2;7674:18;;7667:34;7732:3;7717:19;;7710:35;7534:3;7519:19;90998:30:0;7288:463:1;111180:515:0;;;;;;:::i;:::-;;:::i;102320:406::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8645:15:1;;;8627:34;;8697:15;;;8692:2;8677:18;;8670:43;8749:15;;;;8729:18;;;8722:43;;;;8796:2;8781:18;;8774:34;;;;8852:14;8845:22;8839:3;8824:19;;8817:51;8607:3;8884:19;;8877:35;8943:3;8928:19;;8921:35;;;;8576:3;8561:19;102320:406:0;8280:682:1;25502:147:0;;;;;;:::i;:::-;;:::i;:::-;;90520:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;90520:28:0;;;;;;;;;;-1:-1:-1;;;90520:28:0;;;;;;;;;40626:93;;;40709:2;9429:36:1;;9417:2;9402:18;40626:93:0;9287:184:1;106496:231:0;;;;;;:::i;:::-;;:::i;70516:115::-;;;:::i;26646:218::-;;;;;;:::i;:::-;;:::i;43500:238::-;;;;;;:::i;:::-;;:::i;100123:182::-;;;;;;:::i;:::-;;:::i;89551:34::-;;;;;;;;;94059:77;;;:::i;95531:1097::-;;;;;;:::i;:::-;;:::i;96855:204::-;;;;;;:::i;:::-;;:::i;112047:104::-;;;;;;:::i;:::-;;:::i;109916:316::-;;;;;;:::i;:::-;;:::i;100717:228::-;;;;;;:::i;:::-;;:::i;101779:363::-;;;;;;:::i;:::-;;:::i;:::-;;;;10334:25:1;;;10390:2;10375:18;;10368:34;;;;10307:18;101779:363:0;10160:248:1;33141:86:0;33212:7;;;;33141:86;;104308:92;;;;;;:::i;:::-;;:::i;110240:280::-;;;;;;:::i;:::-;;:::i;110528:509::-;;;;;;:::i;:::-;;:::i;40955:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;41056:18:0;41029:7;41056:18;;;;;;;;;;;;40955:127;111865:124;;;:::i;89223:62::-;;-1:-1:-1;;;;;;;;;;;89223:62:0;;97067:238;;;;;;:::i;:::-;;:::i;102150:162::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;70258:128::-;;;;;;:::i;:::-;;:::i;93978:73::-;;;:::i;111045:127::-;;;:::i;30074:87::-;;;:::i;:::-;;;;;;;:::i;23534:147::-;;;;;;:::i;:::-;;:::i;103649:651::-;;;;;;:::i;:::-;;:::i;39883:104::-;;;:::i;105013:437::-;;;;;;:::i;:::-;;:::i;22639:49::-;;22684:4;22639:49;;104733:217;;;;;;:::i;:::-;;:::i;44241:436::-;;;;;;:::i;:::-;;:::i;95091:180::-;;;;;;:::i;:::-;;:::i;112159:153::-;;;:::i;106735:1383::-;;;;;;:::i;:::-;;:::i;90957:34::-;;;;;;;;;;;;;;;;;;;100953:270;;;;;;:::i;:::-;;:::i;104408:193::-;;;;;;:::i;:::-;;:::i;101231:97::-;101305:15;;101231:97;;104609:116;;;;;;:::i;:::-;;:::i;102779:386::-;;;;;;:::i;:::-;;:::i;108126:1370::-;;;;;;:::i;:::-;;:::i;69547:645::-;;;;;;:::i;:::-;;:::i;89154:62::-;;-1:-1:-1;;;;;;;;;;;89154:62:0;;25942:149;;;;;;:::i;:::-;;:::i;101336:435::-;;;;;;:::i;:::-;;:::i;96636:211::-;;;;;;:::i;:::-;;:::i;41544:151::-;;;;;;:::i;:::-;;:::i;105923:303::-;;;;;;:::i;:::-;;:::i;89085:62::-;;-1:-1:-1;;;;;;;;;;;89085:62:0;;111703:154;;;;;;:::i;:::-;;:::i;100433:276::-;;;;;;:::i;:::-;;:::i;105458:457::-;;;;;;:::i;:::-;;:::i;109632:276::-;;;;;;:::i;:::-;;:::i;100313:112::-;;;;;;:::i;:::-;;:::i;23238:204::-;23323:4;-1:-1:-1;;;;;;23347:47:0;;-1:-1:-1;;;23347:47:0;;:87;;-1:-1:-1;;;;;;;;;;5615:40:0;;;23398:36;23340:94;23238:204;-1:-1:-1;;23238:204:0:o;39664:100::-;39718:13;39751:5;39744:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39664:100;:::o;42015:201::-;42098:4;3719:10;42154:32;3719:10;42170:7;42179:6;42154:8;:32::i;:::-;-1:-1:-1;42204:4:0;;42015:201;-1:-1:-1;;;42015:201:0:o;106234:254::-;106333:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;-1:-1:-1;;;;;106350:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;;:35;;-1:-1:-1;;106350:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;106401:57;;18167:41:1;;;106442:15:0::1;18224:18:1::0;;;18217:34;;;;106401:57:0::1;::::0;18140:18:1;106401:57:0::1;;;;;;;;-1:-1:-1::0;106476:4:0::1;::::0;106234:254;-1:-1:-1;;;106234:254:0:o;91211:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;103173:468::-;103297:4;103340:10;:17;103322:7;:14;:35;:73;;;;;103382:6;:13;103361:10;:17;:34;103322:73;103314:128;;;;-1:-1:-1;;;103314:128:0;;;;;;;:::i;:::-;;;;;;;;;103458:9;103453:159;103477:7;:14;103473:1;:18;103453:159;;;103521:50;103534:7;103542:1;103534:10;;;;;;;;:::i;:::-;;;;;;;103546;103557:1;103546:13;;;;;;;;:::i;:::-;;;;;;;103561:6;103568:1;103561:9;;;;;;;;:::i;:::-;;;;;;;103521:12;:50::i;:::-;103513:87;;;;-1:-1:-1;;;103513:87:0;;;;;;;:::i;:::-;103493:3;;;;:::i;:::-;;;;103453:159;;;-1:-1:-1;103629:4:0;;103173:468;-1:-1:-1;;;;103173:468:0:o;95279:244::-;95403:4;32746:19;:17;:19::i;:::-;95390:2:::1;112425:23;112439:8;112425:13;:23::i;:::-;112417:78;;;;-1:-1:-1::0;;;112417:78:0::1;;;;;;;:::i;:::-;95420:43:::2;95436:4:::0;3719:10;95456:6:::2;95420:15;:43::i;:::-;95481:34;95498:4;95504:2;95508:6;95481:16;:34::i;:::-;95474:41:::0;95279:244;-1:-1:-1;;;;;95279:244:0:o;111180:515::-;111264:4;;23130:16;111264:4;23130:10;:16::i;:::-;111301:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;111289:19:0::1;:8;-1:-1:-1::0;;;;;111289:19:0::1;;;111281:66;;;::::0;-1:-1:-1;;;111281:66:0;;20043:2:1;111281:66:0::1;::::0;::::1;20025:21:1::0;20082:2;20062:18;;;20055:30;20121:34;20101:18;;;20094:62;-1:-1:-1;;;20172:18:1;;;20165:32;20214:19;;111281:66:0::1;19841:398:1::0;111281:66:0::1;111358:33;-1:-1:-1::0;;;;;;;;;;;111382:8:0::1;111358:10;:33::i;:::-;111411;-1:-1:-1::0;;;;;;;;;;;111435:8:0::1;111411:10;:33::i;:::-;111479;-1:-1:-1::0;;;;;;;;;;;111503:8:0::1;111479:10;:33::i;:::-;111533:40;22684:4;111564:8:::0;111533:10:::1;:40::i;:::-;111598:67;::::0;-1:-1:-1;;;20446:26:1;;-1:-1:-1;;;;;111598:67:0;::::1;::::0;3719:10;;20497:2:1;20488:12;111598:67:0::1;;::::0;;;;::::1;::::0;;111649:15:::1;2819:25:1::0;;111598:67:0;::::1;::::0;2807:2:1;2792:18;111598:67:0::1;;;;;;;111683:4;111676:11;;23157:1;111180:515:::0;;;;:::o;102320:406::-;102390:7;102399;102408;102417;102426:4;102432:7;102441;102461:16;102503:38;102516:10;-1:-1:-1;;;;;102516:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;102503:38::-;102488:53;;;;;102568:10;-1:-1:-1;;;;;102568:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102589:10;-1:-1:-1;;;;;102589:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102609:10;-1:-1:-1;;;;;102609:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102635:10;-1:-1:-1;;;;;102635:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102661:10;-1:-1:-1;;;;;102661:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102685:10;-1:-1:-1;;;;;102685:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102552:166;;;;-1:-1:-1;102552:166:0;;-1:-1:-1;102552:166:0;-1:-1:-1;102552:166:0;-1:-1:-1;102552:166:0;;-1:-1:-1;102709:8:0;;-1:-1:-1;102320:406:0;-1:-1:-1;;102320:406:0:o;25502:147::-;25135:7;25162:12;;;:6;:12;;;;;:22;;;23130:16;23141:4;23130:10;:16::i;:::-;25616:25:::1;25627:4;25633:7;25616:10;:25::i;:::-;25502:147:::0;;;:::o;106496:231::-;106583:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;106600:15:::1;:28:::0;;;106644:53:::1;::::0;;10334:25:1;;;106681:15:0::1;10390:2:1::0;10375:18;;10368:34;3719:10:0;;106644:53:::1;::::0;10307:18:1;106644:53:0::1;;;;;;;-1:-1:-1::0;106715:4:0::1;::::0;106496:231;-1:-1:-1;;106496:231:0:o;70516:115::-;70576:7;70603:20;:18;:20::i;:::-;70596:27;;70516:115;:::o;26646:218::-;-1:-1:-1;;;;;26742:23:0;;3719:10;26742:23;26734:83;;;;-1:-1:-1;;;26734:83:0;;21679:2:1;26734:83:0;;;21661:21:1;21718:2;21698:18;;;21691:30;21757:34;21737:18;;;21730:62;-1:-1:-1;;;21808:18:1;;;21801:45;21863:19;;26734:83:0;21477:411:1;26734:83:0;26830:26;26842:4;26848:7;26830:11;:26::i;:::-;26646:218;;:::o;43500:238::-;43588:4;3719:10;43644:64;3719:10;43660:7;43697:10;43669:25;3719:10;43660:7;43669:9;:25::i;:::-;:38;;;;:::i;:::-;43644:8;:64::i;100123:182::-;100206:14;;100185:4;;100206:14;;100202:74;;;-1:-1:-1;;;;;;100244:20:0;;;;;:10;:20;;;;;;;;;100123:182::o;100202:74::-;-1:-1:-1;100293:4:0;;100123:182;-1:-1:-1;100123:182:0:o;94059:77::-;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;94118:10:::1;:8;:10::i;:::-;94059:77:::0;:::o;95531:1097::-;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;95619:2;112586:39:::1;22684:4;112614:10;112586:7;:39::i;:::-;:67;;;;112630:23;112644:8;112630:13;:23::i;:::-;112629:24;112586:67;112578:118;;;;-1:-1:-1::0;;;112578:118:0::1;;;;;;;:::i;:::-;101305:15:::0;;95658:6:::2;95642:13;40872:12:::0;;;40784:108;95642:13:::2;:22;;;;:::i;:::-;:42;;95634:91;;;::::0;-1:-1:-1;;;95634:91:0;;22635:2:1;95634:91:0::2;::::0;::::2;22617:21:1::0;22674:2;22654:18;;;22647:30;22713:34;22693:18;;;22686:62;-1:-1:-1;;;22764:18:1;;;22757:34;22808:19;;95634:91:0::2;22433:400:1::0;95634:91:0::2;95765:29;;:::i;:::-;95861:11;:17:::0;95828:15:::2;::::0;95861:17:::2;;95856:678;;95940:24:::0;;;95979:26:::2;95985:2:::0;95958:6;95979:5:::2;:26::i;:::-;95856:678;;;96049:59;::::0;;::::2;::::0;;::::2;::::0;;96070:11:::2;96049:59:::0;::::2;::::0;;::::2;;;::::0;;;;::::2;::::0;::::2;;;;::::0;::::2;::::0;;;;;;;;;;;;-1:-1:-1;;;;;96049:59:0;;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;;-1:-1:-1;;;96049:59:0;::::2;::::0;;::::2;;;::::0;;;;;;;;;;::::2;::::0;96083:6;3719:10;96105:2:::2;96049:20;:59::i;:::-;96038:70;;96123:26;96129:2;96133:8;:15;;;96123:5;:26::i;:::-;96170:12;::::0;::::2;::::0;:16;96166:357:::2;;96207:41;96213:8;:20;;;96235:8;:12;;;96207:5;:41::i;:::-;96294:8;:20;;;-1:-1:-1::0;;;;;96272:86:0::2;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;96316:8:0::2;:12;;;96330:13;40872:12:::0;;;40784:108;96330:13:::2;96345:12;96272:86;;;;;;;;:::i;:::-;;;;;;;;96381:8;:22;;;96377:131;;;96450:8;:20;;;-1:-1:-1::0;;;;;96428:58:0::2;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96377:131;96571:2;-1:-1:-1::0;;;;;96549:71:0::2;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;96575:8:0::2;:15;;;96592:13;40872:12:::0;;;40784:108;96592:13:::2;96607:12;96549:71;;;;;;;;:::i;:::-;;;;;;;;95623:1005;;23157:1:::1;95531:1097:::0;;;:::o;96855:204::-;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;96934:26:::1;96953:6;96934:18;:26::i;:::-;96976:75;::::0;3719:10;;96976:75:::1;::::0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;97012:6:0::1;97020:13;40872:12:::0;;;40784:108;97020:13:::1;97035:15;96976:75;;;;;;;;:::i;:::-;;;;;;;;96855:204:::0;;:::o;112047:104::-;29960:13;:11;:13::i;:::-;112117:12:::1;:26:::0;;-1:-1:-1;;112117:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;112047:104::o;109916:316::-;110036:4;;23130:16;110036:4;23130:10;:16::i;:::-;110053:57:::1;110088:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;110053:34:0;::::1;::::0;110097:12;110053:34:::1;:57::i;:::-;3719:10:::0;110126:76:::1;::::0;;10334:25:1;;;110186:15:0::1;10390:2:1::0;10375:18;;10368:34;-1:-1:-1;;;;;110126:76:0;;::::1;::::0;;::::1;::::0;::::1;::::0;10307:18:1;110126:76:0::1;;;;;;;-1:-1:-1::0;110220:4:0::1;::::0;109916:316;-1:-1:-1;;;109916:316:0:o;100717:228::-;100806:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;-1:-1:-1;;;;;100823:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;;:27;;-1:-1:-1;;100823:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;100866:49;;18167:41:1;;;100899:15:0::1;18224:18:1::0;;;18217:34;;;;100866:49:0::1;::::0;18140:18:1;100866:49:0::1;17999:258:1::0;101779:363:0;101867:7;101876;101919:11;101904;:26;;101896:78;;;;-1:-1:-1;;;101896:78:0;;23558:2:1;101896:78:0;;;23540:21:1;23597:2;23577:18;;;23570:30;23636:34;23616:18;;;23609:62;-1:-1:-1;;;23687:18:1;;;23680:37;23734:19;;101896:78:0;23356:403:1;101896:78:0;101985:15;102003:19;102017:5;102003:11;:19;:::i;:::-;101985:37;-1:-1:-1;102033:15:0;102051:19;102065:5;102051:11;:19;:::i;:::-;102033:37;-1:-1:-1;102089:17:0;102099:7;102033:37;102089:17;:::i;:::-;102108:25;102122:11;102108;:25;:::i;:::-;102081:53;;;;;;101779:363;;;;;;:::o;104308:92::-;104374:10;-1:-1:-1;;;;;104374:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104308:92;:::o;110240:280::-;110343:4;;23130:16;110343:4;23130:10;:16::i;:::-;110368:83:::1;110389:13;110411;-1:-1:-1::0;;;;;110404:31:0::1;;110444:4;110404:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;110368:83::-;110360:130;;;::::0;-1:-1:-1;;;110360:130:0;;24318:2:1;110360:130:0::1;::::0;::::1;24300:21:1::0;24357:2;24337:18;;;24330:30;24396:34;24376:18;;;24369:62;-1:-1:-1;;;24447:18:1;;;24440:32;24489:19;;110360:130:0::1;24116:398:1::0;110360:130:0::1;-1:-1:-1::0;110508:4:0::1;::::0;110240:280;-1:-1:-1;;110240:280:0:o;110528:509::-;110609:4;;23130:16;110609:4;23130:10;:16::i;:::-;-1:-1:-1;;;;;110634:22:0;::::1;110626:70;;;::::0;-1:-1:-1;;;110626:70:0;;24721:2:1;110626:70:0::1;::::0;::::1;24703:21:1::0;24760:2;24740:18;;;24733:30;24799:34;24779:18;;;24772:62;-1:-1:-1;;;24850:18:1;;;24843:33;24893:19;;110626:70:0::1;24519:399:1::0;110626:70:0::1;110707:39;22684:4;110737:8:::0;110707:9:::1;:39::i;:::-;110766:32;-1:-1:-1::0;;;;;;;;;;;110789:8:0::1;110766:9;:32::i;:::-;110818;-1:-1:-1::0;;;;;;;;;;;110841:8:0::1;110818:9;:32::i;:::-;110885;-1:-1:-1::0;;;;;;;;;;;110908:8:0::1;110885:9;:32::i;:::-;110943:64;::::0;-1:-1:-1;;;25125:23:1;;-1:-1:-1;;;;;110943:64:0;::::1;::::0;3719:10;;25173:1:1;25164:11;110943:64:0::1;24923:258:1::0;111865:124:0;29960:13;:11;:13::i;:::-;111936:45:::1;::::0;-1:-1:-1;;;111936:45:0;;25388:2:1;111936:45:0::1;::::0;::::1;25370:21:1::0;25427:2;25407:18;;;25400:30;25466:34;25446:18;;;25439:62;-1:-1:-1;;;25517:18:1;;;25510:33;25560:19;;111936:45:0::1;25186:399:1::0;97067:238:0;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;97167:39:::1;97190:7;97199:6;97167:22;:39::i;:::-;97222:75;::::0;-1:-1:-1;;;25792:24:1;;-1:-1:-1;;;;;97222:75:0;::::1;::::0;25841:1:1;25832:11;97222:75:0::1;;;;;;;;-1:-1:-1::0;;;;;;;;;;;97258:6:0::1;97266:13;40872:12:::0;;;40784:108;97266:13:::1;97281:15;97222:75;;;;;;;;:::i;:::-;;;;;;;;97067:238:::0;;;:::o;102150:162::-;102214:7;;;102260:6;102268:16;102260:6;102277:7;102268:16;:::i;:::-;102286:17;:6;102295:8;102286:17;:::i;:::-;102252:52;;;;;;102150:162;;;;;:::o;70258:128::-;-1:-1:-1;;;;;70354:14:0;;70327:7;70354:14;;;:7;:14;;;;;54052;70354:24;53960:114;93978:73;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;94035:8:::1;:6;:8::i;111045:127::-:0;111115:4;;23130:16;111115:4;23130:10;:16::i;:::-;111139:25:::1;3719:10:::0;111180:515;:::i;111139:25::-:1;111132:32;;23157:1;111045:127:::0;;:::o;30074:87::-;30147:6;;;;;-1:-1:-1;;;;;30147:6:0;;30074:87::o;23534:147::-;23620:4;23644:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;23644:29:0;;;;;;;;;;;;;;;23534:147::o;103649:651::-;103820:11;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;103844:19:::1;103885:25;103897:13:::0;103885:9;:25:::1;:::i;:::-;103866:45;::::0;:15:::1;:45;:::i;:::-;103844:67;;103922:23;103972:4;103979:6;103987:12;104001:11;104014:10;104034:4;103948:92;;;;;:::i;:::-;-1:-1:-1::0;;;;;26364:15:1;;;26346:34;;26416:15;;;26411:2;26396:18;;26389:43;26468:15;;;26463:2;26448:18;;26441:43;26515:2;26500:18;;26493:34;;;;26571:14;26564:22;26558:3;26543:19;;26536:51;26624:15;;;26326:3;26603:19;;26596:44;26295:3;26280:19;103948:92:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;103922:118:0;-1:-1:-1;104051:61:0::1;3719:10:::0;104090:11:::1;104104:7;104051:16;:61::i;:::-;;104168:12;-1:-1:-1::0;;;;;104128:135:0::1;104160:6;-1:-1:-1::0;;;;;104128:135:0::1;104146:11;-1:-1:-1::0;;;;;104128:135:0::1;;104182:11;-1:-1:-1::0;;;;;104182:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104128:135;::::0;;26904:25:1;;;26960:2;26945:18;;26938:34;;;27015:14;;27008:22;26988:18;;;26981:50;104240:4:0::1;27062:2:1::0;27047:18;;27040:60;104247:15:0::1;27131:3:1::0;27116:19;;27109:35;26891:3;26876:19;104128:135:0::1;;;;;;;104281:11:::0;103649:651;-1:-1:-1;;;;;;;;;103649:651:0:o;39883:104::-;39939:13;39972:7;39965:14;;;;;:::i;105013:437::-;105148:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;105165:8:::1;:45:::0;;;105221:24;:43;;;105275:19;:33;;;105324:96:::1;::::0;;27386:25:1;;;27427:18;;;27420:34;;;27470:18;;27463:34;;;105404:15:0::1;27528:2:1::0;27513:18;;27506:34;3719:10:0;;105324:96:::1;::::0;27373:3:1;27358:19;105324:96:0::1;;;;;;;;-1:-1:-1::0;105438:4:0::1;::::0;105013:437;-1:-1:-1;;;;105013:437:0:o;104733:217::-;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;104843:9:::1;104838:105;104862:10;:17;104858:1;:21;104838:105;;;104901:30;104917:10;104928:1;104917:13;;;;;;;;:::i;:::-;;;;;;;104901:15;:30::i;:::-;104881:3:::0;::::1;::::0;::::1;:::i;:::-;;;;104838:105;;44241:436:::0;44334:4;3719:10;44334:4;44417:25;3719:10;44434:7;44417:9;:25::i;:::-;44390:52;;44481:15;44461:16;:35;;44453:85;;;;-1:-1:-1;;;44453:85:0;;27753:2:1;44453:85:0;;;27735:21:1;27792:2;27772:18;;;27765:30;27831:34;27811:18;;;27804:62;-1:-1:-1;;;27882:18:1;;;27875:35;27927:19;;44453:85:0;27551:401:1;44453:85:0;44574:60;44583:5;44590:7;44618:15;44599:16;:34;44574:8;:60::i;95091:180::-;95197:4;32746:19;:17;:19::i;:::-;95184:2:::1;112425:23;112439:8;112425:13;:23::i;:::-;112417:78;;;;-1:-1:-1::0;;;112417:78:0::1;;;;;;;:::i;:::-;95221:42:::2;3719:10:::0;95252:2:::2;95256:6;95221:16;:42::i;:::-;95214:49:::0;95091:180;-1:-1:-1;;;;95091:180:0:o;112159:153::-;29960:13;:11;:13::i;:::-;112215:12:::1;::::0;::::1;;112207:53;;;::::0;-1:-1:-1;;;112207:53:0;;28159:2:1;112207:53:0::1;::::0;::::1;28141:21:1::0;28198:2;28178:18;;;28171:30;28237;28217:18;;;28210:58;28285:18;;112207:53:0::1;27957:352:1::0;112207:53:0::1;112292:10;112271:33;106735:1383:::0;106961:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;106999:4:::1;106986:9;:17;;106978:67;;;;-1:-1:-1::0;;;106978:67:0::1;;;;;;;:::i;:::-;107056:12;:27:::0;;-1:-1:-1;;107131:41:0;107056:27;::::1;;-1:-1:-1::0;;107131:41:0;;107056:27:::1;107131:41:::0;::::1;;;;::::0;;107249:21;:33;;;107380:27;:45;;-1:-1:-1;;;;;;107380:45:0::1;-1:-1:-1::0;;;;;107380:45:0;;::::1;::::0;;;::::1;::::0;;;107496:29;:49;;;107612:24;:39;;;;::::1;-1:-1:-1::0;;;;;;107701:59:0;;;;;;;-1:-1:-1;;;107701:59:0;::::1;;;;::::0;;107906:15:::1;107879:24:::0;:42;107937:151:::1;::::0;-1:-1:-1;;;28922:23:1;;28970:1;28961:11;107937:151:0::1;;;;;;;;;107964:6;107972:13;107987:9;107998:15;108015:17;108034:12;108048:22;108072:15;107937:151;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;108106:4:0::1;::::0;106735:1383;-1:-1:-1;;;;;;;;106735:1383:0:o;100953:270::-;101065:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;101087:9:::1;101082:112;101106:12;:19;101102:1;:23;101082:112;;;101147:35;101160:12;101173:1;101160:15;;;;;;;;:::i;:::-;;;;;;;101177:4;101147:12;:35::i;:::-;-1:-1:-1::0;101127:3:0;::::1;::::0;::::1;:::i;:::-;;;;101082:112;;104408:193:::0;104495:9;104490:104;104514:10;:17;104510:1;:21;104490:104;;;104553:29;104568:10;104579:1;104568:13;;;;;;;;:::i;:::-;;;;;;;104553:14;:29::i;:::-;104533:3;;;;:::i;:::-;;;;104490:104;;104609:116;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;104698:10:::1;-1:-1:-1::0;;;;;104698:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;104609:116:::0;;:::o;102779:386::-;102873:4;102919:6;:13;102898:10;:17;:34;102890:89;;;;-1:-1:-1;;;102890:89:0;;;;;;;:::i;:::-;102995:9;102990:146;103014:10;:17;103010:1;:21;102990:146;;;103061:34;103070:10;103081:1;103070:13;;;;;;;;:::i;:::-;;;;;;;103085:6;103092:1;103085:9;;;;;;;;:::i;:::-;;;;;;;103061:8;:34::i;:::-;103053:71;;;;-1:-1:-1;;;103053:71:0;;;;;;;:::i;:::-;103033:3;;;;:::i;:::-;;;;102990:146;;108126:1370;108348:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;108386:4:::1;108373:9;:17;;108365:67;;;;-1:-1:-1::0;;;108365:67:0::1;;;;;;;:::i;:::-;108443:11;:26:::0;;-1:-1:-1;;108517:40:0;108443:26;::::1;;-1:-1:-1::0;;108517:40:0;;108443:26:::1;108517:40:::0;::::1;;;;::::0;;108634:20;:32;;;108764:26;:44;;-1:-1:-1;;;;;;108764:44:0::1;-1:-1:-1::0;;;;;108764:44:0;;::::1;::::0;;;::::1;::::0;;;108879:28;:48;;;108994:23;:38;;;;::::1;-1:-1:-1::0;;;;;;109082:58:0;;;;;;;-1:-1:-1;;;109082:58:0;::::1;;;;::::0;;109285:15:::1;109259:23:::0;:41;109316:150:::1;::::0;-1:-1:-1;;;29185:22:1;;29232:1;29223:11;109316:150:0::1;28983:257:1::0;69547:645:0;69791:8;69772:15;:27;;69764:69;;;;-1:-1:-1;;;69764:69:0;;29447:2:1;69764:69:0;;;29429:21:1;29486:2;29466:18;;;29459:30;29525:31;29505:18;;;29498:59;29574:18;;69764:69:0;29245:353:1;69764:69:0;69846:18;68722:95;69906:5;69913:7;69922:5;69929:16;69939:5;69929:9;:16::i;:::-;69877:79;;;;;;29890:25:1;;;;-1:-1:-1;;;;;29989:15:1;;;29969:18;;;29962:43;30041:15;;;;30021:18;;;30014:43;30073:18;;;30066:34;30116:19;;;30109:35;30160:19;;;30153:35;;;29862:19;;69877:79:0;;;;;;;;;;;;69867:90;;;;;;69846:111;;69970:12;69985:28;70002:10;69985:16;:28::i;:::-;69970:43;;70026:14;70043:28;70057:4;70063:1;70066;70069;70043:13;:28::i;:::-;70026:45;;70100:5;-1:-1:-1;;;;;70090:15:0;:6;-1:-1:-1;;;;;70090:15:0;;70082:58;;;;-1:-1:-1;;;70082:58:0;;30401:2:1;70082:58:0;;;30383:21:1;30440:2;30420:18;;;30413:30;30479:32;30459:18;;;30452:60;30529:18;;70082:58:0;30199:354:1;70082:58:0;70153:31;70162:5;70169:7;70178:5;70153:8;:31::i;:::-;69753:439;;;69547:645;;;;;;;:::o;25942:149::-;25135:7;25162:12;;;:6;:12;;;;;:22;;;23130:16;23141:4;23130:10;:16::i;:::-;26057:26:::1;26069:4;26075:7;26057:11;:26::i;101336:435::-:0;101404:7;101413;101459:15;101441;:33;101433:84;;;;-1:-1:-1;;;101433:84:0;;30760:2:1;101433:84:0;;;30742:21:1;30799:2;30779:18;;;30772:30;30838:34;30818:18;;;30811:62;-1:-1:-1;;;30889:18:1;;;30882:36;30935:19;;101433:84:0;30558:402:1;101433:84:0;101549:15;101596;101528:18;101639;101652:5;101549:15;101639:18;:::i;:::-;101622:35;-1:-1:-1;101668:14:0;101685:18;101698:5;101685:10;:18;:::i;:::-;101668:35;-1:-1:-1;101722:15:0;101731:6;101668:35;101722:15;:::i;:::-;101739:23;101752:10;101739;:23;:::i;:::-;101714:49;;;;;;;;101336:435;;;:::o;96636:211::-;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;96731:22:::1;96737:7;96746:6;96731:5;:22::i;:::-;96791:7;-1:-1:-1::0;;;;;96769:70:0::1;;;;;;:::i;41544:151::-:0;-1:-1:-1;;;;;41660:18:0;;;41633:7;41660:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;41544:151::o;105923:303::-;106060:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;106077:12:::1;:29:::0;;;106117:33:::1;:21:::0;106141:9;;106117:33:::1;:::i;:::-;-1:-1:-1::0;106161:35:0::1;:22:::0;106186:10;;106161:35:::1;:::i;:::-;-1:-1:-1::0;106214:4:0::1;::::0;105923:303;-1:-1:-1;;;;;;;105923:303:0:o;111703:154::-;29960:13;:11;:13::i;:::-;111785:18:::1;111794:8;111785;:18::i;:::-;;111814:35;111840:8;111814:25;:35::i;100433:276::-:0;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;100521:14:::1;::::0;::::1;;:22;;::::0;::::1;;;;100513:83;;;::::0;-1:-1:-1;;;100513:83:0;;31167:2:1;100513:83:0::1;::::0;::::1;31149:21:1::0;31206:2;31186:18;;;31179:30;31245:34;31225:18;;;31218:62;-1:-1:-1;;;31296:18:1;;;31289:46;31352:19;;100513:83:0::1;30965:412:1::0;100513:83:0::1;100607:14;:21:::0;;;::::1;;-1:-1:-1::0;;100607:21:0;;::::1;::::0;::::1;::::0;;;100644:57:::1;::::0;;100686:14:::1;::::0;;;470::1;463:22;445:41;;100644:57:0;3719:10;;100644:57:::1;::::0;;;;;433:2:1;100644:57:0;;::::1;100433:276:::0;;:::o;105458:457::-;105597:4;-1:-1:-1;;;;;;;;;;;23130:16:0;23141:4;23130:10;:16::i;:::-;105614:12:::1;:49:::0;;;105674:28;:47;;;105732:23;:37;;;105785:100:::1;::::0;;27386:25:1;;;27442:2;27427:18;;27420:34;;;27470:18;;;27463:34;;;105869:15:0::1;27528:2:1::0;27513:18;;27506:34;3719:10:0;;105785:100:::1;::::0;27373:3:1;27358:19;105785:100:0::1;27155:391:1::0;109632:276:0;109748:4;;23130:16;109748:4;23130:10;:16::i;:::-;109765:30:::1;109775:5;109782:3;109787:7;109765:9;:30::i;:::-;109839:7;109834:3;-1:-1:-1::0;;;;;109811:67:0::1;109827:5;-1:-1:-1::0;;;;;109811:67:0::1;;109848:12;3719:10:::0;;3639:98;109848:12:::1;109862:15;109811:67;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;109896:4:0::1;::::0;109632:276;-1:-1:-1;;;;109632:276:0:o;100313:112::-;-1:-1:-1;;;;;100398:19:0;100374:4;100398:19;;;:10;:19;;;;;;;;;100313:112::o;48268:380::-;-1:-1:-1;;;;;48404:19:0;;48396:68;;;;-1:-1:-1;;;48396:68:0;;31863:2:1;48396:68:0;;;31845:21:1;31902:2;31882:18;;;31875:30;31941:34;31921:18;;;31914:62;-1:-1:-1;;;31992:18:1;;;31985:34;32036:19;;48396:68:0;31661:400:1;48396:68:0;-1:-1:-1;;;;;48483:21:0;;48475:68;;;;-1:-1:-1;;;48475:68:0;;32268:2:1;48475:68:0;;;32250:21:1;32307:2;32287:18;;;32280:30;32346:34;32326:18;;;32319:62;-1:-1:-1;;;32397:18:1;;;32390:32;32439:19;;48475:68:0;32066:398:1;48475:68:0;-1:-1:-1;;;;;48556:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;48608:32;;2819:25:1;;;48608:32:0;;2792:18:1;48608:32:0;2673:177:1;23985:105:0;24052:30;24063:4;3719:10;24052;:30::i;33300:108::-;33212:7;;;;33370:9;33362:38;;;;-1:-1:-1;;;33362:38:0;;32671:2:1;33362:38:0;;;32653:21:1;32710:2;32690:18;;;32683:30;-1:-1:-1;;;32729:18:1;;;32722:46;32785:18;;33362:38:0;32469:340:1;33362:38:0;33300:108::o;48939:453::-;49074:24;49101:25;49111:5;49118:7;49101:9;:25::i;:::-;49074:52;;-1:-1:-1;;49141:16:0;:37;49137:248;;49223:6;49203:16;:26;;49195:68;;;;-1:-1:-1;;;49195:68:0;;33016:2:1;49195:68:0;;;32998:21:1;33055:2;33035:18;;;33028:30;33094:31;33074:18;;;33067:59;33143:18;;49195:68:0;32814:353:1;49195:68:0;49307:51;49316:5;49323:7;49351:6;49332:16;:25;49307:8;:51::i;:::-;49063:329;48939:453;;;:::o;94144:939::-;94243:4;32746:19;:17;:19::i;:::-;94265:12:::1;:18:::0;::::1;;94260:794;;94346:27;94356:4;94362:2;94366:6;94346:9;:27::i;:::-;94260:794;;;94438:52;::::0;;::::1;::::0;;::::1;::::0;;94459:12:::1;94438:52:::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;;;;::::0;::::1;::::0;;;;;;;;;;;;-1:-1:-1;;;;;94438:52:0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;;-1:-1:-1;;;94438:52:0;::::1;::::0;;::::1;;;::::0;;;;;;;;;;94406:29:::1;::::0;94438:52:::1;::::0;94473:6;94481:4;94487:2;94438:20:::1;:52::i;:::-;94406:84;;94505:36;94515:4;94521:2;94525:8;:15;;;94505:9;:36::i;:::-;94562:12;::::0;::::1;::::0;:16;94558:485:::1;;94599:51;94609:4;94615:8;:20;;;94637:8;:12;;;94599:9;:51::i;:::-;94857:8;:22;;;94853:175;;;94934:8;:20;;;-1:-1:-1::0;;;;;94912:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;94904:104;;;::::0;-1:-1:-1;;;94904:104:0;;33374:2:1;94904:104:0::1;::::0;::::1;33356:21:1::0;33413:2;33393:18;;;33386:30;33452:33;33432:18;;;33425:61;33503:18;;94904:104:0::1;33172:355:1::0;28243:238:0;28327:22;28335:4;28341:7;28327;:22::i;:::-;28322:152;;28366:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;28366:29:0;;;;;;;;;:36;;-1:-1:-1;;28366:36:0;28398:4;28366:36;;;28449:12;3719:10;;3639:98;28449:12;-1:-1:-1;;;;;28422:40:0;28440:7;-1:-1:-1;;;;;28422:40:0;28434:4;28422:40;;;;;;;;;;28243:238;;:::o;66390:314::-;66443:7;66475:4;-1:-1:-1;;;;;66484:12:0;66467:29;;:66;;;;;66517:16;66500:13;:33;66467:66;66463:234;;;-1:-1:-1;66557:24:0;;66390:314::o;66463:234::-;-1:-1:-1;66893:73:0;;;66643:10;66893:73;;;;38691:25:1;;;;66655:12:0;38732:18:1;;;38725:34;66669:15:0;38775:18:1;;;38768:34;66937:13:0;38818:18:1;;;38811:34;66960:4:0;38861:19:1;;;;38854:61;;;;66893:73:0;;;;;;;;;;38663:19:1;;;;66893:73:0;;;66883:84;;;;;;70516:115::o;28661:239::-;28745:22;28753:4;28759:7;28745;:22::i;:::-;28741:152;;;28816:5;28784:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;28784:29:0;;;;;;;;;;:37;;-1:-1:-1;;28784:37:0;;;28841:40;3719:10;;28784:12;;28841:40;;28816:5;28841:40;28661:239;;:::o;33996:120::-;33005:16;:14;:16::i;:::-;34055:7:::1;:15:::0;;-1:-1:-1;;34055:15:0::1;::::0;;34086:22:::1;3719:10:::0;34095:12:::1;34086:22;;;;;;:::i;:::-;;;;;;;;33996:120::o:0;46274:548::-;-1:-1:-1;;;;;46358:21:0;;46350:65;;;;-1:-1:-1;;;46350:65:0;;33734:2:1;46350:65:0;;;33716:21:1;33773:2;33753:18;;;33746:30;33812:33;33792:18;;;33785:61;33863:18;;46350:65:0;33532:355:1;46350:65:0;46428:49;46457:1;46461:7;46470:6;46428:20;:49::i;:::-;46506:6;46490:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;46661:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;46716:37;2819:25:1;;;-1:-1:-1;;;;;;;;;;;46716:37:0;2792:18:1;46716:37:0;;;;;;;26646:218;;:::o;98390:961::-;98511:28;;:::i;:::-;98556:13;;98552:765;;;98590:7;:20;;;98586:664;;;98756:37;98768:6;98776:7;:16;;;98756:11;:37::i;:::-;98741:11;;;98724:69;;;98834:19;;;;-1:-1:-1;;;;;98812:41:0;:19;;;:41;98896:29;;;;98872:53;;-1:-1:-1;98872:21:0;;:53;98552:765;;98586:664;99156:22;;;;99209:24;;;;99136:98;;-1:-1:-1;;;99136:98:0;;;;;34123:25:1;;;-1:-1:-1;;;;;34222:15:1;;;34202:18;;;34195:43;34274:15;;;34254:18;;;34247:43;34306:18;;;34299:34;;;;99136:54:0;;;;;34095:19:1;;99136:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99060:174;;99111:21;;;99060:174;-1:-1:-1;;;;;99060:174:0;99090:19;;;99060:174;99077:11;;;99060:174;;;98552:765;;;99282:23;;;98390:961;;;;;;:::o;71476:91::-;71532:27;3719:10;71552:6;71532:5;:27::i;30239:132::-;3719:10;30303:7;:5;:7::i;:::-;-1:-1:-1;;;;;30303:23:0;;30295:68;;;;-1:-1:-1;;;30295:68:0;;35053:2:1;30295:68:0;;;35035:21:1;;;35072:18;;;35065:30;35131:34;35111:18;;;35104:62;35183:18;;30295:68:0;34851:356:1;82053:211:0;82170:86;82190:5;82220:23;;;82245:2;82249:5;82197:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;82197:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;82197:58:0;-1:-1:-1;;;;;;82197:58:0;;;;;;;;;;82170:19;:86::i;71886:164::-;71963:46;71979:7;3719:10;72002:6;71963:15;:46::i;:::-;72020:22;72026:7;72035:6;72020:5;:22::i;33737:118::-;32746:19;:17;:19::i;:::-;33797:7:::1;:14:::0;;-1:-1:-1;;33797:14:0::1;33807:4;33797:14;::::0;;33827:20:::1;33834:12;3719:10:::0;;3639:98;70769:207;-1:-1:-1;;;;;70890:14:0;;70829:15;70890:14;;;:7;:14;;;;;54052;;54189:1;54171:19;;;;54052:14;70951:17;54082:127;67617:167;67694:7;67721:55;67743:20;:18;:20::i;:::-;67765:10;63163:57;;-1:-1:-1;;;63163:57:0;;;40351:27:1;40394:11;;;40387:27;;;40430:12;;;40423:28;;;63126:7:0;;40467:12:1;;63163:57:0;;;;;;;;;;;;63153:68;;;;;;63146:75;;63033:196;;;;;61342:279;61470:7;61491:17;61510:18;61532:25;61543:4;61549:1;61552;61555;61532:10;:25::i;:::-;61490:67;;;;61568:18;61580:5;61568:11;:18::i;:::-;-1:-1:-1;61604:9:0;61342:279;-1:-1:-1;;;;;61342:279:0:o;47155:675::-;-1:-1:-1;;;;;47239:21:0;;47231:67;;;;-1:-1:-1;;;47231:67:0;;35414:2:1;47231:67:0;;;35396:21:1;35453:2;35433:18;;;35426:30;35492:34;35472:18;;;35465:62;-1:-1:-1;;;35543:18:1;;;35536:31;35584:19;;47231:67:0;35212:397:1;47231:67:0;47311:49;47332:7;47349:1;47353:6;47311:20;:49::i;:::-;-1:-1:-1;;;;;47398:18:0;;47373:22;47398:18;;;;;;;;;;;47435:24;;;;47427:71;;;;-1:-1:-1;;;47427:71:0;;35816:2:1;47427:71:0;;;35798:21:1;35855:2;35835:18;;;35828:30;35894:34;35874:18;;;35867:62;-1:-1:-1;;;35945:18:1;;;35938:32;35987:19;;47427:71:0;35614:398:1;47427:71:0;-1:-1:-1;;;;;47534:18:0;;:9;:18;;;;;;;;;;;47555:23;;;47534:44;;47673:12;:22;;;;;;;47724:37;2819:25:1;;;47534:9:0;;:18;-1:-1:-1;;;;;;;;;;;47724:37:0;2792:18:1;47724:37:0;;;;;;;25502:147;;;:::o;30980:201::-;29960:13;:11;:13::i;:::-;-1:-1:-1;;;;;31069:22:0;::::1;31061:73;;;::::0;-1:-1:-1;;;31061:73:0;;36219:2:1;31061:73:0::1;::::0;::::1;36201:21:1::0;36258:2;36238:18;;;36231:30;36297:34;36277:18;;;36270:62;-1:-1:-1;;;36348:18:1;;;36341:36;36394:19;;31061:73:0::1;36017:402:1::0;31061:73:0::1;31145:28;31164:8;31145:18;:28::i;45147:840::-:0;-1:-1:-1;;;;;45278:18:0;;45270:68;;;;-1:-1:-1;;;45270:68:0;;36626:2:1;45270:68:0;;;36608:21:1;36665:2;36645:18;;;36638:30;36704:34;36684:18;;;36677:62;-1:-1:-1;;;36755:18:1;;;36748:35;36800:19;;45270:68:0;36424:401:1;45270:68:0;-1:-1:-1;;;;;45357:16:0;;45349:64;;;;-1:-1:-1;;;45349:64:0;;37032:2:1;45349:64:0;;;37014:21:1;37071:2;37051:18;;;37044:30;37110:34;37090:18;;;37083:62;-1:-1:-1;;;37161:18:1;;;37154:33;37204:19;;45349:64:0;36830:399:1;45349:64:0;45426:38;45447:4;45453:2;45457:6;45426:20;:38::i;:::-;-1:-1:-1;;;;;45499:15:0;;45477:19;45499:15;;;;;;;;;;;45533:21;;;;45525:72;;;;-1:-1:-1;;;45525:72:0;;37436:2:1;45525:72:0;;;37418:21:1;37475:2;37455:18;;;37448:30;37514:34;37494:18;;;37487:62;-1:-1:-1;;;37565:18:1;;;37558:36;37611:19;;45525:72:0;37234:402:1;45525:72:0;-1:-1:-1;;;;;45633:15:0;;;:9;:15;;;;;;;;;;;45651:20;;;45633:38;;45851:13;;;;;;;;;;:23;;;;;;45903:26;;2819:25:1;;;45851:13:0;;-1:-1:-1;;;;;;;;;;;45903:26:0;2792:18:1;45903:26:0;;;;;;;45942:37;25502:147;24380:492;24469:22;24477:4;24483:7;24469;:22::i;:::-;24464:401;;24657:28;24677:7;24657:19;:28::i;:::-;24758:38;24786:4;24793:2;24758:19;:38::i;:::-;24562:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24562:257:0;;;;;;;;;;-1:-1:-1;;;24508:345:0;;;;;;;:::i;33485:108::-;33212:7;;;;33544:41;;;;-1:-1:-1;;;33544:41:0;;39128:2:1;33544:41:0;;;39110:21:1;39167:2;39147:18;;;39140:30;-1:-1:-1;;;39186:18:1;;;39179:50;39246:18;;33544:41:0;38926:344:1;97777:566:0;32746:19;:17;:19::i;:::-;97898:4;112586:39:::1;22684:4;112614:10;112586:7;:39::i;:::-;:67;;;;112630:23;112644:8;112630:13;:23::i;:::-;112629:24;112586:67;112578:118;;;;-1:-1:-1::0;;;112578:118:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;97976:16:0;::::2;::::0;97972:364:::2;;98009:36;-1:-1:-1::0;;;;;98048:18:0;::::2;:44;;98084:8;98048:44;;;98069:12;98048:44;98125:30:::0;;98009:83;;-1:-1:-1;98115:40:0;::::2;;98107:91;;;::::0;-1:-1:-1;;;98107:91:0;;39477:2:1;98107:91:0::2;::::0;::::2;39459:21:1::0;39516:2;39496:18;;;39489:30;39555:34;39535:18;;;39528:62;-1:-1:-1;;;39606:18:1;;;39599:36;39652:19;;98107:91:0::2;39275:402:1::0;98107:91:0::2;98213:41;98232:13;98247:6;98213:18;:41::i;99359:232::-:0;99437:7;;;99503:5;99482:17;99491:8;99482:6;:17;:::i;:::-;99481:27;;;;:::i;:::-;99466:42;-1:-1:-1;99519:15:0;99537:13;99466:42;99537:6;:13;:::i;:::-;99519:31;99578:4;;-1:-1:-1;99359:232:0;;-1:-1:-1;;;;99359:232:0:o;85120:716::-;85544:23;85570:69;85598:4;85570:69;;;;;;;;;;;;;;;;;85578:5;-1:-1:-1;;;;;85570:27:0;;;:69;;;;;:::i;:::-;85654:17;;85544:95;;-1:-1:-1;85654:21:0;85650:179;;85751:10;85740:30;;;;;;;;;;;;:::i;:::-;85732:85;;;;-1:-1:-1;;;85732:85:0;;39884:2:1;85732:85:0;;;39866:21:1;39923:2;39903:18;;;39896:30;39962:34;39942:18;;;39935:62;-1:-1:-1;;;40013:18:1;;;40006:40;40063:19;;85732:85:0;39682:406:1;59683:1520:0;59814:7;;-1:-1:-1;;;;;60735:79:0;;60731:163;;;-1:-1:-1;60847:1:0;;-1:-1:-1;60851:30:0;60831:51;;60731:163;61008:24;;;60991:14;61008:24;;;;;;;;;40717:25:1;;;40790:4;40778:17;;40758:18;;;40751:45;;;;40812:18;;;40805:34;;;40855:18;;;40848:34;;;61008:24:0;;40689:19:1;;61008:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61008:24:0;;-1:-1:-1;;61008:24:0;;;-1:-1:-1;;;;;;;61047:20:0;;61043:103;;61100:1;61104:29;61084:50;;;;;;;61043:103;61166:6;-1:-1:-1;61174:20:0;;-1:-1:-1;59683:1520:0;;;;;;;;:::o;55075:521::-;55153:20;55144:5;:29;;;;;;;;:::i;:::-;;55140:449;;;55075:521;:::o;55140:449::-;55251:29;55242:5;:38;;;;;;;;:::i;:::-;;55238:351;;;55297:34;;-1:-1:-1;;;55297:34:0;;41227:2:1;55297:34:0;;;41209:21:1;41266:2;41246:18;;;41239:30;-1:-1:-1;;;41285:18:1;;;41278:54;41349:18;;55297:34:0;41025:348:1;55238:351:0;55362:35;55353:5;:44;;;;;;;;:::i;:::-;;55349:240;;;55414:41;;-1:-1:-1;;;55414:41:0;;41580:2:1;55414:41:0;;;41562:21:1;41619:2;41599:18;;;41592:30;41658:33;41638:18;;;41631:61;41709:18;;55414:41:0;41378:355:1;55349:240:0;55486:30;55477:5;:39;;;;;;;;:::i;:::-;;55473:116;;;55533:44;;-1:-1:-1;;;55533:44:0;;41940:2:1;55533:44:0;;;41922:21:1;41979:2;41959:18;;;41952:30;42018:34;41998:18;;;41991:62;-1:-1:-1;;;42069:18:1;;;42062:32;42111:19;;55533:44:0;41738:398:1;31341:191:0;31434:6;;;-1:-1:-1;;;;;31451:17:0;;;31434:6;31451:17;;;-1:-1:-1;;;;;;31451:17:0;;;;;;31484:40;;31434:6;;;;;;;;31484:40;;31415:16;;31484:40;31404:128;31341:191;:::o;20577:151::-;20635:13;20668:52;-1:-1:-1;;;;;20680:22:0;;18732:2;19973:447;20048:13;20074:19;20106:10;20110:6;20106:1;:10;:::i;:::-;:14;;20119:1;20106:14;:::i;:::-;-1:-1:-1;;;;;20096:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20096:25:0;;20074:47;;-1:-1:-1;;;20132:6:0;20139:1;20132:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;20132:15:0;;;;;;;;;-1:-1:-1;;;20158:6:0;20165:1;20158:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;20158:15:0;;;;;;;;-1:-1:-1;20189:9:0;20201:10;20205:6;20201:1;:10;:::i;:::-;:14;;20214:1;20201:14;:::i;:::-;20189:26;;20184:131;20221:1;20217;:5;20184:131;;;-1:-1:-1;;;20265:5:0;20273:3;20265:11;20256:21;;;;;;;:::i;:::-;;;;20244:6;20251:1;20244:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;20244:33:0;;;;;;;;-1:-1:-1;20302:1:0;20292:11;;;;;20224:3;;;:::i;:::-;;;20184:131;;;-1:-1:-1;20333:10:0;;20325:55;;;;-1:-1:-1;;;20325:55:0;;42484:2:1;20325:55:0;;;42466:21:1;;;42503:18;;;42496:30;42562:34;42542:18;;;42535:62;42614:18;;20325:55:0;42282:356:1;20325:55:0;20405:6;19973:447;-1:-1:-1;;;19973:447:0:o;99599:516::-;99694:18;99733:6;:17;;;99715:15;:35;;;;:::i;:::-;99694:56;;99786:10;99765:6;:17;;;:31;99761:136;;99813:17;;;:30;;;99884:1;99858:23;;;:27;99761:136;99907:19;99955:6;99929;:23;;;:32;;;;:::i;:::-;99907:54;;99995:6;:22;;;99980:11;:37;;99972:87;;;;-1:-1:-1;;;99972:87:0;;42845:2:1;99972:87:0;;;42827:21:1;42884:2;42864:18;;;42857:30;42923:34;42903:18;;;42896:62;-1:-1:-1;;;42974:18:1;;;42967:35;43019:19;;99972:87:0;42643:401:1;99972:87:0;100070:23;;;;:37;;;;-1:-1:-1;;99599:516:0:o;75982:229::-;76119:12;76151:52;76173:6;76181:4;76187:1;76190:12;76119;77390;77404:23;77431:6;-1:-1:-1;;;;;77431:11:0;77450:5;77457:4;77431:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77389:73;;;;77480:69;77507:6;77515:7;77524:10;77536:12;77480:26;:69::i;:::-;77473:76;77102:455;-1:-1:-1;;;;;;;77102:455:0:o;79675:644::-;79860:12;79889:7;79885:427;;;79917:17;;79913:290;;-1:-1:-1;;;;;73520:19:0;;;80127:60;;;;-1:-1:-1;;;80127:60:0;;43937:2:1;80127:60:0;;;43919:21:1;43976:2;43956:18;;;43949:30;44015:31;43995:18;;;43988:59;44064:18;;80127:60:0;43735:353:1;80127:60:0;-1:-1:-1;80224:10:0;80217:17;;79885:427;80267:33;80275:10;80287:12;81022:17;;:21;81018:388;;81254:10;81248:17;81311:15;81298:10;81294:2;81290:19;81283:44;81018:388;81381:12;81374:20;;-1:-1:-1;;;81374:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:286:1;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:315;1452:6;1460;1513:2;1501:9;1492:7;1488:23;1484:32;1481:52;;;1529:1;1526;1519:12;1481:52;1568:9;1555:23;1587:31;1612:5;1587:31;:::i;:::-;1637:5;1689:2;1674:18;;;;1661:32;;-1:-1:-1;;;1384:315:1:o;1704:118::-;1790:5;1783:13;1776:21;1769:5;1766:32;1756:60;;1812:1;1809;1802:12;1827:382;1892:6;1900;1953:2;1941:9;1932:7;1928:23;1924:32;1921:52;;;1969:1;1966;1959:12;1921:52;2008:9;1995:23;2027:31;2052:5;2027:31;:::i;:::-;2077:5;-1:-1:-1;2134:2:1;2119:18;;2106:32;2147:30;2106:32;2147:30;:::i;:::-;2196:7;2186:17;;;1827:382;;;;;:::o;2214:454::-;2439:6;2428:9;2421:25;2482:2;2477;2466:9;2462:18;2455:30;2402:4;2508:45;2549:2;2538:9;2534:18;2526:6;2508:45;:::i;:::-;2601:9;2593:6;2589:22;2584:2;2573:9;2569:18;2562:50;2629:33;2655:6;2647;2629:33;:::i;:::-;2621:41;2214:454;-1:-1:-1;;;;;;2214:454:1:o;2855:765::-;3205:14;;3198:22;3180:41;;3264:14;;3257:22;3252:2;3237:18;;3230:50;3311:2;3296:18;;3289:34;;;;-1:-1:-1;;;;;3397:15:1;;;3392:2;3377:18;;3370:43;3444:3;3429:19;;3422:35;;;;3494:15;3350:3;3473:19;;3466:44;3554:14;3547:22;3541:3;3526:19;;3519:51;3601:3;3586:19;;3579:35;3167:3;3152:19;;2855:765::o;3625:127::-;3686:10;3681:3;3677:20;3674:1;3667:31;3717:4;3714:1;3707:15;3741:4;3738:1;3731:15;3757:275;3828:2;3822:9;3893:2;3874:13;;-1:-1:-1;;3870:27:1;3858:40;;-1:-1:-1;;;;;3913:34:1;;3949:22;;;3910:62;3907:88;;;3975:18;;:::i;:::-;4011:2;4004:22;3757:275;;-1:-1:-1;3757:275:1:o;4037:183::-;4097:4;-1:-1:-1;;;;;4122:6:1;4119:30;4116:56;;;4152:18;;:::i;:::-;-1:-1:-1;4197:1:1;4193:14;4209:4;4189:25;;4037:183::o;4225:737::-;4279:5;4332:3;4325:4;4317:6;4313:17;4309:27;4299:55;;4350:1;4347;4340:12;4299:55;4386:6;4373:20;4412:4;4436:60;4452:43;4492:2;4452:43;:::i;:::-;4436:60;:::i;:::-;4530:15;;;4616:1;4612:10;;;;4600:23;;4596:32;;;4561:12;;;;4640:15;;;4637:35;;;4668:1;4665;4658:12;4637:35;4704:2;4696:6;4692:15;4716:217;4732:6;4727:3;4724:15;4716:217;;;4812:3;4799:17;4829:31;4854:5;4829:31;:::i;:::-;4873:18;;4911:12;;;;4749;;4716:217;;;-1:-1:-1;4951:5:1;4225:737;-1:-1:-1;;;;;;4225:737:1:o;4967:662::-;5021:5;5074:3;5067:4;5059:6;5055:17;5051:27;5041:55;;5092:1;5089;5082:12;5041:55;5128:6;5115:20;5154:4;5178:60;5194:43;5234:2;5194:43;:::i;5178:60::-;5272:15;;;5358:1;5354:10;;;;5342:23;;5338:32;;;5303:12;;;;5382:15;;;5379:35;;;5410:1;5407;5400:12;5379:35;5446:2;5438:6;5434:15;5458:142;5474:6;5469:3;5466:15;5458:142;;;5540:17;;5528:30;;5578:12;;;;5491;;5458:142;;5634:821;5786:6;5794;5802;5855:2;5843:9;5834:7;5830:23;5826:32;5823:52;;;5871:1;5868;5861:12;5823:52;5911:9;5898:23;-1:-1:-1;;;;;5981:2:1;5973:6;5970:14;5967:34;;;5997:1;5994;5987:12;5967:34;6020:61;6073:7;6064:6;6053:9;6049:22;6020:61;:::i;:::-;6010:71;;6134:2;6123:9;6119:18;6106:32;6090:48;;6163:2;6153:8;6150:16;6147:36;;;6179:1;6176;6169:12;6147:36;6202:63;6257:7;6246:8;6235:9;6231:24;6202:63;:::i;:::-;6192:73;;6318:2;6307:9;6303:18;6290:32;6274:48;;6347:2;6337:8;6334:16;6331:36;;;6363:1;6360;6353:12;6331:36;;6386:63;6441:7;6430:8;6419:9;6415:24;6386:63;:::i;:::-;6376:73;;;5634:821;;;;;:::o;6460:456::-;6537:6;6545;6553;6606:2;6594:9;6585:7;6581:23;6577:32;6574:52;;;6622:1;6619;6612:12;6574:52;6661:9;6648:23;6680:31;6705:5;6680:31;:::i;:::-;6730:5;-1:-1:-1;6787:2:1;6772:18;;6759:32;6800:33;6759:32;6800:33;:::i;:::-;6460:456;;6852:7;;-1:-1:-1;;;6906:2:1;6891:18;;;;6878:32;;6460:456::o;6921:180::-;6980:6;7033:2;7021:9;7012:7;7008:23;7004:32;7001:52;;;7049:1;7046;7039:12;7001:52;-1:-1:-1;7072:23:1;;6921:180;-1:-1:-1;6921:180:1:o;7756:247::-;7815:6;7868:2;7856:9;7847:7;7843:23;7839:32;7836:52;;;7884:1;7881;7874:12;7836:52;7923:9;7910:23;7942:31;7967:5;7942:31;:::i;8967:315::-;9035:6;9043;9096:2;9084:9;9075:7;9071:23;9067:32;9064:52;;;9112:1;9109;9102:12;9064:52;9148:9;9135:23;9125:33;;9208:2;9197:9;9193:18;9180:32;9221:31;9246:5;9221:31;:::i;9661:241::-;9717:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:52;;;9786:1;9783;9776:12;9738:52;9825:9;9812:23;9844:28;9866:5;9844:28;:::i;9907:248::-;9975:6;9983;10036:2;10024:9;10015:7;10011:23;10007:32;10004:52;;;10052:1;10049;10042:12;10004:52;-1:-1:-1;;10075:23:1;;;10145:2;10130:18;;;10117:32;;-1:-1:-1;9907:248:1:o;10413:319::-;10615:25;;;10671:2;10656:18;;10649:34;;;;10714:2;10699:18;;10692:34;10603:2;10588:18;;10413:319::o;10737:203::-;-1:-1:-1;;;;;10901:32:1;;;;10883:51;;10871:2;10856:18;;10737:203::o;10945:730::-;11046:6;11054;11062;11070;11078;11086;11139:3;11127:9;11118:7;11114:23;11110:33;11107:53;;;11156:1;11153;11146:12;11107:53;11195:9;11182:23;11214:31;11239:5;11214:31;:::i;:::-;11264:5;-1:-1:-1;11321:2:1;11306:18;;11293:32;11334:33;11293:32;11334:33;:::i;:::-;11386:7;-1:-1:-1;11440:2:1;11425:18;;11412:32;;-1:-1:-1;11491:2:1;11476:18;;11463:32;;-1:-1:-1;11542:3:1;11527:19;;11514:33;;-1:-1:-1;11599:3:1;11584:19;;11571:33;11613:30;11571:33;11613:30;:::i;:::-;11662:7;11652:17;;;10945:730;;;;;;;;:::o;11908:316::-;11985:6;11993;12001;12054:2;12042:9;12033:7;12029:23;12025:32;12022:52;;;12070:1;12067;12060:12;12022:52;-1:-1:-1;;12093:23:1;;;12163:2;12148:18;;12135:32;;-1:-1:-1;12214:2:1;12199:18;;;12186:32;;11908:316;-1:-1:-1;11908:316:1:o;12229:986::-;12333:6;12364:2;12407;12395:9;12386:7;12382:23;12378:32;12375:52;;;12423:1;12420;12413:12;12375:52;12463:9;12450:23;-1:-1:-1;;;;;12488:6:1;12485:30;12482:50;;;12528:1;12525;12518:12;12482:50;12551:22;;12604:4;12596:13;;12592:27;-1:-1:-1;12582:55:1;;12633:1;12630;12623:12;12582:55;12669:2;12656:16;12692:60;12708:43;12748:2;12708:43;:::i;12692:60::-;12786:15;;;12868:1;12864:10;;;;12856:19;;12852:28;;;12817:12;;;;12892:19;;;12889:39;;;12924:1;12921;12914:12;12889:39;12948:11;;;;12968:217;12984:6;12979:3;12976:15;12968:217;;;13064:3;13051:17;13081:31;13106:5;13081:31;:::i;:::-;13125:18;;13001:12;;;;13163;;;;12968:217;;13220:933;13324:6;13332;13340;13348;13356;13364;13372;13425:3;13413:9;13404:7;13400:23;13396:33;13393:53;;;13442:1;13439;13432:12;13393:53;13481:9;13468:23;13500:28;13522:5;13500:28;:::i;:::-;13547:5;-1:-1:-1;13604:2:1;13589:18;;13576:32;13617:30;13576:32;13617:30;:::i;:::-;13666:7;-1:-1:-1;13720:2:1;13705:18;;13692:32;;-1:-1:-1;13776:2:1;13761:18;;13748:32;13789:33;13748:32;13789:33;:::i;:::-;13841:7;-1:-1:-1;13895:3:1;13880:19;;13867:33;;-1:-1:-1;13952:3:1;13937:19;;13924:33;13966;13924;13966;:::i;:::-;14018:7;-1:-1:-1;14077:3:1;14062:19;;14049:33;14091:30;14049:33;14091:30;:::i;:::-;14140:7;14130:17;;;13220:933;;;;;;;;;;:::o;14158:477::-;14248:6;14256;14309:2;14297:9;14288:7;14284:23;14280:32;14277:52;;;14325:1;14322;14315:12;14277:52;14365:9;14352:23;-1:-1:-1;;;;;14390:6:1;14387:30;14384:50;;;14430:1;14427;14420:12;14384:50;14453:61;14506:7;14497:6;14486:9;14482:22;14453:61;:::i;:::-;14443:71;;;14564:2;14553:9;14549:18;14536:32;14577:28;14599:5;14577:28;:::i;14640:595::-;14758:6;14766;14819:2;14807:9;14798:7;14794:23;14790:32;14787:52;;;14835:1;14832;14825:12;14787:52;14875:9;14862:23;-1:-1:-1;;;;;14945:2:1;14937:6;14934:14;14931:34;;;14961:1;14958;14951:12;14931:34;14984:61;15037:7;15028:6;15017:9;15013:22;14984:61;:::i;:::-;14974:71;;15098:2;15087:9;15083:18;15070:32;15054:48;;15127:2;15117:8;15114:16;15111:36;;;15143:1;15140;15133:12;15111:36;;15166:63;15221:7;15210:8;15199:9;15195:24;15166:63;:::i;:::-;15156:73;;;14640:595;;;;;:::o;15240:829::-;15351:6;15359;15367;15375;15383;15391;15399;15452:3;15440:9;15431:7;15427:23;15423:33;15420:53;;;15469:1;15466;15459:12;15420:53;15508:9;15495:23;15527:31;15552:5;15527:31;:::i;:::-;15577:5;-1:-1:-1;15634:2:1;15619:18;;15606:32;15647:33;15606:32;15647:33;:::i;:::-;15699:7;-1:-1:-1;15753:2:1;15738:18;;15725:32;;-1:-1:-1;15804:2:1;15789:18;;15776:32;;-1:-1:-1;15860:3:1;15845:19;;15832:33;15909:4;15896:18;;15884:31;;15874:59;;15929:1;15926;15919:12;15874:59;15240:829;;;;-1:-1:-1;15240:829:1;;;;15952:7;16006:3;15991:19;;15978:33;;-1:-1:-1;16058:3:1;16043:19;;;16030:33;;15240:829;-1:-1:-1;;15240:829:1:o;16074:388::-;16142:6;16150;16203:2;16191:9;16182:7;16178:23;16174:32;16171:52;;;16219:1;16216;16209:12;16171:52;16258:9;16245:23;16277:31;16302:5;16277:31;:::i;:::-;16327:5;-1:-1:-1;16384:2:1;16369:18;;16356:32;16397:33;16356:32;16397:33;:::i;16467:348::-;16519:8;16529:6;16583:3;16576:4;16568:6;16564:17;16560:27;16550:55;;16601:1;16598;16591:12;16550:55;-1:-1:-1;16624:20:1;;-1:-1:-1;;;;;16656:30:1;;16653:50;;;16699:1;16696;16689:12;16653:50;16736:4;16728:6;16724:17;16712:29;;16788:3;16781:4;16772:6;16764;16760:19;16756:30;16753:39;16750:59;;;16805:1;16802;16795:12;16820:789;16921:6;16929;16937;16945;16953;17006:2;16994:9;16985:7;16981:23;16977:32;16974:52;;;17022:1;17019;17012:12;16974:52;17058:9;17045:23;17035:33;;17119:2;17108:9;17104:18;17091:32;-1:-1:-1;;;;;17183:2:1;17175:6;17172:14;17169:34;;;17199:1;17196;17189:12;17169:34;17238:59;17289:7;17280:6;17269:9;17265:22;17238:59;:::i;:::-;17316:8;;-1:-1:-1;17212:85:1;-1:-1:-1;17404:2:1;17389:18;;17376:32;;-1:-1:-1;17420:16:1;;;17417:36;;;17449:1;17446;17439:12;17417:36;;17488:61;17541:7;17530:8;17519:9;17515:24;17488:61;:::i;:::-;16820:789;;;;-1:-1:-1;16820:789:1;;-1:-1:-1;17568:8:1;;17462:87;16820:789;-1:-1:-1;;;16820:789:1:o;17614:380::-;17693:1;17689:12;;;;17736;;;17757:61;;17811:4;17803:6;17799:17;17789:27;;17757:61;17864:2;17856:6;17853:14;17833:18;17830:38;17827:161;;;17910:10;17905:3;17901:20;17898:1;17891:31;17945:4;17942:1;17935:15;17973:4;17970:1;17963:15;18262:406;18464:2;18446:21;;;18503:2;18483:18;;;18476:30;18542:34;18537:2;18522:18;;18515:62;-1:-1:-1;;;18608:2:1;18593:18;;18586:40;18658:3;18643:19;;18262:406::o;18673:127::-;18734:10;18729:3;18725:20;18722:1;18715:31;18765:4;18762:1;18755:15;18789:4;18786:1;18779:15;18805:348;19007:2;18989:21;;;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19080:2:1;19065:18;;19058:54;19144:2;19129:18;;18805:348::o;19158:127::-;19219:10;19214:3;19210:20;19207:1;19200:31;19250:4;19247:1;19240:15;19274:4;19271:1;19264:15;19290:135;19329:3;-1:-1:-1;;19350:17:1;;19347:43;;;19370:18;;:::i;:::-;-1:-1:-1;19417:1:1;19406:13;;19290:135::o;19430:406::-;19632:2;19614:21;;;19671:2;19651:18;;;19644:30;19710:34;19705:2;19690:18;;19683:62;-1:-1:-1;;;19776:2:1;19761:18;;19754:40;19826:3;19811:19;;19430:406::o;20511:184::-;20581:6;20634:2;20622:9;20613:7;20609:23;20605:32;20602:52;;;20650:1;20647;20640:12;20602:52;-1:-1:-1;20673:16:1;;20511:184;-1:-1:-1;20511:184:1:o;20700:266::-;20785:6;20838:2;20826:9;20817:7;20813:23;20809:32;20806:52;;;20854:1;20851;20844:12;20806:52;20886:9;20880:16;20905:31;20930:5;20905:31;:::i;21227:245::-;21294:6;21347:2;21335:9;21326:7;21322:23;21318:32;21315:52;;;21363:1;21360;21353:12;21315:52;21395:9;21389:16;21414:28;21436:5;21414:28;:::i;21893:128::-;21933:3;21964:1;21960:6;21957:1;21954:13;21951:39;;;21970:18;;:::i;:::-;-1:-1:-1;22006:9:1;;21893:128::o;22026:402::-;22228:2;22210:21;;;22267:2;22247:18;;;22240:30;22306:34;22301:2;22286:18;;22279:62;-1:-1:-1;;;22372:2:1;22357:18;;22350:36;22418:3;22403:19;;22026:402::o;22838:254::-;-1:-1:-1;;;23040:19:1;;23084:1;23075:11;;22838:254::o;23097:::-;-1:-1:-1;;;23299:19:1;;23343:1;23334:11;;23097:254::o;23764:217::-;23804:1;23830;23820:132;;23874:10;23869:3;23865:20;23862:1;23855:31;23909:4;23906:1;23899:15;23937:4;23934:1;23927:15;23820:132;-1:-1:-1;23966:9:1;;23764:217::o;23986:125::-;24026:4;24054:1;24051;24048:8;24045:34;;;24059:18;;:::i;:::-;-1:-1:-1;24096:9:1;;23986:125::o;25854:168::-;25894:7;25960:1;25956;25952:6;25948:14;25945:1;25942:21;25937:1;25930:9;25923:17;25919:45;25916:71;;;25967:18;;:::i;:::-;-1:-1:-1;26007:9:1;;25854:168::o;28314:401::-;28516:2;28498:21;;;28555:2;28535:18;;;28528:30;28594:34;28589:2;28574:18;;28567:62;-1:-1:-1;;;28660:2:1;28645:18;;28638:35;28705:3;28690:19;;28314:401::o;31382:274::-;-1:-1:-1;;;;;31574:32:1;;;;31556:51;;31638:2;31623:18;;31616:34;31544:2;31529:18;;31382:274::o;34344:502::-;34438:6;34446;34454;34462;34515:3;34503:9;34494:7;34490:23;34486:33;34483:53;;;34532:1;34529;34522:12;34483:53;34561:9;34555:16;34545:26;;34611:2;34600:9;34596:18;34590:25;34580:35;;34658:2;34647:9;34643:18;34637:25;34671:31;34696:5;34671:31;:::i;:::-;34771:2;34756:18;;34750:25;34721:5;;-1:-1:-1;34784:30:1;34750:25;34784:30;:::i;:::-;34344:502;;;;-1:-1:-1;34344:502:1;;-1:-1:-1;;34344:502:1:o;37641:786::-;-1:-1:-1;;;38047:3:1;38040:38;38022:3;38107:6;38101:13;38123:62;38178:6;38173:2;38168:3;38164:12;38157:4;38149:6;38145:17;38123:62;:::i;:::-;-1:-1:-1;;;38244:2:1;38204:16;;;38236:11;;;38229:40;38294:13;;38316:63;38294:13;38365:2;38357:11;;38350:4;38338:17;;38316:63;:::i;:::-;38399:17;38418:2;38395:26;;37641:786;-1:-1:-1;;;;37641:786:1:o;40893:127::-;40954:10;40949:3;40945:20;40942:1;40935:31;40985:4;40982:1;40975:15;41009:4;41006:1;40999:15;42141:136;42180:3;42208:5;42198:39;;42217:18;;:::i;:::-;-1:-1:-1;;;42253:18:1;;42141:136::o;43456:274::-;43585:3;43623:6;43617:13;43639:53;43685:6;43680:3;43673:4;43665:6;43661:17;43639:53;:::i;:::-;43708:16;;;;;43456:274;-1:-1:-1;;43456:274:1:o

Swarm Source

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