Contract 0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a058814

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x23a22c16f02257fddbb9653b05915dc9b3745f0adda952f090dbb521bf2290c6Enter40775062022-08-09 8:08:096 hrs 11 mins ago0x1e47d43b5b95e071ec013296a9e683fdb22ea05a IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619024536924 4,945.35192833
0x5264114aae37511e78e3683f3828f733d15d82930bb728d0364a52baf5ea06f3Enter40701052022-08-08 20:29:2217 hrs 50 mins ago0x2059d129e485cd769b5b8fc19dc35817941aab6a IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO1.237131682893 4,946.192128888
0x2d3761f076d8c2f904fbee2b0f21db558138bbba96c1e1e2c99834a1872a5640Redeem40690842022-08-08 18:52:5019 hrs 27 mins ago0x03762c4478518fbf036ed6062fe9035d2e6d0670 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.625415962139 4,994.736749903
0x6277c80b79026cb96d4125298d0a1714143af2e77b02958f57de26e2cb387ba5Redeem40648282022-08-08 12:08:481 day 2 hrs ago0x97c18ee2b7fc6c78f543f3c92692de7ca90db31e IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.767759276192 4,946.424483412
0xae5c3dbefd94d2b44aefa2c778560bb05bf0d948db77471050efac3c6c237a37Enter40607842022-08-08 5:44:171 day 8 hrs ago0xfeb204448224c10cb2d335b77b554017856824e2 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.9401532689960
0x1992da020b1ae348fa2628a27a1ee041af6ea70b1dd520687c77d3c036244bf9Enter40548302022-08-07 20:22:311 day 17 hrs ago0xb6bb121daea21bd3ba098fc0e347810c89ed0184 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO1.2369282041380
0x2479fb9b7ca93ecf340744d6c3d605038e88545ee9c0118ceef8eeec3dfbf883Redeem40535162022-08-07 18:18:301 day 20 hrs ago0xe16012a7c1eeb3ef1cbef5c9f1b9535789406253 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.61949023914 4,946.938273223
0x8575a8c534d004f3da4655fbe7fd214d9bfd271f4457f2c19c6d21459a0ebfd7Enter40514202022-08-07 15:00:241 day 23 hrs ago0xe16012a7c1eeb3ef1cbef5c9f1b9535789406253 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.60993449925 4,947.032672177
0x1bb663fb032e14560edbb76d83584644448f7444de522fc27e88cdfc665200e3Redeem40507072022-08-07 13:52:562 days 26 mins ago0x522aa75b47078ba9e70c1115c6772dd4e97d1b72 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619506075147 4,947.064731625
0x8e71fd986eda676bee3ed6fe00b4ca7da6e90b2ddfcb96bfc07f8ea37b9e007bEnter40481092022-08-07 9:47:482 days 4 hrs ago0xc2eabfeddc6ee1236290d43cf0fe8ba0164325f8 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.931188791031 4,947.184719601
0x1a3cd716fb2dec86febd921f8b007736f104c2e29f8b4fc7c14d9077b64b71d9Redeem40475492022-08-07 8:54:492 days 5 hrs ago0xf1bd93e891c32450f36673e14903c8cd94be2fb6 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.6192771640560
0xec0717503dcf444917ac0100ee7bb88442c02114168e9e43c393add470c70ab7Redeem40427582022-08-07 1:22:472 days 12 hrs ago0xfeb204448224c10cb2d335b77b554017856824e2 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.7676830725150
0x9a3b1bb64aaaacddaf9649e5c4c83a5742f8a43b52b01f3a0ccf0c3fc89497b1Redeem40353492022-08-06 13:43:123 days 36 mins ago0x1777958b04aca4e0232b804d343e94d76a0927f7 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.6193471590550
0x9596d2dbb45bda301e640ac240c618bee6c85ec924071e5d96a0b9db6500cf9fRedeem40353342022-08-06 13:41:473 days 38 mins ago0x1777958b04aca4e0232b804d343e94d76a0927f7 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.7123173362140
0xed32dacdfb15b1b1e073dc37ae889f42c12f16d46f9916ec87f717ffd2f57908Redeem40342022022-08-06 11:54:533 days 2 hrs ago0x8717be49e08a00c3cc612b44a8a2e2a226fb442e IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619541500328 4,947.821749221
0xfc30f81bae8fe4a86bdff9ee122fb4156bf76ee19adda8c7d5e86ab371753be6Redeem40312192022-08-06 7:13:103 days 7 hrs ago0xc9901e5ddf38d4080572b859242cd199a7fae3d5 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.758559052866 4,947.457673449
0xbca590acd4c7f59ed7356c65328a89aa100f70bc0d5a17fdaf0c3462c1200fd2Redeem40301912022-08-06 5:36:053 days 8 hrs ago0x3d4807caedd93b94908987921cd07d11fc684ac8 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.7678310696760
0x26bcda12947c3d846e91a1eb3ced0b1d4311d8c8bebf97e1128f4e5d6f3b25c6Redeem40292362022-08-06 4:05:553 days 10 hrs ago0x5aeb0ee4b2a68848444176bd3e522810a224e35a IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.6193820085180
0x3f7d2d26ba44d3168a6656b4fc43f2996419f7e31119d40b82944f83dd3704c0Redeem40289052022-08-06 3:34:393 days 10 hrs ago0x6c1c46433fcc73d47d34822bfbbccecd279e4d8a IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619571696237 4,948.062901708
0xfe4279c65ed77e5c302f1adb3641d4a0a909e17de77960336c404535ee70b93aEnter40286902022-08-06 3:14:203 days 11 hrs ago0xc51128485f62ca6d485214fbfdab6c39bae7f0c5 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619365125139 4,948.072868265
0x952beed4e0d5b42433e6aa3b8f2f7afcae2b0481ebf4e6940d4c63c5452146ffRedeem40283352022-08-06 2:40:563 days 11 hrs ago0x56820bc4dcc9ae3dc589267c7736efb45c2a2265 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.6193872252740
0xba4770e0dba0e171b56f51e996f85beb79c65be5bc4fa6cca08ef04539d41d56Enter40278962022-08-06 1:59:323 days 12 hrs ago0x67d0aa9aaa2814816bec0450679e12851d541a89 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.940724734619 4,948.109777187
0xdfadebb9c497da1e39e445d4b92ffedb1681831cdc02e274e3d8d920a550893cRedeem40278892022-08-06 1:58:533 days 12 hrs ago0x67d0aa9aaa2814816bec0450679e12851d541a89 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.619636983205 4,948.110097705
0xc9eb6eaa8d0f1631168f621dd6781eb2e9556719391fd924d3f626a32df94f5fRedeem40276472022-08-06 1:36:033 days 12 hrs ago0x6a0a5c2e3c260b6cfc8324e54ce5eff5567be9d1 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.9450223718590
0xa0a84fc125c30c6b08986b152157a30d36b37edeaf0d7ef4de3ff273022b34a0Redeem40274162022-08-06 1:14:143 days 13 hrs ago0xe44d12ec951bdd1605246ccbc83d2dc552c00784 IN  0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a0588140 CRO0.7677915155490
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x1293a62f1765f32664af45376cf459670527471b81eefe655ae452da2806915d31561522022-06-09 15:47:5260 days 22 hrs ago 0x1b7007d8b0f4b0eada8c5c2fcedfa1c02a058814  Contract Creation0 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixLotto

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-06-09
*/

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/WitnetRandomness.sol


pragma solidity ^0.8.0;

contract WitnessRandomness {
    uint256 public globalNonce;

    constructor() {
        globalNonce = 0;
    }

    function random(
        uint32 _range,
        uint256 _nonce,
        uint256 _block
    ) external view returns (uint32) {
        return
            uint32(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            block.number,
                            block.timestamp,
                            block.difficulty,
                            _block,
                            _nonce,
                            globalNonce
                        )
                    )
                )
            ) % _range;
    }
}

// File: hardhat/console.sol


pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

// File: contracts/SafeMathInt.sol

