Contract 0x733206f4c40633525b160f8a7574a1ec8b0aa74e

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0698637e5f048743b9e8a3b29dec0ffece4be564500ddfd3673fdcbfb60863660x60806040299098652022-06-23 14:45:197 days 19 hrs agoSnook: Deployer IN  Create: BigBoyTable0 MATIC0.59287553130
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BigBoyTable

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-06-23
*/

// Sources flattened with hardhat v2.9.5 https://hardhat.org

// File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected]

// SPDX-License-Identifier: MIT

// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}


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


pragma solidity ^0.8.0;

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

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
    uint256[50] private __gap;
}


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


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library StringsUpgradeable {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


// File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165Upgradeable {
    /**
     * @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-upgradeable/utils/introspection/[email protected]


pragma solidity ^0.8.0;


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

    function __ERC165_init_unchained() internal initializer {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }
    uint256[50] private __gap;
}


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


pragma solidity ^0.8.0;




/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControlUpgradeable {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {
    function __AccessControl_init() internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __AccessControl_init_unchained();
    }

    function __AccessControl_init_unchained() internal initializer {
    }
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @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 {_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 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]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

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

    /**
     * @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]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                "AccessControl: account ",
                StringsUpgradeable.toHexString(uint160(account), 20),
                " is missing role ",
                StringsUpgradeable.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 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 granted `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}.
     * ====
     */
    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 {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
    uint256[49] private __gap;
}


// File @openzeppelin/contracts-upgradeable/utils/structs/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSetUpgradeable {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


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


pragma solidity ^0.8.0;



/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerableUpgradeable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable {
    function __AccessControlEnumerable_init() internal initializer {
        __Context_init_unchained();
        __ERC165_init_unchained();
        __AccessControl_init_unchained();
        __AccessControlEnumerable_init_unchained();
    }

    function __AccessControlEnumerable_init_unchained() internal initializer {
    }
    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;

    mapping (bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
    uint256[49] private __gap;
}


// File @openzeppelin/contracts-upgradeable/security/[email protected]


pragma solidity ^0.8.0;


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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pausable_init() internal initializer {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal initializer {
        _paused = false;
    }

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

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

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

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

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


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


pragma solidity ^0.8.0;

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

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

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

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


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


pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


// File contracts/IBigBoyTable.sol


pragma solidity ^0.8.0;

interface IBigBoyTable {
  event FreeRoomCreated(uint roomId, address roomOwner);
  event JoinedFreeRoom(uint roomId, address participant);
  event RoomCreated(uint roomId, address roomOwner);
  event RoomFinished(uint roomId, address payable[] winners, address payable[] unseenParticipants);
  event AgedActiveRoomDeleted(uint roomId);
  event RoomLocked(uint roomId);
  event StakeAdded(uint roomId, address participant);
  event EmergencyUnstake(uint roomId);
  enum ROOM_MODE { SINGLE, DEATHMATCH, TEAM }

  struct Room {
    uint id;
    uint participantCount;
    address payable[] participants;
    uint requiredStakeAmount;
    bool isStakeInNativeCurrency;
    address payable owner;
    ROOM_MODE roomMode;
    uint rounds; 
    bool canJoinForFree;
    uint createdAt;
    uint lockedAt;
    uint totalStake;
    string pwdRef;
    bytes32 collectionId;
  }
  
  function getMinParticipantsPerRoom() external pure returns(uint);
  function getMaxParticipantsPerRoom() external pure returns(uint);
  
  function createFreeRoom(
    uint maxParticipantCount,
    uint totalStake,
    bool isStakeInNativeCurrency,
    ROOM_MODE roomMode,
    string calldata pwdRef,
    bytes32 collectionId,
    uint rounds
  ) payable external;

  function createRoom(
    uint maxParticipantCount,
    uint requiredStakeAmount,
    bool isStakeInNativeCurrency,
    ROOM_MODE roomMode,
    string calldata pwdRef,
    bytes32 collectionId,
    uint rounds
  ) external;
  
  function joinFreeRoom(uint roomId) external;
  function stakeSNK(uint roomId) external;
  function stakeNative(uint roomId) payable external;
  function lockRoom(uint roomId) external;
  function reportWinners(
    uint roomId, 
    address payable[] memory winners,
    address payable[] memory players
  ) external;
  function deleteAgedActiveRoom(uint roomId) external;
  function emergencyUnstake(uint roomId) external;

  function getRoom(uint roomId) external view returns(Room memory);
  function getActiveRoomCount() external view returns(uint);
  function getFinishedRoomCount() external view returns(uint);
  function getActiveRooms(uint, uint) external view returns (Room[] memory);
  function getFinishedRooms(uint, uint) external view returns(Room[] memory);
  
  function getRoomCreationPriceInSNK() external view returns (uint);
  function getRoomCreationPriceInUSDC() external view returns (uint);
  function setRoomCreationPriceInUSDC(uint) external;

  // we have no oracle for native gas cost in usdc so we set manually
  function getNative2USDCRatioInEtherUnits() external view returns(uint, uint);
  function setNative2USDCRatioInEtherUnits(uint, uint) external;

  function getMinimalStakeInNative() external view returns(uint);
  function getMinimalStakeInSNK() external view returns(uint);
  function getMinimalStakeInUSDC() external view returns(uint);
  function setMinimalStakeInUSDC(uint) external;

  function getLockingWindowInSeconds() external view returns(uint);
  function setLockingWindowInSeconds(uint) external;

  function getStakingWindowInSeconds() external view returns(uint);
  function setStakingWindowInSeconds(uint) external;

  function getWinningFeeInPercents() external view returns(uint);
  function setWinningFeeInPercents(uint) external;

  function getActiveRoomDeletionDelayInSeconds() external view returns(uint);
  function setActiveRoomDeletionDelayInSeconds(uint) external;

  function getMaxRounds() external pure returns(uint);
  function getExtractorRole() external view returns(bytes32);
  function getPauserRole() external pure returns(bytes32);
  function getEmergencyExtractorRole() external view returns(bytes32);

  function getFoundersAddress() external view returns(address payable);
  function setFoundersAddress(address payable) external;

}


// File contracts/ISkillToken.sol


pragma solidity >=0.5.0;

interface ISkillToken {
    // IERC20Metadata
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);

    // IERC20
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);    
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    // SnookGame extension
    function burn(address, uint256) external;
}


// File contracts/IUniswapUSDCSkill.sol

pragma solidity >=0.6.6;

interface IUniswapUSDCSkill {
  function getSnookPriceInSkills() external view returns (uint);
}


// File contracts/ICollectionList.sol

pragma solidity ^0.8.0;

interface ICollectionList {
  struct Collection {
    bytes32 id;
    string name;
    uint chainId;
    address token;
    uint accessThresholdInCollectionTokens;
    uint activityThresholdInSNK;
    uint lockPeriodInSeconds;
    uint revshareInPercents;
    address payable revshareRecipient;    
    uint depositedSNK;
    bool active;
    uint lockedAt;
    bool depositsEnabled;
  }

  event CollectionAdded(bytes32 collectionId);
  event SNKDeposited(bytes32 collectionId, address depositor, uint amount, bool newStatus);
  event SNKWithdrawn(bytes32 collectionId, address depositor, uint amount, bool newStatus);
  event DepositsReleased(bytes32 collectionId, uint releasedCount, uint remainingCount);
  event CollectionRemoved(bytes32 collectionId);

  function addCollection(
    string calldata name,
    uint chainId,
    address token,
    uint accessThresholdInCollectionTokens,
    uint activityThresholdInSNK,
    uint lockPeriodInSeconds,
    uint revshareInPercents,
    address payable revshareRecipient
  ) external;

  function removeCollection(bytes32 collectionId) external;
  function setLock(bytes32 collectionId) external;
  function setName(bytes32 collectionId, string memory name) external;
  function setChainId(bytes32 collectionId, uint chainId) external;
  function setToken(bytes32 collectionId, address token) external;
  function setAccessThresholdInCollectionTokens(bytes32 collectionId, uint accessThresholdInColectionTokens) external;
  function setActivityThresholdInSNK(bytes32 collectionId, uint activityThresholdInSNK) external;
  function setRevshareRecipient(bytes32 collectionId, address payable revshareRecipient) external;
  function setRevshareInPercents(bytes32 collectionId, uint revshareInPercents) external;
  function setLockPeriodInSeconds(bytes32 collectionId, uint lockPeriodInSeconds) external;
  function depositSNK(bytes32 collectionId, uint amount) external;
  function withdrawSNK(bytes32 collectionId) external;
  function getCollectionCount() external view returns (uint);
  function getCollections(uint startIdx, uint endIdx) 
    external view returns(Collection[] memory);
  function getCollection(bytes32 collectionId) 
    external view returns(Collection memory);
  function getPauserRole() external pure returns(bytes32);
  function isActive(bytes32 collectionId) external view returns(bool);
  function getRevshareRecipient(bytes32 collectionId) external view returns(address payable);
  function getRevshareInPercents(bytes32 collectionId) external view returns(uint);
  function releaseDeposits(bytes32 collectionId, uint count) external;
  function getDepositRecordCount(bytes32 collectionId) view external returns(uint);
  function toggleDepositAccepting(bytes32 collectionId) external; 
  
}


// File hardhat/[email protected]

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/BigBoyTable.sol


pragma solidity ^0.8.0;







contract BigBoyTable is IBigBoyTable, AccessControlEnumerableUpgradeable, PausableUpgradeable {
  using EnumerableSet for EnumerableSet.UintSet;

  struct InitializerParameters {
    address adminAccount;
    uint winningFeeInPercents;
    uint roomCreationPriceInUSDC;
    uint lockingWindowInSeconds;
    uint stakingWindowInSeconds;
    uint activeRoomDeletionDelayInSeconds;
    uint minimalStakeInUSDC;
    uint native2usdcNumerator;
    uint native2usdcDenominator;
    address payable foundersAddress;
    address skill;
    address ecosystem;
    address uniswap;
    address collectionList;
  }

  using Counters for Counters.Counter;
  bytes32 private constant EXTRACTOR_ROLE = keccak256("EXTRACTOR_ROLE");
  bytes32 private constant EMERGENCY_EXTRACTOR_ROLE = keccak256("EMERGENCY_EXTRACTOR_ROLE");
  bytes32 private constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
  bytes32 private constant NONEXISTENT_COLLECTION_ID = 0x0;
  uint private constant MIN_PARTICIPANTS_PER_ROOM = 2;
  uint private constant MAX_PARTICIPANTS_PER_ROOM = 100;
  uint private constant _nativeCurrencyDecimals = 18; // ethereum-compatible networks
  uint private constant _usdcDecimals = 6;
  uint private constant _skillDecimals = 18;
  uint private constant MAX_ROUNDS = 24;

  Counters.Counter private _roomIds;
  
  address payable private _foundersAddress;
  ISkillToken private _skill;
  ICollectionList private _collectionList;
  address private _ecosystem;
  IUniswapUSDCSkill private _uniswap;
  // percent of SNK or Native, depending on room currency
  uint private _winningFeeInPercents;
  uint private _roomCreationPriceInUSDC;
  uint private _stakingWindowInSeconds;
  uint private _activeRoomDeletionDelayInSeconds;
  uint private _minimalStakeInUSDC;
  uint private _native2usdcNumerator;
  uint private _native2usdcDenominator;

  mapping(uint=>Room) private _rooms;
  EnumerableSet.UintSet private _activeRoomIds;
  EnumerableSet.UintSet private _finishedRoomIds;
  uint private _lockingWindowInSeconds;

  modifier onlyActiveRoom(uint roomId) {
    require(_activeRoomIds.contains(roomId), 'BBT: room is not active');
    _;
  }

  modifier whenStakePossible(uint roomId) {
    require(_activeRoomIds.contains(roomId), 'BBT: room is not active');
    require(
      _rooms[roomId].lockedAt > 0, 'BBT: room is not locked'
    );
    require(
      block.timestamp <= _rooms[roomId].lockedAt + _stakingWindowInSeconds,
      'BBT: staking window closed'
    );
    require(
      _rooms[roomId].participantCount < _rooms[roomId].participants.length,
      'BBT: no more participants possible'
    );
    _;
  }

  function getMaxRounds() external override pure returns(uint) {
    return MAX_ROUNDS;
  }

  function getExtractorRole() external override pure returns(bytes32) {
    return EXTRACTOR_ROLE;
  }

  function getEmergencyExtractorRole() external override pure returns(bytes32) {
    return EMERGENCY_EXTRACTOR_ROLE;
  }

  function getPauserRole() external override pure returns(bytes32) {
    return PAUSER_ROLE;
  }


  function initialize(InitializerParameters calldata params) initializer public {
    __AccessControlEnumerable_init();
    __Pausable_init();
    
    _setupRole(DEFAULT_ADMIN_ROLE, params.adminAccount);
    _setupRole(EXTRACTOR_ROLE, params.adminAccount);

    _foundersAddress = params.foundersAddress;
    _skill = ISkillToken(params.skill);
    _ecosystem = params.ecosystem;
    _uniswap = IUniswapUSDCSkill(params.uniswap);
    _collectionList = ICollectionList(params.collectionList);
    _winningFeeInPercents = params.winningFeeInPercents;
    _roomCreationPriceInUSDC = params.roomCreationPriceInUSDC;
    _lockingWindowInSeconds = params.lockingWindowInSeconds;
    _stakingWindowInSeconds = params.stakingWindowInSeconds;
    _activeRoomDeletionDelayInSeconds = params.activeRoomDeletionDelayInSeconds;
    _minimalStakeInUSDC = params.minimalStakeInUSDC;
    _native2usdcNumerator = params.native2usdcNumerator;
    _native2usdcDenominator = params.native2usdcDenominator;
    
  }

  function getMaxParticipantsPerRoom() external override pure returns(uint) {
    return MAX_PARTICIPANTS_PER_ROOM;
  }

  function getMinParticipantsPerRoom() external override pure returns(uint) {
    return MIN_PARTICIPANTS_PER_ROOM;
  }

  function getActiveRoomDeletionDelayInSeconds() external override view returns(uint) {
    return _activeRoomDeletionDelayInSeconds;
  }

  function setActiveRoomDeletionDelayInSeconds(uint activeRoomDeletionDelayInSeconds) 
    external override onlyRole(PAUSER_ROLE) 
  {
    _activeRoomDeletionDelayInSeconds = activeRoomDeletionDelayInSeconds;
  }

  function getWinningFeeInPercents() external override view returns(uint) {
    return _winningFeeInPercents;
  }

  function setWinningFeeInPercents(uint winningFeeInPercents) 
    external override onlyRole(PAUSER_ROLE) 
  {
    _winningFeeInPercents = winningFeeInPercents;
  }  

  function getLockingWindowInSeconds() external override view returns(uint) {
    return _lockingWindowInSeconds;
  }

  function setLockingWindowInSeconds(uint lockingWindowInSeconds) 
    external override onlyRole(PAUSER_ROLE) 
  {
    _lockingWindowInSeconds = lockingWindowInSeconds;
  } 

  function getStakingWindowInSeconds() external override view returns(uint) {
    return _stakingWindowInSeconds;
  }

  function setStakingWindowInSeconds(uint stakingWindowInSeconds) 
    external override onlyRole(PAUSER_ROLE) 
  {
    _stakingWindowInSeconds = stakingWindowInSeconds;
  } 

  function getRoomCreationPriceInUSDC() external override view returns(uint) {
    return _roomCreationPriceInUSDC;
  }

  function setRoomCreationPriceInUSDC(uint roomCreationPriceInUSDC) 
    external override onlyRole(PAUSER_ROLE) 
  {
    _roomCreationPriceInUSDC = roomCreationPriceInUSDC;
  }

  function getMinimalStakeInUSDC() external override view returns(uint) {
    return _minimalStakeInUSDC;
  }

  function setMinimalStakeInUSDC(uint minimalStakeInUSDC) 
    external override onlyRole(PAUSER_ROLE)
  {
    _minimalStakeInUSDC = minimalStakeInUSDC; 
  }

  function _getMinimalStakeInSNK() internal view returns(uint) {
    return _convertUSDC2Skill(_minimalStakeInUSDC);
  }

  function getMinimalStakeInSNK() external override view returns(uint) {
    return _getMinimalStakeInSNK();
  }

  function _getMinimalStakeInNative() internal view returns(uint) {
    return _convertUSDC2Native(_minimalStakeInUSDC);
  }

  function getMinimalStakeInNative() external override view returns(uint) {
    return _getMinimalStakeInNative();
  }

  function _convertUSDC2Skill(uint usdc) internal view returns(uint skill) {
    // NOTE: priceInSNK = priceInUSDC * k / 0.25
    uint k = _uniswap.getSnookPriceInSkills();
    skill = usdc * k * (100 / 25) / (10**_usdcDecimals);
  }

  function _convertUSDC2Native(uint usdc) internal view returns(uint native) {
    // numerator and denominator are for ETHER units of each token
    native = usdc * _native2usdcNumerator / _native2usdcDenominator * 10**_nativeCurrencyDecimals / 10**_usdcDecimals;
  }

  function getNative2USDCRatioInEtherUnits() external override view returns(uint, uint) {
    return (_native2usdcNumerator, _native2usdcDenominator);
  }

  function setNative2USDCRatioInEtherUnits(uint numerator, uint denominator) 
    external override onlyRole(PAUSER_ROLE)
  {
    _native2usdcNumerator = numerator;
    _native2usdcDenominator = denominator;
  }

  function _getRoomCreationPriceInSkill() internal view returns(uint) {
    return _convertUSDC2Skill(_roomCreationPriceInUSDC);
  }

  function getRoomCreationPriceInSNK() external override view returns (uint) {
    return _getRoomCreationPriceInSkill();
  }

  function _createRoom(
    uint maxParticipantCount,
    uint requiredStakeAmount,
    bool isStakeInNativeCurrency,
    ROOM_MODE roomMode,
    string calldata pwdRef,
    bytes32 collectionId,
    uint rounds
  ) internal returns(uint) {
    require(
      roomMode == ROOM_MODE.SINGLE || roomMode == ROOM_MODE.DEATHMATCH, 
      "BBT: unsupported mode"
    );
    require(
      rounds > 0 && rounds <= MAX_ROUNDS,
      "BBT: invalid rounds"
    );
    require(
      maxParticipantCount >= 2 && 
      maxParticipantCount <= MAX_PARTICIPANTS_PER_ROOM, 
      "BBT: invalid max number of participants"
    );

    require(
      isStakeInNativeCurrency == false && requiredStakeAmount >= _getMinimalStakeInSNK() ||
      isStakeInNativeCurrency == true && requiredStakeAmount >= _getMinimalStakeInNative(),
      "BBT: requiredStake is less than minimal"
    );
    ///@dev Creation fee is taken ONLY in SNK
    require(
      _skill.transferFrom(msg.sender, _ecosystem, _getRoomCreationPriceInSkill()),
      'BBT: Not enough SNK for room creation'
    );
    
    _roomIds.increment();
    uint roomId = _roomIds.current();
   _rooms[roomId] = Room({
      id: roomId,
      participantCount: 0,
      participants: new address payable[](maxParticipantCount),
      requiredStakeAmount: requiredStakeAmount,
      isStakeInNativeCurrency: isStakeInNativeCurrency,
      owner: payable(msg.sender),
      roomMode: roomMode,
      rounds: rounds,
      canJoinForFree: false,
      createdAt: block.timestamp,
      lockedAt: 0,
      totalStake: 0,
      pwdRef: pwdRef,
      collectionId: collectionId
    });
    _activeRoomIds.add(roomId);
    return roomId;
  }
  
  function createFreeRoom(
    uint maxParticipantCount,
    uint totalStake,
    bool isStakeInNativeCurrency,
    ROOM_MODE roomMode,
    string calldata pwdRef,
    bytes32 collectionId,
    uint rounds
  ) payable external override {
    require(
      isStakeInNativeCurrency == false && _skill.transferFrom(msg.sender, address(this), totalStake) ||
      isStakeInNativeCurrency == true && msg.value == totalStake,
      'BBT: not enough funds for stake'
    );
    uint roomId = _createRoom(
      maxParticipantCount,
      totalStake,
      isStakeInNativeCurrency,
      roomMode,
      pwdRef,
      collectionId,
      rounds
    );
    Room storage room = _rooms[roomId]; 
    room.totalStake = totalStake; 
    room.canJoinForFree = true;
    emit FreeRoomCreated(roomId, msg.sender);
  }

  function createRoom(
    uint maxParticipantCount,
    uint requiredStakeAmount,
    bool isStakeInNativeCurrency,
    ROOM_MODE roomMode,
    string calldata pwdRef,
    bytes32 collectionId,
    uint rounds
  ) external override
  {
    uint roomId = _createRoom(
      maxParticipantCount, 
      requiredStakeAmount, 
      isStakeInNativeCurrency, 
      roomMode,
      pwdRef,
      collectionId,
      rounds
    );
    emit RoomCreated(roomId, msg.sender); 
  }

  /// @dev After room locking, the stakes are possible during staking window.
  function lockRoom(uint roomId) external override onlyActiveRoom(roomId) {
    Room storage room = _rooms[roomId];
    require(msg.sender == room.owner, 'BBT: not a room owner');
    require(room.lockedAt == 0, 'BBT: room already locked');
    require(block.timestamp <= room.createdAt + _lockingWindowInSeconds, 'BBT: locking window is closed');
    room.lockedAt = block.timestamp;
    emit RoomLocked(roomId);
  } 

  function joinFreeRoom(uint roomId) whenStakePossible(roomId)
    external override 
  {
    Room storage room = _rooms[roomId];
    require(room.canJoinForFree == true, 'BBT: room is not free');
    room.participants[room.participantCount] = payable(msg.sender);
    room.participantCount += 1;
    emit JoinedFreeRoom(roomId, msg.sender); 
  }

  function stakeSNK(uint roomId) 
    external override whenStakePossible(roomId) 
  {
    Room storage room = _rooms[roomId];
    require(
      room.isStakeInNativeCurrency == false,
      'BBT: stakes should be in native currency'
    );
    require(
      _skill.transferFrom(msg.sender, address(this), room.requiredStakeAmount),
      'BBT: not enough SNK for stake'
    );
    
    room.participants[room.participantCount] = payable(msg.sender);
    room.participantCount += 1;
    room.totalStake += room.requiredStakeAmount;
    emit StakeAdded(roomId, msg.sender);
  }

  function stakeNative(uint roomId) 
    payable external override whenStakePossible(roomId)
  {
    Room storage room = _rooms[roomId];
    require(
      room.isStakeInNativeCurrency == true,
      'BBT: stakes should be in SNK'
    );
    require(
      msg.value == room.requiredStakeAmount,
      'BBT: not enough native currency for stake'
    );
    room.participants[room.participantCount] = payable(msg.sender);
    room.participantCount += 1;
    room.totalStake += room.requiredStakeAmount;
    emit StakeAdded(roomId, msg.sender);
  } 


  function _areParticipants(Room memory room, address payable[] memory winners) 
    internal pure returns(bool) 
  {
    for (uint i=0; i<winners.length; i++) {
      bool found = false;
      for (uint j=0; j<room.participantCount; j++) {
        if (winners[i] == room.participants[j]) {
          found = true;
          break;
        }
      }
      if (found == false) {
        return false;
      }
    }
    return true;
  }
  
  function _arrayDifference(
    address payable[] memory arr1, 
    address payable[] memory arr2
  ) internal pure returns(address payable[] memory) 
  {
    address payable[] memory a1 = arr1;
    address payable[] memory a2 = arr2;
    if (arr1.length < arr2.length) {
      a2 = arr1;
      a1 = arr2;
    }
    uint maxlen = a1.length + a2.length;
    address payable[] memory d = new address payable[](maxlen);
    uint k = 0;
    for (uint i=0; i<a1.length; i++) {
      bool found = false;
      for (uint j=0; j<a2.length; j++) {
        if (a1[i] == a2[j]) {
          found = true;
          break;
        }
      }
      if (found == false) {
        d[k++] = a1[i];
      }
    }
    address payable[] memory result = new address payable[](k);
    for (uint i=0; i<k; i++) {
      result[i] = d[i];
    }
    return result;
  }

  /**
    @dev
    Not all participants may successfully join the game (the server may not see an event of the stake from one of them).
    So we return the stake to participants who staked but not played. 
   */
  function reportWinners(
    uint roomId, 
    address payable[] memory winners,
    address payable[] memory players  
  ) onlyActiveRoom(roomId) onlyRole(EXTRACTOR_ROLE) external override  
  {
    Room memory room = _rooms[roomId];
    require(room.lockedAt > 0, "BBT: cannot report winners before room is locked");
    require(
      block.timestamp > room.lockedAt + _stakingWindowInSeconds,
      "BBT: cannot report winners before staking window is closed"
    );

    require(
      players.length >= MIN_PARTICIPANTS_PER_ROOM && // condition for GS to start the game
      players.length <= room.participantCount,
      "BBT: invalid number of players"
    );

    require(
      winners.length >= 1 && 
      winners.length <= players.length, 
      "BBT: invalid number of winners"
    );
    
    require(
      _areParticipants(room, winners) == true, 
      'BBT: one or more of reported winners are not participant'
    );

    require(
      _areParticipants(room, players) == true, 
      'BBT: one or more of reported players are not participant'
    );

    // For free rooms, we return stakes to the participants who were not seen by GS.
    uint returnedStake = 0;
    address payable[] memory unseenParticipants;
    if (
      _rooms[roomId].canJoinForFree == false && 
      players.length < room.participantCount
    ) 
    { 
      unseenParticipants = _arrayDifference(players, room.participants);
      returnedStake = room.requiredStakeAmount * unseenParticipants.length;
      room.totalStake -= returnedStake;
      for (uint i=0; i<unseenParticipants.length; i++) {
        if (room.isStakeInNativeCurrency == false) {
          _skill.transfer(unseenParticipants[i], room.requiredStakeAmount);
        } else {
          unseenParticipants[i].transfer(room.requiredStakeAmount);
        }
      }
    }

    uint winningFeeAmount = room.totalStake * _winningFeeInPercents / 100;
    uint revshareAmount = 0;
    uint revshareInPercents = 0;
    address payable revshareRecipient;
    if (room.collectionId != NONEXISTENT_COLLECTION_ID) {
      revshareInPercents = _collectionList.getRevshareInPercents(room.collectionId);
      revshareRecipient = _collectionList.getRevshareRecipient(room.collectionId);
      revshareAmount = room.totalStake * revshareInPercents / 100;
    }
    uint prizeAmount = (room.totalStake - winningFeeAmount - revshareAmount)/winners.length;

    /// @dev Send winning fee to Foundation.
    if (room.isStakeInNativeCurrency == false) {
      _skill.transfer(_foundersAddress, winningFeeAmount);
    } else {
      (bool sent,) = _foundersAddress.call{value: winningFeeAmount}("");
      require(sent, "BBT: winning fee was not sent to founders");
    }

    /// @dev Send revshare if collection exists and active and revshareAmount > 0 
    if (
      revshareAmount > 0 &&
      room.collectionId != NONEXISTENT_COLLECTION_ID && 
      _collectionList.isActive(room.collectionId)
    ) 
    {
      if (room.isStakeInNativeCurrency == false) {
        _skill.transfer(revshareRecipient, revshareAmount);
      } else {
        (bool sent,) = revshareRecipient.call{value: revshareAmount}("");
        require(sent, "BBT: revshare was not sent to recipient");
      }
    }

    /// @dev Send prize to the winners.
    for (uint i=0; i<winners.length; i++) {
      if (room.isStakeInNativeCurrency == false) {
        _skill.transfer(winners[i], prizeAmount);
      } else {
        winners[i].transfer(prizeAmount);
      }
    }

    _activeRoomIds.remove(roomId);
    _finishedRoomIds.add(roomId);
    emit RoomFinished(roomId, winners, unseenParticipants);
  }

  function getRoom(uint roomId) external override view returns(Room memory) {
    require(
      _activeRoomIds.contains(roomId) || _finishedRoomIds.contains(roomId), 
      "BBT: invalid room id"
    );
    return _rooms[roomId];
  }

  function getActiveRoomCount() external override view returns(uint) {
    return _activeRoomIds.length();
  }

  function getFinishedRoomCount() external override view returns(uint) {
    return _finishedRoomIds.length();
  }

  function getActiveRooms(uint startIdx, uint endIdx) external override view 
    returns(Room[] memory)
  {
    require(
      startIdx < endIdx && endIdx <= _activeRoomIds.length(), 
      "BBT: invalid indexes"
    );
    Room[] memory slice = new Room[](endIdx-startIdx);
    for (uint i=startIdx; i<endIdx; i++) {
      slice[i-startIdx] = _rooms[_activeRoomIds.at(i)];
    } 
    return slice;
  }

  function getFinishedRooms(uint startIdx, uint endIdx) external override view 
    returns(Room[] memory)
  {
    require(
      startIdx < endIdx && endIdx <= _finishedRoomIds.length(), 
      "BBT: invalid indexes"
    );
    Room[] memory slice = new Room[](endIdx-startIdx);
    for (uint i=startIdx; i<endIdx; i++) {
      slice[i-startIdx] = _rooms[_finishedRoomIds.at(i)];
    } 
    return slice;
  }

  function deleteAgedActiveRoom(uint roomId) external override onlyActiveRoom(roomId) {
    require(
      block.timestamp > _rooms[roomId].createdAt + _activeRoomDeletionDelayInSeconds,
      "BBT: room is not aged enough"
    );
    Room storage room = _rooms[roomId];
    if (room.canJoinForFree == true) { // free room, return stake to the room creator
      if (room.isStakeInNativeCurrency == true) {
        room.owner.transfer(room.totalStake);
      } else {
        _skill.transfer(room.owner, room.totalStake);
      }
    } else { // non-free room, return stakes to all participants (stakers)
      if (room.isStakeInNativeCurrency == true) {
        for (uint i=0; i<room.participantCount; i++) {
          room.participants[i].transfer(room.requiredStakeAmount);
        }
      } else {
        for (uint i=0; i<room.participantCount; i++) {
          _skill.transfer(room.participants[i], room.requiredStakeAmount);
        }
      }
    }

    _activeRoomIds.remove(roomId);
    emit AgedActiveRoomDeleted(roomId);
  }

  function emergencyUnstake(uint roomId) 
    onlyActiveRoom(roomId) onlyRole(EMERGENCY_EXTRACTOR_ROLE) external override
  {
    Room storage room = _rooms[roomId];
    if (room.isStakeInNativeCurrency == false) {
      if (room.canJoinForFree == false) { // non free room, participants made stakes
        /// @dev Loop gas limit is prevents as during creation participantCount is limited.
        for (uint i=0; i<room.participantCount; i++) {
          _skill.transfer(room.participants[i], room.requiredStakeAmount);
        }
      } 
    } else {
      if (room.canJoinForFree == false) {
        for (uint i=0; i<room.participantCount; i++) {
          room.participants[i].transfer(room.requiredStakeAmount);
        }
      }
    }

    room.createdAt = block.timestamp;
    room.lockedAt = 0;
    room.participantCount = 0;
    room.totalStake = 0;
    emit EmergencyUnstake(roomId);
  }

  function getFoundersAddress() external override view returns(address payable) {
    return _foundersAddress;
  }

  function setFoundersAddress(address payable foundersAddress) onlyRole(PAUSER_ROLE) external override {
    _foundersAddress = foundersAddress;
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"AgedActiveRoomDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"EmergencyUnstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"},{"indexed":false,"internalType":"address","name":"roomOwner","type":"address"}],"name":"FreeRoomCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"},{"indexed":false,"internalType":"address","name":"participant","type":"address"}],"name":"JoinedFreeRoom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"uint256","name":"roomId","type":"uint256"},{"indexed":false,"internalType":"address","name":"roomOwner","type":"address"}],"name":"RoomCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"},{"indexed":false,"internalType":"address payable[]","name":"winners","type":"address[]"},{"indexed":false,"internalType":"address payable[]","name":"unseenParticipants","type":"address[]"}],"name":"RoomFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"RoomLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roomId","type":"uint256"},{"indexed":false,"internalType":"address","name":"participant","type":"address"}],"name":"StakeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxParticipantCount","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"bool","name":"isStakeInNativeCurrency","type":"bool"},{"internalType":"enum IBigBoyTable.ROOM_MODE","name":"roomMode","type":"uint8"},{"internalType":"string","name":"pwdRef","type":"string"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"rounds","type":"uint256"}],"name":"createFreeRoom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxParticipantCount","type":"uint256"},{"internalType":"uint256","name":"requiredStakeAmount","type":"uint256"},{"internalType":"bool","name":"isStakeInNativeCurrency","type":"bool"},{"internalType":"enum IBigBoyTable.ROOM_MODE","name":"roomMode","type":"uint8"},{"internalType":"string","name":"pwdRef","type":"string"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"rounds","type":"uint256"}],"name":"createRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"deleteAgedActiveRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveRoomCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveRoomDeletionDelayInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIdx","type":"uint256"},{"internalType":"uint256","name":"endIdx","type":"uint256"}],"name":"getActiveRooms","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"address payable[]","name":"participants","type":"address[]"},{"internalType":"uint256","name":"requiredStakeAmount","type":"uint256"},{"internalType":"bool","name":"isStakeInNativeCurrency","type":"bool"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"enum IBigBoyTable.ROOM_MODE","name":"roomMode","type":"uint8"},{"internalType":"uint256","name":"rounds","type":"uint256"},{"internalType":"bool","name":"canJoinForFree","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"string","name":"pwdRef","type":"string"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"internalType":"struct IBigBoyTable.Room[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEmergencyExtractorRole","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getExtractorRole","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getFinishedRoomCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIdx","type":"uint256"},{"internalType":"uint256","name":"endIdx","type":"uint256"}],"name":"getFinishedRooms","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"address payable[]","name":"participants","type":"address[]"},{"internalType":"uint256","name":"requiredStakeAmount","type":"uint256"},{"internalType":"bool","name":"isStakeInNativeCurrency","type":"bool"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"enum IBigBoyTable.ROOM_MODE","name":"roomMode","type":"uint8"},{"internalType":"uint256","name":"rounds","type":"uint256"},{"internalType":"bool","name":"canJoinForFree","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"string","name":"pwdRef","type":"string"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"internalType":"struct IBigBoyTable.Room[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFoundersAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockingWindowInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxParticipantsPerRoom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMaxRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMinParticipantsPerRoom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMinimalStakeInNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimalStakeInSNK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimalStakeInUSDC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNative2USDCRatioInEtherUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPauserRole","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"getRoom","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"address payable[]","name":"participants","type":"address[]"},{"internalType":"uint256","name":"requiredStakeAmount","type":"uint256"},{"internalType":"bool","name":"isStakeInNativeCurrency","type":"bool"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"enum IBigBoyTable.ROOM_MODE","name":"roomMode","type":"uint8"},{"internalType":"uint256","name":"rounds","type":"uint256"},{"internalType":"bool","name":"canJoinForFree","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lockedAt","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"string","name":"pwdRef","type":"string"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"internalType":"struct IBigBoyTable.Room","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoomCreationPriceInSNK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoomCreationPriceInUSDC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingWindowInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWinningFeeInPercents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"components":[{"internalType":"address","name":"adminAccount","type":"address"},{"internalType":"uint256","name":"winningFeeInPercents","type":"uint256"},{"internalType":"uint256","name":"roomCreationPriceInUSDC","type":"uint256"},{"internalType":"uint256","name":"lockingWindowInSeconds","type":"uint256"},{"internalType":"uint256","name":"stakingWindowInSeconds","type":"uint256"},{"internalType":"uint256","name":"activeRoomDeletionDelayInSeconds","type":"uint256"},{"internalType":"uint256","name":"minimalStakeInUSDC","type":"uint256"},{"internalType":"uint256","name":"native2usdcNumerator","type":"uint256"},{"internalType":"uint256","name":"native2usdcDenominator","type":"uint256"},{"internalType":"address payable","name":"foundersAddress","type":"address"},{"internalType":"address","name":"skill","type":"address"},{"internalType":"address","name":"ecosystem","type":"address"},{"internalType":"address","name":"uniswap","type":"address"},{"internalType":"address","name":"collectionList","type":"address"}],"internalType":"struct BigBoyTable.InitializerParameters","name":"params","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"joinFreeRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"lockRoom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"},{"internalType":"address payable[]","name":"winners","type":"address[]"},{"internalType":"address payable[]","name":"players","type":"address[]"}],"name":"reportWinners","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":"uint256","name":"activeRoomDeletionDelayInSeconds","type":"uint256"}],"name":"setActiveRoomDeletionDelayInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"foundersAddress","type":"address"}],"name":"setFoundersAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockingWindowInSeconds","type":"uint256"}],"name":"setLockingWindowInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimalStakeInUSDC","type":"uint256"}],"name":"setMinimalStakeInUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setNative2USDCRatioInEtherUnits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomCreationPriceInUSDC","type":"uint256"}],"name":"setRoomCreationPriceInUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingWindowInSeconds","type":"uint256"}],"name":"setStakingWindowInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"winningFeeInPercents","type":"uint256"}],"name":"setWinningFeeInPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"stakeNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roomId","type":"uint256"}],"name":"stakeSNK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061518e806100206000396000f3fe6080604052600436106102c95760003560e01c806391d1485411610175578063cb741d14116100dc578063e63c6bf011610095578063ef2f1eeb1161006f578063ef2f1eeb14610808578063f4f2326314610828578063f6c9b7441461083d578063fbbabcaf14610852576102c9565b8063e63c6bf0146107c0578063ea799802146107d3578063edd5ac11146107f3576102c9565b8063cb741d14146106fd578063ceb3ea621461071d578063d547741f1461073d578063d8df05601461075d578063e06ff9c614610780578063e358df8f146107a0576102c9565b8063b70862411161012e578063b70862411461065e578063bc12b71614610673578063bfadc65c14610693578063c1b931be146106a8578063c68ae885146106bd578063ca15c873146106dd576102c9565b806391d14854146105cc5780639447b1a4146105ec5780639847931f146106015780639d06c30914610616578063a217fddf14610636578063ad647c4e1461064b576102c9565b80632f2ff15d116102345780636d8a74cb116101ed57806387565d5e116101c757806387565d5e1461054a5780638b2d22371461056a5780638d320ca21461057f5780639010d07c1461059f576102c9565b80636d8a74cb146104db5780637d64985214610508578063834e5eaa14610535576102c9565b80632f2ff15d1461043c57806336568abe1461045c5780634309ae121461047c5780634f8f2b01146104915780635c975abb146104a65780636acb4980146104bb576102c9565b806317c8884d1161028657806317c8884d1461039d57806319eab083146103bd5780631e6e4e04146103d2578063248a9ca3146103e757806328f0e286146104075780632acf73e814610427576102c9565b8063012ce501146102ce57806301ffc9a7146102f05780630d090fbb146103265780630ef0a52f14610348578063156a387614610368578063166ad63414610388575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004614187565b610867565b005b3480156102fc57600080fd5b5061031061030b3660046141ef565b610ad3565b60405161031d9190614618565b60405180910390f35b34801561033257600080fd5b5061033b610b00565b60405161031d9190614623565b34801561035457600080fd5b506102ee6103633660046141ce565b610b07565b34801561037457600080fd5b506102ee6103833660046142b1565b610b30565b34801561039457600080fd5b5061033b610b88565b3480156103a957600080fd5b506102ee6103b8366004614187565b610b8f565b3480156103c957600080fd5b5061033b610bb1565b3480156103de57600080fd5b5061033b610bc0565b3480156103f357600080fd5b5061033b610402366004614187565b610be4565b34801561041357600080fd5b506102ee610422366004614247565b610bf9565b34801561043357600080fd5b5061033b6116ee565b34801561044857600080fd5b506102ee61045736600461419f565b6116f3565b34801561046857600080fd5b506102ee61047736600461419f565b61171a565b34801561048857600080fd5b5061033b61173c565b34801561049d57600080fd5b5061033b611760565b3480156104b257600080fd5b5061031061176a565b3480156104c757600080fd5b506102ee6104d6366004614187565b611773565b3480156104e757600080fd5b506104fb6104f6366004614187565b611795565b60405161031d9190614e63565b34801561051457600080fd5b506105286105233660046141ce565b6119b9565b60405161031d91906145b8565b34801561054157600080fd5b5061033b611cb0565b34801561055657600080fd5b506102ee610565366004614133565b611cb7565b34801561057657600080fd5b5061033b611cf5565b34801561058b57600080fd5b506102ee61059a366004614187565b611cfa565b3480156105ab57600080fd5b506105bf6105ba3660046141ce565b611d1c565b60405161031d9190614567565b3480156105d857600080fd5b506103106105e736600461419f565b611d3b565b3480156105f857600080fd5b5061033b611d66565b34801561060d57600080fd5b5061033b611d6d565b34801561062257600080fd5b506102ee610631366004614187565b611d77565b34801561064257600080fd5b5061033b611e77565b6102ee6106593660046142b1565b611e7c565b34801561066a57600080fd5b5061033b611fc0565b34801561067f57600080fd5b506102ee61068e366004614187565b611fc7565b34801561069f57600080fd5b5061033b611fe9565b3480156106b457600080fd5b5061033b611fee565b3480156106c957600080fd5b506102ee6106d8366004614187565b612000565b3480156106e957600080fd5b5061033b6106f8366004614187565b612268565b34801561070957600080fd5b506102ee610718366004614187565b61227f565b34801561072957600080fd5b506102ee610738366004614187565b6125c1565b34801561074957600080fd5b506102ee61075836600461419f565b6125e3565b34801561076957600080fd5b506107726125ed565b60405161031d929190614ec2565b34801561078c57600080fd5b5061052861079b3660046141ce565b6125f9565b3480156107ac57600080fd5b506102ee6107bb366004614187565b6128e6565b6102ee6107ce366004614187565b612908565b3480156107df57600080fd5b506102ee6107ee366004614217565b612a32565b3480156107ff57600080fd5b506105bf612c44565b34801561081457600080fd5b506102ee610823366004614187565b612c53565b34801561083457600080fd5b5061033b612dfc565b34801561084957600080fd5b5061033b612e09565b34801561085e57600080fd5b5061033b612e16565b8061087461010982612e1d565b6108995760405162461bcd60e51b815260040161089090614d65565b60405180910390fd5b7f4edebb69cd9d6569902dabdec7c91c11f65df00335e42b9a2c13432f7bb3ff0e6108cb816108c6612e29565b612e2d565b600083815261010860205260409020600481015460ff166109e357600681015460ff166109de5760005b81600101548110156109dc5760fd546002830180546001600160a01b039092169163a9059cbb91908490811061093b57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460038501546040516001600160e01b031960e085901b168152610977926001600160a01b0316919060040161457b565b602060405180830381600087803b15801561099157600080fd5b505af11580156109a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c9919061416b565b50806109d4816150ce565b9150506108f5565b505b610a7a565b600681015460ff16610a7a5760005b8160010154811015610a7857816002018181548110610a2157634e487b7160e01b600052603260045260246000fd5b600091825260208220015460038401546040516001600160a01b039092169281156108fc029290818181858888f19350505050158015610a65573d6000803e3d6000fd5b5080610a70816150ce565b9150506109f2565b505b4260078201556000600882018190556001820181905560098201556040517f0efda3452a76bf3b550355556930eba4bd2b56b2bc81b6c0eb56c4679a6a064c90610ac5908690614623565b60405180910390a150505050565b60006001600160e01b03198216635a05180f60e01b1480610af85750610af882612e91565b90505b919050565b6101025490565b600080516020615139833981519152610b22816108c6612e29565b506101069190915561010755565b6000610b428989898989898989612eb6565b90507fdeb4915464f2fab35f9ed95b8c2dc62a1af9edc45ebc42643517a7893e49bca88133604051610b75929190614e76565b60405180910390a1505050505050505050565b6101055490565b600080516020615139833981519152610baa816108c6612e29565b5061010255565b6000610bbb6132de565b905090565b7f11cf46bea1094f63335637b879e8021ce59a9008b10e90c59d17337675ebc79290565b60009081526065602052604090206001015490565b82610c0661010982612e1d565b610c225760405162461bcd60e51b815260040161089090614d65565b7f11cf46bea1094f63335637b879e8021ce59a9008b10e90c59d17337675ebc792610c4f816108c6612e29565b60008581526101086020908152604080832081516101c08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015610ccb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610cad575b505050918352505060038201546020820152600482015460ff808216151560408401526001600160a01b036101008304166060840152608090920191600160a81b909104166002811115610d2f57634e487b7160e01b600052602160045260246000fd5b6002811115610d4e57634e487b7160e01b600052602160045260246000fd5b815260058201546020820152600682015460ff16151560408201526007820154606082015260088201546080820152600982015460a0820152600a8201805460c090920191610d9c90615099565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890615099565b8015610e155780601f10610dea57610100808354040283529160200191610e15565b820191906000526020600020905b815481529060010190602001808311610df857829003601f168201915b50505050508152602001600b820154815250509050600081610140015111610e4f5760405162461bcd60e51b815260040161089090614c97565b61010354816101400151610e639190614ed0565b4211610e815760405162461bcd60e51b815260040161089090614818565b6002845110158015610e9857508060200151845111155b610eb45760405162461bcd60e51b8152600401610890906147e1565b6001855110158015610ec857508351855111155b610ee45760405162461bcd60e51b815260040161089090614c29565b610eee81866132ec565b1515600114610f0f5760405162461bcd60e51b815260040161089090614875565b610f1981856132ec565b1515600114610f3a5760405162461bcd60e51b8152600401610890906148d2565b6000868152610108602052604081206006015460609060ff16158015610f64575082602001518651105b156110ea57610f778684604001516133be565b905080518360600151610f8a919061501c565b9150818361016001818151610f9f919061503b565b90525060005b81518110156110e85760808401516110705760fd5482516001600160a01b039091169063a9059cbb90849084908110610fee57634e487b7160e01b600052603260045260246000fd5b602002602001015186606001516040518363ffffffff1660e01b815260040161101892919061457b565b602060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106a919061416b565b506110d6565b81818151811061109057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166108fc85606001519081150290604051600060405180830381858888f193505050501580156110d4573d6000803e3d6000fd5b505b806110e0816150ce565b915050610fa5565b505b6000606461010154856101600151611102919061501c565b61110c9190614ee8565b905060008060008060001b876101a001511461124f5760fe546101a088015160405163681c3cc960e01b81526001600160a01b039092169163681c3cc99161115691600401614623565b60206040518083038186803b15801561116e57600080fd5b505afa158015611182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a6919061422f565b60fe546101a0890151604051637263bac360e11b81529294506001600160a01b039091169163e4c77586916111dd91600401614623565b60206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d919061414f565b9050606482886101600151611242919061501c565b61124c9190614ee8565b92505b60008b5184868a6101600151611265919061503b565b61126f919061503b565b6112799190614ee8565b60808901519091506113135760fd5460fc5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926112bb92911690899060040161457b565b602060405180830381600087803b1580156112d557600080fd5b505af11580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130d919061416b565b50611396565b60fc546040516000916001600160a01b0316908790611331906144ef565b60006040518083038185875af1925050503d806000811461136e576040519150601f19603f3d011682016040523d82523d6000602084013e611373565b606091505b50509050806113945760405162461bcd60e51b815260040161089090614bb1565b505b6000841180156113aa57506101a088015115155b8015611435575060fe546101a089015160405163170da40760e21b81526001600160a01b0390921691635c36901c916113e591600401614623565b60206040518083038186803b1580156113fd57600080fd5b505afa158015611411573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611435919061416b565b1561154b5760808801516114cd5760fd5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611475908590889060040161457b565b602060405180830381600087803b15801561148f57600080fd5b505af11580156114a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c7919061416b565b5061154b565b6000826001600160a01b0316856040516114e6906144ef565b60006040518083038185875af1925050503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b50509050806115495760405162461bcd60e51b815260040161089090614b6a565b505b60005b8c518110156116895760808901516116155760fd548d516001600160a01b039091169063a9059cbb908f908490811061159757634e487b7160e01b600052603260045260246000fd5b6020026020010151846040518363ffffffff1660e01b81526004016115bd92919061457b565b602060405180830381600087803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f919061416b565b50611677565b8c818151811061163557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015611675573d6000803e3d6000fd5b505b80611681816150ce565b91505061154e565b506116966101098e613647565b506116a361010b8e613653565b507f61fe78b87b005cff1b592934cf5c5cc4e3008e05bc916a9752c48f3ad8b751c68d8d886040516116d793929190614e8d565b60405180910390a150505050505050505050505050565b606490565b6116fd828261365f565b6000828152609760205260409020611715908261367e565b505050565b6117248282613693565b600082815260976020526040902061171590826136d5565b7f4edebb69cd9d6569902dabdec7c91c11f65df00335e42b9a2c13432f7bb3ff0e90565b6000610bbb6136ea565b60c95460ff1690565b60008051602061513983398151915261178e816108c6612e29565b5061010d55565b61179d613efd565b6117a961010983612e1d565b806117bb57506117bb61010b83612e1d565b6117d75760405162461bcd60e51b815260040161089090614a6a565b6000828152610108602090815260409182902082516101c081018452815481526001820154818401526002820180548551818602810186018752818152929593949386019383018282801561185557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611837575b505050918352505060038201546020820152600482015460ff808216151560408401526001600160a01b036101008304166060840152608090920191600160a81b9091041660028111156118b957634e487b7160e01b600052602160045260246000fd5b60028111156118d857634e487b7160e01b600052602160045260246000fd5b815260058201546020820152600682015460ff16151560408201526007820154606082015260088201546080820152600982015460a0820152600a8201805460c09092019161192690615099565b80601f016020809104026020016040519081016040528092919081815260200182805461195290615099565b801561199f5780601f106119745761010080835404028352916020019161199f565b820191906000526020600020905b81548152906001019060200180831161198257829003601f168201915b50505050508152602001600b820154815250509050919050565b606081831080156119d457506119d06101096136f8565b8211155b6119f05760405162461bcd60e51b815260040161089090614745565b60006119fc848461503b565b67ffffffffffffffff811115611a2257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a5b57816020015b611a48613efd565b815260200190600190039081611a405790505b509050835b83811015611ca6576101086000611a7961010984613703565b8152602001908152602001600020604051806101c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611b0057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ae2575b505050918352505060038201546020820152600482015460ff808216151560408401526001600160a01b036101008304166060840152608090920191600160a81b909104166002811115611b6457634e487b7160e01b600052602160045260246000fd5b6002811115611b8357634e487b7160e01b600052602160045260246000fd5b815260058201546020820152600682015460ff16151560408201526007820154606082015260088201546080820152600982015460a0820152600a8201805460c090920191611bd190615099565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd90615099565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b50505050508152602001600b82015481525050828683611c6a919061503b565b81518110611c8857634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611c9e906150ce565b915050611a60565b5090505b92915050565b6101045490565b600080516020615139833981519152611cd2816108c6612e29565b5060fc80546001600160a01b0319166001600160a01b0392909216919091179055565b600290565b600080516020615139833981519152611d15816108c6612e29565b5061010355565b6000828152609760205260408120611d349083613703565b9392505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6101015490565b6000610bbb61370f565b80611d8461010982612e1d565b611da05760405162461bcd60e51b815260040161089090614d65565b600082815261010860205260409020600481015461010090046001600160a01b03163314611de05760405162461bcd60e51b815260040161089090614bfa565b600881015415611e025760405162461bcd60e51b8152600401610890906147aa565b61010d548160070154611e159190614ed0565b421115611e345760405162461bcd60e51b815260040161089090614a33565b4260088201556040517f76e8d3f2e1eda7b2aff7a471cc350013f132caca7b60b6c43bc09f525414b60f90611e6a908590614623565b60405180910390a1505050565b600081565b85158015611f0b575060fd546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611eb990339030908c90600401614594565b602060405180830381600087803b158015611ed357600080fd5b505af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0b919061416b565b80611f2257506001861515148015611f2257508634145b611f3e5760405162461bcd60e51b815260040161089090614b33565b6000611f508989898989898989612eb6565b6000818152610108602052604090819020600981018b905560068101805460ff191660011790559051919250907f1a90e66d0456e3af5e76c3cfe0c1da5f6676ea4d3e51556d86fd0d1a6ad2dd0990611fac9084903390614e76565b60405180910390a150505050505050505050565b6101035490565b600080516020615139833981519152611fe2816108c6612e29565b5061010555565b601890565b60008051602061513983398151915290565b8061200d61010982612e1d565b6120295760405162461bcd60e51b815260040161089090614d65565b600081815261010860205260409020600801546120585760405162461bcd60e51b815260040161089090614a98565b61010354600082815261010860205260409020600801546120799190614ed0565b4211156120985760405162461bcd60e51b815260040161089090614ce7565b6000818152610108602052604090206002810154600190910154106120cf5760405162461bcd60e51b8152600401610890906149c2565b600082815261010860205260409020600481015460ff16156121035760405162461bcd60e51b8152600401610890906146b6565b60fd5460038201546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161213a9133913091600401614594565b602060405180830381600087803b15801561215457600080fd5b505af1158015612168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218c919061416b565b6121a85760405162461bcd60e51b815260040161089090614acf565b33816002018260010154815481106121d057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018160010160008282546122139190614ed0565b90915550506003810154600982018054600090612231908490614ed0565b90915550506040517ff12a66daa955e8255b989ee232c8ad1f6d294f4448b87f72b497295e54758a4f90611e6a9085903390614e76565b6000818152609760205260408120610af8906136f8565b8061228c61010982612e1d565b6122a85760405162461bcd60e51b815260040161089090614d65565b61010454600083815261010860205260409020600701546122c99190614ed0565b42116122e75760405162461bcd60e51b815260040161089090614773565b600082815261010860205260409020600681015460ff161515600114156123fe57600481015460ff1615156001141561236457600481015460098201546040516101009092046001600160a01b0316916108fc82150291906000818181858888f1935050505015801561235e573d6000803e3d6000fd5b506123f9565b60fd54600480830154600984015460405163a9059cbb60e01b81526001600160a01b039485169463a9059cbb946123a594610100900490911692910161457b565b602060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f7919061416b565b505b612585565b600481015460ff161515600114156124995760005b81600101548110156123f75781600201818154811061244257634e487b7160e01b600052603260045260246000fd5b600091825260208220015460038401546040516001600160a01b039092169281156108fc029290818181858888f19350505050158015612486573d6000803e3d6000fd5b5080612491816150ce565b915050612413565b60005b81600101548110156125835760fd546002830180546001600160a01b039092169163a9059cbb9190849081106124e257634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460038501546040516001600160e01b031960e085901b16815261251e926001600160a01b0316919060040161457b565b602060405180830381600087803b15801561253857600080fd5b505af115801561254c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612570919061416b565b508061257b816150ce565b91505061249c565b505b61259161010984613647565b507f90a6e7b3e793c835ae7bd0cdb2cafd5f03b11e536eef9eb6ad1791cb82bf0d3883604051611e6a9190614623565b6000805160206151398339815191526125dc816108c6612e29565b5061010155565b611724828261371d565b61010654610107549091565b60608183108015612614575061261061010b6136f8565b8211155b6126305760405162461bcd60e51b815260040161089090614745565b600061263c848461503b565b67ffffffffffffffff81111561266257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561269b57816020015b612688613efd565b8152602001906001900390816126805790505b509050835b83811015611ca65761010860006126b961010b84613703565b8152602001908152602001600020604051806101c001604052908160008201548152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561274057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612722575b505050918352505060038201546020820152600482015460ff808216151560408401526001600160a01b036101008304166060840152608090920191600160a81b9091041660028111156127a457634e487b7160e01b600052602160045260246000fd5b60028111156127c357634e487b7160e01b600052602160045260246000fd5b815260058201546020820152600682015460ff16151560408201526007820154606082015260088201546080820152600982015460a0820152600a8201805460c09092019161281190615099565b80601f016020809104026020016040519081016040528092919081815260200182805461283d90615099565b801561288a5780601f1061285f5761010080835404028352916020019161288a565b820191906000526020600020905b81548152906001019060200180831161286d57829003601f168201915b50505050508152602001600b820154815250508286836128aa919061503b565b815181106128c857634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806128de906150ce565b9150506126a0565b600080516020615139833981519152612901816108c6612e29565b5061010455565b8061291561010982612e1d565b6129315760405162461bcd60e51b815260040161089090614d65565b600081815261010860205260409020600801546129605760405162461bcd60e51b815260040161089090614a98565b61010354600082815261010860205260409020600801546129819190614ed0565b4211156129a05760405162461bcd60e51b815260040161089090614ce7565b6000818152610108602052604090206002810154600190910154106129d75760405162461bcd60e51b8152600401610890906149c2565b600082815261010860205260409020600481015460ff161515600114612a0f5760405162461bcd60e51b815260040161089090614c60565b806003015434146121a85760405162461bcd60e51b815260040161089090614dcb565b600054610100900460ff1680612a4b575060005460ff16155b612a675760405162461bcd60e51b815260040161089090614974565b600054610100900460ff16158015612a92576000805460ff1961ff0019909116610100171660011790555b612a9a61373c565b612aa26137d1565b612ab96000612ab46020850185614133565b613841565b612aea7f11cf46bea1094f63335637b879e8021ce59a9008b10e90c59d17337675ebc792612ab46020850185614133565b612afc61014083016101208401614133565b60fc80546001600160a01b0319166001600160a01b0392909216919091179055612b2e61016083016101408401614133565b60fd80546001600160a01b0319166001600160a01b0392909216919091179055612b6061018083016101608401614133565b60ff80546001600160a01b0319166001600160a01b0392909216919091179055612b926101a083016101808401614133565b61010080546001600160a01b0319166001600160a01b0392909216919091179055612bc56101c083016101a08401614133565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055602082013561010155604082013561010255606082013561010d5560808201356101035560a08201356101045560c08201356101055560e082013561010655610100820135610107558015612c40576000805461ff00191690555b5050565b60fc546001600160a01b031690565b80612c6061010982612e1d565b612c7c5760405162461bcd60e51b815260040161089090614d65565b60008181526101086020526040902060080154612cab5760405162461bcd60e51b815260040161089090614a98565b6101035460008281526101086020526040902060080154612ccc9190614ed0565b421115612ceb5760405162461bcd60e51b815260040161089090614ce7565b600081815261010860205260409020600281015460019091015410612d225760405162461bcd60e51b8152600401610890906149c2565b600082815261010860205260409020600681015460ff161515600114612d5a5760405162461bcd60e51b815260040161089090614d9c565b3381600201826001015481548110612d8257634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001816001016000828254612dc59190614ed0565b90915550506040517fad05497db7681a74140530daeedc0d0178492f9de1518990947e7cf27c83de5990611e6a9085903390614e76565b6000610bbb61010b6136f8565b6000610bbb6101096136f8565b61010d5490565b6000611d34838361384b565b3390565b612e378282611d3b565b612c4057612e4f816001600160a01b03166014613863565b612e5a836020613863565b604051602001612e6b9291906144f2565b60408051601f198184030181529082905262461bcd60e51b82526108909160040161462c565b60006001600160e01b03198216637965db0b60e01b1480610af85750610af882613a15565b600080866002811115612ed957634e487b7160e01b600052602160045260246000fd5b1480612f0457506001866002811115612f0257634e487b7160e01b600052602160045260246000fd5b145b612f205760405162461bcd60e51b815260040161089090614a04565b600082118015612f31575060188211155b612f4d5760405162461bcd60e51b815260040161089090614b06565b60028910158015612f5f575060648911155b612f7b5760405162461bcd60e51b8152600401610890906146fe565b86158015612f905750612f8c6132de565b8810155b80612faf57506001871515148015612faf5750612fab6136ea565b8810155b612fcb5760405162461bcd60e51b815260040161089090614d1e565b60fd5460ff546001600160a01b03918216916323b872dd91339116612fee61370f565b6040518463ffffffff1660e01b815260040161300c93929190614594565b602060405180830381600087803b15801561302657600080fd5b505af115801561303a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305e919061416b565b61307a5760405162461bcd60e51b81526004016108909061492f565b61308460fb613a2e565b600061309060fb613a37565b9050604051806101c00160405280828152602001600081526020018b67ffffffffffffffff8111156130d257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156130fb578160200160208202803683370190505b508152602081018b9052891515604082015233606082015260800188600281111561313657634e487b7160e01b600052602160045260246000fd5b8152602001848152602001600015158152602001428152602001600081526020016000815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505050602091820187905283815261010882526040908190208351815583830151600182015590830151805191926131d392600285019290910190613f9b565b5060608201516003820155608082015160048201805460a08501516001600160a01b031661010002610100600160a81b031993151560ff1990921691909117929092169190911780825560c0840151919060ff60a81b1916600160a81b83600281111561325057634e487b7160e01b600052602160045260246000fd5b021790555060e0820151600582015561010082015160068201805460ff191691151591909117905561012082015160078201556101408201516008820155610160820151600982015561018082015180516132b591600a840191602090910190614000565b506101a09190910151600b909101556132d061010982613653565b509998505050505050505050565b6000610bbb61010554613a3b565b6000805b82518110156133b4576000805b8560200151811015613390578560400151818151811061332d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031685848151811061335e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141561337e5760019150613390565b80613388816150ce565b9150506132fd565b50806133a157600092505050611caa565b50806133ac816150ce565b9150506132f0565b5060019392505050565b805182516060918491849111156133d55750829050835b6000815183516133e59190614ed0565b905060008167ffffffffffffffff81111561341057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613439578160200160208202803683370190505b5090506000805b8551811015613567576000805b86518110156134d95786818151811061347657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168884815181106134a757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156134c757600191506134d9565b806134d1816150ce565b91505061344d565b5080613554578682815181106134ff57634e487b7160e01b600052603260045260246000fd5b6020026020010151848480613513906150ce565b95508151811061353357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b508061355f816150ce565b915050613440565b5060008167ffffffffffffffff81111561359157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156135ba578160200160208202803683370190505b50905060005b8281101561363a578381815181106135e857634e487b7160e01b600052603260045260246000fd5b602002602001015182828151811061361057634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280613632816150ce565b9150506135c0565b5098975050505050505050565b6000611d348383613af2565b6000611d348383613c09565b61366882610be4565b613674816108c6612e29565b6117158383613c53565b6000611d34836001600160a01b038416613c09565b61369b612e29565b6001600160a01b0316816001600160a01b0316146136cb5760405162461bcd60e51b815260040161089090614e14565b612c408282613cda565b6000611d34836001600160a01b038416613af2565b6000610bbb61010554613d5f565b6000610af882613a37565b6000611d348383613da9565b6000610bbb61010254613a3b565b61372682610be4565b613732816108c6612e29565b6117158383613cda565b600054610100900460ff1680613755575060005460ff16155b6137715760405162461bcd60e51b815260040161089090614974565b600054610100900460ff1615801561379c576000805460ff1961ff0019909116610100171660011790555b6137a4613e02565b6137ac613e02565b6137b4613e02565b6137bc613e02565b80156137ce576000805461ff00191690555b50565b600054610100900460ff16806137ea575060005460ff16155b6138065760405162461bcd60e51b815260040161089090614974565b600054610100900460ff16158015613831576000805460ff1961ff0019909116610100171660011790555b613839613e02565b6137bc613e75565b6116fd8282613ef3565b60009081526001919091016020526040902054151590565b6060600061387283600261501c565b61387d906002614ed0565b67ffffffffffffffff8111156138a357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156138cd576020820181803683370190505b509050600360fc1b816000815181106138f657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061393357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061395784600261501c565b613962906001614ed0565b90505b60018111156139f6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106139a457634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106139c857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936139ef81615082565b9050613965565b508315611d345760405162461bcd60e51b815260040161089090614681565b6001600160e01b031981166301ffc9a760e01b14919050565b80546001019055565b5490565b60008061010060009054906101000a90046001600160a01b03166001600160a01b031663b7d002076040518163ffffffff1660e01b815260040160206040518083038186803b158015613a8d57600080fd5b505afa158015613aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac5919061422f565b9050613ad36006600a614f4e565b613add828561501c565b613ae890600461501c565b611d349190614ee8565b60008181526001830160205260408120548015613bff576000613b1660018361503b565b8554909150600090613b2a9060019061503b565b90506000866000018281548110613b5157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110613b8257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260018901909152604090208490558654879080613bc357634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611caa565b6000915050611caa565b6000613c15838361384b565b613c4b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611caa565b506000611caa565b613c5d8282611d3b565b612c405760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613c96612e29565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b613ce48282611d3b565b15612c405760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19169055613d1b612e29565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000613d6d6006600a614f4e565b613d796012600a614f4e565b6101075461010654613d8b908661501c565b613d959190614ee8565b613d9f919061501c565b610af89190614ee8565b81546000908210613dcc5760405162461bcd60e51b81526004016108909061463f565b826000018281548110613def57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600054610100900460ff1680613e1b575060005460ff16155b613e375760405162461bcd60e51b815260040161089090614974565b600054610100900460ff161580156137bc576000805460ff1961ff00199091166101001716600117905580156137ce576000805461ff001916905550565b600054610100900460ff1680613e8e575060005460ff16155b613eaa5760405162461bcd60e51b815260040161089090614974565b600054610100900460ff16158015613ed5576000805460ff1961ff0019909116610100171660011790555b60c9805460ff1916905580156137ce576000805461ff001916905550565b612c408282613c53565b604051806101c001604052806000815260200160008152602001606081526020016000815260200160001515815260200160006001600160a01b0316815260200160006002811115613f5f57634e487b7160e01b600052602160045260246000fd5b81526020016000815260200160001515815260200160008152602001600081526020016000815260200160608152602001600080191681525090565b828054828255906000526020600020908101928215613ff0579160200282015b82811115613ff057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613fbb565b50613ffc929150614074565b5090565b82805461400c90615099565b90600052602060002090601f01602090048101928261402e5760008555613ff0565b82601f1061404757805160ff1916838001178555613ff0565b82800160010185558215613ff0579182015b82811115613ff0578251825591602001919060010190614059565b5b80821115613ffc5760008155600101614075565b8035610afb81615115565b600082601f8301126140a4578081fd5b8135602067ffffffffffffffff808311156140c1576140c16150ff565b818302604051838282010181811084821117156140e0576140e06150ff565b604052848152838101925086840182880185018910156140fe578687fd5b8692505b858310156141275761411381614089565b845292840192600192909201918401614102565b50979650505050505050565b600060208284031215614144578081fd5b8135611d3481615115565b600060208284031215614160578081fd5b8151611d3481615115565b60006020828403121561417c578081fd5b8151611d348161512a565b600060208284031215614198578081fd5b5035919050565b600080604083850312156141b1578081fd5b8235915060208301356141c381615115565b809150509250929050565b600080604083850312156141e0578182fd5b50508035926020909101359150565b600060208284031215614200578081fd5b81356001600160e01b031981168114611d34578182fd5b60006101c08284031215614229578081fd5b50919050565b600060208284031215614240578081fd5b5051919050565b60008060006060848603121561425b578081fd5b83359250602084013567ffffffffffffffff80821115614279578283fd5b61428587838801614094565b9350604086013591508082111561429a578283fd5b506142a786828701614094565b9150509250925092565b60008060008060008060008060e0898b0312156142cc578586fd5b883597506020890135965060408901356142e58161512a565b95506060890135600381106142f8578485fd5b9450608089013567ffffffffffffffff80821115614314578586fd5b818b0191508b601f830112614327578586fd5b813581811115614335578687fd5b8c6020828501011115614346578687fd5b999c989b50969995986020919091019790965060a08601359560c00135945092505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156143b05781516001600160a01b03168752958201959082019060010161438b565b509495945050505050565b15159052565b600381106143df57634e487b7160e01b600052602160045260246000fd5b9052565b600081518084526143fb816020860160208601615052565b601f01601f19169290920160200192915050565b60006101c08251845260208301516020850152604083015181604086015261443982860182614378565b91505060608301516060850152608083015161445860808601826143bb565b5060a083015161446b60a086018261436b565b5060c083015161447e60c08601826143c1565b5060e083015160e08501526101008084015161449c828701826143bb565b505061012083810151908501526101408084015190850152610160808401519085015261018080840151858303828701526144d783826143e3565b6101a095860151969095019590955250919392505050565b90565b60007f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008252835161452a816017850160208801615052565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161455b816028840160208801615052565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561460b57603f198886030184526145f985835161440f565b945092850192908501906001016145dd565b5092979650505050505050565b901515815260200190565b90815260200190565b600060208252611d3460208301846143e3565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526028908201527f4242543a207374616b65732073686f756c6420626520696e206e61746976652060408201526763757272656e637960c01b606082015260800190565b60208082526027908201527f4242543a20696e76616c6964206d6178206e756d626572206f66207061727469604082015266636970616e747360c81b606082015260800190565b6020808252601490820152734242543a20696e76616c696420696e646578657360601b604082015260600190565b6020808252601c908201527f4242543a20726f6f6d206973206e6f74206167656420656e6f75676800000000604082015260600190565b60208082526018908201527f4242543a20726f6f6d20616c7265616479206c6f636b65640000000000000000604082015260600190565b6020808252601e908201527f4242543a20696e76616c6964206e756d626572206f6620706c61796572730000604082015260600190565b6020808252603a908201527f4242543a2063616e6e6f74207265706f72742077696e6e657273206265666f7260408201527f65207374616b696e672077696e646f7720697320636c6f736564000000000000606082015260800190565b60208082526038908201527f4242543a206f6e65206f72206d6f7265206f66207265706f727465642077696e60408201527f6e65727320617265206e6f74207061727469636970616e740000000000000000606082015260800190565b60208082526038908201527f4242543a206f6e65206f72206d6f7265206f66207265706f7274656420706c6160408201527f7965727320617265206e6f74207061727469636970616e740000000000000000606082015260800190565b60208082526025908201527f4242543a204e6f7420656e6f75676820534e4b20666f7220726f6f6d2063726560408201526430ba34b7b760d91b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526022908201527f4242543a206e6f206d6f7265207061727469636970616e747320706f737369626040820152616c6560f01b606082015260800190565b6020808252601590820152744242543a20756e737570706f72746564206d6f646560581b604082015260600190565b6020808252601d908201527f4242543a206c6f636b696e672077696e646f7720697320636c6f736564000000604082015260600190565b6020808252601490820152731090950e881a5b9d985b1a59081c9bdbdb481a5960621b604082015260600190565b60208082526017908201527f4242543a20726f6f6d206973206e6f74206c6f636b6564000000000000000000604082015260600190565b6020808252601d908201527f4242543a206e6f7420656e6f75676820534e4b20666f72207374616b65000000604082015260600190565b6020808252601390820152724242543a20696e76616c696420726f756e647360681b604082015260600190565b6020808252601f908201527f4242543a206e6f7420656e6f7567682066756e647320666f72207374616b6500604082015260600190565b60208082526027908201527f4242543a20726576736861726520776173206e6f742073656e7420746f20726560408201526618da5c1a595b9d60ca1b606082015260800190565b60208082526029908201527f4242543a2077696e6e696e672066656520776173206e6f742073656e7420746f60408201526820666f756e6465727360b81b606082015260800190565b60208082526015908201527421212a1d103737ba1030903937b7b69037bbb732b960591b604082015260600190565b6020808252601e908201527f4242543a20696e76616c6964206e756d626572206f662077696e6e6572730000604082015260600190565b6020808252601c908201527f4242543a207374616b65732073686f756c6420626520696e20534e4b00000000604082015260600190565b60208082526030908201527f4242543a2063616e6e6f74207265706f72742077696e6e657273206265666f7260408201526f19481c9bdbdb481a5cc81b1bd8dad95960821b606082015260800190565b6020808252601a908201527f4242543a207374616b696e672077696e646f7720636c6f736564000000000000604082015260600190565b60208082526027908201527f4242543a2072657175697265645374616b65206973206c657373207468616e206040820152661b5a5b9a5b585b60ca1b606082015260800190565b60208082526017908201527f4242543a20726f6f6d206973206e6f7420616374697665000000000000000000604082015260600190565b6020808252601590820152744242543a20726f6f6d206973206e6f74206672656560581b604082015260600190565b60208082526029908201527f4242543a206e6f7420656e6f756768206e61746976652063757272656e637920604082015268666f72207374616b6560b81b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b600060208252611d34602083018461440f565b9182526001600160a01b0316602082015260400190565b600084825260606020830152614ea66060830185614378565b8281036040840152614eb88185614378565b9695505050505050565b918252602082015260400190565b60008219821115614ee357614ee36150e9565b500190565b600082614f0357634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611614f1a5750614f45565b818704821115614f2c57614f2c6150e9565b80861615614f3957918102915b9490941c938002614f0b565b94509492505050565b6000611d346000198484600082614f6757506001611d34565b81614f7457506000611d34565b8160018114614f8a5760028114614f9457614fc1565b6001915050611d34565b60ff841115614fa557614fa56150e9565b6001841b915084821115614fbb57614fbb6150e9565b50611d34565b5060208310610133831016604e8410600b8410161715614ff4575081810a83811115614fef57614fef6150e9565b611d34565b6150018484846001614f08565b808604821115615013576150136150e9565b02949350505050565b6000816000190483118215151615615036576150366150e9565b500290565b60008282101561504d5761504d6150e9565b500390565b60005b8381101561506d578181015183820152602001615055565b8381111561507c576000848401525b50505050565b600081615091576150916150e9565b506000190190565b6002810460018216806150ad57607f821691505b6020821081141561422957634e487b7160e01b600052602260045260246000fd5b60006000198214156150e2576150e26150e9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146137ce57600080fd5b80151581146137ce57600080fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa26469706673582212201a2d9a37aecaae81603432a12c18c8bc2e71590761200d7b9a920680334000d764736f6c63430008000033

