Indexing Tokens - We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x9c172DB0d092336Aa7b184D2F2913E7DB4c15Ba5

Contract Name
Staking
Creator
0x046bf7–da7b9c at 0x39bc8a–9bf727
Balance
0 LIT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
2793389
Contract name:
Staking




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




Verified at
2023-11-21T01:29:50.912211Z

Constructor Arguments

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000680000000000000000000000000dcfe8c3af65b3e24b4de13eaa6fbc35beacaf61c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000aa914f0201eaeda4571331c1561c5fa6424eabb1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000005cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000000000000000000000000000075a4d2a38449cdca1e7ec97d538364693199b2d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b000000000000000000000000000000000000000000000000000000000000000000000000000000000c23c2ab9113e045779f478df90079444cd769680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000177aa086e7000000000000000000000000000000000000000000000000000000007392c76b000000000000000000000000000000000000000000000000000000008b80d833000000000000000000000000000000000000000000000000000000003cf80e6c00000000000000000000000000000000000000000000000000000000e9fad8ee000000000000000000000000000000000000000000000000000000003d18b91200000000000000000000000000000000000000000000000000000000865419e90000000000000000000000000000000000000000000000000000000016930f4d000000000000000000000000000000000000000000000000000000003528db8800000000000000000000000000000000000000000000000000000000ac2f8afe0000000000000000000000000000000000000000000000000000000009a24f5a00000000000000000000000000000000000000000000000000000000f95d71b1000000000000000000000000000000000000000000000000000000004a6e51f50000000000000000000000000000000000000000000000000000000054eea796000000000000000000000000000000000000000000000000000000003f819713000000000000000000000000000000000000000000000000000000001fab87c4000000000000000000000000000000000000000000000000000000004f8f01020000000000000000000000000000000000000000000000000000000009c7c7d000000000000000000000000000000000000000000000000000000000f99b562300000000000000000000000000000000000000000000000000000000a694fc3a00000000000000000000000000000000000000000000000000000000ba3bd22e00000000000000000000000000000000000000000000000000000000c006e00b000000000000000000000000000000000000000000000000000000002e1a7d4d000000000000000000000000000000000000000000000000000000000000000000000000000000003b7b80627ff7e97149662b8a48db6006349f0f5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001c79502c550000000000000000000000000000000000000000000000000000000050d17b5e00000000000000000000000000000000000000000000000000000000e8684ed100000000000000000000000000000000000000000000000000000000899658830000000000000000000000000000000000000000000000000000000043cb0a0e00000000000000000000000000000000000000000000000000000000900cf0cf00000000000000000000000000000000000000000000000000000000f1b877a8000000000000000000000000000000000000000000000000000000005995a4c40000000000000000000000000000000000000000000000000000000090fba112000000000000000000000000000000000000000000000000000000005b677eac0000000000000000000000000000000000000000000000000000000010fe9ae800000000000000000000000000000000000000000000000000000000857b766300000000000000000000000000000000000000000000000000000000d4818fca00000000000000000000000000000000000000000000000000000000c35d4d0900000000000000000000000000000000000000000000000000000000533d463e00000000000000000000000000000000000000000000000000000000e7c087200000000000000000000000000000000000000000000000000000000061dee8a30000000000000000000000000000000000000000000000000000000070fe276a0000000000000000000000000000000000000000000000000000000040550a1c00000000000000000000000000000000000000000000000000000000a25e49a400000000000000000000000000000000000000000000000000000000f1887fec000000000000000000000000000000000000000000000000000000003e685266000000000000000000000000000000000000000000000000000000000297d4db000000000000000000000000000000000000000000000000000000005081f66f00000000000000000000000000000000000000000000000000000000519877eb00000000000000000000000000000000000000000000000000000000847e062500000000000000000000000000000000000000000000000000000000c19d93fb00000000000000000000000000000000000000000000000000000000fa52c7d800000000000000000000000000000000000000000000000000000000000000000000000000000000046bf7bb88e0e0941358ce3f5a765c9acdda7b9c0000000000000000000000008794804aff6e54f4c2b3f018144a3ddb61d437fd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000bfcbad2ad7080fd9501aed602b7089a2045850e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e1c7392a00000000000000000000000000000000000000000000000000000000
              