/*
MIT License

Copyright (c) 2018 requestnetwork
Copyright (c) 2018 Fragments, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

pragma solidity ^0.8.0;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    /**
     * @dev Computes 2^exp with limited precision where -100 <= exp <= 100 * one
     * @param one 1.0 represented in the same fixed point number format as exp
     * @param exp The power to raise 2 to -100 <= exp <= 100 * one
     * @return 2^exp represented with same number of decimals after the point as one
     */
    function twoPower(int256 exp, int256 one) internal pure returns (int256) {
        bool reciprocal = false;
        if (exp < 0) {
            reciprocal = true;
            exp = abs(exp);
        }

        // Precomputed values for 2^(1/2^i) in 18 decimals fixed point numbers
        int256[5] memory ks = [
            int256(1414213562373095049),
            1189207115002721067,
            1090507732665257659,
            1044273782427413840,
            1021897148654116678
        ];
        int256 whole = div(exp, one);
        require(whole <= 100);
        int256 result = mul(int256(uint256(1) << uint256(whole)), one);
        int256 remaining = sub(exp, mul(whole, one));

        int256 current = div(one, 2);
        for (uint256 i = 0; i < 5; i++) {
            if (remaining >= current) {
                remaining = sub(remaining, current);
                result = div(mul(result, ks[i]), 10**18); // 10**18 to match hardcoded ks values
            }
            current = div(current, 2);
        }
        if (reciprocal) {
            result = div(mul(one, one), result);
        }
        return result;
    }
}
// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    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.
     */
    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`.
     */
    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.
     *
     * [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.
     */
    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.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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/utils/math/SafeMath.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/UFragments.sol

pragma solidity ^0.8.0;





/**
 * @title uFragments ERC20 token
 * @dev This is part of an implementation of the uFragments Ideal Money protocol.
 *      uFragments is a normal ERC20 token, but its supply can be adjusted by splitting and
 *      combining tokens proportionally across all wallets.
 *
 *      uFragment balances are internally represented with a hidden denomination, 'gons'.
 *      We support splitting the currency in expansion and combining the currency on contraction by
 *      changing the exchange rate between the hidden 'gons' and the public 'fragments'.
 */
contract UFragments is Ownable {
    // PLEASE READ BEFORE CHANGING ANY ACCOUNTING OR MATH
    // Anytime there is division, there is a risk of numerical instability from rounding errors. In
    // order to minimize this risk, we adhere to the following guidelines:
    // 1) The conversion rate adopted is the number of gons that equals 1 fragment.
    //    The inverse rate must not be used--TOTAL_GONS is always the numerator and _totalSupply is
    //    always the denominator. (i.e. If you want to convert gons to fragments instead of
    //    multiplying by the inverse rate, you should divide by the normal rate)
    // 2) Gon balances converted into Fragments are always rounded down (truncated).
    //
    // We make the following guarantees:
    // - If address 'A' transfers x Fragments to address 'B'. A's resulting external balance will
    //   be decreased by precisely x Fragments, and B's external balance will be precisely
    //   increased by x Fragments.
    //
    // We do not guarantee that the sum of all balances equals the result of calling totalSupply().
    // This is because, for any conversion function 'f()' that has non-zero rounding error,
    // f(x0) + f(x1) + ... + f(xn) is not always equal to f(x0 + x1 + ... xn).
    using SafeMath for uint256;
    using SafeMathInt for int256;

    event LogRebase(uint256 indexed epoch, uint256 totalSupply);
    event LogMonetaryPolicyUpdated(address monetaryPolicy);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    // Used for authentication
    address public monetaryPolicy;

    modifier onlyMonetaryPolicy() {
        require(msg.sender == monetaryPolicy);
        _;
    }

    bool private rebasePausedDeprecated;
    bool private tokenPausedDeprecated;

    modifier validRecipient(address to) {
        require(to != address(0x0));
        require(to != address(this));
        _;
    }

    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;

    uint256 private constant MAX_UINT256 = type(uint256).max;

    // TOTAL_GONS is a multiple of INITIAL_FRAGMENTS_SUPPLY so that _gonsPerFragment is an integer.
    // Use the highest value that fits in a uint256 for max granularity.
    uint256 private TOTAL_GONS;

    // MAX_SUPPLY = maximum integer < (sqrt(4*TOTAL_GONS + 1) - 1) / 2
    uint256 private constant MAX_SUPPLY = type(uint128).max; // (2^128) - 1

    uint256 internal _totalSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;

    // This is denominated in Fragments, because the gons-fragments conversion might change before
    // it's fully paid.
    mapping(address => mapping(address => uint256)) private _allowedFragments;

    // EIP-2612: permit – 712-signed approvals
    // https://eips.ethereum.org/EIPS/eip-2612
    string public constant EIP712_REVISION = "1";
    bytes32 public constant EIP712_DOMAIN =
        keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
        );

    // EIP-2612: keeps track of number of permits per address
    mapping(address => uint256) private _nonces;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals,
        uint256 _initialFragmentsSupply,
        address owner_
    ) {
        Ownable._transferOwnership(owner_);

        rebasePausedDeprecated = false;
        tokenPausedDeprecated = false;

        _totalSupply = _initialFragmentsSupply;
        TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % _initialFragmentsSupply);
        _gonBalances[DEAD] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        _name = name;
        _symbol = symbol;
        _decimals = decimals;

        emit Transfer(address(0x0), DEAD, _totalSupply);
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @param monetaryPolicy_ The address of the monetary policy contract to use for authentication.
     */
    function setMonetaryPolicy(address monetaryPolicy_) external onlyOwner {
        monetaryPolicy = monetaryPolicy_;
        emit LogMonetaryPolicyUpdated(monetaryPolicy_);
    }

    /**
     * @dev Notifies Fragments contract about a new rebase cycle.
     * @param supplyDelta The number of new fragment tokens to add into circulation via expansion.
     * @return The total number of fragments after the supply adjustment.
     */
    function _rebase(uint256 epoch, int256 supplyDelta)
        internal
        returns (uint256)
    {
        if (supplyDelta == 0) {
            emit LogRebase(epoch, _totalSupply);
            return _totalSupply;
        }

        supplyDelta = supplyDelta
            .mul(
                int256(_totalSupply).mul(10000000).div(
                    int256(_totalSupply.sub(_balanceOf(DEAD)))
                )
            )
            .div(10000000);

        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uint256(supplyDelta.abs()));
        } else {
            _totalSupply = _totalSupply.add(uint256(supplyDelta));
        }

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        // From this point forward, _gonsPerFragment is taken as the source of truth.
        // We recalculate a new _totalSupply to be in agreement with the _gonsPerFragment
        // conversion rate.
        // This means our applied supplyDelta can deviate from the requested supplyDelta,
        // but this deviation is guaranteed to be < (_totalSupply^2)/(TOTAL_GONS - _totalSupply).
        //
        // In the case of _totalSupply <= MAX_UINT128 (our current supply cap), this
        // deviation is guaranteed to be < 1, so we can omit this step. If the supply cap is
        // ever increased, it must be re-included.
        // _totalSupply = TOTAL_GONS.div(_gonsPerFragment)

        emit LogRebase(epoch, _totalSupply);
        return _totalSupply;
    }

    /**
     * @return The total number of fragments.
     */
    function totalSupply() external view returns (uint256) {
        return _totalSupplyInternal();
    }

    function _totalSupplyInternal() internal view returns (uint256) {
        return _totalSupply - _balanceOf(DEAD);
    }

    /**
     * @param who The address to query.
     * @return The balance of the specified address.
     */
    function balanceOf(address who) external view returns (uint256) {
        return _balanceOf(who);
    }

    function _balanceOf(address who) internal view returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    /**
     * @param who The address to query.
     * @return The gon balance of the specified address.
     */
    function scaledBalanceOf(address who) external view returns (uint256) {
        return _gonBalances[who];
    }

    /**
     * @return the total number of gons.
     */
    function scaledTotalSupply() external view returns (uint256) {
        return TOTAL_GONS;
    }

    /**
     * @return The number of successful permits by the specified address.
     */
    function nonces(address who) public view returns (uint256) {
        return _nonces[who];
    }

    /**
     * @return The computed DOMAIN_SEPARATOR to be used off-chain services
     *         which implement EIP-712.
     *         https://eips.ethereum.org/EIPS/eip-2612
     */
    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return
            keccak256(
                abi.encode(
                    EIP712_DOMAIN,
                    keccak256(bytes(_name)),
                    keccak256(bytes(EIP712_REVISION)),
                    chainId,
                    address(this)
                )
            );
    }

    /**
     * @dev tokens to a specified address.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     * @return True on success, false otherwise.
     */
    function transfer(address to, uint256 value)
        external
        validRecipient(to)
        returns (bool)
    {
        return _transfer(msg.sender, to, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal returns (bool) {
        uint256 gonValue = value.mul(_gonsPerFragment);

        _gonBalances[from] = _gonBalances[from].sub(gonValue);
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Transfer all of the sender's wallet balance to a specified address.
     * @param to The address to transfer to.
     * @return True on success, false otherwise.
     */
    function transferAll(address to)
        external
        validRecipient(to)
        returns (bool)
    {
        uint256 gonValue = _gonBalances[msg.sender];
        uint256 value = gonValue.div(_gonsPerFragment);

        delete _gonBalances[msg.sender];
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Function to check the amount of tokens that an owner has allowed to a spender.
     * @param owner_ The address which owns the funds.
     * @param spender The address which will spend the funds.
     * @return The number of tokens still available for the spender.
     */
    function allowance(address owner_, address spender)
        external
        view
        returns (uint256)
    {
        return _allowedFragments[owner_][spender];
    }

    /**
     * @dev Transfer tokens from one address to another.
     * @param from The address you want to send tokens from.
     * @param to The address you want to transfer to.
     * @param value The amount of tokens to be transferred.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external validRecipient(to) returns (bool) {
        _allowedFragments[from][msg.sender] = _allowedFragments[from][
            msg.sender
        ].sub(value);
        uint256 gonValue = value.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonValue);
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Transfer all balance tokens from one address to another.
     * @param from The address you want to send tokens from.
     * @param to The address you want to transfer to.
     */
    function transferAllFrom(address from, address to)
        external
        validRecipient(to)
        returns (bool)
    {
        uint256 gonValue = _gonBalances[from];
        uint256 value = gonValue.div(_gonsPerFragment);

        _allowedFragments[from][msg.sender] = _allowedFragments[from][
            msg.sender
        ].sub(value);

        delete _gonBalances[from];
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of
     * msg.sender. This method is included for ERC20 compatibility.
     * increaseAllowance and decreaseAllowance should be used instead.
     * Changing an allowance with this method brings the risk that someone may transfer both
     * the old and the new allowance - if they are both greater than zero - if a transfer
     * transaction is mined before the later approve() call is mined.
     *
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external returns (bool) {
        _allowedFragments[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner has allowed to a spender.
     * This method should be used instead of approve() to avoid the double approval vulnerability
     * described above.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][
            spender
        ].add(addedValue);

        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner has allowed to a spender.
     *
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool)
    {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        _allowedFragments[msg.sender][spender] = (subtractedValue >= oldValue)
            ? 0
            : oldValue.sub(subtractedValue);

        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Allows for approvals to be made via secp256k1 signatures.
     * @param owner The owner of the funds
     * @param spender The spender
     * @param value The amount
     * @param deadline The deadline timestamp, type(uint256).max for max deadline
     * @param v Signature param
     * @param s Signature param
     * @param r Signature param
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        require(block.timestamp <= deadline);

        uint256 ownerNonce = _nonces[owner];
        bytes32 permitDataDigest = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                value,
                ownerNonce,
                deadline
            )
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), permitDataDigest)
        );

        require(owner == ecrecover(digest, v, r, s));

        _nonces[owner] = ownerNonce.add(1);

        _allowedFragments[owner][spender] = value;
        emit Approval(owner, spender, value);
    }
}

// File: contracts/PhenixLotto.sol


pragma solidity ^0.8.0;








contract PhenixLotto is Ownable, AccessControl, UFragments, ReentrancyGuard {
    address public asset;
    address public multiplierNFT;
    bytes32 public constant DRAW_CALLER_ROLE = keccak256("DRAW_CALLER_ROLE");
    WitnessRandomness public immutable witnet;

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


    uint256 constant FXP_BASE = 1000000;
    uint256 constant DECIMALS = 18;

    uint256 public earlyWithdrawPenaltyTimeframeSeconds = 10 days;
    uint256 public earlyWithdrawPenaltyFXP = FXP_BASE * 15 / 100;
    address public earlyWithdrawPenaltyReceiver = DEAD;
    uint256 public ERC721MultiplierFXP = FXP_BASE * 101 / 100;
    uint256 public totalWinners = 10;
    uint256 public jackpotWinningRatioFXP = FXP_BASE * 80 / 100;
    uint256 public burnRatioFXP = FXP_BASE * 10 / 100;
    uint256 public totalBurnedTokens;
    uint256 public currentDrawIndex;
    uint256 public totalParticipants;

    bool public lottoEnabled;
    bool public multiplierNFTEnabled;

    struct Participant {
        uint256 totalRewards;
        uint256 lastDepositedAt;
        uint256 lastDepositAmount;
        uint256 lastWithdrawnAmount;
        uint256 lastClaimedAtBlock;
        uint256 entryTimestamp;
    }

    struct Winner {
        address winnerAddress;
        uint256 winnerAmount;
    }

    struct DrawResult {
        uint256 drawIndex;
        uint256 timestamp;
        uint256 prizePool;
        uint256 rebaseDelta;
        uint256 burnAmount;
        Seed seed;
        Winner[] winners;
    }

    struct Seed {
        uint256 noise;
        uint256 totalSupply;
        uint256 timestamp;
        uint256 difficulty;
        uint32 randomness;
    }

    mapping(address => Participant) public participantsMap;
    mapping(uint256 => DrawResult) public drawResults;
    mapping(address => bool) public participantIsActive;
    address[] participantsAddressArr;

    event Payout(address indexed winner, uint256 amount);
    event Draw(uint256 indexed drawNumber, uint256 indexed prizePool);

    modifier isValidParticipant() {
        require(participantIsActive[msg.sender] == true, "Participant is not active or valid");
        _;
    }

    modifier isLottoEnabled() {
        require(lottoEnabled == true, "Phenix Lotto Pool is not enabled!");
        _;
    }

    constructor(
        address _owner,
        address _asset,
        address _multiplierNFT
    )
        Ownable()
        ReentrancyGuard()
        UFragments(
            "Phenix Lotto Ticket",
            "PLOTTO",
            18,
            1 * 10**9 * 10**DECIMALS,
            _owner
        )
    {
        transferOwnership(_owner);
        _setupRole(DRAW_CALLER_ROLE, _owner);

        witnet = new WitnessRandomness();
        
        asset = _asset;
        multiplierNFT = _multiplierNFT;
    }

    receive() external payable {}

    function adminSetERC721MultiplierFXP(uint256 _ERC721MultiplierFXP)
        external
        onlyOwner
    {
        ERC721MultiplierFXP = _ERC721MultiplierFXP;
    }

    function adminSetEarlyWithdrawPenaltyFXP(
        uint256 _earlyWithdrawPenaltyFXP
    ) external onlyOwner {
        earlyWithdrawPenaltyFXP = _earlyWithdrawPenaltyFXP;
    }

    function adminMultiplierNFTEnabled(bool _multiplierNFTEnabled) external onlyOwner {
        multiplierNFTEnabled = _multiplierNFTEnabled;
    }

    function adminSetLottoEnabled(bool _lottoEnabled) external onlyOwner {
        lottoEnabled = _lottoEnabled;
    }

    function adminSetEarlyWithdrawPenaltyTimeframeSeconds(
        uint256 _earlyWithdrawPenaltyTimeframeSeconds
    ) external onlyOwner {
        earlyWithdrawPenaltyTimeframeSeconds = _earlyWithdrawPenaltyTimeframeSeconds;
    }

    function adminSetEarlyWithdrawPenaltyReceiver(
        address _earlyWithdrawPenaltyReceiver
    ) external onlyOwner {
        earlyWithdrawPenaltyReceiver = _earlyWithdrawPenaltyReceiver;
    }

    function adminSetMultiplierNft(address _multiplier_nft)
        external
        onlyOwner
    {
        multiplierNFT = _multiplier_nft;
    }

    function adminSetBurnRatio(uint256 _burnRatioFXP)
        external
        onlyOwner
    {
        require((burnRatioFXP + jackpotWinningRatioFXP) <= FXP_BASE, "New Burn ratio exceeds maximum allocation.");
        burnRatioFXP = _burnRatioFXP;
    }

    function adminSetJackpotWinningRatio(uint256 _jackpotWinningRatioFXP)
        external
        onlyOwner
    {
        require((burnRatioFXP + jackpotWinningRatioFXP) <= FXP_BASE, "New Jackpot ratio exceeds maximum allocation.");
        jackpotWinningRatioFXP = _jackpotWinningRatioFXP;
    }

    function adminSetTotalWinners(uint256 _totalWinners)
        external
        onlyOwner
    {
        totalWinners = _totalWinners;
    }

    function adminGrantDrawerRole(address _target)
        external
        onlyOwner
    {
        _grantRole(DRAW_CALLER_ROLE, _target);
    }

    function adminRevokeDrawerRole(address _target)
        external
        onlyOwner
    {
        _revokeRole(DRAW_CALLER_ROLE, _target);
    }

    function enter(uint256 _amount) external nonReentrant() isLottoEnabled() {
        address caller = _msgSender();
        _transfer(DEAD, caller, _amount);
        IERC20(asset).transferFrom(caller, address(this), _amount);
        participantsMap[caller].lastDepositedAt = block.timestamp;
        participantsMap[caller].lastDepositAmount += _amount;
        if (!participantIsActive[caller]) {
            totalParticipants = totalParticipants + 1;
            participantIsActive[caller] = true;
            participantsMap[caller].entryTimestamp = block.timestamp;
            participantsAddressArr.push(caller);
        }
    }

    function redeem(uint256 _amount) external nonReentrant() {
        address caller = _msgSender();
        uint256 amountToRedeem = _amount;
        uint256 penaltyAmount = 0;

        require(_amount <= _balanceOf(caller), "Not enough tickets to redeem amount.");
        
        if (
            block.timestamp - participantsMap[caller].entryTimestamp <
            earlyWithdrawPenaltyTimeframeSeconds
        ) {
            penaltyAmount =
                (amountToRedeem * earlyWithdrawPenaltyFXP) /
                FXP_BASE;
            amountToRedeem = amountToRedeem - penaltyAmount;
            IERC20(asset).transfer(owner(), penaltyAmount);      
        }

        IERC20(asset).transfer(caller, amountToRedeem);
        participantsMap[caller].lastWithdrawnAmount = amountToRedeem;
        participantsMap[caller].lastClaimedAtBlock = block.timestamp;

        _transfer(caller, DEAD, _amount);

        if (_balanceOf(caller) == 0) {
            participantIsActive[caller] = false;
            totalParticipants = totalParticipants - 1;
        }

    }


    function fetchDrawResult() external view returns(DrawResult memory) {
        Winner[] memory winningParticipants = new Winner[](totalWinners);
        uint8 curWinningTicketIndex = 0;
        uint24 curParticipantIndex = 0;
        uint256 curTicket = 1;
        uint256 curParticipantTicketStart;
        uint256 curParticipantTicketEnd;
        
        Seed memory drawSeed = _sourceDrawSeed();

        uint256[] memory winningTickets = draftWinningTickets(
            drawSeed
        );

        uint256 prizePool = IERC20(asset).balanceOf(address(this)) -
            _totalSupplyInternal();
        uint256 amountPerWinner = (((prizePool * jackpotWinningRatioFXP) / FXP_BASE) / totalWinners);
        uint256 burnAmount = (prizePool * burnRatioFXP) / FXP_BASE;
        uint256 totalAmountForParticipants = prizePool -
            (amountPerWinner *
            totalWinners) - burnAmount;

        while (curWinningTicketIndex < totalWinners) {
            curParticipantTicketStart = curTicket;
            curParticipantTicketEnd =
                curParticipantTicketStart +
                _countTicketsOf(participantsAddressArr[curParticipantIndex]);

            if (
                winningTickets[curWinningTicketIndex] >=
                curParticipantTicketStart &&
                winningTickets[curWinningTicketIndex] <= curParticipantTicketEnd
            ) {
                winningParticipants[curWinningTicketIndex] = Winner(participantsAddressArr[
                    curParticipantIndex
                ], amountPerWinner);
                curWinningTicketIndex++;
            } else {
                curParticipantIndex++;
                curTicket = curParticipantTicketEnd;
            }
        }
        DrawResult memory result = DrawResult(currentDrawIndex, block.timestamp, prizePool, totalAmountForParticipants, burnAmount, drawSeed, winningParticipants);
        return result;
    }

    function _sourceDrawSeed() internal view returns(Seed memory) {
        return Seed(
            participantsAddressArr.length,
            _countTotalTickets(),
            block.timestamp,
            block.difficulty,
            witnet.random(type(uint32).max, 0, block.number)
        );
    }

    function getLastDrawSeed() public view returns (Seed memory) {
        require(currentDrawIndex > 0, "No draws have been made.");
        return drawResults[currentDrawIndex - 1].seed;
    }

    function getDrawResultWinners(uint256 _drawIndex) public view returns(Winner[] memory) {
        return drawResults[_drawIndex].winners;
    }

    function draftWinningTickets(
        Seed memory _seed
    ) public view returns (uint256[] memory) {
        require(
            _seed.totalSupply >= totalWinners,
            "not enough tickets to generate winners"
        );

        // uint32 randomness = witnet.random(type(uint32).max, 0, block.number);
        uint256[] memory winningTickets = new uint256[](totalWinners);
        uint256 iteration = 0;
        uint256 numbersChosen = 0;
        while (numbersChosen < totalWinners) {
            iteration++;
            uint256 N = uint256(
                keccak256(
                    abi.encodePacked(
                        iteration,
                        _seed.noise,
                        _seed.totalSupply,
                        _seed.timestamp,
                        _seed.difficulty,
                        _seed.randomness
                    )
                )
            ) % (_seed.totalSupply + 1);
            bool isDuplicate = false;
            for (uint256 i = 0; i < winningTickets.length; i++) {
                if (N == winningTickets[i]) {
                    isDuplicate = true;
                    break;
                }
            }
            if (isDuplicate) {
                continue;
            }
            winningTickets[numbersChosen] = N;
            numbersChosen++;
        }

        for (uint256 i = 0; i < winningTickets.length; i++) {
            for (uint256 j = 0; j < winningTickets.length; j++) {
                if (winningTickets[i] < winningTickets[j]) {
                    uint256 tmp = winningTickets[j];
                    winningTickets[j] = winningTickets[i];
                    winningTickets[i] = tmp;
                }
            }
        }

        return winningTickets;
    }

    function ticketsOf(address who) external view returns (uint256) {
        return _countTicketsOf(who);
    }

    function totalTickets() external view returns (uint256) {
        return _countTotalTickets();
    }

    function _countTotalTickets() internal view returns (uint256) {
        uint256 tickets = 0;
        for (uint256 i = 0; i < participantsAddressArr.length; i++) {
            tickets += _countTicketsOf(participantsAddressArr[i]);
        }
        return tickets;
    }

    function _countTicketsOf(address who) internal view returns (uint256) {
        uint256 tmpLTs = _balanceOf(who);
        if(multiplierNFTEnabled) {
            uint256 tmpLMs = IERC721(multiplierNFT).balanceOf(who);
            if(tmpLMs == 0) {
                return tmpLTs;
            }
            return tmpLTs * (((ERC721MultiplierFXP - FXP_BASE) * tmpLMs) + FXP_BASE) / FXP_BASE;
        } else {
            return tmpLTs;
        }

    }

    function distributeDraw(
        DrawResult calldata _drawResult
    ) external onlyRole(DRAW_CALLER_ROLE) {
        for (uint256 i = 0; i < _drawResult.winners.length; i++) {
            IERC20(asset).transfer(_drawResult.winners[i].winnerAddress, _drawResult.winners[i].winnerAmount);
            participantsMap[_drawResult.winners[i].winnerAddress].totalRewards =
                 participantsMap[_drawResult.winners[i].winnerAddress].totalRewards + _drawResult.winners[i].winnerAmount;
            emit Payout(_drawResult.winners[i].winnerAddress, _drawResult.winners[i].winnerAmount);
        }

        // Rebase Supply
        _rebase(block.number, int256(_drawResult.rebaseDelta));

        // Burn Asset Token Allocation
        if(_drawResult.burnAmount > 0) {
            IERC20(asset).transfer(DEAD, _drawResult.burnAmount);
            totalBurnedTokens = totalBurnedTokens + _drawResult.burnAmount;
        }

        // Update Draws Mapping
        drawResults[currentDrawIndex] = _drawResult;

        emit Draw(currentDrawIndex, _drawResult.prizePool); 
        currentDrawIndex++;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_multiplierNFT","type":"address"}],"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":"uint256","name":"drawNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prizePool","type":"uint256"}],"name":"Draw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"monetaryPolicy","type":"address"}],"name":"LogMonetaryPolicyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Payout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRAW_CALLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC721MultiplierFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"adminGrantDrawerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_multiplierNFTEnabled","type":"bool"}],"name":"adminMultiplierNFTEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"adminRevokeDrawerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnRatioFXP","type":"uint256"}],"name":"adminSetBurnRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ERC721MultiplierFXP","type":"uint256"}],"name":"adminSetERC721MultiplierFXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyWithdrawPenaltyFXP","type":"uint256"}],"name":"adminSetEarlyWithdrawPenaltyFXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_earlyWithdrawPenaltyReceiver","type":"address"}],"name":"adminSetEarlyWithdrawPenaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_earlyWithdrawPenaltyTimeframeSeconds","type":"uint256"}],"name":"adminSetEarlyWithdrawPenaltyTimeframeSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jackpotWinningRatioFXP","type":"uint256"}],"name":"adminSetJackpotWinningRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_lottoEnabled","type":"bool"}],"name":"adminSetLottoEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multiplier_nft","type":"address"}],"name":"adminSetMultiplierNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalWinners","type":"uint256"}],"name":"adminSetTotalWinners","outputs":[],"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRatioFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDrawIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"},{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"winners","type":"tuple[]"}],"internalType":"struct PhenixLotto.DrawResult","name":"_drawResult","type":"tuple"}],"name":"distributeDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"_seed","type":"tuple"}],"name":"draftWinningTickets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"drawResults","outputs":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyWithdrawPenaltyTimeframeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fetchDrawResult","outputs":[{"components":[{"internalType":"uint256","name":"drawIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256","name":"rebaseDelta","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"seed","type":"tuple"},{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"winners","type":"tuple[]"}],"internalType":"struct PhenixLotto.DrawResult","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_drawIndex","type":"uint256"}],"name":"getDrawResultWinners","outputs":[{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"winnerAmount","type":"uint256"}],"internalType":"struct PhenixLotto.Winner[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastDrawSeed","outputs":[{"components":[{"internalType":"uint256","name":"noise","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint32","name":"randomness","type":"uint32"}],"internalType":"struct PhenixLotto.Seed","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jackpotWinningRatioFXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monetaryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplierNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplierNFTEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","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":[{"internalType":"address","name":"","type":"address"}],"name":"participantIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participantsMap","outputs":[{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"lastDepositedAt","type":"uint256"},{"internalType":"uint256","name":"lastDepositAmount","type":"uint256"},{"internalType":"uint256","name":"lastWithdrawnAmount","type":"uint256"},{"internalType":"uint256","name":"lastClaimedAtBlock","type":"uint256"},{"internalType":"uint256","name":"entryTimestamp","type":"uint256"}],"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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"scaledBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaledTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"monetaryPolicy_","type":"address"}],"name":"setMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"ticketsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferAllFrom","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"witnet","outputs":[{"internalType":"contract WitnessRandomness","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052620d2f0060105560646200001d620f4240600f62000726565b6200002991906200060a565b601155601280546001600160a01b03191661dead179055606462000052620f4240606562000726565b6200005e91906200060a565b601355600a601455606462000078620f4240605062000726565b6200008491906200060a565b601555606462000099620f4240600a62000726565b620000a591906200060a565b601655348015620000b557600080fd5b5060405162004a6438038062004a64833981016040819052620000d891620005c0565b6040518060400160405280601381526020017f5068656e6978204c6f74746f205469636b65740000000000000000000000000081525060405180604001604052806006815260200165504c4f54544f60d01b815250601280600a6200013e91906200066a565b6200014e90633b9aca0062000726565b866200015a336200031b565b62000170816200031b60201b62002cbb1760201c565b6002805461ffff60a01b19169055600482905562000191826000196200079f565b6200019f9060001962000748565b600381905561dead600052600660209081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e22829055600454620001ed929162002d0b6200036b821b17901c565b600555845162000205906009906020880190620004ef565b5083516200021b90600a906020870190620004ef565b50600b805460ff191660ff851617905560045460405190815261dead906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506001600c55506200027f915084905062000382565b620002ab7fd8858e8e1664cbc67331ed60d855ac6de277d6d376c33d6c92ffec58365248718462000457565b604051620002b9906200057e565b604051809103906000f080158015620002d6573d6000803e3d6000fd5b5060601b6001600160601b031916608052600d80546001600160a01b03199081166001600160a01b0394851617909155600e80549091169190921617905550620007e2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006200037982846200060a565b90505b92915050565b6000546001600160a01b03163314620003e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620004495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620003d9565b62000454816200031b565b50565b62000463828262000467565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620004635760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b828054620004fd9062000762565b90600052602060002090601f0160209004810192826200052157600085556200056c565b82601f106200053c57805160ff19168380011785556200056c565b828001600101855582156200056c579182015b828111156200056c5782518255916020019190600101906200054f565b506200057a9291506200058c565b5090565b6101aa80620048ba83390190565b5b808211156200057a57600081556001016200058d565b80516001600160a01b0381168114620005bb57600080fd5b919050565b600080600060608486031215620005d657600080fd5b620005e184620005a3565b9250620005f160208501620005a3565b91506200060160408501620005a3565b90509250925092565b6000826200061c576200061c620007cc565b500490565b600181815b8085111562000662578160001904821115620006465762000646620007b6565b808516156200065457918102915b93841c939080029062000626565b509250929050565b600062000379838360008262000683575060016200037c565b8162000692575060006200037c565b8160018114620006ab5760028114620006b657620006d6565b60019150506200037c565b60ff841115620006ca57620006ca620007b6565b50506001821b6200037c565b5060208310610133831016604e8410600b8410161715620006fb575081810a6200037c565b62000707838362000621565b80600019048211156200071e576200071e620007b6565b029392505050565b6000816000190483118215151615620007435762000743620007b6565b500290565b6000828210156200075d576200075d620007b6565b500390565b600181811c908216806200077757607f821691505b602082108114156200079957634e487b7160e01b600052602260045260246000fd5b50919050565b600082620007b157620007b1620007cc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c6140b262000808600039600081816107320152612fce01526140b26000f3fe60806040526004361061042a5760003560e01c80638b5a6a0811610229578063cf558d891161012e578063dc687166116100b6578063ea2ea0851161007a578063ea2ea08514610d7e578063f2fde38b14610e1f578063f53c1a5814610e3f578063f54494b614610e61578063ff23f7c114610e8157600080fd5b8063dc68716614610cb5578063dd11247e14610ccf578063dd62ed3e14610ce4578063e1b11da414610d2a578063e5925b4214610d5e57600080fd5b8063d547741f116100fd578063d547741f14610c1f578063d85e4d2514610c3f578063da0933ac14610c5f578063da48baf414610c75578063db006a7514610c9557600080fd5b8063cf558d8914610b93578063cf61598f14610bb3578063d45e347e14610bd2578063d505accf14610bff57600080fd5b8063a457c2d7116101b1578063a9059cbb11610180578063a9059cbb14610afb578063b1bf962d14610b1b578063bcc941b614610b30578063c6dab81014610b46578063ceebf41c14610b7357600080fd5b8063a457c2d714610a6b578063a59f3e0c14610a8b578063a718486b14610aab578063a74d676514610adb57600080fd5b806395d89b41116101f857806395d89b41146109eb5780639bb3393c14610a00578063a217fddf14610a20578063a26dbf2614610a35578063a3a7e7f314610a4b57600080fd5b80638b5a6a081461096d5780638da5cb5b1461098d5780638e27d7d7146109ab57806391d14854146109cb57600080fd5b806338d52e0f1161032f5780636f7d4948116102b7578063740b9ba811610286578063740b9ba8146108b457806378160376146108ca5780637c7dfd84146108f75780637ecebe001461091757806384d4b4101461094d57600080fd5b80636f7d494814610853578063701863f91461086957806370a082311461087f578063715018a61461089f57600080fd5b8063555f323a116102fe578063555f323a146107d15780635c527f6b146107e75780635e9313d3146108075780636653493d14610827578063665921491461083d57600080fd5b806338d52e0f146106c8578063395093511461070057806346d1d21a14610720578063537a0c621461075457600080fd5b80632593f3b8116103b257806330adf81f1161038157806330adf81f1461061d578063313ce5671461065157806331657926146106735780633644e5151461069357806336568abe146106a857600080fd5b80632593f3b81461059b57806327bedfb3146105bb5780632f2ff15d146105db5780632f440730146105fb57600080fd5b806318160ddd116103f957806318160ddd146104dd5780631da24f3e146104f257806322099b011461052857806323b872dd1461054a578063248a9ca31461056a57600080fd5b806301ffc9a71461043657806306fdde031461046b578063095ea7b31461048d5780630f53c056146104ad57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061045661045136600461373c565b610ea1565b60405190151581526020015b60405180910390f35b34801561047757600080fd5b50610480610ed8565b6040516104629190613a28565b34801561049957600080fd5b506104566104a8366004613698565b610f6a565b3480156104b957600080fd5b506104cf60008051602061401d83398151915281565b604051908152602001610462565b3480156104e957600080fd5b506104cf610fc4565b3480156104fe57600080fd5b506104cf61050d36600461358a565b6001600160a01b031660009081526006602052604090205490565b34801561053457600080fd5b50610548610543366004613766565b610fd3565b005b34801561055657600080fd5b506104566105653660046135e0565b6113a3565b34801561057657600080fd5b506104cf6105853660046136fe565b6000908152600160208190526040909120015490565b3480156105a757600080fd5b506105486105b636600461358a565b6114dd565b3480156105c757600080fd5b506105486105d63660046136fe565b61152b565b3480156105e757600080fd5b506105486105f6366004613717565b6115d2565b34801561060757600080fd5b506106106115fd565b6040516104629190613a90565b34801561062957600080fd5b506104cf7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561065d57600080fd5b50600b5460405160ff9091168152602001610462565b34801561067f57600080fd5b506104cf61068e36600461358a565b6118f9565b34801561069f57600080fd5b506104cf611904565b3480156106b457600080fd5b506105486106c3366004613717565b6119b9565b3480156106d457600080fd5b50600d546106e8906001600160a01b031681565b6040516001600160a01b039091168152602001610462565b34801561070c57600080fd5b5061045661071b366004613698565b611a37565b34801561072c57600080fd5b506106e87f000000000000000000000000000000000000000000000000000000000000000081565b34801561076057600080fd5b506107a461076f36600461358a565b601b60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610462565b3480156107dd57600080fd5b506104cf60175481565b3480156107f357600080fd5b506105486108023660046136fe565b611aaa565b34801561081357600080fd5b50600e546106e8906001600160a01b031681565b34801561083357600080fd5b506104cf60115481565b34801561084957600080fd5b506104cf60155481565b34801561085f57600080fd5b506104cf60105481565b34801561087557600080fd5b506104cf60135481565b34801561088b57600080fd5b506104cf61089a36600461358a565b611ad9565b3480156108ab57600080fd5b50610548611ae4565b3480156108c057600080fd5b506104cf60185481565b3480156108d657600080fd5b50610480604051806040016040528060018152602001603160f81b81525081565b34801561090357600080fd5b506105486109123660046136c4565b611b1a565b34801561092357600080fd5b506104cf61093236600461358a565b6001600160a01b031660009081526008602052604090205490565b34801561095957600080fd5b506104566109683660046135a7565b611b57565b34801561097957600080fd5b5061054861098836600461358a565b611c67565b34801561099957600080fd5b506000546001600160a01b03166106e8565b3480156109b757600080fd5b506002546106e8906001600160a01b031681565b3480156109d757600080fd5b506104566109e6366004613717565b611ce5565b3480156109f757600080fd5b50610480611d10565b348015610a0c57600080fd5b50610548610a1b36600461358a565b611d1f565b348015610a2c57600080fd5b506104cf600081565b348015610a4157600080fd5b506104cf60195481565b348015610a5757600080fd5b50610456610a6636600461358a565b611d61565b348015610a7757600080fd5b50610456610a86366004613698565b611e31565b348015610a9757600080fd5b50610548610aa63660046136fe565b611ec1565b348015610ab757600080fd5b50610456610ac636600461358a565b601d6020526000908152604090205460ff1681565b348015610ae757600080fd5b50610548610af636600461358a565b6120fd565b348015610b0757600080fd5b50610456610b16366004613698565b612149565b348015610b2757600080fd5b506003546104cf565b348015610b3c57600080fd5b506104cf60145481565b348015610b5257600080fd5b50610b66610b613660046136fe565b612188565b6040516104629190613995565b348015610b7f57600080fd5b506012546106e8906001600160a01b031681565b348015610b9f57600080fd5b50610548610bae3660046136fe565b612213565b348015610bbf57600080fd5b50601a5461045690610100900460ff1681565b348015610bde57600080fd5b50610bf2610bed3660046137a2565b612242565b60405161046291906139f0565b348015610c0b57600080fd5b50610548610c1a366004613621565b612520565b348015610c2b57600080fd5b50610548610c3a366004613717565b6126d7565b348015610c4b57600080fd5b50610548610c5a36600461358a565b6126fd565b348015610c6b57600080fd5b506104cf60165481565b348015610c8157600080fd5b50610548610c903660046136fe565b612749565b348015610ca157600080fd5b50610548610cb03660046136fe565b6127ed565b348015610cc157600080fd5b50601a546104569060ff1681565b348015610cdb57600080fd5b506104cf612ab2565b348015610cf057600080fd5b506104cf610cff3660046135a7565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610d3657600080fd5b506104cf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b348015610d6a57600080fd5b50610548610d793660046136fe565b612abc565b348015610d8a57600080fd5b50610e0d610d993660046136fe565b601c6020908152600091825260409182902080546001820154600283015460038401546004850154875160a081018952600587015481526006870154978101979097526007860154978701979097526008850154606087015260099094015463ffffffff1660808601529194909391929186565b60405161046296959493929190613b4b565b348015610e2b57600080fd5b50610548610e3a36600461358a565b612aeb565b348015610e4b57600080fd5b50610e54612b83565b6040516104629190613b3d565b348015610e6d57600080fd5b50610548610e7c3660046136fe565b612c48565b348015610e8d57600080fd5b50610548610e9c3660046136c4565b612c77565b60006001600160e01b03198216637965db0b60e01b1480610ed257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060098054610ee790613dfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1390613dfc565b8015610f605780601f10610f3557610100808354040283529160200191610f60565b820191906000526020600020905b815481529060010190602001808311610f4357829003601f168201915b5050505050905090565b3360008181526007602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061405d83398151915290610fb39086815260200190565b60405180910390a350600192915050565b6000610fce612d1e565b905090565b60008051602061401d833981519152610feb81612d38565b60005b610ffc610140840184613b87565b905081101561127e57600d546001600160a01b031663a9059cbb611024610140860186613b87565b8481811061103457611034613eec565b61104a926020604090920201908101915061358a565b611058610140870187613b87565b8581811061106857611068613eec565b905060400201602001356040518363ffffffff1660e01b81526004016110a39291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906136e1565b50611104610140840184613b87565b8281811061111457611114613eec565b90506040020160200135601b6000858061014001906111339190613b87565b8581811061114357611143613eec565b611159926020604090920201908101915061358a565b6001600160a01b0316815260208101919091526040016000205461117d9190613bd8565b601b600061118f610140870187613b87565b8581811061119f5761119f613eec565b6111b5926020604090920201908101915061358a565b6001600160a01b031681526020810191909152604001600020556111dd610140840184613b87565b828181106111ed576111ed613eec565b611203926020604090920201908101915061358a565b6001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a661123b610140860186613b87565b8481811061124b5761124b613eec565b9050604002016020013560405161126491815260200190565b60405180910390a28061127681613e54565b915050610fee565b5061128d438360600135612d42565b5060808201351561133857600d5460405163a9059cbb60e01b815261dead6004820152608084013560248201526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156112e957600080fd5b505af11580156112fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132191906136e1565b5081608001356017546113349190613bd8565b6017555b6018546000908152601c6020526040902082906113558282613f18565b5050601854604080519084013591907f2dc14f7487788ddd321b39fd8256f7f77b4a99e1837268540d1f9da7665d7fb390600090a36018805490600061139a83613e54565b91905055505050565b6000826001600160a01b0381166113b957600080fd5b6001600160a01b0381163014156113cf57600080fd5b6001600160a01b03851660009081526007602090815260408083203384529091529020546113fd9084612e70565b6001600160a01b0386166000908152600760209081526040808320338452909152812091909155600554611432908590612e7c565b6001600160a01b0387166000908152600660205260409020549091506114589082612e70565b6001600160a01b0380881660009081526006602052604080822093909355908716815220546114879082612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99088815260200190565b60405180910390a350600195945050505050565b6000546001600160a01b031633146115105760405162461bcd60e51b815260040161150790613a5b565b60405180910390fd5b61152860008051602061401d83398151915282612e94565b50565b6000546001600160a01b031633146115555760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546115699190613bd8565b11156115cd5760405162461bcd60e51b815260206004820152602d60248201527f4e6577204a61636b706f7420726174696f2065786365656473206d6178696d7560448201526c369030b63637b1b0ba34b7b71760991b6064820152608401611507565b601555565b600082815260016020819052604090912001546115ee81612d38565b6115f88383612efb565b505050565b611605613512565b600060145467ffffffffffffffff81111561162257611622613f02565b60405190808252806020026020018201604052801561166757816020015b60408051808201909152600080825260208201528152602001906001900390816116405790505b509050600080600181808061167a612f66565b9050600061168782612242565b90506000611693612d1e565b600d546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116d657600080fd5b505afa1580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190613818565b6117189190613cd6565b90506000601454620f4240601554846117319190613cb7565b61173b9190613c1e565b6117459190613c1e565b90506000620f42406016548461175b9190613cb7565b6117659190613c1e565b9050600081601454846117789190613cb7565b6117829086613cd6565b61178c9190613cd6565b90505b6014548b60ff1610156118b6578897506117d4601e8b62ffffff16815481106117ba576117ba613eec565b6000918252602090912001546001600160a01b0316613055565b6117de9089613bd8565b965087858c60ff16815181106117f6576117f6613eec565b602002602001015110158015611828575086858c60ff168151811061181d5761181d613eec565b602002602001015111155b156118a1576040518060400160405280601e8c62ffffff168154811061185057611850613eec565b600091825260209182902001546001600160a01b03168252018490528c518d9060ff8e1690811061188357611883613eec565b60200260200101819052508a8061189990613e6f565b9b505061178f565b896118ab81613e31565b9a505086985061178f565b6040805160e081018252601854815242602082015290810194909452606084015260808301525060a08101929092525060c0810196909652509395945050505050565b6000610ed282613055565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600960405161193a9190613884565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b6001600160a01b0381163314611a295760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611507565b611a338282612e94565b5050565b3360009081526007602090815260408083206001600160a01b0386168452909152812054611a659083612e88565b3360008181526007602090815260408083206001600160a01b0389168085529083529281902085905551938452909260008051602061405d8339815191529101610fb3565b6000546001600160a01b03163314611ad45760405162461bcd60e51b815260040161150790613a5b565b601355565b6000610ed28261313f565b6000546001600160a01b03163314611b0e5760405162461bcd60e51b815260040161150790613a5b565b611b186000612cbb565b565b6000546001600160a01b03163314611b445760405162461bcd60e51b815260040161150790613a5b565b601a805460ff1916911515919091179055565b6000816001600160a01b038116611b6d57600080fd5b6001600160a01b038116301415611b8357600080fd5b6001600160a01b038416600090815260066020526040812054600554909190611bad908390612d0b565b6001600160a01b0387166000908152600760209081526040808320338452909152902054909150611bde9082612e70565b6001600160a01b038088166000818152600760209081526040808320338452825280832095909555918152600690915282812081905590871681522054611c259083612e88565b6001600160a01b03808716600081815260066020526040908190209390935591519088169060008051602061403d833981519152906114c99085815260200190565b6000546001600160a01b03163314611c915760405162461bcd60e51b815260040161150790613a5b565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e6961f1a1afb87eaf51fd64f22ddc10062e23aa7838eac5d0bdf140bfd389729060200160405180910390a150565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a8054610ee790613dfc565b6000546001600160a01b03163314611d495760405162461bcd60e51b815260040161150790613a5b565b61152860008051602061401d83398151915282612efb565b6000816001600160a01b038116611d7757600080fd5b6001600160a01b038116301415611d8d57600080fd5b33600090815260066020526040812054600554909190611dae908390612d0b565b336000908152600660205260408082208290556001600160a01b0388168252902054909150611ddd9083612e88565b6001600160a01b03861660008181526006602052604090819020929092559051339060008051602061403d83398151915290611e1c9085815260200190565b60405180910390a36001935050505b50919050565b3360009081526007602090815260408083206001600160a01b038616845290915281205480831015611e6c57611e678184612e70565b611e6f565b60005b3360008181526007602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061405d833981519152910160405180910390a35060019392505050565b6002600c541415611f145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55601a5460ff161515600114611f7a5760405162461bcd60e51b815260206004820152602160248201527f5068656e6978204c6f74746f20506f6f6c206973206e6f7420656e61626c65646044820152602160f81b6064820152608401611507565b33611f8861dead8284613167565b50600d546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b158015611fdd57600080fd5b505af1158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201591906136e1565b506001600160a01b0381166000908152601b602052604081204260018201556002018054849290612047908490613bd8565b90915550506001600160a01b0381166000908152601d602052604090205460ff166120f45760195461207a906001613bd8565b6019556001600160a01b0381166000818152601d60209081526040808320805460ff19166001908117909155601b909252822042600590910155601e805491820181559091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b03191690911790555b50506001600c55565b6000546001600160a01b031633146121275760405162461bcd60e51b815260040161150790613a5b565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03811661215f57600080fd5b6001600160a01b03811630141561217557600080fd5b612180338585613167565b949350505050565b6060601c6000838152602001908152602001600020600a01805480602002602001604051908101604052809291908181526020016000905b82821015612208576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016121c0565b505050509050919050565b6000546001600160a01b0316331461223d5760405162461bcd60e51b815260040161150790613a5b565b601455565b6060601454826020015110156122a95760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768207469636b65747320746f2067656e65726174652077604482015265696e6e65727360d01b6064820152608401611507565b600060145467ffffffffffffffff8111156122c6576122c6613f02565b6040519080825280602002602001820160405280156122ef578160200160208202803683370190505b5090506000805b601454811015612428578161230a81613e54565b9250506000856020015160016123209190613bd8565b86516020808901516040808b015160608c015160808d0151925161237a968b969095949101958652602086019490945260408501929092526060840152608083015260e01b6001600160e01b03191660a082015260a40190565b6040516020818303038152906040528051906020012060001c61239d9190613e8f565b90506000805b85518110156123e8578581815181106123be576123be613eec565b60200260200101518314156123d657600191506123e8565b806123e081613e54565b9150506123a3565b5080156123f65750506122f6565b8185848151811061240957612409613eec565b60209081029190910101528261241e81613e54565b93505050506122f6565b60005b83518110156125165760005b84518110156125035784818151811061245257612452613eec565b602002602001015185838151811061246c5761246c613eec565b602002602001015110156124f157600085828151811061248e5761248e613eec565b602002602001015190508583815181106124aa576124aa613eec565b60200260200101518683815181106124c4576124c4613eec565b602002602001018181525050808684815181106124e3576124e3613eec565b602002602001018181525050505b806124fb81613e54565b915050612437565b508061250e81613e54565b91505061242b565b5091949350505050565b8342111561252d57600080fd5b6001600160a01b0387811660008181526008602090815260408083205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a0840185905260c08085018a90528151808603909101815260e090940190528251920191909120906125b8611904565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015612640573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b03161461266757600080fd5b612672836001612e88565b6001600160a01b038b811660008181526008602090815260408083209590955560078152848220938e16808352938152908490208c905592518b81529192909160008051602061405d833981519152910160405180910390a350505050505050505050565b600082815260016020819052604090912001546126f381612d38565b6115f88383612e94565b6000546001600160a01b031633146127275760405162461bcd60e51b815260040161150790613a5b565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146127735760405162461bcd60e51b815260040161150790613a5b565b620f42406015546016546127879190613bd8565b11156127e85760405162461bcd60e51b815260206004820152602a60248201527f4e6577204275726e20726174696f2065786365656473206d6178696d756d2061604482015269363637b1b0ba34b7b71760b11b6064820152608401611507565b601655565b6002600c5414156128405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611507565b6002600c55338160006128528361313f565b8411156128ad5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768207469636b65747320746f2072656465656d20616d6f6044820152633ab73a1760e11b6064820152608401611507565b6010546001600160a01b0384166000908152601b60205260409020600501546128d69042613cd6565b10156129ac57620f4240601154836128ee9190613cb7565b6128f89190613c1e565b90506129048183613cd6565b600d549092506001600160a01b031663a9059cbb61292a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561297257600080fd5b505af1158015612986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129aa91906136e1565b505b600d5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b1580156129fa57600080fd5b505af1158015612a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3291906136e1565b506001600160a01b0383166000908152601b602052604090206003810183905542600490910155612a668361dead86613167565b50612a708361313f565b612aa7576001600160a01b0383166000908152601d60205260409020805460ff19169055601954612aa390600190613cd6565b6019555b50506001600c555050565b6000610fce613229565b6000546001600160a01b03163314612ae65760405162461bcd60e51b815260040161150790613a5b565b601055565b6000546001600160a01b03163314612b155760405162461bcd60e51b815260040161150790613a5b565b6001600160a01b038116612b7a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611507565b61152881612cbb565b612b8b613555565b600060185411612bdd5760405162461bcd60e51b815260206004820152601860248201527f4e6f2064726177732068617665206265656e206d6164652e00000000000000006044820152606401611507565b601c60006001601854612bf09190613cd6565b81526020808201929092526040908101600020815160a08101835260058201548152600682015493810193909352600781015491830191909152600881015460608301526009015463ffffffff166080820152919050565b6000546001600160a01b03163314612c725760405162461bcd60e51b815260040161150790613a5b565b601155565b6000546001600160a01b03163314612ca15760405162461bcd60e51b815260040161150790613a5b565b601a80549115156101000261ff0019909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612d178284613c1e565b9392505050565b6000612d2b61dead61313f565b600454610fce9190613cd6565b611528813361326c565b600081612d8e57827f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2600454604051612d7d91815260200190565b60405180910390a250600454610ed2565b612dcf62989680612dc2612dc8612db2612da961dead61313f565b60045490612e70565b600454612dc290629896806132d0565b90613322565b85906132d0565b91506000821215612dee57612de6612da98361334c565b600455612dff565b600454612dfb9083612e88565b6004555b6004546001600160801b031015612e1c576001600160801b036004555b600454600354612e2b91612d0b565b60055560045460405190815283907f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29060200160405180910390a25060045492915050565b6000612d178284613cd6565b6000612d178284613cb7565b6000612d178284613bd8565b612e9e8282611ce5565b15611a335760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b612f058282611ce5565b611a335760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b612f6e613555565b6040805160a08101909152601e54815260208101612f8a613229565b815242602082015244604080830191909152516324cbbfc160e01b815263ffffffff6004820152600060248201524360448201526060909101906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324cbbfc19060640160206040518083038186803b15801561301057600080fd5b505afa158015613024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130489190613831565b63ffffffff169052919050565b6000806130618361313f565b601a54909150610100900460ff1615610ed257600e546040516370a0823160e01b81526001600160a01b03858116600483015260009216906370a082319060240160206040518083038186803b1580156130ba57600080fd5b505afa1580156130ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f29190613818565b905080613100575092915050565b620f42408082620f42406013546131179190613cd6565b6131219190613cb7565b61312b9190613bd8565b6131359084613cb7565b6121809190613c1e565b6005546001600160a01b0382166000908152600660205260408120549091610ed29190612d0b565b60008061317f60055484612e7c90919063ffffffff16565b6001600160a01b0386166000908152600660205260409020549091506131a59082612e70565b6001600160a01b0380871660009081526006602052604080822093909355908616815220546131d49082612e88565b6001600160a01b03808616600081815260066020526040908190209390935591519087169060008051602061403d833981519152906132169087815260200190565b60405180910390a3506001949350505050565b600080805b601e54811015611e2b5761324e601e82815481106117ba576117ba613eec565b6132589083613bd8565b91508061326481613e54565b91505061322e565b6132768282611ce5565b611a335761328e816001600160a01b03166014613376565b613299836020613376565b6040516020016132aa929190613920565b60408051601f198184030181529082905262461bcd60e51b825261150791600401613a28565b6000806132dd8385613c32565b9050600160ff1b811415806132fb5750600160ff1b84811690841614155b61330457600080fd5b8215806133195750836133178483613bf0565b145b612d1757600080fd5b6000816000191415806133395750600160ff1b8314155b61334257600080fd5b612d178284613bf0565b6000600160ff1b82141561335f57600080fd5b6000821261336d5781610ed2565b610ed282613ea3565b60606000613385836002613cb7565b613390906002613bd8565b67ffffffffffffffff8111156133a8576133a8613f02565b6040519080825280601f01601f1916602001820160405280156133d2576020820181803683370190505b509050600360fc1b816000815181106133ed576133ed613eec565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061341c5761341c613eec565b60200101906001600160f81b031916908160001a9053506000613440846002613cb7565b61344b906001613bd8565b90505b60018111156134c3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061347f5761347f613eec565b1a60f81b82828151811061349557613495613eec565b60200101906001600160f81b031916908160001a90535060049490941c936134bc81613de5565b905061344e565b508315612d175760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611507565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001613548613555565b8152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b60006020828403121561359c57600080fd5b8135612d1781613fe7565b600080604083850312156135ba57600080fd5b82356135c581613fe7565b915060208301356135d581613fe7565b809150509250929050565b6000806000606084860312156135f557600080fd5b833561360081613fe7565b9250602084013561361081613fe7565b929592945050506040919091013590565b600080600080600080600060e0888a03121561363c57600080fd5b873561364781613fe7565b9650602088013561365781613fe7565b95506040880135945060608801359350608088013560ff8116811461367b57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156136ab57600080fd5b82356136b681613fe7565b946020939093013593505050565b6000602082840312156136d657600080fd5b8135612d1781613ffc565b6000602082840312156136f357600080fd5b8151612d1781613ffc565b60006020828403121561371057600080fd5b5035919050565b6000806040838503121561372a57600080fd5b8235915060208301356135d581613fe7565b60006020828403121561374e57600080fd5b81356001600160e01b031981168114612d1757600080fd5b60006020828403121561377857600080fd5b813567ffffffffffffffff81111561378f57600080fd5b82016101608185031215612d1757600080fd5b600060a082840312156137b457600080fd5b60405160a0810181811067ffffffffffffffff821117156137d7576137d7613f02565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013561380c8161400a565b60808201529392505050565b60006020828403121561382a57600080fd5b5051919050565b60006020828403121561384357600080fd5b8151612d178161400a565b8051825260208101516020830152604081015160408301526060810151606083015263ffffffff60808201511660808301525050565b600080835481600182811c9150808316806138a057607f831692505b60208084108214156138c057634e487b7160e01b86526022600452602486fd5b8180156138d457600181146138e557613912565b60ff19861689528489019650613912565b60008a81526020902060005b8681101561390a5781548b8201529085019083016138f1565b505084890196505b509498975050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613958816017850160208801613db5565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613989816028840160208801613db5565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835180516001600160a01b0316845260209081015190840152604083019385019392506001016139b1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156139e457835183529284019291840191600101613a0c565b6020815260008251806020840152613a47816040850160208701613db5565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602080835261018083018451828501528185015160408501526040850151606085015260608501516080850152608085015160a085015260a0850151613adb60c086018261384e565b5060c0850151610160858101528051918290528201906000906101a08601905b80831015613b3257835180516001600160a01b03168352602090810151908301526040820191508484019350600183019250613afb565b509695505050505050565b60a08101610ed2828461384e565b600061014082019050878252866020830152856040830152846060830152836080830152613b7c60a083018461384e565b979650505050505050565b6000808335601e19843603018112613b9e57600080fd5b83018035915067ffffffffffffffff821115613bb957600080fd5b6020019150600681901b3603821315613bd157600080fd5b9250929050565b60008219821115613beb57613beb613ec0565b500190565b600082613bff57613bff613ed6565b600160ff1b821460001984141615613c1957613c19613ec0565b500590565b600082613c2d57613c2d613ed6565b500490565b60006001600160ff1b0381841382841380821686840486111615613c5857613c58613ec0565b600160ff1b6000871282811687830589121615613c7757613c77613ec0565b60008712925087820587128484161615613c9357613c93613ec0565b87850587128184161615613ca957613ca9613ec0565b505050929093029392505050565b6000816000190483118215151615613cd157613cd1613ec0565b500290565b600082821015613ce857613ce8613ec0565b500390565b68010000000000000000831115613d0657613d06613f02565b805483825580841015613d78576001600160ff1b036001818311811615613d2f57613d2f613ec0565b818611811615613d4157613d41613ec0565b60008481526020812090925086821b81019084831b015b80821015613d73578382558383830155600282019150613d58565b505050505b5060008181526020812083915b85811015613dad57613d978383613fb1565b6040929092019160029190910190600101613d85565b505050505050565b60005b83811015613dd0578181015183820152602001613db8565b83811115613ddf576000848401525b50505050565b600081613df457613df4613ec0565b506000190190565b600181811c90821680613e1057607f821691505b60208210811415611e2b57634e487b7160e01b600052602260045260246000fd5b600062ffffff80831681811415613e4a57613e4a613ec0565b6001019392505050565b6000600019821415613e6857613e68613ec0565b5060010190565b600060ff821660ff811415613e8657613e86613ec0565b60010192915050565b600082613e9e57613e9e613ed6565b500690565b6000600160ff1b821415613eb957613eb9613ec0565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b813581556020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c0820135600682015560e08201356007820155610100820135600882015560098101610120830135613f808161400a565b815463ffffffff191663ffffffff91909116179055613fa3610140830183613b87565b613ddf8183600a8601613ced565b8135613fbc81613fe7565b81546001600160a01b0319166001600160a01b03919091161781556020919091013560019190910155565b6001600160a01b038116811461152857600080fd5b801515811461152857600080fd5b63ffffffff8116811461152857600080fdfed8858e8e1664cbc67331ed60d855ac6de277d6d376c33d6c92ffec5836524871ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122096e3181dc366cff69158701a4b25cc3eefa038121f04d47414dd7060a54a8fa864736f6c63430008070033608060405234801561001057600080fd5b5060008055610186806100246000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806324cbbfc11461003b57806337e2322214610068575b600080fd5b61004e6100493660046100e1565b61007f565b60405163ffffffff90911681526020015b60405180910390f35b61007160005481565b60405190815260200161005f565b600080546040805143602082015242918101919091524460608201526080810184905260a0810185905260c0810191909152849060e0016040516020818303038152906040528051906020012060001c6100d9919061011f565b949350505050565b6000806000606084860312156100f657600080fd5b833563ffffffff8116811461010a57600080fd5b95602085013595506040909401359392505050565b600063ffffffff8084168061014457634e487b7160e01b600052601260045260246000fd5b9216919091069291505056fea26469706673582212208522e5ace258e7958872548ec83df4c5bfeac0ebe65ecdff74d2110764fbf99264736f6c63430008070033000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9

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

000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9

-----Decoded View---------------
Arg [0] : _owner (address): 0xcf322b554b6cfb668221d5b1979b6e4e58ab4dbc
Arg [1] : _asset (address): 0x57d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : _multiplierNFT (address): 0xcf185cb08c62ff969d258fba18f92dabb278a8a9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf322b554b6cfb668221d5b1979b6e4e58ab4dbc
Arg [1] : 00000000000000000000000057d06bb1e3b60c875cd3a4445a53217f9b44d390
Arg [2] : 000000000000000000000000cf185cb08c62ff969d258fba18f92dabb278a8a9


Deployed ByteCode Sourcemap

122247:13606:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89966:204;;;;;;;;;;-1:-1:-1;89966:204:0;;;;;:::i;:::-;;:::i;:::-;;;11162:14:1;;11155:22;11137:41;;11125:2;11110:18;89966:204:0;;;;;;;;109952:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;119132:214::-;;;;;;;;;;-1:-1:-1;119132:214:0;;;;;:::i;:::-;;:::i;122392:72::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;122392:72:0;;;;;11335:25:1;;;11323:2;11308:18;122392:72:0;11189:177:1;113254:103:0;;;;;;;;;;;;;:::i;113975:113::-;;;;;;;;;;-1:-1:-1;113975:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;114063:17:0;114036:7;114063:17;;;:12;:17;;;;;;;113975:113;134721:1129;;;;;;;;;;-1:-1:-1;134721:1129:0;;;;;:::i;:::-;;:::i;:::-;;117241:513;;;;;;;;;;-1:-1:-1;117241:513:0;;;;;:::i;:::-;;:::i;91802:131::-;;;;;;;;;;-1:-1:-1;91802:131:0;;;;;:::i;:::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;;91802:131;127351:147;;;;;;;;;;-1:-1:-1;127351:147:0;;;;;:::i;:::-;;:::i;126741:299::-;;;;;;;;;;-1:-1:-1;126741:299:0;;;;;:::i;:::-;;:::i;92195:147::-;;;;;;;;;;-1:-1:-1;92195:147:0;;;;;:::i;:::-;;:::i;129269:1966::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;108822:170::-;;;;;;;;;;;;108873:119;108822:170;;110896:91;;;;;;;;;;-1:-1:-1;110970:9:0;;110896:91;;110970:9;;;;21031:36:1;;21019:2;21004:18;110896:91:0;20889:184:1;133741:110:0;;;;;;;;;;-1:-1:-1;133741:110:0;;;;;:::i;:::-;;:::i;114650:464::-;;;;;;;;;;;;;:::i;93243:218::-;;;;;;;;;;-1:-1:-1;93243:218:0;;;;;:::i;:::-;;:::i;122330:20::-;;;;;;;;;;-1:-1:-1;122330:20:0;;;;-1:-1:-1;;;;;122330:20:0;;;;;;-1:-1:-1;;;;;8967:32:1;;;8949:51;;8937:2;8922:18;122330:20:0;8803:203:1;119719:406:0;;;;;;;;;;-1:-1:-1;119719:406:0;;;;;:::i;:::-;;:::i;122471:41::-;;;;;;;;;;;;;;;124021:54;;;;;;;;;;-1:-1:-1;124021:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20289:25:1;;;20345:2;20330:18;;20323:34;;;;20373:18;;;20366:34;;;;20431:2;20416:18;;20409:34;20474:3;20459:19;;20452:35;20518:3;20503:19;;20496:35;20276:3;20261:19;124021:54:0;20002:535:1;123103:32:0;;;;;;;;;;;;;;;;125233:170;;;;;;;;;;-1:-1:-1;125233:170:0;;;;;:::i;:::-;;:::i;122357:28::-;;;;;;;;;;-1:-1:-1;122357:28:0;;;;-1:-1:-1;;;;;122357:28:0;;;122754:60;;;;;;;;;;;;;;;;122981:59;;;;;;;;;;;;;;;;122686:61;;;;;;;;;;;;;;;;122878:57;;;;;;;;;;;;;;;;113607:105;;;;;;;;;;-1:-1:-1;113607:105:0;;;;;:::i;:::-;;:::i;97073:103::-;;;;;;;;;;;;;:::i;123142:31::-;;;;;;;;;;;;;;;;108596:44;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;108596:44:0;;;;;125751:116;;;;;;;;;;-1:-1:-1;125751:116:0;;;;;:::i;:::-;;:::i;114354:97::-;;;;;;;;;;-1:-1:-1;114354:97:0;;;;;:::i;:::-;-1:-1:-1;;;;;114431:12:0;114404:7;114431:12;;;:7;:12;;;;;;;114354:97;117967:523;;;;;;;;;;-1:-1:-1;117967:523:0;;;;;:::i;:::-;;:::i;111115:179::-;;;;;;;;;;-1:-1:-1;111115:179:0;;;;;:::i;:::-;;:::i;96422:87::-;;;;;;;;;;-1:-1:-1;96468:7:0;96495:6;-1:-1:-1;;;;;96495:6:0;96422:87;;107279:29;;;;;;;;;;-1:-1:-1;107279:29:0;;;;-1:-1:-1;;;;;107279:29:0;;;90262:147;;;;;;;;;;-1:-1:-1;90262:147:0;;;;;:::i;:::-;;:::i;110162:95::-;;;;;;;;;;;;;:::i;127198:145::-;;;;;;;;;;-1:-1:-1;127198:145:0;;;;;:::i;:::-;;:::i;89367:49::-;;;;;;;;;;-1:-1:-1;89367:49:0;89412:4;89367:49;;123180:32;;;;;;;;;;;;;;;;116094:402;;;;;;;;;;-1:-1:-1;116094:402:0;;;;;:::i;:::-;;:::i;120387:494::-;;;;;;;;;;-1:-1:-1;120387:494:0;;;;;:::i;:::-;;:::i;127506:646::-;;;;;;;;;;-1:-1:-1;127506:646:0;;;;;:::i;:::-;;:::i;124138:51::-;;;;;;;;;;-1:-1:-1;124138:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;126114:199;;;;;;;;;;-1:-1:-1;126114:199:0;;;;;:::i;:::-;;:::i;115331:178::-;;;;;;;;;;-1:-1:-1;115331:178:0;;;;;:::i;:::-;;:::i;114156:97::-;;;;;;;;;;-1:-1:-1;114235:10:0;;114156:97;;122942:32;;;;;;;;;;;;;;;;131758:144;;;;;;;;;;-1:-1:-1;131758:144:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;122821:50::-;;;;;;;;;;-1:-1:-1;122821:50:0;;;;-1:-1:-1;;;;;122821:50:0;;;127048:142;;;;;;;;;;-1:-1:-1;127048:142:0;;;;;:::i;:::-;;:::i;123252:32::-;;;;;;;;;;-1:-1:-1;123252:32:0;;;;;;;;;;;131910:1823;;;;;;;;;;-1:-1:-1;131910:1823:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;121271:888::-;;;;;;;;;;-1:-1:-1;121271:888:0;;;;;:::i;:::-;;:::i;92587:149::-;;;;;;;;;;-1:-1:-1;92587:149:0;;;;;:::i;:::-;;:::i;126321:148::-;;;;;;;;;;-1:-1:-1;126321:148:0;;;;;:::i;:::-;;:::i;123047:49::-;;;;;;;;;;;;;;;;126477:256;;;;;;;;;;-1:-1:-1;126477:256:0;;;;;:::i;:::-;;:::i;128160:1099::-;;;;;;;;;;-1:-1:-1;128160:1099:0;;;;;:::i;:::-;;:::i;123221:24::-;;;;;;;;;;-1:-1:-1;123221:24:0;;;;;;;;133859:102;;;;;;;;;;;;;:::i;116803:176::-;;;;;;;;;;-1:-1:-1;116803:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;116937:25:0;;;116905:7;116937:25;;;:17;:25;;;;;;;;:34;;;;;;;;;;;;;116803:176;108647:168;;;;;;;;;;;;108696:119;108647:168;;125875:231;;;;;;;;;;-1:-1:-1;125875:231:0;;;;;:::i;:::-;;:::i;124082:49::-;;;;;;;;;;-1:-1:-1;124082:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;97331:201::-;;;;;;;;;;-1:-1:-1;97331:201:0;;;;;:::i;:::-;;:::i;131557:193::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;125411:179::-;;;;;;;;;;-1:-1:-1;125411:179:0;;;;;:::i;:::-;;:::i;125598:145::-;;;;;;;;;;-1:-1:-1;125598:145:0;;;;;:::i;:::-;;:::i;89966:204::-;90051:4;-1:-1:-1;;;;;;90075:47:0;;-1:-1:-1;;;90075:47:0;;:87;;-1:-1:-1;;;;;;;;;;9815:40:0;;;90126:36;90068:94;89966:204;-1:-1:-1;;89966:204:0:o;109952:91::-;109997:13;110030:5;110023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109952:91;:::o;119132:214::-;119234:10;119199:4;119216:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119216:38:0;;;;;;;;;;:46;;;119280:36;119199:4;;119216:38;;-1:-1:-1;;;;;;;;;;;119280:36:0;;;119257:5;11335:25:1;;11323:2;11308:18;;11189:177;119280:36:0;;;;;;;;-1:-1:-1;119334:4:0;119132:214;;;;:::o;113254:103::-;113300:7;113327:22;:20;:22::i;:::-;113320:29;;113254:103;:::o;134721:1129::-;-1:-1:-1;;;;;;;;;;;89858:16:0;89869:4;89858:10;:16::i;:::-;134846:9:::1;134841:488;134865:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;:26;;134861:1;:30;134841:488;;;134920:5;::::0;-1:-1:-1;;;;;134920:5:0::1;134913:22;134936:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;134956:1;134936:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;134936:36:0::1;:::i;:::-;134974:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;134994:1;134974:22;;;;;;;:::i;:::-;;;;;;:35;;;134913:97;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;9583:32:1;;;;9565:51;;9647:2;9632:18;;9625:34;9553:2;9538:18;;9391:274;134913:97:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;135181:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135201:1;135181:22;;;;;;;:::i;:::-;;;;;;:35;;;135112:15;:53;135128:11;:19;;;;;;;;:::i;:::-;135148:1;135128:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135128:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135112:53:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;135112:53:0;:66;:104:::1;::::0;;::::1;:::i;:::-;135025:15;:53;135041:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135061:1;135041:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135041:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135025:53:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;135025:53:0;:191;135243:19:::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135263:1;135243:22;;;;;;;:::i;:::-;:36;::::0;::::1;:22;::::0;;::::1;;:36:::0;;::::1;::::0;-1:-1:-1;135243:36:0::1;:::i;:::-;-1:-1:-1::0;;;;;135236:81:0::1;;135281:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;135301:1;135281:22;;;;;;;:::i;:::-;;;;;;:35;;;135236:81;;;;11335:25:1::0;;11323:2;11308:18;;11189:177;135236:81:0::1;;;;;;;;134893:3:::0;::::1;::::0;::::1;:::i;:::-;;;;134841:488;;;;135367:54;135375:12;135396:11;:23;;;135367:7;:54::i;:::-;-1:-1:-1::0;135477:22:0::1;::::0;::::1;;:26:::0;135474:187:::1;;135527:5;::::0;135520:52:::1;::::0;-1:-1:-1;;;135520:52:0;;107682:42:::1;135520:52;::::0;::::1;9565:51:1::0;135549:22:0::1;::::0;::::1;;9632:18:1::0;;;9625:34;-1:-1:-1;;;;;135527:5:0;;::::1;::::0;135520:22:::1;::::0;9538:18:1;;135520:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;135627:11;:22;;;135607:17;;:42;;;;:::i;:::-;135587:17;:62:::0;135474:187:::1;135718:16;::::0;135706:29:::1;::::0;;;:11:::1;:29;::::0;;;;135738:11;;135706:43:::1;135738:11:::0;135706:29;:43:::1;:::i;:::-;-1:-1:-1::0;;135772:16:0::1;::::0;135790:21:::1;135767:45:::0;;135790:21;;::::1;;::::0;135772:16;135767:45:::1;::::0;;;::::1;135824:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;;;;;;134721:1129:::0;;:::o;117241:513::-;117375:4;117362:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;-1:-1:-1;;;;;117430:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;117468:10:::1;117430:59:::0;;;;;;;;:70:::1;::::0;117494:5;117430:63:::1;:70::i;:::-;-1:-1:-1::0;;;;;117392:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;117416:10:::1;117392:35:::0;;;;;;;:108;;;;117540:16:::1;::::0;117530:27:::1;::::0;:5;;:9:::1;:27::i;:::-;-1:-1:-1::0;;;;;117589:18:0;::::1;;::::0;;;:12:::1;:18;::::0;;;;;117511:46;;-1:-1:-1;117589:32:0::1;::::0;117511:46;117589:22:::1;:32::i;:::-;-1:-1:-1::0;;;;;117568:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;:53;;;;117651:16;;::::1;::::0;;;;:30:::1;::::0;117672:8;117651:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;117632:16:0;;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;117699:25;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;117699:25:0;::::1;::::0;117718:5;11335:25:1;;11323:2;11308:18;;11189:177;117699:25:0::1;;;;;;;;-1:-1:-1::0;117742:4:0::1;::::0;117241:513;-1:-1:-1;;;;;117241:513:0:o;127351:147::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;;;;;;;;;127452:38:::1;-1:-1:-1::0;;;;;;;;;;;127482:7:0::1;127452:11;:38::i;:::-;127351:147:::0;:::o;126741:299::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;122633:7:::1;126888:22;;126873:12;;:37;;;;:::i;:::-;126872:51;;126864:109;;;::::0;-1:-1:-1;;;126864:109:0;;15626:2:1;126864:109:0::1;::::0;::::1;15608:21:1::0;15665:2;15645:18;;;15638:30;15704:34;15684:18;;;15677:62;-1:-1:-1;;;15755:18:1;;;15748:43;15808:19;;126864:109:0::1;15424:409:1::0;126864:109:0::1;126984:22;:48:::0;126741:299::o;92195:147::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;89858:16;89869:4;89858:10;:16::i;:::-;92309:25:::1;92320:4;92326:7;92309:10;:25::i;:::-;92195:147:::0;;;:::o;129269:1966::-;129318:17;;:::i;:::-;129348:35;129399:12;;129386:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;129386:26:0;;;;;;;;;;;;;;;-1:-1:-1;129348:64:0;-1:-1:-1;129423:27:0;;129526:1;129423:27;;;129657:17;:15;:17::i;:::-;129634:40;;129687:31;129721:53;129755:8;129721:19;:53::i;:::-;129687:87;;129787:17;129861:22;:20;:22::i;:::-;129814:5;;129807:38;;-1:-1:-1;;;129807:38:0;;129839:4;129807:38;;;8949:51:1;-1:-1:-1;;;;;129814:5:0;;;;129807:23;;8922:18:1;;129807:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;;;:::i;:::-;129787:96;;129894:23;129973:12;;122633:7;129935:22;;129923:9;:34;;;;:::i;:::-;129922:47;;;;:::i;:::-;129921:64;;;;:::i;:::-;129894:92;;129997:18;122633:7;130031:12;;130019:9;:24;;;;:::i;:::-;130018:37;;;;:::i;:::-;129997:58;;130066:34;130176:10;130160:12;;130129:15;:43;;;;:::i;:::-;130103:70;;:9;:70;:::i;:::-;:83;;;;:::i;:::-;130066:120;;130199:840;130230:12;;130206:21;:36;;;130199:840;;;130287:9;130259:37;;130399:60;130415:22;130438:19;130415:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;130415:43:0;130399:15;:60::i;:::-;130354:105;;:25;:105;:::i;:::-;130311:148;;130556:25;130498:14;130513:21;130498:37;;;;;;;;;;:::i;:::-;;;;;;;:83;;:168;;;;;130643:23;130602:14;130617:21;130602:37;;;;;;;;;;:::i;:::-;;;;;;;:64;;130498:168;130476:552;;;130746:108;;;;;;;;130753:22;130798:19;130753:83;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;130753:83:0;130746:108;;;;;;130701:42;;:19;;:42;;;;;;;;;;:::i;:::-;;;;;;:153;;;;130873:23;;;;;:::i;:::-;;;;130199:840;;130476:552;130937:21;;;;:::i;:::-;;;;130989:23;130977:35;;130199:840;;;131076:127;;;;;;;;131087:16;;131076:127;;131105:15;131076:127;;;;;;;;;;;;;;;;;;;-1:-1:-1;131076:127:0;;;;;;;-1:-1:-1;131076:127:0;;;;;;;-1:-1:-1;131076:127:0;;129269:1966;-1:-1:-1;;;;;129269:1966:0:o;133741:110::-;133796:7;133823:20;133839:3;133823:15;:20::i;114650:464::-;114699:7;114719:15;114780:9;114769:20;;108696:119;114943:5;114927:23;;;;;;:::i;:::-;;;;;;;;;;114989:15;;;;;;;;-1:-1:-1;;;114989:15:0;;;;;114858:233;;;;;12226:25:1;;;;12267:18;;12260:34;;;;114973:33:0;12310:18:1;;;12303:34;12353:18;;;12346:34;;;115067:4:0;12396:19:1;;;12389:61;12198:19;;114858:233:0;;;;;;;;;;;;114830:276;;;;;;114810:296;;;114650:464;:::o;93243:218::-;-1:-1:-1;;;;;93339:23:0;;87255:10;93339:23;93331:83;;;;-1:-1:-1;;;93331:83:0;;17568:2:1;93331:83:0;;;17550:21:1;17607:2;17587:18;;;17580:30;17646:34;17626:18;;;17619:62;-1:-1:-1;;;17697:18:1;;;17690:45;17752:19;;93331:83:0;17366:411:1;93331:83:0;93427:26;93439:4;93445:7;93427:11;:26::i;:::-;93243:218;;:::o;119719:406::-;119898:10;119817:4;119880:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119880:62:0;;;;;;;;;;:78;;119947:10;119880:66;:78::i;:::-;119857:10;119839:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;119839:38:0;;;;;;;;;;;;:119;;;119976;11335:25:1;;;119839:38:0;;-1:-1:-1;;;;;;;;;;;119976:119:0;11308:18:1;119976:119:0;11189:177:1;125233:170:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125353:19:::1;:42:::0;125233:170::o;113607:105::-;113662:7;113689:15;113700:3;113689:10;:15::i;97073:103::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;97138:30:::1;97165:1;97138:18;:30::i;:::-;97073:103::o:0;125751:116::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125831:12:::1;:28:::0;;-1:-1:-1;;125831:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;125751:116::o;117967:523::-;118082:4;118060:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;-1:-1:-1;;;;;118123:18:0;::::1;118104:16;118123:18:::0;;;:12:::1;:18;::::0;;;;;118181:16:::1;::::0;118123:18;;118104:16;118168:30:::1;::::0;118123:18;;118168:12:::1;:30::i;:::-;-1:-1:-1::0;;;;;118249:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;118287:10:::1;118249:59:::0;;;;;;;;118152:46;;-1:-1:-1;118249:70:0::1;::::0;118152:46;118249:63:::1;:70::i;:::-;-1:-1:-1::0;;;;;118211:23:0;;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;118235:10:::1;118211:35:::0;;;;;;;:108;;;;118339:18;;;:12:::1;:18:::0;;;;;;118332:25;;;118387:16;;::::1;::::0;;;;:30:::1;::::0;118408:8;118387:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;118368:16:0;;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;118435:25;;;;::::1;::::0;-1:-1:-1;;;;;;;;;;;118435:25:0;::::1;::::0;118454:5;11335:25:1;;11323:2;11308:18;;11189:177;111115:179:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;111197:14:::1;:32:::0;;-1:-1:-1;;;;;;111197:32:0::1;-1:-1:-1::0;;;;;111197:32:0;::::1;::::0;;::::1;::::0;;;111245:41:::1;::::0;8949:51:1;;;111245:41:0::1;::::0;8937:2:1;8922:18;111245:41:0::1;;;;;;;111115:179:::0;:::o;90262:147::-;90348:4;90372:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;90372:29:0;;;;;;;;;;;;;;;90262:147::o;110162:95::-;110209:13;110242:7;110235:14;;;;;:::i;127198:145::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;127298:37:::1;-1:-1:-1::0;;;;;;;;;;;127327:7:0::1;127298:10;:37::i;116094:402::-:0;116191:4;116169:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;116245:10:::1;116213:16;116232:24:::0;;;:12:::1;:24;::::0;;;;;116296:16:::1;::::0;116232:24;;116213:16;116283:30:::1;::::0;116232:24;;116283:12:::1;:30::i;:::-;116346:10;116333:24;::::0;;;:12:::1;:24;::::0;;;;;116326:31;;;-1:-1:-1;;;;;116387:16:0;::::1;::::0;;;;;116267:46;;-1:-1:-1;116387:30:0::1;::::0;116408:8;116387:20:::1;:30::i;:::-;-1:-1:-1::0;;;;;116368:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;;:49;;;;116435:31;;116444:10:::1;::::0;-1:-1:-1;;;;;;;;;;;116435:31:0;::::1;::::0;116460:5;11335:25:1;;11323:2;11308:18;;11189:177;116435:31:0::1;;;;;;;;116484:4;116477:11;;;;107632:1;116094:402:::0;;;;:::o;120387:494::-;120551:10;120492:4;120533:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;120533:38:0;;;;;;;;;;120624:27;;;;120623:91;;120685:29;:8;120698:15;120685:12;:29::i;:::-;120623:91;;;120668:1;120623:91;120600:10;120582:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;120582:38:0;;;;;;;;;;;;:132;;;120732:119;11335:25:1;;;120582:38:0;;-1:-1:-1;;;;;;;;;;;120732:119:0;11308:18:1;120732:119:0;;;;;;;-1:-1:-1;120869:4:0;;120387:494;-1:-1:-1;;;120387:494:0:o;127506:646::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;17208:2:1;2402:63:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:33;17266:18;;;17259:61;17337:18;;2402:63:0;17006:355:1;2402:63:0;1812:1;2543:7;:18;124570:12:::1;::::0;::::1;;:20;;:12:::0;:20:::1;124562:66;;;::::0;-1:-1:-1;;;124562:66:0;;16401:2:1;124562:66:0::1;::::0;::::1;16383:21:1::0;16440:2;16420:18;;;16413:30;16479:34;16459:18;;;16452:62;-1:-1:-1;;;16530:18:1;;;16523:31;16571:19;;124562:66:0::1;16199:397:1::0;124562:66:0::1;87255:10:::0;127630:32:::2;107682:42;87255:10:::0;127654:7;127630:9:::2;:32::i;:::-;-1:-1:-1::0;127680:5:0::2;::::0;127673:58:::2;::::0;-1:-1:-1;;;127673:58:0;;-1:-1:-1;;;;;9269:15:1;;;127673:58:0::2;::::0;::::2;9251:34:1::0;127716:4:0::2;9301:18:1::0;;;9294:43;9353:18;;;9346:34;;;127680:5:0;;::::2;::::0;127673:26:::2;::::0;9186:18:1;;127673:58:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;127742:23:0;::::2;;::::0;;;:15:::2;:23;::::0;;;;127784:15:::2;127742:39;::::0;::::2;:57:::0;127810:41:::2;;:52:::0;;127855:7;;127742:23;127810:52:::2;::::0;127855:7;;127810:52:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;127878:27:0;::::2;;::::0;;;:19:::2;:27;::::0;;;;;::::2;;127873:272;;127942:17;::::0;:21:::2;::::0;127962:1:::2;127942:21;:::i;:::-;127922:17;:41:::0;-1:-1:-1;;;;;127978:27:0;::::2;;::::0;;;:19:::2;:27;::::0;;;;;;;:34;;-1:-1:-1;;127978:34:0::2;128008:4;127978:34:::0;;::::2;::::0;;;128027:15:::2;:23:::0;;;;;128068:15:::2;128027:38;::::0;;::::2;:56:::0;128098:22:::2;:35:::0;;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;128098:35:0::2;::::0;;::::2;::::0;;127873:272:::2;-1:-1:-1::0;;1768:1:0;2722:7;:22;127506:646::o;126114:199::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126245:28:::1;:60:::0;;-1:-1:-1;;;;;;126245:60:0::1;-1:-1:-1::0;;;;;126245:60:0;;;::::1;::::0;;;::::1;::::0;;126114:199::o;115331:178::-;115440:4;115418:2;-1:-1:-1;;;;;107563:18:0;;107555:27;;;;;;-1:-1:-1;;;;;107601:19:0;;107615:4;107601:19;;107593:28;;;;;;115469:32:::1;115479:10;115491:2;115495:5;115469:9;:32::i;:::-;115462:39:::0;115331:178;-1:-1:-1;;;;115331:178:0:o;131758:144::-;131828:15;131863:11;:23;131875:10;131863:23;;;;;;;;;;;:31;;131856:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;131856:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131758:144;;;:::o;127048:142::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;127154:12:::1;:28:::0;127048:142::o;131910:1823::-;131995:16;132067:12;;132046:5;:17;;;:33;;132024:121;;;;-1:-1:-1;;;132024:121:0;;15219:2:1;132024:121:0;;;15201:21:1;15258:2;15238:18;;;15231:30;15297:34;15277:18;;;15270:62;-1:-1:-1;;;15348:18:1;;;15341:36;15394:19;;132024:121:0;15017:402:1;132024:121:0;132240:31;132288:12;;132274:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;132274:27:0;;132240:61;;132312:17;132344:21;132380:913;132403:12;;132387:13;:28;132380:913;;;132432:11;;;;:::i;:::-;;;;132458:9;132851:5;:17;;;132871:1;132851:21;;;;:::i;:::-;132607:11;;132645:17;;;;;132689:15;;;;;132731:16;;;;132774;;;;132528:285;;;;132571:9;;132607:11;;132645:17;132774:16;132528:285;8520:19:1;;;8564:2;8555:12;;8548:28;;;;8601:2;8592:12;;8585:28;;;;8638:2;8629:12;;8622:28;8675:3;8666:13;;8659:29;8745:3;8723:16;-1:-1:-1;;;;;;8719:43:1;8713:3;8704:13;;8697:66;8788:3;8779:13;;8253:545;132528:285:0;;;;;;;;;;;;;132496:336;;;;;;132470:377;;:403;;;;:::i;:::-;132458:415;;132888:16;132932:9;132927:203;132951:14;:21;132947:1;:25;132927:203;;;133007:14;133022:1;133007:17;;;;;;;;:::i;:::-;;;;;;;133002:1;:22;132998:117;;;133063:4;133049:18;;133090:5;;132998:117;132974:3;;;;:::i;:::-;;;;132927:203;;;;133148:11;133144:60;;;133180:8;;;;133144:60;133250:1;133218:14;133233:13;133218:29;;;;;;;;:::i;:::-;;;;;;;;;;:33;133266:15;;;;:::i;:::-;;;;132417:876;;132380:913;;;133310:9;133305:387;133329:14;:21;133325:1;:25;133305:387;;;133377:9;133372:309;133396:14;:21;133392:1;:25;133372:309;;;133467:14;133482:1;133467:17;;;;;;;;:::i;:::-;;;;;;;133447:14;133462:1;133447:17;;;;;;;;:::i;:::-;;;;;;;:37;133443:223;;;133509:11;133523:14;133538:1;133523:17;;;;;;;;:::i;:::-;;;;;;;133509:31;;133583:14;133598:1;133583:17;;;;;;;;:::i;:::-;;;;;;;133563:14;133578:1;133563:17;;;;;;;;:::i;:::-;;;;;;:37;;;;;133643:3;133623:14;133638:1;133623:17;;;;;;;;:::i;:::-;;;;;;:23;;;;;133486:180;133443:223;133419:3;;;;:::i;:::-;;;;133372:309;;;-1:-1:-1;133352:3:0;;;;:::i;:::-;;;;133305:387;;;-1:-1:-1;133711:14:0;;131910:1823;-1:-1:-1;;;;131910:1823:0:o;121271:888::-;121498:8;121479:15;:27;;121471:36;;;;;;-1:-1:-1;;;;;121541:14:0;;;121520:18;121541:14;;;:7;:14;;;;;;;;;121617:189;;108873:119;121617:189;;;11658:25:1;11737:18;;;11730:43;;;;11809:15;;;11789:18;;;11782:43;11841:18;;;11834:34;;;11884:19;;;11877:35;;;11928:19;;;;11921:35;;;121617:189:0;;;;;;;;;;11630:19:1;;;;121617:189:0;;121593:224;;;;;;;;;121898:18;:16;:18::i;:::-;121869:66;;-1:-1:-1;;;121869:66:0;;;7323:27:1;7366:11;;;7359:27;;;;7402:12;;;7395:28;;;7439:12;;121869:66:0;;;-1:-1:-1;;121869:66:0;;;;;;;;;121845:101;;121869:66;121845:101;;;;121976:26;;;;;;;;;12688:25:1;;;12761:4;12749:17;;12729:18;;;12722:45;;;;12783:18;;;12776:34;;;12826:18;;;12819:34;;;121845:101:0;-1:-1:-1;121976:26:0;;12660:19:1;;121976:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;121967:35:0;:5;-1:-1:-1;;;;;121967:35:0;;121959:44;;;;;;122033:17;:10;122048:1;122033:14;:17::i;:::-;-1:-1:-1;;;;;122016:14:0;;;;;;;:7;:14;;;;;;;;:34;;;;122063:17;:24;;;;;:33;;;;;;;;;;;;;:41;;;122120:31;;11335:25:1;;;122063:33:0;;122016:14;;-1:-1:-1;;;;;;;;;;;122120:31:0;11308:18:1;122120:31:0;;;;;;;121460:699;;;121271:888;;;;;;;:::o;92587:149::-;91876:7;91903:12;;;:6;:12;;;;;;;;:22;;89858:16;89869:4;89858:10;:16::i;:::-;92702:26:::1;92714:4;92720:7;92702:11;:26::i;126321:148::-:0;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126430:13:::1;:31:::0;;-1:-1:-1;;;;;;126430:31:0::1;-1:-1:-1::0;;;;;126430:31:0;;;::::1;::::0;;;::::1;::::0;;126321:148::o;126477:256::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;122633:7:::1;126604:22;;126589:12;;:37;;;;:::i;:::-;126588:51;;126580:106;;;::::0;-1:-1:-1;;;126580:106:0;;14808:2:1;126580:106:0::1;::::0;::::1;14790:21:1::0;14847:2;14827:18;;;14820:30;14886:34;14866:18;;;14859:62;-1:-1:-1;;;14937:18:1;;;14930:40;14987:19;;126580:106:0::1;14606:406:1::0;126580:106:0::1;126697:12;:28:::0;126477:256::o;128160:1099::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;17208:2:1;2402:63:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:33;17266:18;;;17259:61;17337:18;;2402:63:0;17006:355:1;2402:63:0;1812:1;2543:7;:18;87255:10;128293:7;128228:14:::1;128368:18;87255:10:::0;128368::::1;:18::i;:::-;128357:7;:29;;128349:78;;;::::0;-1:-1:-1;;;128349:78:0;;16803:2:1;128349:78:0::1;::::0;::::1;16785:21:1::0;16842:2;16822:18;;;16815:30;16881:34;16861:18;;;16854:62;-1:-1:-1;;;16932:18:1;;;16925:34;16976:19;;128349:78:0::1;16601:400:1::0;128349:78:0::1;128538:36;::::0;-1:-1:-1;;;;;128484:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:38:::1;;::::0;128466:56:::1;::::0;:15:::1;:56;:::i;:::-;:108;128448:397;;;122633:7;128652:23;;128635:14;:40;;;;:::i;:::-;128634:70;;;;:::i;:::-;128601:103:::0;-1:-1:-1;128736:30:0::1;128601:103:::0;128736:14;:30:::1;:::i;:::-;128788:5;::::0;128719:47;;-1:-1:-1;;;;;;128788:5:0::1;128781:22;128804:7;96468::::0;96495:6;-1:-1:-1;;;;;96495:6:0;;96422:87;128804:7:::1;128781:46;::::0;-1:-1:-1;;;;;;128781:46:0::1;::::0;;;;;;-1:-1:-1;;;;;9583:32:1;;;128781:46:0::1;::::0;::::1;9565:51:1::0;9632:18;;;9625:34;;;9538:18;;128781:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;128448:397;128864:5;::::0;128857:46:::1;::::0;-1:-1:-1;;;128857:46:0;;-1:-1:-1;;;;;9583:32:1;;;128857:46:0::1;::::0;::::1;9565:51:1::0;9632:18;;;9625:34;;;128864:5:0;;::::1;::::0;128857:22:::1;::::0;9538:18:1;;128857:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;128914:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:43:::1;::::0;::::1;:60:::0;;;129030:15:::1;128985:42;::::0;;::::1;:60:::0;129058:32:::1;128930:6:::0;107682:42:::1;129082:7:::0;129058:9:::1;:32::i;:::-;;129107:18;129118:6;129107:10;:18::i;:::-;129103:147;;-1:-1:-1::0;;;;;129147:27:0;::::1;129177:5;129147:27:::0;;;:19:::1;:27;::::0;;;;:35;;-1:-1:-1;;129147:35:0::1;::::0;;129217:17:::1;::::0;:21:::1;::::0;129147:35;;129217:21:::1;:::i;:::-;129197:17;:41:::0;129103:147:::1;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;128160:1099:0:o;133859:102::-;133906:7;133933:20;:18;:20::i;125875:231::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;126022:36:::1;:76:::0;125875:231::o;97331:201::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;97420:22:0;::::1;97412:73;;;::::0;-1:-1:-1;;;97412:73:0;;14048:2:1;97412:73:0::1;::::0;::::1;14030:21:1::0;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;-1:-1:-1;;;14177:18:1;;;14170:36;14223:19;;97412:73:0::1;13846:402:1::0;97412:73:0::1;97496:28;97515:8;97496:18;:28::i;131557:193::-:0;131605:11;;:::i;:::-;131656:1;131637:16;;:20;131629:57;;;;-1:-1:-1;;;131629:57:0;;14455:2:1;131629:57:0;;;14437:21:1;14494:2;14474:18;;;14467:30;14533:26;14513:18;;;14506:54;14577:18;;131629:57:0;14253:348:1;131629:57:0;131704:11;:33;131735:1;131716:16;;:20;;;;:::i;:::-;131704:33;;;;;;;;;;;;;;-1:-1:-1;131704:33:0;131697:45;;;;;;;131704:38;;;131697:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131557:193;-1:-1:-1;131557:193:0:o;125411:179::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125532:23:::1;:50:::0;125411:179::o;125598:145::-;96468:7;96495:6;-1:-1:-1;;;;;96495:6:0;87255:10;96642:23;96634:68;;;;-1:-1:-1;;;96634:68:0;;;;;;;:::i;:::-;125691:20:::1;:44:::0;;;::::1;;;;-1:-1:-1::0;;125691:44:0;;::::1;::::0;;;::::1;::::0;;125598:145::o;97692:191::-;97766:16;97785:6;;-1:-1:-1;;;;;97802:17:0;;;-1:-1:-1;;;;;;97802:17:0;;;;;;97835:40;;97785:6;;;;;;;97835:40;;97766:16;97835:40;97755:128;97692:191;:::o;101903:98::-;101961:7;101988:5;101992:1;101988;:5;:::i;:::-;101981:12;101903:98;-1:-1:-1;;;101903:98:0:o;113365:121::-;113420:7;113462:16;107682:42;113462:10;:16::i;:::-;113447:12;;:31;;;;:::i;90713:105::-;90780:30;90791:4;87255:10;90780;:30::i;111562:1619::-;111650:7;111679:16;111675:118;;111727:5;111717:30;111734:12;;111717:30;;;;11335:25:1;;11323:2;11308:18;;11189:177;111717:30:0;;;;;;;;-1:-1:-1;111769:12:0;;111762:19;;111675:118;111819:213;112023:8;111819:185;111867:122;111935:34;111952:16;107682:42;111952:10;:16::i;:::-;111935:12;;;:16;:34::i;:::-;111874:12;;111867:34;;111892:8;111867:24;:34::i;:::-;:38;;:122::i;:::-;111819:11;;:29;:185::i;:213::-;111805:227;;112063:1;112049:11;:15;112045:193;;;112096:44;112121:17;:11;:15;:17::i;112096:44::-;112081:12;:59;112045:193;;;112188:12;;:38;;112213:11;112188:16;:38::i;:::-;112173:12;:53;112045:193;112254:12;;-1:-1:-1;;;;;;112250:83:0;;;-1:-1:-1;;;;;112296:12:0;:25;112250:83;112379:12;;112364:10;;:28;;:14;:28::i;:::-;112345:16;:47;113130:12;;113113:30;;11335:25:1;;;113123:5:0;;113113:30;;11323:2:1;11308:18;113113:30:0;;;;;;;-1:-1:-1;113161:12:0;;111562:1619;;;;:::o;101147:98::-;101205:7;101232:5;101236:1;101232;:5;:::i;101504:98::-;101562:7;101589:5;101593:1;101589;:5;:::i;100766:98::-;100824:7;100851:5;100855:1;100851;:5;:::i;95114:239::-;95198:22;95206:4;95212:7;95198;:22::i;:::-;95194:152;;;95269:5;95237:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;95237:29:0;;;;;;;;;;:37;;-1:-1:-1;;95237:37:0;;;95294:40;87255:10;;95237:12;;95294:40;;95269:5;95294:40;95114:239;;:::o;94744:238::-;94828:22;94836:4;94842:7;94828;:22::i;:::-;94823:152;;94867:12;;;;94899:4;94867:12;;;;;;;;-1:-1:-1;;;;;94867:29:0;;;;;;;;;;:36;;-1:-1:-1;;94867:36:0;;;;;;;94923:40;;87255:10;;94867:12;;94923:40;;94867:12;94923:40;94744:238;;:::o;131243:306::-;131292:11;;:::i;:::-;131323:218;;;;;;;;;131342:22;:29;131323:218;;;;;131386:20;:18;:20::i;:::-;131323:218;;131421:15;131323:218;;;;131451:16;131323:218;;;;;;;;131482:48;-1:-1:-1;;;131482:48:0;;131496:16;131482:48;;;20750:42:1;-1:-1:-1;20808:18:1;;;20801:34;131517:12:0;20851:18:1;;;20844:34;131323:218:0;;;;;-1:-1:-1;;;;;131482:6:0;:13;;;;20723:18:1;;131482:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131323:218;;;;131316:225;131243:306;-1:-1:-1;131243:306:0:o;134252:461::-;134313:7;134333:14;134350:15;134361:3;134350:10;:15::i;:::-;134379:20;;134333:32;;-1:-1:-1;134379:20:0;;;;;134376:328;;;134441:13;;134433:37;;-1:-1:-1;;;134433:37:0;;-1:-1:-1;;;;;8967:32:1;;;134433:37:0;;;8949:51:1;134416:14:0;;134441:13;;134433:32;;8922:18:1;;134433:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;134416:54;-1:-1:-1;134488:11:0;134485:64;;-1:-1:-1;134527:6:0;134252:461;-1:-1:-1;;134252:461:0:o;134485:64::-;122633:7;;134616:6;122633:7;134582:19;;:30;;;;:::i;:::-;134581:41;;;;:::i;:::-;134580:54;;;;:::i;:::-;134570:65;;:6;:65;:::i;:::-;:76;;;;:::i;113720:130::-;113825:16;;-1:-1:-1;;;;;113803:17:0;;113776:7;113803:17;;;:12;:17;;;;;;113776:7;;113803:39;;:17;:21;:39::i;115517:374::-;115629:4;115646:16;115665:27;115675:16;;115665:5;:9;;:27;;;;:::i;:::-;-1:-1:-1;;;;;115726:18:0;;;;;;:12;:18;;;;;;115646:46;;-1:-1:-1;115726:32:0;;115646:46;115726:22;:32::i;:::-;-1:-1:-1;;;;;115705:18:0;;;;;;;:12;:18;;;;;;:53;;;;115788:16;;;;;;;:30;;115809:8;115788:20;:30::i;:::-;-1:-1:-1;;;;;115769:16:0;;;;;;;:12;:16;;;;;;;:49;;;;115836:25;;;;;;-1:-1:-1;;;;;;;;;;;115836:25:0;;;115855:5;11335:25:1;;11323:2;11308:18;;11189:177;115836:25:0;;;;;;;;-1:-1:-1;115879:4:0;;115517:374;-1:-1:-1;;;;115517:374:0:o;133969:275::-;134022:7;;;134072:140;134096:22;:29;134092:33;;134072:140;;;134158:42;134174:22;134197:1;134174:25;;;;;;;;:::i;134158:42::-;134147:53;;;;:::i;:::-;;-1:-1:-1;134127:3:0;;;;:::i;:::-;;;;134072:140;;91108:505;91197:22;91205:4;91211:7;91197;:22::i;:::-;91192:414;;91385:41;91413:7;-1:-1:-1;;;;;91385:41:0;91423:2;91385:19;:41::i;:::-;91499:38;91527:4;91534:2;91499:19;:38::i;:::-;91290:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91290:270:0;;;;;;;;;;-1:-1:-1;;;91236:358:0;;;;;;;:::i;83571:303::-;83627:6;;83657:5;83661:1;83657;:5;:::i;:::-;83646:16;-1:-1:-1;;;;83747:15:0;;;;:55;;-1:-1:-1;;;;83767:14:0;;;83787;;;83766:36;;83747:55;83739:64;;;;;;83823:6;;;83822:24;;-1:-1:-1;83844:1:0;83835:5;83839:1;83835;:5;:::i;:::-;:10;83822:24;83814:33;;;;;83969:259;84025:6;84112:1;-1:-1:-1;;84112:7:0;;:26;;;-1:-1:-1;;;;84123:15:0;;;84112:26;84104:35;;;;;;84215:5;84219:1;84215;:5;:::i;84851:129::-;84897:6;-1:-1:-1;;;84924:15:0;;;84916:24;;;;;;84962:1;84958;:5;:14;;84971:1;84958:14;;;84966:2;84967:1;84966:2;:::i;4425:451::-;4500:13;4526:19;4558:10;4562:6;4558:1;:10;:::i;:::-;:14;;4571:1;4558:14;:::i;:::-;4548:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4548:25:0;;4526:47;;-1:-1:-1;;;4584:6:0;4591:1;4584:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4584:15:0;;;;;;;;;-1:-1:-1;;;4610:6:0;4617:1;4610:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4610:15:0;;;;;;;;-1:-1:-1;4641:9:0;4653:10;4657:6;4653:1;:10;:::i;:::-;:14;;4666:1;4653:14;:::i;:::-;4641:26;;4636:135;4673:1;4669;:5;4636:135;;;-1:-1:-1;;;4721:5:0;4729:3;4721:11;4708:25;;;;;;;:::i;:::-;;;;4696:6;4703:1;4696:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4696:37:0;;;;;;;;-1:-1:-1;4758:1:0;4748:11;;;;;4676:3;;;:::i;:::-;;;4636:135;;;-1:-1:-1;4789:10:0;;4781:55;;;;-1:-1:-1;;;4781:55:0;;13687:2:1;4781:55:0;;;13669:21:1;;;13706:18;;;13699:30;13765:34;13745:18;;;13738:62;13817:18;;4781:55:0;13485:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:1;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:1;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:1;1090:18;;;;1077:32;;659:456::o;1120:829::-;1231:6;1239;1247;1255;1263;1271;1279;1332:3;1320:9;1311:7;1307:23;1303:33;1300:53;;;1349:1;1346;1339:12;1300:53;1388:9;1375:23;1407:31;1432:5;1407:31;:::i;:::-;1457:5;-1:-1:-1;1514:2:1;1499:18;;1486:32;1527:33;1486:32;1527:33;:::i;:::-;1579:7;-1:-1:-1;1633:2:1;1618:18;;1605:32;;-1:-1:-1;1684:2:1;1669:18;;1656:32;;-1:-1:-1;1740:3:1;1725:19;;1712:33;1789:4;1776:18;;1764:31;;1754:59;;1809:1;1806;1799:12;1754:59;1120:829;;;;-1:-1:-1;1120:829:1;;;;1832:7;1886:3;1871:19;;1858:33;;-1:-1:-1;1938:3:1;1923:19;;;1910:33;;1120:829;-1:-1:-1;;1120:829:1:o;1954:315::-;2022:6;2030;2083:2;2071:9;2062:7;2058:23;2054:32;2051:52;;;2099:1;2096;2089:12;2051:52;2138:9;2125:23;2157:31;2182:5;2157:31;:::i;:::-;2207:5;2259:2;2244:18;;;;2231:32;;-1:-1:-1;;;1954:315:1:o;2274:241::-;2330:6;2383:2;2371:9;2362:7;2358:23;2354:32;2351:52;;;2399:1;2396;2389:12;2351:52;2438:9;2425:23;2457:28;2479:5;2457:28;:::i;2520:245::-;2587:6;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2688:9;2682:16;2707:28;2729:5;2707:28;:::i;2770:180::-;2829:6;2882:2;2870:9;2861:7;2857:23;2853:32;2850:52;;;2898:1;2895;2888:12;2850:52;-1:-1:-1;2921:23:1;;2770:180;-1:-1:-1;2770:180:1:o;2955:315::-;3023:6;3031;3084:2;3072:9;3063:7;3059:23;3055:32;3052:52;;;3100:1;3097;3090:12;3052:52;3136:9;3123:23;3113:33;;3196:2;3185:9;3181:18;3168:32;3209:31;3234:5;3209:31;:::i;3275:286::-;3333:6;3386:2;3374:9;3365:7;3361:23;3357:32;3354:52;;;3402:1;3399;3392:12;3354:52;3428:23;;-1:-1:-1;;;;;;3480:32:1;;3470:43;;3460:71;;3527:1;3524;3517:12;3566:391;3656:6;3709:2;3697:9;3688:7;3684:23;3680:32;3677:52;;;3725:1;3722;3715:12;3677:52;3765:9;3752:23;3798:18;3790:6;3787:30;3784:50;;;3830:1;3827;3820:12;3784:50;3853:22;;3909:3;3891:16;;;3887:26;3884:46;;;3926:1;3923;3916:12;3962:770;4044:6;4097:3;4085:9;4076:7;4072:23;4068:33;4065:53;;;4114:1;4111;4104:12;4065:53;4147:2;4141:9;4189:3;4181:6;4177:16;4259:6;4247:10;4244:22;4223:18;4211:10;4208:34;4205:62;4202:88;;;4270:18;;:::i;:::-;4310:10;4306:2;4299:22;;4358:9;4345:23;4337:6;4330:39;4430:2;4419:9;4415:18;4402:32;4397:2;4389:6;4385:15;4378:57;4496:2;4485:9;4481:18;4468:32;4463:2;4455:6;4451:15;4444:57;4562:2;4551:9;4547:18;4534:32;4529:2;4521:6;4517:15;4510:57;4617:3;4606:9;4602:19;4589:33;4631:30;4655:5;4631:30;:::i;:::-;4689:3;4677:16;;4670:31;4681:6;3962:770;-1:-1:-1;;;3962:770:1:o;4922:184::-;4992:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:52;;;5061:1;5058;5051:12;5013:52;-1:-1:-1;5084:16:1;;4922:184;-1:-1:-1;4922:184:1:o;5111:249::-;5180:6;5233:2;5221:9;5212:7;5208:23;5204:32;5201:52;;;5249:1;5246;5239:12;5201:52;5281:9;5275:16;5300:30;5324:5;5300:30;:::i;5607:330::-;5683:5;5677:12;5672:3;5665:25;5739:4;5732:5;5728:16;5722:23;5715:4;5710:3;5706:14;5699:47;5795:4;5788:5;5784:16;5778:23;5771:4;5766:3;5762:14;5755:47;5851:4;5844:5;5840:16;5834:23;5827:4;5822:3;5818:14;5811:47;5919:10;5911:4;5904:5;5900:16;5894:23;5890:40;5883:4;5878:3;5874:14;5867:64;;;5607:330::o;5942:1118::-;6072:3;6101:1;6134:6;6128:13;6164:3;6186:1;6214:9;6210:2;6206:18;6196:28;;6274:2;6263:9;6259:18;6296;6286:61;;6340:4;6332:6;6328:17;6318:27;;6286:61;6366:2;6414;6406:6;6403:14;6383:18;6380:38;6377:165;;;-1:-1:-1;;;6441:33:1;;6497:4;6494:1;6487:15;6527:4;6448:3;6515:17;6377:165;6558:18;6585:104;;;;6703:1;6698:337;;;;6551:484;;6585:104;-1:-1:-1;;6618:24:1;;6606:37;;6663:16;;;;-1:-1:-1;6585:104:1;;6698:337;21745:1;21738:14;;;21782:4;21769:18;;6810:1;6824:165;6838:6;6835:1;6832:13;6824:165;;;6916:14;;6903:11;;;6896:35;6959:16;;;;6853:10;;6824:165;;;6828:3;;7018:6;7013:3;7009:16;7002:23;;6551:484;-1:-1:-1;7051:3:1;;5942:1118;-1:-1:-1;;;;;;;;5942:1118:1:o;7462:786::-;7873:25;7868:3;7861:38;7843:3;7928:6;7922:13;7944:62;7999:6;7994:2;7989:3;7985:12;7978:4;7970:6;7966:17;7944:62;:::i;:::-;-1:-1:-1;;;8065:2:1;8025:16;;;8057:11;;;8050:40;8115:13;;8137:63;8115:13;8186:2;8178:11;;8171:4;8159:17;;8137:63;:::i;:::-;8220:17;8239:2;8216:26;;7462:786;-1:-1:-1;;;;7462:786:1:o;9670:685::-;9891:2;9943:21;;;10013:13;;9916:18;;;10035:22;;;9862:4;;9891:2;10114:15;;;;10088:2;10073:18;;;9862:4;10157:172;10171:6;10168:1;10165:13;10157:172;;;10262:13;;5466;;-1:-1:-1;;;;;5462:39:1;5450:52;;5552:4;5540:17;;;5534:24;5518:14;;;5511:48;5591:4;5582:14;;10304:15;;;;10220:61;-1:-1:-1;10193:1:1;10186:9;10157:172;;;-1:-1:-1;10346:3:1;;9670:685;-1:-1:-1;;;;;;9670:685:1:o;10360:632::-;10531:2;10583:21;;;10653:13;;10556:18;;;10675:22;;;10502:4;;10531:2;10754:15;;;;10728:2;10713:18;;;10502:4;10797:169;10811:6;10808:1;10805:13;10797:169;;;10872:13;;10860:26;;10941:15;;;;10906:12;;;;10833:1;10826:9;10797:169;;13097:383;13246:2;13235:9;13228:21;13209:4;13278:6;13272:13;13321:6;13316:2;13305:9;13301:18;13294:34;13337:66;13396:6;13391:2;13380:9;13376:18;13371:2;13363:6;13359:15;13337:66;:::i;:::-;13464:2;13443:15;-1:-1:-1;;13439:29:1;13424:45;;;;13471:2;13420:54;;13097:383;-1:-1:-1;;13097:383:1:o;15838:356::-;16040:2;16022:21;;;16059:18;;;16052:30;16118:34;16113:2;16098:18;;16091:62;16185:2;16170:18;;15838:356::o;17782:1186::-;17932:4;17961:2;17990;17979:9;17972:21;18031:3;18020:9;18016:19;18077:6;18071:13;18066:2;18055:9;18051:18;18044:41;18139:2;18131:6;18127:15;18121:22;18116:2;18105:9;18101:18;18094:50;18198:2;18190:6;18186:15;18180:22;18175:2;18164:9;18160:18;18153:50;18258:2;18250:6;18246:15;18240:22;18234:3;18223:9;18219:19;18212:51;18318:3;18310:6;18306:16;18300:23;18294:3;18283:9;18279:19;18272:52;18371:3;18363:6;18359:16;18353:23;18385:57;18437:3;18426:9;18422:19;18408:12;18385:57;:::i;:::-;-1:-1:-1;18491:3:1;18479:16;;18473:23;18515:6;18537:18;;;18530:30;18609:21;;18639:22;;;;18719:23;;;18760:1;;18692:3;18677:19;;;18770:172;18784:6;18781:1;18778:13;18770:172;;;18875:13;;5466;;-1:-1:-1;;;;;5462:39:1;5450:52;;5552:4;5540:17;;;5534:24;5518:14;;;5511:48;5591:4;5582:14;;18833:61;;18929:2;18921:6;18917:15;18907:25;;18806:1;18803;18799:9;18794:14;;18770:172;;;-1:-1:-1;18959:3:1;17782:1186;-1:-1:-1;;;;;;17782:1186:1:o;18973:240::-;19153:3;19138:19;;19166:41;19142:9;19189:6;19166:41;:::i;19400:597::-;19678:4;19720:3;19709:9;19705:19;19697:27;;19751:6;19740:9;19733:25;19794:6;19789:2;19778:9;19774:18;19767:34;19837:6;19832:2;19821:9;19817:18;19810:34;19880:6;19875:2;19864:9;19860:18;19853:34;19924:6;19918:3;19907:9;19903:19;19896:35;19940:51;19986:3;19975:9;19971:19;19963:6;19940:51;:::i;:::-;19400:597;;;;;;;;;:::o;21078:572::-;21198:4;21204:6;21264:11;21251:25;21358:2;21354:7;21343:8;21327:14;21323:29;21319:43;21299:18;21295:68;21285:96;;21377:1;21374;21367:12;21285:96;21404:33;;21456:20;;;-1:-1:-1;21499:18:1;21488:30;;21485:50;;;21531:1;21528;21521:12;21485:50;21564:4;21552:17;;-1:-1:-1;21615:1:1;21611:14;;;21595;21591:35;21581:46;;21578:66;;;21640:1;21637;21630:12;21578:66;21078:572;;;;;:::o;21798:128::-;21838:3;21869:1;21865:6;21862:1;21859:13;21856:39;;;21875:18;;:::i;:::-;-1:-1:-1;21911:9:1;;21798:128::o;21931:193::-;21970:1;21996;21986:35;;22001:18;;:::i;:::-;-1:-1:-1;;;22037:18:1;;-1:-1:-1;;22057:13:1;;22033:38;22030:64;;;22074:18;;:::i;:::-;-1:-1:-1;22108:10:1;;21931:193::o;22129:120::-;22169:1;22195;22185:35;;22200:18;;:::i;:::-;-1:-1:-1;22234:9:1;;22129:120::o;22254:553::-;22293:7;-1:-1:-1;;;;;22363:9:1;;;22391;;;22416:11;;;22435:10;;;22429:17;;22412:35;22409:61;;;22450:18;;:::i;:::-;-1:-1:-1;;;22526:1:1;22519:9;;22544:11;;;22564;;;22557:19;;22540:37;22537:63;;;22580:18;;:::i;:::-;22626:1;22623;22619:9;22609:19;;22673:1;22669:2;22664:11;22661:1;22657:19;22652:2;22648;22644:11;22640:37;22637:63;;;22680:18;;:::i;:::-;22745:1;22741:2;22736:11;22733:1;22729:19;22724:2;22720;22716:11;22712:37;22709:63;;;22752:18;;:::i;:::-;-1:-1:-1;;;22792:9:1;;;;;22254:553;-1:-1:-1;;;22254:553:1:o;22812:168::-;22852:7;22918:1;22914;22910:6;22906:14;22903:1;22900:21;22895:1;22888:9;22881:17;22877:45;22874:71;;;22925:18;;:::i;:::-;-1:-1:-1;22965:9:1;;22812:168::o;22985:125::-;23025:4;23053:1;23050;23047:8;23044:34;;;23058:18;;:::i;:::-;-1:-1:-1;23095:9:1;;22985:125::o;23115:1226::-;23264:20;23259:3;23256:29;23253:55;;;23288:18;;:::i;:::-;23337:4;23331:11;23364:3;23358:4;23351:17;23388:6;23383:3;23380:15;23377:586;;;-1:-1:-1;;;;;23445:1:1;23495:14;;;23487:23;;23484:49;;;23513:18;;:::i;:::-;23565:2;23560:3;23557:11;23553:2;23549:20;23546:46;;;23572:18;;:::i;:::-;23615:1;23629:16;;;23684:4;23670:19;;23615:1;;-1:-1:-1;23774:12:1;;;23764:23;;;23722:15;;;23712:26;23800:153;23818:2;23811:5;23808:13;23800:153;;;23893:2;23886:5;23879:17;23936:2;23931;23924:5;23920:14;23913:26;23844:1;23837:5;23833:13;23824:22;;23800:153;;;23804:3;;;;23377:586;-1:-1:-1;21745:1:1;21738:14;;;21782:4;21769:18;;23986:5;;24099:236;24113:3;24110:1;24107:10;24099:236;;;24159:81;24233:6;24220:11;24159:81;:::i;:::-;24275:2;24263:15;;;;;24323:1;24306:19;;;;;24132:1;24125:9;24099:236;;;24103:3;;;23115:1226;;;:::o;24346:258::-;24418:1;24428:113;24442:6;24439:1;24436:13;24428:113;;;24518:11;;;24512:18;24499:11;;;24492:39;24464:2;24457:10;24428:113;;;24559:6;24556:1;24553:13;24550:48;;;24594:1;24585:6;24580:3;24576:16;24569:27;24550:48;;24346:258;;;:::o;24609:136::-;24648:3;24676:5;24666:39;;24685:18;;:::i;:::-;-1:-1:-1;;;24721:18:1;;24609:136::o;24750:380::-;24829:1;24825:12;;;;24872;;;24893:61;;24947:4;24939:6;24935:17;24925:27;;24893:61;25000:2;24992:6;24989:14;24969:18;24966:38;24963:161;;;25046:10;25041:3;25037:20;25034:1;25027:31;25081:4;25078:1;25071:15;25109:4;25106:1;25099:15;25135:199;25173:3;25201:8;25244:2;25237:5;25233:14;25271:2;25262:7;25259:15;25256:41;;;25277:18;;:::i;:::-;25326:1;25313:15;;25135:199;-1:-1:-1;;;25135:199:1:o;25339:135::-;25378:3;-1:-1:-1;;25399:17:1;;25396:43;;;25419:18;;:::i;:::-;-1:-1:-1;25466:1:1;25455:13;;25339:135::o;25479:175::-;25516:3;25560:4;25553:5;25549:16;25589:4;25580:7;25577:17;25574:43;;;25597:18;;:::i;:::-;25646:1;25633:15;;25479:175;-1:-1:-1;;25479:175:1:o;25659:112::-;25691:1;25717;25707:35;;25722:18;;:::i;:::-;-1:-1:-1;25756:9:1;;25659:112::o;25776:136::-;25811:3;-1:-1:-1;;;25832:22:1;;25829:48;;;25857:18;;:::i;:::-;-1:-1:-1;25897:1:1;25893:13;;25776:136::o;25917:127::-;25978:10;25973:3;25969:20;25966:1;25959:31;26009:4;26006:1;25999:15;26033:4;26030:1;26023:15;26049:127;26110:10;26105:3;26101:20;26098:1;26091:31;26141:4;26138:1;26131:15;26165:4;26162:1;26155:15;26181:127;26242:10;26237:3;26233:20;26230:1;26223:31;26273:4;26270:1;26263:15;26297:4;26294:1;26287:15;26313:127;26374:10;26369:3;26365:20;26362:1;26355:31;26405:4;26402:1;26395:15;26429:4;26426:1;26419:15;26445:1191;26616:5;26603:19;26597:4;26590:33;26677:2;26670:5;26666:14;26653:28;26649:1;26643:4;26639:12;26632:50;26736:2;26729:5;26725:14;26712:28;26708:1;26702:4;26698:12;26691:50;26795:2;26788:5;26784:14;26771:28;26767:1;26761:4;26757:12;26750:50;26854:3;26847:5;26843:15;26830:29;26826:1;26820:4;26816:12;26809:51;26914:3;26907:5;26903:15;26890:29;26886:1;26880:4;26876:12;26869:51;26974:3;26967:5;26963:15;26950:29;26946:1;26940:4;26936:12;26929:51;27034:3;27027:5;27023:15;27010:29;27006:1;27000:4;26996:12;26989:51;27094:3;27087:5;27083:15;27070:29;27066:1;27060:4;27056:12;27049:51;27137:1;27131:4;27127:12;27187:3;27180:5;27176:15;27163:29;27201:32;27225:7;27201:32;:::i;:::-;27268:17;;-1:-1:-1;;27264:39:1;27318:10;27305:24;;;;27261:69;27242:89;;27374:108;27477:3;27466:15;;27470:5;27374:108;:::i;:::-;27491:139;27616:13;27603:11;27598:2;27592:4;27588:13;27491:139;:::i;27641:354::-;27766:5;27753:19;27781:33;27806:7;27781:33;:::i;:::-;27843:11;;-1:-1:-1;;;;;;27839:54:1;-1:-1:-1;;;;;27895:33:1;;;;27836:93;27823:107;;27984:2;27973:14;;;;27960:28;27925:1;27946:12;;;;27939:50;27641:354::o;28000:131::-;-1:-1:-1;;;;;28075:31:1;;28065:42;;28055:70;;28121:1;28118;28111:12;28136:118;28222:5;28215:13;28208:21;28201:5;28198:32;28188:60;;28244:1;28241;28234:12;28259:121;28344:10;28337:5;28333:22;28326:5;28323:33;28313:61;;28370:1;28367;28360:12

Swarm Source

ipfs://8522e5ace258e7958872548ec83df4c5bfeac0ebe65ecdff74d2110764fbf992
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.