Source Code
Latest 25 from a total of 394 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Validate Termina... | 3927747 | 935 days ago | IN | 0 GLMR | 0.02183619 | ||||
| Validate Termina... | 3927745 | 935 days ago | IN | 0 GLMR | 0.02885754 | ||||
| Start Terminatio... | 3927743 | 935 days ago | IN | 0 GLMR | 0.03281801 | ||||
| Declare Action | 3927679 | 935 days ago | IN | 0 GLMR | 0.00381596 | ||||
| Declare Action | 3927677 | 935 days ago | IN | 0 GLMR | 0.00393241 | ||||
| Transfer | 3927640 | 935 days ago | IN | 40 GLMR | 0.00726639 | ||||
| Set Process Cost | 3927637 | 935 days ago | IN | 0 GLMR | 0.02510326 | ||||
| Set Process Cost | 3927635 | 935 days ago | IN | 0 GLMR | 0.03635349 | ||||
| Create Process | 3927633 | 935 days ago | IN | 0 GLMR | 0.06754308 | ||||
| Validate Termina... | 3927579 | 935 days ago | IN | 0 GLMR | 0.021872 | ||||
| Validate Termina... | 3927577 | 935 days ago | IN | 0 GLMR | 0.02876205 | ||||
| Start Terminatio... | 3927575 | 935 days ago | IN | 0 GLMR | 0.03414588 | ||||
| Declare Action | 3927511 | 935 days ago | IN | 0 GLMR | 0.00384257 | ||||
| Declare Action | 3927509 | 935 days ago | IN | 0 GLMR | 0.00396172 | ||||
| Transfer | 3927474 | 935 days ago | IN | 40 GLMR | 0.00989744 | ||||
| Set Process Cost | 3927471 | 935 days ago | IN | 0 GLMR | 0.02520544 | ||||
| Set Process Cost | 3927469 | 935 days ago | IN | 0 GLMR | 0.03557162 | ||||
| Create Process | 3927467 | 935 days ago | IN | 0 GLMR | 0.05758613 | ||||
| Create Process | 3926053 | 936 days ago | IN | 0 GLMR | 0.05791941 | ||||
| Create Process | 3926027 | 936 days ago | IN | 0 GLMR | 0.05856051 | ||||
| Create Process | 3922920 | 936 days ago | IN | 0 GLMR | 0.05990723 | ||||
| Validate Termina... | 3820880 | 950 days ago | IN | 0 GLMR | 0.02195053 | ||||
| Validate Termina... | 3820878 | 950 days ago | IN | 0 GLMR | 0.02974163 | ||||
| Start Terminatio... | 3820876 | 950 days ago | IN | 0 GLMR | 0.03258816 | ||||
| Declare Action | 3820870 | 951 days ago | IN | 0 GLMR | 0.00381753 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3927747 | 935 days ago | 0.004 GLMR | ||||
| 3927747 | 935 days ago | 0.064 GLMR | ||||
| 3927747 | 935 days ago | 0.006 GLMR | ||||
| 3927747 | 935 days ago | 0.006 GLMR | ||||
| 3927640 | 935 days ago | 39.92 GLMR | ||||
| 3927579 | 935 days ago | 0.004 GLMR | ||||
| 3927579 | 935 days ago | 0.064 GLMR | ||||
| 3927579 | 935 days ago | 0.0072 GLMR | ||||
| 3927579 | 935 days ago | 0.0048 GLMR | ||||
| 3927474 | 935 days ago | 39.92 GLMR | ||||
| 3820880 | 950 days ago | 0.00465 GLMR | ||||
| 3820880 | 950 days ago | 0.0744 GLMR | ||||
| 3820880 | 950 days ago | 0.0104625 GLMR | ||||
| 3820880 | 950 days ago | 0.0034875 GLMR | ||||
| 3820832 | 951 days ago | 46.407 GLMR | ||||
| 3820604 | 951 days ago | 0.00492 GLMR | ||||
| 3820604 | 951 days ago | 0.07872 GLMR | ||||
| 3820604 | 951 days ago | 0.01107 GLMR | ||||
| 3820604 | 951 days ago | 0.00369 GLMR | ||||
| 3820557 | 951 days ago | 49.1016 GLMR | ||||
| 3815091 | 951 days ago | 0.0051 GLMR | ||||
| 3815091 | 951 days ago | 0.0816 GLMR | ||||
| 3815091 | 951 days ago | 0.00918 GLMR | ||||
| 3815091 | 951 days ago | 0.00612 GLMR | ||||
| 3815044 | 951 days ago | 50.898 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
YandaMultitokenProtocolV1
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-11-28 */ // Sources flattened with hardhat v2.12.0 https://hardhat.org // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // 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); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * 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()); } } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/YandaMultitokenProtocolV1.sol // SPDX-License-Identifier: GNU GPLv3 pragma solidity ^0.8.3; contract YandaMultitokenProtocolV1 is AccessControl{ using SafeMath for uint256; using SafeERC20 for IERC20; uint internal TIME_FRAME_SIZE; uint internal VALIDATORS_PERC; uint internal BROKER_PERC; uint internal FEE_NOMINATOR; uint internal FEE_DENOMINATOR; uint internal _penaltyPerc; uint internal _lockingPeriod; uint256 internal _totalStaked; IERC20 internal _tokenContract; address payable internal _beneficiary; enum State { AWAITING_COST, AWAITING_TRANSFER, AWAITING_TERMINATION, AWAITING_VALIDATION, COMPLETED } struct Process { State state; uint256 cost; uint256 costConf; address token; address payable deposit; address payable depositConf; uint256 fee; address service; bytes32 productId; uint256 startBlock; address[] validatorsList; address firstValidator; bool firstResult; address secondValidator; bool secondResult; } struct Service { address[] validators; uint validationPerc; uint commissionPerc; uint validatorVersion; } struct Stake { uint256 amount; uint256 unlockingBlock; } mapping(address => mapping(bytes32 => Process)) internal _processes; mapping(address => bytes32) internal _depositingProducts; mapping(address => Service) internal _services; mapping(address => uint256) internal _stakesByValidators; mapping(address => address[]) internal _validatorStakers; mapping(address => mapping(address => Stake)) internal _stakes; event Deposit( address indexed customer, address indexed service, bytes32 indexed productId, uint256 weiAmount ); event Action( address indexed customer, address indexed service, bytes32 indexed productId, string data ); event Terminate( address indexed customer, address indexed service, bytes32 indexed productId, address[] validatorsList ); event Complete( address indexed customer, address indexed service, bytes32 indexed productId, bool success ); event CostRequest( address indexed customer, address indexed service, bytes32 indexed productId, address[] validatorsList, string data ); event CostResponse( address indexed customer, address indexed service, bytes32 indexed productId, uint cost ); event Staked( address indexed staker, address indexed validator, uint256 amount, uint256 unlockingBlock ); event UnStaked( address indexed staker, address indexed validator, uint256 amount ); modifier onlyService() { require(_services[msg.sender].validators.length > 0, "Only service can call this method"); _; } constructor(uint penaltyPerc, uint lockingPeriod, address token) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _beneficiary = payable(msg.sender); _penaltyPerc = penaltyPerc; _lockingPeriod = lockingPeriod; _tokenContract = IERC20(token); VALIDATORS_PERC = 15; BROKER_PERC = 80; FEE_NOMINATOR = 2; FEE_DENOMINATOR = 1000; TIME_FRAME_SIZE = 10; } function _containsAddress(address[] memory array, address search) internal pure returns(bool) { for(uint x=0; x < array.length; x++) { if (array[x] == search) { return true; } } return false; } function setBeneficiary(address payable newAddr) external onlyRole(DEFAULT_ADMIN_ROLE) { _beneficiary = newAddr; } function setDefaultPerc(uint vPerc, uint bPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { VALIDATORS_PERC = vPerc; BROKER_PERC = bPerc; } function setProtocolFee(uint nominator, uint denominator) external onlyRole(DEFAULT_ADMIN_ROLE) { FEE_NOMINATOR = nominator; FEE_DENOMINATOR = denominator; } function setValidationTimeFrame(uint blocks) external onlyRole(DEFAULT_ADMIN_ROLE) { TIME_FRAME_SIZE = blocks; } function getValidationTimeFrame() external view returns(uint) { return TIME_FRAME_SIZE; } function getStakingTokenAddr() external view returns(address) { return address(_tokenContract); } receive() external payable { address sender = _msgSender(); Process storage process = _processes[sender][_depositingProducts[sender]]; require(process.token == address(0), "The current process wait for an ERC20 token deposit"); require(process.state == State.AWAITING_TRANSFER, "You don't have a deposit awaiting process, please create it first"); require(process.cost == msg.value, "Deposit amount doesn't match with the requested deposit"); // Transfer main payment from customer to the broker(subtracting the fee) process.deposit.transfer(msg.value.sub(process.fee)); // Update process state and emit an event process.state = State.AWAITING_TERMINATION; emit Deposit(sender, process.service, process.productId, msg.value); } function addService(address service, address[] memory vList) external onlyRole(DEFAULT_ADMIN_ROLE) { require(vList.length > 2, "Validators minimum quantity is 3"); _services[service] = Service({validators: vList, validationPerc: VALIDATORS_PERC, commissionPerc: BROKER_PERC, validatorVersion: 1}); } function setServicePerc(address service, uint vPerc, uint bPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { Service storage instance = _services[service]; instance.validationPerc = vPerc; instance.commissionPerc = bPerc; } function setValidators(address[] memory vList) external onlyService { _services[msg.sender].validators = vList; } function getValidatorVer(address service) external view returns(uint) { return _services[service].validatorVersion; } function setValidatorVer(uint vVer) external onlyService { _services[msg.sender].validatorVersion = vVer; } function getPenaltyPerc() external view returns(uint) { return _penaltyPerc; } function setPenaltyPerc(uint newPenaltyPerc) external onlyRole(DEFAULT_ADMIN_ROLE) { _penaltyPerc = newPenaltyPerc; } function getLockingPeriod() external view returns(uint256) { return _lockingPeriod; } function setLockingPeriod(uint256 newLockingPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) { _lockingPeriod = newLockingPeriod; } function inTimeFrame(address[] memory list, address search, uint256 startBlock, uint intSize) internal view returns(bool) { for(uint x=0; x < list.length; x++) { if(list[x] == search) { return ( (x * intSize) <= (block.number - startBlock) && (block.number - startBlock) < (x * intSize + intSize) ); } } return false; } function random() internal view returns(uint256) { // Temp solution with fake random // TODO resolve with real randomness return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))); } function _randValidatorsList(address service, address exclude1, address exclude2) internal view returns(address[] memory) { uint256 localTotalStaked = _totalStaked - _stakesByValidators[exclude1] - _stakesByValidators[exclude2]; uint256 index = 0; uint resultLength = _services[service].validators.length; if (exclude1 != address(0)) { resultLength -= 1; } if (exclude2 != address(0)) { resultLength -= 1; } address[] memory result = new address[](resultLength); for(uint x=0; x < result.length; x++) { index = random() % localTotalStaked; for(uint y=0; y < _services[service].validators.length; y++) { if (_services[service].validators[y] != exclude1 && _services[service].validators[y] != exclude2) { if (_containsAddress(result, _services[service].validators[y]) == false) { if (index <= _stakesByValidators[_services[service].validators[y]]) { result[x] = _services[service].validators[y]; localTotalStaked -= _stakesByValidators[_services[service].validators[y]]; break; } index -= _stakesByValidators[_services[service].validators[y]]; } } } } return result; } function _createProcess(address token, address service, bytes32 productId, string calldata data) internal { require(_services[service].validationPerc > 0, 'Requested service address not found'); require(_processes[msg.sender][productId].service == address(0), 'Process with specified productId already exist'); _processes[msg.sender][productId] = Process({ state: State.AWAITING_COST, cost: 0, costConf: 0, token: token, deposit: payable(address(0)), depositConf: payable(address(0)), fee: 0, service: service, productId: productId, startBlock: block.number, validatorsList: _randValidatorsList(service, address(0), address(0)), firstValidator: address(0), firstResult: false, secondValidator: address(0), secondResult: false }); emit CostRequest(msg.sender, service, productId, _processes[msg.sender][productId].validatorsList, data); if(_depositingProducts[msg.sender].length > 0) { if(_processes[msg.sender][_depositingProducts[msg.sender]].state == State.AWAITING_TRANSFER) { delete _processes[msg.sender][_depositingProducts[msg.sender]]; } } _depositingProducts[msg.sender] = productId; } function createProcess(address service, bytes32 productId, string calldata data) external { _createProcess(address(0), service, productId, data); } function createProcess(address token, address service, bytes32 productId, string calldata data) external { _createProcess(token, service, productId, data); } function _rewardLoop(address validator, uint256 reward, address token) internal returns(uint256) { uint256 transfersSum = 0; IERC20 tokenContract; if(token != address(0)) { tokenContract = IERC20(token); } for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; Stake storage stakeRecord = _stakes[staker][validator]; // Calc reward share according to the staked amount uint256 transferAmount = reward.mul(stakeRecord.amount.mul(100).div(_stakesByValidators[validator])).div(100); // Transfer reward to the staker if(token == address(0)) { payable(staker).transfer(transferAmount); } else { tokenContract.transfer(staker, transferAmount); } transfersSum += transferAmount; } return transfersSum; } function _bonusLoop(address validator, uint256 bonus) internal returns(uint256) { uint256 transfersSum = 0; for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; // Calc bonus share according to the staked amount uint256 transferAmount = bonus.mul(_stakes[staker][validator].amount.mul(100).div(_stakesByValidators[validator])).div(100); // Increase stake with bonus _stakes[staker][validator].amount = _stakes[staker][validator].amount.add(transferAmount); transfersSum += transferAmount; } return transfersSum; } function _rewardStakers(address firstValidator, address secondValidator, uint256 rewardAmount, address token) internal returns(uint256) { uint256 firstReward = rewardAmount.mul(_stakesByValidators[firstValidator].mul(100).div(_stakesByValidators[firstValidator].add(_stakesByValidators[secondValidator]))).div(100); uint256 secondReward = rewardAmount - firstReward; uint256 firstRewardTsSum = _rewardLoop(firstValidator, firstReward, token); uint256 secondRewardTsSum = _rewardLoop(secondValidator, secondReward, token); return firstRewardTsSum + secondRewardTsSum; } function _rewardBonus(address firstValidator, address secondValidator, uint256 bonus) internal { uint256 firstBonus = bonus.mul(_stakesByValidators[firstValidator].mul(100).div(_stakesByValidators[firstValidator].add(_stakesByValidators[secondValidator]))).div(100); uint256 secondBonus = bonus - firstBonus; uint256 firstBonusTsSum = _bonusLoop(firstValidator, firstBonus); uint256 secondBonusTsSum = _bonusLoop(secondValidator, secondBonus); _stakesByValidators[firstValidator] += firstBonusTsSum; _stakesByValidators[secondValidator] += secondBonusTsSum; } function _makePayouts(address customer, bytes32 productId, bool needRefund, uint256 bonus) internal { Process storage process = _processes[customer][productId]; uint256 reward_amount = process.fee.mul(_services[process.service].validationPerc).div(100); uint256 transfers_sum = _rewardStakers(process.firstValidator, process.secondValidator, reward_amount, process.token); if(bonus > 0) { _rewardBonus(process.firstValidator, process.secondValidator, bonus); } if(needRefund == false) { uint256 commission_amount = process.fee.mul(_services[process.service].commissionPerc).div(100); if(process.token == address(0)) { payable(process.service).transfer(commission_amount); _beneficiary.transfer(process.fee - transfers_sum - commission_amount); } else { IERC20 tokenContract = IERC20(process.token); tokenContract.transfer(process.service, commission_amount); tokenContract.transfer(address(_beneficiary), process.fee - transfers_sum - commission_amount); } } else { if(process.token == address(0)) { payable(customer).transfer(process.fee - transfers_sum); } else { IERC20 tokenContract = IERC20(process.token); tokenContract.transfer(customer, process.fee - transfers_sum); } } } function _penalizeLoop(address validator, uint256 penalty) internal returns(uint256) { uint256 transfersSum = 0; for (uint256 i = 0; i < _validatorStakers[validator].length; i++) { address staker = _validatorStakers[validator][i]; uint256 transferAmount = penalty.mul(_stakes[staker][validator].amount.mul(100).div(_stakesByValidators[validator])).div(100); _stakes[staker][validator].amount = _stakes[staker][validator].amount - transferAmount; transfersSum += transferAmount; } // Subtract penalty from the validator total stakes amount _stakesByValidators[validator] -= transfersSum; return transfersSum; } function setProcessCost(address customer, bytes32 productId, uint256 cost, address payable depositAddr) external { require(_stakesByValidators[msg.sender] > 0, "Only validator with stakes can call this method"); Process storage process = _processes[customer][productId]; require(_containsAddress(_services[process.service].validators, msg.sender), "Your address is not whitelisted in the product service settings"); require(process.state == State.AWAITING_COST, "Cost is already set, check the state"); require( inTimeFrame( process.validatorsList, msg.sender, process.startBlock, TIME_FRAME_SIZE ), "Cannot accept validation, you are out of time" ); if(process.firstValidator == address(0)) { process.firstValidator = msg.sender; process.cost = cost; process.deposit = depositAddr; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, address(0)); emit CostRequest(customer, process.service, productId, process.validatorsList, ''); } else if(process.secondValidator == address(0)) { process.secondValidator = msg.sender; process.costConf = cost; process.depositConf = depositAddr; if(process.cost == process.costConf && process.deposit == process.depositConf) { process.fee = cost.mul(FEE_NOMINATOR).div(FEE_DENOMINATOR); process.state = State.AWAITING_TRANSFER; emit CostResponse(customer, process.service, productId, cost); } else { process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, process.secondValidator); emit CostRequest(customer, process.service, productId, process.validatorsList, ''); } } else { if(process.cost == cost && process.deposit == depositAddr) { process.secondValidator = msg.sender; process.costConf = cost; process.depositConf = depositAddr; } else { process.firstValidator = msg.sender; process.cost = cost; process.deposit = depositAddr; } process.cost = cost; process.fee = cost.mul(FEE_NOMINATOR).div(FEE_DENOMINATOR); process.state = State.AWAITING_TRANSFER; emit CostResponse(customer, process.service, productId, cost); } } function declareAction(address customer, bytes32 productId, string calldata data) external onlyService { emit Action(customer, msg.sender, productId, data); } function startTermination(address customer, bytes32 productId) external { require((_services[msg.sender].validationPerc > 0) || (msg.sender == customer), "Only service or product customer can call this method"); Process storage process = _processes[customer][productId]; require(process.state == State.AWAITING_TERMINATION, "Cannot start termination, check the state"); process.state = State.AWAITING_VALIDATION; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, address(0), address(0)); process.firstValidator = address(0); process.firstResult = false; process.secondValidator = address(0); process.secondResult = false; emit Terminate(customer, msg.sender, productId, process.validatorsList); } function validateTermination(address customer, bytes32 productId, bool result) external { require(_stakesByValidators[msg.sender] > 0, "Only validator with stakes can call this method"); Process storage process = _processes[customer][productId]; require(_containsAddress(_services[process.service].validators, msg.sender), "Your address is not whitelisted in the product service settings"); require(process.state == State.AWAITING_VALIDATION, "Cannot accept validation, check the state"); require( inTimeFrame( process.validatorsList, msg.sender, process.startBlock, TIME_FRAME_SIZE ), "Cannot accept validation, you are out of time" ); // If we don't have first validator response yet if(process.firstValidator == address(0)) { process.firstValidator = msg.sender; process.firstResult = result; process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, address(0)); emit Terminate(customer, process.service, productId, process.validatorsList); // If we have first validator response but not the second one } else if(process.secondValidator == address(0)) { process.secondValidator = msg.sender; process.secondResult = result; // If the first and second validator results match if(process.firstResult == process.secondResult) { _makePayouts(customer, productId, !process.firstResult, 0); process.state = State.COMPLETED; emit Complete(customer, process.service, productId, process.firstResult); // If the first and second validator results do not match } else { process.startBlock = block.number; process.validatorsList = _randValidatorsList(process.service, process.firstValidator, process.secondValidator); emit Terminate(customer, process.service, productId, process.validatorsList); } // If we have received the third validator response } else { if(process.firstResult == result) { uint256 penalty = _stakesByValidators[process.secondValidator].mul(_penaltyPerc).div(100); uint256 appliedPenalty = _penalizeLoop(process.secondValidator, penalty); process.secondValidator = msg.sender; process.secondResult = result; _makePayouts(customer, productId, !process.firstResult, appliedPenalty); } else { uint256 penalty = _stakesByValidators[process.firstValidator].mul(_penaltyPerc).div(100); uint256 appliedPenalty = _penalizeLoop(process.firstValidator, penalty); process.firstValidator = msg.sender; process.firstResult = result; _makePayouts(customer, productId, !process.firstResult, appliedPenalty); } process.state = State.COMPLETED; emit Complete(customer, process.service, productId, process.firstResult); } } function getProcess(address customer, bytes32 productId) external view returns(Process memory) { return _processes[customer][productId]; } function stake(address validator, uint256 amount) external { require(validator != address(0), "Validator address cannot be 0"); require(amount > 0, "Cannot stake 0"); bool success = _tokenContract.transferFrom(msg.sender, address(this), amount); if(success) { _totalStaked = _totalStaked.add(amount); bool alreadyStaked = false; if (_stakes[msg.sender][validator].amount > 0) { alreadyStaked = true; } _stakes[msg.sender][validator].amount = _stakes[msg.sender][validator].amount.add(amount); _stakes[msg.sender][validator].unlockingBlock = block.number + _lockingPeriod; _stakesByValidators[validator] = _stakesByValidators[validator].add(amount); if (alreadyStaked == false && _containsAddress(_validatorStakers[validator], msg.sender) == false) { _validatorStakers[validator].push(msg.sender); } emit Staked(msg.sender, validator, amount, _stakes[msg.sender][validator].unlockingBlock); } else { revert("Wasn't able to transfer your token"); } } function unStake(address validator, uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(_stakes[msg.sender][validator].amount >= amount, "Your balance is lower than the amount of tokens you want to unstake"); // Check locking period require(_stakes[msg.sender][validator].unlockingBlock <= block.number, "The locking period didn't pass, you cannot unstake"); // This will transfer the amount of token from contract to the sender balance bool success = _tokenContract.transfer(msg.sender, amount); if(success) { _totalStaked -= amount; _stakes[msg.sender][validator].amount = _stakes[msg.sender][validator].amount - amount; _stakesByValidators[validator] = _stakesByValidators[validator] - amount; emit UnStaked(msg.sender, validator, amount); } else { revert("Wasn't able to execute transfer of your tokens"); } } function stakeOf(address staker, address validator) external view returns (Stake memory) { return _stakes[staker][validator]; } function totalStakeOf(address validator) external view returns (uint256) { return _stakesByValidators[validator]; } function totalStaked() external view returns (uint256) { return _totalStaked; } function deposit(uint256 amount) external { Process storage process = _processes[msg.sender][_depositingProducts[msg.sender]]; require(process.token != address(0), "The current process doesn't wait for an ERC20 token deposit"); require(process.state == State.AWAITING_TRANSFER, "You don't have a deposit awaiting process, please create it first"); require(process.cost == amount, "Deposit amount doesn't match with the requested cost"); // Create ERC20 token interface IERC20 tokenContract = IERC20(process.token); // Transfer deposit payment from customer to the contract tokenContract.safeTransferFrom(_msgSender(), address(this), amount); // Transfer main payment from contract to the broker(subtracting the fee) tokenContract.safeTransfer(address(process.deposit), amount.sub(process.fee)); // Update process state and emit an event process.state = State.AWAITING_TERMINATION; emit Deposit(_msgSender(), process.service, process.productId, amount); // TODO find out is it possible to revert function call after one of the safe transfers failed? } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"penaltyPerc","type":"uint256"},{"internalType":"uint256","name":"lockingPeriod","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"Action","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"Complete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"validatorsList","type":"address[]"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"CostRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"CostResponse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"validator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockingBlock","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"validatorsList","type":"address[]"}],"name":"Terminate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"validator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"address[]","name":"vList","type":"address[]"}],"name":"addService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"data","type":"string"}],"name":"createProcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"data","type":"string"}],"name":"createProcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"string","name":"data","type":"string"}],"name":"declareAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLockingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"getProcess","outputs":[{"components":[{"internalType":"enum YandaMultitokenProtocolV1.State","name":"state","type":"uint8"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"costConf","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"deposit","type":"address"},{"internalType":"address payable","name":"depositConf","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"service","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"address[]","name":"validatorsList","type":"address[]"},{"internalType":"address","name":"firstValidator","type":"address"},{"internalType":"bool","name":"firstResult","type":"bool"},{"internalType":"address","name":"secondValidator","type":"address"},{"internalType":"bool","name":"secondResult","type":"bool"}],"internalType":"struct YandaMultitokenProtocolV1.Process","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingTokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getValidationTimeFrame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"}],"name":"getValidatorVer","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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddr","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vPerc","type":"uint256"},{"internalType":"uint256","name":"bPerc","type":"uint256"}],"name":"setDefaultPerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockingPeriod","type":"uint256"}],"name":"setLockingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"setPenaltyPerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"address payable","name":"depositAddr","type":"address"}],"name":"setProcessCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nominator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"vPerc","type":"uint256"},{"internalType":"uint256","name":"bPerc","type":"uint256"}],"name":"setServicePerc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setValidationTimeFrame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vVer","type":"uint256"}],"name":"setValidatorVer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"vList","type":"address[]"}],"name":"setValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"validator","type":"address"}],"name":"stakeOf","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockingBlock","type":"uint256"}],"internalType":"struct YandaMultitokenProtocolV1.Stake","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"startTermination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"name":"totalStakeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"result","type":"bool"}],"name":"validateTermination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162004aca38038062004aca833981016040819052620000349162000137565b6200004160003362000096565b600a8054336001600160a01b0319918216178255600694909455600792909255600980549093166001600160a01b039190911617909155600f600290815560506003556004556103e86005556001556200017d565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000133576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000f23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000606084860312156200014c578283fd5b83516020850151604086015191945092506001600160a01b038116811462000172578182fd5b809150509250925092565b61493d806200018d6000396000f3fe6080604052600436106102085760003560e01c806384f3ca4111610118578063b6b55f25116100a0578063e3f56eaa1161006f578063e3f56eaa14610857578063e9b873871461088d578063ef4604a9146108ba578063fd09b15f146108da578063fd6d2dcf146108fa5761040f565b8063b6b55f2514610773578063ce4cb87614610793578063d547741f14610817578063d9393814146108375761040f565b806391d14854116100e757806391d14854146106de5780639300c926146106fe5780639e7455eb1461071e578063a217fddf1461073e578063adc9772e146107535761040f565b806384f3ca41146106615780638670fdd91461068957806389bf146a1461069e57806389f18983146106be5761040f565b80632f2ff15d1161019b578063402fbbd81161016a578063402fbbd8146105e25780635f96529f146105f757806363de06f814610617578063787ef24214610637578063817b1cd21461064c5761040f565b80632f2ff15d146105625780633293025c1461058257806336568abe146105a257806338f8f528146105c25761040f565b80631c31f710116101d75780631c31f710146104d2578063240de277146104f2578063248a9ca31461051257806326b321d1146105425761040f565b806301ffc9a71461041457806304f32b5d146104495780630cb395db1461046b5780630e53e633146104b25761040f565b3661040f57336000818152600b60209081526040808320600c8352818420548452909152902060038101546001600160a01b0316156102aa5760405162461bcd60e51b815260206004820152603360248201527f5468652063757272656e742070726f63657373207761697420666f7220616e20604482015272115490cc8c081d1bdad95b8819195c1bdcda5d606a1b60648201526084015b60405180910390fd5b6001815460ff1660048111156102d057634e487b7160e01b600052602160045260246000fd5b146102ed5760405162461bcd60e51b81526004016102a1906145f7565b348160010154146103665760405162461bcd60e51b815260206004820152603760248201527f4465706f73697420616d6f756e7420646f65736e2774206d617463682077697460448201527f682074686520726571756573746564206465706f73697400000000000000000060648201526084016102a1565b600481015460068201546001600160a01b03909116906108fc9061038b90349061091a565b6040518115909202916000818181858888f193505050501580156103b3573d6000803e3d6000fd5b50805460ff19166002178155600881015460078201546040513481526001600160a01b03918216918516907f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b9060200160405180910390a45050005b600080fd5b34801561042057600080fd5b5061043461042f3660046142ab565b61092f565b60405190151581526020015b60405180910390f35b34801561045557600080fd5b50610469610464366004614149565b610968565b005b34801561047757600080fd5b506104a4610486366004613fca565b6001600160a01b03166000908152600d602052604090206003015490565b604051908152602001610440565b3480156104be57600080fd5b506104696104cd3660046140dd565b6109e8565b3480156104de57600080fd5b506104696104ed366004613fca565b610bd3565b3480156104fe57600080fd5b5061046961050d3660046142d3565b610c01565b34801561051e57600080fd5b506104a461052d36600461426f565b60009081526020819052604090206001015490565b34801561054e57600080fd5b5061046961055d36600461426f565b610c18565b34801561056e57600080fd5b5061046961057d366004614287565b610c29565b34801561058e57600080fd5b5061046961059d36600461426f565b610c53565b3480156105ae57600080fd5b506104696105bd366004614287565b610c64565b3480156105ce57600080fd5b506104696105dd366004614149565b610ce2565b3480156105ee57600080fd5b506007546104a4565b34801561060357600080fd5b5061046961061236600461401e565b610cf6565b34801561062357600080fd5b5061046961063236600461426f565b610d0a565b34801561064357600080fd5b506001546104a4565b34801561065857600080fd5b506008546104a4565b34801561066d57600080fd5b506009546040516001600160a01b039091168152602001610440565b34801561069557600080fd5b506006546104a4565b3480156106aa57600080fd5b506104696106b9366004614108565b610d4b565b3480156106ca57600080fd5b506104696106d936600461426f565b6112d2565b3480156106ea57600080fd5b506104346106f9366004614287565b6112e3565b34801561070a57600080fd5b50610469610719366004614220565b61130c565b34801561072a57600080fd5b506104696107393660046141a3565b611358565b34801561074a57600080fd5b506104a4600081565b34801561075f57600080fd5b5061046961076e3660046140dd565b611838565b34801561077f57600080fd5b5061046961078e36600461426f565b611bc8565b34801561079f57600080fd5b506107fc6107ae366004613fe6565b604080518082018252600080825260209182018190526001600160a01b0394851681526010825282812093909416845291825291829020825180840190935280548352600101549082015290565b60408051825181526020928301519281019290925201610440565b34801561082357600080fd5b50610469610832366004614287565b611dc3565b34801561084357600080fd5b506104696108523660046140dd565b611de8565b34801561086357600080fd5b506104a4610872366004613fca565b6001600160a01b03166000908152600e602052604090205490565b34801561089957600080fd5b506108ad6108a83660046140dd565b612129565b604051610440919061469f565b3480156108c657600080fd5b506104696108d53660046141ec565b612331565b3480156108e657600080fd5b506104696108f536600461408f565b612364565b34801561090657600080fd5b506104696109153660046142d3565b612439565b60006109268284614819565b90505b92915050565b60006001600160e01b03198216637965db0b60e01b148061096057506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b336000908152600d60205260409020546109945760405162461bcd60e51b81526004016102a19061465e565b82336001600160a01b0316856001600160a01b03167fb67fab32200b6a6d186136689c0b4c4072ae0bd5dd17b98fb8105d1b9747939985856040516109da9291906144b7565b60405180910390a450505050565b336000908152600d6020526040902060010154151580610a105750336001600160a01b038316145b610a7a5760405162461bcd60e51b815260206004820152603560248201527f4f6e6c792073657276696365206f722070726f6475637420637573746f6d65726044820152740818d85b8818d85b1b081d1a1a5cc81b595d1a1bd9605a1b60648201526084016102a1565b6001600160a01b0382166000908152600b6020908152604080832084845290915290206002815460ff166004811115610ac357634e487b7160e01b600052602160045260246000fd5b14610b225760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207374617274207465726d696e6174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102a1565b805460ff191660031781554360098201556007810154610b4d906001600160a01b0316600080612450565b8051610b6391600a840191602090910190613e3f565b50600b810180546001600160a81b0319908116909155600c820180549091169055604051829033906001600160a01b038616907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610bc690600a87019061444f565b60405180910390a4505050565b6000610bde8161288e565b50600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c0c8161288e565b50600491909155600555565b6000610c238161288e565b50600755565b600082815260208190526040902060010154610c448161288e565b610c4e838361289b565b505050565b6000610c5e8161288e565b50600655565b6001600160a01b0381163314610cd45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016102a1565b610cde828261291f565b5050565b610cf0600085858585612984565b50505050565b610d038585858585612984565b5050505050565b336000908152600d6020526040902054610d365760405162461bcd60e51b81526004016102a19061465e565b336000908152600d6020526040902060030155565b336000908152600e6020526040902054610d775760405162461bcd60e51b81526004016102a1906144fe565b6001600160a01b038084166000908152600b60209081526040808320868452825280832060078101549094168352600d8252918290208054835181840281018401909452808452610e079392830182828015610dfc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dde575b505050505033612dee565b610e235760405162461bcd60e51b81526004016102a19061459a565b6003815460ff166004811115610e4957634e487b7160e01b600052602160045260246000fd5b14610ea85760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102a1565b610f1681600a01805480602002602001604051908101604052809291908181526020018280548015610f0357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ee5575b5050505050338360090154600154612e62565b610f325760405162461bcd60e51b81526004016102a19061454d565b600b8101546001600160a01b0316610ffc57600b810180546001600160a81b0319163360ff60a01b191617600160a01b8415150217908190554360098301556007820154610f8e916001600160a01b0391821691166000612450565b8051610fa491600a840191602090910190613e3f565b50600781015460405184916001600160a01b0390811691908716907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610fef90600a87019061444f565b60405180910390a4610cf0565b600c8101546001600160a01b031661111757600c810180546001600160a81b0319163360ff60a01b191617600160a01b84151581029190911791829055600b8301549181900460ff90811615159190920491909116151514156110e457611078848483600b0160149054906101000a900460ff16156000612f16565b8054600460ff199091161781556007810154600b82015460408051600160a01b90920460ff16151582525185926001600160a01b0390811692908816917f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b709181900360200190a4611112565b4360098201556007810154600b820154600c830154610f8e926001600160a01b039081169281169116612450565b610cf0565b600b81015460ff600160a01b90910416151582151514156111d757600654600c8201546001600160a01b03166000908152600e6020526040812054909161116b9160649161116591906132fc565b90613308565b600c830154909150600090611189906001600160a01b031683613314565b600c840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117909155600b8501549192506111d0918891889160ff919004161584612f16565b505061126d565b600654600b8201546001600160a01b03166000908152600e6020526040812054909161120a9160649161116591906132fc565b600b830154909150600090611228906001600160a01b031683613314565b600b840180546001600160a81b0319163360ff60a01b191617600160a01b8715158102919091179182905591925061126a918891889160ff9104161584612f16565b50505b8054600460ff199091161781556007810154600b820154604051600160a01b90910460ff161515815284916001600160a01b0390811691908716907f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b70906020016109da565b60006112dd8161288e565b50600155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336000908152600d60205260409020546113385760405162461bcd60e51b81526004016102a19061465e565b336000908152600d602090815260409091208251610cde92840190613e3f565b336000908152600e60205260409020546113845760405162461bcd60e51b81526004016102a1906144fe565b6001600160a01b038085166000908152600b60209081526040808320878452825280832060078101549094168352600d82529182902080548351818402810184019094528084526114129392830182828015610dfc576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610dde57505050505033612dee565b61142e5760405162461bcd60e51b81526004016102a19061459a565b6000815460ff16600481111561145457634e487b7160e01b600052602160045260246000fd5b146114ad5760405162461bcd60e51b8152602060048201526024808201527f436f737420697320616c7265616479207365742c20636865636b2074686520736044820152637461746560e01b60648201526084016102a1565b61151981600a01805480602002602001604051908101604052809291908181526020018280548015610f03576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610ee5575050505050338360090154600154612e62565b6115355760405162461bcd60e51b81526004016102a19061454d565b600b8101546001600160a01b031661160657600b810180546001600160a01b031990811633908117909255600183018590556004830180546001600160a01b03868116919093161790554360098401556007830154611598929116906000612450565b80516115ae91600a840191602090910190613e3f565b50600781015460405185916001600160a01b0390811691908816907fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d89906115f990600a870190614492565b60405180910390a4610d03565b600c8101546001600160a01b031661172557600c81018054336001600160a01b031991821617909155600282018490556005820180549091166001600160a01b0384161790556001810154831480156116735750600581015460048201546001600160a01b039081169116145b156116f257611693600554611165600454866132fc90919063ffffffff16565b6006820155805460ff19166001178155600781015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a4611720565b4360098201556007810154600b820154600c830154611598926001600160a01b039081169281169116612450565b610d03565b828160010154148015611747575060048101546001600160a01b038381169116145b1561178557600c81018054336001600160a01b031991821617909155600282018490556005820180549091166001600160a01b0384161790556117ba565b600b81018054336001600160a01b031991821617909155600182018490556004820180549091166001600160a01b0384161790555b600181018390556005546004546117d791906111659086906132fc565b6006820155805460ff19166001178155600781015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a45050505050565b6001600160a01b03821661188e5760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220616464726573732063616e6e6f74206265203000000060448201526064016102a1565b600081116118cf5760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b60448201526064016102a1565b6009546040516323b872dd60e01b8152336004820152306024820152604481018390526000916001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561192257600080fd5b505af1158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190614253565b90508015611b755760085461196f9083613481565b6008553360009081526010602090815260408083206001600160a01b03871684529091528120541561199f575060015b3360009081526010602090815260408083206001600160a01b03881684529091529020546119cd9084613481565b3360009081526010602090815260408083206001600160a01b03891684529091529020556007546119fe90436147ce565b3360009081526010602090815260408083206001600160a01b0389168452825280832060010193909355600e90522054611a389084613481565b6001600160a01b0385166000908152600e602052604090205580158015611ad057506001600160a01b0384166000908152600f60209081526040918290208054835181840281018401909452808452611ace9392830182828015610dfc576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610dde57505050505033612dee565b155b15611b0e576001600160a01b0384166000908152600f602090815260408220805460018101825590835291200180546001600160a01b031916331790555b3360008181526010602090815260408083206001600160a01b03891680855290835292819020600101548151888152928301529192917f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc910160405180910390a350610c4e565b60405162461bcd60e51b815260206004820152602260248201527f5761736e27742061626c6520746f207472616e7366657220796f757220746f6b60448201526132b760f11b60648201526084016102a1565b336000908152600b60209081526040808320600c8352818420548452909152902060038101546001600160a01b0316611c695760405162461bcd60e51b815260206004820152603b60248201527f5468652063757272656e742070726f6365737320646f65736e2774207761697460448201527f20666f7220616e20455243323020746f6b656e206465706f736974000000000060648201526084016102a1565b6001815460ff166004811115611c8f57634e487b7160e01b600052602160045260246000fd5b14611cac5760405162461bcd60e51b81526004016102a1906145f7565b81816001015414611d1c5760405162461bcd60e51b815260206004820152603460248201527f4465706f73697420616d6f756e7420646f65736e2774206d61746368207769746044820152731a081d1a19481c995c5d595cdd19590818dbdcdd60621b60648201526084016102a1565b60038101546001600160a01b0316611d368133308661348d565b60048201546006830154611d6a916001600160a01b031690611d5990869061091a565b6001600160a01b03841691906134f8565b815460ff19166002178255600882015460078301546001600160a01b0316336001600160a01b03167f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b86604051610bc691815260200190565b600082815260208190526040902060010154611dde8161288e565b610c4e838361291f565b60008111611e2b5760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f7420756e7374616b6520360841b60448201526064016102a1565b3360009081526010602090815260408083206001600160a01b0386168452909152902054811115611ed05760405162461bcd60e51b815260206004820152604360248201527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f20756e7374606482015262616b6560e81b608482015260a4016102a1565b3360009081526010602090815260408083206001600160a01b0386168452909152902060010154431015611f615760405162461bcd60e51b815260206004820152603260248201527f546865206c6f636b696e6720706572696f64206469646e277420706173732c20604482015271796f752063616e6e6f7420756e7374616b6560701b60648201526084016102a1565b60095460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb90604401602060405180830381600087803b158015611fae57600080fd5b505af1158015611fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190614253565b905080156120ca5781600860008282546120009190614819565b90915550503360009081526010602090815260408083206001600160a01b0387168452909152902054612034908390614819565b3360009081526010602090815260408083206001600160a01b0388168452825280832093909355600e9052205461206c908390614819565b6001600160a01b0384166000818152600e60205260409081902092909255905133907f8a3c16627a0e7a870a5d5cd0121ca5d80e2efd0ec7198a11644f1a516ac37093906120bd9086815260200190565b60405180910390a3610c4e565b60405162461bcd60e51b815260206004820152602e60248201527f5761736e27742061626c6520746f2065786563757465207472616e736665722060448201526d6f6620796f757220746f6b656e7360901b60648201526084016102a1565b604080516101e080820183526000808352602080840182905283850182905260608085018390526080850183905260a0850183905260c0850183905260e0850183905261010085018390526101208501839052610140850152610160840182905261018084018290526101a084018290526101c084018290526001600160a01b0387168252600b815284822086835290528390208351918201909352825491929091829060ff1660048111156121ef57634e487b7160e01b600052602160045260246000fd5b600481111561220e57634e487b7160e01b600052602160045260246000fd5b81526001820154602080830191909152600283015460408084019190915260038401546001600160a01b0390811660608501526004850154811660808501526005850154811660a0850152600685015460c085015260078501541660e084015260088401546101008401526009840154610120840152600a840180548251818502810185019093528083526101409094019391929091908301828280156122de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122c0575b5050509183525050600b8201546001600160a01b03808216602084015260ff600160a01b92839004811615156040850152600c909401549081166060840152049091161515608090910152905092915050565b600061233c8161288e565b506001600160a01b039092166000908152600d60205260409020600181019190915560020155565b600061236f8161288e565b60028251116123c05760405162461bcd60e51b815260206004820181905260248201527f56616c696461746f7273206d696e696d756d207175616e74697479206973203360448201526064016102a1565b6040805160808101825283815260025460208083019190915260035482840152600160608301526001600160a01b0386166000908152600d82529290922081518051929391926124139284920190613e3f565b506020820151600182015560408201516002820155606090910151600390910155505050565b60006124448161288e565b50600291909155600355565b6001600160a01b038082166000908152600e60205260408082205492851682528120546008546060939161248391614819565b61248d9190614819565b6001600160a01b038087166000908152600d602052604081205492935091908616156124c1576124be600182614819565b90505b6001600160a01b038516156124de576124db600182614819565b90505b60008167ffffffffffffffff81111561250757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612530578160200160208202803683370190505b50905060005b81518110156128805784612548613528565b612552919061488e565b935060005b6001600160a01b038a166000908152600d602052604090205481101561286d576001600160a01b038a81166000908152600d602052604090208054918b1691839081106125b457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161480159061262757506001600160a01b038a81166000908152600d602052604090208054918a16918390811061260f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b1561285b576001600160a01b038a166000908152600d6020526040902080546126849185918490811061266a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316612dee565b61285b576001600160a01b038a166000908152600d602052604081208054600e929190849081106126c557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205485116127ec576001600160a01b038a166000908152600d6020526040902080548290811061272857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b031683838151811061276657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152908b166000908152600d909152604081208054600e929190849081106127b657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546127e59087614819565b955061286d565b6001600160a01b038a166000908152600d602052604081208054600e9291908490811061282957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546128589086614819565b94505b8061286581614873565b915050612557565b508061287881614873565b915050612536565b5093505050505b9392505050565b6128988133613564565b50565b6128a582826112e3565b610cde576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556128db3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61292982826112e3565b15610cde576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0384166000908152600d60205260409020600101546129f85760405162461bcd60e51b815260206004820152602360248201527f52657175657374656420736572766963652061646472657373206e6f7420666f6044820152621d5b9960ea1b60648201526084016102a1565b336000908152600b602090815260408083208684529091529020600701546001600160a01b031615612a835760405162461bcd60e51b815260206004820152602e60248201527f50726f636573732077697468207370656369666965642070726f64756374496460448201526d08185b1c9958591e48195e1a5cdd60921b60648201526084016102a1565b604080516101e0810190915280600081526020016000815260200160008152602001866001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001856001600160a01b03168152602001848152602001438152602001612b0286600080612450565b8152600060208083018290526040808401839052606084018390526080909301829052338252600b815282822087835290522081518154829060ff19166001836004811115612b6157634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301516003830180546001600160a01b039283166001600160a01b031991821617909155608085015160048501805491841691831691909117905560a085015160058501805491841691831691909117905560c0850151600685015560e0850151600785018054919093169116179055610100830151600883015561012083015160098301556101408301518051612c1b92600a8501920190613e3f565b50610160820151600b80830180546101808601511515600160a01b9081026001600160a81b03199283166001600160a01b0396871617179092556101a0860151600c90950180546101c0909701511515909202951693831693909317939093179091553360008181526020938452604080822088835290945283902092518693928816927fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d8991612cd291600a019088908890614462565b60405180910390a4336000908152600b60209081526040808320600c835281842054845290915290205460019060ff166004811115612d2157634e487b7160e01b600052602160045260246000fd5b1415612dd857336000908152600b60209081526040808320600c83528184205484529091528120805460ff1916815560018101829055600281018290556003810180546001600160a01b03199081169091556004820180548216905560058201805482169055600682018390556007820180549091169055600881018290556009810182905590612db5600a830182613ea4565b50600b810180546001600160a81b0319908116909155600c909101805490911690555b5050336000908152600c60205260409020555050565b6000805b8351811015612e5857826001600160a01b0316848281518110612e2557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612e46576001915050610929565b80612e5081614873565b915050612df2565b5060009392505050565b6000805b8551811015612f0857846001600160a01b0316868281518110612e9957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612ef657612eba8443614819565b612ec484836147fa565b11158015612eee575082612ed881836147fa565b612ee291906147ce565b612eec8543614819565b105b915050612f0e565b80612f0081614873565b915050612e66565b50600090505b949350505050565b6001600160a01b038085166000908152600b60209081526040808320878452825280832060078101549094168352600d9091528120600101546006830154612f6491606491611165916132fc565b600b830154600c8401546003850154929350600092612f94926001600160a01b03908116928116918691166135c8565b90508315612fbd57600b830154600c840154612fbd916001600160a01b03908116911686613677565b846131f05760078301546001600160a01b03166000908152600d60205260408120600201546006850154612ff791606491611165916132fc565b60038501549091506001600160a01b03166130a65760078401546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613048573d6000803e3d6000fd5b50600a5460068501546001600160a01b03909116906108fc90839061306e908690614819565b6130789190614819565b6040518115909202916000818181858888f193505050501580156130a0573d6000803e3d6000fd5b506131ea565b6003840154600785015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052911690819063a9059cbb90604401602060405180830381600087803b1580156130fc57600080fd5b505af1158015613110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131349190614253565b50600a5460068601546001600160a01b038084169263a9059cbb92911690859061315f908890614819565b6131699190614819565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156131af57600080fd5b505af11580156131c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e79190614253565b50505b506132f3565b60038301546001600160a01b031661324757866001600160a01b03166108fc82856006015461321f9190614819565b6040518115909202916000818181858888f193505050501580156131ea573d6000803e3d6000fd5b600383015460068401546001600160a01b0390911690819063a9059cbb908a90613272908690614819565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f09190614253565b50505b50505050505050565b600061092682846147fa565b600061092682846147e6565b600080805b6001600160a01b0385166000908152600f602052604090205481101561344b576001600160a01b0385166000908152600f6020526040812080548390811061337157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600e845260408086205492909316808652601085528386209186529352908320549193506133d091606491611165916133c991908390856132fc565b89906132fc565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522054909150613404908290614819565b6001600160a01b038084166000908152601060209081526040808320938c168352929052205561343481856147ce565b93505050808061344390614873565b915050613319565b506001600160a01b0384166000908152600e602052604081208054839290613474908490614819565b9091555090949350505050565b600061092682846147ce565b6040516001600160a01b0380851660248301528316604482015260648101829052610cf09085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613772565b6040516001600160a01b038316602482015260448101829052610c4e90849063a9059cbb60e01b906064016134c1565b60004442604051602001613546929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b61356e82826112e3565b610cde57613586816001600160a01b03166014613844565b613591836020613844565b6040516020016135a29291906143da565b60408051601f198184030181529082905262461bcd60e51b82526102a1916004016144cb565b6001600160a01b038084166000908152600e602052604080822054928716825281205490918291613632916064916111659161362b9161360791613481565b6001600160a01b038b166000908152600e60205260409020546111659060646132fc565b87906132fc565b905060006136408286614819565b9050600061364f888487613a26565b9050600061365e888488613a26565b905061366a81836147ce565b9998505050505050505050565b6001600160a01b038083166000908152600e602052604080822054928616825281205490916136e091606491611165916136d9916136b59190613481565b6001600160a01b0389166000908152600e60205260409020546111659060646132fc565b85906132fc565b905060006136ee8284614819565b905060006136fc8684613bf4565b9050600061370a8684613bf4565b6001600160a01b0388166000908152600e60205260408120805492935084929091906137379084906147ce565b90915550506001600160a01b0386166000908152600e6020526040812080548392906137649084906147ce565b909155505050505050505050565b60006137c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d2b9092919063ffffffff16565b805190915015610c4e57808060200190518101906137e59190614253565b610c4e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102a1565b606060006138538360026147fa565b61385e9060026147ce565b67ffffffffffffffff81111561388457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156138ae576020820181803683370190505b509050600360fc1b816000815181106138d757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061391457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006139388460026147fa565b6139439060016147ce565b90505b60018111156139d7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061398557634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106139a957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936139d08161485c565b9050613946565b5083156109265760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102a1565b600080806001600160a01b03841615613a3c5750825b60005b6001600160a01b0387166000908152600f6020526040902054811015613be9576001600160a01b0387166000908152600f60205260408120805483908110613a9757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03908116808452601083526040808520928d168552918352818420600e909352908320548254919450919291613af79160649161116591613af091908390856132fc565b8c906132fc565b90506001600160a01b038816613b43576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015613b3d573d6000803e3d6000fd5b50613bc7565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905286169063a9059cbb90604401602060405180830381600087803b158015613b8d57600080fd5b505af1158015613ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc59190614253565b505b613bd181876147ce565b95505050508080613be190614873565b915050613a3f565b509095945050505050565b600080805b6001600160a01b0385166000908152600f6020526040902054811015613d23576001600160a01b0385166000908152600f60205260408120805483908110613c5157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600e84526040808620549290931680865260108552838620918652935290832054919350613ca991606491611165916133c991908390856132fc565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522054909150613cdc9082613481565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522055613d0c81856147ce565b935050508080613d1b90614873565b915050613bf9565b509392505050565b6060612f0e8484600085856001600160a01b0385163b613d8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a1565b600080866001600160a01b03168587604051613da991906143be565b60006040518083038185875af1925050503d8060008114613de6576040519150601f19603f3d011682016040523d82523d6000602084013e613deb565b606091505b5091509150613dfb828286613e06565b979650505050505050565b60608315613e15575081612887565b825115613e255782518084602001fd5b8160405162461bcd60e51b81526004016102a191906144cb565b828054828255906000526020600020908101928215613e94579160200282015b82811115613e9457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613e5f565b50613ea0929150613ebe565b5090565b508054600082559060005260206000209081019061289891905b5b80821115613ea05760008155600101613ebf565b8035610963816148e4565b600082601f830112613eee578081fd5b8135602067ffffffffffffffff80831115613f0b57613f0b6148ce565b8260051b604051601f19603f83011681018181108482111715613f3057613f306148ce565b60405284815283810192508684018288018501891015613f4e578687fd5b8692505b85831015613f7757613f6381613ed3565b845292840192600192909201918401613f52565b50979650505050505050565b60008083601f840112613f94578182fd5b50813567ffffffffffffffff811115613fab578182fd5b602083019150836020828501011115613fc357600080fd5b9250929050565b600060208284031215613fdb578081fd5b8135610926816148e4565b60008060408385031215613ff8578081fd5b8235614003816148e4565b91506020830135614013816148e4565b809150509250929050565b600080600080600060808688031215614035578081fd5b8535614040816148e4565b94506020860135614050816148e4565b935060408601359250606086013567ffffffffffffffff811115614072578182fd5b61407e88828901613f83565b969995985093965092949392505050565b600080604083850312156140a1578182fd5b82356140ac816148e4565b9150602083013567ffffffffffffffff8111156140c7578182fd5b6140d385828601613ede565b9150509250929050565b600080604083850312156140ef578182fd5b82356140fa816148e4565b946020939093013593505050565b60008060006060848603121561411c578283fd5b8335614127816148e4565b925060208401359150604084013561413e816148f9565b809150509250925092565b6000806000806060858703121561415e578384fd5b8435614169816148e4565b935060208501359250604085013567ffffffffffffffff81111561418b578283fd5b61419787828801613f83565b95989497509550505050565b600080600080608085870312156141b8578384fd5b84356141c3816148e4565b9350602085013592506040850135915060608501356141e1816148e4565b939692955090935050565b600080600060608486031215614200578283fd5b833561420b816148e4565b95602085013595506040909401359392505050565b600060208284031215614231578081fd5b813567ffffffffffffffff811115614247578182fd5b612f0e84828501613ede565b600060208284031215614264578081fd5b8151610926816148f9565b600060208284031215614280578081fd5b5035919050565b60008060408385031215614299578182fd5b823591506020830135614013816148e4565b6000602082840312156142bc578081fd5b81356001600160e01b031981168114610926578182fd5b600080604083850312156142e5578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561432c5781516001600160a01b031687529582019590820190600101614307565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561432c5781546001600160a01b03168752958201956001918201910161434d565b6005811061439057634e487b7160e01b600052602160045260246000fd5b9052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600082516143d0818460208701614830565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614412816017850160208801614830565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614443816028840160208801614830565b01602801949350505050565b6000602082526109266020830184614337565b6000604082526144756040830186614337565b8281036020840152614488818587614394565b9695505050505050565b6000604082526144a56040830184614337565b82810360209384015290815201919050565b600060208252612f0e602083018486614394565b60006020825282518060208401526144ea816040850160208701614830565b601f01601f19169190910160400192915050565b6020808252602f908201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360408201526e185b1b081d1a1a5cc81b595d1a1bd9608a1b606082015260800190565b6020808252602d908201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260408201526c65206f7574206f662074696d6560981b606082015260800190565b6020808252603f908201527f596f75722061646472657373206973206e6f742077686974656c69737465642060408201527f696e207468652070726f6475637420736572766963652073657474696e677300606082015260800190565b60208082526041908201527f596f7520646f6e277420686176652061206465706f736974206177616974696e60408201527f672070726f636573732c20706c656173652063726561746520697420666972736060820152601d60fa1b608082015260a00190565b60208082526021908201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6040820152601960fa1b606082015260800190565b6000602082526146b3602083018451614372565b602083015160408301526040830151606083015260608301516146e160808401826001600160a01b03169052565b5060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c083015160e083015260e0830151610100614732818501836001600160a01b03169052565b84015161012084810191909152840151610140808501919091528401516101e06101608086018290529192509061476d6102008601846142f4565b9086015190925061018061478b868201836001600160a01b03169052565b86015190506101a06147a08682018315159052565b86015190506101c06147bc868201836001600160a01b03169052565b90950151151593019290925250919050565b600082198211156147e1576147e16148a2565b500190565b6000826147f5576147f56148b8565b500490565b6000816000190483118215151615614814576148146148a2565b500290565b60008282101561482b5761482b6148a2565b500390565b60005b8381101561484b578181015183820152602001614833565b83811115610cf05750506000910152565b60008161486b5761486b6148a2565b506000190190565b6000600019821415614887576148876148a2565b5060010190565b60008261489d5761489d6148b8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461289857600080fd5b801515811461289857600080fdfea264697066735822122015736657d06ee9ddf0b6cef542c30c9e820ba19715a78ae9fe8286a7c6cff00064736f6c63430008030033000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000005100000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
Deployed Bytecode
0x6080604052600436106102085760003560e01c806384f3ca4111610118578063b6b55f25116100a0578063e3f56eaa1161006f578063e3f56eaa14610857578063e9b873871461088d578063ef4604a9146108ba578063fd09b15f146108da578063fd6d2dcf146108fa5761040f565b8063b6b55f2514610773578063ce4cb87614610793578063d547741f14610817578063d9393814146108375761040f565b806391d14854116100e757806391d14854146106de5780639300c926146106fe5780639e7455eb1461071e578063a217fddf1461073e578063adc9772e146107535761040f565b806384f3ca41146106615780638670fdd91461068957806389bf146a1461069e57806389f18983146106be5761040f565b80632f2ff15d1161019b578063402fbbd81161016a578063402fbbd8146105e25780635f96529f146105f757806363de06f814610617578063787ef24214610637578063817b1cd21461064c5761040f565b80632f2ff15d146105625780633293025c1461058257806336568abe146105a257806338f8f528146105c25761040f565b80631c31f710116101d75780631c31f710146104d2578063240de277146104f2578063248a9ca31461051257806326b321d1146105425761040f565b806301ffc9a71461041457806304f32b5d146104495780630cb395db1461046b5780630e53e633146104b25761040f565b3661040f57336000818152600b60209081526040808320600c8352818420548452909152902060038101546001600160a01b0316156102aa5760405162461bcd60e51b815260206004820152603360248201527f5468652063757272656e742070726f63657373207761697420666f7220616e20604482015272115490cc8c081d1bdad95b8819195c1bdcda5d606a1b60648201526084015b60405180910390fd5b6001815460ff1660048111156102d057634e487b7160e01b600052602160045260246000fd5b146102ed5760405162461bcd60e51b81526004016102a1906145f7565b348160010154146103665760405162461bcd60e51b815260206004820152603760248201527f4465706f73697420616d6f756e7420646f65736e2774206d617463682077697460448201527f682074686520726571756573746564206465706f73697400000000000000000060648201526084016102a1565b600481015460068201546001600160a01b03909116906108fc9061038b90349061091a565b6040518115909202916000818181858888f193505050501580156103b3573d6000803e3d6000fd5b50805460ff19166002178155600881015460078201546040513481526001600160a01b03918216918516907f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b9060200160405180910390a45050005b600080fd5b34801561042057600080fd5b5061043461042f3660046142ab565b61092f565b60405190151581526020015b60405180910390f35b34801561045557600080fd5b50610469610464366004614149565b610968565b005b34801561047757600080fd5b506104a4610486366004613fca565b6001600160a01b03166000908152600d602052604090206003015490565b604051908152602001610440565b3480156104be57600080fd5b506104696104cd3660046140dd565b6109e8565b3480156104de57600080fd5b506104696104ed366004613fca565b610bd3565b3480156104fe57600080fd5b5061046961050d3660046142d3565b610c01565b34801561051e57600080fd5b506104a461052d36600461426f565b60009081526020819052604090206001015490565b34801561054e57600080fd5b5061046961055d36600461426f565b610c18565b34801561056e57600080fd5b5061046961057d366004614287565b610c29565b34801561058e57600080fd5b5061046961059d36600461426f565b610c53565b3480156105ae57600080fd5b506104696105bd366004614287565b610c64565b3480156105ce57600080fd5b506104696105dd366004614149565b610ce2565b3480156105ee57600080fd5b506007546104a4565b34801561060357600080fd5b5061046961061236600461401e565b610cf6565b34801561062357600080fd5b5061046961063236600461426f565b610d0a565b34801561064357600080fd5b506001546104a4565b34801561065857600080fd5b506008546104a4565b34801561066d57600080fd5b506009546040516001600160a01b039091168152602001610440565b34801561069557600080fd5b506006546104a4565b3480156106aa57600080fd5b506104696106b9366004614108565b610d4b565b3480156106ca57600080fd5b506104696106d936600461426f565b6112d2565b3480156106ea57600080fd5b506104346106f9366004614287565b6112e3565b34801561070a57600080fd5b50610469610719366004614220565b61130c565b34801561072a57600080fd5b506104696107393660046141a3565b611358565b34801561074a57600080fd5b506104a4600081565b34801561075f57600080fd5b5061046961076e3660046140dd565b611838565b34801561077f57600080fd5b5061046961078e36600461426f565b611bc8565b34801561079f57600080fd5b506107fc6107ae366004613fe6565b604080518082018252600080825260209182018190526001600160a01b0394851681526010825282812093909416845291825291829020825180840190935280548352600101549082015290565b60408051825181526020928301519281019290925201610440565b34801561082357600080fd5b50610469610832366004614287565b611dc3565b34801561084357600080fd5b506104696108523660046140dd565b611de8565b34801561086357600080fd5b506104a4610872366004613fca565b6001600160a01b03166000908152600e602052604090205490565b34801561089957600080fd5b506108ad6108a83660046140dd565b612129565b604051610440919061469f565b3480156108c657600080fd5b506104696108d53660046141ec565b612331565b3480156108e657600080fd5b506104696108f536600461408f565b612364565b34801561090657600080fd5b506104696109153660046142d3565b612439565b60006109268284614819565b90505b92915050565b60006001600160e01b03198216637965db0b60e01b148061096057506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b336000908152600d60205260409020546109945760405162461bcd60e51b81526004016102a19061465e565b82336001600160a01b0316856001600160a01b03167fb67fab32200b6a6d186136689c0b4c4072ae0bd5dd17b98fb8105d1b9747939985856040516109da9291906144b7565b60405180910390a450505050565b336000908152600d6020526040902060010154151580610a105750336001600160a01b038316145b610a7a5760405162461bcd60e51b815260206004820152603560248201527f4f6e6c792073657276696365206f722070726f6475637420637573746f6d65726044820152740818d85b8818d85b1b081d1a1a5cc81b595d1a1bd9605a1b60648201526084016102a1565b6001600160a01b0382166000908152600b6020908152604080832084845290915290206002815460ff166004811115610ac357634e487b7160e01b600052602160045260246000fd5b14610b225760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74207374617274207465726d696e6174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102a1565b805460ff191660031781554360098201556007810154610b4d906001600160a01b0316600080612450565b8051610b6391600a840191602090910190613e3f565b50600b810180546001600160a81b0319908116909155600c820180549091169055604051829033906001600160a01b038616907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610bc690600a87019061444f565b60405180910390a4505050565b6000610bde8161288e565b50600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c0c8161288e565b50600491909155600555565b6000610c238161288e565b50600755565b600082815260208190526040902060010154610c448161288e565b610c4e838361289b565b505050565b6000610c5e8161288e565b50600655565b6001600160a01b0381163314610cd45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016102a1565b610cde828261291f565b5050565b610cf0600085858585612984565b50505050565b610d038585858585612984565b5050505050565b336000908152600d6020526040902054610d365760405162461bcd60e51b81526004016102a19061465e565b336000908152600d6020526040902060030155565b336000908152600e6020526040902054610d775760405162461bcd60e51b81526004016102a1906144fe565b6001600160a01b038084166000908152600b60209081526040808320868452825280832060078101549094168352600d8252918290208054835181840281018401909452808452610e079392830182828015610dfc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dde575b505050505033612dee565b610e235760405162461bcd60e51b81526004016102a19061459a565b6003815460ff166004811115610e4957634e487b7160e01b600052602160045260246000fd5b14610ea85760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206163636570742076616c69646174696f6e2c20636865636b2060448201526874686520737461746560b81b60648201526084016102a1565b610f1681600a01805480602002602001604051908101604052809291908181526020018280548015610f0357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ee5575b5050505050338360090154600154612e62565b610f325760405162461bcd60e51b81526004016102a19061454d565b600b8101546001600160a01b0316610ffc57600b810180546001600160a81b0319163360ff60a01b191617600160a01b8415150217908190554360098301556007820154610f8e916001600160a01b0391821691166000612450565b8051610fa491600a840191602090910190613e3f565b50600781015460405184916001600160a01b0390811691908716907f2ec6ff0a3927bfb55544f85fb0e2367f025ffb0b469ec8276385f8e569e0376e90610fef90600a87019061444f565b60405180910390a4610cf0565b600c8101546001600160a01b031661111757600c810180546001600160a81b0319163360ff60a01b191617600160a01b84151581029190911791829055600b8301549181900460ff90811615159190920491909116151514156110e457611078848483600b0160149054906101000a900460ff16156000612f16565b8054600460ff199091161781556007810154600b82015460408051600160a01b90920460ff16151582525185926001600160a01b0390811692908816917f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b709181900360200190a4611112565b4360098201556007810154600b820154600c830154610f8e926001600160a01b039081169281169116612450565b610cf0565b600b81015460ff600160a01b90910416151582151514156111d757600654600c8201546001600160a01b03166000908152600e6020526040812054909161116b9160649161116591906132fc565b90613308565b600c830154909150600090611189906001600160a01b031683613314565b600c840180546001600160a81b0319163360ff60a01b191617600160a01b871515810291909117909155600b8501549192506111d0918891889160ff919004161584612f16565b505061126d565b600654600b8201546001600160a01b03166000908152600e6020526040812054909161120a9160649161116591906132fc565b600b830154909150600090611228906001600160a01b031683613314565b600b840180546001600160a81b0319163360ff60a01b191617600160a01b8715158102919091179182905591925061126a918891889160ff9104161584612f16565b50505b8054600460ff199091161781556007810154600b820154604051600160a01b90910460ff161515815284916001600160a01b0390811691908716907f5c2cc6518d5891ba2f9c21f49d712982ba12450a2a8adeb21e4a41f85a995b70906020016109da565b60006112dd8161288e565b50600155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336000908152600d60205260409020546113385760405162461bcd60e51b81526004016102a19061465e565b336000908152600d602090815260409091208251610cde92840190613e3f565b336000908152600e60205260409020546113845760405162461bcd60e51b81526004016102a1906144fe565b6001600160a01b038085166000908152600b60209081526040808320878452825280832060078101549094168352600d82529182902080548351818402810184019094528084526114129392830182828015610dfc576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610dde57505050505033612dee565b61142e5760405162461bcd60e51b81526004016102a19061459a565b6000815460ff16600481111561145457634e487b7160e01b600052602160045260246000fd5b146114ad5760405162461bcd60e51b8152602060048201526024808201527f436f737420697320616c7265616479207365742c20636865636b2074686520736044820152637461746560e01b60648201526084016102a1565b61151981600a01805480602002602001604051908101604052809291908181526020018280548015610f03576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610ee5575050505050338360090154600154612e62565b6115355760405162461bcd60e51b81526004016102a19061454d565b600b8101546001600160a01b031661160657600b810180546001600160a01b031990811633908117909255600183018590556004830180546001600160a01b03868116919093161790554360098401556007830154611598929116906000612450565b80516115ae91600a840191602090910190613e3f565b50600781015460405185916001600160a01b0390811691908816907fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d89906115f990600a870190614492565b60405180910390a4610d03565b600c8101546001600160a01b031661172557600c81018054336001600160a01b031991821617909155600282018490556005820180549091166001600160a01b0384161790556001810154831480156116735750600581015460048201546001600160a01b039081169116145b156116f257611693600554611165600454866132fc90919063ffffffff16565b6006820155805460ff19166001178155600781015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a4611720565b4360098201556007810154600b820154600c830154611598926001600160a01b039081169281169116612450565b610d03565b828160010154148015611747575060048101546001600160a01b038381169116145b1561178557600c81018054336001600160a01b031991821617909155600282018490556005820180549091166001600160a01b0384161790556117ba565b600b81018054336001600160a01b031991821617909155600182018490556004820180549091166001600160a01b0384161790555b600181018390556005546004546117d791906111659086906132fc565b6006820155805460ff19166001178155600781015460405184815285916001600160a01b0390811691908816907f9829c39553001f6f75967caf0b4a8a903f5332af8a010a6b7e8532b7ed023f519060200160405180910390a45050505050565b6001600160a01b03821661188e5760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220616464726573732063616e6e6f74206265203000000060448201526064016102a1565b600081116118cf5760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b60448201526064016102a1565b6009546040516323b872dd60e01b8152336004820152306024820152604481018390526000916001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561192257600080fd5b505af1158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a9190614253565b90508015611b755760085461196f9083613481565b6008553360009081526010602090815260408083206001600160a01b03871684529091528120541561199f575060015b3360009081526010602090815260408083206001600160a01b03881684529091529020546119cd9084613481565b3360009081526010602090815260408083206001600160a01b03891684529091529020556007546119fe90436147ce565b3360009081526010602090815260408083206001600160a01b0389168452825280832060010193909355600e90522054611a389084613481565b6001600160a01b0385166000908152600e602052604090205580158015611ad057506001600160a01b0384166000908152600f60209081526040918290208054835181840281018401909452808452611ace9392830182828015610dfc576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610dde57505050505033612dee565b155b15611b0e576001600160a01b0384166000908152600f602090815260408220805460018101825590835291200180546001600160a01b031916331790555b3360008181526010602090815260408083206001600160a01b03891680855290835292819020600101548151888152928301529192917f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc910160405180910390a350610c4e565b60405162461bcd60e51b815260206004820152602260248201527f5761736e27742061626c6520746f207472616e7366657220796f757220746f6b60448201526132b760f11b60648201526084016102a1565b336000908152600b60209081526040808320600c8352818420548452909152902060038101546001600160a01b0316611c695760405162461bcd60e51b815260206004820152603b60248201527f5468652063757272656e742070726f6365737320646f65736e2774207761697460448201527f20666f7220616e20455243323020746f6b656e206465706f736974000000000060648201526084016102a1565b6001815460ff166004811115611c8f57634e487b7160e01b600052602160045260246000fd5b14611cac5760405162461bcd60e51b81526004016102a1906145f7565b81816001015414611d1c5760405162461bcd60e51b815260206004820152603460248201527f4465706f73697420616d6f756e7420646f65736e2774206d61746368207769746044820152731a081d1a19481c995c5d595cdd19590818dbdcdd60621b60648201526084016102a1565b60038101546001600160a01b0316611d368133308661348d565b60048201546006830154611d6a916001600160a01b031690611d5990869061091a565b6001600160a01b03841691906134f8565b815460ff19166002178255600882015460078301546001600160a01b0316336001600160a01b03167f1f0f1dee49a1720a0d98e3a0575a04dd9f143ff5e29555c3085471c1c70eed5b86604051610bc691815260200190565b600082815260208190526040902060010154611dde8161288e565b610c4e838361291f565b60008111611e2b5760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f7420756e7374616b6520360841b60448201526064016102a1565b3360009081526010602090815260408083206001600160a01b0386168452909152902054811115611ed05760405162461bcd60e51b815260206004820152604360248201527f596f75722062616c616e6365206973206c6f776572207468616e20746865206160448201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f20756e7374606482015262616b6560e81b608482015260a4016102a1565b3360009081526010602090815260408083206001600160a01b0386168452909152902060010154431015611f615760405162461bcd60e51b815260206004820152603260248201527f546865206c6f636b696e6720706572696f64206469646e277420706173732c20604482015271796f752063616e6e6f7420756e7374616b6560701b60648201526084016102a1565b60095460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb90604401602060405180830381600087803b158015611fae57600080fd5b505af1158015611fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190614253565b905080156120ca5781600860008282546120009190614819565b90915550503360009081526010602090815260408083206001600160a01b0387168452909152902054612034908390614819565b3360009081526010602090815260408083206001600160a01b0388168452825280832093909355600e9052205461206c908390614819565b6001600160a01b0384166000818152600e60205260409081902092909255905133907f8a3c16627a0e7a870a5d5cd0121ca5d80e2efd0ec7198a11644f1a516ac37093906120bd9086815260200190565b60405180910390a3610c4e565b60405162461bcd60e51b815260206004820152602e60248201527f5761736e27742061626c6520746f2065786563757465207472616e736665722060448201526d6f6620796f757220746f6b656e7360901b60648201526084016102a1565b604080516101e080820183526000808352602080840182905283850182905260608085018390526080850183905260a0850183905260c0850183905260e0850183905261010085018390526101208501839052610140850152610160840182905261018084018290526101a084018290526101c084018290526001600160a01b0387168252600b815284822086835290528390208351918201909352825491929091829060ff1660048111156121ef57634e487b7160e01b600052602160045260246000fd5b600481111561220e57634e487b7160e01b600052602160045260246000fd5b81526001820154602080830191909152600283015460408084019190915260038401546001600160a01b0390811660608501526004850154811660808501526005850154811660a0850152600685015460c085015260078501541660e084015260088401546101008401526009840154610120840152600a840180548251818502810185019093528083526101409094019391929091908301828280156122de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122c0575b5050509183525050600b8201546001600160a01b03808216602084015260ff600160a01b92839004811615156040850152600c909401549081166060840152049091161515608090910152905092915050565b600061233c8161288e565b506001600160a01b039092166000908152600d60205260409020600181019190915560020155565b600061236f8161288e565b60028251116123c05760405162461bcd60e51b815260206004820181905260248201527f56616c696461746f7273206d696e696d756d207175616e74697479206973203360448201526064016102a1565b6040805160808101825283815260025460208083019190915260035482840152600160608301526001600160a01b0386166000908152600d82529290922081518051929391926124139284920190613e3f565b506020820151600182015560408201516002820155606090910151600390910155505050565b60006124448161288e565b50600291909155600355565b6001600160a01b038082166000908152600e60205260408082205492851682528120546008546060939161248391614819565b61248d9190614819565b6001600160a01b038087166000908152600d602052604081205492935091908616156124c1576124be600182614819565b90505b6001600160a01b038516156124de576124db600182614819565b90505b60008167ffffffffffffffff81111561250757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612530578160200160208202803683370190505b50905060005b81518110156128805784612548613528565b612552919061488e565b935060005b6001600160a01b038a166000908152600d602052604090205481101561286d576001600160a01b038a81166000908152600d602052604090208054918b1691839081106125b457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161480159061262757506001600160a01b038a81166000908152600d602052604090208054918a16918390811061260f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b1561285b576001600160a01b038a166000908152600d6020526040902080546126849185918490811061266a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316612dee565b61285b576001600160a01b038a166000908152600d602052604081208054600e929190849081106126c557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205485116127ec576001600160a01b038a166000908152600d6020526040902080548290811061272857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b031683838151811061276657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152908b166000908152600d909152604081208054600e929190849081106127b657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546127e59087614819565b955061286d565b6001600160a01b038a166000908152600d602052604081208054600e9291908490811061282957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546128589086614819565b94505b8061286581614873565b915050612557565b508061287881614873565b915050612536565b5093505050505b9392505050565b6128988133613564565b50565b6128a582826112e3565b610cde576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556128db3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61292982826112e3565b15610cde576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0384166000908152600d60205260409020600101546129f85760405162461bcd60e51b815260206004820152602360248201527f52657175657374656420736572766963652061646472657373206e6f7420666f6044820152621d5b9960ea1b60648201526084016102a1565b336000908152600b602090815260408083208684529091529020600701546001600160a01b031615612a835760405162461bcd60e51b815260206004820152602e60248201527f50726f636573732077697468207370656369666965642070726f64756374496460448201526d08185b1c9958591e48195e1a5cdd60921b60648201526084016102a1565b604080516101e0810190915280600081526020016000815260200160008152602001866001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001856001600160a01b03168152602001848152602001438152602001612b0286600080612450565b8152600060208083018290526040808401839052606084018390526080909301829052338252600b815282822087835290522081518154829060ff19166001836004811115612b6157634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301516003830180546001600160a01b039283166001600160a01b031991821617909155608085015160048501805491841691831691909117905560a085015160058501805491841691831691909117905560c0850151600685015560e0850151600785018054919093169116179055610100830151600883015561012083015160098301556101408301518051612c1b92600a8501920190613e3f565b50610160820151600b80830180546101808601511515600160a01b9081026001600160a81b03199283166001600160a01b0396871617179092556101a0860151600c90950180546101c0909701511515909202951693831693909317939093179091553360008181526020938452604080822088835290945283902092518693928816927fde23c39256eb8276bf5f5a3b3654613cb6dc5d9a36e408f3ad61e531217b0d8991612cd291600a019088908890614462565b60405180910390a4336000908152600b60209081526040808320600c835281842054845290915290205460019060ff166004811115612d2157634e487b7160e01b600052602160045260246000fd5b1415612dd857336000908152600b60209081526040808320600c83528184205484529091528120805460ff1916815560018101829055600281018290556003810180546001600160a01b03199081169091556004820180548216905560058201805482169055600682018390556007820180549091169055600881018290556009810182905590612db5600a830182613ea4565b50600b810180546001600160a81b0319908116909155600c909101805490911690555b5050336000908152600c60205260409020555050565b6000805b8351811015612e5857826001600160a01b0316848281518110612e2557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612e46576001915050610929565b80612e5081614873565b915050612df2565b5060009392505050565b6000805b8551811015612f0857846001600160a01b0316868281518110612e9957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612ef657612eba8443614819565b612ec484836147fa565b11158015612eee575082612ed881836147fa565b612ee291906147ce565b612eec8543614819565b105b915050612f0e565b80612f0081614873565b915050612e66565b50600090505b949350505050565b6001600160a01b038085166000908152600b60209081526040808320878452825280832060078101549094168352600d9091528120600101546006830154612f6491606491611165916132fc565b600b830154600c8401546003850154929350600092612f94926001600160a01b03908116928116918691166135c8565b90508315612fbd57600b830154600c840154612fbd916001600160a01b03908116911686613677565b846131f05760078301546001600160a01b03166000908152600d60205260408120600201546006850154612ff791606491611165916132fc565b60038501549091506001600160a01b03166130a65760078401546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613048573d6000803e3d6000fd5b50600a5460068501546001600160a01b03909116906108fc90839061306e908690614819565b6130789190614819565b6040518115909202916000818181858888f193505050501580156130a0573d6000803e3d6000fd5b506131ea565b6003840154600785015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052911690819063a9059cbb90604401602060405180830381600087803b1580156130fc57600080fd5b505af1158015613110573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131349190614253565b50600a5460068601546001600160a01b038084169263a9059cbb92911690859061315f908890614819565b6131699190614819565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156131af57600080fd5b505af11580156131c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e79190614253565b50505b506132f3565b60038301546001600160a01b031661324757866001600160a01b03166108fc82856006015461321f9190614819565b6040518115909202916000818181858888f193505050501580156131ea573d6000803e3d6000fd5b600383015460068401546001600160a01b0390911690819063a9059cbb908a90613272908690614819565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f09190614253565b50505b50505050505050565b600061092682846147fa565b600061092682846147e6565b600080805b6001600160a01b0385166000908152600f602052604090205481101561344b576001600160a01b0385166000908152600f6020526040812080548390811061337157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600e845260408086205492909316808652601085528386209186529352908320549193506133d091606491611165916133c991908390856132fc565b89906132fc565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522054909150613404908290614819565b6001600160a01b038084166000908152601060209081526040808320938c168352929052205561343481856147ce565b93505050808061344390614873565b915050613319565b506001600160a01b0384166000908152600e602052604081208054839290613474908490614819565b9091555090949350505050565b600061092682846147ce565b6040516001600160a01b0380851660248301528316604482015260648101829052610cf09085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613772565b6040516001600160a01b038316602482015260448101829052610c4e90849063a9059cbb60e01b906064016134c1565b60004442604051602001613546929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b61356e82826112e3565b610cde57613586816001600160a01b03166014613844565b613591836020613844565b6040516020016135a29291906143da565b60408051601f198184030181529082905262461bcd60e51b82526102a1916004016144cb565b6001600160a01b038084166000908152600e602052604080822054928716825281205490918291613632916064916111659161362b9161360791613481565b6001600160a01b038b166000908152600e60205260409020546111659060646132fc565b87906132fc565b905060006136408286614819565b9050600061364f888487613a26565b9050600061365e888488613a26565b905061366a81836147ce565b9998505050505050505050565b6001600160a01b038083166000908152600e602052604080822054928616825281205490916136e091606491611165916136d9916136b59190613481565b6001600160a01b0389166000908152600e60205260409020546111659060646132fc565b85906132fc565b905060006136ee8284614819565b905060006136fc8684613bf4565b9050600061370a8684613bf4565b6001600160a01b0388166000908152600e60205260408120805492935084929091906137379084906147ce565b90915550506001600160a01b0386166000908152600e6020526040812080548392906137649084906147ce565b909155505050505050505050565b60006137c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d2b9092919063ffffffff16565b805190915015610c4e57808060200190518101906137e59190614253565b610c4e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102a1565b606060006138538360026147fa565b61385e9060026147ce565b67ffffffffffffffff81111561388457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156138ae576020820181803683370190505b509050600360fc1b816000815181106138d757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061391457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006139388460026147fa565b6139439060016147ce565b90505b60018111156139d7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061398557634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106139a957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936139d08161485c565b9050613946565b5083156109265760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016102a1565b600080806001600160a01b03841615613a3c5750825b60005b6001600160a01b0387166000908152600f6020526040902054811015613be9576001600160a01b0387166000908152600f60205260408120805483908110613a9757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03908116808452601083526040808520928d168552918352818420600e909352908320548254919450919291613af79160649161116591613af091908390856132fc565b8c906132fc565b90506001600160a01b038816613b43576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015613b3d573d6000803e3d6000fd5b50613bc7565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905286169063a9059cbb90604401602060405180830381600087803b158015613b8d57600080fd5b505af1158015613ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc59190614253565b505b613bd181876147ce565b95505050508080613be190614873565b915050613a3f565b509095945050505050565b600080805b6001600160a01b0385166000908152600f6020526040902054811015613d23576001600160a01b0385166000908152600f60205260408120805483908110613c5157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03898116808552600e84526040808620549290931680865260108552838620918652935290832054919350613ca991606491611165916133c991908390856132fc565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522054909150613cdc9082613481565b6001600160a01b038084166000908152601060209081526040808320938c1683529290522055613d0c81856147ce565b935050508080613d1b90614873565b915050613bf9565b509392505050565b6060612f0e8484600085856001600160a01b0385163b613d8d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a1565b600080866001600160a01b03168587604051613da991906143be565b60006040518083038185875af1925050503d8060008114613de6576040519150601f19603f3d011682016040523d82523d6000602084013e613deb565b606091505b5091509150613dfb828286613e06565b979650505050505050565b60608315613e15575081612887565b825115613e255782518084602001fd5b8160405162461bcd60e51b81526004016102a191906144cb565b828054828255906000526020600020908101928215613e94579160200282015b82811115613e9457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613e5f565b50613ea0929150613ebe565b5090565b508054600082559060005260206000209081019061289891905b5b80821115613ea05760008155600101613ebf565b8035610963816148e4565b600082601f830112613eee578081fd5b8135602067ffffffffffffffff80831115613f0b57613f0b6148ce565b8260051b604051601f19603f83011681018181108482111715613f3057613f306148ce565b60405284815283810192508684018288018501891015613f4e578687fd5b8692505b85831015613f7757613f6381613ed3565b845292840192600192909201918401613f52565b50979650505050505050565b60008083601f840112613f94578182fd5b50813567ffffffffffffffff811115613fab578182fd5b602083019150836020828501011115613fc357600080fd5b9250929050565b600060208284031215613fdb578081fd5b8135610926816148e4565b60008060408385031215613ff8578081fd5b8235614003816148e4565b91506020830135614013816148e4565b809150509250929050565b600080600080600060808688031215614035578081fd5b8535614040816148e4565b94506020860135614050816148e4565b935060408601359250606086013567ffffffffffffffff811115614072578182fd5b61407e88828901613f83565b969995985093965092949392505050565b600080604083850312156140a1578182fd5b82356140ac816148e4565b9150602083013567ffffffffffffffff8111156140c7578182fd5b6140d385828601613ede565b9150509250929050565b600080604083850312156140ef578182fd5b82356140fa816148e4565b946020939093013593505050565b60008060006060848603121561411c578283fd5b8335614127816148e4565b925060208401359150604084013561413e816148f9565b809150509250925092565b6000806000806060858703121561415e578384fd5b8435614169816148e4565b935060208501359250604085013567ffffffffffffffff81111561418b578283fd5b61419787828801613f83565b95989497509550505050565b600080600080608085870312156141b8578384fd5b84356141c3816148e4565b9350602085013592506040850135915060608501356141e1816148e4565b939692955090935050565b600080600060608486031215614200578283fd5b833561420b816148e4565b95602085013595506040909401359392505050565b600060208284031215614231578081fd5b813567ffffffffffffffff811115614247578182fd5b612f0e84828501613ede565b600060208284031215614264578081fd5b8151610926816148f9565b600060208284031215614280578081fd5b5035919050565b60008060408385031215614299578182fd5b823591506020830135614013816148e4565b6000602082840312156142bc578081fd5b81356001600160e01b031981168114610926578182fd5b600080604083850312156142e5578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561432c5781516001600160a01b031687529582019590820190600101614307565b509495945050505050565b6000815480845260208085019450838352808320835b8381101561432c5781546001600160a01b03168752958201956001918201910161434d565b6005811061439057634e487b7160e01b600052602160045260246000fd5b9052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600082516143d0818460208701614830565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614412816017850160208801614830565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614443816028840160208801614830565b01602801949350505050565b6000602082526109266020830184614337565b6000604082526144756040830186614337565b8281036020840152614488818587614394565b9695505050505050565b6000604082526144a56040830184614337565b82810360209384015290815201919050565b600060208252612f0e602083018486614394565b60006020825282518060208401526144ea816040850160208701614830565b601f01601f19169190910160400192915050565b6020808252602f908201527f4f6e6c792076616c696461746f722077697468207374616b65732063616e206360408201526e185b1b081d1a1a5cc81b595d1a1bd9608a1b606082015260800190565b6020808252602d908201527f43616e6e6f74206163636570742076616c69646174696f6e2c20796f7520617260408201526c65206f7574206f662074696d6560981b606082015260800190565b6020808252603f908201527f596f75722061646472657373206973206e6f742077686974656c69737465642060408201527f696e207468652070726f6475637420736572766963652073657474696e677300606082015260800190565b60208082526041908201527f596f7520646f6e277420686176652061206465706f736974206177616974696e60408201527f672070726f636573732c20706c656173652063726561746520697420666972736060820152601d60fa1b608082015260a00190565b60208082526021908201527f4f6e6c7920736572766963652063616e2063616c6c2074686973206d6574686f6040820152601960fa1b606082015260800190565b6000602082526146b3602083018451614372565b602083015160408301526040830151606083015260608301516146e160808401826001600160a01b03169052565b5060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c083015160e083015260e0830151610100614732818501836001600160a01b03169052565b84015161012084810191909152840151610140808501919091528401516101e06101608086018290529192509061476d6102008601846142f4565b9086015190925061018061478b868201836001600160a01b03169052565b86015190506101a06147a08682018315159052565b86015190506101c06147bc868201836001600160a01b03169052565b90950151151593019290925250919050565b600082198211156147e1576147e16148a2565b500190565b6000826147f5576147f56148b8565b500490565b6000816000190483118215151615614814576148146148a2565b500290565b60008282101561482b5761482b6148a2565b500390565b60005b8381101561484b578181015183820152602001614833565b83811115610cf05750506000910152565b60008161486b5761486b6148a2565b506000190190565b6000600019821415614887576148876148a2565b5060010190565b60008261489d5761489d6148b8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461289857600080fd5b801515811461289857600080fdfea264697066735822122015736657d06ee9ddf0b6cef542c30c9e820ba19715a78ae9fe8286a7c6cff00064736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000005100000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
-----Decoded View---------------
Arg [0] : penaltyPerc (uint256): 10
Arg [1] : lockingPeriod (uint256): 20736
Arg [2] : token (address): 0xd5582D46F20f08CD6133aceCdE1456DF635cCdcC
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000005100
Arg [2] : 000000000000000000000000d5582d46f20f08cd6133acecde1456df635ccdcc
Deployed Bytecode Sourcemap
42226:27190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3875:10;46942:14;47008:18;;;:10;:18;;;;;;;;47027:19;:27;;;;;;47008:47;;;;;;;47074:13;;;;-1:-1:-1;;;;;47074:13:0;:27;47066:91;;;;-1:-1:-1;;;47066:91:0;;20183:2:1;47066:91:0;;;20165:21:1;20222:2;20202:18;;;20195:30;20261:34;20241:18;;;20234:62;-1:-1:-1;;;20312:18:1;;;20305:49;20371:19;;47066:91:0;;;;;;;;;47193:23;47176:13;;;;:40;;;;;;-1:-1:-1;;;47176:40:0;;;;;;;;;;47168:118;;;;-1:-1:-1;;;47168:118:0;;;;;;;:::i;:::-;47321:9;47305:7;:12;;;:25;47297:93;;;;-1:-1:-1;;;47297:93:0;;17808:2:1;47297:93:0;;;17790:21:1;17847:2;17827:18;;;17820:30;17886:34;17866:18;;;17859:62;17957:25;17937:18;;;17930:53;18000:19;;47297:93:0;17780:245:1;47297:93:0;47484:15;;;;47523:11;;;;-1:-1:-1;;;;;47484:15:0;;;;:52;;47509:26;;:9;;:13;:26::i;:::-;47484:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47600:42:0;;-1:-1:-1;;47600:42:0;47616:26;47600:42;;;47691:17;;;;47674:15;;;;47658:62;;47710:9;13795:25:1;;-1:-1:-1;;;;;47674:15:0;;;;47658:62;;;;;13783:2:1;13768:18;47658:62:0;;;;;;;46904:824;;42226:27190;;;;;11049:204;;;;;;;;;;-1:-1:-1;11049:204:0;;;;;:::i;:::-;;:::i;:::-;;;13622:14:1;;13615:22;13597:41;;13585:2;13570:18;11049:204:0;;;;;;;;61144:172;;;;;;;;;;-1:-1:-1;61144:172:0;;;;;:::i;:::-;;:::i;:::-;;48460:131;;;;;;;;;;-1:-1:-1;48460:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;48548:18:0;48524:4;48548:18;;;:9;:18;;;;;:35;;;;48460:131;;;;13795:25:1;;;13783:2;13768:18;48460:131:0;13750:76:1;61324:849:0;;;;;;;;;;-1:-1:-1;61324:849:0;;;;;:::i;:::-;;:::i;46050:128::-;;;;;;;;;;-1:-1:-1;46050:128:0;;;;;:::i;:::-;;:::i;46352:180::-;;;;;;;;;;-1:-1:-1;46352:180:0;;;;;:::i;:::-;;:::i;12885:131::-;;;;;;;;;;-1:-1:-1;12885:131:0;;;;;:::i;:::-;12959:7;12986:12;;;;;;;;;;:22;;;;12885:131;49074:142;;;;;;;;;;-1:-1:-1;49074:142:0;;;;;:::i;:::-;;:::i;13326:147::-;;;;;;;;;;-1:-1:-1;13326:147:0;;;;;:::i;:::-;;:::i;48828:131::-;;;;;;;;;;-1:-1:-1;48828:131:0;;;;;:::i;:::-;;:::i;14470:218::-;;;;;;;;;;-1:-1:-1;14470:218:0;;;;;:::i;:::-;;:::i;52833:161::-;;;;;;;;;;-1:-1:-1;52833:161:0;;;;;:::i;:::-;;:::i;48967:99::-;;;;;;;;;;-1:-1:-1;49044:14:0;;48967:99;;53002:171;;;;;;;;;;-1:-1:-1;53002:171:0;;;;;:::i;:::-;;:::i;48599:121::-;;;;;;;;;;-1:-1:-1;48599:121:0;;;;;:::i;:::-;;:::i;46674:103::-;;;;;;;;;;-1:-1:-1;46754:15:0;;46674:103;;68129:93;;;;;;;;;;-1:-1:-1;68202:12:0;;68129:93;;46785:111;;;;;;;;;;-1:-1:-1;46873:14:0;;46785:111;;-1:-1:-1;;;;;46873:14:0;;;11506:51:1;;11494:2;11479:18;46785:111:0;11461:102:1;48728:92:0;;;;;;;;;;-1:-1:-1;48800:12:0;;48728:92;;62181:3304;;;;;;;;;;-1:-1:-1;62181:3304:0;;;;;:::i;:::-;;:::i;46540:126::-;;;;;;;;;;-1:-1:-1;46540:126:0;;;;;:::i;:::-;;:::i;11345:147::-;;;;;;;;;;-1:-1:-1;11345:147:0;;;;;:::i;:::-;;:::i;48325:127::-;;;;;;;;;;-1:-1:-1;48325:127:0;;;;;:::i;:::-;;:::i;58388:2748::-;;;;;;;;;;-1:-1:-1;58388:2748:0;;;;;:::i;:::-;;:::i;10450:49::-;;;;;;;;;;-1:-1:-1;10450:49:0;10495:4;10450:49;;65653:1186;;;;;;;;;;-1:-1:-1;65653:1186:0;;;;;:::i;:::-;;:::i;68230:1181::-;;;;;;;;;;-1:-1:-1;68230:1181:0;;;;;:::i;:::-;;:::i;67843:141::-;;;;;;;;;;-1:-1:-1;67843:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;67950:15:0;;;;;:7;:15;;;;;:26;;;;;;;;;;;;;67943:33;;;;;;;;;;;;;;;;;;;;67843:141;;;;;28005:13:1;;27987:32;;28075:4;28063:17;;;28057:24;28035:20;;;28028:54;;;;27960:18;67843:141:0;27942:146:1;13766:149:0;;;;;;;;;;-1:-1:-1;13766:149:0;;;;;:::i;:::-;;:::i;66847:988::-;;;;;;;;;;-1:-1:-1;66847:988:0;;;;;:::i;:::-;;:::i;67992:129::-;;;;;;;;;;-1:-1:-1;67992:129:0;;;;;:::i;:::-;-1:-1:-1;;;;;68083:30:0;68056:7;68083:30;;;:19;:30;;;;;;;67992:129;65493:152;;;;;;;;;;-1:-1:-1;65493:152:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48066:251::-;;;;;;;;;;-1:-1:-1;48066:251:0;;;;;:::i;:::-;;:::i;47736:322::-;;;;;;;;;;-1:-1:-1;47736:322:0;;;;;:::i;:::-;;:::i;46186:158::-;;;;;;;;;;-1:-1:-1;46186:158:0;;;;;:::i;:::-;;:::i;38317:98::-;38375:7;38402:5;38406:1;38402;:5;:::i;:::-;38395:12;;38317:98;;;;;:::o;11049:204::-;11134:4;-1:-1:-1;;;;;;11158:47:0;;-1:-1:-1;;;11158:47:0;;:87;;-1:-1:-1;;;;;;;;;;8413:40:0;;;11209:36;11151:94;;11049:204;;;;:::o;61144:172::-;45223:10;45255:1;45213:21;;;:9;:21;;;;;:39;45205:89;;;;-1:-1:-1;;;45205:89:0;;;;;;;:::i;:::-;61292:9:::1;61280:10;-1:-1:-1::0;;;;;61263:45:0::1;61270:8;-1:-1:-1::0;;;;;61263:45:0::1;;61303:4;;61263:45;;;;;;;:::i;:::-;;;;;;;;61144:172:::0;;;;:::o;61324:849::-;61426:10;61455:1;61416:21;;;:9;:21;;;;;:36;;;:40;;;61415:70;;-1:-1:-1;61462:10:0;-1:-1:-1;;;;;61462:22:0;;;61415:70;61407:136;;;;-1:-1:-1;;;61407:136:0;;19000:2:1;61407:136:0;;;18982:21:1;19039:2;19019:18;;;19012:30;19078:34;19058:18;;;19051:62;-1:-1:-1;;;19129:18:1;;;19122:51;19190:19;;61407:136:0;18972:243:1;61407:136:0;-1:-1:-1;;;;;61580:20:0;;61554:23;61580:20;;;:10;:20;;;;;;;;:31;;;;;;;;61647:26;61630:13;;;;:43;;;;;;-1:-1:-1;;;61630:43:0;;;;;;;;;;61622:97;;;;-1:-1:-1;;;61622:97:0;;23915:2:1;61622:97:0;;;23897:21:1;23954:2;23934:18;;;23927:30;23993:34;23973:18;;;23966:62;-1:-1:-1;;;24044:18:1;;;24037:39;24093:19;;61622:97:0;23887:231:1;61622:97:0;61732:41;;-1:-1:-1;;61732:41:0;61748:25;61732:41;;;61805:12;61784:18;;;:33;61873:15;;;;61853:60;;-1:-1:-1;;;;;61873:15:0;-1:-1:-1;;61853:19:0;:60::i;:::-;61828:85;;;;:22;;;;:85;;;;;;:::i;:::-;-1:-1:-1;61924:22:0;;;:35;;-1:-1:-1;;;;;;61970:27:0;;;;;;62008:23;;;:36;;62055:28;;;;;62099:66;;62131:9;;62119:10;;-1:-1:-1;;;;;62099:66:0;;;;;;;62142:22;;;;62099:66;:::i;:::-;;;;;;;;61324:849;;;:::o;46050:128::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;46148:12:0::1;:22:::0;;-1:-1:-1;;;;;;46148:22:0::1;-1:-1:-1::0;;;;;46148:22:0;;;::::1;::::0;;;::::1;::::0;;46050:128::o;46352:180::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;46459:13:0::1;:25:::0;;;;46495:15:::1;:29:::0;46352:180::o;49074:142::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;49175:14:0::1;:33:::0;49074:142::o;13326:147::-;12959:7;12986:12;;;;;;;;;;:22;;;10941:16;10952:4;10941:10;:16::i;:::-;13440:25:::1;13451:4;13457:7;13440:10;:25::i;:::-;13326:147:::0;;;:::o;48828:131::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;48922:12:0::1;:29:::0;48828:131::o;14470:218::-;-1:-1:-1;;;;;14566:23:0;;3875:10;14566:23;14558:83;;;;-1:-1:-1;;;14558:83:0;;25212:2:1;14558:83:0;;;25194:21:1;25251:2;25231:18;;;25224:30;25290:34;25270:18;;;25263:62;-1:-1:-1;;;25341:18:1;;;25334:45;25396:19;;14558:83:0;25184:237:1;14558:83:0;14654:26;14666:4;14672:7;14654:11;:26::i;:::-;14470:218;;:::o;52833:161::-;52934:52;52957:1;52961:7;52970:9;52981:4;;52934:14;:52::i;:::-;52833:161;;;;:::o;53002:171::-;53118:47;53133:5;53140:7;53149:9;53160:4;;53118:14;:47::i;:::-;53002:171;;;;;:::o;48599:121::-;45223:10;45255:1;45213:21;;;:9;:21;;;;;:39;45205:89;;;;-1:-1:-1;;;45205:89:0;;;;;;;:::i;:::-;48677:10:::1;48667:21;::::0;;;:9:::1;:21;::::0;;;;:38:::1;;:45:::0;48599:121::o;62181:3304::-;62308:10;62322:1;62288:31;;;:19;:31;;;;;;62280:95;;;;-1:-1:-1;;;62280:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62412:20:0;;;62386:23;62412:20;;;:10;:20;;;;;;;;:31;;;;;;;;62489:15;;;;;;;62479:26;;:9;:26;;;;;;62462:67;;;;;;;;;;;;;;;;;;;;;;62479:26;62462:67;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62462:67:0;;;;;;;;;;;;;;;;;;;;;62518:10;62462:16;:67::i;:::-;62454:143;;;;-1:-1:-1;;;62454:143:0;;;;;;;:::i;:::-;62633:25;62616:13;;;;:42;;;;;;-1:-1:-1;;;62616:42:0;;;;;;;;;;62608:96;;;;-1:-1:-1;;;62608:96:0;;21868:2:1;62608:96:0;;;21850:21:1;21907:2;21887:18;;;21880:30;21946:34;21926:18;;;21919:62;-1:-1:-1;;;21997:18:1;;;21990:39;22046:19;;62608:96:0;21840:231:1;62608:96:0;62737:167;62767:7;:22;;62737:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62737:167:0;;;;;;;;;;;;;;;;;;;;;62808:10;62837:7;:18;;;62874:15;;62737:11;:167::i;:::-;62715:262;;;;-1:-1:-1;;;62715:262:0;;;;;;;:::i;:::-;63051:22;;;;-1:-1:-1;;;;;63051:22:0;63048:2430;;63104:22;;;:35;;-1:-1:-1;;;;;;63154:28:0;63129:10;-1:-1:-1;;;;63154:28:0;;-1:-1:-1;;;63154:28:0;;;;;;;;;63218:12;63197:18;;;:33;63290:15;;;;63270:72;;-1:-1:-1;;;;;63290:15:0;;;;63307:22;-1:-1:-1;63270:19:0;:72::i;:::-;63245:97;;;;:22;;;;:97;;;;;;:::i;:::-;-1:-1:-1;63382:15:0;;;;63362:71;;63399:9;;-1:-1:-1;;;;;63382:15:0;;;;63362:71;;;;;;;;63410:22;;;;63362:71;:::i;:::-;;;;;;;;63048:2430;;;63525:23;;;;-1:-1:-1;;;;;63525:23:0;63522:1956;;63579:23;;;:36;;-1:-1:-1;;;;;;63630:29:0;63605:10;-1:-1:-1;;;;63630:29:0;;-1:-1:-1;;;63630:29:0;;;;;;;;;;;;;63741:19;;;;63764:20;;;;63630:29;63764:20;;;63741:43;;:19;;;;;;;;:43;;;63738:651;;;63805:58;63818:8;63828:9;63840:7;:19;;;;;;;;;;;;63839:20;63861:1;63805:12;:58::i;:::-;63882:31;;63898:15;-1:-1:-1;;63882:31:0;;;;;;63956:15;;;;63984:19;;;;63937:67;;;-1:-1:-1;;;63984:19:0;;;;;13622:14:1;13615:22;13597:41;;63937:67:0;63973:9;;-1:-1:-1;;;;;63956:15:0;;;;63937:67;;;;;;;;;13585:2:1;63937:67:0;;;63738:651;;;64137:12;64116:18;;;:33;64213:15;;;;64230:22;;;;64254:23;;;;64193:85;;-1:-1:-1;;;;;64213:15:0;;;;64230:22;;;64254:23;64193:19;:85::i;63738:651::-;63522:1956;;;64485:19;;;;;-1:-1:-1;;;64485:19:0;;;;:29;;;;;;64482:852;;;64602:12;;64573:23;;;;-1:-1:-1;;;;;64573:23:0;64535:15;64553:44;;;:19;:44;;;;;;64535:15;;64553:71;;64620:3;;64553:62;;:44;:48;:62::i;:::-;:66;;:71::i;:::-;64682:23;;;;64535:89;;-1:-1:-1;64643:22:0;;64668:47;;-1:-1:-1;;;;;64682:23:0;64535:89;64668:13;:47::i;:::-;64734:23;;;:36;;-1:-1:-1;;;;;;64789:29:0;64760:10;-1:-1:-1;;;;64789:29:0;;-1:-1:-1;;;64789:29:0;;;;;;;;;;;;64872:19;;;;64643:72;;-1:-1:-1;64837:71:0;;64850:8;;64860:9;;64789:29;64872:19;;;;64871:20;64643:72;64837:12;:71::i;:::-;64482:852;;;;;65015:12;;64987:22;;;;-1:-1:-1;;;;;64987:22:0;64949:15;64967:43;;;:19;:43;;;;;;64949:15;;64967:70;;65033:3;;64967:61;;:43;:47;:61::i;:70::-;65095:22;;;;64949:88;;-1:-1:-1;65056:22:0;;65081:46;;-1:-1:-1;;;;;65095:22:0;64949:88;65081:13;:46::i;:::-;65146:22;;;:35;;-1:-1:-1;;;;;;65200:28:0;65171:10;-1:-1:-1;;;;65200:28:0;;-1:-1:-1;;;65200:28:0;;;;;;;;;;;;;65056:71;;-1:-1:-1;65247:71:0;;65260:8;;65270:9;;65200:28;65282:19;;;65281:20;65056:71;65247:12;:71::i;:::-;64482:852;;;65348:31;;65364:15;-1:-1:-1;;65348:31:0;;;;;;65418:15;;;;65446:19;;;;65399:67;;-1:-1:-1;;;65446:19:0;;;;;13622:14:1;13615:22;13597:41;;65435:9:0;;-1:-1:-1;;;;;65418:15:0;;;;65399:67;;;;;;13585:2:1;13570:18;65399:67:0;13552:92:1;46540:126:0;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;46634:15:0::1;:24:::0;46540:126::o;11345:147::-;11431:4;11455:12;;;;;;;;;;;-1:-1:-1;;;;;11455:29:0;;;;;;;;;;;;;;;11345:147::o;48325:127::-;45223:10;45255:1;45213:21;;;:9;:21;;;;;:39;45205:89;;;;-1:-1:-1;;;45205:89:0;;;;;;;:::i;:::-;48414:10:::1;48404:21;::::0;;;:9:::1;:21;::::0;;;;;;;:40;;::::1;::::0;;::::1;::::0;::::1;:::i;58388:2748::-:0;58540:10;58554:1;58520:31;;;:19;:31;;;;;;58512:95;;;;-1:-1:-1;;;58512:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58644:20:0;;;58618:23;58644:20;;;:10;:20;;;;;;;;:31;;;;;;;;58721:15;;;;;;;58711:26;;:9;:26;;;;;;58694:67;;;;;;;;;;;;;;;;;;;;;;58711:26;58694:67;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58694:67:0;;;;;;;;;;;;;;;;;;;;58750:10;58694:16;:67::i;:::-;58686:143;;;;-1:-1:-1;;;58686:143:0;;;;;;;:::i;:::-;58865:19;58848:13;;;;:36;;;;;;-1:-1:-1;;;58848:36:0;;;;;;;;;;58840:85;;;;-1:-1:-1;;;58840:85:0;;17403:2:1;58840:85:0;;;17385:21:1;17442:2;17422:18;;;17415:30;17481:34;17461:18;;;17454:62;-1:-1:-1;;;17532:18:1;;;17525:34;17576:19;;58840:85:0;17375:226:1;58840:85:0;58958:167;58988:7;:22;;58958:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58958:167:0;;;;;;;;;;;;;;;;;;;;59029:10;59058:7;:18;;;59095:15;;58958:11;:167::i;:::-;58936:262;;;;-1:-1:-1;;;58936:262:0;;;;;;;:::i;:::-;59214:22;;;;-1:-1:-1;;;;;59214:22:0;59211:1918;;59267:22;;;:35;;-1:-1:-1;;;;;;59267:35:0;;;59292:10;59267:35;;;;;;;59317:12;;:19;;;59351:15;;;:29;;-1:-1:-1;;;;;59351:29:0;;;;;;;;;;59416:12;59395:18;;;:33;-1:-1:-1;59488:15:0;;;59468:72;;59488:15;;;59267:22;59468:19;:72::i;:::-;59443:97;;;;:22;;;;:97;;;;;;:::i;:::-;-1:-1:-1;59582:15:0;;;;59560:77;;59599:9;;-1:-1:-1;;;;;59582:15:0;;;;59560:77;;;;;;;;59610:22;;;;59560:77;:::i;:::-;;;;;;;;59211:1918;;;59658:23;;;;-1:-1:-1;;;;;59658:23:0;59655:1474;;59712:23;;;:36;;59738:10;-1:-1:-1;;;;;;59712:36:0;;;;;;;59763:16;;;:23;;;59801:19;;;:33;;;;;-1:-1:-1;;;;;59801:33:0;;;;;-1:-1:-1;59852:12:0;;;:32;;:74;;;;-1:-1:-1;59907:19:0;;;;59888:15;;;;-1:-1:-1;;;;;59888:15:0;;;59907:19;;59888:38;59852:74;59849:614;;;59961:44;59989:15;;59961:23;59970:13;;59961:4;:8;;:23;;;;:::i;:44::-;59947:11;;;:58;60024:39;;-1:-1:-1;;60024:39:0;60040:23;60024:39;;;60110:15;;;;60087:56;;13795:25:1;;;60127:9:0;;-1:-1:-1;;;;;60110:15:0;;;;60087:56;;;;;;13783:2:1;13768:18;60087:56:0;;;;;;;59849:614;;;60205:12;60184:18;;;:33;60281:15;;;;60298:22;;;;60322:23;;;;60261:85;;-1:-1:-1;;;;;60281:15:0;;;;60298:22;;;60322:23;60261:19;:85::i;59849:614::-;59655:1474;;;60514:4;60498:7;:12;;;:20;:54;;;;-1:-1:-1;60522:15:0;;;;-1:-1:-1;;;;;60522:30:0;;;:15;;:30;60498:54;60495:386;;;60573:23;;;:36;;60599:10;-1:-1:-1;;;;;;60573:36:0;;;;;;;60628:16;;;:23;;;60670:19;;;:33;;;;;-1:-1:-1;;;;;60670:33:0;;;;;60495:386;;;60744:22;;;:35;;60769:10;-1:-1:-1;;;;;;60744:35:0;;;;;;;-1:-1:-1;60798:12:0;;:19;;;60836:15;;;:29;;;;;-1:-1:-1;;;;;60836:29:0;;;;;60495:386;60895:12;;;:19;;;60971:15;;60952:13;;60943:44;;60971:15;60943:23;;60910:4;;60943:8;:23::i;:44::-;60929:11;;;:58;61002:39;;-1:-1:-1;;61002:39:0;61018:23;61002:39;;;61084:15;;;;61061:56;;13795:25:1;;;61101:9:0;;-1:-1:-1;;;;;61084:15:0;;;;61061:56;;;;;;13783:2:1;13768:18;61061:56:0;;;;;;;58388:2748;;;;;:::o;65653:1186::-;-1:-1:-1;;;;;65731:23:0;;65723:65;;;;-1:-1:-1;;;65723:65:0;;15438:2:1;65723:65:0;;;15420:21:1;15477:2;15457:18;;;15450:30;15516:31;15496:18;;;15489:59;15565:18;;65723:65:0;15410:179:1;65723:65:0;65816:1;65807:6;:10;65799:37;;;;-1:-1:-1;;;65799:37:0;;16224:2:1;65799:37:0;;;16206:21:1;16263:2;16243:18;;;16236:30;-1:-1:-1;;;16282:18:1;;;16275:44;16336:18;;65799:37:0;16196:164:1;65799:37:0;65864:14;;:62;;-1:-1:-1;;;65864:62:0;;65892:10;65864:62;;;11808:34:1;65912:4:0;11858:18:1;;;11851:43;11910:18;;;11903:34;;;65849:12:0;;-1:-1:-1;;;;;65864:14:0;;:27;;11743:18:1;;65864:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65849:77;;65940:7;65937:895;;;65979:12;;:24;;65996:6;65979:16;:24::i;:::-;65964:12;:39;66071:10;66018:18;66063:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66063:30:0;;;;;;;;;:37;:41;66059:102;;-1:-1:-1;66141:4:0;66059:102;66223:10;66215:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66215:30:0;;;;;;;;;:37;:49;;66257:6;66215:41;:49::i;:::-;66183:10;66175:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66175:30:0;;;;;;;;;:89;66342:14;;66327:29;;:12;:29;:::i;:::-;66287:10;66279:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66279:30:0;;;;;;;;;:45;;:77;;;;66404:19;:30;;;;:42;;66439:6;66404:34;:42::i;:::-;-1:-1:-1;;;;;66371:30:0;;;;;;:19;:30;;;;;:75;66465:22;;;;:93;;-1:-1:-1;;;;;;66508:28:0;;;;;;:17;:28;;;;;;;;;66491:58;;;;;;;;;;;;;;;;;;;;;;66508:28;66491:58;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66491:58:0;;;;;;;;;;;;;;;;;;;;66538:10;66491:16;:58::i;:::-;:67;66465:93;66461:179;;;-1:-1:-1;;;;;66579:28:0;;;;;;:17;:28;;;;;;;:45;;;;;;;;;;;;;;;-1:-1:-1;;;;;;66579:45:0;66613:10;66579:45;;;66461:179;66666:10;66697:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66659:84:0;;66697:30;;;;;;;;;;:45;;;66659:84;;28449:25:1;;;28490:18;;;28483:34;66659:84:0;;66666:10;66659:84;;28422:18:1;66659:84:0;;;;;;;65937:895;;;;66776:44;;-1:-1:-1;;;66776:44:0;;23154:2:1;66776:44:0;;;23136:21:1;23193:2;23173:18;;;23166:30;23232:34;23212:18;;;23205:62;-1:-1:-1;;;23283:18:1;;;23276:32;23325:19;;66776:44:0;23126:224:1;68230:1181:0;68320:10;68283:23;68309:22;;;:10;:22;;;;;;;;68332:19;:31;;;;;;68309:55;;;;;;;68383:13;;;;-1:-1:-1;;;;;68383:13:0;68375:99;;;;-1:-1:-1;;;68375:99:0;;15796:2:1;68375:99:0;;;15778:21:1;15835:2;15815:18;;;15808:30;15874:34;15854:18;;;15847:62;15945:29;15925:18;;;15918:57;15992:19;;68375:99:0;15768:249:1;68375:99:0;68510:23;68493:13;;;;:40;;;;;;-1:-1:-1;;;68493:40:0;;;;;;;;;;68485:118;;;;-1:-1:-1;;;68485:118:0;;;;;;;:::i;:::-;68638:6;68622:7;:12;;;:22;68614:87;;;;-1:-1:-1;;;68614:87:0;;16567:2:1;68614:87:0;;;16549:21:1;16606:2;16586:18;;;16579:30;16645:34;16625:18;;;16618:62;-1:-1:-1;;;16696:18:1;;;16689:50;16756:19;;68614:87:0;16539:242:1;68614:87:0;68783:13;;;;-1:-1:-1;;;;;68783:13:0;68875:67;68783:13;3875:10;68928:4;68935:6;68875:30;:67::i;:::-;69071:15;;;;69100:11;;;;69036:77;;-1:-1:-1;;;;;69071:15:0;;69089:23;;:6;;:10;:23::i;:::-;-1:-1:-1;;;;;69036:26:0;;;:77;:26;:77::i;:::-;69175:42;;-1:-1:-1;;69175:42:0;69191:26;69175:42;;;69272:17;;;;69255:15;;;;-1:-1:-1;;;;;69255:15:0;3875:10;-1:-1:-1;;;;;69233:65:0;;69291:6;69233:65;;;;13795:25:1;;13783:2;13768:18;;13750:76;13766:149:0;12959:7;12986:12;;;;;;;;;;:22;;;10941:16;10952:4;10941:10;:16::i;:::-;13881:26:::1;13893:4;13899:7;13881:11;:26::i;66847:988::-:0;66936:1;66927:6;:10;66919:39;;;;-1:-1:-1;;;66919:39:0;;19422:2:1;66919:39:0;;;19404:21:1;19461:2;19441:18;;;19434:30;-1:-1:-1;;;19480:18:1;;;19473:46;19536:18;;66919:39:0;19394:166:1;66919:39:0;66985:10;66977:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;66977:30:0;;;;;;;;;:37;:47;-1:-1:-1;66977:47:0;66969:127;;;;-1:-1:-1;;;66969:127:0;;24736:2:1;66969:127:0;;;24718:21:1;24775:2;24755:18;;;24748:30;24814:34;24794:18;;;24787:62;24885:34;24865:18;;;24858:62;-1:-1:-1;;;24936:19:1;;;24929:34;24980:19;;66969:127:0;24708:297:1;66969:127:0;67156:10;67148:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;67148:30:0;;;;;;;;;:45;;;67197:12;-1:-1:-1;67148:61:0;67140:124;;;;-1:-1:-1;;;67140:124:0;;21449:2:1;67140:124:0;;;21431:21:1;21488:2;21468:18;;;21461:30;21527:34;21507:18;;;21500:62;-1:-1:-1;;;21578:18:1;;;21571:48;21636:19;;67140:124:0;21421:240:1;67140:124:0;67377:14;;:43;;-1:-1:-1;;;67377:43:0;;67401:10;67377:43;;;12122:51:1;12189:18;;;12182:34;;;67362:12:0;;-1:-1:-1;;;;;67377:14:0;;:23;;12095:18:1;;67377:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67362:58;;67434:7;67431:397;;;67474:6;67458:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;67543:10:0;67535:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;67535:30:0;;;;;;;;;:37;:46;;67575:6;;67535:46;:::i;:::-;67503:10;67495:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;67495:30:0;;;;;;;;;:86;;;;67629:19;:30;;;;:39;;67662:6;;67629:39;:::i;:::-;-1:-1:-1;;;;;67596:30:0;;;;;;:19;:30;;;;;;;:72;;;;67688:39;;67697:10;;67688:39;;;;67720:6;13795:25:1;;13783:2;13768:18;;13750:76;67688:39:0;;;;;;;;67431:397;;;67760:56;;-1:-1:-1;;;67760:56:0;;16988:2:1;67760:56:0;;;16970:21:1;17027:2;17007:18;;;17000:30;17066:34;17046:18;;;17039:62;-1:-1:-1;;;17117:18:1;;;17110:44;17171:19;;67760:56:0;16960:236:1;65493:152:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65606:20:0;;;;:10;:20;;;;;:31;;;;;;;;65599:38;;;;;;;;;;-1:-1:-1;;65599:38:0;;;;;;;;;;;;-1:-1:-1;;;65599:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;65599:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65599:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65599:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;65599:38:0;;;-1:-1:-1;;65599:38:0;;;;-1:-1:-1;;;;;65599:38:0;;;;;;;;-1:-1:-1;;;65599:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65493:152:0;;;;:::o;48066:251::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;;;;;;48207:18:0;;::::1;48180:24;48207:18:::0;;;:9:::1;:18;::::0;;;;48236:23:::1;::::0;::::1;:31:::0;;;;48278:23:::1;;:31:::0;48066:251::o;47736:322::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;47869:1:::1;47854:5;:12;:16;47846:61;;;::::0;-1:-1:-1;;;47846:61:0;;18232:2:1;47846:61:0::1;::::0;::::1;18214:21:1::0;;;18251:18;;;18244:30;18310:34;18290:18;;;18283:62;18362:18;;47846:61:0::1;18204:182:1::0;47846:61:0::1;47939:111;::::0;;::::1;::::0;::::1;::::0;;;;;47983:15:::1;::::0;47939:111:::1;::::0;;::::1;::::0;;;;48016:11:::1;::::0;47939:111;;;;48047:1:::1;47939:111:::0;;;;-1:-1:-1;;;;;47918:18:0;::::1;-1:-1:-1::0;47918:18:0;;;:9:::1;:18:::0;;;;;;:132;;;;47939:111;;47918:18;;:132:::1;::::0;:18;;:132:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;47918:132:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;47736:322:0:o;46186:158::-;10495:4;10941:16;10495:4;10941:10;:16::i;:::-;-1:-1:-1;46283:15:0::1;:23:::0;;;;46317:11:::1;:19:::0;46186:158::o;49929:1475::-;-1:-1:-1;;;;;50136:29:0;;;50062:24;50136:29;;;:19;:29;;;;;;;50104;;;;;;;;50089:12;;50033:16;;50136:29;50089:44;;;:::i;:::-;:76;;;;:::i;:::-;-1:-1:-1;;;;;50224:18:0;;;50176:13;50224:18;;;:9;:18;;;;;:36;50062:103;;-1:-1:-1;50176:13:0;50224:36;50275:22;;;50271:72;;50314:17;50330:1;50314:17;;:::i;:::-;;;50271:72;-1:-1:-1;;;;;50357:22:0;;;50353:72;;50396:17;50412:1;50396:17;;:::i;:::-;;;50353:72;50435:23;50475:12;50461:27;;;;;;-1:-1:-1;;;50461:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50461:27:0;;50435:53;;50505:6;50501:872;50519:6;:13;50515:1;:17;50501:872;;;50573:16;50562:8;:6;:8::i;:::-;:27;;;;:::i;:::-;50554:35;;50608:6;50604:758;-1:-1:-1;;;;;50622:18:0;;;;;;:9;:18;;;;;:36;50618:40;;50604:758;;;-1:-1:-1;;;;;50688:18:0;;;;;;;:9;:18;;;;;:32;;:44;;;;50718:1;;50688:32;;;;-1:-1:-1;;;50688:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50688:32:0;:44;;;;:92;;-1:-1:-1;;;;;;50736:18:0;;;;;;;:9;:18;;;;;:32;;:44;;;;50766:1;;50736:32;;;;-1:-1:-1;;;50736:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50736:32:0;:44;;50688:92;50684:663;;;-1:-1:-1;;;;;50834:18:0;;;;;;:9;:18;;;;;:32;;50809:58;;50826:6;;50864:1;;50834:32;;;;-1:-1:-1;;;50834:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50834:32:0;50809:16;:58::i;:::-;50805:523;;-1:-1:-1;;;;;50938:18:0;;50918:53;50938:18;;;:9;:18;;;;;:32;;50918:19;;:53;50938:18;50968:1;;50938:32;;;;-1:-1:-1;;;50938:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50938:32:0;50918:53;;;;;;;;;;;;;50909:62;;50905:311;;-1:-1:-1;;;;;51016:18:0;;;;;;:9;:18;;;;;:32;;51046:1;;51016:32;;;;-1:-1:-1;;;51016:32:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51016:32:0;51004:6;51011:1;51004:9;;;;;;-1:-1:-1;;;51004:9:0;;;;;;;;;-1:-1:-1;;;;;51004:44:0;;;:9;;;;;;;;;;:44;;;;51119:18;;;51099:53;51119:18;;;:9;:18;;;;;;:32;;51099:19;;:53;51119:18;51149:1;;51119:32;;;;-1:-1:-1;;;51119:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51119:32:0;51099:53;;;;;;;;;;;;;51079:73;;;;:::i;:::-;;;51183:5;;50905:311;-1:-1:-1;;;;;51271:18:0;;51251:53;51271:18;;;:9;:18;;;;;:32;;51251:19;;:53;51271:18;51301:1;;51271:32;;;;-1:-1:-1;;;51271:32:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51271:32:0;51251:53;;;;;;;;;;;;;51242:62;;;;:::i;:::-;;;50805:523;50660:3;;;;:::i;:::-;;;;50604:758;;;-1:-1:-1;50534:3:0;;;;:::i;:::-;;;;50501:872;;;-1:-1:-1;51390:6:0;-1:-1:-1;;;;49929:1475:0;;;;;;:::o;11796:105::-;11863:30;11874:4;3875:10;11863;:30::i;:::-;11796:105;:::o;16067:238::-;16151:22;16159:4;16165:7;16151;:22::i;:::-;16146:152;;16190:6;:12;;;;;;;;;;;-1:-1:-1;;;;;16190:29:0;;;;;;;;;:36;;-1:-1:-1;;16190:36:0;16222:4;16190:36;;;16273:12;3875:10;3795:98;;16273:12;-1:-1:-1;;;;;16246:40:0;16264:7;-1:-1:-1;;;;;16246:40:0;16258:4;16246:40;;;;;;;;;;16067:238;;:::o;16485:239::-;16569:22;16577:4;16583:7;16569;:22::i;:::-;16565:152;;;16640:5;16608:12;;;;;;;;;;;-1:-1:-1;;;;;16608:29:0;;;;;;;;;;:37;;-1:-1:-1;;16608:37:0;;;16665:40;3875:10;;16608:12;;16665:40;;16640:5;16665:40;16485:239;;:::o;51412:1413::-;-1:-1:-1;;;;;51537:18:0;;51573:1;51537:18;;;:9;:18;;;;;:33;;;51529:85;;;;-1:-1:-1;;;51529:85:0;;14673:2:1;51529:85:0;;;14655:21:1;14712:2;14692:18;;;14685:30;14751:34;14731:18;;;14724:62;-1:-1:-1;;;14802:18:1;;;14795:33;14845:19;;51529:85:0;14645:225:1;51529:85:0;51644:10;51686:1;51633:22;;;:10;:22;;;;;;;;:33;;;;;;;;:41;;;-1:-1:-1;;;;;51633:41:0;:55;51625:114;;;;-1:-1:-1;;;51625:114:0;;25628:2:1;51625:114:0;;;25610:21:1;25667:2;25647:18;;;25640:30;25706:34;25686:18;;;25679:62;-1:-1:-1;;;25757:18:1;;;25750:44;25811:19;;51625:114:0;25600:236:1;51625:114:0;51788:585;;;;;;;;;;-1:-1:-1;51788:585:0;;;;51858:1;51788:585;;;;51884:1;51788:585;;;;51907:5;-1:-1:-1;;;;;51788:585:0;;;;;51952:1;-1:-1:-1;;;;;51788:585:0;;;;;51999:1;-1:-1:-1;;;;;51788:585:0;;;;;52022:1;51788:585;;;;52047:7;-1:-1:-1;;;;;51788:585:0;;;;;52080:9;51788:585;;;;52116:12;51788:585;;;;52159:52;52179:7;52196:1;52208;52159:19;:52::i;:::-;51788:585;;52250:1;51788:585;;;;;;;;;;;;;;;;;;;;;;;;;;;51763:10;51752:22;;:10;:22;;;;;:33;;;;;;:621;;;;:33;;-1:-1:-1;;51752:621:0;51788:585;51752:621;;;;;;;-1:-1:-1;;;51752:621:0;;;;;;;;;;;;;-1:-1:-1;51752:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51752:621:0;;;-1:-1:-1;;;;;;51752:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51752:621:0;;;;;;;;;;;;;;;;-1:-1:-1;;;51752:621:0;;;-1:-1:-1;;;;;;51752:621:0;;;-1:-1:-1;;;;;51752:621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52401:10;51752:621;52433:22;;;;;;;;;;;:33;;;;;;;;;52389:99;;52422:9;;52389:99;;;;;;;;52433:48;;;52483:4;;;;52389:99;:::i;:::-;;;;;;;;52524:10;52545:1;52504:31;;;52566:10;52504:31;52566:22;;;;;;;52504:19;52589:31;;;;;;52566:55;;;;;;;:61;52631:23;;52566:61;;:88;;;;;;-1:-1:-1;;;52566:88:0;;;;;;;;;;52563:190;;;52693:10;52682:22;;;;:10;:22;;;;;;;;52705:19;:31;;;;;;52682:55;;;;;;;52675:62;;-1:-1:-1;;52675:62:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52675:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52682:55;52675:62;;;;52682:22;52675:62;:::i;:::-;-1:-1:-1;52675:62:0;;;;;-1:-1:-1;;;;;;52675:62:0;;;;;;;;;;;;;;;;;52563:190;-1:-1:-1;;52794:10:0;52774:31;;;;:19;:31;;;;;:43;-1:-1:-1;;51412:1413:0:o;45774:268::-;45862:4;;45879:133;45897:5;:12;45893:1;:16;45879:133;;;45947:6;-1:-1:-1;;;;;45935:18:0;:5;45941:1;45935:8;;;;;;-1:-1:-1;;;45935:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45935:18:0;;45931:70;;;45981:4;45974:11;;;;;45931:70;45911:3;;;;:::i;:::-;;;;45879:133;;;-1:-1:-1;46029:5:0;;45774:268;-1:-1:-1;;;45774:268:0:o;49224:454::-;49340:4;;49357:291;49375:4;:11;49371:1;:15;49357:291;;;49422:6;-1:-1:-1;;;;;49411:17:0;:4;49416:1;49411:7;;;;;;-1:-1:-1;;;49411:7:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49411:17:0;;49408:229;;;49497:25;49512:10;49497:12;:25;:::i;:::-;49480:11;49484:7;49480:1;:11;:::i;:::-;49479:44;;:123;;;;-1:-1:-1;49594:7:0;49580:11;49594:7;49580:1;:11;:::i;:::-;:21;;;;:::i;:::-;49550:25;49565:10;49550:12;:25;:::i;:::-;49549:53;49479:123;49449:172;;;;;49408:229;49388:3;;;;:::i;:::-;;;;49357:291;;;;49665:5;49658:12;;49224:454;;;;;;;:::o;56143:1499::-;-1:-1:-1;;;;;56280:20:0;;;56254:23;56280:20;;;:10;:20;;;;;;;;:31;;;;;;;;56372:15;;;;;;;56362:26;;:9;:26;;;;;56372:15;56362:41;;56346:11;;;;:67;;56409:3;;56346:58;;:15;:58::i;:67::-;56463:22;;;;56487:23;;;;56527:13;;;;56322:91;;-1:-1:-1;56424:21:0;;56448:93;;-1:-1:-1;;;;;56463:22:0;;;;56487:23;;;56322:91;;56527:13;56448:14;:93::i;:::-;56424:117;-1:-1:-1;56555:9:0;;56552:109;;56594:22;;;;56618:23;;;;56581:68;;-1:-1:-1;;;;;56594:22:0;;;;56618:23;56643:5;56581:12;:68::i;:::-;56676:19;56673:962;;56766:15;;;;-1:-1:-1;;;;;56766:15:0;56712:25;56756:26;;;:9;:26;;;;;:41;;;56740:11;;;;:67;;56803:3;;56740:58;;:15;:58::i;:67::-;56825:13;;;;56712:95;;-1:-1:-1;;;;;;56825:13:0;56822:483;;56881:15;;;;56873:52;;-1:-1:-1;;;;;56881:15:0;;;;56873:52;;;;;56907:17;;56881:15;56873:52;56881:15;56873:52;56907:17;56881:15;56873:52;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56944:12:0;;56966:11;;;;-1:-1:-1;;;;;56944:12:0;;;;:70;;56996:17;;56966:27;;56980:13;;56966:27;:::i;:::-;:47;;;;:::i;:::-;56944:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56822:483;;;57085:13;;;;57141:15;;;;57118:58;;-1:-1:-1;;;57118:58:0;;-1:-1:-1;;;;;57141:15:0;;;57118:58;;;12122:51:1;12189:18;;;12182:34;;;57085:13:0;;;;;57118:22;;12095:18:1;;57118:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;57226:12:0;;57241:11;;;;-1:-1:-1;;;;;57195:22:0;;;;;;57226:12;;;57271:17;;57241:27;;57255:13;;57241:27;:::i;:::-;:47;;;;:::i;:::-;57195:94;;-1:-1:-1;;;;;;57195:94:0;;;;;;;-1:-1:-1;;;;;12140:32:1;;;57195:94:0;;;12122:51:1;12189:18;;;12182:34;12095:18;;57195:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56822:483;;56673:962;;;;57340:13;;;;-1:-1:-1;;;;;57340:13:0;57337:287;;57396:8;-1:-1:-1;;;;;57388:26:0;:55;57429:13;57415:7;:11;;;:27;;;;:::i;:::-;57388:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57337:287;57514:13;;;;57580:11;;;;-1:-1:-1;;;;;57514:13:0;;;;;;57547:22;;57570:8;;57580:27;;57594:13;;57580:27;:::i;:::-;57547:61;;-1:-1:-1;;;;;;57547:61:0;;;;;;;-1:-1:-1;;;;;12140:32:1;;;57547:61:0;;;12122:51:1;12189:18;;;12182:34;12095:18;;57547:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57337:287;;56143:1499;;;;;;;:::o;38674:98::-;38732:7;38759:5;38763:1;38759;:5;:::i;39073:98::-;39131:7;39158:5;39162:1;39158;:5;:::i;57650:730::-;57726:7;;;57781:427;-1:-1:-1;;;;;57805:28:0;;;;;;:17;:28;;;;;:35;57801:39;;57781:427;;;-1:-1:-1;;;;;57879:28:0;;57862:14;57879:28;;;:17;:28;;;;;:31;;57908:1;;57879:31;;;;-1:-1:-1;;;57879:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58009:30:0;;;;;;:19;:30;;;;;;;57879:31;;;;57962:15;;;:7;:15;;;;;:26;;;;;;;;:33;57879:31;;-1:-1:-1;57950:100:0;;58046:3;;57950:91;;57962:78;;58009:30;57950:91;;58046:3;57962:37;:42::i;:78::-;57950:7;;:11;:91::i;:100::-;-1:-1:-1;;;;;58101:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:33;57925:125;;-1:-1:-1;58101:50:0;;57925:125;;58101:50;:::i;:::-;-1:-1:-1;;;;;58065:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:86;58166:30;58182:14;58166:30;;:::i;:::-;;;57781:427;;57842:3;;;;;:::i;:::-;;;;57781:427;;;-1:-1:-1;;;;;;58286:30:0;;;;;;:19;:30;;;;;:46;;58320:12;;58286:30;:46;;58320:12;;58286:46;:::i;:::-;;;;-1:-1:-1;58360:12:0;;57650:730;-1:-1:-1;;;;57650:730:0:o;37936:98::-;37994:7;38021:5;38025:1;38021;:5;:::i;31483:248::-;31654:68;;-1:-1:-1;;;;;11826:15:1;;;31654:68:0;;;11808:34:1;11878:15;;11858:18;;;11851:43;11910:18;;;11903:34;;;31627:96:0;;31647:5;;-1:-1:-1;;;31677:27:0;11743:18:1;;31654:68:0;;;;-1:-1:-1;;31654:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31654:68:0;-1:-1:-1;;;;;;31654:68:0;;;;;;;;;;31627:19;:96::i;31264:211::-;31408:58;;-1:-1:-1;;;;;12140:32:1;;31408:58:0;;;12122:51:1;12189:18;;;12182:34;;;31381:86:0;;31401:5;;-1:-1:-1;;;31431:23:0;12095:18:1;;31408:58:0;12077:145:1;49686:235:0;49726:7;49877:16;49895:15;49860:51;;;;;;;;11265:19:1;;;11309:2;11300:12;;11293:28;11346:2;11337:12;;11255:100;49860:51:0;;;;;;;;;;;;;49850:62;;;;;;49842:71;;49835:78;;49686:235;:::o;12191:505::-;12280:22;12288:4;12294:7;12280;:22::i;:::-;12275:414;;12468:41;12496:7;-1:-1:-1;;;;;12468:41:0;12506:2;12468:19;:41::i;:::-;12582:38;12610:4;12617:2;12582:19;:38::i;:::-;12373:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12373:270:0;;;;;;;;;;-1:-1:-1;;;12319:358:0;;;;;;;:::i;54887:620::-;-1:-1:-1;;;;;55162:36:0;;;55014:7;55162:36;;;:19;:36;;;;;;;55122:35;;;;;;;;55014:7;;;;55056:154;;55206:3;;55056:145;;55073:127;;55122:77;;:39;:77::i;:::-;-1:-1:-1;;;;;55073:35:0;;;;;;:19;:35;;;;;;:44;;55113:3;55073:39;:44::i;:127::-;55056:12;;:16;:145::i;:154::-;55034:176;-1:-1:-1;55221:20:0;55244:26;55034:176;55244:12;:26;:::i;:::-;55221:49;;55281:24;55308:47;55320:14;55336:11;55349:5;55308:11;:47::i;:::-;55281:74;;55366:25;55394:49;55406:15;55423:12;55437:5;55394:11;:49::i;:::-;55366:77;-1:-1:-1;55463:36:0;55366:77;55463:16;:36;:::i;:::-;55456:43;54887:620;-1:-1:-1;;;;;;;;;54887:620:0:o;55515:::-;-1:-1:-1;;;;;55741:36:0;;;55621:18;55741:36;;;:19;:36;;;;;;;55701:35;;;;;;;;55621:18;;55642:147;;55785:3;;55642:138;;55652:127;;55701:77;;:35;:39;:77::i;:::-;-1:-1:-1;;;;;55652:35:0;;;;;;:19;:35;;;;;;:44;;55692:3;55652:39;:44::i;:127::-;55642:5;;:9;:138::i;:147::-;55621:168;-1:-1:-1;55800:19:0;55822:18;55621:168;55822:5;:18;:::i;:::-;55800:40;;55851:23;55877:38;55888:14;55904:10;55877;:38::i;:::-;55851:64;;55926:24;55953:40;55964:15;55981:11;55953:10;:40::i;:::-;-1:-1:-1;;;;;56006:35:0;;;;;;:19;:35;;;;;:54;;55926:67;;-1:-1:-1;56045:15:0;;56006:35;;;:54;;56045:15;;56006:54;:::i;:::-;;;;-1:-1:-1;;;;;;;56071:36:0;;;;;;:19;:36;;;;;:56;;56111:16;;56071:36;:56;;56111:16;;56071:56;:::i;:::-;;;;-1:-1:-1;;;;;;;;;55515:620:0:o;34331:716::-;34755:23;34781:69;34809:4;34781:69;;;;;;;;;;;;;;;;;34789:5;-1:-1:-1;;;;;34781:27:0;;;:69;;;;;:::i;:::-;34865:17;;34755:95;;-1:-1:-1;34865:21:0;34861:179;;34962:10;34951:30;;;;;;;;;;;;:::i;:::-;34943:85;;;;-1:-1:-1;;;34943:85:0;;24325:2:1;34943:85:0;;;24307:21:1;24364:2;24344:18;;;24337:30;24403:34;24383:18;;;24376:62;-1:-1:-1;;;24454:18:1;;;24447:40;24504:19;;34943:85:0;24297:232:1;5746:451:0;5821:13;5847:19;5879:10;5883:6;5879:1;:10;:::i;:::-;:14;;5892:1;5879:14;:::i;:::-;5869:25;;;;;;-1:-1:-1;;;5869:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5869:25:0;;5847:47;;-1:-1:-1;;;5905:6:0;5912:1;5905:9;;;;;;-1:-1:-1;;;5905:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5905:15:0;;;;;;;;;-1:-1:-1;;;5931:6:0;5938:1;5931:9;;;;;;-1:-1:-1;;;5931:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5931:15:0;;;;;;;;-1:-1:-1;5962:9:0;5974:10;5978:6;5974:1;:10;:::i;:::-;:14;;5987:1;5974:14;:::i;:::-;5962:26;;5957:135;5994:1;5990;:5;5957:135;;;-1:-1:-1;;;6042:5:0;6050:3;6042:11;6029:25;;;;;-1:-1:-1;;;6029:25:0;;;;;;;;;;;;6017:6;6024:1;6017:9;;;;;;-1:-1:-1;;;6017:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;6017:37:0;;;;;;;;-1:-1:-1;6079:1:0;6069:11;;;;;5997:3;;;:::i;:::-;;;5957:135;;;-1:-1:-1;6110:10:0;;6102:55;;;;-1:-1:-1;;;6102:55:0;;15077:2:1;6102:55:0;;;15059:21:1;;;15096:18;;;15089:30;15155:34;15135:18;;;15128:62;15207:18;;6102:55:0;15049:182:1;53181:993:0;53269:7;;;-1:-1:-1;;;;;53358:19:0;;;53355:80;;-1:-1:-1;53417:5:0;53355:80;53452:9;53447:690;-1:-1:-1;;;;;53471:28:0;;;;;;:17;:28;;;;;:35;53467:39;;53447:690;;;-1:-1:-1;;;;;53545:28:0;;53528:14;53545:28;;;:17;:28;;;;;:31;;53574:1;;53545:31;;;;-1:-1:-1;;;53545:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53545:31:0;;;53619:15;;;:7;:15;;;;;;:26;;;;;;;;;;;53793:19;:30;;;;;;;53761:18;;53545:31;;-1:-1:-1;53619:26:0;;53545:31;53750:84;;53830:3;;53750:75;;53761:63;;53793:30;53750:75;;53830:3;53761:22;:27::i;:63::-;53750:6;;:10;:75::i;:84::-;53725:109;-1:-1:-1;;;;;;53898:19:0;;53895:186;;53938:40;;-1:-1:-1;;;;;53938:24:0;;;:40;;;;;53963:14;;53938:40;;;;53963:14;53938:24;:40;;;;;;;;;;;;;;;;;;;;;53895:186;;;54019:46;;-1:-1:-1;;;54019:46:0;;-1:-1:-1;;;;;12140:32:1;;;54019:46:0;;;12122:51:1;12189:18;;;12182:34;;;54019:22:0;;;;;12095:18:1;;54019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53895:186;54095:30;54111:14;54095:30;;:::i;:::-;;;53447:690;;;53508:3;;;;;:::i;:::-;;;;53447:690;;;-1:-1:-1;54154:12:0;;53181:993;-1:-1:-1;;;;;53181:993:0:o;54182:697::-;54253:7;;;54308:534;-1:-1:-1;;;;;54332:28:0;;;;;;:17;:28;;;;;:35;54328:39;;54308:534;;;-1:-1:-1;;;;;54406:28:0;;54389:14;54406:28;;;:17;:28;;;;;:31;;54435:1;;54406:31;;;;-1:-1:-1;;;54406:31:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54598:30:0;;;;;;:19;:30;;;;;;;54406:31;;;;54551:15;;;:7;:15;;;;;:26;;;;;;;;:33;54406:31;;-1:-1:-1;54541:98:0;;54635:3;;54541:89;;54551:78;;54598:30;54541:89;;54635:3;54551:37;:42::i;54541:98::-;-1:-1:-1;;;;;54732:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:33;54516:123;;-1:-1:-1;54732:53:0;;54516:123;54732:37;:53::i;:::-;-1:-1:-1;;;;;54696:15:0;;;;;;;:7;:15;;;;;;;;:26;;;;;;;;;:89;54800:30;54816:14;54800:30;;:::i;:::-;;;54308:534;;54369:3;;;;;:::i;:::-;;;;54308:534;;;-1:-1:-1;54859:12:0;54182:697;-1:-1:-1;;;54182:697:0:o;23600:229::-;23737:12;23769:52;23791:6;23799:4;23805:1;23808:12;23737;-1:-1:-1;;;;;21150:19:0;;;25007:60;;;;-1:-1:-1;;;25007:60:0;;23557:2:1;25007:60:0;;;23539:21:1;23596:2;23576:18;;;23569:30;23635:31;23615:18;;;23608:59;23684:18;;25007:60:0;23529:179:1;25007:60:0;25081:12;25095:23;25122:6;-1:-1:-1;;;;;25122:11:0;25141:5;25148:4;25122:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25080:73;;;;25171:51;25188:7;25197:10;25209:12;25171:16;:51::i;:::-;25164:58;24720:510;-1:-1:-1;;;;;;;24720:510:0:o;27406:762::-;27556:12;27585:7;27581:580;;;-1:-1:-1;27616:10:0;27609:17;;27581:580;27730:17;;:21;27726:424;;27978:10;27972:17;28039:15;28026:10;28022:2;28018:19;28011:44;27926:148;28121:12;28114:20;;-1:-1:-1;;;28114:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:939::-;;260:3;253:4;245:6;241:17;237:27;227:2;;282:5;275;268:20;227:2;322:6;309:20;348:4;371:18;408:2;404;401:10;398:2;;;414:18;;:::i;:::-;460:2;457:1;453:10;492:2;486:9;555:2;551:7;546:2;542;538:11;534:25;526:6;522:38;610:6;598:10;595:22;590:2;578:10;575:18;572:46;569:2;;;621:18;;:::i;:::-;657:2;650:22;707:18;;;741:15;;;;-1:-1:-1;776:15:1;;;810;;;806:24;;803:33;-1:-1:-1;800:2:1;;;853:5;846;839:20;800:2;879:5;870:14;;893:169;907:2;904:1;901:9;893:169;;;964:23;983:3;964:23;:::i;:::-;952:36;;1008:12;;;;925:1;918:9;;;;;1040:12;;893:169;;;-1:-1:-1;1080:6:1;217:875;-1:-1:-1;;;;;;;217:875:1:o;1097:376::-;;;1213:3;1206:4;1198:6;1194:17;1190:27;1180:2;;1238:8;1228;1221:26;1180:2;-1:-1:-1;1268:20:1;;1311:18;1300:30;;1297:2;;;1350:8;1340;1333:26;1297:2;1394:4;1386:6;1382:17;1370:29;;1446:3;1439:4;1430:6;1422;1418:19;1414:30;1411:39;1408:2;;;1463:1;1460;1453:12;1408:2;1170:303;;;;;:::o;1478:257::-;;1590:2;1578:9;1569:7;1565:23;1561:32;1558:2;;;1611:6;1603;1596:22;1558:2;1655:9;1642:23;1674:31;1699:5;1674:31;:::i;2010:398::-;;;2139:2;2127:9;2118:7;2114:23;2110:32;2107:2;;;2160:6;2152;2145:22;2107:2;2204:9;2191:23;2223:31;2248:5;2223:31;:::i;:::-;2273:5;-1:-1:-1;2330:2:1;2315:18;;2302:32;2343:33;2302:32;2343:33;:::i;:::-;2395:7;2385:17;;;2097:311;;;;;:::o;2413:776::-;;;;;;2596:3;2584:9;2575:7;2571:23;2567:33;2564:2;;;2618:6;2610;2603:22;2564:2;2662:9;2649:23;2681:31;2706:5;2681:31;:::i;:::-;2731:5;-1:-1:-1;2788:2:1;2773:18;;2760:32;2801:33;2760:32;2801:33;:::i;:::-;2853:7;-1:-1:-1;2907:2:1;2892:18;;2879:32;;-1:-1:-1;2962:2:1;2947:18;;2934:32;2989:18;2978:30;;2975:2;;;3026:6;3018;3011:22;2975:2;3070:59;3121:7;3112:6;3101:9;3097:22;3070:59;:::i;:::-;2554:635;;;;-1:-1:-1;2554:635:1;;-1:-1:-1;3148:8:1;;3044:85;2554:635;-1:-1:-1;;;2554:635:1:o;3194:503::-;;;3348:2;3336:9;3327:7;3323:23;3319:32;3316:2;;;3369:6;3361;3354:22;3316:2;3413:9;3400:23;3432:31;3457:5;3432:31;:::i;:::-;3482:5;-1:-1:-1;3538:2:1;3523:18;;3510:32;3565:18;3554:30;;3551:2;;;3602:6;3594;3587:22;3551:2;3630:61;3683:7;3674:6;3663:9;3659:22;3630:61;:::i;:::-;3620:71;;;3306:391;;;;;:::o;3702:325::-;;;3831:2;3819:9;3810:7;3806:23;3802:32;3799:2;;;3852:6;3844;3837:22;3799:2;3896:9;3883:23;3915:31;3940:5;3915:31;:::i;:::-;3965:5;4017:2;4002:18;;;;3989:32;;-1:-1:-1;;;3789:238:1:o;4032:460::-;;;;4175:2;4163:9;4154:7;4150:23;4146:32;4143:2;;;4196:6;4188;4181:22;4143:2;4240:9;4227:23;4259:31;4284:5;4259:31;:::i;:::-;4309:5;-1:-1:-1;4361:2:1;4346:18;;4333:32;;-1:-1:-1;4417:2:1;4402:18;;4389:32;4430:30;4389:32;4430:30;:::i;:::-;4479:7;4469:17;;;4133:359;;;;;:::o;4497:634::-;;;;;4663:2;4651:9;4642:7;4638:23;4634:32;4631:2;;;4684:6;4676;4669:22;4631:2;4728:9;4715:23;4747:31;4772:5;4747:31;:::i;:::-;4797:5;-1:-1:-1;4849:2:1;4834:18;;4821:32;;-1:-1:-1;4904:2:1;4889:18;;4876:32;4931:18;4920:30;;4917:2;;;4968:6;4960;4953:22;4917:2;5012:59;5063:7;5054:6;5043:9;5039:22;5012:59;:::i;:::-;4621:510;;;;-1:-1:-1;5090:8:1;-1:-1:-1;;;;4621:510:1:o;5136:543::-;;;;;5307:3;5295:9;5286:7;5282:23;5278:33;5275:2;;;5329:6;5321;5314:22;5275:2;5373:9;5360:23;5392:31;5417:5;5392:31;:::i;:::-;5442:5;-1:-1:-1;5494:2:1;5479:18;;5466:32;;-1:-1:-1;5545:2:1;5530:18;;5517:32;;-1:-1:-1;5601:2:1;5586:18;;5573:32;5614:33;5573:32;5614:33;:::i;:::-;5265:414;;;;-1:-1:-1;5265:414:1;;-1:-1:-1;;5265:414:1:o;6014:393::-;;;;6160:2;6148:9;6139:7;6135:23;6131:32;6128:2;;;6181:6;6173;6166:22;6128:2;6225:9;6212:23;6244:31;6269:5;6244:31;:::i;:::-;6294:5;6346:2;6331:18;;6318:32;;-1:-1:-1;6397:2:1;6382:18;;;6369:32;;6118:289;-1:-1:-1;;;6118:289:1:o;6412:368::-;;6549:2;6537:9;6528:7;6524:23;6520:32;6517:2;;;6570:6;6562;6555:22;6517:2;6615:9;6602:23;6648:18;6640:6;6637:30;6634:2;;;6685:6;6677;6670:22;6634:2;6713:61;6766:7;6757:6;6746:9;6742:22;6713:61;:::i;6785:255::-;;6905:2;6893:9;6884:7;6880:23;6876:32;6873:2;;;6926:6;6918;6911:22;6873:2;6963:9;6957:16;6982:28;7004:5;6982:28;:::i;7045:190::-;;7157:2;7145:9;7136:7;7132:23;7128:32;7125:2;;;7178:6;7170;7163:22;7125:2;-1:-1:-1;7206:23:1;;7115:120;-1:-1:-1;7115:120:1:o;7240:325::-;;;7369:2;7357:9;7348:7;7344:23;7340:32;7337:2;;;7390:6;7382;7375:22;7337:2;7431:9;7418:23;7408:33;;7491:2;7480:9;7476:18;7463:32;7504:31;7529:5;7504:31;:::i;7570:306::-;;7681:2;7669:9;7660:7;7656:23;7652:32;7649:2;;;7702:6;7694;7687:22;7649:2;7733:23;;-1:-1:-1;;;;;;7785:32:1;;7775:43;;7765:2;;7837:6;7829;7822:22;8076:258;;;8205:2;8193:9;8184:7;8180:23;8176:32;8173:2;;;8226:6;8218;8211:22;8173:2;-1:-1:-1;;8254:23:1;;;8324:2;8309:18;;;8296:32;;-1:-1:-1;8163:171:1:o;8456:463::-;;8547:5;8541:12;8574:6;8569:3;8562:19;8600:4;8629:2;8624:3;8620:12;8613:19;;8666:2;8659:5;8655:14;8687:3;8699:195;8713:6;8710:1;8707:13;8699:195;;;8778:13;;-1:-1:-1;;;;;8774:39:1;8762:52;;8834:12;;;;8869:15;;;;8810:1;8728:9;8699:195;;;-1:-1:-1;8910:3:1;;8517:402;-1:-1:-1;;;;;8517:402:1:o;8924:501::-;;9023:5;9017:12;9050:6;9045:3;9038:19;9076:4;9105:2;9100:3;9096:12;9089:19;;9129:5;9124:3;9117:18;9173:2;9168:3;9158:18;9194:3;9206:194;9220:6;9217:1;9214:13;9206:194;;;9285:13;;-1:-1:-1;;;;;9281:39:1;9269:52;;9341:12;;;;9317:1;9376:14;;;;9235:9;9206:194;;9526:233;9603:1;9596:5;9593:12;9583:2;;9648:10;9643:3;9639:20;9636:1;9629:31;9683:4;9680:1;9673:15;9711:4;9708:1;9701:15;9583:2;9735:18;;9573:186::o;9764:269::-;;9853:6;9848:3;9841:19;9905:6;9898:5;9891:4;9886:3;9882:14;9869:43;9957:3;9950:4;9941:6;9936:3;9932:16;9928:27;9921:40;10022:4;10015:2;10011:7;10006:2;9998:6;9994:15;9990:29;9985:3;9981:39;9977:50;9970:57;;9831:202;;;;;:::o;10038:274::-;;10205:6;10199:13;10221:53;10267:6;10262:3;10255:4;10247:6;10243:17;10221:53;:::i;:::-;10290:16;;;;;10175:137;-1:-1:-1;;10175:137:1:o;10317:786::-;;10728:25;10723:3;10716:38;10783:6;10777:13;10799:62;10854:6;10849:2;10844:3;10840:12;10833:4;10825:6;10821:17;10799:62;:::i;:::-;-1:-1:-1;;;10920:2:1;10880:16;;;10912:11;;;10905:40;10970:13;;10992:63;10970:13;11041:2;11033:11;;11026:4;11014:17;;10992:63;:::i;:::-;11075:17;11094:2;11071:26;;10706:397;-1:-1:-1;;;;10706:397:1:o;12227:266::-;;12403:2;12392:9;12385:21;12423:64;12483:2;12472:9;12468:18;12460:6;12423:64;:::i;12498:456::-;;12732:2;12721:9;12714:21;12758:64;12818:2;12807:9;12803:18;12795:6;12758:64;:::i;:::-;12870:9;12862:6;12858:22;12853:2;12842:9;12838:18;12831:50;12898;12941:6;12933;12925;12898:50;:::i;:::-;12890:58;12704:250;-1:-1:-1;;;;;;12704:250:1:o;12959:493::-;;13236:2;13225:9;13218:21;13262:64;13322:2;13311:9;13307:18;13299:6;13262:64;:::i;:::-;13362:22;;;13357:2;13342:18;;;13335:50;13394:20;;;13431:15;;13208:244;-1:-1:-1;13208:244:1:o;13831:247::-;;13990:2;13979:9;13972:21;14010:62;14068:2;14057:9;14053:18;14045:6;14037;14010:62;:::i;14083:383::-;;14232:2;14221:9;14214:21;14264:6;14258:13;14307:6;14302:2;14291:9;14287:18;14280:34;14323:66;14382:6;14377:2;14366:9;14362:18;14357:2;14349:6;14345:15;14323:66;:::i;:::-;14450:2;14429:15;-1:-1:-1;;14425:29:1;14410:45;;;;14457:2;14406:54;;14204:262;-1:-1:-1;;14204:262:1:o;19565:411::-;19767:2;19749:21;;;19806:2;19786:18;;;19779:30;19845:34;19840:2;19825:18;;19818:62;-1:-1:-1;;;19911:2:1;19896:18;;19889:45;19966:3;19951:19;;19739:237::o;20401:409::-;20603:2;20585:21;;;20642:2;20622:18;;;20615:30;20681:34;20676:2;20661:18;;20654:62;-1:-1:-1;;;20747:2:1;20732:18;;20725:43;20800:3;20785:19;;20575:235::o;20815:427::-;21017:2;20999:21;;;21056:2;21036:18;;;21029:30;21095:34;21090:2;21075:18;;21068:62;21166:33;21161:2;21146:18;;21139:61;21232:3;21217:19;;20989:253::o;22076:469::-;22278:2;22260:21;;;22317:2;22297:18;;;22290:30;22356:34;22351:2;22336:18;;22329:62;22427:34;22422:2;22407:18;;22400:62;-1:-1:-1;;;22493:3:1;22478:19;;22471:32;22535:3;22520:19;;22250:295::o;22550:397::-;22752:2;22734:21;;;22791:2;22771:18;;;22764:30;22830:34;22825:2;22810:18;;22803:62;-1:-1:-1;;;22896:2:1;22881:18;;22874:31;22937:3;22922:19;;22724:223::o;25841:1949::-;;26020:2;26009:9;26002:21;26032:56;26084:2;26073:9;26069:18;26060:6;26054:13;26032:56;:::i;:::-;26142:2;26134:6;26130:15;26124:22;26119:2;26108:9;26104:18;26097:50;26201:2;26193:6;26189:15;26183:22;26178:2;26167:9;26163:18;26156:50;26253:2;26245:6;26241:15;26235:22;26266:61;26322:3;26311:9;26307:19;26293:12;-1:-1:-1;;;;;8413:31:1;8401:44;;8391:60;26266:61;-1:-1:-1;26376:3:1;26364:16;;26358:23;-1:-1:-1;;;;;8413:31:1;;26448:3;26433:19;;8401:44;-1:-1:-1;26502:3:1;26490:16;;26484:23;-1:-1:-1;;;;;8413:31:1;;26574:3;26559:19;;8401:44;26516:63;26634:3;26626:6;26622:16;26616:23;26610:3;26599:9;26595:19;26588:52;26689:3;26681:6;26677:16;26671:23;26713:3;26725:62;26783:2;26772:9;26768:18;26752:14;-1:-1:-1;;;;;8413:31:1;8401:44;;8391:60;26725:62;26812:15;;26806:22;26847:3;26866:18;;;26859:30;;;;26914:15;;26908:22;26949:3;26968:18;;;26961:30;;;;27028:15;;27022:22;27063:6;27088:3;27107:18;;;27100:30;;;27022:22;;-1:-1:-1;27063:6:1;27153:65;27213:3;27198:19;;27022:22;27153:65;:::i;:::-;27255:15;;;27249:22;27139:79;;-1:-1:-1;27290:3:1;27302:62;27345:18;;;27249:22;-1:-1:-1;;;;;8413:31:1;8401:44;;8391:60;27302:62;27401:15;;27395:22;;-1:-1:-1;27436:3:1;27448:51;27480:18;;;27395:22;9500:13;9493:21;9481:34;;9471:50;27448:51;27536:15;;27530:22;;-1:-1:-1;27572:3:1;27584:63;27627:19;;;27530:22;-1:-1:-1;;;;;8413:31:1;8401:44;;8391:60;27584:63;27684:16;;;27678:23;9500:13;9493:21;27742:18;;9481:34;;;;-1:-1:-1;27778:6:1;;-1:-1:-1;25992:1798:1:o;28528:128::-;;28599:1;28595:6;28592:1;28589:13;28586:2;;;28605:18;;:::i;:::-;-1:-1:-1;28641:9:1;;28576:80::o;28661:120::-;;28727:1;28717:2;;28732:18;;:::i;:::-;-1:-1:-1;28766:9:1;;28707:74::o;28786:168::-;;28892:1;28888;28884:6;28880:14;28877:1;28874:21;28869:1;28862:9;28855:17;28851:45;28848:2;;;28899:18;;:::i;:::-;-1:-1:-1;28939:9:1;;28838:116::o;28959:125::-;;29027:1;29024;29021:8;29018:2;;;29032:18;;:::i;:::-;-1:-1:-1;29069:9:1;;29008:76::o;29089:258::-;29161:1;29171:113;29185:6;29182:1;29179:13;29171:113;;;29261:11;;;29255:18;29242:11;;;29235:39;29207:2;29200:10;29171:113;;;29302:6;29299:1;29296:13;29293:2;;;-1:-1:-1;;29337:1:1;29319:16;;29312:27;29142:205::o;29352:136::-;;29419:5;29409:2;;29428:18;;:::i;:::-;-1:-1:-1;;;29464:18:1;;29399:89::o;29493:135::-;;-1:-1:-1;;29553:17:1;;29550:2;;;29573:18;;:::i;:::-;-1:-1:-1;29620:1:1;29609:13;;29540:88::o;29633:112::-;;29691:1;29681:2;;29696:18;;:::i;:::-;-1:-1:-1;29730:9:1;;29671:74::o;29750:127::-;29811:10;29806:3;29802:20;29799:1;29792:31;29842:4;29839:1;29832:15;29866:4;29863:1;29856:15;29882:127;29943:10;29938:3;29934:20;29931:1;29924:31;29974:4;29971:1;29964:15;29998:4;29995:1;29988:15;30014:127;30075:10;30070:3;30066:20;30063:1;30056:31;30106:4;30103:1;30096:15;30130:4;30127:1;30120:15;30146:131;-1:-1:-1;;;;;30221:31:1;;30211:42;;30201:2;;30267:1;30264;30257:12;30282:118;30368:5;30361:13;30354:21;30347:5;30344:32;30334:2;;30390:1;30387;30380:12
Swarm Source
ipfs://15736657d06ee9ddf0b6cef542c30c9e820ba19715a78ae9fe8286a7c6cff000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Token Allocations
GLMR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| GLMR | 100.00% | $0.020881 | 0.066 | $0.001378 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.