contracts/lit-node/Staking.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
*
* Implementation of a diamond.
/******************************************************************************/
import { LibDiamond } from "../libraries/LibDiamond.sol";
import { IDiamondCut } from "../interfaces/IDiamondCut.sol";
import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol";
import { IERC173 } from "../interfaces/IERC173.sol";
import { IERC165 } from "../interfaces/IERC165.sol";
import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import { ContractResolver } from "../lit-core/ContractResolver.sol";
import { LibStakingStorage } from "./Staking/LibStakingStorage.sol";
// When no function exists for function called
error FunctionNotFound(bytes4 _functionSelector);
// This is used in diamond constructor
// more arguments are added to this struct
// this avoids stack too deep errors
struct StakingArgs {
address owner;
address init;
bytes initCalldata;
address contractResolver;
ContractResolver.Env env;
}
contract Staking {
constructor(
IDiamondCut.FacetCut[] memory _diamondCut,
StakingArgs memory _args
) payable {
LibDiamond.setContractOwner(_args.owner);
LibDiamond.diamondCut(_diamondCut, _args.init, _args.initCalldata);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/BitMaps.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
* Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
*/
library BitMaps {
struct BitMap {
mapping(uint256 => uint256) _data;
}
/**
* @dev Returns whether the bit at `index` is set.
*/
function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
return bitmap._data[bucket] & mask != 0;
}
/**
* @dev Sets the bit at `index` to the boolean `value`.
*/
function setTo(BitMap storage bitmap, uint256 index, bool value) internal {
if (value) {
set(bitmap, index);
} else {
unset(bitmap, index);
}
}
/**
* @dev Sets the bit at `index`.
*/
function set(BitMap storage bitmap, uint256 index) internal {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
bitmap._data[bucket] |= mask;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/EnumerableSet.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
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.
*
* ```solidity
* 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.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
interface IDiamond {
enum FacetCutAction {
Add,
Replace,
Remove
}
// Add=0, Replace=1, Remove=2
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamondCut.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "./IDiamond.sol";
interface IDiamondCut is IDiamond {
/// @notice Add/replace/remove any number of functions and optionally execute
/// a function with delegatecall
/// @param _diamondCut Contains the facet addresses and function selectors
/// @param _init The address of the contract or facet to execute _calldata
/// @param _calldata A function call, including function selector and arguments
/// _calldata is executed with delegatecall on _init
function diamondCut(
FacetCut[] calldata _diamondCut,
address _init,
bytes calldata _calldata
) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamondLoupe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
// A loupe is a small magnifying glass used to look at diamonds.
// These functions look at diamonds
interface IDiamondLoupe {
/// These functions are expected to be called frequently
/// by tools.
struct Facet {
address facetAddress;
bytes4[] functionSelectors;
}
/// @notice Gets all facet addresses and their four byte function selectors.
/// @return facets_ Facet
function facets() external view returns (Facet[] memory facets_);
/// @notice Gets all the function selectors supported by a specific facet.
/// @param _facet The facet address.
/// @return facetFunctionSelectors_
function facetFunctionSelectors(
address _facet
) external view returns (bytes4[] memory facetFunctionSelectors_);
/// @notice Get all the facet addresses used by a diamond.
/// @return facetAddresses_
function facetAddresses()
external
view
returns (address[] memory facetAddresses_);
/// @notice Gets the facet that supports the given selector.
/// @dev If facet is not found return address(0).
/// @param _functionSelector The function selector.
/// @return facetAddress_ The facet address.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IERC165.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC165 {
/// @notice Query if a contract implements an interface
/// @param interfaceId The interface identifier, as specified in ERC-165
/// @dev Interface identification is specified in ERC-165. This function
/// uses less than 30,000 gas.
/// @return `true` if the contract implements `interfaceID` and
/// `interfaceID` is not 0xffffffff, `false` otherwise
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IERC173.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title ERC-173 Contract Ownership Standard
/// Note: the ERC-165 identifier for this interface is 0x7f5828d0
/* is ERC165 */
interface IERC173 {
/// @dev This emits when ownership of a contract changes.
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/// @notice Get the address of the owner
/// @return owner_ The address of the owner.
function owner() external view returns (address owner_);
/// @notice Set the address of the new owner of the contract
/// @dev Set _newOwner to address(0) to renounce any ownership.
/// @param _newOwner The address of the new owner of the contract
function transferOwnership(address _newOwner) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/LibDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "../interfaces/IDiamond.sol";
import { IDiamondCut } from "../interfaces/IDiamondCut.sol";
// Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
// The loupe functions are required by the EIP2535 Diamonds standard
error NoSelectorsGivenToAdd();
error NotContractOwner(address _user, address _contractOwner);
error NoSelectorsProvidedForFacetForCut(address _facetAddress);
error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);
error NoBytecodeAtAddress(address _contractAddress, string _message);
error IncorrectFacetCutAction(uint8 _action);
error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);
error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);
error CannotReplaceImmutableFunction(bytes4 _selector);
error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(
bytes4 _selector
);
error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);
error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);
error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);
error CannotRemoveImmutableFunction(bytes4 _selector);
error InitializationFunctionReverted(
address _initializationContractAddress,
bytes _calldata
);
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION =
keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition {
address facetAddress;
uint16 selectorPosition;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-core/ContractResolver.sol

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "hardhat/console.sol";
contract ContractResolver is AccessControl {
/* ========== TYPE DEFINITIONS ========== */
// the comments following each one of these are the keccak256 hashes of the string values
// this is very useful if you have to manually set any of these, so that you
// don't have to calculate the hahes yourself.
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42
bytes32 public constant RELEASE_REGISTER_CONTRACT =
keccak256("RELEASE_REGISTER"); // 0x3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec
bytes32 public constant STAKING_CONTRACT = keccak256("STAKING"); // 0x080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b
bytes32 public constant STAKING_BALANCES_CONTRACT =
keccak256("STAKING_BALANCES"); // 0xaa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d72
bytes32 public constant MULTI_SENDER_CONTRACT = keccak256("MULTI_SENDER"); // 0xdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da7243
bytes32 public constant LIT_TOKEN_CONTRACT = keccak256("LIT_TOKEN");
bytes32 public constant PUB_KEY_ROUTER_CONTRACT =
keccak256("PUB_KEY_ROUTER"); // 0xb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f7
bytes32 public constant PKP_NFT_CONTRACT = keccak256("PKP_NFT"); // 0xb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b0
bytes32 public constant RATE_LIMIT_NFT_CONTRACT =
keccak256("RATE_LIMIT_NFT"); // 0xb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a918
bytes32 public constant PKP_HELPER_CONTRACT = keccak256("PKP_HELPER"); // 0x27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b44388755765
bytes32 public constant PKP_PERMISSIONS_CONTRACT =
keccak256("PKP_PERMISSIONS"); // 0x54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe
bytes32 public constant PKP_NFT_METADATA_CONTRACT =
keccak256("PKP_NFT_METADATA"); // 0xf14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a
bytes32 public constant ALLOWLIST_CONTRACT = keccak256("ALLOWLIST"); // 0x74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca
bytes32 public constant DOMAIN_WALLET_ORACLE =
keccak256("DOMAIN_WALLET_ORACLE");
bytes32 public constant DOMAIN_WALLET_REGISTRY =
keccak256("DOMAIN_WALLET_REGISTRY");
bytes32 public constant HD_KEY_DERIVER_CONTRACT =
keccak256("HD_KEY_DERIVER");
bytes32 public constant BACKUP_RECOVERY_CONTRACT =
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-node/Staking/LibStakingStorage.sol

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
import "solidity-bytes-utils/contracts/BytesLib.sol";
import { ContractResolver } from "../../lit-core/ContractResolver.sol";
interface IPubkeyRouter {
struct RootKey {
bytes pubkey;
uint256 keyType; // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying.
}
struct Signature {
bytes32 r;
bytes32 s;
uint8 v;
}
}
library LibStakingStorage {
using EnumerableSet for EnumerableSet.AddressSet;
bytes32 constant STAKING_POSITION = keccak256("staking.storage");
enum States {
Active,
NextValidatorSetLocked,
ReadyForNextEpoch,
Unlocked,
Paused,
Restore
}
struct Validator {
uint32 ip;
uint128 ipv6;
uint32 port;
address nodeAddress;
uint256 reward;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

solidity-bytes-utils/contracts/BytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
)
internal
pure
returns (bytes memory)
{
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract ABI

[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"tuple[]","name":"_diamondCut","internalType":"struct IDiamond.FacetCut[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"uint8","name":"action","internalType":"enum IDiamond.FacetCutAction"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]},{"type":"tuple","name":"_args","internalType":"struct StakingArgs","components":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"init","internalType":"address"},{"type":"bytes","name":"initCalldata","internalType":"bytes"},{"type":"address","name":"contractResolver","internalType":"address"},{"type":"uint8","name":"env","internalType":"enum ContractResolver.Env"}]}]},{"type":"error","name":"CannotAddFunctionToDiamondThatAlreadyExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotAddSelectorsToZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotRemoveFunctionThatDoesNotExist","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotRemoveImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionThatDoesNotExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionsFromFacetWithZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotReplaceImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"FunctionNotFound","inputs":[{"type":"bytes4","name":"_functionSelector","internalType":"bytes4"}]},{"type":"error","name":"IncorrectFacetCutAction","inputs":[{"type":"uint8","name":"_action","internalType":"uint8"}]},{"type":"error","name":"InitializationFunctionReverted","inputs":[{"type":"address","name":"_initializationContractAddress","internalType":"address"},{"type":"bytes","name":"_calldata","internalType":"bytes"}]},{"type":"error","name":"NoBytecodeAtAddress","inputs":[{"type":"address","name":"_contractAddress","internalType":"address"},{"type":"string","name":"_message","internalType":"string"}]},{"type":"error","name":"NoSelectorsProvidedForFacetForCut","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"error","name":"RemoveFacetAddressMustBeZeroAddress","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"fallback","stateMutability":"nonpayable"}]
            

Contract Creation Code

0x608060405260405162003c2138038062003c21833981810160405281019062000029919062001b2a565b6200004381600001516200046560201b620001931760201c565b6200006382826020015183604001516200054460201b6200026a1760201c565b80606001516200007d620007b060201b620004871760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060800151620000d8620007b060201b620004871760201c565b60000160146101000a81548160ff021916908360028111156200010057620000ff62001baf565b5b02179055506000600267ffffffffffffffff8111156200012557620001246200158b565b5b604051908082528060200260200182016040528015620001545781602001602082028036833780820191505090505b50905060018160008151811062000170576200016f62001bde565b5b60200260200101818152505060028160018151811062000195576200019462001bde565b5b60200260200101818152505060405180610100016040528066b1a2bc2ec500008152602001600f81526020016103848152602001828152602001600281526020016040815260200160648152602001600a815250620001fe620007b060201b620004871760201c565b600a01600080815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030190805190602001906200024e929190620014f0565b506080820151816004015560a0820151816005015560c0820151816006015560e082015181600701559050506000600190506040518060a00160405280828152602001600181526020018242620002a6919062001c46565b815260200160008152602001603c815250620002cc620007b060201b620004871760201c565b6009016000808152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505060016200032c620007b060201b620004871760201c565b600f016000600181526020019081526020016000208190555060046200035c620007b060201b620004871760201c565b60000160156101000a81548160ff0219169083600581111562000384576200038362001baf565b5b0217905550604051806060016040528060008152602001600081526020016000815250620003bc620007b060201b620004871760201c565b60080160008081526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506040518060600160405280612710815260200160008152602001600081525062000425620007b060201b620004871760201c565b60080160006001815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505050505050620022bc565b600062000477620007dd60201b60201c565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b83518110156200075b57600084828151811062000569576200056862001bde565b5b602002602001015160400151905060008583815181106200058f576200058e62001bde565b5b60200260200101516000015190506000825103620005e657806040517fe767f91f000000000000000000000000000000000000000000000000000000008152600401620005dd919062001c92565b60405180910390fd5b6000868481518110620005fe57620005fd62001bde565b5b60200260200101516020015190506000600281111562000623576200062262001baf565b5b81600281111562000639576200063862001baf565b5b0362000657576200065182846200080a60201b60201c565b62000742565b600160028111156200066e576200066d62001baf565b5b81600281111562000684576200068362001baf565b5b03620006a2576200069c828462000b5260201b60201c565b62000741565b600280811115620006b857620006b762001baf565b5b816002811115620006ce57620006cd62001baf565b5b03620006ec57620006e6828462000ebc60201b60201c565b62000740565b80600281111562000702576200070162001baf565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040162000737919062001ccd565b60405180910390fd5b5b5b5050508080620007529062001cea565b91505062000547565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051620007919392919062001fea565b60405180910390a1620007ab82826200136760201b60201c565b505050565b6000807f959f5d3bd7338cbbb967371aad5c50fefecff8acddc391792439bc468f2237ef90508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200087e57806040517f0ae3681c000000000000000000000000000000000000000000000000000000008152600401620008759190620020b0565b60405180910390fd5b600062000890620007dd60201b60201c565b9050600081600101805490509050620008c98460405180606001604052806024815260200162003bad602491396200149b60201b60201c565b60005b835181101562000b4b576000848281518110620008ee57620008ed62001bde565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620009e757816040517febbf5d07000000000000000000000000000000000000000000000000000000008152600401620009de9190620020e5565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c0217905550838062000b309062002110565b9450505050808062000b429062001cea565b915050620008cc565b5050505050565b600062000b64620007dd60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000bda57816040517fcd98a96f00000000000000000000000000000000000000000000000000000000815260040162000bd19190620020b0565b60405180910390fd5b62000c058360405180606001604052806028815260200162003bf9602891396200149b60201b60201c565b60005b825181101562000eb657600083828151811062000c2a5762000c2962001bde565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000d2257816040517f520300da00000000000000000000000000000000000000000000000000000000815260040162000d199190620020e5565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000d9557816040517f358d9d1a00000000000000000000000000000000000000000000000000000000815260040162000d8c9190620020e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000e0957816040517f7479f93900000000000000000000000000000000000000000000000000000000815260040162000e009190620020e5565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050808062000ead9062001cea565b91505062000c08565b50505050565b600062000ece620007dd60201b60201c565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000f5057836040517fd091bc8100000000000000000000000000000000000000000000000000000000815260040162000f47919062001c92565b60405180910390fd5b60005b83518110156200136057600084828151811062000f755762000f7462001bde565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603620010cf57816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401620010c69190620020e5565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036200114657816040517f6fafeb080000000000000000000000000000000000000000000000000000000081526004016200113d9190620020e5565b60405180910390fd5b838062001153906200213f565b94505083816020015161ffff16146200126f57600085600101858154811062001181576200118062001bde565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110620011c857620011c762001bde565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b846001018054806200128657620012856200216d565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080620013579062001cea565b91505062000f53565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156200149757620013c88260405180606001604052806028815260200162003bd1602891396200149b60201b60201c565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051620013f29190620021de565b600060405180830381855af49150503d80600081146200142f576040519150601f19603f3d011682016040523d82523d6000602084013e62001434565b606091505b5091509150816200149457600081511115620014535780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016200148b929190620021f7565b60405180910390fd5b50505b5050565b6000823b905060008103620014eb5782826040517f919834b9000000000000000000000000000000000000000000000000000000008152600401620014e292919062002288565b60405180910390fd5b505050565b8280548282559060005260206000209081019282156200152f579160200282015b828111156200152e57825182559160200191906001019062001511565b5b5090506200153e919062001542565b5090565b5b808211156200155d57600081600090555060010162001543565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620015c5826200157a565b810181811067ffffffffffffffff82111715620015e757620015e66200158b565b5b80604052505050565b6000620015fc62001561565b90506200160a8282620015ba565b919050565b600067ffffffffffffffff8211156200162d576200162c6200158b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200167a826200164d565b9050919050565b6200168c816200166d565b81146200169857600080fd5b50565b600081519050620016ac8162001681565b92915050565b60038110620016c057600080fd5b50565b600081519050620016d481620016b2565b92915050565b600067ffffffffffffffff821115620016f857620016f76200158b565b5b602082029050602081019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620017408162001709565b81146200174c57600080fd5b50565b600081519050620017608162001735565b92915050565b60006200177d6200177784620016da565b620015f0565b90508083825260208201905060208402830185811115620017a357620017a26200163e565b5b835b81811015620017d05780620017bb88826200174f565b845260208401935050602081019050620017a5565b5050509392505050565b600082601f830112620017f257620017f162001575565b5b81516200180484826020860162001766565b91505092915050565b60006060828403121562001826576200182562001643565b5b620018326060620015f0565b9050600062001844848285016200169b565b60008301525060206200185a84828501620016c3565b602083015250604082015167ffffffffffffffff81111562001881576200188062001648565b5b6200188f84828501620017da565b60408301525092915050565b6000620018b2620018ac846200160f565b620015f0565b90508083825260208201905060208402830185811115620018d857620018d76200163e565b5b835b818110156200192657805167ffffffffffffffff81111562001901576200190062001575565b5b8086016200191089826200180d565b85526020850194505050602081019050620018da565b5050509392505050565b600082601f83011262001948576200194762001575565b5b81516200195a8482602086016200189b565b91505092915050565b600080fd5b600067ffffffffffffffff8211156200198657620019856200158b565b5b62001991826200157a565b9050602081019050919050565b60005b83811015620019be578082015181840152602081019050620019a1565b60008484015250505050565b6000620019e1620019db8462001968565b620015f0565b90508281526020810184848401111562001a0057620019ff62001963565b5b62001a0d8482856200199e565b509392505050565b600082601f83011262001a2d5762001a2c62001575565b5b815162001a3f848260208601620019ca565b91505092915050565b6003811062001a5657600080fd5b50565b60008151905062001a6a8162001a48565b92915050565b600060a0828403121562001a895762001a8862001643565b5b62001a9560a0620015f0565b9050600062001aa7848285016200169b565b600083015250602062001abd848285016200169b565b602083015250604082015167ffffffffffffffff81111562001ae45762001ae362001648565b5b62001af28482850162001a15565b604083015250606062001b08848285016200169b565b606083015250608062001b1e8482850162001a59565b60808301525092915050565b6000806040838503121562001b445762001b436200156b565b5b600083015167ffffffffffffffff81111562001b655762001b6462001570565b5b62001b738582860162001930565b925050602083015167ffffffffffffffff81111562001b975762001b9662001570565b5b62001ba58582860162001a70565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001c538262001c0d565b915062001c608362001c0d565b925082820190508082111562001c7b5762001c7a62001c17565b5b92915050565b62001c8c816200166d565b82525050565b600060208201905062001ca9600083018462001c81565b92915050565b600060ff82169050919050565b62001cc78162001caf565b82525050565b600060208201905062001ce4600083018462001cbc565b92915050565b600062001cf78262001c0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001d2c5762001d2b62001c17565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62001d6e816200166d565b82525050565b6003811062001d885762001d8762001baf565b5b50565b600081905062001d9b8262001d74565b919050565b600062001dad8262001d8b565b9050919050565b62001dbf8162001da0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62001dfc8162001709565b82525050565b600062001e10838362001df1565b60208301905092915050565b6000602082019050919050565b600062001e368262001dc5565b62001e42818562001dd0565b935062001e4f8362001de1565b8060005b8381101562001e8657815162001e6a888262001e02565b975062001e778362001e1c565b92505060018101905062001e53565b5085935050505092915050565b600060608301600083015162001ead600086018262001d63565b50602083015162001ec2602086018262001db4565b506040830151848203604086015262001edc828262001e29565b9150508091505092915050565b600062001ef7838362001e93565b905092915050565b6000602082019050919050565b600062001f198262001d37565b62001f25818562001d42565b93508360208202850162001f398562001d53565b8060005b8581101562001f7b578484038952815162001f59858262001ee9565b945062001f668362001eff565b925060208a0199505060018101905062001f3d565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600062001fb68262001f8d565b62001fc2818562001f98565b935062001fd48185602086016200199e565b62001fdf816200157a565b840191505092915050565b6000606082019050818103600083015262002006818662001f0c565b905062002017602083018562001c81565b81810360408301526200202b818462001fa9565b9050949350505050565b600082825260208201905092915050565b6000620020538262001dc5565b6200205f818562002035565b93506200206c8362001de1565b8060005b83811015620020a357815162002087888262001e02565b9750620020948362001e1c565b92505060018101905062002070565b5085935050505092915050565b60006020820190508181036000830152620020cc818462002046565b905092915050565b620020df8162001709565b82525050565b6000602082019050620020fc6000830184620020d4565b92915050565b600061ffff82169050919050565b60006200211d8262002102565b915061ffff820362002134576200213362001c17565b5b600182019050919050565b60006200214c8262001c0d565b91506000820362002162576200216162001c17565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b6000620021b48262001f8d565b620021c081856200219c565b9350620021d28185602086016200199e565b80840191505092915050565b6000620021ec8284620021a7565b915081905092915050565b60006040820190506200220e600083018562001c81565b818103602083015262002222818462001fa9565b90509392505050565b600081519050919050565b600082825260208201905092915050565b600062002254826200222b565b62002260818562002236565b9350620022728185602086016200199e565b6200227d816200157a565b840191505092915050565b60006040820190506200229f600083018562001c81565b8181036020830152620022b3818462002247565b90509392505050565b6118e180620022cc6000396000f3fe608060405234801561001057600080fd5b506000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016d576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101649190611185565b60405180910390fd5b3660008037600080366000845af43d6000803e806000811461018e573d6000f35b3d6000fd5b600061019d6104b4565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561043c57600084828151811061028b5761028a6111a0565b5b602002602001015160400151905060008583815181106102ae576102ad6111a0565b5b6020026020010151600001519050600082510361030257806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102f99190611210565b60405180910390fd5b6000868481518110610317576103166111a0565b5b6020026020010151602001519050600060028111156103395761033861122b565b5b81600281111561034c5761034b61122b565b5b036103605761035b82846104e1565b610426565b600160028111156103745761037361122b565b5b8160028111156103875761038661122b565b5b0361039b576103968284610809565b610425565b6002808111156103ae576103ad61122b565b5b8160028111156103c1576103c061122b565b5b036103d5576103d08284610b4f565b610424565b8060028111156103e8576103e761122b565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161041b9190611276565b60405180910390fd5b5b5b5050508080610434906112ca565b91505061026d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610470939291906115c9565b60405180910390a16104828282610fd6565b505050565b6000807f959f5d3bd7338cbbb967371aad5c50fefecff8acddc391792439bc468f2237ef90508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361055257806040517f0ae3681c000000000000000000000000000000000000000000000000000000008152600401610549919061167d565b60405180910390fd5b600061055c6104b4565b905060008160010180549050905061058c84604051806060016040528060248152602001611838602491396110f8565b60005b83518110156108025760008482815181106105ad576105ac6111a0565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a357816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161069a9190611185565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107ea906116ad565b945050505080806107fa906112ca565b91505061058f565b5050505050565b60006108136104b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361088657816040517fcd98a96f00000000000000000000000000000000000000000000000000000000815260040161087d919061167d565b60405180910390fd5b6108a883604051806060016040528060288152602001611884602891396110f8565b60005b8251811015610b495760008382815181106108c9576108c86111a0565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109be57816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109b59190611185565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a2e57816040517f358d9d1a000000000000000000000000000000000000000000000000000000008152600401610a259190611185565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a9f57816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a969190611185565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b41906112ca565b9150506108ab565b50505050565b6000610b596104b4565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bd857836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610bcf9190611210565b60405180910390fd5b60005b8351811015610fcf576000848281518110610bf957610bf86111a0565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d5057816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d479190611185565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610dc457816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610dbb9190611185565b60405180910390fd5b8380610dcf906116d7565b94505083816020015161ffff1614610ee4576000856001018581548110610df957610df86111a0565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e3d57610e3c6111a0565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610ef857610ef7611700565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610fc7906112ca565b915050610bdb565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110f45761102d8260405180606001604052806028815260200161185c602891396110f8565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611055919061176b565b600060405180830381855af49150503d8060008114611090576040519150601f19603f3d011682016040523d82523d6000602084013e611095565b606091505b5091509150816110f1576000815111156110b25780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110e8929190611782565b60405180910390fd5b50505b5050565b6000823b9050600081036111455782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161113c929190611807565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61117f8161114a565b82525050565b600060208201905061119a6000830184611176565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111fa826111cf565b9050919050565b61120a816111ef565b82525050565b60006020820190506112256000830184611201565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112708161125a565b82525050565b600060208201905061128b6000830184611267565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112d5826112c0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361130757611306611291565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611347816111ef565b82525050565b6003811061135e5761135d61122b565b5b50565b600081905061136f8261134d565b919050565b600061137f82611361565b9050919050565b61138f81611374565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6113ca8161114a565b82525050565b60006113dc83836113c1565b60208301905092915050565b6000602082019050919050565b600061140082611395565b61140a81856113a0565b9350611415836113b1565b8060005b8381101561144657815161142d88826113d0565b9750611438836113e8565b925050600181019050611419565b5085935050505092915050565b600060608301600083015161146b600086018261133e565b50602083015161147e6020860182611386565b506040830151848203604086015261149682826113f5565b9150508091505092915050565b60006114af8383611453565b905092915050565b6000602082019050919050565b60006114cf82611312565b6114d9818561131d565b9350836020820285016114eb8561132e565b8060005b85811015611527578484038952815161150885826114a3565b9450611513836114b7565b925060208a019950506001810190506114ef565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611573578082015181840152602081019050611558565b60008484015250505050565b6000601f19601f8301169050919050565b600061159b82611539565b6115a58185611544565b93506115b5818560208601611555565b6115be8161157f565b840191505092915050565b600060608201905081810360008301526115e381866114c4565b90506115f26020830185611201565b81810360408301526116048184611590565b9050949350505050565b600082825260208201905092915050565b600061162a82611395565b611634818561160e565b935061163f836113b1565b8060005b8381101561167057815161165788826113d0565b9750611662836113e8565b925050600181019050611643565b5085935050505092915050565b60006020820190508181036000830152611697818461161f565b905092915050565b600061ffff82169050919050565b60006116b88261169f565b915061ffff82036116cc576116cb611291565b5b600182019050919050565b60006116e2826112c0565b9150600082036116f5576116f4611291565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b600061174582611539565b61174f818561172f565b935061175f818560208601611555565b80840191505092915050565b6000611777828461173a565b915081905092915050565b60006040820190506117976000830185611201565b81810360208301526117a98184611590565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117d9826117b2565b6117e381856117bd565b93506117f3818560208601611555565b6117fc8161157f565b840191505092915050565b600060408201905061181c6000830185611201565b818103602083015261182e81846117ce565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a26469706673582212200a2aade4df1ba4e60d19be6c7c15f1d84f91e079ee05bc3dd68eb29da3c946e864736f6c634300081100334c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f646500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000680000000000000000000000000dcfe8c3af65b3e24b4de13eaa6fbc35beacaf61c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000aa914f0201eaeda4571331c1561c5fa6424eabb1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000005cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000000000000000000000000000075a4d2a38449cdca1e7ec97d538364693199b2d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b000000000000000000000000000000000000000000000000000000000000000000000000000000000c23c2ab9113e045779f478df90079444cd769680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000177aa086e7000000000000000000000000000000000000000000000000000000007392c76b000000000000000000000000000000000000000000000000000000008b80d833000000000000000000000000000000000000000000000000000000003cf80e6c00000000000000000000000000000000000000000000000000000000e9fad8ee000000000000000000000000000000000000000000000000000000003d18b91200000000000000000000000000000000000000000000000000000000865419e90000000000000000000000000000000000000000000000000000000016930f4d000000000000000000000000000000000000000000000000000000003528db8800000000000000000000000000000000000000000000000000000000ac2f8afe0000000000000000000000000000000000000000000000000000000009a24f5a00000000000000000000000000000000000000000000000000000000f95d71b1000000000000000000000000000000000000000000000000000000004a6e51f50000000000000000000000000000000000000000000000000000000054eea796000000000000000000000000000000000000000000000000000000003f819713000000000000000000000000000000000000000000000000000000001fab87c4000000000000000000000000000000000000000000000000000000004f8f01020000000000000000000000000000000000000000000000000000000009c7c7d000000000000000000000000000000000000000000000000000000000f99b562300000000000000000000000000000000000000000000000000000000a694fc3a00000000000000000000000000000000000000000000000000000000ba3bd22e00000000000000000000000000000000000000000000000000000000c006e00b000000000000000000000000000000000000000000000000000000002e1a7d4d000000000000000000000000000000000000000000000000000000000000000000000000000000003b7b80627ff7e97149662b8a48db6006349f0f5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001c79502c550000000000000000000000000000000000000000000000000000000050d17b5e00000000000000000000000000000000000000000000000000000000e8684ed100000000000000000000000000000000000000000000000000000000899658830000000000000000000000000000000000000000000000000000000043cb0a0e00000000000000000000000000000000000000000000000000000000900cf0cf00000000000000000000000000000000000000000000000000000000f1b877a8000000000000000000000000000000000000000000000000000000005995a4c40000000000000000000000000000000000000000000000000000000090fba112000000000000000000000000000000000000000000000000000000005b677eac0000000000000000000000000000000000000000000000000000000010fe9ae800000000000000000000000000000000000000000000000000000000857b766300000000000000000000000000000000000000000000000000000000d4818fca00000000000000000000000000000000000000000000000000000000c35d4d0900000000000000000000000000000000000000000000000000000000533d463e00000000000000000000000000000000000000000000000000000000e7c087200000000000000000000000000000000000000000000000000000000061dee8a30000000000000000000000000000000000000000000000000000000070fe276a0000000000000000000000000000000000000000000000000000000040550a1c00000000000000000000000000000000000000000000000000000000a25e49a400000000000000000000000000000000000000000000000000000000f1887fec000000000000000000000000000000000000000000000000000000003e685266000000000000000000000000000000000000000000000000000000000297d4db000000000000000000000000000000000000000000000000000000005081f66f00000000000000000000000000000000000000000000000000000000519877eb00000000000000000000000000000000000000000000000000000000847e062500000000000000000000000000000000000000000000000000000000c19d93fb00000000000000000000000000000000000000000000000000000000fa52c7d800000000000000000000000000000000000000000000000000000000000000000000000000000000046bf7bb88e0e0941358ce3f5a765c9acdda7b9c0000000000000000000000008794804aff6e54f4c2b3f018144a3ddb61d437fd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000bfcbad2ad7080fd9501aed602b7089a2045850e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e1c7392a00000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b506000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016d576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101649190611185565b60405180910390fd5b3660008037600080366000845af43d6000803e806000811461018e573d6000f35b3d6000fd5b600061019d6104b4565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561043c57600084828151811061028b5761028a6111a0565b5b602002602001015160400151905060008583815181106102ae576102ad6111a0565b5b6020026020010151600001519050600082510361030257806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102f99190611210565b60405180910390fd5b6000868481518110610317576103166111a0565b5b6020026020010151602001519050600060028111156103395761033861122b565b5b81600281111561034c5761034b61122b565b5b036103605761035b82846104e1565b610426565b600160028111156103745761037361122b565b5b8160028111156103875761038661122b565b5b0361039b576103968284610809565b610425565b6002808111156103ae576103ad61122b565b5b8160028111156103c1576103c061122b565b5b036103d5576103d08284610b4f565b610424565b8060028111156103e8576103e761122b565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161041b9190611276565b60405180910390fd5b5b5b5050508080610434906112ca565b91505061026d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610470939291906115c9565b60405180910390a16104828282610fd6565b505050565b6000807f959f5d3bd7338cbbb967371aad5c50fefecff8acddc391792439bc468f2237ef90508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361055257806040517f0ae3681c000000000000000000000000000000000000000000000000000000008152600401610549919061167d565b60405180910390fd5b600061055c6104b4565b905060008160010180549050905061058c84604051806060016040528060248152602001611838602491396110f8565b60005b83518110156108025760008482815181106105ad576105ac6111a0565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a357816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161069a9190611185565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107ea906116ad565b945050505080806107fa906112ca565b91505061058f565b5050505050565b60006108136104b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361088657816040517fcd98a96f00000000000000000000000000000000000000000000000000000000815260040161087d919061167d565b60405180910390fd5b6108a883604051806060016040528060288152602001611884602891396110f8565b60005b8251811015610b495760008382815181106108c9576108c86111a0565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109be57816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109b59190611185565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a2e57816040517f358d9d1a000000000000000000000000000000000000000000000000000000008152600401610a259190611185565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a9f57816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a969190611185565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b41906112ca565b9150506108ab565b50505050565b6000610b596104b4565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bd857836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610bcf9190611210565b60405180910390fd5b60005b8351811015610fcf576000848281518110610bf957610bf86111a0565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d5057816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d479190611185565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610dc457816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610dbb9190611185565b60405180910390fd5b8380610dcf906116d7565b94505083816020015161ffff1614610ee4576000856001018581548110610df957610df86111a0565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e3d57610e3c6111a0565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610ef857610ef7611700565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610fc7906112ca565b915050610bdb565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110f45761102d8260405180606001604052806028815260200161185c602891396110f8565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611055919061176b565b600060405180830381855af49150503d8060008114611090576040519150601f19603f3d011682016040523d82523d6000602084013e611095565b606091505b5091509150816110f1576000815111156110b25780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110e8929190611782565b60405180910390fd5b50505b5050565b6000823b9050600081036111455782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161113c929190611807565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61117f8161114a565b82525050565b600060208201905061119a6000830184611176565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111fa826111cf565b9050919050565b61120a816111ef565b82525050565b60006020820190506112256000830184611201565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112708161125a565b82525050565b600060208201905061128b6000830184611267565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112d5826112c0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361130757611306611291565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611347816111ef565b82525050565b6003811061135e5761135d61122b565b5b50565b600081905061136f8261134d565b919050565b600061137f82611361565b9050919050565b61138f81611374565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6113ca8161114a565b82525050565b60006113dc83836113c1565b60208301905092915050565b6000602082019050919050565b600061140082611395565b61140a81856113a0565b9350611415836113b1565b8060005b8381101561144657815161142d88826113d0565b9750611438836113e8565b925050600181019050611419565b5085935050505092915050565b600060608301600083015161146b600086018261133e565b50602083015161147e6020860182611386565b506040830151848203604086015261149682826113f5565b9150508091505092915050565b60006114af8383611453565b905092915050565b6000602082019050919050565b60006114cf82611312565b6114d9818561131d565b9350836020820285016114eb8561132e565b8060005b85811015611527578484038952815161150885826114a3565b9450611513836114b7565b925060208a019950506001810190506114ef565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611573578082015181840152602081019050611558565b60008484015250505050565b6000601f19601f8301169050919050565b600061159b82611539565b6115a58185611544565b93506115b5818560208601611555565b6115be8161157f565b840191505092915050565b600060608201905081810360008301526115e381866114c4565b90506115f26020830185611201565b81810360408301526116048184611590565b9050949350505050565b600082825260208201905092915050565b600061162a82611395565b611634818561160e565b935061163f836113b1565b8060005b8381101561167057815161165788826113d0565b9750611662836113e8565b925050600181019050611643565b5085935050505092915050565b60006020820190508181036000830152611697818461161f565b905092915050565b600061ffff82169050919050565b60006116b88261169f565b915061ffff82036116cc576116cb611291565b5b600182019050919050565b60006116e2826112c0565b9150600082036116f5576116f4611291565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b600061174582611539565b61174f818561172f565b935061175f818560208601611555565b80840191505092915050565b6000611777828461173a565b915081905092915050565b60006040820190506117976000830185611201565b81810360208301526117a98184611590565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117d9826117b2565b6117e381856117bd565b93506117f3818560208601611555565b6117fc8161157f565b840191505092915050565b600060408201905061181c6000830185611201565b818103602083015261182e81846117ce565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a26469706673582212200a2aade4df1ba4e60d19be6c7c15f1d84f91e079ee05bc3dd68eb29da3c946e864736f6c63430008110033