Deployed ByteCode Sourcemap

115161:21884:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;135848:920;;;;;;;;;;-1:-1:-1;135848:920:0;;;;;:::i;:::-;;:::i;:::-;;27482:238;;;;;;;;;;-1:-1:-1;27482:238:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;120826:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;122590:214::-;;;;;;;;;;-1:-1:-1;122590:214:0;;;;;:::i;:::-;;:::i;125645:490::-;;;;;;;;;;-1:-1:-1;125645:490:0;;;;;:::i;:::-;;:::i;121136:109::-;;;;;;;;;;;;;:::i;120951:179::-;;;;;;;;;;-1:-1:-1;120951:179:0;;;;;:::i;:::-;;:::i;121542:112::-;;;;;;;;;;;;;:::i;117949:102::-;;;;;;;;;;;;;:::i;13266:123::-;;;;;;;;;;-1:-1:-1;13266:123:0;;;;;:::i;:::-;;:::i;129725:3728::-;;;;;;;;;;-1:-1:-1;129725:3728:0;;;;;:::i;:::-;;:::i;119308:119::-;;;;;;;;;;;;;:::i;28864:165::-;;;;;;;;;;-1:-1:-1;28864:165:0;;;;;:::i;:::-;;:::i;29387:174::-;;;;;;;;;;-1:-1:-1;29387:174:0;;;;;:::i;:::-;;:::i;118057:121::-;;;;;;;;;;;;;:::i;121790:118::-;;;;;;;;;;;;;:::i;31185:86::-;;;;;;;;;;;;;:::i;120339:175::-;;;;;;;;;;-1:-1:-1;120339:175:0;;;;;:::i;:::-;;:::i;133459:238::-;;;;;;;;;;-1:-1:-1;133459:238:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;133939:413::-;;;;;;;;;;-1:-1:-1;133939:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;119558:137::-;;;;;;;;;;;;;:::i;136894:148::-;;;;;;;;;;-1:-1:-1;136894:148:0;;;;;:::i;:::-;;:::i;119433:119::-;;;;;;;;;;;;;:::i;120644:175::-;;;;;;;;;;-1:-1:-1;120644:175:0;;;;;:::i;:::-;;:::i;28319:145::-;;;;;;;;;;-1:-1:-1;28319:145:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12242:139::-;;;;;;;;;;-1:-1:-1;12242:139:0;;;;;:::i;:::-;;:::i;119922:113::-;;;;;;;;;;;;;:::i;122948:125::-;;;;;;;;;;;;;:::i;126220:422::-;;;;;;;;;;-1:-1:-1;126220:422:0;;;;;:::i;:::-;;:::i;10196:49::-;;;;;;;;;;;;;:::i;124812:827::-;;;;;;:::i;:::-;;:::i;120521:117::-;;;;;;;;;;;;;:::i;121251:159::-;;;;;;;;;;-1:-1:-1;121251:159:0;;;;;:::i;:::-;;:::i;117852:91::-;;;;;;;;;;;;;:::i;118184:96::-;;;;;;;;;;;;;:::i;127007:592::-;;;;;;;;;;-1:-1:-1;127007:592:0;;;;;:::i;:::-;;:::i;28638:134::-;;;;;;;;;;-1:-1:-1;28638:134:0;;;;;:::i;:::-;;:::i;134783:1059::-;;;;;;;;;;-1:-1:-1;134783:1059:0;;;;;:::i;:::-;;:::i;120041:167::-;;;;;;;;;;-1:-1:-1;120041:167:0;;;;;:::i;:::-;;:::i;29122:170::-;;;;;;;;;;-1:-1:-1;29122:170:0;;;;;:::i;:::-;;:::i;122430:154::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;134358:419::-;;;;;;;;;;-1:-1:-1;134358:419:0;;;;;:::i;:::-;;:::i;119701:215::-;;;;;;;;;;-1:-1:-1;119701:215:0;;;;;:::i;:::-;;:::i;127605:560::-;;;;;;:::i;:::-;;:::i;118288:1014::-;;;;;;;;;;-1:-1:-1;118288:1014:0;;;;;:::i;:::-;;:::i;136774:114::-;;;;;;;;;;;;;:::i;126649:352::-;;;;;;;;;;-1:-1:-1;126649:352:0;;;;;:::i;:::-;;:::i;133819:114::-;;;;;;;;;;;;;:::i;133703:110::-;;;;;;;;;;;;;:::i;120216:117::-;;;;;;;;;;;;;:::i;135848:920::-;135908:6;117277:31;:14;135908:6;117277:23;:31::i;:::-;117269:67;;;;-1:-1:-1;;;117269:67:0;;;;;;;:::i;:::-;;;;;;;;;115954:37:::1;11800:30;11811:4;11817:12;:10;:12::i;:::-;11800:10;:30::i;:::-;135979:17:::2;135999:14:::0;;;:6:::2;:14;::::0;;;;136024:28:::2;::::0;::::2;::::0;::::2;;136020:584;;136076:19;::::0;::::2;::::0;::::2;;136072:323;;136258:6;136253:133;136270:4;:21;;;136268:1;:23;136253:133;;;136311:6;::::0;136327:17:::2;::::0;::::2;:20:::0;;-1:-1:-1;;;;;136311:6:0;;::::2;::::0;:15:::2;::::0;136327:17;136345:1;;136327:20;::::2;;;-1:-1:-1::0;;;136327:20:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;136349:24:::2;::::0;::::2;::::0;136311:63:::2;::::0;-1:-1:-1;;;;;;136311:63:0::2;::::0;;;;;;::::2;::::0;-1:-1:-1;;;;;136327:20:0::2;::::0;136349:24;136311:63:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;136293:3:0;::::2;::::0;::::2;:::i;:::-;;;;136253:133;;;;136072:323;136020:584;;;136422:19;::::0;::::2;::::0;::::2;;136418:179;;136468:6;136463:125;136480:4;:21;;;136478:1;:23;136463:125;;;136521:4;:17;;136539:1;136521:20;;;;;;-1:-1:-1::0;;;136521:20:0::2;;;;;;;;;;::::0;;;::::2;::::0;;::::2;::::0;136551:24:::2;::::0;::::2;::::0;136521:55:::2;::::0;-1:-1:-1;;;;;136521:20:0;;::::2;::::0;:55;::::2;;;::::0;;;:20;:55;136551:24;136521:20;:55;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;136503:3:0;::::2;::::0;::::2;:::i;:::-;;;;136463:125;;;;136418:179;136629:15;136612:14;::::0;::::2;:32:::0;136667:1:::2;136651:13;::::0;::::2;:17:::0;;;136675:21:::2;::::0;::::2;:25:::0;;;136707:15:::2;::::0;::::2;:19:::0;136738:24:::2;::::0;::::2;::::0;::::2;::::0;136755:6;;136738:24:::2;:::i;:::-;;;;;;;;11841:1;117343::::1;135848:920:::0;;:::o;27482:238::-;27567:4;-1:-1:-1;;;;;;27591:68:0;;-1:-1:-1;;;27591:68:0;;:121;;;27676:36;27700:11;27676:23;:36::i;:::-;27584:128;;27482:238;;;;:::o;120826:119::-;120915:24;;120826:119;:::o;122590:214::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;122721:21:0::1;:33:::0;;;;122761:23:::1;:37:::0;122590:214::o;125645:490::-;125894:11;125908:177;125928:19;125957;125986:23;126019:8;126036:6;;126051:12;126072:6;125908:11;:177::i;:::-;125894:191;;126097:31;126109:6;126117:10;126097:31;;;;;;;:::i;:::-;;;;;;;;125645:490;;;;;;;;;:::o;121136:109::-;121220:19;;121136:109;:::o;120951:179::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;121074:24:0::1;:50:::0;120951:179::o;121542:112::-;121605:4;121625:23;:21;:23::i;:::-;121618:30;;121542:112;:::o;117949:102::-;115870:27;117949:102;:::o;13266:123::-;13332:7;13359:12;;;:6;:12;;;;;:22;;;;13266:123::o;129725:3728::-;129867:6;117277:31;:14;129867:6;117277:23;:31::i;:::-;117269:67;;;;-1:-1:-1;;;117269:67:0;;;;;;;:::i;:::-;115870:27:::1;11800:30;11811:4;11817:12;:10;:12::i;11800:30::-;129930:16:::2;129949:14:::0;;;:6:::2;:14;::::0;;;;;;;129930:33;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;129949:14;;129930:33;;;;::::2;::::0;;;::::2;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;129930:33:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;-1:-1:-1::0;;;129930:33:0;;;-1:-1:-1;;129930:33:0::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;::::0;;;;-1:-1:-1;;;;;129930:33:0::2;::::0;::::2;;::::0;;;;;;;;;-1:-1:-1;;;129930:33:0;;::::2;;;::::0;::::2;;;;-1:-1:-1::0;;;129930:33:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;129930:33:0::2;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;;;;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;129994:1;129978:4;:13;;;:17;129970:78;;;;-1:-1:-1::0;;;129970:78:0::2;;;;;;;:::i;:::-;130105:23;;130089:4;:13;;;:39;;;;:::i;:::-;130071:15;:57;130055:149;;;;-1:-1:-1::0;;;130055:149:0::2;;;;;;;:::i;:::-;116175:1;130229:7;:14;:43;;:131;;;;;130339:4;:21;;;130321:7;:14;:39;;130229:131;130213:195;;;;-1:-1:-1::0;;;130213:195:0::2;;;;;;;:::i;:::-;130451:1;130433:7;:14;:19;;:63;;;;;130482:7;:14;130464:7;:14;:32;;130433:63;130417:128;;;;-1:-1:-1::0;;;130417:128:0::2;;;;;;;:::i;:::-;130574:31;130591:4;130597:7;130574:16;:31::i;:::-;:39;;130609:4;130574:39;130558:130;;;;-1:-1:-1::0;;;130558:130:0::2;;;;;;;:::i;:::-;130713:31;130730:4;130736:7;130713:16;:31::i;:::-;:39;;130748:4;130713:39;130697:130;;;;-1:-1:-1::0;;;130697:130:0::2;;;;;;;:::i;:::-;130922:18;131013:14:::0;;;:6:::2;:14;::::0;;;;:29:::2;;::::0;130951:43:::2;::::0;131013:29:::2;;:38;::::0;::::2;:88;;;131080:4;:21;;;131063:7;:14;:38;131013:88;131001:611;;;131146:44;131163:7;131172:4;:17;;;131146:16;:44::i;:::-;131125:65;;131242:18;:25;131215:4;:24;;;:52;;;;:::i;:::-;131199:68;;131295:13;131276:4;:15;;:32;;;;;;;:::i;:::-;::::0;;-1:-1:-1;131322:6:0::2;131317:288;131334:18;:25;131332:1;:27;131317:288;;;131381:28;::::0;::::2;::::0;131377:219:::2;;131433:6;::::0;131449:21;;-1:-1:-1;;;;;131433:6:0;;::::2;::::0;:15:::2;::::0;131449:18;;131468:1;;131449:21;::::2;;;-1:-1:-1::0;;;131449:21:0::2;;;;;;;;;;;;;;;131472:4;:24;;;131433:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;131377:219;;;131528:18;131547:1;131528:21;;;;;;-1:-1:-1::0;;;131528:21:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;131528:30:0::2;:56;131559:4;:24;;;131528:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;131377:219;131361:3:::0;::::2;::::0;::::2;:::i;:::-;;;;131317:288;;;;131001:611;131620:21;131686:3;131662:21;;131644:4;:15;;;:39;;;;:::i;:::-;:45;;;;:::i;:::-;131620:69;;131696:19;131726:23:::0;131760:33:::2;116117:3:::0;131825:25:::2;;131804:4;:17;;;:46;131800:298;;131882:15;::::0;131920:17:::2;::::0;::::2;::::0;131882:56:::2;::::0;-1:-1:-1;;;131882:56:0;;-1:-1:-1;;;;;131882:15:0;;::::2;::::0;:37:::2;::::0;:56:::2;::::0;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131967:15;::::0;132004:17:::2;::::0;::::2;::::0;131967:55:::2;::::0;-1:-1:-1;;;131967:55:0;;131861:77;;-1:-1:-1;;;;;;131967:15:0;;::::2;::::0;:36:::2;::::0;:55:::2;::::0;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131947:75;;132087:3;132066:18;132048:4;:15;;;:36;;;;:::i;:::-;:42;;;;:::i;:::-;132031:59;;131800:298;132104:16;132177:7;:14;132161;132142:16;132124:4;:15;;;:34;;;;:::i;:::-;:51;;;;:::i;:::-;132123:68;;;;:::i;:::-;132250:28;::::0;::::2;::::0;132104:87;;-1:-1:-1;132246:266:0::2;;132298:6;::::0;132314:16:::2;::::0;132298:51:::2;::::0;-1:-1:-1;;;132298:51:0;;-1:-1:-1;;;;;132298:6:0;;::::2;::::0;:15:::2;::::0;:51:::2;::::0;132314:16;::::2;::::0;132332;;132298:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;132246:266;;;132387:16;::::0;:50:::2;::::0;132373:9:::2;::::0;-1:-1:-1;;;;;132387:16:0::2;::::0;132416;;132387:50:::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;132372:65;;;132454:4;132446:58;;;;-1:-1:-1::0;;;132446:58:0::2;;;;;;;:::i;:::-;132246:266;;132633:1;132616:14;:18;:75;;;;-1:-1:-1::0;132645:17:0::2;::::0;::::2;::::0;:46;::::2;132616:75;:130;;;;-1:-1:-1::0;132703:15:0::2;::::0;132728:17:::2;::::0;::::2;::::0;132703:43:::2;::::0;-1:-1:-1;;;132703:43:0;;-1:-1:-1;;;;;132703:15:0;;::::2;::::0;:24:::2;::::0;:43:::2;::::0;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;132604:444;;;132773:28;::::0;::::2;::::0;132769:272:::2;;132823:6;::::0;:50:::2;::::0;-1:-1:-1;;;132823:50:0;;-1:-1:-1;;;;;132823:6:0;;::::2;::::0;:15:::2;::::0;:50:::2;::::0;132839:17;;132858:14;;132823:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;132769:272;;;132901:9;132915:17;-1:-1:-1::0;;;;;132915:22:0::2;132945:14;132915:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;132900:64;;;132983:4;132975:56;;;;-1:-1:-1::0;;;132975:56:0::2;;;;;;;:::i;:::-;132769:272;;133102:6;133097:217;133114:7;:14;133112:1;:16;133097:217;;;133148:28;::::0;::::2;::::0;133144:163:::2;;133198:6;::::0;133214:10;;-1:-1:-1;;;;;133198:6:0;;::::2;::::0;:15:::2;::::0;133214:7;;133222:1;;133214:10;::::2;;;-1:-1:-1::0;;;133214:10:0::2;;;;;;;;;;;;;;;133226:11;133198:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;133144:163;;;133265:7;133273:1;133265:10;;;;;;-1:-1:-1::0;;;133265:10:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;133265:19:0::2;:32;133285:11;133265:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;133144:163;133130:3:::0;::::2;::::0;::::2;:::i;:::-;;;;133097:217;;;-1:-1:-1::0;133322:29:0::2;:14;133344:6:::0;133322:21:::2;:29::i;:::-;-1:-1:-1::0;133358:28:0::2;:16;133379:6:::0;133358:20:::2;:28::i;:::-;;133398:49;133411:6;133419:7;133428:18;133398:49;;;;;;;;:::i;:::-;;;;;;;;11841:1;;;;;;;;117343::::1;129725:3728:::0;;;;:::o;119308:119::-;116231:3;119308:119;:::o;28864:165::-;28949:30;28965:4;28971:7;28949:15;:30::i;:::-;28990:18;;;;:12;:18;;;;;:31;;29013:7;28990:22;:31::i;:::-;;28864:165;;:::o;29387:174::-;29475:33;29494:4;29500:7;29475:18;:33::i;:::-;29519:18;;;;:12;:18;;;;;:34;;29545:7;29519:25;:34::i;118057:121::-;115954:37;118057:121;:::o;121790:118::-;121856:4;121876:26;:24;:26::i;31185:86::-;31256:7;;;;31185:86;:::o;120339:175::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;120460:23:0::1;:48:::0;120339:175::o;133459:238::-;133520:11;;:::i;:::-;133556:31;:14;133580:6;133556:23;:31::i;:::-;:68;;;-1:-1:-1;133591:33:0;:16;133617:6;133591:25;:33::i;:::-;133540:123;;;;-1:-1:-1;;;133540:123:0;;;;;;;:::i;:::-;133677:14;;;;:6;:14;;;;;;;;;133670:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133677:14;;133670:21;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;133670:21:0;;;;;;;;;;;;;;;;-1:-1:-1;;;133670:21:0;;;-1:-1:-1;;133670:21:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;133670:21:0;;;;;;;;;;;;;-1:-1:-1;;;133670:21:0;;;;;;;;;;-1:-1:-1;;;133670:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;133670:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133459:238;;;:::o;133939:413::-;134028:13;134080:6;134069:8;:17;:54;;;;;134100:23;:14;:21;:23::i;:::-;134090:6;:33;;134069:54;134053:109;;;;-1:-1:-1;;;134053:109:0;;;;;;;:::i;:::-;134169:19;134202:15;134209:8;134202:6;:15;:::i;:::-;134191:27;;;;;;-1:-1:-1;;;134191:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;134169:49:0;-1:-1:-1;134237:8:0;134225:102;134249:6;134247:1;:8;134225:102;;;134291:6;:28;134298:20;:14;134316:1;134298:17;:20::i;:::-;134291:28;;;;;;;;;;;134271:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134271:48:0;;;;;;;;;;;;;;;;-1:-1:-1;;;134271:48:0;;;-1:-1:-1;;134271:48:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134271:48:0;;;;;;;;;;;;;-1:-1:-1;;;134271:48:0;;;;;;;;;;-1:-1:-1;;;134271:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;134271:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;134279:8;134277:1;:10;;;;:::i;:::-;134271:17;;;;;;-1:-1:-1;;;134271:17:0;;;;;;;;;;;;;;:48;;;;134257:3;;;;;:::i;:::-;;;;134225:102;;;-1:-1:-1;134341:5:0;-1:-1:-1;133939:413:0;;;;;:::o;119558:137::-;119656:33;;119558:137;:::o;136894:148::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;137002:16:0::1;:34:::0;;-1:-1:-1;;;;;;137002:34:0::1;-1:-1:-1::0;;;;;137002:34:0;;;::::1;::::0;;;::::1;::::0;;136894:148::o;119433:119::-;116175:1;119433:119;:::o;120644:175::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;120765:23:0::1;:48:::0;120644:175::o;28319:145::-;28401:7;28428:18;;;:12;:18;;;;;:28;;28450:5;28428:21;:28::i;:::-;28421:35;28319:145;-1:-1:-1;;;28319:145:0:o;12242:139::-;12320:4;12344:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;12344:29:0;;;;;;;;;;;;;;;12242:139::o;119922:113::-;120008:21;;119922:113;:::o;122948:125::-;123017:4;123037:30;:28;:30::i;126220:422::-;126284:6;117277:31;:14;126284:6;117277:23;:31::i;:::-;117269:67;;;;-1:-1:-1;;;117269:67:0;;;;;;;:::i;:::-;126299:17:::1;126319:14:::0;;;:6:::1;:14;::::0;;;;126362:10:::1;::::0;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;126362:10:0::1;126348;:24;126340:58;;;;-1:-1:-1::0;;;126340:58:0::1;;;;;;;:::i;:::-;126413:13;::::0;::::1;::::0;:18;126405:55:::1;;;;-1:-1:-1::0;;;126405:55:0::1;;;;;;;:::i;:::-;126511:23;;126494:4;:14;;;:40;;;;:::i;:::-;126475:15;:59;;126467:101;;;;-1:-1:-1::0;;;126467:101:0::1;;;;;;;:::i;:::-;126591:15;126575:13;::::0;::::1;:31:::0;126618:18:::1;::::0;::::1;::::0;::::1;::::0;126629:6;;126618:18:::1;:::i;:::-;;;;;;;;117343:1;126220:422:::0;;:::o;10196:49::-;10241:4;10196:49;:::o;124812:827::-;125077:32;;;;:94;;-1:-1:-1;125113:6:0;;:58;;-1:-1:-1;;;125113:58:0;;-1:-1:-1;;;;;125113:6:0;;;;:19;;:58;;125133:10;;125153:4;;125160:10;;125113:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;125077:163;;;-1:-1:-1;125209:4:0;125182:31;;;;:58;;;;;125230:10;125217:9;:23;125182:58;125061:228;;;;-1:-1:-1;;;125061:228:0;;;;;;;:::i;:::-;125296:11;125310:165;125330:19;125358:10;125377:23;125409:8;125426:6;;125441:12;125462:6;125310:11;:165::i;:::-;125482:17;125502:14;;;:6;:14;;;;;;;125524:15;;;:28;;;125560:19;;;:26;;-1:-1:-1;;125560:26:0;125582:4;125560:26;;;125598:35;;125296:179;;-1:-1:-1;125502:14:0;125598:35;;;;125296:179;;125622:10;;125598:35;:::i;:::-;;;;;;;;124812:827;;;;;;;;;;:::o;120521:117::-;120609:23;;120521:117;:::o;121251:159::-;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;121363:19:0::1;:40:::0;121251:159::o;117852:91::-;116451:2;117852:91;:::o;118184:96::-;-1:-1:-1;;;;;;;;;;;118184:96:0;:::o;127007:592::-;127080:6;117411:31;:14;127080:6;117411:23;:31::i;:::-;117403:67;;;;-1:-1:-1;;;117403:67:0;;;;;;;:::i;:::-;117519:1;117493:14;;;:6;:14;;;;;:23;;;117477:77;;;;-1:-1:-1;;;117477:77:0;;;;;;;:::i;:::-;117622:23;;117596:14;;;;:6;:14;;;;;:23;;;:49;;117622:23;117596:49;:::i;:::-;117577:15;:68;;117561:128;;;;-1:-1:-1;;;117561:128:0;;;;;;;:::i;:::-;117746:14;;;;:6;:14;;;;;:27;;;:34;117712:31;;;;;:68;117696:136;;;;-1:-1:-1;;;117696:136:0;;;;;;;:::i;:::-;127099:17:::1;127119:14:::0;;;:6:::1;:14;::::0;;;;127156:28:::1;::::0;::::1;::::0;::::1;;:37;127140:111;;;;-1:-1:-1::0;;;127140:111:0::1;;;;;;;:::i;:::-;127274:6;::::0;127321:24:::1;::::0;::::1;::::0;127274:72:::1;::::0;-1:-1:-1;;;127274:72:0;;-1:-1:-1;;;;;127274:6:0;;::::1;::::0;:19:::1;::::0;:72:::1;::::0;127294:10:::1;::::0;127314:4:::1;::::0;127274:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;127258:135;;;;-1:-1:-1::0;;;127258:135:0::1;;;;;;;:::i;:::-;127457:10;127406:4;:17;;127424:4;:21;;;127406:40;;;;;;-1:-1:-1::0;;;127406:40:0::1;;;;;;;;;;;;;;;;;:62;;;;;-1:-1:-1::0;;;;;127406:62:0::1;;;;;-1:-1:-1::0;;;;;127406:62:0::1;;;;;;127500:1;127475:4;:21;;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;127527:24:0::1;::::0;::::1;::::0;127508:15:::1;::::0;::::1;:43:::0;;:15:::1;::::0;:43:::1;::::0;127527:24;;127508:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;127563:30:0::1;::::0;::::1;::::0;::::1;::::0;127574:6;;127582:10:::1;::::0;127563:30:::1;:::i;28638:134::-:0;28710:7;28737:18;;;:12;:18;;;;;:27;;:25;:27::i;134783:1059::-;134859:6;117277:31;:14;134859:6;117277:23;:31::i;:::-;117269:67;;;;-1:-1:-1;;;117269:67:0;;;;;;;:::i;:::-;134935:33:::1;::::0;134908:14:::1;::::0;;;:6:::1;:14;::::0;;;;:24:::1;;::::0;:60:::1;::::0;134935:33;134908:60:::1;:::i;:::-;134890:15;:78;134874:140;;;;-1:-1:-1::0;;;134874:140:0::1;;;;;;;:::i;:::-;135021:17;135041:14:::0;;;:6:::1;:14;::::0;;;;135066:19:::1;::::0;::::1;::::0;::::1;;:27;;:19:::0;:27:::1;135062:696;;;135155:28;::::0;::::1;::::0;::::1;;:36;;:28:::0;:36:::1;135151:170;;;135204:10;::::0;::::1;::::0;135224:15:::1;::::0;::::1;::::0;135204:36:::1;::::0;:10:::1;::::0;;::::1;-1:-1:-1::0;;;;;135204:10:0::1;::::0;:36:::1;::::0;::::1;;::::0;135224:15;135204:36:::1;::::0;;;135224:15;135204:10;:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;135151:170;;;135267:6;::::0;135283:10:::1;::::0;;::::1;::::0;135295:15:::1;::::0;::::1;::::0;135267:44:::1;::::0;-1:-1:-1;;;135267:44:0;;-1:-1:-1;;;;;135267:6:0;;::::1;::::0;:15:::1;::::0;:44:::1;::::0;:6:::1;135283:10:::0;::::1;::::0;;::::1;::::0;135295:15;135267:44:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;135151:170;135062:696;;;135409:28;::::0;::::1;::::0;::::1;;:36;;:28:::0;:36:::1;135405:346;;;135463:6;135458:125;135475:4;:21;;;135473:1;:23;135458:125;;;135516:4;:17;;135534:1;135516:20;;;;;;-1:-1:-1::0;;;135516:20:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;135546:24:::1;::::0;::::1;::::0;135516:55:::1;::::0;-1:-1:-1;;;;;135516:20:0;;::::1;::::0;:55;::::1;;;::::0;;;:20;:55;135546:24;135516:20;:55;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;135498:3:0;::::1;::::0;::::1;:::i;:::-;;;;135458:125;;135405:346;135614:6;135609:133;135626:4;:21;;;135624:1;:23;135609:133;;;135667:6;::::0;135683:17:::1;::::0;::::1;:20:::0;;-1:-1:-1;;;;;135667:6:0;;::::1;::::0;:15:::1;::::0;135683:17;135701:1;;135683:20;::::1;;;-1:-1:-1::0;;;135683:20:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;135705:24:::1;::::0;::::1;::::0;135667:63:::1;::::0;-1:-1:-1;;;;;;135667:63:0::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;135683:20:0::1;::::0;135705:24;135667:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;135649:3:0;::::1;::::0;::::1;:::i;:::-;;;;135609:133;;;;135405:346;135766:29;:14;135788:6:::0;135766:21:::1;:29::i;:::-;;135807;135829:6;135807:29;;;;;;:::i;120041:167::-:0;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;120158:21:0::1;:44:::0;120041:167::o;29122:170::-;29208:31;29225:4;29231:7;29208:16;:31::i;122430:154::-;122531:21;;122554:23;;122430:154;;:::o;134358:419::-;134449:13;134501:6;134490:8;:17;:56;;;;;134521:25;:16;:23;:25::i;:::-;134511:6;:35;;134490:56;134474:111;;;;-1:-1:-1;;;134474:111:0;;;;;;;:::i;:::-;134592:19;134625:15;134632:8;134625:6;:15;:::i;:::-;134614:27;;;;;;-1:-1:-1;;;134614:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;134592:49:0;-1:-1:-1;134660:8:0;134648:104;134672:6;134670:1;:8;134648:104;;;134714:6;:30;134721:22;:16;134741:1;134721:19;:22::i;:::-;134714:30;;;;;;;;;;;134694:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134694:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;134694:50:0;;;-1:-1:-1;;134694:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;134694:50:0;;;;;;;;;;;;;-1:-1:-1;;;134694:50:0;;;;;;;;;;-1:-1:-1;;;134694:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;134694:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;134702:8;134700:1;:10;;;;:::i;:::-;134694:17;;;;;;-1:-1:-1;;;134694:17:0;;;;;;;;;;;;;;:50;;;;134680:3;;;;;:::i;:::-;;;;134648:104;;119701:215;-1:-1:-1;;;;;;;;;;;11800:30:0;11811:4;11817:12;:10;:12::i;11800:30::-;-1:-1:-1;119842:33:0::1;:68:::0;119701:215::o;127605:560::-;127689:6;117411:31;:14;127689:6;117411:23;:31::i;:::-;117403:67;;;;-1:-1:-1;;;117403:67:0;;;;;;;:::i;:::-;117519:1;117493:14;;;:6;:14;;;;;:23;;;117477:77;;;;-1:-1:-1;;;117477:77:0;;;;;;;:::i;:::-;117622:23;;117596:14;;;;:6;:14;;;;;:23;;;:49;;117622:23;117596:49;:::i;:::-;117577:15;:68;;117561:128;;;;-1:-1:-1;;;117561:128:0;;;;;;;:::i;:::-;117746:14;;;;:6;:14;;;;;:27;;;:34;117712:31;;;;;:68;117696:136;;;;-1:-1:-1;;;117696:136:0;;;;;;;:::i;:::-;127707:17:::1;127727:14:::0;;;:6:::1;:14;::::0;;;;127764:28:::1;::::0;::::1;::::0;::::1;;:36;;:28:::0;:36:::1;127748:98;;;;-1:-1:-1::0;;;127748:98:0::1;;;;;;;:::i;:::-;127882:4;:24;;;127869:9;:37;127853:112;;;;-1:-1:-1::0;;;127853:112:0::1;;;;;;;:::i;118288:1014::-:0;1637:13;;;;;;;;:30;;-1:-1:-1;1655:12:0;;;;1654:13;1637:30;1629:89;;;;-1:-1:-1;;;1629:89:0;;;;;;;:::i;:::-;1731:19;1754:13;;;;;;1753:14;1778:101;;;;1813:13;:20;;-1:-1:-1;;;;1813:20:0;;;;;1848:19;1829:4;1848:19;;;1778:101;118373:32:::1;:30;:32::i;:::-;118412:17;:15;:17::i;:::-;118442:51;10241:4;118473:19;;::::0;::::1;:6:::0;:19:::1;:::i;:::-;118442:10;:51::i;:::-;118500:47;115870:27;118527:19;;::::0;::::1;:6:::0;:19:::1;:::i;118500:47::-;118575:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;118556:16;:41:::0;;-1:-1:-1;;;;;;118556:41:0::1;-1:-1:-1::0;;;;;118556:41:0;;;::::1;::::0;;;::::1;::::0;;118625:12:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;118604:6;:34:::0;;-1:-1:-1;;;;;;118604:34:0::1;-1:-1:-1::0;;;;;118604:34:0;;;::::1;::::0;;;::::1;::::0;;118658:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;118645:10;:29:::0;;-1:-1:-1;;;;;;118645:29:0::1;-1:-1:-1::0;;;;;118645:29:0;;;::::1;::::0;;;::::1;::::0;;118710:14:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;118681:8;:44:::0;;-1:-1:-1;;;;;;118681:44:0::1;-1:-1:-1::0;;;;;118681:44:0;;;::::1;::::0;;;::::1;::::0;;118766:21:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;118732:15;:56:::0;;-1:-1:-1;;;;;;118732:56:0::1;-1:-1:-1::0;;;;;118732:56:0;;;::::1;::::0;;;::::1;::::0;;118819:27:::1;::::0;::::1;;118795:21;:51:::0;118880:30:::1;::::0;::::1;;118853:24;:57:::0;118943:29:::1;::::0;::::1;;118917:23;:55:::0;119005:29:::1;::::0;::::1;;118979:23;:55:::0;119077:39:::1;::::0;::::1;;119041:33;:75:::0;119145:25:::1;::::0;::::1;;119123:19;:47:::0;119201:27:::1;::::0;::::1;;119177:21;:51:::0;118732:56:::1;119261:29:::0;::::1;;119235:23;:55:::0;1905:68;;;;1956:5;1940:21;;-1:-1:-1;;1940:21:0;;;1905:68;118288:1014;;:::o;136774:114::-;136866:16;;-1:-1:-1;;;;;136866:16:0;136774:114;:::o;126649:352::-;126702:6;117411:31;:14;126702:6;117411:23;:31::i;:::-;117403:67;;;;-1:-1:-1;;;117403:67:0;;;;;;;:::i;:::-;117519:1;117493:14;;;:6;:14;;;;;:23;;;117477:77;;;;-1:-1:-1;;;117477:77:0;;;;;;;:::i;:::-;117622:23;;117596:14;;;;:6;:14;;;;;:23;;;:49;;117622:23;117596:49;:::i;:::-;117577:15;:68;;117561:128;;;;-1:-1:-1;;;117561:128:0;;;;;;;:::i;:::-;117746:14;;;;:6;:14;;;;;:27;;;:34;117712:31;;;;;:68;117696:136;;;;-1:-1:-1;;;117696:136:0;;;;;;;:::i;:::-;126744:17:::1;126764:14:::0;;;:6:::1;:14;::::0;;;;126793:19:::1;::::0;::::1;::::0;::::1;;:27;;:19:::0;:27:::1;126785:61;;;;-1:-1:-1::0;;;126785:61:0::1;;;;;;;:::i;:::-;126904:10;126853:4;:17;;126871:4;:21;;;126853:40;;;;;;-1:-1:-1::0;;;126853:40:0::1;;;;;;;;;;;;;;;;;:62;;;;;-1:-1:-1::0;;;;;126853:62:0::1;;;;;-1:-1:-1::0;;;;;126853:62:0::1;;;;;;126947:1;126922:4;:21;;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;126960:34:0::1;::::0;::::1;::::0;::::1;::::0;126975:6;;126983:10:::1;::::0;126960:34:::1;:::i;133819:114::-:0;133882:4;133902:25;:16;:23;:25::i;133703:110::-;133764:4;133784:23;:14;:21;:23::i;120216:117::-;120304:23;;120216:117;:::o;42622:146::-;42699:4;42723:37;42733:3;42753:5;42723:9;:37::i;2839:98::-;2919:10;2839:98;:::o;12671:406::-;12751:22;12759:4;12765:7;12751;:22::i;:::-;12747:323;;12883:52;12922:7;-1:-1:-1;;;;;12883:52:0;12932:2;12883:30;:52::i;:::-;12992:49;13031:4;13038:2;12992:30;:49::i;:::-;12804:252;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12804:252:0;;;;;;;;;;-1:-1:-1;;;12790:268:0;;;;;;;:::i;11922:228::-;12007:4;-1:-1:-1;;;;;;12031:58:0;;-1:-1:-1;;;12031:58:0;;:111;;;12106:36;12130:11;12106:23;:36::i;123079:1725::-;123318:4;;123347:8;:28;;;;;;-1:-1:-1;;;123347:28:0;;;;;;;;;;:64;;;-1:-1:-1;123391:20:0;123379:8;:32;;;;;;-1:-1:-1;;;123379:32:0;;;;;;;;;;123347:64;123331:120;;;;-1:-1:-1;;;123331:120:0;;;;;;;:::i;:::-;123483:1;123474:6;:10;:34;;;;;116451:2;123488:6;:20;;123474:34;123458:87;;;;-1:-1:-1;;;123458:87:0;;;;;;;:::i;:::-;123591:1;123568:19;:24;;:84;;;;;116231:3;123604:19;:48;;123568:84;123552:158;;;;-1:-1:-1;;;123552:158:0;;;;;;;:::i;:::-;123735:32;;;;:82;;;123794:23;:21;:23::i;:::-;123771:19;:46;;123735:82;:177;;;-1:-1:-1;123855:4:0;123828:31;;;;:84;;;;;123886:26;:24;:26::i;:::-;123863:19;:49;;123828:84;123719:250;;;;-1:-1:-1;;;123719:250:0;;;;;;;:::i;:::-;124039:6;;124071:10;;-1:-1:-1;;;;;124039:6:0;;;;:19;;124059:10;;124071;124083:30;:28;:30::i;:::-;124039:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124023:146;;;;-1:-1:-1;;;124023:146:0;;;;;;;:::i;:::-;124182:20;:8;:18;:20::i;:::-;124209:11;124223:18;:8;:16;:18::i;:::-;124209:32;;124264:481;;;;;;;;124282:6;124264:481;;;;124315:1;124264:481;;;;124361:19;124339:42;;;;;;-1:-1:-1;;;124339:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124339:42:0;-1:-1:-1;124264:481:0;;;;;;;;;;;;;;;124511:10;124264:481;;;;;;124541:8;124264:481;;;;;;-1:-1:-1;;;124264:481:0;;;;;;;;;;;;;124566:6;124264:481;;;;124597:5;124264:481;;;;;;124622:15;124264:481;;;;124656:1;124264:481;;;;124678:1;124264:481;;;;124696:6;;124264:481;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124264:481:0;;;-1:-1:-1;;;124264:481:0;;;;;;;124247:14;;;:6;:14;;;;;;;:498;;;;;;;;;;;;;;;;;;:14;;:498;;;;;;;;;;;:::i;:::-;-1:-1:-1;124247:498:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124247:498:0;;;-1:-1:-1;;;;;;124247:498:0;;;-1:-1:-1;;124247:498:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;124247:498:0;-1:-1:-1;;;124247:498:0;;;;;;;-1:-1:-1;;;124247:498:0;;;;;;;;;;;;;-1:-1:-1;124247:498:0;;;;;;;;;;;;;;;;;-1:-1:-1;;124247:498:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;124247:498:0;;;;;;;;;;;124752:26;:14;124771:6;124752:18;:26::i;:::-;-1:-1:-1;124792:6:0;123079:1725;-1:-1:-1;;;;;;;;;123079:1725:0:o;121416:120::-;121471:4;121491:39;121510:19;;121491:18;:39::i;128174:448::-;128280:4;;128297:302;128314:7;:14;128312:1;:16;128297:302;;;128344:10;128376:6;128371:160;128388:4;:21;;;128386:1;:23;128371:160;;;128445:4;:17;;;128463:1;128445:20;;;;;;-1:-1:-1;;;128445:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;128431:34:0;:7;128439:1;128431:10;;;;;;-1:-1:-1;;;128431:10:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;128431:34:0;;128427:95;;;128488:4;128480:12;;128505:5;;128427:95;128411:3;;;;:::i;:::-;;;;128371:160;;;-1:-1:-1;128543:14:0;128539:53;;128577:5;128570:12;;;;;;128539:53;-1:-1:-1;128330:3:0;;;;:::i;:::-;;;;128297:302;;;-1:-1:-1;128612:4:0;;128174:448;-1:-1:-1;;;128174:448:0:o;128630:871::-;128893:11;;128879;;128756:24;;128823:4;;128864;;-1:-1:-1;128875:75:0;;;-1:-1:-1;128938:4:0;;-1:-1:-1;128920:4:0;128875:75;128956:11;128982:2;:9;128970:2;:9;:21;;;;:::i;:::-;128956:35;;128998:26;129049:6;129027:29;;;;;;-1:-1:-1;;;129027:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;129027:29:0;;128998:58;;129063:6;129085;129080:267;129097:2;:9;129095:1;:11;129080:267;;;129122:10;129154:6;129149:128;129166:2;:9;129164:1;:11;129149:128;;;129206:2;129209:1;129206:5;;;;;;-1:-1:-1;;;129206:5:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;129197:14:0;:2;129200:1;129197:5;;;;;;-1:-1:-1;;;129197:5:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;129197:14:0;;129193:75;;;129234:4;129226:12;;129251:5;;129193:75;129177:3;;;;:::i;:::-;;;;129149:128;;;-1:-1:-1;129289:14:0;129285:55;;129325:2;129328:1;129325:5;;;;;;-1:-1:-1;;;129325:5:0;;;;;;;;;;;;;;;129316:1;129318:3;;;;;:::i;:::-;;;129316:6;;;;;;-1:-1:-1;;;129316:6:0;;;;;;;;;;;;;;:14;-1:-1:-1;;;;;129316:14:0;;;-1:-1:-1;;;;;129316:14:0;;;;;129285:55;-1:-1:-1;129108:3:0;;;;:::i;:::-;;;;129080:267;;;;129353:31;129409:1;129387:24;;;;;;-1:-1:-1;;;129387:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;129387:24:0;;129353:58;;129423:6;129418:58;129435:1;129433;:3;129418:58;;;129464:1;129466;129464:4;;;;;;-1:-1:-1;;;129464:4:0;;;;;;;;;;;;;;;129452:6;129459:1;129452:9;;;;;;-1:-1:-1;;;129452:9:0;;;;;;;;;-1:-1:-1;;;;;129452:16:0;;;:9;;;;;;;;;;;:16;129438:3;;;;:::i;:::-;;;;129418:58;;;-1:-1:-1;129489:6:0;128630:871;-1:-1:-1;;;;;;;;128630:871:0:o;42399:137::-;42469:4;42493:35;42501:3;42521:5;42493:7;:35::i;42092:131::-;42159:4;42183:32;42188:3;42208:5;42183:4;:32::i;13651:147::-;13734:18;13747:4;13734:12;:18::i;:::-;11800:30;11811:4;11817:12;:10;:12::i;11800:30::-;13765:25:::1;13776:4;13782:7;13765:10;:25::i;23160:152::-:0;23230:4;23254:50;23259:3;-1:-1:-1;;;;;23279:23:0;;23254:4;:50::i;14699:218::-;14806:12;:10;:12::i;:::-;-1:-1:-1;;;;;14795:23:0;:7;-1:-1:-1;;;;;14795:23:0;;14787:83;;;;-1:-1:-1;;;14787:83:0;;;;;;;:::i;:::-;14883:26;14895:4;14901:7;14883:11;:26::i;23488:158::-;23561:4;23585:53;23593:3;-1:-1:-1;;;;;23613:23:0;;23585:7;:53::i;121660:124::-;121718:4;121738:40;121758:19;;121738;:40::i;42854:114::-;42914:7;42941:19;42949:3;42941:7;:19::i;43312:137::-;43383:7;43418:22;43422:3;43434:5;43418:3;:22::i;122810:132::-;122872:4;122892:44;122911:24;;122892:18;:44::i;14043:149::-;14127:18;14140:4;14127:12;:18::i;:::-;11800:30;11811:4;11817:12;:10;:12::i;11800:30::-;14158:26:::1;14170:4;14176:7;14158:11;:26::i;26918:240::-:0;1637:13;;;;;;;;:30;;-1:-1:-1;1655:12:0;;;;1654:13;1637:30;1629:89;;;;-1:-1:-1;;;1629:89:0;;;;;;;:::i;:::-;1731:19;1754:13;;;;;;1753:14;1778:101;;;;1813:13;:20;;-1:-1:-1;;;;1813:20:0;;;;;1848:19;1829:4;1848:19;;;1778:101;26992:26:::1;:24;:26::i;:::-;27029:25;:23;:25::i;:::-;27065:32;:30;:32::i;:::-;27108:42;:40;:42::i;:::-;1909:14:::0;1905:68;;;1956:5;1940:21;;-1:-1:-1;;1940:21:0;;;1905:68;26918:240;:::o;30854:131::-;1637:13;;;;;;;;:30;;-1:-1:-1;1655:12:0;;;;1654:13;1637:30;1629:89;;;;-1:-1:-1;;;1629:89:0;;;;;;;:::i;:::-;1731:19;1754:13;;;;;;1753:14;1778:101;;;;1813:13;:20;;-1:-1:-1;;;;1813:20:0;;;;;1848:19;1829:4;1848:19;;;1778:101;30913:26:::1;:24;:26::i;:::-;30950:27;:25;:27::i;29654:169::-:0;29742:31;29759:4;29765:7;29742:16;:31::i;37682:129::-;37755:4;37779:19;;;:12;;;;;:19;;;;;;:24;;;37682:129::o;4867:447::-;4942:13;4968:19;5000:10;5004:6;5000:1;:10;:::i;:::-;:14;;5013:1;5000:14;:::i;:::-;4990:25;;;;;;-1:-1:-1;;;4990:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4990:25:0;;4968:47;;-1:-1:-1;;;5026:6:0;5033:1;5026:9;;;;;;-1:-1:-1;;;5026:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5026:15:0;;;;;;;;;-1:-1:-1;;;5052:6:0;5059:1;5052:9;;;;;;-1:-1:-1;;;5052:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5052:15:0;;;;;;;;-1:-1:-1;5083:9:0;5095:10;5099:6;5095:1;:10;:::i;:::-;:14;;5108:1;5095:14;:::i;:::-;5083:26;;5078:131;5115:1;5111;:5;5078:131;;;-1:-1:-1;;;5159:5:0;5167:3;5159:11;5150:21;;;;;-1:-1:-1;;;5150:21:0;;;;;;;;;;;;5138:6;5145:1;5138:9;;;;;;-1:-1:-1;;;5138:9:0;;;;;;;;;;;;:33;-1:-1:-1;;;;;5138:33:0;;;;;;;;-1:-1:-1;5196:1:0;5186:11;;;;;5118:3;;;:::i;:::-;;;5078:131;;;-1:-1:-1;5227:10:0;;5219:55;;;;-1:-1:-1;;;5219:55:0;;;;;;;:::i;7244:168::-;-1:-1:-1;;;;;;7353:51:0;;-1:-1:-1;;;7353:51:0;7244:168;;;:::o;33348:127::-;33437:19;;33455:1;33437:19;;;33348:127::o;33226:114::-;33318:14;;33226:114::o;121914:235::-;121975:10;122044:6;122053:8;;;;;;;;;-1:-1:-1;;;;;122053:8:0;-1:-1:-1;;;;;122053:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;122044:41;-1:-1:-1;122125:17:0;116364:1;122125:2;:17;:::i;:::-;122100:8;122107:1;122100:4;:8;:::i;:::-;:21;;122112:8;122100:21;:::i;:::-;:43;;;;:::i;36043:1553::-;36109:4;36248:19;;;:12;;;:19;;;;;;36284:15;;36280:1309;;36646:21;36670:14;36683:1;36670:10;:14;:::i;:::-;36719:18;;36646:38;;-1:-1:-1;36699:17:0;;36719:22;;36740:1;;36719:22;:::i;:::-;36699:42;;36986:17;37006:3;:11;;37018:9;37006:22;;;;;;-1:-1:-1;;;37006:22:0;;;;;;;;;;;;;;;;;36986:42;;37152:9;37123:3;:11;;37135:13;37123:26;;;;;;-1:-1:-1;;;37123:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;37229:23;;;:12;;;:23;;;;;;:36;;;37390:17;;37229:3;;37390:17;;;-1:-1:-1;;;37390:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;37485:3;:12;;:19;37498:5;37485:19;;;;;;;;;;;37478:26;;;37528:4;37521:11;;;;;;;;36280:1309;37572:5;37565:12;;;;;35453:414;35516:4;35538:21;35548:3;35553:5;35538:9;:21::i;:::-;35533:327;;-1:-1:-1;35576:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;35759:18;;35737:19;;;:12;;;:19;;;;;;:40;;;;35792:11;;35533:327;-1:-1:-1;35843:5:0;35836:12;;15947:229;16022:22;16030:4;16036:7;16022;:22::i;:::-;16017:152;;16061:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;16061:29:0;;;;;;;;;:36;;-1:-1:-1;;16061:36:0;16093:4;16061:36;;;16144:12;:10;:12::i;:::-;-1:-1:-1;;;;;16117:40:0;16135:7;-1:-1:-1;;;;;16117:40:0;16129:4;16117:40;;;;;;;;;;15947:229;;:::o;16184:230::-;16259:22;16267:4;16273:7;16259;:22::i;:::-;16255:152;;;16330:5;16298:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;16298:29:0;;;;;;;;;:37;;-1:-1:-1;;16298:37:0;;;16382:12;:10;:12::i;:::-;-1:-1:-1;;;;;16355:40:0;16373:7;-1:-1:-1;;;;;16355:40:0;16367:4;16355:40;;;;;;;;;;16184:230;;:::o;122155:269::-;122217:11;122401:17;116364:1;122401:2;:17;:::i;:::-;122371:27;116287:2;122371;:27;:::i;:::-;122345:23;;122321:21;;122314:28;;:4;:28;:::i;:::-;:54;;;;:::i;:::-;:84;;;;:::i;:::-;:104;;;;:::i;38350:204::-;38445:18;;38417:7;;38445:26;-1:-1:-1;38437:73:0;;;;-1:-1:-1;;;38437:73:0;;;;;;;:::i;:::-;38528:3;:11;;38540:5;38528:18;;;;;;-1:-1:-1;;;38528:18:0;;;;;;;;;;;;;;;;;38521:25;;38350:204;;;;:::o;2768:65::-;1637:13;;;;;;;;:30;;-1:-1:-1;1655:12:0;;;;1654:13;1637:30;1629:89;;;;-1:-1:-1;;;1629:89:0;;;;;;;:::i;:::-;1731:19;1754:13;;;;;;1753:14;1778:101;;;;1813:13;:20;;-1:-1:-1;;;;1813:20:0;;;;;1848:19;1829:4;1848:19;;;1909:14;1905:68;;;1956:5;1940:21;;-1:-1:-1;;1940:21:0;;;2768:65;:::o;30993:92::-;1637:13;;;;;;;;:30;;-1:-1:-1;1655:12:0;;;;1654:13;1637:30;1629:89;;;;-1:-1:-1;;;1629:89:0;;;;;;;:::i;:::-;1731:19;1754:13;;;;;;1753:14;1778:101;;;;1813:13;:20;;-1:-1:-1;;;;1813:20:0;;;;;1848:19;1829:4;1848:19;;;1778:101;31062:7:::1;:15:::0;;-1:-1:-1;;31062:15:0::1;::::0;;1905:68;;;;1956:5;1940:21;;-1:-1:-1;;1940:21:0;;;30993:92;:::o;15500:112::-;15579:25;15590:4;15596:7;15579:10;:25::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:146:1;92:20;;121:33;92:20;121:33;:::i;165:950::-;;286:3;279:4;271:6;267:17;263:27;253:2;;308:5;301;294:20;253:2;348:6;335:20;374:4;397:18;434:2;430;427:10;424:2;;;440:18;;:::i;:::-;487:2;483;479:11;519:2;513:9;570:2;565;557:6;553:15;549:24;623:6;611:10;608:22;603:2;591:10;588:18;585:46;582:2;;;634:18;;:::i;:::-;670:2;663:22;720:18;;;754:15;;;;-1:-1:-1;789:15:1;;;823;;;819:24;;816:33;-1:-1:-1;813:2:1;;;866:5;859;852:20;813:2;892:5;883:14;;906:179;920:2;917:1;914:9;906:179;;;977:33;1006:3;977:33;:::i;:::-;965:46;;1031:12;;;;938:1;931:9;;;;;1063:12;;906:179;;;-1:-1:-1;1103:6:1;243:872;-1:-1:-1;;;;;;;243:872:1:o;1120:259::-;;1232:2;1220:9;1211:7;1207:23;1203:32;1200:2;;;1253:6;1245;1238:22;1200:2;1297:9;1284:23;1316:33;1343:5;1316:33;:::i;1656:271::-;;1787:2;1775:9;1766:7;1762:23;1758:32;1755:2;;;1808:6;1800;1793:22;1755:2;1845:9;1839:16;1864:33;1891:5;1864:33;:::i;1932:257::-;;2052:2;2040:9;2031:7;2027:23;2023:32;2020:2;;;2073:6;2065;2058:22;2020:2;2110:9;2104:16;2129:30;2153:5;2129:30;:::i;2194:190::-;;2306:2;2294:9;2285:7;2281:23;2277:32;2274:2;;;2327:6;2319;2312:22;2274:2;-1:-1:-1;2355:23:1;;2264:120;-1:-1:-1;2264:120:1:o;2389:327::-;;;2518:2;2506:9;2497:7;2493:23;2489:32;2486:2;;;2539:6;2531;2524:22;2486:2;2580:9;2567:23;2557:33;;2640:2;2629:9;2625:18;2612:32;2653:33;2680:5;2653:33;:::i;:::-;2705:5;2695:15;;;2476:240;;;;;:::o;2721:258::-;;;2850:2;2838:9;2829:7;2825:23;2821:32;2818:2;;;2871:6;2863;2856:22;2818:2;-1:-1:-1;;2899:23:1;;;2969:2;2954:18;;;2941:32;;-1:-1:-1;2808:171:1:o;2984:306::-;;3095:2;3083:9;3074:7;3070:23;3066:32;3063:2;;;3116:6;3108;3101:22;3063:2;3147:23;;-1:-1:-1;;;;;;3199:32:1;;3189:43;;3179:2;;3251:6;3243;3236:22;3295:219;;3449:3;3437:9;3428:7;3424:23;3420:33;3417:2;;;3471:6;3463;3456:22;3417:2;-1:-1:-1;3499:9:1;3407:107;-1:-1:-1;3407:107:1:o;3714:194::-;;3837:2;3825:9;3816:7;3812:23;3808:32;3805:2;;;3858:6;3850;3843:22;3805:2;-1:-1:-1;3886:16:1;;3795:113;-1:-1:-1;3795:113:1:o;3913:737::-;;;;4125:2;4113:9;4104:7;4100:23;4096:32;4093:2;;;4146:6;4138;4131:22;4093:2;4187:9;4174:23;4164:33;;4248:2;4237:9;4233:18;4220:32;4271:18;4312:2;4304:6;4301:14;4298:2;;;4333:6;4325;4318:22;4298:2;4361:75;4428:7;4419:6;4408:9;4404:22;4361:75;:::i;:::-;4351:85;;4489:2;4478:9;4474:18;4461:32;4445:48;;4518:2;4508:8;4505:16;4502:2;;;4539:6;4531;4524:22;4502:2;;4567:77;4636:7;4625:8;4614:9;4610:24;4567:77;:::i;:::-;4557:87;;;4083:567;;;;;:::o;4918:1223::-;;;;;;;;;5163:3;5151:9;5142:7;5138:23;5134:33;5131:2;;;5185:6;5177;5170:22;5131:2;5226:9;5213:23;5203:33;;5283:2;5272:9;5268:18;5255:32;5245:42;;5337:2;5326:9;5322:18;5309:32;5350:30;5374:5;5350:30;:::i;:::-;5399:5;-1:-1:-1;5456:2:1;5441:18;;5428:32;5491:1;5479:14;;5469:2;;5512:6;5504;5497:22;5469:2;5540:7;-1:-1:-1;5598:3:1;5583:19;;5570:33;5622:18;5652:14;;;5649:2;;;5684:6;5676;5669:22;5649:2;5727:6;5716:9;5712:22;5702:32;;5772:7;5765:4;5761:2;5757:13;5753:27;5743:2;;5799:6;5791;5784:22;5743:2;5844;5831:16;5870:2;5862:6;5859:14;5856:2;;;5891:6;5883;5876:22;5856:2;5941:7;5936:2;5927:6;5923:2;5919:15;5915:24;5912:37;5909:2;;;5967:6;5959;5952:22;5909:2;5121:1020;;;;-1:-1:-1;5121:1020:1;;;;6003:2;5995:11;;;;;6025:6;;-1:-1:-1;6078:3:1;6063:19;;6050:33;;6130:3;6115:19;6102:33;;-1:-1:-1;5121:1020:1;-1:-1:-1;;;5121:1020:1:o;6146:114::-;-1:-1:-1;;;;;6222:31:1;6210:44;;6200:60::o;6265:477::-;;6370:5;6364:12;6397:6;6392:3;6385:19;6423:4;6452:2;6447:3;6443:12;6436:19;;6489:2;6482:5;6478:14;6510:3;6522:195;6536:6;6533:1;6530:13;6522:195;;;6601:13;;-1:-1:-1;;;;;6597:39:1;6585:52;;6657:12;;;;6692:15;;;;6633:1;6551:9;6522:195;;;-1:-1:-1;6733:3:1;;6340:402;-1:-1:-1;;;;;6340:402:1:o;6747:93::-;6819:13;6812:21;6800:34;;6790:50::o;6845:240::-;6929:1;6922:5;6919:12;6909:2;;6974:10;6969:3;6965:20;6962:1;6955:31;7009:4;7006:1;6999:15;7037:4;7034:1;7027:15;6909:2;7061:18;;6899:186::o;7090:260::-;;7172:5;7166:12;7199:6;7194:3;7187:19;7215:63;7271:6;7264:4;7259:3;7255:14;7248:4;7241:5;7237:16;7215:63;:::i;:::-;7332:2;7311:15;-1:-1:-1;;7307:29:1;7298:39;;;;7339:4;7294:50;;7142:208;-1:-1:-1;;7142:208:1:o;7355:1477::-;;7433:6;7466:5;7460:12;7455:3;7448:25;7522:4;7515:5;7511:16;7505:23;7498:4;7493:3;7489:14;7482:47;7575:4;7568:5;7564:16;7558:23;7613:2;7606:4;7601:3;7597:14;7590:26;7637:70;7703:2;7698:3;7694:12;7680;7637:70;:::i;:::-;7625:82;;;7756:4;7749:5;7745:16;7739:23;7732:4;7727:3;7723:14;7716:47;7811:4;7804:5;7800:16;7794:23;7826:49;7869:4;7864:3;7860:14;7844;7826:49;:::i;:::-;;7923:4;7916:5;7912:16;7906:23;7938:60;7992:4;7987:3;7983:14;7967;7938:60;:::i;:::-;;8046:4;8039:5;8035:16;8029:23;8061:60;8115:4;8110:3;8106:14;8090;8061:60;:::i;:::-;;8170:4;8163:5;8159:16;8153:23;8146:4;8141:3;8137:14;8130:47;8196:6;8250:2;8243:5;8239:14;8233:21;8263:47;8306:2;8301:3;8297:12;8281:14;8263:47;:::i;:::-;-1:-1:-1;;8329:6:1;8371:14;;;8365:21;8351:12;;;8344:43;8406:6;8448:14;;;8442:21;8428:12;;;8421:43;8483:6;8525:14;;;8519:21;8505:12;;;8498:43;8560:6;8603:14;;;8597:21;8648:14;;;8634:12;;;8627:36;8686:41;8652:4;8597:21;8686:41;:::i;:::-;8746:6;8788:14;;;8782:21;8768:12;;;;8761:43;;;;-1:-1:-1;8672:55:1;;7413:1419;-1:-1:-1;;;7413:1419:1:o;8837:205::-;9037:3;9028:14::o;9047:786::-;;9458:25;9453:3;9446:38;9513:6;9507:13;9529:62;9584:6;9579:2;9574:3;9570:12;9563:4;9555:6;9551:17;9529:62;:::i;:::-;-1:-1:-1;;;9650:2:1;9610:16;;;9642:11;;;9635:40;9700:13;;9722:63;9700:13;9771:2;9763:11;;9756:4;9744:17;;9722:63;:::i;:::-;9805:17;9824:2;9801:26;;9436:397;-1:-1:-1;;;;9436:397:1:o;9838:203::-;-1:-1:-1;;;;;10002:32:1;;;;9984:51;;9972:2;9957:18;;9939:102::o;10270:282::-;-1:-1:-1;;;;;10470:32:1;;;;10452:51;;10534:2;10519:18;;10512:34;10440:2;10425:18;;10407:145::o;10557:375::-;-1:-1:-1;;;;;10815:15:1;;;10797:34;;10867:15;;;;10862:2;10847:18;;10840:43;10914:2;10899:18;;10892:34;;;;10747:2;10732:18;;10714:218::o;10937:839::-;;11152:2;11192;11181:9;11177:18;11222:2;11211:9;11204:21;11245:6;11280;11274:13;11311:6;11303;11296:22;11349:2;11338:9;11334:18;11327:25;;11412:2;11406;11398:6;11394:15;11383:9;11379:31;11375:40;11361:54;;11450:2;11442:6;11438:15;11471:4;11484:263;11498:6;11495:1;11492:13;11484:263;;;11591:2;11587:7;11575:9;11567:6;11563:22;11559:36;11554:3;11547:49;11619:48;11660:6;11651;11645:13;11619:48;:::i;:::-;11609:58;-1:-1:-1;11725:12:1;;;;11690:15;;;;11520:1;11513:9;11484:263;;;-1:-1:-1;11764:6:1;;11132:644;-1:-1:-1;;;;;;;11132:644:1:o;11781:187::-;11946:14;;11939:22;11921:41;;11909:2;11894:18;;11876:92::o;11973:177::-;12119:25;;;12107:2;12092:18;;12074:76::o;12155:222::-;;12304:2;12293:9;12286:21;12324:47;12367:2;12356:9;12352:18;12344:6;12324:47;:::i;12382:398::-;12584:2;12566:21;;;12623:2;12603:18;;;12596:30;12662:34;12657:2;12642:18;;12635:62;-1:-1:-1;;;12728:2:1;12713:18;;12706:32;12770:3;12755:19;;12556:224::o;12785:356::-;12987:2;12969:21;;;13006:18;;;12999:30;13065:34;13060:2;13045:18;;13038:62;13132:2;13117:18;;12959:182::o;13146:404::-;13348:2;13330:21;;;13387:2;13367:18;;;13360:30;13426:34;13421:2;13406:18;;13399:62;-1:-1:-1;;;13492:2:1;13477:18;;13470:38;13540:3;13525:19;;13320:230::o;13555:403::-;13757:2;13739:21;;;13796:2;13776:18;;;13769:30;13835:34;13830:2;13815:18;;13808:62;-1:-1:-1;;;13901:2:1;13886:18;;13879:37;13948:3;13933:19;;13729:229::o;13963:344::-;14165:2;14147:21;;;14204:2;14184:18;;;14177:30;-1:-1:-1;;;14238:2:1;14223:18;;14216:50;14298:2;14283:18;;14137:170::o;14312:352::-;14514:2;14496:21;;;14553:2;14533:18;;;14526:30;14592;14587:2;14572:18;;14565:58;14655:2;14640:18;;14486:178::o;14669:348::-;14871:2;14853:21;;;14910:2;14890:18;;;14883:30;14949:26;14944:2;14929:18;;14922:54;15008:2;14993:18;;14843:174::o;15022:354::-;15224:2;15206:21;;;15263:2;15243:18;;;15236:30;15302:32;15297:2;15282:18;;15275:60;15367:2;15352:18;;15196:180::o;15381:422::-;15583:2;15565:21;;;15622:2;15602:18;;;15595:30;15661:34;15656:2;15641:18;;15634:62;15732:28;15727:2;15712:18;;15705:56;15793:3;15778:19;;15555:248::o;15808:420::-;16010:2;15992:21;;;16049:2;16029:18;;;16022:30;16088:34;16083:2;16068:18;;16061:62;16159:26;16154:2;16139:18;;16132:54;16218:3;16203:19;;15982:246::o;16233:420::-;16435:2;16417:21;;;16474:2;16454:18;;;16447:30;16513:34;16508:2;16493:18;;16486:62;16584:26;16579:2;16564:18;;16557:54;16643:3;16628:19;;16407:246::o;16658:401::-;16860:2;16842:21;;;16899:2;16879:18;;;16872:30;16938:34;16933:2;16918:18;;16911:62;-1:-1:-1;;;17004:2:1;16989:18;;16982:35;17049:3;17034:19;;16832:227::o;17064:410::-;17266:2;17248:21;;;17305:2;17285:18;;;17278:30;17344:34;17339:2;17324:18;;17317:62;-1:-1:-1;;;17410:2:1;17395:18;;17388:44;17464:3;17449:19;;17238:236::o;17479:398::-;17681:2;17663:21;;;17720:2;17700:18;;;17693:30;17759:34;17754:2;17739:18;;17732:62;-1:-1:-1;;;17825:2:1;17810:18;;17803:32;17867:3;17852:19;;17653:224::o;17882:345::-;18084:2;18066:21;;;18123:2;18103:18;;;18096:30;-1:-1:-1;;;18157:2:1;18142:18;;18135:51;18218:2;18203:18;;18056:171::o;18232:353::-;18434:2;18416:21;;;18473:2;18453:18;;;18446:30;18512:31;18507:2;18492:18;;18485:59;18576:2;18561:18;;18406:179::o;18590:344::-;18792:2;18774:21;;;18831:2;18811:18;;;18804:30;-1:-1:-1;;;18865:2:1;18850:18;;18843:50;18925:2;18910:18;;18764:170::o;18939:347::-;19141:2;19123:21;;;19180:2;19160:18;;;19153:30;19219:25;19214:2;19199:18;;19192:53;19277:2;19262:18;;19113:173::o;19291:353::-;19493:2;19475:21;;;19532:2;19512:18;;;19505:30;19571:31;19566:2;19551:18;;19544:59;19635:2;19620:18;;19465:179::o;19649:343::-;19851:2;19833:21;;;19890:2;19870:18;;;19863:30;-1:-1:-1;;;19924:2:1;19909:18;;19902:49;19983:2;19968:18;;19823:169::o;19997:355::-;20199:2;20181:21;;;20238:2;20218:18;;;20211:30;20277:33;20272:2;20257:18;;20250:61;20343:2;20328:18;;20171:181::o;20357:403::-;20559:2;20541:21;;;20598:2;20578:18;;;20571:30;20637:34;20632:2;20617:18;;20610:62;-1:-1:-1;;;20703:2:1;20688:18;;20681:37;20750:3;20735:19;;20531:229::o;20765:405::-;20967:2;20949:21;;;21006:2;20986:18;;;20979:30;21045:34;21040:2;21025:18;;21018:62;-1:-1:-1;;;21111:2:1;21096:18;;21089:39;21160:3;21145:19;;20939:231::o;21175:345::-;21377:2;21359:21;;;21416:2;21396:18;;;21389:30;-1:-1:-1;;;21450:2:1;21435:18;;21428:51;21511:2;21496:18;;21349:171::o;21525:354::-;21727:2;21709:21;;;21766:2;21746:18;;;21739:30;21805:32;21800:2;21785:18;;21778:60;21870:2;21855:18;;21699:180::o;21884:352::-;22086:2;22068:21;;;22125:2;22105:18;;;22098:30;22164;22159:2;22144:18;;22137:58;22227:2;22212:18;;22058:178::o;22241:412::-;22443:2;22425:21;;;22482:2;22462:18;;;22455:30;22521:34;22516:2;22501:18;;22494:62;-1:-1:-1;;;22587:2:1;22572:18;;22565:46;22643:3;22628:19;;22415:238::o;22658:350::-;22860:2;22842:21;;;22899:2;22879:18;;;22872:30;22938:28;22933:2;22918:18;;22911:56;22999:2;22984:18;;22832:176::o;23013:403::-;23215:2;23197:21;;;23254:2;23234:18;;;23227:30;23293:34;23288:2;23273:18;;23266:62;-1:-1:-1;;;23359:2:1;23344:18;;23337:37;23406:3;23391:19;;23187:229::o;23421:347::-;23623:2;23605:21;;;23662:2;23642:18;;;23635:30;23701:25;23696:2;23681:18;;23674:53;23759:2;23744:18;;23595:173::o;23773:345::-;23975:2;23957:21;;;24014:2;23994:18;;;23987:30;-1:-1:-1;;;24048:2:1;24033:18;;24026:51;24109:2;24094:18;;23947:171::o;24123:405::-;24325:2;24307:21;;;24364:2;24344:18;;;24337:30;24403:34;24398:2;24383:18;;24376:62;-1:-1:-1;;;24469:2:1;24454:18;;24447:39;24518:3;24503:19;;24297:231::o;24533:411::-;24735:2;24717:21;;;24774:2;24754:18;;;24747:30;24813:34;24808:2;24793:18;;24786:62;-1:-1:-1;;;24879:2:1;24864:18;;24857:45;24934:3;24919:19;;24707:237::o;24949:252::-;;25122:2;25111:9;25104:21;25142:53;25191:2;25180:9;25176:18;25168:6;25142:53;:::i;25388:274::-;25562:25;;;-1:-1:-1;;;;;25623:32:1;25618:2;25603:18;;25596:60;25550:2;25535:18;;25517:145::o;25667:596::-;;25984:6;25973:9;25966:25;26027:2;26022;26011:9;26007:18;26000:30;26053:70;26119:2;26108:9;26104:18;26096:6;26053:70;:::i;:::-;26171:9;26163:6;26159:22;26154:2;26143:9;26139:18;26132:50;26199:58;26250:6;26242;26199:58;:::i;:::-;26191:66;25956:307;-1:-1:-1;;;;;;25956:307:1:o;26268:248::-;26442:25;;;26498:2;26483:18;;26476:34;26430:2;26415:18;;26397:119::o;26521:128::-;;26592:1;26588:6;26585:1;26582:13;26579:2;;;26598:18;;:::i;:::-;-1:-1:-1;26634:9:1;;26569:80::o;26654:217::-;;26720:1;26710:2;;-1:-1:-1;;;26745:31:1;;26799:4;26796:1;26789:15;26827:4;26752:1;26817:15;26710:2;-1:-1:-1;26856:9:1;;26700:171::o;26876:453::-;26972:6;26995:5;27009:314;27058:1;27095:2;27085:8;27082:16;27072:2;;27102:5;;;27072:2;27143:4;27138:3;27134:14;27128:4;27125:24;27122:2;;;27152:18;;:::i;:::-;27202:2;27192:8;27188:17;27185:2;;;27217:16;;;;27185:2;27296:17;;;;;27256:15;;27009:314;;;26953:376;;;;;;;:::o;27334:139::-;;27423:44;-1:-1:-1;;27450:8:1;27444:4;27478:922;27562:8;27552:2;;-1:-1:-1;27603:1:1;27617:5;;27552:2;27651:4;27641:2;;-1:-1:-1;27688:1:1;27702:5;;27641:2;27733:4;27751:1;27746:59;;;;27819:1;27814:183;;;;27726:271;;27746:59;27776:1;27767:10;;27790:5;;;27814:183;27851:3;27841:8;27838:17;27835:2;;;27858:18;;:::i;:::-;27914:1;27904:8;27900:16;27891:25;;27942:3;27935:5;27932:14;27929:2;;;27949:18;;:::i;:::-;27982:5;;;27726:271;;28081:2;28071:8;28068:16;28062:3;28056:4;28053:13;28049:36;28043:2;28033:8;28030:16;28025:2;28019:4;28016:12;28012:35;28009:77;28006:2;;;-1:-1:-1;28118:19:1;;;28153:14;;;28150:2;;;28170:18;;:::i;:::-;28203:5;;28006:2;28250:42;28288:3;28278:8;28272:4;28269:1;28250:42;:::i;:::-;28325:6;28320:3;28316:16;28307:7;28304:29;28301:2;;;28336:18;;:::i;:::-;28374:20;;27542:858;-1:-1:-1;;;;27542:858:1:o;28405:168::-;;28511:1;28507;28503:6;28499:14;28496:1;28493:21;28488:1;28481:9;28474:17;28470:45;28467:2;;;28518:18;;:::i;:::-;-1:-1:-1;28558:9:1;;28457:116::o;28578:125::-;;28646:1;28643;28640:8;28637:2;;;28651:18;;:::i;:::-;-1:-1:-1;28688:9:1;;28627:76::o;28708:258::-;28780:1;28790:113;28804:6;28801:1;28798:13;28790:113;;;28880:11;;;28874:18;28861:11;;;28854:39;28826:2;28819:10;28790:113;;;28921:6;28918:1;28915:13;28912:2;;;28956:1;28947:6;28942:3;28938:16;28931:27;28912:2;;28761:205;;;:::o;28971:136::-;;29038:5;29028:2;;29047:18;;:::i;:::-;-1:-1:-1;;;29083:18:1;;29018:89::o;29112:380::-;29197:1;29187:12;;29244:1;29234:12;;;29255:2;;29309:4;29301:6;29297:17;29287:27;;29255:2;29362;29354:6;29351:14;29331:18;29328:38;29325:2;;;29408:10;29403:3;29399:20;29396:1;29389:31;29443:4;29440:1;29433:15;29471:4;29468:1;29461:15;29497:135;;-1:-1:-1;;29557:17:1;;29554:2;;;29577:18;;:::i;:::-;-1:-1:-1;29624:1:1;29613:13;;29544:88::o;29637:127::-;29698:10;29693:3;29689:20;29686:1;29679:31;29729:4;29726:1;29719:15;29753:4;29750:1;29743:15;29769:127;29830:10;29825:3;29821:20;29818:1;29811:31;29861:4;29858:1;29851:15;29885:4;29882:1;29875:15;29901:133;-1:-1:-1;;;;;29978:31:1;;29968:42;;29958:2;;30024:1;30021;30014:12;30039:120;30127:5;30120:13;30113:21;30106:5;30103:32;30093:2;;30149:1;30146;30139:12

Swarm Source

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