- Contract name:
- ReleaseRegister
- Optimization enabled
- false
- Compiler version
- v0.8.17+commit.8df45f5f
- Verified at
- 2023-09-10T22:34:31.485337Z
Constructor Arguments
0000000000000000000000000000000000000000000000000000000000000000
Arg [0] (uint8) : 0
contracts/lit-core/ReleaseRegister.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "hardhat/console.sol"; contract ReleaseRegister is AccessControl { /* ========== DEPS ========== */ using EnumerableSet for EnumerableSet.Bytes32Set; /* ========== TYPE DEFINITIONS ========== */ bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); bytes32 public constant CREATOR_ROLE = keccak256("CREATOR"); bytes32 public constant ACTIVATOR_ROLE = keccak256("ACTIVATOR"); bytes32 public constant DEACTIVATOR_ROLE = keccak256("DEACTIVATOR"); bytes32 public constant BURNER_ROLE = keccak256("BURNER"); // Also update contracts/release/mod.rs uint public constant RELEASE_OPTION_RO = 1 << 1; uint public constant RELEASE_OPTION_USERS = 1 << 2; uint public constant RELEASE_OPTION_SSH = 1 << 3; enum Status { Null, Pending, Active, Disabled } enum Env { Dev, Staging, Prod } enum Type { Node, Prov, Build, Custom } enum Platform { MetalAmdSev } struct Release { Status status; Env env; Type typ; bytes kind; uint date; Platform platform; uint options; bytes id_key_digest; bytes public_key; bytes cid; } /* ========== ERRORS ========== */ /// A release with this ID does not exist. error ReleaseNotFound(); /// The env provided is not valid for this contract.. error InvalidEnv(); /// The status provided is not valid in this context. error InvalidStatus(); /// The ADMIN role is required to use this function error AdminRoleRequired(); /// The CREATOR role is required to use this function error CreatorRoleRequired(); /// The ACTIVATOR role is required when setting status to Active error ActivatorRoleRequired(); /// The DEACTIVATOR role is required when setting status to Disabled error DeactivatorRoleRequired(); /// The BURNER role is required when burning a release error BurnerRoleRequired(); /* ========== EVENTS ========== */ event InitCreator(bytes domain, bytes authorKeyDigest); event AllowedEnvAdded(Env env); event AllowedEnvRemoved(Env env); event AllowedSubnetAdded(address subnet); event AllowedSubnetRemoved(address subnet); event AllowedAdminSigningPublicKeyAdded(bytes pubKey); event AllowedAdminSigningPublicKeyRemoved(bytes pubKey); event AllowedAuthorKeyDigestAdded(bytes digest); event AllowedAuthorKeyDigestRemoved(bytes digest); event ReleaseCreated( bytes32 releaseId, Status status, Env env, Type typ, bytes kind, uint date, Platform platform, uint options, bytes id_key_digest, bytes public_key, bytes cid ); event ReleaseStatusChange(bytes32 releaseId, Status status); event ReleaseBurned(bytes32 releaseId); /* ========== STATE VARIABLES ========== */ bool creatorInit; bytes creatorDomain; mapping(Env => bool) allowedEnvs; mapping(address => bool) allowedSubnets; mapping(bytes => bool) allowedAdminSigningPublicKeys; mapping(bytes => bool) allowedAuthorKeyDigests; mapping(bytes32 => Release) releases; mapping(bytes32 => bytes32) activeReleases; EnumerableSet.Bytes32Set activeReleaseSet; /* ========== CONSTRUCTOR ========== */ constructor(Env env) { _setupRole(ADMIN_ROLE, msg.sender); _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(CREATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(ACTIVATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(DEACTIVATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(BURNER_ROLE, ADMIN_ROLE); allowedEnvs[env] = true; emit AllowedEnvAdded(env); } /* ========== MUTATIVE FUNCTIONS ========== */ /// initialise the creator portion of the contract (provisioning). function initCreator( Env env, address subnetId, bytes memory domain, bytes memory authorKeyDigest ) public { // Check roles if (!hasRole(CREATOR_ROLE, msg.sender)) { revert CreatorRoleRequired(); } // Ensure the env is allowed if (allowedEnvs[env] != true) { revert InvalidEnv(); } if (env != Env.Dev && env != Env.Staging) { require(!creatorInit, "initCreator() may only be called once"); } creatorInit = true; creatorDomain = domain; allowedSubnets[subnetId] = true; allowedAuthorKeyDigests[authorKeyDigest] = true; emit AllowedAuthorKeyDigestAdded(authorKeyDigest); emit AllowedSubnetAdded(subnetId); emit InitCreator(domain, authorKeyDigest); } /// add an allowed env function addAllowedEnv(Env env) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedEnvs[env] = true; emit AllowedEnvAdded(env); } /// remove an allowed env function removeAllowedEnv(Env env) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedEnvs[env]; emit AllowedEnvRemoved(env); } /// add an allowed subnet function addAllowedSubnet(address subnet) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedSubnets[subnet] = true; emit AllowedSubnetAdded(subnet); } /// remove an allowed subnet function removeAllowedSubnet(address subnet) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedSubnets[subnet]; emit AllowedSubnetRemoved(subnet); } /// add an admin signing public key function addAllowedAdminSigningPublicKey(bytes memory pubKey) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedAdminSigningPublicKeys[pubKey] = true; emit AllowedAdminSigningPublicKeyAdded(pubKey); } /// remove an admin signing public key function removeAllowedAdminSigningPublicKey(bytes memory pubKey) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedAdminSigningPublicKeys[pubKey]; emit AllowedAdminSigningPublicKeyRemoved(pubKey); } /// create a release function updateActiveRelease(bytes32 releaseId) internal virtual { // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } Release memory release = releases[releaseId]; // Ensure it's active. if (release.status != Status.Active) { revert InvalidStatus(); } bytes32 activeHashKey = keccak256( abi.encodePacked( release.env, release.typ, release.kind, release.platform ) ); bytes32 currentActiveId = activeReleases[activeHashKey]; if (currentActiveId != 0) { if (release.date > releases[currentActiveId].date) { activeReleases[activeHashKey] = releaseId; } } else { activeReleases[activeHashKey] = releaseId; } // Add to set activeReleaseSet.add(releaseId); } /// create a release function createRelease( bytes32 releaseId, Status status, Env env, Type typ, bytes memory kind, Platform platform, uint options, bytes memory id_key_digest, bytes memory public_key, bytes memory cid, uint date ) public { // Check roles if (!hasRole(CREATOR_ROLE, msg.sender)) { revert CreatorRoleRequired(); } if (status == Status.Active) { if (!hasRole(ACTIVATOR_ROLE, msg.sender)) { revert ActivatorRoleRequired(); } } else if (status != Status.Pending && status != Status.Disabled) { revert InvalidStatus(); } // Ensure the env is allowed if (allowedEnvs[env] != true) { revert InvalidEnv(); } // Ensure the subnet is allowed require( allowedSubnets[_extractAddressFromBytes32(releaseId, 4)] == true, "The provided subnet (within the release id) is not valid for this contract" ); if (env != Env.Dev && env != Env.Staging) { // Ensure does not already exist require( releases[releaseId].status == Status.Null, "A release with this ID already exists" ); } // Check options if (env == Env.Prod) { require( (options & RELEASE_OPTION_RO) != 0, "The RO option is required for prod releases" ); } // Add the new release if (date == 0) { date = block.timestamp; } releases[releaseId] = Release( status, env, typ, kind, date, platform, options, id_key_digest, public_key, cid ); // Emit events emit ReleaseCreated( releaseId, status, env, typ, kind, date, platform, options, id_key_digest, public_key, cid ); if (status == Status.Active) { updateActiveRelease(releaseId); emit ReleaseStatusChange(releaseId, status); } } /// set the release status function setReleaseStatus(bytes32 releaseId, Status status) public { // Check roles if (status == Status.Active) { if (!hasRole(ACTIVATOR_ROLE, msg.sender)) { revert ActivatorRoleRequired(); } } else if (status == Status.Disabled) { if (!hasRole(DEACTIVATOR_ROLE, msg.sender)) { revert DeactivatorRoleRequired(); } } else { revert InvalidStatus(); } // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } // Ensure status can be changed Release memory release = releases[releaseId]; if (status != Status.Active) { require( getActiveRelease( release.env, release.typ, release.kind, release.platform ) != releaseId, "Must replace active release before changing status from Active" ); } // Update the status releases[releaseId].status = status; // Emit events emit ReleaseStatusChange(releaseId, status); // Update active release if (status == Status.Active) { updateActiveRelease(releaseId); } else { activeReleaseSet.remove(releaseId); } } /// burn a release function burnRelease(bytes32 releaseId) public { // Check roles if (!hasRole(BURNER_ROLE, msg.sender)) { revert BurnerRoleRequired(); } // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } // Delete delete releases[releaseId]; activeReleaseSet.remove(releaseId); // Emit events emit ReleaseBurned(releaseId); } /* ========== VIEWS ========== */ /// Check if the creator init method has been called. function hasCreatorInit() external view returns (bool) { return (creatorInit); } /// Get the creator (provisioning) domain. function getCreatorDomain() external view returns (bytes memory) { return (creatorDomain); } /// Check if has allowed env. function hasAllowedEnv(Env env) external view returns (bool) { return (allowedEnvs[env]); } /// Check if has allowed subnet. function hasAllowedSubnet(address subnet) external view returns (bool) { return (allowedSubnets[subnet]); } /// Check if has allowed author key digest. function hasAllowedAuthorKeyDigest( bytes memory digest ) external view returns (bool) { return (allowedAuthorKeyDigests[digest]); } /// Check if has allowed admin signing public key. function hasAllowedAdminSigningPublicKey( bytes memory pubKey ) external view returns (bool) { return (allowedAdminSigningPublicKeys[pubKey]); } /// Returns the release for a given id. function getRelease( bytes32 releaseId ) external view returns (Release memory) { return releases[releaseId]; } /// Returns the active release for a given criteria. function getActiveRelease( Env env, Type typ, bytes memory kind, Platform platform ) public view returns (bytes32) { bytes32 activeHashKey = keccak256( abi.encodePacked(env, typ, kind, platform) ); return (activeReleases[activeHashKey]); } /// Returns the active releases. function getActiveReleases() public view returns (bytes32[] memory) { return (activeReleaseSet.values()); } /* ========== UTILS ========== */ function _extractAddressFromBytes32( bytes32 input, uint offset ) private pure returns (address) { bytes32 out; for (uint i = 0; i < 20; i++) { out |= bytes32(input[offset + i] & 0xFF) >> (i * 8); } return address(uint160(bytes20(out))); } }
@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 * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
@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); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
@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; } }
@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; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
@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; } }
@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); }
@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. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
@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); } } }
@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 { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
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)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"error","name":"ActivatorRoleRequired","inputs":[]},{"type":"error","name":"AdminRoleRequired","inputs":[]},{"type":"error","name":"BurnerRoleRequired","inputs":[]},{"type":"error","name":"CreatorRoleRequired","inputs":[]},{"type":"error","name":"DeactivatorRoleRequired","inputs":[]},{"type":"error","name":"InvalidEnv","inputs":[]},{"type":"error","name":"InvalidStatus","inputs":[]},{"type":"error","name":"ReleaseNotFound","inputs":[]},{"type":"event","name":"AllowedAdminSigningPublicKeyAdded","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAdminSigningPublicKeyRemoved","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAuthorKeyDigestAdded","inputs":[{"type":"bytes","name":"digest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAuthorKeyDigestRemoved","inputs":[{"type":"bytes","name":"digest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedEnvAdded","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedEnvRemoved","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedSubnetAdded","inputs":[{"type":"address","name":"subnet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedSubnetRemoved","inputs":[{"type":"address","name":"subnet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"InitCreator","inputs":[{"type":"bytes","name":"domain","internalType":"bytes","indexed":false},{"type":"bytes","name":"authorKeyDigest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseBurned","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseCreated","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status","indexed":false},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type","indexed":false},{"type":"bytes","name":"kind","internalType":"bytes","indexed":false},{"type":"uint256","name":"date","internalType":"uint256","indexed":false},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform","indexed":false},{"type":"uint256","name":"options","internalType":"uint256","indexed":false},{"type":"bytes","name":"id_key_digest","internalType":"bytes","indexed":false},{"type":"bytes","name":"public_key","internalType":"bytes","indexed":false},{"type":"bytes","name":"cid","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseStatusChange","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status","indexed":false}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ACTIVATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BURNER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"CREATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEACTIVATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_RO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_SSH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_USERS","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"bytes","name":"kind","internalType":"bytes"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"},{"type":"uint256","name":"options","internalType":"uint256"},{"type":"bytes","name":"id_key_digest","internalType":"bytes"},{"type":"bytes","name":"public_key","internalType":"bytes"},{"type":"bytes","name":"cid","internalType":"bytes"},{"type":"uint256","name":"date","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getActiveRelease","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"bytes","name":"kind","internalType":"bytes"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getActiveReleases","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"getCreatorDomain","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct ReleaseRegister.Release","components":[{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"bytes","name":"kind","internalType":"bytes"},{"type":"uint256","name":"date","internalType":"uint256"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"},{"type":"uint256","name":"options","internalType":"uint256"},{"type":"bytes","name":"id_key_digest","internalType":"bytes"},{"type":"bytes","name":"public_key","internalType":"bytes"},{"type":"bytes","name":"cid","internalType":"bytes"}]}],"name":"getRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedAuthorKeyDigest","inputs":[{"type":"bytes","name":"digest","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasCreatorInit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initCreator","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"address","name":"subnetId","internalType":"address"},{"type":"bytes","name":"domain","internalType":"bytes"},{"type":"bytes","name":"authorKeyDigest","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReleaseStatus","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b5060405162005274380380620052748339818101604052810190620000379190620004a1565b620000697fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336200027960201b60201c565b6200009b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42806200028f60201b60201c565b620000ed7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db67fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b6200013f7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b620001917f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b620001e37f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c87fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b600160036000836002811115620001ff57620001fe620004d3565b5b6002811115620002145762000213620004d3565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516200026a919062000553565b60405180910390a15062000570565b6200028b8282620002f260201b60201c565b5050565b6000620002a283620003e360201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200030482826200040260201b60201c565b620003df57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003846200046c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000838152602001908152602001600020600101549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b600381106200048757600080fd5b50565b6000815190506200049b8162000479565b92915050565b600060208284031215620004ba57620004b962000474565b5b6000620004ca848285016200048a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110620005165762000515620004d3565b5b50565b6000819050620005298262000502565b919050565b60006200053b8262000519565b9050919050565b6200054d816200052e565b82525050565b60006020820190506200056a600083018462000542565b92915050565b614cf480620005806000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806370e65a451161011a578063a0908300116100ad578063d547741f1161007c578063d547741f146105ef578063d6bc626d1461060b578063db2d303b1461063b578063e1c0af0814610657578063f2dc99161461067357610206565b8063a090830014610567578063a217fddf14610597578063ad769394146105b5578063bc7ca317146105d357610206565b80638aeda25a116100e95780638aeda25a146104df5780638deb3893146104fd57806391d14854146105195780639bb4e2f71461054957610206565b806370e65a451461045957806374bc81391461047557806375b238fc146104915780637f698e92146104af57610206565b80632609e5861161019d5780632f2ff15d1161016c5780632f2ff15d146103c757806336568abe146103e35780633acd1ea3146103ff5780633dc6c8581461041d578063458be7dc1461043b57610206565b80632609e5861461033f578063277dceaf1461035b578063282c51f3146103795780632ae79b6d1461039757610206565b80630e1e59dd116101d95780630e1e59dd146102a757806319724065146102c35780631bd564dc146102df578063248a9ca31461030f57610206565b806301ffc9a71461020b578063023e92881461023b57806308740a3b146102595780630e092b1814610277575b600080fd5b610225600480360381019061022091906134a1565b61068f565b60405161023291906134e9565b60405180910390f35b610243610709565b60405161025091906135cc565b60405180910390f35b61026161071a565b60405161026e91906135fd565b60405180910390f35b610291600480360381019061028c919061375e565b61073e565b60405161029e91906134e9565b60405180910390f35b6102c160048036038101906102bc91906137f8565b610773565b005b6102dd60048036038101906102d891906138dd565b610e09565b005b6102f960048036038101906102f49190613a41565b6114ab565b60405161030691906134e9565b60405180910390f35b61032960048036038101906103249190613a6e565b6114f9565b60405161033691906135fd565b60405180910390f35b61035960048036038101906103549190613a6e565b611518565b005b6103636116fe565b6040516103709190613aaa565b60405180910390f35b610381611703565b60405161038e91906135fd565b60405180910390f35b6103b160048036038101906103ac9190613ac5565b611727565b6040516103be91906135fd565b60405180910390f35b6103e160048036038101906103dc9190613ba6565b611778565b005b6103fd60048036038101906103f89190613ba6565b611799565b005b61040761181c565b6040516104149190613aaa565b60405180910390f35b610425611821565b60405161043291906134e9565b60405180910390f35b610443611838565b60405161045091906135fd565b60405180910390f35b610473600480360381019061046e919061375e565b61185c565b005b61048f600480360381019061048a9190613a41565b61192d565b005b610499611a17565b6040516104a691906135fd565b60405180910390f35b6104c960048036038101906104c49190613a6e565b611a3b565b6040516104d69190613eb2565b60405180910390f35b6104e7611db1565b6040516104f491906135fd565b60405180910390f35b61051760048036038101906105129190613a41565b611dd5565b005b610533600480360381019061052e9190613ba6565b611eb6565b60405161054091906134e9565b60405180910390f35b610551611f20565b60405161055e9190613f1e565b60405180910390f35b610581600480360381019061057c9190613f40565b611fb2565b60405161058e91906134e9565b60405180910390f35b61059f612008565b6040516105ac91906135fd565b60405180910390f35b6105bd61200f565b6040516105ca9190613aaa565b60405180910390f35b6105ed60048036038101906105e89190613f6d565b612014565b005b61060960048036038101906106049190613ba6565b61230c565b005b6106256004803603810190610620919061375e565b61232d565b60405161063291906134e9565b60405180910390f35b61065560048036038101906106509190613f40565b612362565b005b610671600480360381019061066c919061375e565b61244b565b005b61068d60048036038101906106889190613f40565b612513565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610702575061070182612605565b5b9050919050565b6060610715600961266f565b905090565b7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c81565b60006005826040516107509190614048565b908152602001604051809103902060009054906101000a900460ff169050919050565b6002600381111561078757610786613be6565b5b81600381111561079a57610799613be6565b5b03610804576107c97fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c33611eb6565b6107ff576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c7565b60038081111561081757610816613be6565b5b81600381111561082a57610829613be6565b5b03610894576108597f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf33611eb6565b61088f576040517f093efaf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c6565b6040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600060038111156108db576108da613be6565b5b6007600084815260200190815260200160002060000160009054906101000a900460ff16600381111561091157610910613be6565b5b03610948576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000848152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff16600381111561098e5761098d613be6565b5b60038111156109a05761099f613be6565b5b81526020016000820160019054906101000a900460ff1660028111156109c9576109c8613be6565b5b60028111156109db576109da613be6565b5b81526020016000820160029054906101000a900460ff166003811115610a0457610a03613be6565b5b6003811115610a1657610a15613be6565b5b8152602001600182018054610a2a9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a569061408e565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff166000811115610adb57610ada613be6565b5b6000811115610aed57610aec613be6565b5b815260200160048201548152602001600582018054610b0b9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b379061408e565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505050508152602001600682018054610b9d9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc99061408e565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b50505050508152602001600782018054610c2f9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5b9061408e565b8015610ca85780601f10610c7d57610100808354040283529160200191610ca8565b820191906000526020600020905b815481529060010190602001808311610c8b57829003601f168201915b505050505081525050905060026003811115610cc757610cc6613be6565b5b826003811115610cda57610cd9613be6565b5b14610d3d5782610cfc8260200151836040015184606001518560a00151611727565b03610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390614142565b60405180910390fd5b5b816007600085815260200190815260200160002060000160006101000a81548160ff02191690836003811115610d7657610d75613be6565b5b02179055507f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8383604051610dac929190614171565b60405180910390a160026003811115610dc857610dc7613be6565b5b826003811115610ddb57610dda613be6565b5b03610dee57610de983612690565b610e04565b610e02836009612bb590919063ffffffff16565b505b505050565b610e337f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db633611eb6565b610e69576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115610e7d57610e7c613be6565b5b8a6003811115610e9057610e8f613be6565b5b03610efa57610ebf7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c33611eb6565b610ef5576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8b565b60016003811115610f0e57610f0d613be6565b5b8a6003811115610f2157610f20613be6565b5b14158015610f535750600380811115610f3d57610f3c613be6565b5b8a6003811115610f5057610f4f613be6565b5b14155b15610f8a576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60011515600360008b6002811115610fa657610fa5613be6565b5b6002811115610fb857610fb7613be6565b5b815260200190815260200160002060009054906101000a900460ff1615151461100d576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600460006110208e6004612bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614232565b60405180910390fd5b600060028111156110be576110bd613be6565b5b8960028111156110d1576110d0613be6565b5b141580156111045750600160028111156110ee576110ed613be6565b5b89600281111561110157611100613be6565b5b14155b15611194576000600381111561111d5761111c613be6565b5b600760008d815260200190815260200160002060000160009054906101000a900460ff16600381111561115357611152613be6565b5b14611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906142c4565b60405180910390fd5b5b6002808111156111a7576111a6613be6565b5b8960028111156111ba576111b9613be6565b5b036112065760006002861603611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90614356565b60405180910390fd5b5b60008103611212574290505b6040518061014001604052808b600381111561123157611230613be6565b5b81526020018a600281111561124957611248613be6565b5b815260200189600381111561126157611260613be6565b5b815260200188815260200182815260200187600081111561128557611284613be6565b5b815260200186815260200185815260200184815260200183815250600760008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360038111156112de576112dd613be6565b5b021790555060208201518160000160016101000a81548160ff0219169083600281111561130e5761130d613be6565b5b021790555060408201518160000160026101000a81548160ff0219169083600381111561133e5761133d613be6565b5b021790555060608201518160010190816113589190614522565b506080820151816002015560a08201518160030160006101000a81548160ff0219169083600081111561138e5761138d613be6565b5b021790555060c0820151816004015560e08201518160050190816113b29190614522565b506101008201518160060190816113c99190614522565b506101208201518160070190816113e09190614522565b509050507f90a862cc16ebcb9b549c932013f77c422df117e24d48d7d26a7d90fbc43c3c8f8b8b8b8b8b868c8c8c8c8c6040516114279b9a99989796959493929190614621565b60405180910390a16002600381111561144357611442613be6565b5b8a600381111561145657611455613be6565b5b0361149e576114648b612690565b7f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8b8b604051611495929190614171565b60405180910390a15b5050505050505050505050565b6000600360008360028111156114c4576114c3613be6565b5b60028111156114d6576114d5613be6565b5b815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000838152602001908152602001600020600101549050919050565b6115427f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c833611eb6565b611578576040517ff4ecad6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600381111561158c5761158b613be6565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff1660038111156115c2576115c1613be6565b5b036115f9576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076000828152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff0219169055600182016000611659919061333e565b60028201600090556003820160006101000a81549060ff0219169055600482016000905560058201600061168d919061333e565b60068201600061169d919061333e565b6007820160006116ad919061333e565b50506116c3816009612bb590919063ffffffff16565b507fe4a7f7b48251ad70e63f800758a445b00386e2fa98d5afce96a546e8fce2114e816040516116f391906135fd565b60405180910390a150565b600481565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b60008085858585604051602001611741949392919061474c565b6040516020818303038152906040528051906020012090506008600082815260200190815260200160002054915050949350505050565b611781826114f9565b61178a81612c59565b6117948383612c6d565b505050565b6117a1612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614808565b60405180910390fd5b6118188282612d55565b5050565b600881565b6000600160009054906101000a900460ff16905090565b7f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf81565b6118867fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6118bc576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016005826040516118ce9190614048565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507fe7735e9f569fe61671662a8829db77de38ef614c77b1b136c958aff781df7c75816040516119229190613f1e565b60405180910390a150565b6119577fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b61198d576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600360008360028111156119a6576119a5613be6565b5b60028111156119b8576119b7613be6565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051611a0c9190614828565b60405180910390a150565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b611a4361337e565b60076000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff166003811115611a8757611a86613be6565b5b6003811115611a9957611a98613be6565b5b81526020016000820160019054906101000a900460ff166002811115611ac257611ac1613be6565b5b6002811115611ad457611ad3613be6565b5b81526020016000820160029054906101000a900460ff166003811115611afd57611afc613be6565b5b6003811115611b0f57611b0e613be6565b5b8152602001600182018054611b239061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4f9061408e565b8015611b9c5780601f10611b7157610100808354040283529160200191611b9c565b820191906000526020600020905b815481529060010190602001808311611b7f57829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff166000811115611bd457611bd3613be6565b5b6000811115611be657611be5613be6565b5b815260200160048201548152602001600582018054611c049061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c309061408e565b8015611c7d5780601f10611c5257610100808354040283529160200191611c7d565b820191906000526020600020905b815481529060010190602001808311611c6057829003601f168201915b50505050508152602001600682018054611c969061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc29061408e565b8015611d0f5780601f10611ce457610100808354040283529160200191611d0f565b820191906000526020600020905b815481529060010190602001808311611cf257829003601f168201915b50505050508152602001600782018054611d289061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d549061408e565b8015611da15780601f10611d7657610100808354040283529160200191611da1565b820191906000526020600020905b815481529060010190602001808311611d8457829003601f168201915b5050505050815250509050919050565b7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db681565b611dff7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b611e35576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036000826002811115611e4c57611e4b613be6565b5b6002811115611e5e57611e5d613be6565b5b815260200190815260200160002060006101000a81549060ff02191690557f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4781604051611eab9190614828565b60405180910390a150565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611f2f9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5b9061408e565b8015611fa85780601f10611f7d57610100808354040283529160200191611fa8565b820191906000526020600020905b815481529060010190602001808311611f8b57829003601f168201915b5050505050905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000801b81565b600281565b61203e7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db633611eb6565b612074576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600115156003600086600281111561208f5761208e613be6565b5b60028111156120a1576120a0613be6565b5b815260200190815260200160002060009054906101000a900460ff161515146120f6576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561210a57612109613be6565b5b84600281111561211d5761211c613be6565b5b1415801561215057506001600281111561213a57612139613be6565b5b84600281111561214d5761214c613be6565b5b14155b156121a657600160009054906101000a900460ff16156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c906148b5565b60405180910390fd5b5b60018060006101000a81548160ff02191690831515021790555081600290816121cf9190614522565b506001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160068260405161223a9190614048565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f18f0396c6d01876d7610d96877b44f017ab4ca2265b13079b10e0be6b6af30d48160405161228e9190613f1e565b60405180910390a17f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd6278836040516122c591906148e4565b60405180910390a17f5b590cceabbeb28cd16e41a811ba46df5bb82c98920d5e7ff77e4fa9db709b3382826040516122fe9291906148ff565b60405180910390a150505050565b612315826114f9565b61231e81612c59565b6123288383612d55565b505050565b600060068260405161233f9190614048565b908152602001604051809103902060009054906101000a900460ff169050919050565b61238c7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6123c2576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690557ff580a1ea01c0ed3ec5e4797c560ee7046c3591588c0feb814f5f2d4eca50272c8160405161244091906148e4565b60405180910390a150565b6124757fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6124ab576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005816040516124bb9190614048565b908152602001604051809103902060006101000a81549060ff02191690557ff13042255d0b58f7acc82c201a0cd4d834b0783dd7b3c29cca9b96840d633f74816040516125089190613f1e565b60405180910390a150565b61253d7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b612573576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd6278816040516125fa91906148e4565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600061267f83600001612e36565b905060608190508092505050919050565b600060038111156126a4576126a3613be6565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff1660038111156126da576126d9613be6565b5b03612711576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff16600381111561275757612756613be6565b5b600381111561276957612768613be6565b5b81526020016000820160019054906101000a900460ff16600281111561279257612791613be6565b5b60028111156127a4576127a3613be6565b5b81526020016000820160029054906101000a900460ff1660038111156127cd576127cc613be6565b5b60038111156127df576127de613be6565b5b81526020016001820180546127f39061408e565b80601f016020809104026020016040519081016040528092919081815260200182805461281f9061408e565b801561286c5780601f106128415761010080835404028352916020019161286c565b820191906000526020600020905b81548152906001019060200180831161284f57829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff1660008111156128a4576128a3613be6565b5b60008111156128b6576128b5613be6565b5b8152602001600482015481526020016005820180546128d49061408e565b80601f01602080910402602001604051908101604052809291908181526020018280546129009061408e565b801561294d5780601f106129225761010080835404028352916020019161294d565b820191906000526020600020905b81548152906001019060200180831161293057829003601f168201915b505050505081526020016006820180546129669061408e565b80601f01602080910402602001604051908101604052809291908181526020018280546129929061408e565b80156129df5780601f106129b4576101008083540402835291602001916129df565b820191906000526020600020905b8154815290600101906020018083116129c257829003601f168201915b505050505081526020016007820180546129f89061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a249061408e565b8015612a715780601f10612a4657610100808354040283529160200191612a71565b820191906000526020600020905b815481529060010190602001808311612a5457829003601f168201915b505050505081525050905060026003811115612a9057612a8f613be6565b5b81600001516003811115612aa757612aa6613be6565b5b14612ade576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160200151826040015183606001518460a00151604051602001612b07949392919061474c565b6040516020818303038152906040528051906020012090506000600860008381526020019081526020016000205490506000801b8114612b8157600760008281526020019081526020016000206002015483608001511115612b7c578360086000848152602001908152602001600020819055505b612b9a565b8360086000848152602001908152602001600020819055505b612bae846009612e9290919063ffffffff16565b5050505050565b6000612bc48360000183612ea9565b905092915050565b60008060005b6014811015612c4b57600881612be89190614965565b60ff60f81b868387612bfa91906149a7565b60208110612c0b57612c0a6149db565b5b1a60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c821791508080612c4390614a0a565b915050612bd2565b508060601c91505092915050565b612c6a81612c65612d4d565b612fbd565b50565b612c778282611eb6565b612d4957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612cee612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b612d5f8282611eb6565b15612e3257600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612dd7612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e8657602002820191906000526020600020905b815481526020019060010190808311612e72575b50505050509050919050565b6000612ea18360000183613042565b905092915050565b60008083600101600084815260200190815260200160002054905060008114612fb1576000600182612edb9190614a52565b9050600060018660000180549050612ef39190614a52565b9050818114612f62576000866000018281548110612f1457612f136149db565b5b9060005260206000200154905080876000018481548110612f3857612f376149db565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612f7657612f75614a86565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612fb7565b60009150505b92915050565b612fc78282611eb6565b61303e57612fd4816130b2565b612fe28360001c60206130df565b604051602001612ff3929190614b94565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130359190614c07565b60405180910390fd5b5050565b600061304e838361331b565b6130a75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130ac565b600090505b92915050565b60606130d88273ffffffffffffffffffffffffffffffffffffffff16601460ff166130df565b9050919050565b6060600060028360026130f29190614965565b6130fc91906149a7565b67ffffffffffffffff81111561311557613114613633565b5b6040519080825280601f01601f1916602001820160405280156131475781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061317f5761317e6149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131e3576131e26149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026132239190614965565b61322d91906149a7565b90505b60018111156132cd577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061326f5761326e6149db565b5b1a60f81b828281518110613286576132856149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806132c690614c29565b9050613230565b5060008414613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330890614c9e565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461334a9061408e565b6000825580601f1061335c575061337b565b601f01602090049060005260206000209081019061337a9190613418565b5b50565b6040518061014001604052806000600381111561339e5761339d613be6565b5b8152602001600060028111156133b7576133b6613be6565b5b8152602001600060038111156133d0576133cf613be6565b5b815260200160608152602001600081526020016000808111156133f6576133f5613be6565b5b8152602001600081526020016060815260200160608152602001606081525090565b5b80821115613431576000816000905550600101613419565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61354381613530565b82525050565b6000613555838361353a565b60208301905092915050565b6000602082019050919050565b600061357982613504565b613583818561350f565b935061358e83613520565b8060005b838110156135bf5781516135a68882613549565b97506135b183613561565b925050600181019050613592565b5085935050505092915050565b600060208201905081810360008301526135e6818461356e565b905092915050565b6135f781613530565b82525050565b600060208201905061361260008301846135ee565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366b82613622565b810181811067ffffffffffffffff8211171561368a57613689613633565b5b80604052505050565b600061369d613435565b90506136a98282613662565b919050565b600067ffffffffffffffff8211156136c9576136c8613633565b5b6136d282613622565b9050602081019050919050565b82818337600083830152505050565b60006137016136fc846136ae565b613693565b90508281526020810184848401111561371d5761371c61361d565b5b6137288482856136df565b509392505050565b600082601f83011261374557613744613618565b5b81356137558482602086016136ee565b91505092915050565b6000602082840312156137745761377361343f565b5b600082013567ffffffffffffffff81111561379257613791613444565b5b61379e84828501613730565b91505092915050565b6137b081613530565b81146137bb57600080fd5b50565b6000813590506137cd816137a7565b92915050565b600481106137e057600080fd5b50565b6000813590506137f2816137d3565b92915050565b6000806040838503121561380f5761380e61343f565b5b600061381d858286016137be565b925050602061382e858286016137e3565b9150509250929050565b6003811061384557600080fd5b50565b60008135905061385781613838565b92915050565b6004811061386a57600080fd5b50565b60008135905061387c8161385d565b92915050565b6001811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000819050919050565b6138ba816138a7565b81146138c557600080fd5b50565b6000813590506138d7816138b1565b92915050565b60008060008060008060008060008060006101608c8e0312156139035761390261343f565b5b60006139118e828f016137be565b9b505060206139228e828f016137e3565b9a505060406139338e828f01613848565b99505060606139448e828f0161386d565b98505060808c013567ffffffffffffffff81111561396557613964613444565b5b6139718e828f01613730565b97505060a06139828e828f01613892565b96505060c06139938e828f016138c8565b95505060e08c013567ffffffffffffffff8111156139b4576139b3613444565b5b6139c08e828f01613730565b9450506101008c013567ffffffffffffffff8111156139e2576139e1613444565b5b6139ee8e828f01613730565b9350506101208c013567ffffffffffffffff811115613a1057613a0f613444565b5b613a1c8e828f01613730565b925050610140613a2e8e828f016138c8565b9150509295989b509295989b9093969950565b600060208284031215613a5757613a5661343f565b5b6000613a6584828501613848565b91505092915050565b600060208284031215613a8457613a8361343f565b5b6000613a92848285016137be565b91505092915050565b613aa4816138a7565b82525050565b6000602082019050613abf6000830184613a9b565b92915050565b60008060008060808587031215613adf57613ade61343f565b5b6000613aed87828801613848565b9450506020613afe8782880161386d565b935050604085013567ffffffffffffffff811115613b1f57613b1e613444565b5b613b2b87828801613730565b9250506060613b3c87828801613892565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b7382613b48565b9050919050565b613b8381613b68565b8114613b8e57600080fd5b50565b600081359050613ba081613b7a565b92915050565b60008060408385031215613bbd57613bbc61343f565b5b6000613bcb858286016137be565b9250506020613bdc85828601613b91565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613c2657613c25613be6565b5b50565b6000819050613c3782613c15565b919050565b6000613c4782613c29565b9050919050565b613c5781613c3c565b82525050565b60038110613c6e57613c6d613be6565b5b50565b6000819050613c7f82613c5d565b919050565b6000613c8f82613c71565b9050919050565b613c9f81613c84565b82525050565b60048110613cb657613cb5613be6565b5b50565b6000819050613cc782613ca5565b919050565b6000613cd782613cb9565b9050919050565b613ce781613ccc565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d27578082015181840152602081019050613d0c565b60008484015250505050565b6000613d3e82613ced565b613d488185613cf8565b9350613d58818560208601613d09565b613d6181613622565b840191505092915050565b613d75816138a7565b82525050565b60018110613d8c57613d8b613be6565b5b50565b6000819050613d9d82613d7b565b919050565b6000613dad82613d8f565b9050919050565b613dbd81613da2565b82525050565b600061014083016000830151613ddc6000860182613c4e565b506020830151613def6020860182613c96565b506040830151613e026040860182613cde565b5060608301518482036060860152613e1a8282613d33565b9150506080830151613e2f6080860182613d6c565b5060a0830151613e4260a0860182613db4565b5060c0830151613e5560c0860182613d6c565b5060e083015184820360e0860152613e6d8282613d33565b915050610100830151848203610100860152613e898282613d33565b915050610120830151848203610120860152613ea58282613d33565b9150508091505092915050565b60006020820190508181036000830152613ecc8184613dc3565b905092915050565b600082825260208201905092915050565b6000613ef082613ced565b613efa8185613ed4565b9350613f0a818560208601613d09565b613f1381613622565b840191505092915050565b60006020820190508181036000830152613f388184613ee5565b905092915050565b600060208284031215613f5657613f5561343f565b5b6000613f6484828501613b91565b91505092915050565b60008060008060808587031215613f8757613f8661343f565b5b6000613f9587828801613848565b9450506020613fa687828801613b91565b935050604085013567ffffffffffffffff811115613fc757613fc6613444565b5b613fd387828801613730565b925050606085013567ffffffffffffffff811115613ff457613ff3613444565b5b61400087828801613730565b91505092959194509250565b600081905092915050565b600061402282613ced565b61402c818561400c565b935061403c818560208601613d09565b80840191505092915050565b60006140548284614017565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140a657607f821691505b6020821081036140b9576140b861405f565b5b50919050565b600082825260208201905092915050565b7f4d757374207265706c616365206163746976652072656c65617365206265666f60008201527f7265206368616e67696e67207374617475732066726f6d204163746976650000602082015250565b600061412c603e836140bf565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b61416b81613c3c565b82525050565b600060408201905061418660008301856135ee565b6141936020830184614162565b9392505050565b7f5468652070726f7669646564207375626e6574202877697468696e207468652060008201527f72656c6561736520696429206973206e6f742076616c696420666f722074686960208201527f7320636f6e747261637400000000000000000000000000000000000000000000604082015250565b600061421c604a836140bf565b91506142278261419a565b606082019050919050565b6000602082019050818103600083015261424b8161420f565b9050919050565b7f412072656c656173652077697468207468697320494420616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006142ae6025836140bf565b91506142b982614252565b604082019050919050565b600060208201905081810360008301526142dd816142a1565b9050919050565b7f54686520524f206f7074696f6e20697320726571756972656420666f7220707260008201527f6f642072656c6561736573000000000000000000000000000000000000000000602082015250565b6000614340602b836140bf565b915061434b826142e4565b604082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261439b565b6143e2868361439b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061441f61441a614415846138a7565b6143fa565b6138a7565b9050919050565b6000819050919050565b61443983614404565b61444d61444582614426565b8484546143a8565b825550505050565b600090565b614462614455565b61446d818484614430565b505050565b5b818110156144915761448660008261445a565b600181019050614473565b5050565b601f8211156144d6576144a781614376565b6144b08461438b565b810160208510156144bf578190505b6144d36144cb8561438b565b830182614472565b50505b505050565b600082821c905092915050565b60006144f9600019846008026144db565b1980831691505092915050565b600061451283836144e8565b9150826002028217905092915050565b61452b82613ced565b67ffffffffffffffff81111561454457614543613633565b5b61454e825461408e565b614559828285614495565b600060209050601f83116001811461458c576000841561457a578287015190505b6145848582614506565b8655506145ec565b601f19841661459a86614376565b60005b828110156145c25784890151825560018201915060208501945060208101905061459d565b868310156145df57848901516145db601f8916826144e8565b8355505b6001600288020188555050505b505050505050565b6145fd81613c84565b82525050565b61460c81613ccc565b82525050565b61461b81613da2565b82525050565b600061016082019050614637600083018e6135ee565b614644602083018d614162565b614651604083018c6145f4565b61465e606083018b614603565b8181036080830152614670818a613ee5565b905061467f60a0830189613a9b565b61468c60c0830188614612565b61469960e0830187613a9b565b8181036101008301526146ac8186613ee5565b90508181036101208301526146c18185613ee5565b90508181036101408301526146d68184613ee5565b90509c9b505050505050505050505050565b60008160f81b9050919050565b6000614700826146e8565b9050919050565b61471861471382613c84565b6146f5565b82525050565b61472f61472a82613ccc565b6146f5565b82525050565b61474661474182613da2565b6146f5565b82525050565b60006147588287614707565b600182019150614768828661471e565b6001820191506147788285614017565b91506147848284614735565b60018201915081905095945050505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006147f2602f836140bf565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b600060208201905061483d60008301846145f4565b92915050565b7f696e697443726561746f722829206d6179206f6e6c792062652063616c6c656460008201527f206f6e6365000000000000000000000000000000000000000000000000000000602082015250565b600061489f6025836140bf565b91506148aa82614843565b604082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b6148de81613b68565b82525050565b60006020820190506148f960008301846148d5565b92915050565b600060408201905081810360008301526149198185613ee5565b9050818103602083015261492d8184613ee5565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614970826138a7565b915061497b836138a7565b9250828202614989816138a7565b915082820484148315176149a05761499f614936565b5b5092915050565b60006149b2826138a7565b91506149bd836138a7565b92508282019050808211156149d5576149d4614936565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a15826138a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a4757614a46614936565b5b600182019050919050565b6000614a5d826138a7565b9150614a68836138a7565b9250828203905081811115614a8057614a7f614936565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614af6601783614ab5565b9150614b0182614ac0565b601782019050919050565b600081519050919050565b6000614b2282614b0c565b614b2c8185614ab5565b9350614b3c818560208601613d09565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614b7e601183614ab5565b9150614b8982614b48565b601182019050919050565b6000614b9f82614ae9565b9150614bab8285614b17565b9150614bb682614b71565b9150614bc28284614b17565b91508190509392505050565b6000614bd982614b0c565b614be381856140bf565b9350614bf3818560208601613d09565b614bfc81613622565b840191505092915050565b60006020820190508181036000830152614c218184614bce565b905092915050565b6000614c34826138a7565b915060008203614c4757614c46614936565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614c886020836140bf565b9150614c9382614c52565b602082019050919050565b60006020820190508181036000830152614cb781614c7b565b905091905056fea2646970667358221220b7a2f5cdf3d6597bcc03148af3dcabe43029e122783c0f81506bcc481ea031c164736f6c634300081100330000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806370e65a451161011a578063a0908300116100ad578063d547741f1161007c578063d547741f146105ef578063d6bc626d1461060b578063db2d303b1461063b578063e1c0af0814610657578063f2dc99161461067357610206565b8063a090830014610567578063a217fddf14610597578063ad769394146105b5578063bc7ca317146105d357610206565b80638aeda25a116100e95780638aeda25a146104df5780638deb3893146104fd57806391d14854146105195780639bb4e2f71461054957610206565b806370e65a451461045957806374bc81391461047557806375b238fc146104915780637f698e92146104af57610206565b80632609e5861161019d5780632f2ff15d1161016c5780632f2ff15d146103c757806336568abe146103e35780633acd1ea3146103ff5780633dc6c8581461041d578063458be7dc1461043b57610206565b80632609e5861461033f578063277dceaf1461035b578063282c51f3146103795780632ae79b6d1461039757610206565b80630e1e59dd116101d95780630e1e59dd146102a757806319724065146102c35780631bd564dc146102df578063248a9ca31461030f57610206565b806301ffc9a71461020b578063023e92881461023b57806308740a3b146102595780630e092b1814610277575b600080fd5b610225600480360381019061022091906134a1565b61068f565b60405161023291906134e9565b60405180910390f35b610243610709565b60405161025091906135cc565b60405180910390f35b61026161071a565b60405161026e91906135fd565b60405180910390f35b610291600480360381019061028c919061375e565b61073e565b60405161029e91906134e9565b60405180910390f35b6102c160048036038101906102bc91906137f8565b610773565b005b6102dd60048036038101906102d891906138dd565b610e09565b005b6102f960048036038101906102f49190613a41565b6114ab565b60405161030691906134e9565b60405180910390f35b61032960048036038101906103249190613a6e565b6114f9565b60405161033691906135fd565b60405180910390f35b61035960048036038101906103549190613a6e565b611518565b005b6103636116fe565b6040516103709190613aaa565b60405180910390f35b610381611703565b60405161038e91906135fd565b60405180910390f35b6103b160048036038101906103ac9190613ac5565b611727565b6040516103be91906135fd565b60405180910390f35b6103e160048036038101906103dc9190613ba6565b611778565b005b6103fd60048036038101906103f89190613ba6565b611799565b005b61040761181c565b6040516104149190613aaa565b60405180910390f35b610425611821565b60405161043291906134e9565b60405180910390f35b610443611838565b60405161045091906135fd565b60405180910390f35b610473600480360381019061046e919061375e565b61185c565b005b61048f600480360381019061048a9190613a41565b61192d565b005b610499611a17565b6040516104a691906135fd565b60405180910390f35b6104c960048036038101906104c49190613a6e565b611a3b565b6040516104d69190613eb2565b60405180910390f35b6104e7611db1565b6040516104f491906135fd565b60405180910390f35b61051760048036038101906105129190613a41565b611dd5565b005b610533600480360381019061052e9190613ba6565b611eb6565b60405161054091906134e9565b60405180910390f35b610551611f20565b60405161055e9190613f1e565b60405180910390f35b610581600480360381019061057c9190613f40565b611fb2565b60405161058e91906134e9565b60405180910390f35b61059f612008565b6040516105ac91906135fd565b60405180910390f35b6105bd61200f565b6040516105ca9190613aaa565b60405180910390f35b6105ed60048036038101906105e89190613f6d565b612014565b005b61060960048036038101906106049190613ba6565b61230c565b005b6106256004803603810190610620919061375e565b61232d565b60405161063291906134e9565b60405180910390f35b61065560048036038101906106509190613f40565b612362565b005b610671600480360381019061066c919061375e565b61244b565b005b61068d60048036038101906106889190613f40565b612513565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610702575061070182612605565b5b9050919050565b6060610715600961266f565b905090565b7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c81565b60006005826040516107509190614048565b908152602001604051809103902060009054906101000a900460ff169050919050565b6002600381111561078757610786613be6565b5b81600381111561079a57610799613be6565b5b03610804576107c97fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c33611eb6565b6107ff576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c7565b60038081111561081757610816613be6565b5b81600381111561082a57610829613be6565b5b03610894576108597f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf33611eb6565b61088f576040517f093efaf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c6565b6040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600060038111156108db576108da613be6565b5b6007600084815260200190815260200160002060000160009054906101000a900460ff16600381111561091157610910613be6565b5b03610948576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000848152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff16600381111561098e5761098d613be6565b5b60038111156109a05761099f613be6565b5b81526020016000820160019054906101000a900460ff1660028111156109c9576109c8613be6565b5b60028111156109db576109da613be6565b5b81526020016000820160029054906101000a900460ff166003811115610a0457610a03613be6565b5b6003811115610a1657610a15613be6565b5b8152602001600182018054610a2a9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a569061408e565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff166000811115610adb57610ada613be6565b5b6000811115610aed57610aec613be6565b5b815260200160048201548152602001600582018054610b0b9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b379061408e565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505050508152602001600682018054610b9d9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc99061408e565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b50505050508152602001600782018054610c2f9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5b9061408e565b8015610ca85780601f10610c7d57610100808354040283529160200191610ca8565b820191906000526020600020905b815481529060010190602001808311610c8b57829003601f168201915b505050505081525050905060026003811115610cc757610cc6613be6565b5b826003811115610cda57610cd9613be6565b5b14610d3d5782610cfc8260200151836040015184606001518560a00151611727565b03610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390614142565b60405180910390fd5b5b816007600085815260200190815260200160002060000160006101000a81548160ff02191690836003811115610d7657610d75613be6565b5b02179055507f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8383604051610dac929190614171565b60405180910390a160026003811115610dc857610dc7613be6565b5b826003811115610ddb57610dda613be6565b5b03610dee57610de983612690565b610e04565b610e02836009612bb590919063ffffffff16565b505b505050565b610e337f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db633611eb6565b610e69576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115610e7d57610e7c613be6565b5b8a6003811115610e9057610e8f613be6565b5b03610efa57610ebf7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c33611eb6565b610ef5576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8b565b60016003811115610f0e57610f0d613be6565b5b8a6003811115610f2157610f20613be6565b5b14158015610f535750600380811115610f3d57610f3c613be6565b5b8a6003811115610f5057610f4f613be6565b5b14155b15610f8a576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60011515600360008b6002811115610fa657610fa5613be6565b5b6002811115610fb857610fb7613be6565b5b815260200190815260200160002060009054906101000a900460ff1615151461100d576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600460006110208e6004612bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614232565b60405180910390fd5b600060028111156110be576110bd613be6565b5b8960028111156110d1576110d0613be6565b5b141580156111045750600160028111156110ee576110ed613be6565b5b89600281111561110157611100613be6565b5b14155b15611194576000600381111561111d5761111c613be6565b5b600760008d815260200190815260200160002060000160009054906101000a900460ff16600381111561115357611152613be6565b5b14611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906142c4565b60405180910390fd5b5b6002808111156111a7576111a6613be6565b5b8960028111156111ba576111b9613be6565b5b036112065760006002861603611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90614356565b60405180910390fd5b5b60008103611212574290505b6040518061014001604052808b600381111561123157611230613be6565b5b81526020018a600281111561124957611248613be6565b5b815260200189600381111561126157611260613be6565b5b815260200188815260200182815260200187600081111561128557611284613be6565b5b815260200186815260200185815260200184815260200183815250600760008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360038111156112de576112dd613be6565b5b021790555060208201518160000160016101000a81548160ff0219169083600281111561130e5761130d613be6565b5b021790555060408201518160000160026101000a81548160ff0219169083600381111561133e5761133d613be6565b5b021790555060608201518160010190816113589190614522565b506080820151816002015560a08201518160030160006101000a81548160ff0219169083600081111561138e5761138d613be6565b5b021790555060c0820151816004015560e08201518160050190816113b29190614522565b506101008201518160060190816113c99190614522565b506101208201518160070190816113e09190614522565b509050507f90a862cc16ebcb9b549c932013f77c422df117e24d48d7d26a7d90fbc43c3c8f8b8b8b8b8b868c8c8c8c8c6040516114279b9a99989796959493929190614621565b60405180910390a16002600381111561144357611442613be6565b5b8a600381111561145657611455613be6565b5b0361149e576114648b612690565b7f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8b8b604051611495929190614171565b60405180910390a15b5050505050505050505050565b6000600360008360028111156114c4576114c3613be6565b5b60028111156114d6576114d5613be6565b5b815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000838152602001908152602001600020600101549050919050565b6115427f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c833611eb6565b611578576040517ff4ecad6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600381111561158c5761158b613be6565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff1660038111156115c2576115c1613be6565b5b036115f9576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076000828152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff0219169055600182016000611659919061333e565b60028201600090556003820160006101000a81549060ff0219169055600482016000905560058201600061168d919061333e565b60068201600061169d919061333e565b6007820160006116ad919061333e565b50506116c3816009612bb590919063ffffffff16565b507fe4a7f7b48251ad70e63f800758a445b00386e2fa98d5afce96a546e8fce2114e816040516116f391906135fd565b60405180910390a150565b600481565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b60008085858585604051602001611741949392919061474c565b6040516020818303038152906040528051906020012090506008600082815260200190815260200160002054915050949350505050565b611781826114f9565b61178a81612c59565b6117948383612c6d565b505050565b6117a1612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614808565b60405180910390fd5b6118188282612d55565b5050565b600881565b6000600160009054906101000a900460ff16905090565b7f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf81565b6118867fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6118bc576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016005826040516118ce9190614048565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507fe7735e9f569fe61671662a8829db77de38ef614c77b1b136c958aff781df7c75816040516119229190613f1e565b60405180910390a150565b6119577fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b61198d576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600360008360028111156119a6576119a5613be6565b5b60028111156119b8576119b7613be6565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece801581604051611a0c9190614828565b60405180910390a150565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b611a4361337e565b60076000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff166003811115611a8757611a86613be6565b5b6003811115611a9957611a98613be6565b5b81526020016000820160019054906101000a900460ff166002811115611ac257611ac1613be6565b5b6002811115611ad457611ad3613be6565b5b81526020016000820160029054906101000a900460ff166003811115611afd57611afc613be6565b5b6003811115611b0f57611b0e613be6565b5b8152602001600182018054611b239061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4f9061408e565b8015611b9c5780601f10611b7157610100808354040283529160200191611b9c565b820191906000526020600020905b815481529060010190602001808311611b7f57829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff166000811115611bd457611bd3613be6565b5b6000811115611be657611be5613be6565b5b815260200160048201548152602001600582018054611c049061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c309061408e565b8015611c7d5780601f10611c5257610100808354040283529160200191611c7d565b820191906000526020600020905b815481529060010190602001808311611c6057829003601f168201915b50505050508152602001600682018054611c969061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc29061408e565b8015611d0f5780601f10611ce457610100808354040283529160200191611d0f565b820191906000526020600020905b815481529060010190602001808311611cf257829003601f168201915b50505050508152602001600782018054611d289061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d549061408e565b8015611da15780601f10611d7657610100808354040283529160200191611da1565b820191906000526020600020905b815481529060010190602001808311611d8457829003601f168201915b5050505050815250509050919050565b7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db681565b611dff7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b611e35576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036000826002811115611e4c57611e4b613be6565b5b6002811115611e5e57611e5d613be6565b5b815260200190815260200160002060006101000a81549060ff02191690557f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad4781604051611eab9190614828565b60405180910390a150565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611f2f9061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5b9061408e565b8015611fa85780601f10611f7d57610100808354040283529160200191611fa8565b820191906000526020600020905b815481529060010190602001808311611f8b57829003601f168201915b5050505050905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000801b81565b600281565b61203e7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db633611eb6565b612074576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600115156003600086600281111561208f5761208e613be6565b5b60028111156120a1576120a0613be6565b5b815260200190815260200160002060009054906101000a900460ff161515146120f6576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561210a57612109613be6565b5b84600281111561211d5761211c613be6565b5b1415801561215057506001600281111561213a57612139613be6565b5b84600281111561214d5761214c613be6565b5b14155b156121a657600160009054906101000a900460ff16156121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c906148b5565b60405180910390fd5b5b60018060006101000a81548160ff02191690831515021790555081600290816121cf9190614522565b506001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160068260405161223a9190614048565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f18f0396c6d01876d7610d96877b44f017ab4ca2265b13079b10e0be6b6af30d48160405161228e9190613f1e565b60405180910390a17f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd6278836040516122c591906148e4565b60405180910390a17f5b590cceabbeb28cd16e41a811ba46df5bb82c98920d5e7ff77e4fa9db709b3382826040516122fe9291906148ff565b60405180910390a150505050565b612315826114f9565b61231e81612c59565b6123288383612d55565b505050565b600060068260405161233f9190614048565b908152602001604051809103902060009054906101000a900460ff169050919050565b61238c7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6123c2576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690557ff580a1ea01c0ed3ec5e4797c560ee7046c3591588c0feb814f5f2d4eca50272c8160405161244091906148e4565b60405180910390a150565b6124757fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b6124ab576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005816040516124bb9190614048565b908152602001604051809103902060006101000a81549060ff02191690557ff13042255d0b58f7acc82c201a0cd4d834b0783dd7b3c29cca9b96840d633f74816040516125089190613f1e565b60405180910390a150565b61253d7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4233611eb6565b612573576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd6278816040516125fa91906148e4565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600061267f83600001612e36565b905060608190508092505050919050565b600060038111156126a4576126a3613be6565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff1660038111156126da576126d9613be6565b5b03612711576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000838152602001908152602001600020604051806101400160405290816000820160009054906101000a900460ff16600381111561275757612756613be6565b5b600381111561276957612768613be6565b5b81526020016000820160019054906101000a900460ff16600281111561279257612791613be6565b5b60028111156127a4576127a3613be6565b5b81526020016000820160029054906101000a900460ff1660038111156127cd576127cc613be6565b5b60038111156127df576127de613be6565b5b81526020016001820180546127f39061408e565b80601f016020809104026020016040519081016040528092919081815260200182805461281f9061408e565b801561286c5780601f106128415761010080835404028352916020019161286c565b820191906000526020600020905b81548152906001019060200180831161284f57829003601f168201915b50505050508152602001600282015481526020016003820160009054906101000a900460ff1660008111156128a4576128a3613be6565b5b60008111156128b6576128b5613be6565b5b8152602001600482015481526020016005820180546128d49061408e565b80601f01602080910402602001604051908101604052809291908181526020018280546129009061408e565b801561294d5780601f106129225761010080835404028352916020019161294d565b820191906000526020600020905b81548152906001019060200180831161293057829003601f168201915b505050505081526020016006820180546129669061408e565b80601f01602080910402602001604051908101604052809291908181526020018280546129929061408e565b80156129df5780601f106129b4576101008083540402835291602001916129df565b820191906000526020600020905b8154815290600101906020018083116129c257829003601f168201915b505050505081526020016007820180546129f89061408e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a249061408e565b8015612a715780601f10612a4657610100808354040283529160200191612a71565b820191906000526020600020905b815481529060010190602001808311612a5457829003601f168201915b505050505081525050905060026003811115612a9057612a8f613be6565b5b81600001516003811115612aa757612aa6613be6565b5b14612ade576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160200151826040015183606001518460a00151604051602001612b07949392919061474c565b6040516020818303038152906040528051906020012090506000600860008381526020019081526020016000205490506000801b8114612b8157600760008281526020019081526020016000206002015483608001511115612b7c578360086000848152602001908152602001600020819055505b612b9a565b8360086000848152602001908152602001600020819055505b612bae846009612e9290919063ffffffff16565b5050505050565b6000612bc48360000183612ea9565b905092915050565b60008060005b6014811015612c4b57600881612be89190614965565b60ff60f81b868387612bfa91906149a7565b60208110612c0b57612c0a6149db565b5b1a60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c821791508080612c4390614a0a565b915050612bd2565b508060601c91505092915050565b612c6a81612c65612d4d565b612fbd565b50565b612c778282611eb6565b612d4957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612cee612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b612d5f8282611eb6565b15612e3257600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612dd7612d4d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612e8657602002820191906000526020600020905b815481526020019060010190808311612e72575b50505050509050919050565b6000612ea18360000183613042565b905092915050565b60008083600101600084815260200190815260200160002054905060008114612fb1576000600182612edb9190614a52565b9050600060018660000180549050612ef39190614a52565b9050818114612f62576000866000018281548110612f1457612f136149db565b5b9060005260206000200154905080876000018481548110612f3857612f376149db565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612f7657612f75614a86565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612fb7565b60009150505b92915050565b612fc78282611eb6565b61303e57612fd4816130b2565b612fe28360001c60206130df565b604051602001612ff3929190614b94565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130359190614c07565b60405180910390fd5b5050565b600061304e838361331b565b6130a75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130ac565b600090505b92915050565b60606130d88273ffffffffffffffffffffffffffffffffffffffff16601460ff166130df565b9050919050565b6060600060028360026130f29190614965565b6130fc91906149a7565b67ffffffffffffffff81111561311557613114613633565b5b6040519080825280601f01601f1916602001820160405280156131475781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061317f5761317e6149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106131e3576131e26149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026132239190614965565b61322d91906149a7565b90505b60018111156132cd577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061326f5761326e6149db565b5b1a60f81b828281518110613286576132856149db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806132c690614c29565b9050613230565b5060008414613311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330890614c9e565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461334a9061408e565b6000825580601f1061335c575061337b565b601f01602090049060005260206000209081019061337a9190613418565b5b50565b6040518061014001604052806000600381111561339e5761339d613be6565b5b8152602001600060028111156133b7576133b6613be6565b5b8152602001600060038111156133d0576133cf613be6565b5b815260200160608152602001600081526020016000808111156133f6576133f5613be6565b5b8152602001600081526020016060815260200160608152602001606081525090565b5b80821115613431576000816000905550600101613419565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61354381613530565b82525050565b6000613555838361353a565b60208301905092915050565b6000602082019050919050565b600061357982613504565b613583818561350f565b935061358e83613520565b8060005b838110156135bf5781516135a68882613549565b97506135b183613561565b925050600181019050613592565b5085935050505092915050565b600060208201905081810360008301526135e6818461356e565b905092915050565b6135f781613530565b82525050565b600060208201905061361260008301846135ee565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61366b82613622565b810181811067ffffffffffffffff8211171561368a57613689613633565b5b80604052505050565b600061369d613435565b90506136a98282613662565b919050565b600067ffffffffffffffff8211156136c9576136c8613633565b5b6136d282613622565b9050602081019050919050565b82818337600083830152505050565b60006137016136fc846136ae565b613693565b90508281526020810184848401111561371d5761371c61361d565b5b6137288482856136df565b509392505050565b600082601f83011261374557613744613618565b5b81356137558482602086016136ee565b91505092915050565b6000602082840312156137745761377361343f565b5b600082013567ffffffffffffffff81111561379257613791613444565b5b61379e84828501613730565b91505092915050565b6137b081613530565b81146137bb57600080fd5b50565b6000813590506137cd816137a7565b92915050565b600481106137e057600080fd5b50565b6000813590506137f2816137d3565b92915050565b6000806040838503121561380f5761380e61343f565b5b600061381d858286016137be565b925050602061382e858286016137e3565b9150509250929050565b6003811061384557600080fd5b50565b60008135905061385781613838565b92915050565b6004811061386a57600080fd5b50565b60008135905061387c8161385d565b92915050565b6001811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000819050919050565b6138ba816138a7565b81146138c557600080fd5b50565b6000813590506138d7816138b1565b92915050565b60008060008060008060008060008060006101608c8e0312156139035761390261343f565b5b60006139118e828f016137be565b9b505060206139228e828f016137e3565b9a505060406139338e828f01613848565b99505060606139448e828f0161386d565b98505060808c013567ffffffffffffffff81111561396557613964613444565b5b6139718e828f01613730565b97505060a06139828e828f01613892565b96505060c06139938e828f016138c8565b95505060e08c013567ffffffffffffffff8111156139b4576139b3613444565b5b6139c08e828f01613730565b9450506101008c013567ffffffffffffffff8111156139e2576139e1613444565b5b6139ee8e828f01613730565b9350506101208c013567ffffffffffffffff811115613a1057613a0f613444565b5b613a1c8e828f01613730565b925050610140613a2e8e828f016138c8565b9150509295989b509295989b9093969950565b600060208284031215613a5757613a5661343f565b5b6000613a6584828501613848565b91505092915050565b600060208284031215613a8457613a8361343f565b5b6000613a92848285016137be565b91505092915050565b613aa4816138a7565b82525050565b6000602082019050613abf6000830184613a9b565b92915050565b60008060008060808587031215613adf57613ade61343f565b5b6000613aed87828801613848565b9450506020613afe8782880161386d565b935050604085013567ffffffffffffffff811115613b1f57613b1e613444565b5b613b2b87828801613730565b9250506060613b3c87828801613892565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b7382613b48565b9050919050565b613b8381613b68565b8114613b8e57600080fd5b50565b600081359050613ba081613b7a565b92915050565b60008060408385031215613bbd57613bbc61343f565b5b6000613bcb858286016137be565b9250506020613bdc85828601613b91565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613c2657613c25613be6565b5b50565b6000819050613c3782613c15565b919050565b6000613c4782613c29565b9050919050565b613c5781613c3c565b82525050565b60038110613c6e57613c6d613be6565b5b50565b6000819050613c7f82613c5d565b919050565b6000613c8f82613c71565b9050919050565b613c9f81613c84565b82525050565b60048110613cb657613cb5613be6565b5b50565b6000819050613cc782613ca5565b919050565b6000613cd782613cb9565b9050919050565b613ce781613ccc565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d27578082015181840152602081019050613d0c565b60008484015250505050565b6000613d3e82613ced565b613d488185613cf8565b9350613d58818560208601613d09565b613d6181613622565b840191505092915050565b613d75816138a7565b82525050565b60018110613d8c57613d8b613be6565b5b50565b6000819050613d9d82613d7b565b919050565b6000613dad82613d8f565b9050919050565b613dbd81613da2565b82525050565b600061014083016000830151613ddc6000860182613c4e565b506020830151613def6020860182613c96565b506040830151613e026040860182613cde565b5060608301518482036060860152613e1a8282613d33565b9150506080830151613e2f6080860182613d6c565b5060a0830151613e4260a0860182613db4565b5060c0830151613e5560c0860182613d6c565b5060e083015184820360e0860152613e6d8282613d33565b915050610100830151848203610100860152613e898282613d33565b915050610120830151848203610120860152613ea58282613d33565b9150508091505092915050565b60006020820190508181036000830152613ecc8184613dc3565b905092915050565b600082825260208201905092915050565b6000613ef082613ced565b613efa8185613ed4565b9350613f0a818560208601613d09565b613f1381613622565b840191505092915050565b60006020820190508181036000830152613f388184613ee5565b905092915050565b600060208284031215613f5657613f5561343f565b5b6000613f6484828501613b91565b91505092915050565b60008060008060808587031215613f8757613f8661343f565b5b6000613f9587828801613848565b9450506020613fa687828801613b91565b935050604085013567ffffffffffffffff811115613fc757613fc6613444565b5b613fd387828801613730565b925050606085013567ffffffffffffffff811115613ff457613ff3613444565b5b61400087828801613730565b91505092959194509250565b600081905092915050565b600061402282613ced565b61402c818561400c565b935061403c818560208601613d09565b80840191505092915050565b60006140548284614017565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140a657607f821691505b6020821081036140b9576140b861405f565b5b50919050565b600082825260208201905092915050565b7f4d757374207265706c616365206163746976652072656c65617365206265666f60008201527f7265206368616e67696e67207374617475732066726f6d204163746976650000602082015250565b600061412c603e836140bf565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b61416b81613c3c565b82525050565b600060408201905061418660008301856135ee565b6141936020830184614162565b9392505050565b7f5468652070726f7669646564207375626e6574202877697468696e207468652060008201527f72656c6561736520696429206973206e6f742076616c696420666f722074686960208201527f7320636f6e747261637400000000000000000000000000000000000000000000604082015250565b600061421c604a836140bf565b91506142278261419a565b606082019050919050565b6000602082019050818103600083015261424b8161420f565b9050919050565b7f412072656c656173652077697468207468697320494420616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006142ae6025836140bf565b91506142b982614252565b604082019050919050565b600060208201905081810360008301526142dd816142a1565b9050919050565b7f54686520524f206f7074696f6e20697320726571756972656420666f7220707260008201527f6f642072656c6561736573000000000000000000000000000000000000000000602082015250565b6000614340602b836140bf565b915061434b826142e4565b604082019050919050565b6000602082019050818103600083015261436f81614333565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026143d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261439b565b6143e2868361439b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061441f61441a614415846138a7565b6143fa565b6138a7565b9050919050565b6000819050919050565b61443983614404565b61444d61444582614426565b8484546143a8565b825550505050565b600090565b614462614455565b61446d818484614430565b505050565b5b818110156144915761448660008261445a565b600181019050614473565b5050565b601f8211156144d6576144a781614376565b6144b08461438b565b810160208510156144bf578190505b6144d36144cb8561438b565b830182614472565b50505b505050565b600082821c905092915050565b60006144f9600019846008026144db565b1980831691505092915050565b600061451283836144e8565b9150826002028217905092915050565b61452b82613ced565b67ffffffffffffffff81111561454457614543613633565b5b61454e825461408e565b614559828285614495565b600060209050601f83116001811461458c576000841561457a578287015190505b6145848582614506565b8655506145ec565b601f19841661459a86614376565b60005b828110156145c25784890151825560018201915060208501945060208101905061459d565b868310156145df57848901516145db601f8916826144e8565b8355505b6001600288020188555050505b505050505050565b6145fd81613c84565b82525050565b61460c81613ccc565b82525050565b61461b81613da2565b82525050565b600061016082019050614637600083018e6135ee565b614644602083018d614162565b614651604083018c6145f4565b61465e606083018b614603565b8181036080830152614670818a613ee5565b905061467f60a0830189613a9b565b61468c60c0830188614612565b61469960e0830187613a9b565b8181036101008301526146ac8186613ee5565b90508181036101208301526146c18185613ee5565b90508181036101408301526146d68184613ee5565b90509c9b505050505050505050505050565b60008160f81b9050919050565b6000614700826146e8565b9050919050565b61471861471382613c84565b6146f5565b82525050565b61472f61472a82613ccc565b6146f5565b82525050565b61474661474182613da2565b6146f5565b82525050565b60006147588287614707565b600182019150614768828661471e565b6001820191506147788285614017565b91506147848284614735565b60018201915081905095945050505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006147f2602f836140bf565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b600060208201905061483d60008301846145f4565b92915050565b7f696e697443726561746f722829206d6179206f6e6c792062652063616c6c656460008201527f206f6e6365000000000000000000000000000000000000000000000000000000602082015250565b600061489f6025836140bf565b91506148aa82614843565b604082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b6148de81613b68565b82525050565b60006020820190506148f960008301846148d5565b92915050565b600060408201905081810360008301526149198185613ee5565b9050818103602083015261492d8184613ee5565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614970826138a7565b915061497b836138a7565b9250828202614989816138a7565b915082820484148315176149a05761499f614936565b5b5092915050565b60006149b2826138a7565b91506149bd836138a7565b92508282019050808211156149d5576149d4614936565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a15826138a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a4757614a46614936565b5b600182019050919050565b6000614a5d826138a7565b9150614a68836138a7565b9250828203905081811115614a8057614a7f614936565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614af6601783614ab5565b9150614b0182614ac0565b601782019050919050565b600081519050919050565b6000614b2282614b0c565b614b2c8185614ab5565b9350614b3c818560208601613d09565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614b7e601183614ab5565b9150614b8982614b48565b601182019050919050565b6000614b9f82614ae9565b9150614bab8285614b17565b9150614bb682614b71565b9150614bc28284614b17565b91508190509392505050565b6000614bd982614b0c565b614be381856140bf565b9350614bf3818560208601613d09565b614bfc81613622565b840191505092915050565b60006020820190508181036000830152614c218184614bce565b905092915050565b6000614c34826138a7565b915060008203614c4757614c46614936565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614c886020836140bf565b9150614c9382614c52565b602082019050919050565b60006020820190508181036000830152614cb781614c7b565b905091905056fea2646970667358221220b7a2f5cdf3d6597bcc03148af3dcabe43029e122783c0f81506bcc481ea031c164736f6c63430008110033