Source Code
Overview
MATIC Balance
0 MATIC
Token Holdings
More Info
ContractCreator:
Multichain Info
N/A
Latest 25 from a total of 22,083 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Block | 43164299 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43163782 | 116 days ago | IN | 0 MATIC | 0.00070242 | ||||
Set Block | 43163259 | 116 days ago | IN | 0 MATIC | 0.00070247 | ||||
Set Block | 43162735 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43162226 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43161700 | 116 days ago | IN | 0 MATIC | 0.00070244 | ||||
Set Block | 43161184 | 116 days ago | IN | 0 MATIC | 0.00070247 | ||||
Set Block | 43160671 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43160149 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43159632 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43159112 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43158592 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43158079 | 116 days ago | IN | 0 MATIC | 0.00070244 | ||||
Set Block | 43157556 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43157039 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43156512 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43155997 | 116 days ago | IN | 0 MATIC | 0.00070247 | ||||
Set Block | 43155471 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43154902 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43154333 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43153769 | 116 days ago | IN | 0 MATIC | 0.00070248 | ||||
Set Block | 43153216 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43152644 | 116 days ago | IN | 0 MATIC | 0.00070244 | ||||
Set Block | 43152082 | 116 days ago | IN | 0 MATIC | 0.00070245 | ||||
Set Block | 43151510 | 116 days ago | IN | 0 MATIC | 0.00070248 |
Loading...
Loading
Contract Name:
ResultManager
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; contract ResultManager is AccessControlEnumerable { struct Block { bytes message; // epoch, timestamp, Value[] bytes signature; } struct Value { int8 power; uint16 collectionId; bytes32 name; uint256 value; } bytes32 public constant RESULT_MANAGER_ADMIN_ROLE = keccak256("RESULT_MANAGER_ADMIN_ROLE"); bytes32 public constant FORWARDER_ROLE = keccak256("FORWARDER_ROLE"); address public signerAddress; uint256 public lastUpdatedTimestamp; uint16[] public activeCollectionIds; uint32 public latestEpoch; // epoch => Block mapping(uint32 => Block) public blocks; /// @notice mapping for name of collection in bytes32 -> collectionid mapping(bytes32 => uint16) public collectionIds; /// @notice mapping for CollectionID -> Value Info mapping(uint16 => Value) private _collectionResults; event BlockReceived(uint32 epoch, uint256 timestamp, Value[] values); constructor(address _signerAddress) { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(RESULT_MANAGER_ADMIN_ROLE, msg.sender); _setupRole(FORWARDER_ROLE, msg.sender); signerAddress = _signerAddress; } function updateSignerAddress(address _signerAddress) external onlyRole(RESULT_MANAGER_ADMIN_ROLE) { signerAddress = _signerAddress; } /** * @dev Verify the signature and update the results * Requirements: * * - ecrecover(signature) should match with signerAddress */ function setBlock(Block memory messageBlock) external { (uint32 epoch, uint256 timestamp, Value[] memory values) = abi.decode( messageBlock.message, (uint32, uint256, Value[]) ); require(epoch > latestEpoch, "epoch must be > latestEpoch"); bytes32 messageHash = keccak256(messageBlock.message); require( ECDSA.recover( ECDSA.toEthSignedMessageHash(messageHash), messageBlock.signature ) == signerAddress, "invalid signature" ); uint16[] memory ids = new uint16[](values.length); blocks[epoch] = messageBlock; for (uint256 i; i < values.length; i++) { _collectionResults[values[i].collectionId] = values[i]; collectionIds[values[i].name] = values[i].collectionId; ids[i] = values[i].collectionId; } activeCollectionIds = ids; lastUpdatedTimestamp = timestamp; latestEpoch = epoch; emit BlockReceived(epoch, timestamp, values); } /** * @dev using the hash of collection name, clients can query the result of that collection * @param _name bytes32 hash of the collection name * @return result of the collection and its power */ function getResult(bytes32 _name) external view onlyRole(FORWARDER_ROLE) returns (uint256, int8) { uint16 id = collectionIds[_name]; return _getResultFromID(id); } /** * @dev Returns collection result and power with collectionId as parameter */ function _getResultFromID(uint16 _id) internal view returns (uint256, int8) { return (_collectionResults[_id].value, _collectionResults[_id].power); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.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: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * 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()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlEnumerable.sol"; import "./AccessControl.sol"; import "../utils/structs/EnumerableSet.sol"; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } }
// 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// 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; } }
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [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) { return _values(set._inner); } // 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 on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @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; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"int8","name":"power","type":"int8"},{"internalType":"uint16","name":"collectionId","type":"uint16"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"}],"indexed":false,"internalType":"struct ResultManager.Value[]","name":"values","type":"tuple[]"}],"name":"BlockReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FORWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESULT_MANAGER_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeCollectionIds","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"blocks","outputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collectionIds","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"}],"name":"getResult","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdatedTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestEpoch","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ResultManager.Block","name":"messageBlock","type":"tuple"}],"name":"setBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"updateSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620032bf380380620032bf8339818101604052810190620000379190620003f8565b6200004c6000801b33620000f860201b60201c565b6200007e7f2a3a4d996be8648f4eb528ed2ac81fcc886000777b5645f6cde5bdcfcdebf24233620000f860201b60201c565b620000b07f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f33620000f860201b60201c565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200042a565b6200010a82826200010e60201b60201c565b5050565b6200012582826200015660201b62000d1b1760201c565b6200015181600160008581526020019081526020016000206200024760201b62000dfb1790919060201c565b505050565b6200016882826200027f60201b60201c565b6200024357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001e8620002e960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000277836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620002f160201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b60006200030583836200036b60201b60201c565b6200036057826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000365565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003c08262000393565b9050919050565b620003d281620003b3565b8114620003de57600080fd5b50565b600081519050620003f281620003c7565b92915050565b6000602082840312156200041157620004106200038e565b5b60006200042184828501620003e1565b91505092915050565b612e85806200043a6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638fa2a9f0116100ad578063add4c78411610071578063add4c7841461036c578063ca15c8731461039d578063d547741f146103cd578063e4ea484d146103e9578063fbaf894c146104055761012c565b80638fa2a9f0146102b45780639010d07c146102d057806391d14854146103005780639cb118bf14610330578063a217fddf1461034e5761012c565b80635b7633d0116100f45780635b7633d0146101e75780635cd0783e146102055780636533b075146102365780636fdc356e146102665780637caa33cb146102845761012c565b806301ffc9a714610131578063248a9ca3146101615780632f2ff15d1461019157806335f6fb87146101ad57806336568abe146101cb575b600080fd5b61014b60048036038101906101469190611b2a565b610423565b6040516101589190611b72565b60405180910390f35b61017b60048036038101906101769190611bc3565b61049d565b6040516101889190611bff565b60405180910390f35b6101ab60048036038101906101a69190611c78565b6104bc565b005b6101b56104dd565b6040516101c29190611bff565b60405180910390f35b6101e560048036038101906101e09190611c78565b610501565b005b6101ef610584565b6040516101fc9190611cc7565b60405180910390f35b61021f600480360381019061021a9190611d1e565b6105aa565b60405161022d929190611de4565b60405180910390f35b610250600480360381019061024b9190611e51565b6106de565b60405161025d9190611e9b565b60405180910390f35b61026e610716565b60405161027b9190611bff565b60405180910390f35b61029e60048036038101906102999190611bc3565b61073a565b6040516102ab9190611e9b565b60405180910390f35b6102ce60048036038101906102c99190611eb6565b61075b565b005b6102ea60048036038101906102e59190611ee3565b6107ca565b6040516102f79190611cc7565b60405180910390f35b61031a60048036038101906103159190611c78565b6107f9565b6040516103279190611b72565b60405180910390f35b610338610863565b6040516103459190611f32565b60405180910390f35b610356610879565b6040516103639190611bff565b60405180910390f35b61038660048036038101906103819190611bc3565b610880565b604051610394929190611f78565b60405180910390f35b6103b760048036038101906103b29190611bc3565b6108e7565b6040516103c49190611fa1565b60405180910390f35b6103e760048036038101906103e29190611c78565b61090b565b005b61040360048036038101906103fe9190612183565b61092c565b005b61040d610d15565b60405161041a9190611fa1565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610496575061049582610e2b565b5b9050919050565b6000806000838152602001908152602001600020600101549050919050565b6104c58261049d565b6104ce81610ea5565b6104d88383610eb9565b505050565b7f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f81565b610509610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d9061224f565b60405180910390fd5b6105808282610ef5565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915090508060000180546105cd9061229e565b80601f01602080910402602001604051908101604052809291908181526020018280546105f99061229e565b80156106465780601f1061061b57610100808354040283529160200191610646565b820191906000526020600020905b81548152906001019060200180831161062957829003601f168201915b50505050509080600101805461065b9061229e565b80601f01602080910402602001604051908101604052809291908181526020018280546106879061229e565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050905082565b600481815481106106ee57600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b7f2a3a4d996be8648f4eb528ed2ac81fcc886000777b5645f6cde5bdcfcdebf24281565b60076020528060005260406000206000915054906101000a900461ffff1681565b7f2a3a4d996be8648f4eb528ed2ac81fcc886000777b5645f6cde5bdcfcdebf24261078581610ea5565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006107f18260016000868152602001908152602001600020610f2990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600560009054906101000a900463ffffffff1681565b6000801b81565b6000807f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f6108ad81610ea5565b60006007600086815260200190815260200160002060009054906101000a900461ffff1690506108dc81610f43565b935093505050915091565b600061090460016000848152602001908152602001600020610f9a565b9050919050565b6109148261049d565b61091d81610ea5565b6109278383610ef5565b505050565b6000806000836000015180602001905181019061094991906124a7565b925092509250600560009054906101000a900463ffffffff1663ffffffff168363ffffffff16116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690612562565b60405180910390fd5b60008460000151805190602001209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a0e610a0483610faf565b8760200151610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b906125ce565b60405180910390fd5b6000825167ffffffffffffffff811115610a8157610a80611fc1565b5b604051908082528060200260200182016040528015610aaf5781602001602082028036833780820191505090505b50905085600660008763ffffffff1663ffffffff1681526020019081526020016000206000820151816000019080519060200190610aee929190611971565b506020820151816001019080519060200190610b0b929190611971565b5090505060005b8351811015610c9257838181518110610b2e57610b2d6125ee565b5b602002602001015160086000868481518110610b4d57610b4c6125ee565b5b60200260200101516020015161ffff1661ffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360000b60ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff1602179055506040820151816001015560608201518160020155905050838181518110610be057610bdf6125ee565b5b60200260200101516020015160076000868481518110610c0357610c026125ee565b5b602002602001015160400151815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550838181518110610c4a57610c496125ee565b5b602002602001015160200151828281518110610c6957610c686125ee565b5b602002602001019061ffff16908161ffff16815250508080610c8a9061264c565b915050610b12565b508060049080519060200190610ca99291906119f7565b508360038190555084600560006101000a81548163ffffffff021916908363ffffffff1602179055507f36046b7e65f3c5d846ecf6fbe177dc9c1d961a9e8d83e48e9f08cadfda612f96858585604051610d05939291906127d5565b60405180910390a1505050505050565b60035481565b610d2582826107f9565b610df757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610d9c610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000610e23836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611006565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e9e5750610e9d82611076565b5b9050919050565b610eb681610eb1610eed565b6110e0565b50565b610ec38282610d1b565b610ee88160016000858152602001908152602001600020610dfb90919063ffffffff16565b505050565b600033905090565b610eff828261117d565b610f24816001600085815260200190815260200160002061125e90919063ffffffff16565b505050565b6000610f38836000018361128e565b60001c905092915050565b600080600860008461ffff1661ffff16815260200190815260200160002060020154600860008561ffff1661ffff16815260200190815260200160002060000160009054906101000a900460000b91509150915091565b6000610fa8826000016112b9565b9050919050565b600081604051602001610fc2919061288b565b604051602081830303815290604052805190602001209050919050565b6000806000610fee85856112ca565b91509150610ffb8161131c565b819250505092915050565b600061101283836114f1565b61106b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611070565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6110ea82826107f9565b6111795761110f8173ffffffffffffffffffffffffffffffffffffffff166014611514565b61111d8360001c6020611514565b60405160200161112e929190612985565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117091906129f8565b60405180910390fd5b5050565b61118782826107f9565b1561125a57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111ff610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611286836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611750565b905092915050565b60008260000182815481106112a6576112a56125ee565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b60008060418351141561130c5760008060006020860151925060408601519150606086015160001a905061130087828585611864565b94509450505050611315565b60006002915091505b9250929050565b600060048111156113305761132f612a1a565b5b81600481111561134357611342612a1a565b5b141561134e576114ee565b6001600481111561136257611361612a1a565b5b81600481111561137557611374612a1a565b5b14156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612a95565b60405180910390fd5b600260048111156113ca576113c9612a1a565b5b8160048111156113dd576113dc612a1a565b5b141561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612b01565b60405180910390fd5b6003600481111561143257611431612a1a565b5b81600481111561144557611444612a1a565b5b1415611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90612b93565b60405180910390fd5b60048081111561149957611498612a1a565b5b8160048111156114ac576114ab612a1a565b5b14156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490612c25565b60405180910390fd5b5b50565b600080836001016000848152602001908152602001600020541415905092915050565b6060600060028360026115279190612c45565b6115319190612c9f565b67ffffffffffffffff81111561154a57611549611fc1565b5b6040519080825280601f01601f19166020018201604052801561157c5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106115b4576115b36125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611618576116176125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026116589190612c45565b6116629190612c9f565b90505b6001811115611702577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106116a4576116a36125ee565b5b1a60f81b8282815181106116bb576116ba6125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806116fb90612cf5565b9050611665565b5060008414611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612d6b565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146118585760006001826117829190612d8b565b905060006001866000018054905061179a9190612d8b565b90508181146118095760008660000182815481106117bb576117ba6125ee565b5b90600052602060002001549050808760000184815481106117df576117de6125ee565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061181d5761181c612dbf565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061185e565b60009150505b92915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561189f576000600391509150611968565b601b8560ff16141580156118b75750601c8560ff1614155b156118c9576000600491509150611968565b6000600187878787604051600081526020016040526040516118ee9493929190612e0a565b6020604051602081039080840390855afa158015611910573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195f57600060019250925050611968565b80600092509250505b94509492505050565b82805461197d9061229e565b90600052602060002090601f01602090048101928261199f57600085556119e6565b82601f106119b857805160ff19168380011785556119e6565b828001600101855582156119e6579182015b828111156119e55782518255916020019190600101906119ca565b5b5090506119f39190611aa1565b5090565b82805482825590600052602060002090600f01601090048101928215611a905791602002820160005b83821115611a6057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302611a20565b8015611a8e5782816101000a81549061ffff0219169055600201602081600101049283019260010302611a60565b505b509050611a9d9190611aa1565b5090565b5b80821115611aba576000816000905550600101611aa2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b0781611ad2565b8114611b1257600080fd5b50565b600081359050611b2481611afe565b92915050565b600060208284031215611b4057611b3f611ac8565b5b6000611b4e84828501611b15565b91505092915050565b60008115159050919050565b611b6c81611b57565b82525050565b6000602082019050611b876000830184611b63565b92915050565b6000819050919050565b611ba081611b8d565b8114611bab57600080fd5b50565b600081359050611bbd81611b97565b92915050565b600060208284031215611bd957611bd8611ac8565b5b6000611be784828501611bae565b91505092915050565b611bf981611b8d565b82525050565b6000602082019050611c146000830184611bf0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c4582611c1a565b9050919050565b611c5581611c3a565b8114611c6057600080fd5b50565b600081359050611c7281611c4c565b92915050565b60008060408385031215611c8f57611c8e611ac8565b5b6000611c9d85828601611bae565b9250506020611cae85828601611c63565b9150509250929050565b611cc181611c3a565b82525050565b6000602082019050611cdc6000830184611cb8565b92915050565b600063ffffffff82169050919050565b611cfb81611ce2565b8114611d0657600080fd5b50565b600081359050611d1881611cf2565b92915050565b600060208284031215611d3457611d33611ac8565b5b6000611d4284828501611d09565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d85578082015181840152602081019050611d6a565b83811115611d94576000848401525b50505050565b6000601f19601f8301169050919050565b6000611db682611d4b565b611dc08185611d56565b9350611dd0818560208601611d67565b611dd981611d9a565b840191505092915050565b60006040820190508181036000830152611dfe8185611dab565b90508181036020830152611e128184611dab565b90509392505050565b6000819050919050565b611e2e81611e1b565b8114611e3957600080fd5b50565b600081359050611e4b81611e25565b92915050565b600060208284031215611e6757611e66611ac8565b5b6000611e7584828501611e3c565b91505092915050565b600061ffff82169050919050565b611e9581611e7e565b82525050565b6000602082019050611eb06000830184611e8c565b92915050565b600060208284031215611ecc57611ecb611ac8565b5b6000611eda84828501611c63565b91505092915050565b60008060408385031215611efa57611ef9611ac8565b5b6000611f0885828601611bae565b9250506020611f1985828601611e3c565b9150509250929050565b611f2c81611ce2565b82525050565b6000602082019050611f476000830184611f23565b92915050565b611f5681611e1b565b82525050565b60008160000b9050919050565b611f7281611f5c565b82525050565b6000604082019050611f8d6000830185611f4d565b611f9a6020830184611f69565b9392505050565b6000602082019050611fb66000830184611f4d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ff982611d9a565b810181811067ffffffffffffffff8211171561201857612017611fc1565b5b80604052505050565b600061202b611abe565b90506120378282611ff0565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561206657612065611fc1565b5b61206f82611d9a565b9050602081019050919050565b82818337600083830152505050565b600061209e6120998461204b565b612021565b9050828152602081018484840111156120ba576120b9612046565b5b6120c584828561207c565b509392505050565b600082601f8301126120e2576120e1612041565b5b81356120f284826020860161208b565b91505092915050565b60006040828403121561211157612110611fbc565b5b61211b6040612021565b9050600082013567ffffffffffffffff81111561213b5761213a61203c565b5b612147848285016120cd565b600083015250602082013567ffffffffffffffff81111561216b5761216a61203c565b5b612177848285016120cd565b60208301525092915050565b60006020828403121561219957612198611ac8565b5b600082013567ffffffffffffffff8111156121b7576121b6611acd565b5b6121c3848285016120fb565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612239602f836121cc565b9150612244826121dd565b604082019050919050565b600060208201905081810360008301526122688161222c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806122b657607f821691505b602082108114156122ca576122c961226f565b5b50919050565b6000815190506122df81611cf2565b92915050565b6000815190506122f481611e25565b92915050565b600067ffffffffffffffff82111561231557612314611fc1565b5b602082029050602081019050919050565b600080fd5b61233481611f5c565b811461233f57600080fd5b50565b6000815190506123518161232b565b92915050565b61236081611e7e565b811461236b57600080fd5b50565b60008151905061237d81612357565b92915050565b60008151905061239281611b97565b92915050565b6000608082840312156123ae576123ad611fbc565b5b6123b86080612021565b905060006123c884828501612342565b60008301525060206123dc8482850161236e565b60208301525060406123f084828501612383565b6040830152506060612404848285016122e5565b60608301525092915050565b600061242361241e846122fa565b612021565b9050808382526020820190506080840283018581111561244657612445612326565b5b835b8181101561246f578061245b8882612398565b845260208401935050608081019050612448565b5050509392505050565b600082601f83011261248e5761248d612041565b5b815161249e848260208601612410565b91505092915050565b6000806000606084860312156124c0576124bf611ac8565b5b60006124ce868287016122d0565b93505060206124df868287016122e5565b925050604084015167ffffffffffffffff811115612500576124ff611acd565b5b61250c86828701612479565b9150509250925092565b7f65706f6368206d757374206265203e206c617465737445706f63680000000000600082015250565b600061254c601b836121cc565b915061255782612516565b602082019050919050565b6000602082019050818103600083015261257b8161253f565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006125b86011836121cc565b91506125c382612582565b602082019050919050565b600060208201905081810360008301526125e7816125ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061265782611e1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561268a5761268961261d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6126ca81611f5c565b82525050565b6126d981611e7e565b82525050565b6126e881611b8d565b82525050565b6126f781611e1b565b82525050565b60808201600082015161271360008501826126c1565b50602082015161272660208501826126d0565b50604082015161273960408501826126df565b50606082015161274c60608501826126ee565b50505050565b600061275e83836126fd565b60808301905092915050565b6000602082019050919050565b600061278282612695565b61278c81856126a0565b9350612797836126b1565b8060005b838110156127c85781516127af8882612752565b97506127ba8361276a565b92505060018101905061279b565b5085935050505092915050565b60006060820190506127ea6000830186611f23565b6127f76020830185611f4d565b81810360408301526128098184612777565b9050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612854601c83612813565b915061285f8261281e565b601c82019050919050565b6000819050919050565b61288561288082611b8d565b61286a565b82525050565b600061289682612847565b91506128a28284612874565b60208201915081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006128e7601783612813565b91506128f2826128b1565b601782019050919050565b600081519050919050565b6000612913826128fd565b61291d8185612813565b935061292d818560208601611d67565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061296f601183612813565b915061297a82612939565b601182019050919050565b6000612990826128da565b915061299c8285612908565b91506129a782612962565b91506129b38284612908565b91508190509392505050565b60006129ca826128fd565b6129d481856121cc565b93506129e4818560208601611d67565b6129ed81611d9a565b840191505092915050565b60006020820190508181036000830152612a1281846129bf565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612a7f6018836121cc565b9150612a8a82612a49565b602082019050919050565b60006020820190508181036000830152612aae81612a72565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612aeb601f836121cc565b9150612af682612ab5565b602082019050919050565b60006020820190508181036000830152612b1a81612ade565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b7d6022836121cc565b9150612b8882612b21565b604082019050919050565b60006020820190508181036000830152612bac81612b70565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0f6022836121cc565b9150612c1a82612bb3565b604082019050919050565b60006020820190508181036000830152612c3e81612c02565b9050919050565b6000612c5082611e1b565b9150612c5b83611e1b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9457612c9361261d565b5b828202905092915050565b6000612caa82611e1b565b9150612cb583611e1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cea57612ce961261d565b5b828201905092915050565b6000612d0082611e1b565b91506000821415612d1457612d1361261d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612d556020836121cc565b9150612d6082612d1f565b602082019050919050565b60006020820190508181036000830152612d8481612d48565b9050919050565b6000612d9682611e1b565b9150612da183611e1b565b925082821015612db457612db361261d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060ff82169050919050565b612e0481612dee565b82525050565b6000608082019050612e1f6000830187611bf0565b612e2c6020830186612dfb565b612e396040830185611bf0565b612e466060830184611bf0565b9594505050505056fea2646970667358221220ab309021aecef825c4e2dcd2360e27634f23c20390a47242403d9e2d95605d8964736f6c63430008090033000000000000000000000000c68acc784227dbeae98bb6f5ac3c57cce1ae9b4b
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638fa2a9f0116100ad578063add4c78411610071578063add4c7841461036c578063ca15c8731461039d578063d547741f146103cd578063e4ea484d146103e9578063fbaf894c146104055761012c565b80638fa2a9f0146102b45780639010d07c146102d057806391d14854146103005780639cb118bf14610330578063a217fddf1461034e5761012c565b80635b7633d0116100f45780635b7633d0146101e75780635cd0783e146102055780636533b075146102365780636fdc356e146102665780637caa33cb146102845761012c565b806301ffc9a714610131578063248a9ca3146101615780632f2ff15d1461019157806335f6fb87146101ad57806336568abe146101cb575b600080fd5b61014b60048036038101906101469190611b2a565b610423565b6040516101589190611b72565b60405180910390f35b61017b60048036038101906101769190611bc3565b61049d565b6040516101889190611bff565b60405180910390f35b6101ab60048036038101906101a69190611c78565b6104bc565b005b6101b56104dd565b6040516101c29190611bff565b60405180910390f35b6101e560048036038101906101e09190611c78565b610501565b005b6101ef610584565b6040516101fc9190611cc7565b60405180910390f35b61021f600480360381019061021a9190611d1e565b6105aa565b60405161022d929190611de4565b60405180910390f35b610250600480360381019061024b9190611e51565b6106de565b60405161025d9190611e9b565b60405180910390f35b61026e610716565b60405161027b9190611bff565b60405180910390f35b61029e60048036038101906102999190611bc3565b61073a565b6040516102ab9190611e9b565b60405180910390f35b6102ce60048036038101906102c99190611eb6565b61075b565b005b6102ea60048036038101906102e59190611ee3565b6107ca565b6040516102f79190611cc7565b60405180910390f35b61031a60048036038101906103159190611c78565b6107f9565b6040516103279190611b72565b60405180910390f35b610338610863565b6040516103459190611f32565b60405180910390f35b610356610879565b6040516103639190611bff565b60405180910390f35b61038660048036038101906103819190611bc3565b610880565b604051610394929190611f78565b60405180910390f35b6103b760048036038101906103b29190611bc3565b6108e7565b6040516103c49190611fa1565b60405180910390f35b6103e760048036038101906103e29190611c78565b61090b565b005b61040360048036038101906103fe9190612183565b61092c565b005b61040d610d15565b60405161041a9190611fa1565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610496575061049582610e2b565b5b9050919050565b6000806000838152602001908152602001600020600101549050919050565b6104c58261049d565b6104ce81610ea5565b6104d88383610eb9565b505050565b7f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f81565b610509610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d9061224f565b60405180910390fd5b6105808282610ef5565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915090508060000180546105cd9061229e565b80601f01602080910402602001604051908101604052809291908181526020018280546105f99061229e565b80156106465780601f1061061b57610100808354040283529160200191610646565b820191906000526020600020905b81548152906001019060200180831161062957829003601f168201915b50505050509080600101805461065b9061229e565b80601f01602080910402602001604051908101604052809291908181526020018280546106879061229e565b80156106d45780601f106106a9576101008083540402835291602001916106d4565b820191906000526020600020905b8154815290600101906020018083116106b757829003601f168201915b5050505050905082565b600481815481106106ee57600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b7f2a3a4d996be8648f4eb528ed2ac81fcc886000777b5645f6cde5bdcfcdebf24281565b60076020528060005260406000206000915054906101000a900461ffff1681565b7f2a3a4d996be8648f4eb528ed2ac81fcc886000777b5645f6cde5bdcfcdebf24261078581610ea5565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006107f18260016000868152602001908152602001600020610f2990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600560009054906101000a900463ffffffff1681565b6000801b81565b6000807f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f6108ad81610ea5565b60006007600086815260200190815260200160002060009054906101000a900461ffff1690506108dc81610f43565b935093505050915091565b600061090460016000848152602001908152602001600020610f9a565b9050919050565b6109148261049d565b61091d81610ea5565b6109278383610ef5565b505050565b6000806000836000015180602001905181019061094991906124a7565b925092509250600560009054906101000a900463ffffffff1663ffffffff168363ffffffff16116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690612562565b60405180910390fd5b60008460000151805190602001209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a0e610a0483610faf565b8760200151610fdf565b73ffffffffffffffffffffffffffffffffffffffff1614610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b906125ce565b60405180910390fd5b6000825167ffffffffffffffff811115610a8157610a80611fc1565b5b604051908082528060200260200182016040528015610aaf5781602001602082028036833780820191505090505b50905085600660008763ffffffff1663ffffffff1681526020019081526020016000206000820151816000019080519060200190610aee929190611971565b506020820151816001019080519060200190610b0b929190611971565b5090505060005b8351811015610c9257838181518110610b2e57610b2d6125ee565b5b602002602001015160086000868481518110610b4d57610b4c6125ee565b5b60200260200101516020015161ffff1661ffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360000b60ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff1602179055506040820151816001015560608201518160020155905050838181518110610be057610bdf6125ee565b5b60200260200101516020015160076000868481518110610c0357610c026125ee565b5b602002602001015160400151815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550838181518110610c4a57610c496125ee565b5b602002602001015160200151828281518110610c6957610c686125ee565b5b602002602001019061ffff16908161ffff16815250508080610c8a9061264c565b915050610b12565b508060049080519060200190610ca99291906119f7565b508360038190555084600560006101000a81548163ffffffff021916908363ffffffff1602179055507f36046b7e65f3c5d846ecf6fbe177dc9c1d961a9e8d83e48e9f08cadfda612f96858585604051610d05939291906127d5565b60405180910390a1505050505050565b60035481565b610d2582826107f9565b610df757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610d9c610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000610e23836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611006565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e9e5750610e9d82611076565b5b9050919050565b610eb681610eb1610eed565b6110e0565b50565b610ec38282610d1b565b610ee88160016000858152602001908152602001600020610dfb90919063ffffffff16565b505050565b600033905090565b610eff828261117d565b610f24816001600085815260200190815260200160002061125e90919063ffffffff16565b505050565b6000610f38836000018361128e565b60001c905092915050565b600080600860008461ffff1661ffff16815260200190815260200160002060020154600860008561ffff1661ffff16815260200190815260200160002060000160009054906101000a900460000b91509150915091565b6000610fa8826000016112b9565b9050919050565b600081604051602001610fc2919061288b565b604051602081830303815290604052805190602001209050919050565b6000806000610fee85856112ca565b91509150610ffb8161131c565b819250505092915050565b600061101283836114f1565b61106b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611070565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6110ea82826107f9565b6111795761110f8173ffffffffffffffffffffffffffffffffffffffff166014611514565b61111d8360001c6020611514565b60405160200161112e929190612985565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117091906129f8565b60405180910390fd5b5050565b61118782826107f9565b1561125a57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111ff610eed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611286836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611750565b905092915050565b60008260000182815481106112a6576112a56125ee565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b60008060418351141561130c5760008060006020860151925060408601519150606086015160001a905061130087828585611864565b94509450505050611315565b60006002915091505b9250929050565b600060048111156113305761132f612a1a565b5b81600481111561134357611342612a1a565b5b141561134e576114ee565b6001600481111561136257611361612a1a565b5b81600481111561137557611374612a1a565b5b14156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612a95565b60405180910390fd5b600260048111156113ca576113c9612a1a565b5b8160048111156113dd576113dc612a1a565b5b141561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590612b01565b60405180910390fd5b6003600481111561143257611431612a1a565b5b81600481111561144557611444612a1a565b5b1415611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90612b93565b60405180910390fd5b60048081111561149957611498612a1a565b5b8160048111156114ac576114ab612a1a565b5b14156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490612c25565b60405180910390fd5b5b50565b600080836001016000848152602001908152602001600020541415905092915050565b6060600060028360026115279190612c45565b6115319190612c9f565b67ffffffffffffffff81111561154a57611549611fc1565b5b6040519080825280601f01601f19166020018201604052801561157c5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106115b4576115b36125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611618576116176125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026116589190612c45565b6116629190612c9f565b90505b6001811115611702577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106116a4576116a36125ee565b5b1a60f81b8282815181106116bb576116ba6125ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806116fb90612cf5565b9050611665565b5060008414611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612d6b565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146118585760006001826117829190612d8b565b905060006001866000018054905061179a9190612d8b565b90508181146118095760008660000182815481106117bb576117ba6125ee565b5b90600052602060002001549050808760000184815481106117df576117de6125ee565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061181d5761181c612dbf565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061185e565b60009150505b92915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561189f576000600391509150611968565b601b8560ff16141580156118b75750601c8560ff1614155b156118c9576000600491509150611968565b6000600187878787604051600081526020016040526040516118ee9493929190612e0a565b6020604051602081039080840390855afa158015611910573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561195f57600060019250925050611968565b80600092509250505b94509492505050565b82805461197d9061229e565b90600052602060002090601f01602090048101928261199f57600085556119e6565b82601f106119b857805160ff19168380011785556119e6565b828001600101855582156119e6579182015b828111156119e55782518255916020019190600101906119ca565b5b5090506119f39190611aa1565b5090565b82805482825590600052602060002090600f01601090048101928215611a905791602002820160005b83821115611a6057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302611a20565b8015611a8e5782816101000a81549061ffff0219169055600201602081600101049283019260010302611a60565b505b509050611a9d9190611aa1565b5090565b5b80821115611aba576000816000905550600101611aa2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b0781611ad2565b8114611b1257600080fd5b50565b600081359050611b2481611afe565b92915050565b600060208284031215611b4057611b3f611ac8565b5b6000611b4e84828501611b15565b91505092915050565b60008115159050919050565b611b6c81611b57565b82525050565b6000602082019050611b876000830184611b63565b92915050565b6000819050919050565b611ba081611b8d565b8114611bab57600080fd5b50565b600081359050611bbd81611b97565b92915050565b600060208284031215611bd957611bd8611ac8565b5b6000611be784828501611bae565b91505092915050565b611bf981611b8d565b82525050565b6000602082019050611c146000830184611bf0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c4582611c1a565b9050919050565b611c5581611c3a565b8114611c6057600080fd5b50565b600081359050611c7281611c4c565b92915050565b60008060408385031215611c8f57611c8e611ac8565b5b6000611c9d85828601611bae565b9250506020611cae85828601611c63565b9150509250929050565b611cc181611c3a565b82525050565b6000602082019050611cdc6000830184611cb8565b92915050565b600063ffffffff82169050919050565b611cfb81611ce2565b8114611d0657600080fd5b50565b600081359050611d1881611cf2565b92915050565b600060208284031215611d3457611d33611ac8565b5b6000611d4284828501611d09565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d85578082015181840152602081019050611d6a565b83811115611d94576000848401525b50505050565b6000601f19601f8301169050919050565b6000611db682611d4b565b611dc08185611d56565b9350611dd0818560208601611d67565b611dd981611d9a565b840191505092915050565b60006040820190508181036000830152611dfe8185611dab565b90508181036020830152611e128184611dab565b90509392505050565b6000819050919050565b611e2e81611e1b565b8114611e3957600080fd5b50565b600081359050611e4b81611e25565b92915050565b600060208284031215611e6757611e66611ac8565b5b6000611e7584828501611e3c565b91505092915050565b600061ffff82169050919050565b611e9581611e7e565b82525050565b6000602082019050611eb06000830184611e8c565b92915050565b600060208284031215611ecc57611ecb611ac8565b5b6000611eda84828501611c63565b91505092915050565b60008060408385031215611efa57611ef9611ac8565b5b6000611f0885828601611bae565b9250506020611f1985828601611e3c565b9150509250929050565b611f2c81611ce2565b82525050565b6000602082019050611f476000830184611f23565b92915050565b611f5681611e1b565b82525050565b60008160000b9050919050565b611f7281611f5c565b82525050565b6000604082019050611f8d6000830185611f4d565b611f9a6020830184611f69565b9392505050565b6000602082019050611fb66000830184611f4d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ff982611d9a565b810181811067ffffffffffffffff8211171561201857612017611fc1565b5b80604052505050565b600061202b611abe565b90506120378282611ff0565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561206657612065611fc1565b5b61206f82611d9a565b9050602081019050919050565b82818337600083830152505050565b600061209e6120998461204b565b612021565b9050828152602081018484840111156120ba576120b9612046565b5b6120c584828561207c565b509392505050565b600082601f8301126120e2576120e1612041565b5b81356120f284826020860161208b565b91505092915050565b60006040828403121561211157612110611fbc565b5b61211b6040612021565b9050600082013567ffffffffffffffff81111561213b5761213a61203c565b5b612147848285016120cd565b600083015250602082013567ffffffffffffffff81111561216b5761216a61203c565b5b612177848285016120cd565b60208301525092915050565b60006020828403121561219957612198611ac8565b5b600082013567ffffffffffffffff8111156121b7576121b6611acd565b5b6121c3848285016120fb565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612239602f836121cc565b9150612244826121dd565b604082019050919050565b600060208201905081810360008301526122688161222c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806122b657607f821691505b602082108114156122ca576122c961226f565b5b50919050565b6000815190506122df81611cf2565b92915050565b6000815190506122f481611e25565b92915050565b600067ffffffffffffffff82111561231557612314611fc1565b5b602082029050602081019050919050565b600080fd5b61233481611f5c565b811461233f57600080fd5b50565b6000815190506123518161232b565b92915050565b61236081611e7e565b811461236b57600080fd5b50565b60008151905061237d81612357565b92915050565b60008151905061239281611b97565b92915050565b6000608082840312156123ae576123ad611fbc565b5b6123b86080612021565b905060006123c884828501612342565b60008301525060206123dc8482850161236e565b60208301525060406123f084828501612383565b6040830152506060612404848285016122e5565b60608301525092915050565b600061242361241e846122fa565b612021565b9050808382526020820190506080840283018581111561244657612445612326565b5b835b8181101561246f578061245b8882612398565b845260208401935050608081019050612448565b5050509392505050565b600082601f83011261248e5761248d612041565b5b815161249e848260208601612410565b91505092915050565b6000806000606084860312156124c0576124bf611ac8565b5b60006124ce868287016122d0565b93505060206124df868287016122e5565b925050604084015167ffffffffffffffff811115612500576124ff611acd565b5b61250c86828701612479565b9150509250925092565b7f65706f6368206d757374206265203e206c617465737445706f63680000000000600082015250565b600061254c601b836121cc565b915061255782612516565b602082019050919050565b6000602082019050818103600083015261257b8161253f565b9050919050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006125b86011836121cc565b91506125c382612582565b602082019050919050565b600060208201905081810360008301526125e7816125ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061265782611e1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561268a5761268961261d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6126ca81611f5c565b82525050565b6126d981611e7e565b82525050565b6126e881611b8d565b82525050565b6126f781611e1b565b82525050565b60808201600082015161271360008501826126c1565b50602082015161272660208501826126d0565b50604082015161273960408501826126df565b50606082015161274c60608501826126ee565b50505050565b600061275e83836126fd565b60808301905092915050565b6000602082019050919050565b600061278282612695565b61278c81856126a0565b9350612797836126b1565b8060005b838110156127c85781516127af8882612752565b97506127ba8361276a565b92505060018101905061279b565b5085935050505092915050565b60006060820190506127ea6000830186611f23565b6127f76020830185611f4d565b81810360408301526128098184612777565b9050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612854601c83612813565b915061285f8261281e565b601c82019050919050565b6000819050919050565b61288561288082611b8d565b61286a565b82525050565b600061289682612847565b91506128a28284612874565b60208201915081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006128e7601783612813565b91506128f2826128b1565b601782019050919050565b600081519050919050565b6000612913826128fd565b61291d8185612813565b935061292d818560208601611d67565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061296f601183612813565b915061297a82612939565b601182019050919050565b6000612990826128da565b915061299c8285612908565b91506129a782612962565b91506129b38284612908565b91508190509392505050565b60006129ca826128fd565b6129d481856121cc565b93506129e4818560208601611d67565b6129ed81611d9a565b840191505092915050565b60006020820190508181036000830152612a1281846129bf565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612a7f6018836121cc565b9150612a8a82612a49565b602082019050919050565b60006020820190508181036000830152612aae81612a72565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612aeb601f836121cc565b9150612af682612ab5565b602082019050919050565b60006020820190508181036000830152612b1a81612ade565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b7d6022836121cc565b9150612b8882612b21565b604082019050919050565b60006020820190508181036000830152612bac81612b70565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0f6022836121cc565b9150612c1a82612bb3565b604082019050919050565b60006020820190508181036000830152612c3e81612c02565b9050919050565b6000612c5082611e1b565b9150612c5b83611e1b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c9457612c9361261d565b5b828202905092915050565b6000612caa82611e1b565b9150612cb583611e1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cea57612ce961261d565b5b828201905092915050565b6000612d0082611e1b565b91506000821415612d1457612d1361261d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612d556020836121cc565b9150612d6082612d1f565b602082019050919050565b60006020820190508181036000830152612d8481612d48565b9050919050565b6000612d9682611e1b565b9150612da183611e1b565b925082821015612db457612db361261d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060ff82169050919050565b612e0481612dee565b82525050565b6000608082019050612e1f6000830187611bf0565b612e2c6020830186612dfb565b612e396040830185611bf0565b612e466060830184611bf0565b9594505050505056fea2646970667358221220ab309021aecef825c4e2dcd2360e27634f23c20390a47242403d9e2d95605d8964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c68acc784227dbeae98bb6f5ac3c57cce1ae9b4b
-----Decoded View---------------
Arg [0] : _signerAddress (address): 0xC68AcC784227DbEaE98Bb6F5aC3C57cCe1aE9B4B
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c68acc784227dbeae98bb6f5ac3c57cce1ae9b4b
Deployed Bytecode Sourcemap
197:3383:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;634:212:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4391:129:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4816:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;580:68:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5925:214:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;655:28:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;825:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;730:35;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;476:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;944:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1434:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1431:151:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2895:145:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;771:25:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2027:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3068:219:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1750:140:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5241:147:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1767:1074:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;689:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;634:212:1;719:4;757:42;742:57;;;:11;:57;;;;:97;;;;803:36;827:11;803:23;:36::i;:::-;742:97;735:104;;634:212;;;:::o;4391:129:0:-;4465:7;4491:6;:12;4498:4;4491:12;;;;;;;;;;;:22;;;4484:29;;4391:129;;;:::o;4816:145::-;4899:18;4912:4;4899:12;:18::i;:::-;2505:16;2516:4;2505:10;:16::i;:::-;4929:25:::1;4940:4;4946:7;4929:10;:25::i;:::-;4816:145:::0;;;:::o;580:68:10:-;621:27;580:68;:::o;5925:214:0:-;6031:12;:10;:12::i;:::-;6020:23;;:7;:23;;;6012:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6106:26;6118:4;6124:7;6106:11;:26::i;:::-;5925:214;;:::o;655:28:10:-;;;;;;;;;;;;;:::o;825:38::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;730:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;476:98::-;536:38;476:98;:::o;944:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;1434:165::-;536:38;2505:16:0;2516:4;2505:10;:16::i;:::-;1578:14:10::1;1562:13;;:30;;;;;;;;;;;;;;;;;;1434:165:::0;;:::o;1431:151:1:-;1521:7;1547:28;1569:5;1547:12;:18;1560:4;1547:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;1540:35;;1431:151;;;;:::o;2895:145:0:-;2981:4;3004:6;:12;3011:4;3004:12;;;;;;;;;;;:20;;:29;3025:7;3004:29;;;;;;;;;;;;;;;;;;;;;;;;;2997:36;;2895:145;;;;:::o;771:25:10:-;;;;;;;;;;;;;:::o;2027:49:0:-;2072:4;2027:49;;;:::o;3068:219:10:-;3182:7;3191:4;621:27;2505:16:0;2516:4;2505:10;:16::i;:::-;3211:9:10::1;3223:13;:20;3237:5;3223:20;;;;;;;;;;;;;;;;;;;;;3211:32;;3260:20;3277:2;3260:16;:20::i;:::-;3253:27;;;;;3068:219:::0;;;;:::o;1750:140:1:-;1830:7;1856:27;:12;:18;1869:4;1856:18;;;;;;;;;;;:25;:27::i;:::-;1849:34;;1750:140;;;:::o;5241:147:0:-;5325:18;5338:4;5325:12;:18::i;:::-;2505:16;2516:4;2505:10;:16::i;:::-;5355:26:::1;5367:4;5373:7;5355:11;:26::i;:::-;5241:147:::0;;;:::o;1767:1074:10:-;1832:12;1846:17;1865:21;1914:12;:20;;;1890:94;;;;;;;;;;;;:::i;:::-;1831:153;;;;;;2010:11;;;;;;;;;;;2002:19;;:5;:19;;;1994:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2096:12;:20;;;2086:31;;;;;;2064:53;;2278:13;;;;;;;;;;;2148:143;;:126;2179:41;2208:11;2179:28;:41::i;:::-;2238:12;:22;;;2148:13;:126::i;:::-;:143;;;2127:207;;;;;;;;;;;;:::i;:::-;;;;;;;;;2345:19;2380:6;:13;2367:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2345:49;;2420:12;2404:6;:13;2411:5;2404:13;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;2447:9;2442:232;2462:6;:13;2458:1;:17;2442:232;;;2541:6;2548:1;2541:9;;;;;;;;:::i;:::-;;;;;;;;2496:18;:42;2515:6;2522:1;2515:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;2496:42;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2596:6;2603:1;2596:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;2564:13;:29;2578:6;2585:1;2578:9;;;;;;;;:::i;:::-;;;;;;;;:14;;;2564:29;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;2641:6;2648:1;2641:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;2632:3;2636:1;2632:6;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;;;2477:3;;;;;:::i;:::-;;;;2442:232;;;;2705:3;2683:19;:25;;;;;;;;;;;;:::i;:::-;;2741:9;2718:20;:32;;;;2774:5;2760:11;;:19;;;;;;;;;;;;;;;;;;2795:39;2809:5;2816:9;2827:6;2795:39;;;;;;;;:::i;:::-;;;;;;;;1821:1020;;;;;1767:1074;:::o;689:35::-;;;;:::o;7474:233:0:-;7557:22;7565:4;7571:7;7557;:22::i;:::-;7552:149;;7627:4;7595:6;:12;7602:4;7595:12;;;;;;;;;;;:20;;:29;7616:7;7595:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7677:12;:10;:12::i;:::-;7650:40;;7668:7;7650:40;;7662:4;7650:40;;;;;;;;;;7552:149;7474:233;;:::o;8028:150:9:-;8098:4;8121:50;8126:3;:10;;8162:5;8146:23;;8138:32;;8121:4;:50::i;:::-;8114:57;;8028:150;;;;:::o;2606:202:0:-;2691:4;2729:32;2714:47;;;:11;:47;;;;:87;;;;2765:36;2789:11;2765:23;:36::i;:::-;2714:87;2707:94;;2606:202;;;:::o;3334:103::-;3400:30;3411:4;3417:12;:10;:12::i;:::-;3400:10;:30::i;:::-;3334:103;:::o;1978:166:1:-;2065:31;2082:4;2088:7;2065:16;:31::i;:::-;2106;2129:7;2106:12;:18;2119:4;2106:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;1978:166;;:::o;640:96:4:-;693:7;719:10;712:17;;640:96;:::o;2233:171:1:-;2321:32;2339:4;2345:7;2321:17;:32::i;:::-;2363:34;2389:7;2363:12;:18;2376:4;2363:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2233:171;;:::o;9286:156:9:-;9360:7;9410:22;9414:3;:10;;9426:5;9410:3;:22::i;:::-;9402:31;;9379:56;;9286:156;;;;:::o;3388:190:10:-;3473:7;3482:4;3510:18;:23;3529:3;3510:23;;;;;;;;;;;;;;;:29;;;3541:18;:23;3560:3;3541:23;;;;;;;;;;;;;;;:29;;;;;;;;;;;;3502:69;;;;3388:190;;;:::o;8829:115:9:-;8892:7;8918:19;8926:3;:10;;8918:7;:19::i;:::-;8911:26;;8829:115;;;:::o;7463:265:6:-;7532:7;7715:4;7662:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;7652:69;;;;;;7645:76;;7463:265;;;:::o;3759:227::-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;3970:9;3963:16;;;;3759:227;;;;:::o;2113:404:9:-;2176:4;2197:21;2207:3;2212:5;2197:9;:21::i;:::-;2192:319;;2234:3;:11;;2251:5;2234:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:3;:11;;:18;;;;2392:3;:12;;:19;2405:5;2392:19;;;;;;;;;;;:40;;;;2453:4;2446:11;;;;2192:319;2495:5;2488:12;;2113:404;;;;;:::o;829:155:7:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;3718:492:0:-;3806:22;3814:4;3820:7;3806;:22::i;:::-;3801:403;;3989:41;4017:7;3989:41;;4027:2;3989:19;:41::i;:::-;4101:38;4129:4;4121:13;;4136:2;4101:19;:38::i;:::-;3896:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3844:349;;;;;;;;;;;:::i;:::-;;;;;;;;3801:403;3718:492;;:::o;7878:234::-;7961:22;7969:4;7975:7;7961;:22::i;:::-;7957:149;;;8031:5;7999:6;:12;8006:4;7999:12;;;;;;;;;;;:20;;:29;8020:7;7999:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8082:12;:10;:12::i;:::-;8055:40;;8073:7;8055:40;;8067:4;8055:40;;;;;;;;;;7957:149;7878:234;;:::o;8346:156:9:-;8419:4;8442:53;8450:3;:10;;8486:5;8470:23;;8462:32;;8442:7;:53::i;:::-;8435:60;;8346:156;;;;:::o;4811:118::-;4878:7;4904:3;:11;;4916:5;4904:18;;;;;;;;:::i;:::-;;;;;;;;;;4897:25;;4811:118;;;;:::o;4362:107::-;4418:7;4444:3;:11;;:18;;;;4437:25;;4362:107;;;:::o;2243:730:6:-;2324:7;2333:12;2381:2;2361:9;:16;:22;2357:610;;;2399:9;2422;2445:7;2697:4;2686:9;2682:20;2676:27;2671:32;;2746:4;2735:9;2731:20;2725:27;2720:32;;2803:4;2792:9;2788:20;2782:27;2779:1;2774:36;2769:41;;2844:25;2855:4;2861:1;2864;2867;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;2916:1;2920:35;2900:56;;;;2243:730;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;;;661:7;;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;4154:127:9:-;4227:4;4273:1;4250:3;:12;;:19;4263:5;4250:19;;;;;;;;;;;;:24;;4243:31;;4154:127;;;;:::o;1652:441:5:-;1727:13;1752:19;1797:1;1788:6;1784:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1752:47;;1809:15;:6;1816:1;1809:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1834;:6;1841:1;1834:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1864:9;1889:1;1880:6;1876:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1864:26;;1859:132;1896:1;1892;:5;1859:132;;;1930:12;1951:3;1943:5;:11;1930:25;;;;;;;:::i;:::-;;;;;1918:6;1925:1;1918:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1979:1;1969:11;;;;;1899:3;;;;:::i;:::-;;;1859:132;;;;2017:1;2008:5;:10;2000:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:6;2065:21;;;1652:441;;;;:::o;2685:1388:9:-;2751:4;2867:18;2888:3;:12;;:19;2901:5;2888:19;;;;;;;;;;;;2867:40;;2936:1;2922:10;:15;2918:1149;;3291:21;3328:1;3315:10;:14;;;;:::i;:::-;3291:38;;3343:17;3384:1;3363:3;:11;;:18;;;;:22;;;;:::i;:::-;3343:42;;3417:13;3404:9;:26;3400:398;;3450:17;3470:3;:11;;3482:9;3470:22;;;;;;;;:::i;:::-;;;;;;;;;;3450:42;;3621:9;3592:3;:11;;3604:13;3592:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3730:10;3704:3;:12;;:23;3717:9;3704:23;;;;;;;;;;;:36;;;;3432:366;3400:398;3876:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3968:3;:12;;:19;3981:5;3968:19;;;;;;;;;;;3961:26;;;4009:4;4002:11;;;;;;;2918:1149;4051:5;4044:12;;;2685:1388;;;;;:::o;5167:1603:6:-;5293:7;5302:12;6217:66;6212:1;6204:10;;:79;6200:161;;;6315:1;6319:30;6299:51;;;;;;6200:161;6379:2;6374:1;:7;;;;:18;;;;;6390:2;6385:1;:7;;;;6374:18;6370:100;;;6424:1;6428:30;6408:51;;;;;;6370:100;6564:14;6581:24;6591:4;6597:1;6600;6603;6581:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6564:41;;6637:1;6619:20;;:6;:20;;;6615:101;;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;6742:20;6726:37;;;;;5167:1603;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:11:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:118::-;2296:24;2314:5;2296:24;:::i;:::-;2291:3;2284:37;2209:118;;:::o;2333:222::-;2426:4;2464:2;2453:9;2449:18;2441:26;;2477:71;2545:1;2534:9;2530:17;2521:6;2477:71;:::i;:::-;2333:222;;;;:::o;2561:126::-;2598:7;2638:42;2631:5;2627:54;2616:65;;2561:126;;;:::o;2693:96::-;2730:7;2759:24;2777:5;2759:24;:::i;:::-;2748:35;;2693:96;;;:::o;2795:122::-;2868:24;2886:5;2868:24;:::i;:::-;2861:5;2858:35;2848:63;;2907:1;2904;2897:12;2848:63;2795:122;:::o;2923:139::-;2969:5;3007:6;2994:20;2985:29;;3023:33;3050:5;3023:33;:::i;:::-;2923:139;;;;:::o;3068:474::-;3136:6;3144;3193:2;3181:9;3172:7;3168:23;3164:32;3161:119;;;3199:79;;:::i;:::-;3161:119;3319:1;3344:53;3389:7;3380:6;3369:9;3365:22;3344:53;:::i;:::-;3334:63;;3290:117;3446:2;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3417:118;3068:474;;;;;:::o;3548:118::-;3635:24;3653:5;3635:24;:::i;:::-;3630:3;3623:37;3548:118;;:::o;3672:222::-;3765:4;3803:2;3792:9;3788:18;3780:26;;3816:71;3884:1;3873:9;3869:17;3860:6;3816:71;:::i;:::-;3672:222;;;;:::o;3900:93::-;3936:7;3976:10;3969:5;3965:22;3954:33;;3900:93;;;:::o;3999:120::-;4071:23;4088:5;4071:23;:::i;:::-;4064:5;4061:34;4051:62;;4109:1;4106;4099:12;4051:62;3999:120;:::o;4125:137::-;4170:5;4208:6;4195:20;4186:29;;4224:32;4250:5;4224:32;:::i;:::-;4125:137;;;;:::o;4268:327::-;4326:6;4375:2;4363:9;4354:7;4350:23;4346:32;4343:119;;;4381:79;;:::i;:::-;4343:119;4501:1;4526:52;4570:7;4561:6;4550:9;4546:22;4526:52;:::i;:::-;4516:62;;4472:116;4268:327;;;;:::o;4601:98::-;4652:6;4686:5;4680:12;4670:22;;4601:98;;;:::o;4705:168::-;4788:11;4822:6;4817:3;4810:19;4862:4;4857:3;4853:14;4838:29;;4705:168;;;;:::o;4879:307::-;4947:1;4957:113;4971:6;4968:1;4965:13;4957:113;;;5056:1;5051:3;5047:11;5041:18;5037:1;5032:3;5028:11;5021:39;4993:2;4990:1;4986:10;4981:15;;4957:113;;;5088:6;5085:1;5082:13;5079:101;;;5168:1;5159:6;5154:3;5150:16;5143:27;5079:101;4928:258;4879:307;;;:::o;5192:102::-;5233:6;5284:2;5280:7;5275:2;5268:5;5264:14;5260:28;5250:38;;5192:102;;;:::o;5300:360::-;5386:3;5414:38;5446:5;5414:38;:::i;:::-;5468:70;5531:6;5526:3;5468:70;:::i;:::-;5461:77;;5547:52;5592:6;5587:3;5580:4;5573:5;5569:16;5547:52;:::i;:::-;5624:29;5646:6;5624:29;:::i;:::-;5619:3;5615:39;5608:46;;5390:270;5300:360;;;;:::o;5666:506::-;5823:4;5861:2;5850:9;5846:18;5838:26;;5910:9;5904:4;5900:20;5896:1;5885:9;5881:17;5874:47;5938:76;6009:4;6000:6;5938:76;:::i;:::-;5930:84;;6061:9;6055:4;6051:20;6046:2;6035:9;6031:18;6024:48;6089:76;6160:4;6151:6;6089:76;:::i;:::-;6081:84;;5666:506;;;;;:::o;6178:77::-;6215:7;6244:5;6233:16;;6178:77;;;:::o;6261:122::-;6334:24;6352:5;6334:24;:::i;:::-;6327:5;6324:35;6314:63;;6373:1;6370;6363:12;6314:63;6261:122;:::o;6389:139::-;6435:5;6473:6;6460:20;6451:29;;6489:33;6516:5;6489:33;:::i;:::-;6389:139;;;;:::o;6534:329::-;6593:6;6642:2;6630:9;6621:7;6617:23;6613:32;6610:119;;;6648:79;;:::i;:::-;6610:119;6768:1;6793:53;6838:7;6829:6;6818:9;6814:22;6793:53;:::i;:::-;6783:63;;6739:117;6534:329;;;;:::o;6869:89::-;6905:7;6945:6;6938:5;6934:18;6923:29;;6869:89;;;:::o;6964:115::-;7049:23;7066:5;7049:23;:::i;:::-;7044:3;7037:36;6964:115;;:::o;7085:218::-;7176:4;7214:2;7203:9;7199:18;7191:26;;7227:69;7293:1;7282:9;7278:17;7269:6;7227:69;:::i;:::-;7085:218;;;;:::o;7309:329::-;7368:6;7417:2;7405:9;7396:7;7392:23;7388:32;7385:119;;;7423:79;;:::i;:::-;7385:119;7543:1;7568:53;7613:7;7604:6;7593:9;7589:22;7568:53;:::i;:::-;7558:63;;7514:117;7309:329;;;;:::o;7644:474::-;7712:6;7720;7769:2;7757:9;7748:7;7744:23;7740:32;7737:119;;;7775:79;;:::i;:::-;7737:119;7895:1;7920:53;7965:7;7956:6;7945:9;7941:22;7920:53;:::i;:::-;7910:63;;7866:117;8022:2;8048:53;8093:7;8084:6;8073:9;8069:22;8048:53;:::i;:::-;8038:63;;7993:118;7644:474;;;;;:::o;8124:115::-;8209:23;8226:5;8209:23;:::i;:::-;8204:3;8197:36;8124:115;;:::o;8245:218::-;8336:4;8374:2;8363:9;8359:18;8351:26;;8387:69;8453:1;8442:9;8438:17;8429:6;8387:69;:::i;:::-;8245:218;;;;:::o;8469:118::-;8556:24;8574:5;8556:24;:::i;:::-;8551:3;8544:37;8469:118;;:::o;8593:89::-;8627:7;8670:5;8667:1;8656:20;8645:31;;8593:89;;;:::o;8688:109::-;8769:21;8784:5;8769:21;:::i;:::-;8764:3;8757:34;8688:109;;:::o;8803:320::-;8918:4;8956:2;8945:9;8941:18;8933:26;;8969:71;9037:1;9026:9;9022:17;9013:6;8969:71;:::i;:::-;9050:66;9112:2;9101:9;9097:18;9088:6;9050:66;:::i;:::-;8803:320;;;;;:::o;9129:222::-;9222:4;9260:2;9249:9;9245:18;9237:26;;9273:71;9341:1;9330:9;9326:17;9317:6;9273:71;:::i;:::-;9129:222;;;;:::o;9357:117::-;9466:1;9463;9456:12;9480:180;9528:77;9525:1;9518:88;9625:4;9622:1;9615:15;9649:4;9646:1;9639:15;9666:281;9749:27;9771:4;9749:27;:::i;:::-;9741:6;9737:40;9879:6;9867:10;9864:22;9843:18;9831:10;9828:34;9825:62;9822:88;;;9890:18;;:::i;:::-;9822:88;9930:10;9926:2;9919:22;9709:238;9666:281;;:::o;9953:129::-;9987:6;10014:20;;:::i;:::-;10004:30;;10043:33;10071:4;10063:6;10043:33;:::i;:::-;9953:129;;;:::o;10088:117::-;10197:1;10194;10187:12;10211:117;10320:1;10317;10310:12;10334:117;10443:1;10440;10433:12;10457:307;10518:4;10608:18;10600:6;10597:30;10594:56;;;10630:18;;:::i;:::-;10594:56;10668:29;10690:6;10668:29;:::i;:::-;10660:37;;10752:4;10746;10742:15;10734:23;;10457:307;;;:::o;10770:154::-;10854:6;10849:3;10844;10831:30;10916:1;10907:6;10902:3;10898:16;10891:27;10770:154;;;:::o;10930:410::-;11007:5;11032:65;11048:48;11089:6;11048:48;:::i;:::-;11032:65;:::i;:::-;11023:74;;11120:6;11113:5;11106:21;11158:4;11151:5;11147:16;11196:3;11187:6;11182:3;11178:16;11175:25;11172:112;;;11203:79;;:::i;:::-;11172:112;11293:41;11327:6;11322:3;11317;11293:41;:::i;:::-;11013:327;10930:410;;;;;:::o;11359:338::-;11414:5;11463:3;11456:4;11448:6;11444:17;11440:27;11430:122;;11471:79;;:::i;:::-;11430:122;11588:6;11575:20;11613:78;11687:3;11679:6;11672:4;11664:6;11660:17;11613:78;:::i;:::-;11604:87;;11420:277;11359:338;;;;:::o;11737:918::-;11809:5;11853:4;11841:9;11836:3;11832:19;11828:30;11825:117;;;11861:79;;:::i;:::-;11825:117;11960:21;11976:4;11960:21;:::i;:::-;11951:30;;12071:1;12060:9;12056:17;12043:31;12101:18;12093:6;12090:30;12087:117;;;12123:79;;:::i;:::-;12087:117;12243:58;12297:3;12288:6;12277:9;12273:22;12243:58;:::i;:::-;12236:4;12229:5;12225:16;12218:84;11991:322;12405:2;12394:9;12390:18;12377:32;12436:18;12428:6;12425:30;12422:117;;;12458:79;;:::i;:::-;12422:117;12578:58;12632:3;12623:6;12612:9;12608:22;12578:58;:::i;:::-;12571:4;12564:5;12560:16;12553:84;12323:325;11737:918;;;;:::o;12661:535::-;12743:6;12792:2;12780:9;12771:7;12767:23;12763:32;12760:119;;;12798:79;;:::i;:::-;12760:119;12946:1;12935:9;12931:17;12918:31;12976:18;12968:6;12965:30;12962:117;;;12998:79;;:::i;:::-;12962:117;13103:76;13171:7;13162:6;13151:9;13147:22;13103:76;:::i;:::-;13093:86;;12889:300;12661:535;;;;:::o;13202:169::-;13286:11;13320:6;13315:3;13308:19;13360:4;13355:3;13351:14;13336:29;;13202:169;;;;:::o;13377:234::-;13517:34;13513:1;13505:6;13501:14;13494:58;13586:17;13581:2;13573:6;13569:15;13562:42;13377:234;:::o;13617:366::-;13759:3;13780:67;13844:2;13839:3;13780:67;:::i;:::-;13773:74;;13856:93;13945:3;13856:93;:::i;:::-;13974:2;13969:3;13965:12;13958:19;;13617:366;;;:::o;13989:419::-;14155:4;14193:2;14182:9;14178:18;14170:26;;14242:9;14236:4;14232:20;14228:1;14217:9;14213:17;14206:47;14270:131;14396:4;14270:131;:::i;:::-;14262:139;;13989:419;;;:::o;14414:180::-;14462:77;14459:1;14452:88;14559:4;14556:1;14549:15;14583:4;14580:1;14573:15;14600:320;14644:6;14681:1;14675:4;14671:12;14661:22;;14728:1;14722:4;14718:12;14749:18;14739:81;;14805:4;14797:6;14793:17;14783:27;;14739:81;14867:2;14859:6;14856:14;14836:18;14833:38;14830:84;;;14886:18;;:::i;:::-;14830:84;14651:269;14600:320;;;:::o;14926:141::-;14982:5;15013:6;15007:13;14998:22;;15029:32;15055:5;15029:32;:::i;:::-;14926:141;;;;:::o;15073:143::-;15130:5;15161:6;15155:13;15146:22;;15177:33;15204:5;15177:33;:::i;:::-;15073:143;;;;:::o;15222:334::-;15322:4;15412:18;15404:6;15401:30;15398:56;;;15434:18;;:::i;:::-;15398:56;15484:4;15476:6;15472:17;15464:25;;15544:4;15538;15534:15;15526:23;;15222:334;;;:::o;15562:117::-;15671:1;15668;15661:12;15685:116;15755:21;15770:5;15755:21;:::i;:::-;15748:5;15745:32;15735:60;;15791:1;15788;15781:12;15735:60;15685:116;:::o;15807:137::-;15861:5;15892:6;15886:13;15877:22;;15908:30;15932:5;15908:30;:::i;:::-;15807:137;;;;:::o;15950:120::-;16022:23;16039:5;16022:23;:::i;:::-;16015:5;16012:34;16002:62;;16060:1;16057;16050:12;16002:62;15950:120;:::o;16076:141::-;16132:5;16163:6;16157:13;16148:22;;16179:32;16205:5;16179:32;:::i;:::-;16076:141;;;;:::o;16223:143::-;16280:5;16311:6;16305:13;16296:22;;16327:33;16354:5;16327:33;:::i;:::-;16223:143;;;;:::o;16406:955::-;16489:5;16533:4;16521:9;16516:3;16512:19;16508:30;16505:117;;;16541:79;;:::i;:::-;16505:117;16640:21;16656:4;16640:21;:::i;:::-;16631:30;;16721:1;16761:57;16814:3;16805:6;16794:9;16790:22;16761:57;:::i;:::-;16754:4;16747:5;16743:16;16736:83;16671:159;16897:2;16938:59;16993:3;16984:6;16973:9;16969:22;16938:59;:::i;:::-;16931:4;16924:5;16920:16;16913:85;16840:169;17068:2;17109:60;17165:3;17156:6;17145:9;17141:22;17109:60;:::i;:::-;17102:4;17095:5;17091:16;17084:86;17019:162;17241:2;17282:60;17338:3;17329:6;17318:9;17314:22;17282:60;:::i;:::-;17275:4;17268:5;17264:16;17257:86;17191:163;16406:955;;;;:::o;17403:801::-;17533:5;17558:104;17574:87;17654:6;17574:87;:::i;:::-;17558:104;:::i;:::-;17549:113;;17682:5;17711:6;17704:5;17697:21;17745:4;17738:5;17734:16;17727:23;;17798:4;17790:6;17786:17;17778:6;17774:30;17827:3;17819:6;17816:15;17813:122;;;17846:79;;:::i;:::-;17813:122;17961:6;17944:254;17978:6;17973:3;17970:15;17944:254;;;18053:3;18082:71;18149:3;18137:10;18082:71;:::i;:::-;18077:3;18070:84;18183:4;18178:3;18174:14;18167:21;;18020:178;18004:4;17999:3;17995:14;17988:21;;17944:254;;;17948:21;17539:665;;17403:801;;;;;:::o;18246:431::-;18351:5;18400:3;18393:4;18385:6;18381:17;18377:27;18367:122;;18408:79;;:::i;:::-;18367:122;18518:6;18512:13;18543:128;18667:3;18659:6;18652:4;18644:6;18640:17;18543:128;:::i;:::-;18534:137;;18357:320;18246:431;;;;:::o;18683:910::-;18818:6;18826;18834;18883:2;18871:9;18862:7;18858:23;18854:32;18851:119;;;18889:79;;:::i;:::-;18851:119;19009:1;19034:63;19089:7;19080:6;19069:9;19065:22;19034:63;:::i;:::-;19024:73;;18980:127;19146:2;19172:64;19228:7;19219:6;19208:9;19204:22;19172:64;:::i;:::-;19162:74;;19117:129;19306:2;19295:9;19291:18;19285:25;19337:18;19329:6;19326:30;19323:117;;;19359:79;;:::i;:::-;19323:117;19464:112;19568:7;19559:6;19548:9;19544:22;19464:112;:::i;:::-;19454:122;;19256:330;18683:910;;;;;:::o;19599:177::-;19739:29;19735:1;19727:6;19723:14;19716:53;19599:177;:::o;19782:366::-;19924:3;19945:67;20009:2;20004:3;19945:67;:::i;:::-;19938:74;;20021:93;20110:3;20021:93;:::i;:::-;20139:2;20134:3;20130:12;20123:19;;19782:366;;;:::o;20154:419::-;20320:4;20358:2;20347:9;20343:18;20335:26;;20407:9;20401:4;20397:20;20393:1;20382:9;20378:17;20371:47;20435:131;20561:4;20435:131;:::i;:::-;20427:139;;20154:419;;;:::o;20579:167::-;20719:19;20715:1;20707:6;20703:14;20696:43;20579:167;:::o;20752:366::-;20894:3;20915:67;20979:2;20974:3;20915:67;:::i;:::-;20908:74;;20991:93;21080:3;20991:93;:::i;:::-;21109:2;21104:3;21100:12;21093:19;;20752:366;;;:::o;21124:419::-;21290:4;21328:2;21317:9;21313:18;21305:26;;21377:9;21371:4;21367:20;21363:1;21352:9;21348:17;21341:47;21405:131;21531:4;21405:131;:::i;:::-;21397:139;;21124:419;;;:::o;21549:180::-;21597:77;21594:1;21587:88;21694:4;21691:1;21684:15;21718:4;21715:1;21708:15;21735:180;21783:77;21780:1;21773:88;21880:4;21877:1;21870:15;21904:4;21901:1;21894:15;21921:233;21960:3;21983:24;22001:5;21983:24;:::i;:::-;21974:33;;22029:66;22022:5;22019:77;22016:103;;;22099:18;;:::i;:::-;22016:103;22146:1;22139:5;22135:13;22128:20;;21921:233;;;:::o;22160:137::-;22250:6;22284:5;22278:12;22268:22;;22160:137;;;:::o;22303:207::-;22425:11;22459:6;22454:3;22447:19;22499:4;22494:3;22490:14;22475:29;;22303:207;;;;:::o;22516:155::-;22606:4;22629:3;22621:11;;22659:4;22654:3;22650:14;22642:22;;22516:155;;;:::o;22677:99::-;22748:21;22763:5;22748:21;:::i;:::-;22743:3;22736:34;22677:99;;:::o;22782:105::-;22857:23;22874:5;22857:23;:::i;:::-;22852:3;22845:36;22782:105;;:::o;22893:108::-;22970:24;22988:5;22970:24;:::i;:::-;22965:3;22958:37;22893:108;;:::o;23007:::-;23084:24;23102:5;23084:24;:::i;:::-;23079:3;23072:37;23007:108;;:::o;23185:843::-;23318:4;23313:3;23309:14;23406:4;23399:5;23395:16;23389:23;23425:57;23476:4;23471:3;23467:14;23453:12;23425:57;:::i;:::-;23333:159;23582:4;23575:5;23571:16;23565:23;23601:61;23656:4;23651:3;23647:14;23633:12;23601:61;:::i;:::-;23502:170;23754:4;23747:5;23743:16;23737:23;23773:63;23830:4;23825:3;23821:14;23807:12;23773:63;:::i;:::-;23682:164;23929:4;23922:5;23918:16;23912:23;23948:63;24005:4;24000:3;23996:14;23982:12;23948:63;:::i;:::-;23856:165;23287:741;23185:843;;:::o;24034:271::-;24149:10;24170:92;24258:3;24250:6;24170:92;:::i;:::-;24294:4;24289:3;24285:14;24271:28;;24034:271;;;;:::o;24311:136::-;24404:4;24436;24431:3;24427:14;24419:22;;24311:136;;;:::o;24521:916::-;24686:3;24715:77;24786:5;24715:77;:::i;:::-;24808:109;24910:6;24905:3;24808:109;:::i;:::-;24801:116;;24941:79;25014:5;24941:79;:::i;:::-;25043:7;25074:1;25059:353;25084:6;25081:1;25078:13;25059:353;;;25160:6;25154:13;25187:109;25292:3;25277:13;25187:109;:::i;:::-;25180:116;;25319:83;25395:6;25319:83;:::i;:::-;25309:93;;25119:293;25106:1;25103;25099:9;25094:14;;25059:353;;;25063:14;25428:3;25421:10;;24691:746;;;24521:916;;;;:::o;25443:681::-;25686:4;25724:2;25713:9;25709:18;25701:26;;25737:69;25803:1;25792:9;25788:17;25779:6;25737:69;:::i;:::-;25816:72;25884:2;25873:9;25869:18;25860:6;25816:72;:::i;:::-;25935:9;25929:4;25925:20;25920:2;25909:9;25905:18;25898:48;25963:154;26112:4;26103:6;25963:154;:::i;:::-;25955:162;;25443:681;;;;;;:::o;26130:148::-;26232:11;26269:3;26254:18;;26130:148;;;;:::o;26284:214::-;26424:66;26420:1;26412:6;26408:14;26401:90;26284:214;:::o;26504:402::-;26664:3;26685:85;26767:2;26762:3;26685:85;:::i;:::-;26678:92;;26779:93;26868:3;26779:93;:::i;:::-;26897:2;26892:3;26888:12;26881:19;;26504:402;;;:::o;26912:79::-;26951:7;26980:5;26969:16;;26912:79;;;:::o;26997:157::-;27102:45;27122:24;27140:5;27122:24;:::i;:::-;27102:45;:::i;:::-;27097:3;27090:58;26997:157;;:::o;27160:522::-;27373:3;27395:148;27539:3;27395:148;:::i;:::-;27388:155;;27553:75;27624:3;27615:6;27553:75;:::i;:::-;27653:2;27648:3;27644:12;27637:19;;27673:3;27666:10;;27160:522;;;;:::o;27688:173::-;27828:25;27824:1;27816:6;27812:14;27805:49;27688:173;:::o;27867:402::-;28027:3;28048:85;28130:2;28125:3;28048:85;:::i;:::-;28041:92;;28142:93;28231:3;28142:93;:::i;:::-;28260:2;28255:3;28251:12;28244:19;;27867:402;;;:::o;28275:99::-;28327:6;28361:5;28355:12;28345:22;;28275:99;;;:::o;28380:377::-;28486:3;28514:39;28547:5;28514:39;:::i;:::-;28569:89;28651:6;28646:3;28569:89;:::i;:::-;28562:96;;28667:52;28712:6;28707:3;28700:4;28693:5;28689:16;28667:52;:::i;:::-;28744:6;28739:3;28735:16;28728:23;;28490:267;28380:377;;;;:::o;28763:167::-;28903:19;28899:1;28891:6;28887:14;28880:43;28763:167;:::o;28936:402::-;29096:3;29117:85;29199:2;29194:3;29117:85;:::i;:::-;29110:92;;29211:93;29300:3;29211:93;:::i;:::-;29329:2;29324:3;29320:12;29313:19;;28936:402;;;:::o;29344:967::-;29726:3;29748:148;29892:3;29748:148;:::i;:::-;29741:155;;29913:95;30004:3;29995:6;29913:95;:::i;:::-;29906:102;;30025:148;30169:3;30025:148;:::i;:::-;30018:155;;30190:95;30281:3;30272:6;30190:95;:::i;:::-;30183:102;;30302:3;30295:10;;29344:967;;;;;:::o;30317:364::-;30405:3;30433:39;30466:5;30433:39;:::i;:::-;30488:71;30552:6;30547:3;30488:71;:::i;:::-;30481:78;;30568:52;30613:6;30608:3;30601:4;30594:5;30590:16;30568:52;:::i;:::-;30645:29;30667:6;30645:29;:::i;:::-;30640:3;30636:39;30629:46;;30409:272;30317:364;;;;:::o;30687:313::-;30800:4;30838:2;30827:9;30823:18;30815:26;;30887:9;30881:4;30877:20;30873:1;30862:9;30858:17;30851:47;30915:78;30988:4;30979:6;30915:78;:::i;:::-;30907:86;;30687:313;;;;:::o;31006:180::-;31054:77;31051:1;31044:88;31151:4;31148:1;31141:15;31175:4;31172:1;31165:15;31192:174;31332:26;31328:1;31320:6;31316:14;31309:50;31192:174;:::o;31372:366::-;31514:3;31535:67;31599:2;31594:3;31535:67;:::i;:::-;31528:74;;31611:93;31700:3;31611:93;:::i;:::-;31729:2;31724:3;31720:12;31713:19;;31372:366;;;:::o;31744:419::-;31910:4;31948:2;31937:9;31933:18;31925:26;;31997:9;31991:4;31987:20;31983:1;31972:9;31968:17;31961:47;32025:131;32151:4;32025:131;:::i;:::-;32017:139;;31744:419;;;:::o;32169:181::-;32309:33;32305:1;32297:6;32293:14;32286:57;32169:181;:::o;32356:366::-;32498:3;32519:67;32583:2;32578:3;32519:67;:::i;:::-;32512:74;;32595:93;32684:3;32595:93;:::i;:::-;32713:2;32708:3;32704:12;32697:19;;32356:366;;;:::o;32728:419::-;32894:4;32932:2;32921:9;32917:18;32909:26;;32981:9;32975:4;32971:20;32967:1;32956:9;32952:17;32945:47;33009:131;33135:4;33009:131;:::i;:::-;33001:139;;32728:419;;;:::o;33153:221::-;33293:34;33289:1;33281:6;33277:14;33270:58;33362:4;33357:2;33349:6;33345:15;33338:29;33153:221;:::o;33380:366::-;33522:3;33543:67;33607:2;33602:3;33543:67;:::i;:::-;33536:74;;33619:93;33708:3;33619:93;:::i;:::-;33737:2;33732:3;33728:12;33721:19;;33380:366;;;:::o;33752:419::-;33918:4;33956:2;33945:9;33941:18;33933:26;;34005:9;33999:4;33995:20;33991:1;33980:9;33976:17;33969:47;34033:131;34159:4;34033:131;:::i;:::-;34025:139;;33752:419;;;:::o;34177:221::-;34317:34;34313:1;34305:6;34301:14;34294:58;34386:4;34381:2;34373:6;34369:15;34362:29;34177:221;:::o;34404:366::-;34546:3;34567:67;34631:2;34626:3;34567:67;:::i;:::-;34560:74;;34643:93;34732:3;34643:93;:::i;:::-;34761:2;34756:3;34752:12;34745:19;;34404:366;;;:::o;34776:419::-;34942:4;34980:2;34969:9;34965:18;34957:26;;35029:9;35023:4;35019:20;35015:1;35004:9;35000:17;34993:47;35057:131;35183:4;35057:131;:::i;:::-;35049:139;;34776:419;;;:::o;35201:348::-;35241:7;35264:20;35282:1;35264:20;:::i;:::-;35259:25;;35298:20;35316:1;35298:20;:::i;:::-;35293:25;;35486:1;35418:66;35414:74;35411:1;35408:81;35403:1;35396:9;35389:17;35385:105;35382:131;;;35493:18;;:::i;:::-;35382:131;35541:1;35538;35534:9;35523:20;;35201:348;;;;:::o;35555:305::-;35595:3;35614:20;35632:1;35614:20;:::i;:::-;35609:25;;35648:20;35666:1;35648:20;:::i;:::-;35643:25;;35802:1;35734:66;35730:74;35727:1;35724:81;35721:107;;;35808:18;;:::i;:::-;35721:107;35852:1;35849;35845:9;35838:16;;35555:305;;;;:::o;35866:171::-;35905:3;35928:24;35946:5;35928:24;:::i;:::-;35919:33;;35974:4;35967:5;35964:15;35961:41;;;35982:18;;:::i;:::-;35961:41;36029:1;36022:5;36018:13;36011:20;;35866:171;;;:::o;36043:182::-;36183:34;36179:1;36171:6;36167:14;36160:58;36043:182;:::o;36231:366::-;36373:3;36394:67;36458:2;36453:3;36394:67;:::i;:::-;36387:74;;36470:93;36559:3;36470:93;:::i;:::-;36588:2;36583:3;36579:12;36572:19;;36231:366;;;:::o;36603:419::-;36769:4;36807:2;36796:9;36792:18;36784:26;;36856:9;36850:4;36846:20;36842:1;36831:9;36827:17;36820:47;36884:131;37010:4;36884:131;:::i;:::-;36876:139;;36603:419;;;:::o;37028:191::-;37068:4;37088:20;37106:1;37088:20;:::i;:::-;37083:25;;37122:20;37140:1;37122:20;:::i;:::-;37117:25;;37161:1;37158;37155:8;37152:34;;;37166:18;;:::i;:::-;37152:34;37211:1;37208;37204:9;37196:17;;37028:191;;;;:::o;37225:180::-;37273:77;37270:1;37263:88;37370:4;37367:1;37360:15;37394:4;37391:1;37384:15;37411:86;37446:7;37486:4;37479:5;37475:16;37464:27;;37411:86;;;:::o;37503:112::-;37586:22;37602:5;37586:22;:::i;:::-;37581:3;37574:35;37503:112;;:::o;37621:545::-;37794:4;37832:3;37821:9;37817:19;37809:27;;37846:71;37914:1;37903:9;37899:17;37890:6;37846:71;:::i;:::-;37927:68;37991:2;37980:9;37976:18;37967:6;37927:68;:::i;:::-;38005:72;38073:2;38062:9;38058:18;38049:6;38005:72;:::i;:::-;38087;38155:2;38144:9;38140:18;38131:6;38087:72;:::i;:::-;37621:545;;;;;;;:::o
Swarm Source
ipfs://ab309021aecef825c4e2dcd2360e27634f23c20390a47242403d9e2d95605d89
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.