Source Code
Overview
S Balance
More Info
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Close Bond | 19219990 | 5 days ago | IN | 0 S | 0.00007626 | ||||
Deposit | 19193380 | 6 days ago | IN | 0 S | 0.00037575 | ||||
Deposit | 19192980 | 6 days ago | IN | 0 S | 0.00037575 | ||||
New Bond | 19192739 | 6 days ago | IN | 0 S | 0.00052133 | ||||
New Bond | 19192065 | 6 days ago | IN | 0 S | 0.00032294 | ||||
Whitelist Token | 19189277 | 6 days ago | IN | 0 S | 0.0001304 | ||||
Grant Auctioneer... | 19189110 | 6 days ago | IN | 0 S | 0.00019439 |
Latest 12 internal transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.sonicscan.org on 2025-02-09 */ /** *Submitted for verification at testnet.sonicscan.org on 2025-02-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC 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); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 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 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @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. */ 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. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ 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 `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ 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 returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @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 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 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 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 `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 amountOwed; //amount of tokens owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint8 quoteDecimals = IERC20Metadata(address(_quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); // Transfer payout tokens IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: _terms[2], // Store minimumPrice without extra scaling maxDebt: _terms[3] * 10**payoutDecimals, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); Terms storage term = terms[_id]; require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); require(amount >= minimumDeposit, "Deposit below minimum threshold"); _tune(_id); _decayDebt(_id); uint256 price = _marketPrice(_id); uint256 payout = (amount * 1e18) / price; uint256 maxPayout = ((term.maxDebt - term.totalDebt) * 1800) / 10000; require(payout <= maxPayout, "Deposit exceeds maximum allowed"); require(term.totalDebt + payout <= term.maxDebt, "Exceeds maximum bond debt"); IERC20 quoteToken = IERC20(term.quoteToken); uint256 balanceBefore = quoteToken.balanceOf(address(this)); quoteToken.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = quoteToken.balanceOf(address(this)); require(balanceAfter - balanceBefore == amount, "Incorrect transfer amount"); terms[_id].quoteTokensRaised += amount; terms[_id].totalDebt += payout; bondInfo[user].push(Bond({ tokenBonded: term.payoutToken, amountOwed: payout, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); emit BondDeposited(user, _id, amount, payout, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; for (uint256 i = length; i > 0;) { i--; Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { currentBond.amountOwed -= amount; totalRedeemed += amount; // Scale amount by token decimals for transfer IERC20(terms[_id].payoutToken).safeTransfer(user, amount); if (currentBond.amountOwed == 0) { if (i != bondInfo[user].length - 1) { bondInfo[user][i] = bondInfo[user][bondInfo[user].length - 1]; } bondInfo[user].pop(); } } } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function currentMaxPayout(uint256 _id) public view returns (uint256) { Terms memory term = terms[_id]; uint256 remainingDebt = term.maxDebt - term.totalDebt; return (remainingDebt * 1800) / 10000; // 18% of remaining } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; Terms memory term = terms[bond.marketId]; // Check if bond is active if (block.timestamp < bond.startTime) { return 0; } // Calculate total vesting duration uint256 vestingTerm = term.vestingTerm; // Calculate time elapsed since bond start uint256 timeElapsed = block.timestamp > bond.endTime ? vestingTerm : block.timestamp - bond.startTime; // Calculate tokens per second uint256 tokensPerSecond = bond.amountOwed / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than the total owed if (currentClaimable > bond.amountOwed) { currentClaimable = bond.amountOwed; } return currentClaimable; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: currentMaxPayout(marketId), vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * 100); term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; // Decay the debt before calculating price uint256 timeSinceLast = block.timestamp - term.lastDecay; uint256 decay = term.totalDebt * timeSinceLast / term.vestingTerm; uint256 currentDebt = term.totalDebt; if (currentDebt > decay) { currentDebt -= decay; } else { currentDebt = 0; } uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 currentCV = _currentControlVariable(_id); // Calculate debt ratio with decayed debt uint256 debtRatio; if (term.quoteTokensRaised == 0) { debtRatio = 1e18; } else { debtRatio = (currentDebt * 1e18) / term.quoteTokensRaised; } uint256 scalingFactor = 10 ** (18 + (18 - quoteDecimals)); price = (currentCV * debtRatio * scalingFactor) / 1e36; } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; if (term.quoteTokensRaised == 0) { return 1e18; } uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); int8 decimalAdjustment = int8(payoutDecimals) - int8(quoteDecimals); if (decimalAdjustment >= 0) { // If payoutToken has more decimals, scale up quoteTokensRaised uint256 adjustedQuote = term.quoteTokensRaised * (10 ** uint8(decimalAdjustment)); return (term.totalDebt * 1e18) / adjustedQuote; } else { // If quoteToken has more decimals, scale up totalDebt uint256 adjustedDebt = term.totalDebt * (10 ** uint8(-decimalAdjustment)); return (adjustedDebt * 1e18) / term.quoteTokensRaised; } } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Base control variable uint256 baseCV = term.controlVariable; // Market-adaptive decay calculation uint256 currentDebtRatio = _debtRatio(_id); uint256 timeSinceBondStart = block.timestamp > term.bondEnds ? block.timestamp - term.bondEnds : 0; // Adaptive decay rate based on debt ratio // Higher debt ratio accelerates decay uint256 adaptiveDecayRate = (currentDebtRatio * 1e18) / term.maxDebt; // Calculate decay amount uint256 decayAmount = (baseCV * adaptiveDecayRate) / (timeSinceBondStart + 1); // Apply ongoing adjustment if within adjustment window if (block.timestamp <= adjustment.lastBlock + adjustment.buffer) { if (adjustment.add) { // Increasing control variable baseCV += adjustment.rate; // Cap at target if exceeded if (baseCV > adjustment.target) { baseCV = adjustment.target; } } else { // Decreasing control variable baseCV -= adjustment.rate; // Floor at target if fallen below if (baseCV < adjustment.target) { baseCV = adjustment.target; } } } // Apply decay if (baseCV > decayAmount) { return baseCV - decayAmount; } return 0; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return (amount * 1e18) / price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","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":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","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":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161465038038061465083398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b6080516143d461027c5f395f81816107a90152611eca01526143d45ff3fe608060405234801561000f575f5ffd5b50600436106102b8575f3560e01c806391de4d0711610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f1461073a578063d627d25e1461074d578063d918a16e14610760578063ddb2924714610769578063ea5e0c601461077c578063ed421a9c146107a4578063f9a64664146107cb575f5ffd5b8063c8558f1b146106c7578063ca15c873146106da578063cfe9232b146106ed578063d04cffeb14610701578063d1af1fbc14610714578063d382fe9214610727575f5ffd5b8063b33712c511610131578063b33712c514610599578063bc063e1a146105a1578063bc3b2b12146105aa578063be32ee2614610614578063c0680e2014610627578063c0aa0e8a1461063a578063c5f0d05c146106b4575f5ffd5b806391de4d07146105265780639b299d9a146105395780639cd85b5b1461054c578063a217fddf1461055f578063a3246ad314610566578063b2f5de9414610586575f5ffd5b806336568abe116102245780637b30564e116101de5780637b30564e146104535780637bde82f2146104665780638ad59c70146104795780638dbdbe6d146104cc5780639010d07c146104df578063909b2bb8146104ff57806391d1485414610513575f5ffd5b806336568abe146103f1578063439766ce146104045780635c975abb1461040c5780636247f6f2146104195780636e76fc8f1461042c578063725dafe014610440575f5ffd5b8063172c44ec11610275578063172c44ec1461037a5780631b014e851461038d57806324760807146103a0578063248a9ca3146103a957806327507458146103cb5780632f2ff15d146103de575f5ffd5b806301ffc9a7146102bc57806306b40ea3146102e45780630868335e146103055780630fb81eb4146103255780631227b4021461033a578063154347b51461035a575b5f5ffd5b6102cf6102ca366004613bd6565b6107de565b60405190151581526020015b60405180910390f35b6102f76102f2366004613c11565b610808565b6040519081526020016102db565b610318610313366004613c3b565b610833565b6040516102db9190613d40565b610338610333366004613d8e565b6108e2565b005b61034d610348366004613d8e565b610a77565b6040516102db9190613da5565b61036d610368366004613db4565b610b63565b6040516102db9190613dcf565b6102f7610388366004613d8e565b610bcc565b61036d61039b366004613db4565b610bd6565b6102f760045481565b6102f76103b7366004613d8e565b5f9081526020819052604090206001015490565b6102cf6103d9366004613d8e565b610c3d565b6103386103ec366004613e06565b610cc1565b6103386103ff366004613e06565b610ceb565b610338610d23565b6003546102cf9060ff1681565b610338610427366004613db4565b610d74565b6102f75f51602061437f5f395f51905f5281565b61033861044e366004613e06565b610f43565b6102cf610461366004613c11565b611062565b6102f7610474366004613e06565b611106565b61048c610487366004613c11565b61139b565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102db565b6103386104da366004613e34565b611400565b6104f26104ed366004613e6a565b611a67565b6040516102db9190613e8a565b6102f75f51602061435f5f395f51905f5281565b6102cf610521366004613e06565b611a85565b6102cf610534366004613e9e565b611aad565b610338610547366004613db4565b611ba9565b6102cf61055a366004613db4565b611cd8565b6102f75f81565b610579610574366004613d8e565b611cf0565b6040516102db9190613eca565b610338610594366004613d8e565b611d09565b610338611f33565b6102f76103e881565b6105ea6105b8366004613d8e565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102db565b610338610622366004613db4565b611f81565b6102f7610635366004613c11565b611ffe565b61064d610648366004613d8e565b612017565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102db565b6103386106c2366004613f22565b612097565b6102f76106d5366004613c11565b612138565b6102f76106e8366004613d8e565b612322565b6102f75f51602061433f5f395f51905f5281565b61036d61070f366004613db4565b612338565b6104f2610722366004613d8e565b61241d565b6102f7610735366004613d8e565b612445565b610338610748366004613e06565b61252f565b61033861075b366004613db4565b612553565b6102f7600e5481565b6102f7610777366004613fd6565b6125f0565b6104f261078a366004613d8e565b600a6020525f90815260409020546001600160a01b031681565b6104f27f000000000000000000000000000000000000000000000000000000000000000081565b6102f76107d9366004613c11565b612d99565b5f6001600160e01b03198216635a05180f60e01b1480610802575061080282612da4565b92915050565b600c602052815f5260405f208181548110610821575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561084e5761084e613f3b565b60405190808252806020026020018201604052801561088757816020015b610874613b70565b81526020019060019003908161086c5790505b5090505f5b838110156108da576108b58585838181106108a9576108a9614069565b90506020020135610a77565b8282815181106108c7576108c7614069565b602090810291909101015260010161088c565b509392505050565b5f51602061433f5f395f51905f526108f981612dd8565b60035460ff16156109255760405162461bcd60e51b815260040161091c9061407d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b0316331461097a5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161091c565b426006838154811061098e5761098e614069565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ce576109ce614069565b905f5260205f2090600a020160030154600684815481106109f1576109f1614069565b905f5260205f2090600a020160020154610a0b91906140bd565b9050610a48338260068681548110610a2557610a25614069565b5f91825260209091206001600a9092020101546001600160a01b03169190612de5565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a7f613b70565b5f60068381548110610a9357610a93614069565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610adb85612e44565b8152602001610ae985612445565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b3a85610c3d565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bc057602002820191905f5260205f20905b815481526020019060010190808311610bac575b50505050509050919050565b5f61080282612e44565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bc057602002820191905f5260205f2090815481526020019060010190808311610bac5750505050509050919050565b5f60068281548110610c5157610c51614069565b5f91825260209091206009600a90920201015463ffffffff164211801590610802575060068281548110610c8757610c87614069565b905f5260205f2090600a02016006015460068381548110610caa57610caa614069565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cdb81612dd8565b610ce58383612e4e565b50505050565b6001600160a01b0381163314610d145760405163334bd91960e11b815260040160405180910390fd5b610d1e8282612e79565b505050565b5f51602061437f5f395f51905f52610d3a81612dd8565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f51602061435f5f395f51905f52610d8b81612dd8565b6001600160a01b038216610dd95760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161091c565b6001600160a01b0382165f9081526009602052604090205460ff1615610e3d5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161091c565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e97575060408051601f3d908101601f19168201909252610e94918101906140d0565b60015b610ed95760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161091c565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610f9b5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161091c565b610fb25f51602061433f5f395f51905f5282611a85565b610fef5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161091c565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061108e5761108e614069565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61110f612ea4565b6001600160a01b0382165f908152600d602052604081205490815b801561138d578061113a816140f0565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061116a5761116a614069565b905f5260205f209060050201905086816003015403611387575f61118e8784612138565b905080156113855780826001015f8282546111a991906140bd565b909155506111b990508185614105565b93506111d3878260068b81548110610a2557610a25614069565b81600101545f03611385576001600160a01b0387165f908152600d6020526040902054611202906001906140bd565b8314611313576001600160a01b0387165f908152600d60205260409020805461122d906001906140bd565b8154811061123d5761123d614069565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061127d5761127d614069565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061133957611339614118565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b5061112a565b509150506108026001600255565b600d602052815f5260405f2081815481106113b4575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b611408612ea4565b6001600160a01b0381166114555760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161091c565b600654831061149a5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161091c565b5f600684815481106114ae576114ae614069565b5f9182526020909120600a90910201600981015490915063ffffffff1642111561150b5760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161091c565b80600601548160030154106115625760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161091c565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cc91906140d0565b90505f6115d882612efb565b90508085101561162a5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161091c565b61163386612f26565b61163c86613068565b5f61164687613129565b90505f8161165c88670de0b6b3a764000061412c565b6116669190614143565b90505f6127108660030154876006015461168091906140bd565b61168c9061070861412c565b6116969190614143565b9050808211156116e85760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161091c565b85600601548287600301546116fd9190614105565b11156117475760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161091c565b85546040516370a0823160e01b81526001600160a01b03909116905f9082906370a082319061177a903090600401613e8a565b602060405180830381865afa158015611795573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b99190614162565b90506117d06001600160a01b03831633308d61334d565b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906117fe903090600401613e8a565b602060405180830381865afa158015611819573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183d9190614162565b90508a61184a83836140bd565b146118935760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161091c565b8a60068d815481106118a7576118a7614069565b905f5260205f2090600a02016007015f8282546118c49190614105565b925050819055508460068d815481106118df576118df614069565b905f5260205f2090600a02016003015f8282546118fc9190614105565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a084019261196f9291600160201b900416614105565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611a4c908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d1e6001600255565b5f828152600160205260408120611a7e9083613386565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b0757602002820191905f5260205f20905b815481526020019060010190808311611af3575b509394505f93505050505b8151811015611b9f57846001600160a01b0316600a5f848481518110611b3a57611b3a614069565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611b875750611b87828281518110611b7a57611b7a614069565b6020026020010151610c3d565b15611b9757600192505050610802565b600101611b12565b505f949350505050565b5f611bb381612dd8565b6001600160a01b038216611c065760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161091c565b611c1d5f51602061433f5f395f51905f5283611a85565b15611c625760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161091c565b611c795f51602061433f5f395f51905f5283612e4e565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061433f5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108025f51602061433f5f395f51905f5283611a85565b5f81815260016020526040902060609061080290613391565b5f51602061433f5f395f51905f52611d2081612dd8565b60035460ff1615611d435760405162461bcd60e51b815260040161091c9061407d565b5f828152600a60205260409020546001600160a01b03163314611da25760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604482015260640161091c565b60068281548110611db557611db5614069565b5f91825260209091206009600a90920201015463ffffffff164211611e155760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161091c565b5f60068381548110611e2957611e29614069565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611e5a57611e5a614069565b5f918252602082206007600a909202010154600e5490925015611ea157612710600e5483611e88919061412c565b611e929190614143565b9050611e9e81836140bd565b91505b611eb56001600160a01b0384163384612de5565b8015611eef57611eef6001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083612de5565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f51602061437f5f395f51905f52611f4a81612dd8565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f611f8b81612dd8565b611fa25f51602061433f5f395f51905f5283612e79565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061433f5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610821575f80fd5b60068181548110612026575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6120a181612dd8565b6103e88263ffffffff1611156120e85760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161091c565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061216457612164614069565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106121e4576121e4614069565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b909104811661014083015291840151909250164210156122a4575f92505050610802565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116122df5760808401516122da9063ffffffff16426140bd565b6122e1565b815b90505f8285602001516122f49190614143565b90505f612301838361412c565b90508560200151811115612316575060208501515b98975050505050505050565b5f8181526001602052604081206108029061339d565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561236b5761236b613f3b565b604051908082528060200260200182016040528015612394578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612416576001600160a01b0384165f908152600d602052604090208054829081106123e1576123e1614069565b905f5260205f2090600502016003015482828151811061240357612403614069565b6020908102919091010152600101612399565b5092915050565b6005818154811061242c575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061245a5761245a614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061250c91906140bd565b905061271061251d8261070861412c565b6125279190614143565b949350505050565b5f8281526020819052604090206001015461254981612dd8565b610ce58383612e79565b5f51602061435f5f395f51905f5261256a81612dd8565b6001600160a01b0382165f9081526009602052604090205460ff166125a15760405162461bcd60e51b815260040161091c90614179565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611056908490613e8a565b5f5f51602061433f5f395f51905f5261260881612dd8565b60035460ff161561262b5760405162461bcd60e51b815260040161091c9061407d565b6001600160a01b0386166126785760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161091c565b6001600160a01b0385166126c45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161091c565b856001600160a01b0316856001600160a01b0316036127205760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161091c565b6001600160a01b0386165f9081526009602052604090205460ff166127575760405162461bcd60e51b815260040161091c90614179565b6127613386611aad565b156127b95760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161091c565b82514263ffffffff909116116128065760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161091c565b83516128495760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161091c565b602084015161289a5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161091c565b60408401516128e75760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161091c565b606084015161292f5760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161091c565b82515f9061294490429063ffffffff166140bd565b90505f811161298e5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161091c565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ef91906140d0565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a2e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5291906140d0565b9050612a823330612a6484600a61428b565b8a51612a70919061412c565b6001600160a01b038d1692919061334d565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612ab184600a61428b565b8a51612abd919061412c565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612aeb84600a61428b565b60608b0151612afa919061412c565b81526020015f8152602001428152602001885f60028110612b1d57612b1d614069565b602002015163ffffffff16815260200188600160028110612b4057612b40614069565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612d3990614299565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612d8491815260200190565b60405180910390a49998505050505050505050565b5f611a7e8383612138565b5f6001600160e01b03198216637965db0b60e01b148061080257506301ffc9a760e01b6001600160e01b0319831614610802565b612de281336133a6565b50565b6040516001600160a01b03838116602483015260448201839052610d1e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506133df565b5f61080282613129565b5f5f612e5a8484613442565b90508015611a7e575f8481526001602052604090206108da90846134d1565b5f5f612e8584846134e5565b90508015611a7e575f8481526001602052604090206108da908461354e565b6002805403612ef55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161091c565b60028055565b5f60028260ff161115612f1e57612f136002836142b1565b61080290600a61428b565b506001919050565b5f8181526007602052604090206003810154600490910154612f489190614105565b421115612de2575f60068281548110612f6357612f63614069565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615612fee575f8281526007602052604081206001015460048301805491929091612fb2908490614105565b90915550505f82815260076020526040902060020154600482015410612fe9575f8281526007602052604090206002015460048201555b61304b565b5f82815260076020526040812060010154600483018054919290916130149084906140bd565b90915550505f8281526007602052604090206002015460048201541161304b575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061307c5761307c614069565b905f5260205f2090600a020190505f81600301549050805f0361309e57505050565b5f8260080154426130af91906140bd565b9050805f036130be5750505050565b60098301545f906130dd90600160201b900463ffffffff1660646142ca565b63ffffffff166130ed838561412c565b6130f79190614143565b905082811161310f5761310a81846140bd565b613111565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061313e5761313e614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416928401929092526002820154908301526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008810154610100830181905260099091015463ffffffff808216610120850152600160201b909104166101408301529092506131ee90426140bd565b90505f82610140015163ffffffff1682846060015161320d919061412c565b6132179190614143565b6060840151909150818111156132385761323182826140bd565b905061323b565b505f5b5f845f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561327b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061329f91906140d0565b90505f6132ab88613562565b90505f8660e001515f036132c85750670de0b6b3a76400006132ec565b60e08701516132df85670de0b6b3a764000061412c565b6132e99190614143565b90505b5f6132f88460126142b1565b6133039060126142e9565b61330e90600a61428b565b90506ec097ce7bc90715b34b9f10000000008161332b848661412c565b613335919061412c565b61333f9190614143565b9a9950505050505050505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ce59186918216906323b872dd90608401612e12565b5f611a7e838361378e565b60605f611a7e836137b4565b5f610802825490565b6133b08282611a85565b610f3f5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161091c565b5f5f60205f8451602086015f885af1806133fe576040513d5f823e3d81fd5b50505f513d91508115613415578060011415613422565b6001600160a01b0384163b155b15610ce55783604051635274afe760e01b815260040161091c9190613e8a565b5f61344d8383611a85565b6134ca575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556134823390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610802565b505f610802565b5f611a7e836001600160a01b03841661380b565b5f6134f08383611a85565b156134ca575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610802565b5f611a7e836001600160a01b038416613850565b5f5f6006838154811061357757613577614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161367686613933565b90505f84610120015163ffffffff164211613691575f6136a7565b6101208501516136a79063ffffffff16426140bd565b90505f8560c0015183670de0b6b3a76400006136c3919061412c565b6136cd9190614143565b90505f6136db836001614105565b6136e5838761412c565b6136ef9190614143565b9050856060015186608001516137059190614105565b42116137615785511561373c5760208601516137219086614105565b9450856040015185111561373757856040015194505b613761565b602086015161374b90866140bd565b9450856040015185101561376157856040015194505b808511156137805761377381866140bd565b9998505050505050505050565b505f98975050505050505050565b5f825f0182815481106137a3576137a3614069565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bc057602002820191905f5260205f2090815481526020019060010190808311610bac5750505050509050919050565b5f8181526001830160205260408120546134ca57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610802565b5f818152600183016020526040812054801561392a575f6138726001836140bd565b85549091505f90613885906001906140bd565b90508082146138e4575f865f0182815481106138a3576138a3614069565b905f5260205f200154905080875f0184815481106138c3576138c3614069565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806138f5576138f5614118565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610802565b5f915050610802565b5f5f6006838154811061394857613948614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416928401929092526002820154908301526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301819052600882015461010084015260099091015463ffffffff808216610120850152600160201b909104166101408301529092509003613a045750670de0b6b3a764000092915050565b5f815f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6891906140d0565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613aab573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613acf91906140d0565b90505f613adc8383614302565b90505f815f0b12613b32575f613af382600a61428b565b8560e00151613b02919061412c565b9050808560600151670de0b6b3a7640000613b1d919061412c565b613b279190614143565b979650505050505050565b5f613b3c82614322565b613b4790600a61428b565b8560600151613b56919061412c565b60e0860151909150613b1d82670de0b6b3a764000061412c565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613be6575f5ffd5b81356001600160e01b031981168114611a7e575f5ffd5b6001600160a01b0381168114612de2575f5ffd5b5f5f60408385031215613c22575f5ffd5b8235613c2d81613bfd565b946020939093013593505050565b5f5f60208385031215613c4c575f5ffd5b82356001600160401b03811115613c61575f5ffd5b8301601f81018513613c71575f5ffd5b80356001600160401b03811115613c86575f5ffd5b8560208260051b8401011115613c9a575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613cd160208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613d1460c08401826001600160a01b03169052565b5060e0810151613d2860e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613d8357613d6c838551613caa565b602093909301926101409290920191600101613d59565b509095945050505050565b5f60208284031215613d9e575f5ffd5b5035919050565b61014081016108028284613caa565b5f60208284031215613dc4575f5ffd5b8135611a7e81613bfd565b602080825282518282018190525f918401906040840190835b81811015613d83578351835260209384019390920191600101613de8565b5f5f60408385031215613e17575f5ffd5b823591506020830135613e2981613bfd565b809150509250929050565b5f5f5f60608486031215613e46575f5ffd5b83359250602084013591506040840135613e5f81613bfd565b809150509250925092565b5f5f60408385031215613e7b575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613eaf575f5ffd5b8235613eba81613bfd565b91506020830135613e2981613bfd565b602080825282518282018190525f918401906040840190835b81811015613d835783516001600160a01b0316835260209384019390920191600101613ee3565b803563ffffffff81168114613f1d575f5ffd5b919050565b5f60208284031215613f32575f5ffd5b611a7e82613f0a565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613f8357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613f9a575f5ffd5b613fa46040613f4f565b806040840185811115613fb5575f5ffd5b845b81811015613d8357613fc881613f0a565b845260209384019301613fb7565b5f5f5f5f6101008587031215613fea575f5ffd5b8435613ff581613bfd565b9350602085013561400581613bfd565b9250605f85018613614015575f5ffd5b61401f6080613f4f565b8060c0870188811115614030575f5ffd5b604088015b8181101561404d578035845260209384019301614035565b5081945061405b8982613f8b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610802576108026140a9565b5f602082840312156140e0575f5ffd5b815160ff81168114611a7e575f5ffd5b5f816140fe576140fe6140a9565b505f190190565b80820180821115610802576108026140a9565b634e487b7160e01b5f52603160045260245ffd5b8082028115828204841417610802576108026140a9565b5f8261415d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614172575f5ffd5b5051919050565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b6001815b60018411156141e3578085048111156141c7576141c76140a9565b60018416156141d557908102905b60019390931c9280026141ac565b935093915050565b5f826141f957506001610802565b8161420557505f610802565b816001811461421b576002811461422557614241565b6001915050610802565b60ff841115614236576142366140a9565b50506001821b610802565b5060208310610133831016604e8410600b8410161715614264575081810a610802565b6142705f1984846141a8565b805f1904821115614283576142836140a9565b029392505050565b5f611a7e60ff8416836141eb565b5f600182016142aa576142aa6140a9565b5060010190565b60ff8281168282160390811115610802576108026140a9565b63ffffffff8181168382160290811690818114612416576124166140a9565b60ff8181168382160190811115610802576108026140a9565b5f82810b9082900b03607f198112607f82131715610802576108026140a9565b5f81810b60808101614336576143366140a9565b5f039291505056fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220985771176569316e52a4cb3b0d4f91e1501601df1076e20b2058c9c3f5c63f9064736f6c634300081b00330000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102b8575f3560e01c806391de4d0711610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f1461073a578063d627d25e1461074d578063d918a16e14610760578063ddb2924714610769578063ea5e0c601461077c578063ed421a9c146107a4578063f9a64664146107cb575f5ffd5b8063c8558f1b146106c7578063ca15c873146106da578063cfe9232b146106ed578063d04cffeb14610701578063d1af1fbc14610714578063d382fe9214610727575f5ffd5b8063b33712c511610131578063b33712c514610599578063bc063e1a146105a1578063bc3b2b12146105aa578063be32ee2614610614578063c0680e2014610627578063c0aa0e8a1461063a578063c5f0d05c146106b4575f5ffd5b806391de4d07146105265780639b299d9a146105395780639cd85b5b1461054c578063a217fddf1461055f578063a3246ad314610566578063b2f5de9414610586575f5ffd5b806336568abe116102245780637b30564e116101de5780637b30564e146104535780637bde82f2146104665780638ad59c70146104795780638dbdbe6d146104cc5780639010d07c146104df578063909b2bb8146104ff57806391d1485414610513575f5ffd5b806336568abe146103f1578063439766ce146104045780635c975abb1461040c5780636247f6f2146104195780636e76fc8f1461042c578063725dafe014610440575f5ffd5b8063172c44ec11610275578063172c44ec1461037a5780631b014e851461038d57806324760807146103a0578063248a9ca3146103a957806327507458146103cb5780632f2ff15d146103de575f5ffd5b806301ffc9a7146102bc57806306b40ea3146102e45780630868335e146103055780630fb81eb4146103255780631227b4021461033a578063154347b51461035a575b5f5ffd5b6102cf6102ca366004613bd6565b6107de565b60405190151581526020015b60405180910390f35b6102f76102f2366004613c11565b610808565b6040519081526020016102db565b610318610313366004613c3b565b610833565b6040516102db9190613d40565b610338610333366004613d8e565b6108e2565b005b61034d610348366004613d8e565b610a77565b6040516102db9190613da5565b61036d610368366004613db4565b610b63565b6040516102db9190613dcf565b6102f7610388366004613d8e565b610bcc565b61036d61039b366004613db4565b610bd6565b6102f760045481565b6102f76103b7366004613d8e565b5f9081526020819052604090206001015490565b6102cf6103d9366004613d8e565b610c3d565b6103386103ec366004613e06565b610cc1565b6103386103ff366004613e06565b610ceb565b610338610d23565b6003546102cf9060ff1681565b610338610427366004613db4565b610d74565b6102f75f51602061437f5f395f51905f5281565b61033861044e366004613e06565b610f43565b6102cf610461366004613c11565b611062565b6102f7610474366004613e06565b611106565b61048c610487366004613c11565b61139b565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102db565b6103386104da366004613e34565b611400565b6104f26104ed366004613e6a565b611a67565b6040516102db9190613e8a565b6102f75f51602061435f5f395f51905f5281565b6102cf610521366004613e06565b611a85565b6102cf610534366004613e9e565b611aad565b610338610547366004613db4565b611ba9565b6102cf61055a366004613db4565b611cd8565b6102f75f81565b610579610574366004613d8e565b611cf0565b6040516102db9190613eca565b610338610594366004613d8e565b611d09565b610338611f33565b6102f76103e881565b6105ea6105b8366004613d8e565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102db565b610338610622366004613db4565b611f81565b6102f7610635366004613c11565b611ffe565b61064d610648366004613d8e565b612017565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102db565b6103386106c2366004613f22565b612097565b6102f76106d5366004613c11565b612138565b6102f76106e8366004613d8e565b612322565b6102f75f51602061433f5f395f51905f5281565b61036d61070f366004613db4565b612338565b6104f2610722366004613d8e565b61241d565b6102f7610735366004613d8e565b612445565b610338610748366004613e06565b61252f565b61033861075b366004613db4565b612553565b6102f7600e5481565b6102f7610777366004613fd6565b6125f0565b6104f261078a366004613d8e565b600a6020525f90815260409020546001600160a01b031681565b6104f27f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d81565b6102f76107d9366004613c11565b612d99565b5f6001600160e01b03198216635a05180f60e01b1480610802575061080282612da4565b92915050565b600c602052815f5260405f208181548110610821575f80fd5b905f5260205f20015f91509150505481565b60605f826001600160401b0381111561084e5761084e613f3b565b60405190808252806020026020018201604052801561088757816020015b610874613b70565b81526020019060019003908161086c5790505b5090505f5b838110156108da576108b58585838181106108a9576108a9614069565b90506020020135610a77565b8282815181106108c7576108c7614069565b602090810291909101015260010161088c565b509392505050565b5f51602061433f5f395f51905f526108f981612dd8565b60035460ff16156109255760405162461bcd60e51b815260040161091c9061407d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b0316331461097a5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161091c565b426006838154811061098e5761098e614069565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109ce576109ce614069565b905f5260205f2090600a020160030154600684815481106109f1576109f1614069565b905f5260205f2090600a020160020154610a0b91906140bd565b9050610a48338260068681548110610a2557610a25614069565b5f91825260209091206001600a9092020101546001600160a01b03169190612de5565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a7f613b70565b5f60068381548110610a9357610a93614069565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610adb85612e44565b8152602001610ae985612445565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b3a85610c3d565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bc057602002820191905f5260205f20905b815481526020019060010190808311610bac575b50505050509050919050565b5f61080282612e44565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bc057602002820191905f5260205f2090815481526020019060010190808311610bac5750505050509050919050565b5f60068281548110610c5157610c51614069565b5f91825260209091206009600a90920201015463ffffffff164211801590610802575060068281548110610c8757610c87614069565b905f5260205f2090600a02016006015460068381548110610caa57610caa614069565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cdb81612dd8565b610ce58383612e4e565b50505050565b6001600160a01b0381163314610d145760405163334bd91960e11b815260040160405180910390fd5b610d1e8282612e79565b505050565b5f51602061437f5f395f51905f52610d3a81612dd8565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f51602061435f5f395f51905f52610d8b81612dd8565b6001600160a01b038216610dd95760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161091c565b6001600160a01b0382165f9081526009602052604090205460ff1615610e3d5760405162461bcd60e51b8152602060048201526019602482015278151bdad95b88185b1c9958591e481dda1a5d195b1a5cdd1959603a1b604482015260640161091c565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e97575060408051601f3d908101601f19168201909252610e94918101906140d0565b60015b610ed95760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161091c565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610f9b5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161091c565b610fb25f51602061433f5f395f51905f5282611a85565b610fef5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161091c565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061108e5761108e614069565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61110f612ea4565b6001600160a01b0382165f908152600d602052604081205490815b801561138d578061113a816140f0565b6001600160a01b0387165f908152600d602052604081208054929450909250908390811061116a5761116a614069565b905f5260205f209060050201905086816003015403611387575f61118e8784612138565b905080156113855780826001015f8282546111a991906140bd565b909155506111b990508185614105565b93506111d3878260068b81548110610a2557610a25614069565b81600101545f03611385576001600160a01b0387165f908152600d6020526040902054611202906001906140bd565b8314611313576001600160a01b0387165f908152600d60205260409020805461122d906001906140bd565b8154811061123d5761123d614069565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061127d5761127d614069565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d6020526040902080548061133957611339614118565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b5061112a565b509150506108026001600255565b600d602052815f5260405f2081815481106113b4575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b611408612ea4565b6001600160a01b0381166114555760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161091c565b600654831061149a5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161091c565b5f600684815481106114ae576114ae614069565b5f9182526020909120600a90910201600981015490915063ffffffff1642111561150b5760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161091c565b80600601548160030154106115625760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161091c565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156115a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cc91906140d0565b90505f6115d882612efb565b90508085101561162a5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161091c565b61163386612f26565b61163c86613068565b5f61164687613129565b90505f8161165c88670de0b6b3a764000061412c565b6116669190614143565b90505f6127108660030154876006015461168091906140bd565b61168c9061070861412c565b6116969190614143565b9050808211156116e85760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161091c565b85600601548287600301546116fd9190614105565b11156117475760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81b585e1a5b5d5b48189bdb99081919589d603a1b604482015260640161091c565b85546040516370a0823160e01b81526001600160a01b03909116905f9082906370a082319061177a903090600401613e8a565b602060405180830381865afa158015611795573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b99190614162565b90506117d06001600160a01b03831633308d61334d565b6040516370a0823160e01b81525f906001600160a01b038416906370a08231906117fe903090600401613e8a565b602060405180830381865afa158015611819573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183d9190614162565b90508a61184a83836140bd565b146118935760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd081d1c985b9cd9995c88185b5bdd5b9d603a1b604482015260640161091c565b8a60068d815481106118a7576118a7614069565b905f5260205f2090600a02016007015f8282546118c49190614105565b925050819055508460068d815481106118df576118df614069565b905f5260205f2090600a02016003015f8282546118fc9190614105565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a084019261196f9291600160201b900416614105565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611a4c908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d1e6001600255565b5f828152600160205260408120611a7e9083613386565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b0757602002820191905f5260205f20905b815481526020019060010190808311611af3575b509394505f93505050505b8151811015611b9f57846001600160a01b0316600a5f848481518110611b3a57611b3a614069565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611b875750611b87828281518110611b7a57611b7a614069565b6020026020010151610c3d565b15611b9757600192505050610802565b600101611b12565b505f949350505050565b5f611bb381612dd8565b6001600160a01b038216611c065760405162461bcd60e51b815260206004820152601a602482015279496e76616c69642061756374696f6e656572206164647265737360301b604482015260640161091c565b611c1d5f51602061433f5f395f51905f5283611a85565b15611c625760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161091c565b611c795f51602061433f5f395f51905f5283612e4e565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061433f5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108025f51602061433f5f395f51905f5283611a85565b5f81815260016020526040902060609061080290613391565b5f51602061433f5f395f51905f52611d2081612dd8565b60035460ff1615611d435760405162461bcd60e51b815260040161091c9061407d565b5f828152600a60205260409020546001600160a01b03163314611da25760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b604482015260640161091c565b60068281548110611db557611db5614069565b5f91825260209091206009600a90920201015463ffffffff164211611e155760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161091c565b5f60068381548110611e2957611e29614069565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611e5a57611e5a614069565b5f918252602082206007600a909202010154600e5490925015611ea157612710600e5483611e88919061412c565b611e929190614143565b9050611e9e81836140bd565b91505b611eb56001600160a01b0384163384612de5565b8015611eef57611eef6001600160a01b0384167f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d83612de5565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f51602061437f5f395f51905f52611f4a81612dd8565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f611f8b81612dd8565b611fa25f51602061433f5f395f51905f5283612e79565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061433f5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610821575f80fd5b60068181548110612026575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6120a181612dd8565b6103e88263ffffffff1611156120e85760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161091c565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061216457612164614069565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106121e4576121e4614069565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b909104811661014083015291840151909250164210156122a4575f92505050610802565b5f81610140015163ffffffff1690505f8360a0015163ffffffff1642116122df5760808401516122da9063ffffffff16426140bd565b6122e1565b815b90505f8285602001516122f49190614143565b90505f612301838361412c565b90508560200151811115612316575060208501515b98975050505050505050565b5f8181526001602052604081206108029061339d565b6001600160a01b0381165f908152600d6020526040812054606091906001600160401b0381111561236b5761236b613f3b565b604051908082528060200260200182016040528015612394578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612416576001600160a01b0384165f908152600d602052604090208054829081106123e1576123e1614069565b905f5260205f2090600502016003015482828151811061240357612403614069565b6020908102919091010152600101612399565b5092915050565b6005818154811061242c575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061245a5761245a614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b9091041661014084015291935061250c91906140bd565b905061271061251d8261070861412c565b6125279190614143565b949350505050565b5f8281526020819052604090206001015461254981612dd8565b610ce58383612e79565b5f51602061435f5f395f51905f5261256a81612dd8565b6001600160a01b0382165f9081526009602052604090205460ff166125a15760405162461bcd60e51b815260040161091c90614179565b6001600160a01b0382165f9081526009602052604090819020805460ff19169055517f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06190611056908490613e8a565b5f5f51602061433f5f395f51905f5261260881612dd8565b60035460ff161561262b5760405162461bcd60e51b815260040161091c9061407d565b6001600160a01b0386166126785760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161091c565b6001600160a01b0385166126c45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161091c565b856001600160a01b0316856001600160a01b0316036127205760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b604482015260640161091c565b6001600160a01b0386165f9081526009602052604090205460ff166127575760405162461bcd60e51b815260040161091c90614179565b6127613386611aad565b156127b95760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161091c565b82514263ffffffff909116116128065760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161091c565b83516128495760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161091c565b602084015161289a5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161091c565b60408401516128e75760405162461bcd60e51b815260206004820152601960248201527804d696e696d756d207072696365206d757374206265203e203603c1b604482015260640161091c565b606084015161292f5760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161091c565b82515f9061294490429063ffffffff166140bd565b90505f811161298e5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161091c565b5f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ef91906140d0565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a2e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5291906140d0565b9050612a823330612a6484600a61428b565b8a51612a70919061412c565b6001600160a01b038d1692919061334d565b60408051610160810182526001600160a01b03808b1682528b1660208201526006918101612ab184600a61428b565b8a51612abd919061412c565b81525f6020808301919091528a01516040808301919091528a01516060820152608001612aeb84600a61428b565b60608b0151612afa919061412c565b81526020015f8152602001428152602001885f60028110612b1d57612b1d614069565b602002015163ffffffff16815260200188600160028110612b4057612b40614069565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612d3990614299565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612d8491815260200190565b60405180910390a49998505050505050505050565b5f611a7e8383612138565b5f6001600160e01b03198216637965db0b60e01b148061080257506301ffc9a760e01b6001600160e01b0319831614610802565b612de281336133a6565b50565b6040516001600160a01b03838116602483015260448201839052610d1e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506133df565b5f61080282613129565b5f5f612e5a8484613442565b90508015611a7e575f8481526001602052604090206108da90846134d1565b5f5f612e8584846134e5565b90508015611a7e575f8481526001602052604090206108da908461354e565b6002805403612ef55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161091c565b60028055565b5f60028260ff161115612f1e57612f136002836142b1565b61080290600a61428b565b506001919050565b5f8181526007602052604090206003810154600490910154612f489190614105565b421115612de2575f60068281548110612f6357612f63614069565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615612fee575f8281526007602052604081206001015460048301805491929091612fb2908490614105565b90915550505f82815260076020526040902060020154600482015410612fe9575f8281526007602052604090206002015460048201555b61304b565b5f82815260076020526040812060010154600483018054919290916130149084906140bd565b90915550505f8281526007602052604090206002015460048201541161304b575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061307c5761307c614069565b905f5260205f2090600a020190505f81600301549050805f0361309e57505050565b5f8260080154426130af91906140bd565b9050805f036130be5750505050565b60098301545f906130dd90600160201b900463ffffffff1660646142ca565b63ffffffff166130ed838561412c565b6130f79190614143565b905082811161310f5761310a81846140bd565b613111565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061313e5761313e614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416928401929092526002820154908301526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008810154610100830181905260099091015463ffffffff808216610120850152600160201b909104166101408301529092506131ee90426140bd565b90505f82610140015163ffffffff1682846060015161320d919061412c565b6132179190614143565b6060840151909150818111156132385761323182826140bd565b905061323b565b505f5b5f845f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561327b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061329f91906140d0565b90505f6132ab88613562565b90505f8660e001515f036132c85750670de0b6b3a76400006132ec565b60e08701516132df85670de0b6b3a764000061412c565b6132e99190614143565b90505b5f6132f88460126142b1565b6133039060126142e9565b61330e90600a61428b565b90506ec097ce7bc90715b34b9f10000000008161332b848661412c565b613335919061412c565b61333f9190614143565b9a9950505050505050505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ce59186918216906323b872dd90608401612e12565b5f611a7e838361378e565b60605f611a7e836137b4565b5f610802825490565b6133b08282611a85565b610f3f5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161091c565b5f5f60205f8451602086015f885af1806133fe576040513d5f823e3d81fd5b50505f513d91508115613415578060011415613422565b6001600160a01b0384163b155b15610ce55783604051635274afe760e01b815260040161091c9190613e8a565b5f61344d8383611a85565b6134ca575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556134823390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610802565b505f610802565b5f611a7e836001600160a01b03841661380b565b5f6134f08383611a85565b156134ca575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610802565b5f611a7e836001600160a01b038416613850565b5f5f6006838154811061357757613577614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161367686613933565b90505f84610120015163ffffffff164211613691575f6136a7565b6101208501516136a79063ffffffff16426140bd565b90505f8560c0015183670de0b6b3a76400006136c3919061412c565b6136cd9190614143565b90505f6136db836001614105565b6136e5838761412c565b6136ef9190614143565b9050856060015186608001516137059190614105565b42116137615785511561373c5760208601516137219086614105565b9450856040015185111561373757856040015194505b613761565b602086015161374b90866140bd565b9450856040015185101561376157856040015194505b808511156137805761377381866140bd565b9998505050505050505050565b505f98975050505050505050565b5f825f0182815481106137a3576137a3614069565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bc057602002820191905f5260205f2090815481526020019060010190808311610bac5750505050509050919050565b5f8181526001830160205260408120546134ca57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610802565b5f818152600183016020526040812054801561392a575f6138726001836140bd565b85549091505f90613885906001906140bd565b90508082146138e4575f865f0182815481106138a3576138a3614069565b905f5260205f200154905080875f0184815481106138c3576138c3614069565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806138f5576138f5614118565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610802565b5f915050610802565b5f5f6006838154811061394857613948614069565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416928401929092526002820154908301526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301819052600882015461010084015260099091015463ffffffff808216610120850152600160201b909104166101408301529092509003613a045750670de0b6b3a764000092915050565b5f815f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6891906140d0565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613aab573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613acf91906140d0565b90505f613adc8383614302565b90505f815f0b12613b32575f613af382600a61428b565b8560e00151613b02919061412c565b9050808560600151670de0b6b3a7640000613b1d919061412c565b613b279190614143565b979650505050505050565b5f613b3c82614322565b613b4790600a61428b565b8560600151613b56919061412c565b60e0860151909150613b1d82670de0b6b3a764000061412c565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613be6575f5ffd5b81356001600160e01b031981168114611a7e575f5ffd5b6001600160a01b0381168114612de2575f5ffd5b5f5f60408385031215613c22575f5ffd5b8235613c2d81613bfd565b946020939093013593505050565b5f5f60208385031215613c4c575f5ffd5b82356001600160401b03811115613c61575f5ffd5b8301601f81018513613c71575f5ffd5b80356001600160401b03811115613c86575f5ffd5b8560208260051b8401011115613c9a575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613cd160208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613d1460c08401826001600160a01b03169052565b5060e0810151613d2860e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613d8357613d6c838551613caa565b602093909301926101409290920191600101613d59565b509095945050505050565b5f60208284031215613d9e575f5ffd5b5035919050565b61014081016108028284613caa565b5f60208284031215613dc4575f5ffd5b8135611a7e81613bfd565b602080825282518282018190525f918401906040840190835b81811015613d83578351835260209384019390920191600101613de8565b5f5f60408385031215613e17575f5ffd5b823591506020830135613e2981613bfd565b809150509250929050565b5f5f5f60608486031215613e46575f5ffd5b83359250602084013591506040840135613e5f81613bfd565b809150509250925092565b5f5f60408385031215613e7b575f5ffd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f5f60408385031215613eaf575f5ffd5b8235613eba81613bfd565b91506020830135613e2981613bfd565b602080825282518282018190525f918401906040840190835b81811015613d835783516001600160a01b0316835260209384019390920191600101613ee3565b803563ffffffff81168114613f1d575f5ffd5b919050565b5f60208284031215613f32575f5ffd5b611a7e82613f0a565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613f8357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112613f9a575f5ffd5b613fa46040613f4f565b806040840185811115613fb5575f5ffd5b845b81811015613d8357613fc881613f0a565b845260209384019301613fb7565b5f5f5f5f6101008587031215613fea575f5ffd5b8435613ff581613bfd565b9350602085013561400581613bfd565b9250605f85018613614015575f5ffd5b61401f6080613f4f565b8060c0870188811115614030575f5ffd5b604088015b8181101561404d578035845260209384019301614035565b5081945061405b8982613f8b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610802576108026140a9565b5f602082840312156140e0575f5ffd5b815160ff81168114611a7e575f5ffd5b5f816140fe576140fe6140a9565b505f190190565b80820180821115610802576108026140a9565b634e487b7160e01b5f52603160045260245ffd5b8082028115828204841417610802576108026140a9565b5f8261415d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614172575f5ffd5b5051919050565b602080825260159082015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604082015260600190565b6001815b60018411156141e3578085048111156141c7576141c76140a9565b60018416156141d557908102905b60019390931c9280026141ac565b935093915050565b5f826141f957506001610802565b8161420557505f610802565b816001811461421b576002811461422557614241565b6001915050610802565b60ff841115614236576142366140a9565b50506001821b610802565b5060208310610133831016604e8410600b8410161715614264575081810a610802565b6142705f1984846141a8565b805f1904821115614283576142836140a9565b029392505050565b5f611a7e60ff8416836141eb565b5f600182016142aa576142aa6140a9565b5060010190565b60ff8281168282160390811115610802576108026140a9565b63ffffffff8181168382160290811690818114612416576124166140a9565b60ff8181168382160190811115610802576108026140a9565b5f82810b9082900b03607f198112607f82131715610802576108026140a9565b5f81810b60808101614336576143366140a9565b5f039291505056fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220985771176569316e52a4cb3b0d4f91e1501601df1076e20b2058c9c3f5c63f9064736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5e4D8755c0cBD26E8670b27Bc0bD21EF84cD881d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode Sourcemap
50569:23210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44115:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44115:214:0;;;;;;;;52233:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52233:53:0;1101:177:1;66912:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57128:393::-;;;;;;:::i;:::-;;:::i;:::-;;66256:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63976:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65033:107::-;;;;;;:::i;:::-;;:::i;64126:138::-;;;;;;:::i;:::-;;:::i;51855:28::-;;;;;;27188:122;;;;;;:::i;:::-;27253:7;27280:12;;;;;;;;;;:22;;;;27188:122;64601:162;;;;;;:::i;:::-;;:::i;27620:138::-;;;;;;:::i;:::-;;:::i;28757:251::-;;;;;;:::i;:::-;;:::i;63263:165::-;;;:::i;50934:18::-;;;;;;;;;62483:525;;;;;;:::i;:::-;;:::i;50845:80::-;;-1:-1:-1;;;;;;;;;;;50845:80:0;;58249:350;;;;;;:::i;:::-;;:::i;67408:174::-;;;;;;:::i;:::-;;:::i;60465:1074::-;;;;;;:::i;:::-;;:::i;52293:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6339:32:1;;;6321:51;;6403:2;6388:18;;6381:34;;;;6431:18;;;6424:34;;;;6489:2;6474:18;;6467:34;6550:10;6538:23;;;6532:3;6517:19;;6510:52;6599:23;6359:3;6578:19;;6571:52;6308:3;6293:19;52293:43:0;6038:591:1;58726:1731:0;;;;;;:::i;:::-;;:::i;44928:144::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50754:84::-;;-1:-1:-1;;;;;;;;;;;50754:84:0;;26204:138;;;;;;:::i;:::-;;:::i;73290:375::-;;;;;;:::i;:::-;;:::i;61679:489::-;;;;;;:::i;:::-;;:::i;65152:127::-;;;;;;:::i;:::-;;:::i;25516:49::-;;25561:4;25516:49;;45932:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57527:710::-;;;;;;:::i;:::-;;:::i;63436:170::-;;;:::i;52410:38::-;;52444:4;52410:38;;51955:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8998:14:1;;8991:22;8973:41;;9045:2;9030:18;;9023:34;;;;9073:18;;;9066:34;;;;9131:2;9116:18;;9109:34;9174:3;9159:19;;9152:35;8960:3;8945:19;51955:45:0;8720:473:1;62176:298:0;;;;;;:::i;:::-;;:::i;52174:52::-;;;;;;:::i;:::-;;:::i;51928:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9640:32:1;;;9622:51;;9709:32;;;;9704:2;9689:18;;9682:60;9758:18;;;9751:34;;;;9816:2;9801:18;;9794:34;;;;9859:3;9844:19;;9837:35;;;;9660:3;9888:19;;9881:35;;;;9947:3;9932:19;;9925:35;9991:3;9976:19;;9969:35;10035:3;10020:19;;10013:35;10097:10;10085:23;;;10079:3;10064:19;;10057:52;10146:24;10140:3;10125:19;;10118:53;9609:3;9594:19;51928:20:0;9198:979:1;63613:237:0;;;;;;:::i;:::-;;:::i;65287:959::-;;;;;;:::i;:::-;;:::i;45246:133::-;;;;;;:::i;:::-;;:::i;50677:70::-;;-1:-1:-1;;;;;;;;;;;50677:70:0;;64272:316;;;;;;:::i;:::-;;:::i;51890:31::-;;;;;;:::i;:::-;;:::i;64777:244::-;;;;;;:::i;:::-;;:::i;28051:140::-;;;;;;:::i;:::-;;:::i;63016:232::-;;;;;;:::i;:::-;;:::i;52380:23::-;;;;;;54642:2477;;;;;;:::i;:::-;;:::i;52112:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52112:55:0;;;52344:29;;;;;67260:141;;;;;;:::i;:::-;;:::i;44115:214::-;44200:4;-1:-1:-1;;;;;;44224:57:0;;-1:-1:-1;;;44224:57:0;;:97;;;44285:36;44309:11;44285:23;:36::i;:::-;44217:104;44115:214;-1:-1:-1;;44115:214:0:o;52233:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66912:342::-;66997:23;67029:31;67084:9;-1:-1:-1;;;;;67063:38:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;67029:72:0;-1:-1:-1;67119:9:0;67114:110;67134:20;;;67114:110;;;67185:31;67203:9;;67213:1;67203:12;;;;;;;:::i;:::-;;;;;;;67185:17;:31::i;:::-;67172:7;67180:1;67172:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;67156:3;;67114:110;;;-1:-1:-1;67243:7:0;66912:342;-1:-1:-1;;;66912:342:0:o;57128:393::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;73724:6:::1;::::0;::::1;;73723:7;73715:38;;;;-1:-1:-1::0;;;73715:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57220:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57220:25:0::2;57249:10;57220:39;57216:69;;57261:24;::::0;-1:-1:-1;;;57261:24:0;;13420:2:1;57261:24:0::2;::::0;::::2;13402:21:1::0;13459:2;13439:18;;;13432:30;-1:-1:-1;;;13478:18:1;;;13471:43;13531:18;;57261:24:0::2;13218:337:1::0;57216:69:0::2;57321:15;57292:5;57298:3;57292:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57346:18;57393:5;57399:3;57393:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57367:5;57373:3;57367:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57346:67;;57422;57466:10;57478;57429:5;57435:3;57429:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57429:22:0::2;::::0;57422:67;:43:::2;:67::i;:::-;57503:14;::::0;57513:3;;57503:14:::2;::::0;;;::::2;57209:312;57128:393:::0;;:::o;66256:648::-;66322:21;;:::i;:::-;66356:18;66377:5;66383:8;66377:15;;;;;;;;:::i;:::-;;;;;;;;;;66420:476;;;;;;;;66377:15;;;;;;;66462;;-1:-1:-1;;;;;66462:15:0;;;66420:476;;66462:15;66505:16;;;;66420:476;;;;;;;66377:15;;-1:-1:-1;66420:476:0;;;66543:24;66558:8;66543:14;:24::i;:::-;66420:476;;;;66593:26;66610:8;66593:16;:26::i;:::-;66420:476;;66647:16;;;;-1:-1:-1;;;66647:16:0;;;;66420:476;;;;;;;;66693:17;;;;66420:476;;;;;;;;-1:-1:-1;66737:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;66737:30:0;66420:476;;;;;;66790:16;66737:30;66790:6;:16::i;:::-;66420:476;;;;66832:14;;;;66420:476;;;;66871:13;;;;;;;66420:476;;;;;;;;66413:483;66256:648;-1:-1:-1;;66256:648:0:o;63976:142::-;-1:-1:-1;;;;;64083:27:0;;;;;;:15;:27;;;;;;;;;64076:34;;;;;;;;;;;;;;;;;64046:16;;64076:34;;;64083:27;64076:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63976:142;;;:::o;65033:107::-;65085:7;65113:19;65128:3;65113:14;:19::i;64126:138::-;-1:-1:-1;;;;;64232:24:0;;;;;;:16;:24;;;;;;;;;64225:31;;;;;;;;;;;;;;;;;64193:16;;64225:31;;;64232:24;64225:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64126:138;;;:::o;64601:162::-;64651:4;64695:5;64701:3;64695:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;64676:15;:38;;;;:83;;;64741:5;64747:3;64741:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;64718:5;64724:3;64718:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;64669:90;64601:162;-1:-1:-1;;64601:162:0:o;27620:138::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;27725:25:::1;27736:4;27742:7;27725:10;:25::i;:::-;;27620:138:::0;;;:::o;28757:251::-;-1:-1:-1;;;;;28851:34:0;;22507:10;28851:34;28847:104;;28909:30;;-1:-1:-1;;;28909:30:0;;;;;;;;;;;28847:104;28963:37;28975:4;28981:18;28963:11;:37::i;:::-;;28757:251;;:::o;63263:165::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;63365:6:::1;:13:::0;;-1:-1:-1;;63365:13:0::1;63374:4;63365:13;::::0;;63394:26:::1;::::0;63409:10:::1;::::0;63394:26:::1;::::0;63365:6:::1;::::0;63394:26:::1;63263:165:::0;:::o;62483:525::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;62610:20:0;::::1;62602:54;;;::::0;-1:-1:-1;;;62602:54:0;;14027:2:1;62602:54:0::1;::::0;::::1;14009:21:1::0;14066:2;14046:18;;;14039:30;-1:-1:-1;;;14085:18:1;;;14078:51;14146:18;;62602:54:0::1;13825:345:1::0;62602:54:0::1;-1:-1:-1::0;;;;;62676:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;62675:26;62667:64;;;::::0;-1:-1:-1;;;62667:64:0;;14377:2:1;62667:64:0::1;::::0;::::1;14359:21:1::0;14416:2;14396:18;;;14389:30;-1:-1:-1;;;14435:18:1;;;14428:55;14500:18;;62667:64:0::1;14175:349:1::0;62667:64:0::1;62803:6;-1:-1:-1::0;;;;;62788:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;62788:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;62788:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;62784:217;;62960:29;::::0;-1:-1:-1;;;62960:29:0;;15009:2:1;62960:29:0::1;::::0;::::1;14991:21:1::0;15048:2;15028:18;;;15021:30;-1:-1:-1;;;15067:18:1;;;15060:49;15126:18;;62960:29:0::1;14807:343:1::0;62784:217:0::1;-1:-1:-1::0;;;;;;62853:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;62853:32:0::1;62881:4;62853:32:::0;;::::1;::::0;;;62900:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;62900:26:0::1;::::0;;::::1;::::0;;62784:217:::1;62483:525:::0;;:::o;58249:350::-;58338:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58338:30:0;58372:10;58338:44;58330:73;;;;-1:-1:-1;;;58330:73:0;;15357:2:1;58330:73:0;;;15339:21:1;15396:2;15376:18;;;15369:30;-1:-1:-1;;;15415:18:1;;;15408:46;15471:18;;58330:73:0;15155:340:1;58330:73:0;58418:39;-1:-1:-1;;;;;;;;;;;58443:13:0;58418:7;:39::i;:::-;58410:66;;;;-1:-1:-1;;;58410:66:0;;15702:2:1;58410:66:0;;;15684:21:1;15741:2;15721:18;;;15714:30;-1:-1:-1;;;15760:18:1;;;15753:44;15814:18;;58410:66:0;15500:338:1;58410:66:0;58483:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58483:46:0;-1:-1:-1;;;;;58483:46:0;;;;;;;;58541:54;;16045:25:1;;;58569:10:0;16086:18:1;;;16079:60;;;;16155:18;;;16148:60;;;;58541:54:0;;16033:2:1;16018:18;58541:54:0;;;;;;;;58249:350;;:::o;67408:174::-;-1:-1:-1;;;;;67510:14:0;;67478:4;67510:14;;;:8;:14;;;;;:23;;67478:4;;67510:14;67525:7;;67510:23;;;;;;:::i;:::-;;;;;;;;;;67491:42;;;;;;;;67510:23;;;;;;;67491:42;;-1:-1:-1;;;;;67491:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67491:42:0;;;;;;;;;;;67547:15;:31;;;-1:-1:-1;;67408:174:0;;;;:::o;60465:1074::-;60539:22;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;60587:14:0;::::1;60570;60587::::0;;;:8:::1;:14;::::0;;;;:21;;;60651:852:::1;60676:5:::0;;60651:852:::1;;60695:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;60748:14:0;::::1;60721:24;60748:14:::0;;;:8:::1;:14;::::0;;;;:17;;60695:3;;-1:-1:-1;60721:24:0;;-1:-1:-1;60748:14:0;60695:3;;60748:17;::::1;;;;;:::i;:::-;;;;;;;;;;;60721:44;;60804:3;60780:11;:20;;;:27:::0;60776:720:::1;;60824:14;60841:30;60863:4;60869:1;60841:21;:30::i;:::-;60824:47:::0;-1:-1:-1;60904:10:0;;60900:585:::1;;60961:6;60935:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60986:23:0::1;::::0;-1:-1:-1;61003:6:0;60986:23;::::1;:::i;:::-;;;61110:57;61154:4;61160:6;61117:5;61123:3;61117:10;;;;;;;;:::i;61110:57::-;61208:11;:22;;;61234:1;61208:27:::0;61204:266:::1;;-1:-1:-1::0;;;;;61269:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;61293:1:::1;::::0;61269:25:::1;:::i;:::-;61264:1;:30;61260:148;;-1:-1:-1::0;;;;;61343:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;61358:21;;:25:::1;::::0;61382:1:::1;::::0;61358:25:::1;:::i;:::-;61343:41;;;;;;;;:::i;:::-;;;;;;;;;;;61323:8;:14;61332:4;-1:-1:-1::0;;;;;61323:14:0::1;-1:-1:-1::0;;;;;61323:14:0::1;;;;;;;;;;;;61338:1;61323:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;61323:61:0::1;-1:-1:-1::0;;;;;61323:61: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;::::0;;-1:-1:-1;;61323:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;61323:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;61323:61:0;;;;;;;;;::::1;::::0;;61260:148:::1;-1:-1:-1::0;;;;;61430:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;61430:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;61430:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;61430:20:0;;;;;61204:266:::1;60809:687;60776:720;60684:819;60651:852;;;-1:-1:-1::0;61522:13:0;-1:-1:-1;;49067:20:0;48461:1;49587:7;:22;49404:213;52293:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52293:43:0;;;;-1:-1:-1;52293:43:0;;-1:-1:-1;52293:43:0;;;;;;;-1:-1:-1;;;52293:43:0;;;;:::o;58726:1731::-;49023:21;:19;:21::i;:::-;-1:-1:-1;;;;;58821:18:0;::::1;58813:51;;;::::0;-1:-1:-1;;;58813:51:0;;16824:2:1;58813:51:0::1;::::0;::::1;16806:21:1::0;16863:2;16843:18;;;16836:30;-1:-1:-1;;;16882:18:1;;;16875:50;16942:18;;58813:51:0::1;16622:344:1::0;58813:51:0::1;58885:5;:12:::0;58879:18;::::1;58871:48;;;::::0;-1:-1:-1;;;58871:48:0;;17173:2:1;58871:48:0::1;::::0;::::1;17155:21:1::0;17212:2;17192:18;;;17185:30;-1:-1:-1;;;17231:18:1;;;17224:47;17288:18;;58871:48:0::1;16971:341:1::0;58871:48:0::1;58926:18;58947:5;58953:3;58947:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;58991:13;::::0;::::1;::::0;58947:10;;-1:-1:-1;58991:13:0::1;;58972:15;:32;;58964:59;;;::::0;-1:-1:-1;;;58964:59:0;;17519:2:1;58964:59:0::1;::::0;::::1;17501:21:1::0;17558:2;17538:18;;;17531:30;-1:-1:-1;;;17577:18:1;;;17570:44;17631:18;;58964:59:0::1;17317:338:1::0;58964:59:0::1;59055:4;:12;;;59038:4;:14;;;:29;59030:71;;;::::0;-1:-1:-1;;;59030:71:0;;17862:2:1;59030:71:0::1;::::0;::::1;17844:21:1::0;17901:2;17881:18;;;17874:30;17940:31;17920:18;;;17913:59;17989:18;;59030:71:0::1;17660:353:1::0;59030:71:0::1;59155:15:::0;;59132:51:::1;::::0;;-1:-1:-1;;;59132:51:0;;;;59110:19:::1;::::0;-1:-1:-1;;;;;59155:15:0::1;::::0;59132:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;59155:15;59132:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59110:73;;59190:22;59215:38;59239:13;59215:23;:38::i;:::-;59190:63;;59278:14;59268:6;:24;;59260:68;;;::::0;-1:-1:-1;;;59260:68:0;;18220:2:1;59260:68:0::1;::::0;::::1;18202:21:1::0;18259:2;18239:18;;;18232:30;18298:33;18278:18;;;18271:61;18349:18;;59260:68:0::1;18018:355:1::0;59260:68:0::1;59337:10;59343:3;59337:5;:10::i;:::-;59354:15;59365:3;59354:10;:15::i;:::-;59378:13;59394:17;59407:3;59394:12;:17::i;:::-;59378:33:::0;-1:-1:-1;59418:14:0::1;59378:33:::0;59436:13:::1;:6:::0;59445:4:::1;59436:13;:::i;:::-;59435:23;;;;:::i;:::-;59418:40;;59465:17;59528:5;59502:4;:14;;;59487:4;:12;;;:29;;;;:::i;:::-;59486:38;::::0;59520:4:::1;59486:38;:::i;:::-;59485:48;;;;:::i;:::-;59465:68;;59564:9;59554:6;:19;;59546:63;;;::::0;-1:-1:-1;;;59546:63:0;;18975:2:1;59546:63:0::1;::::0;::::1;18957:21:1::0;19014:2;18994:18;;;18987:30;19053:33;19033:18;;;19026:61;19104:18;;59546:63:0::1;18773:355:1::0;59546:63:0::1;59651:4;:12;;;59641:6;59624:4;:14;;;:23;;;;:::i;:::-;:39;;59616:77;;;::::0;-1:-1:-1;;;59616:77:0;;19335:2:1;59616:77:0::1;::::0;::::1;19317:21:1::0;19374:2;19354:18;;;19347:30;-1:-1:-1;;;19393:18:1;;;19386:55;19458:18;;59616:77:0::1;19133:349:1::0;59616:77:0::1;59729:15:::0;;59776:35:::1;::::0;-1:-1:-1;;;59776:35:0;;-1:-1:-1;;;;;59729:15:0;;::::1;::::0;59702:17:::1;::::0;59729:15;;59776:20:::1;::::0;:35:::1;::::0;59805:4:::1;::::0;59776:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59752:59:::0;-1:-1:-1;59818:62:0::1;-1:-1:-1::0;;;;;59818:27:0;::::1;59846:10;59866:4;59873:6:::0;59818:27:::1;:62::i;:::-;59910:35;::::0;-1:-1:-1;;;59910:35:0;;59887:20:::1;::::0;-1:-1:-1;;;;;59910:20:0;::::1;::::0;::::1;::::0;:35:::1;::::0;59939:4:::1;::::0;59910:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59887:58:::0;-1:-1:-1;59992:6:0;59960:28:::1;59975:13:::0;59887:58;59960:28:::1;:::i;:::-;:38;59952:76;;;::::0;-1:-1:-1;;;59952:76:0;;19878:2:1;59952:76:0::1;::::0;::::1;19860:21:1::0;19917:2;19897:18;;;19890:30;-1:-1:-1;;;19936:18:1;;;19929:55;20001:18;;59952:76:0::1;19676:349:1::0;59952:76:0::1;60073:6;60041:5;60047:3;60041:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;60110:6;60086:5;60092:3;60086:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;60125:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;60145:240;;::::1;::::0;::::1;::::0;;60174:16:::1;::::0;::::1;::::0;;;::::1;60145:240:::0;;;;::::1;::::0;;;;;;;;;;;;;;;::::1;60299:15;60145:240:::0;;::::1;::::0;;;;60342:16:::1;::::0;::::1;::::0;60125:14;;60145:240;;;;;60342:34:::1;::::0;60299:15;-1:-1:-1;;;60342:16:0;::::1;;:34;:::i;:::-;60145:240;::::0;;::::1;::::0;;;60125:261;;::::1;::::0;;::::1;::::0;;-1:-1:-1;60125:261:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;60125:261:0;;::::1;-1:-1:-1::0;;;;;;60125:261: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;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;60125:261:0::1;-1:-1:-1::0;;60125:261:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;60402:47;;60422:3;;60402:47;::::1;::::0;::::1;::::0;::::1;::::0;60427:6;;60435;;60443:5;;20232:25:1;;;20288:2;20273:18;;20266:34;;;;20331:2;20316:18;;20309:34;20220:2;20205:18;;20030:319;60402:47:0::1;;;;;;;;58806:1651;;;;;;;;;49067:20:::0;48461:1;49587:7;:22;49404:213;44928:144;45009:7;45036:18;;;:12;:18;;;;;:28;;45058:5;45036:21;:28::i;:::-;45029:35;44928:144;-1:-1:-1;;;44928:144:0:o;26204:138::-;26281:4;26305:12;;;;;;;;;;;-1:-1:-1;;;;;26305:29:0;;;;;;;;;;;;;;;26204:138::o;73290:375::-;-1:-1:-1;;;;;73428:27:0;;73388:4;73428:27;;;:15;:27;;;;;;;;73401:54;;;;;;;;;;;;;;;;;73388:4;;73401:54;;73428:27;73401:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73401:54:0;;-1:-1:-1;73466:9:0;;-1:-1:-1;;;;73462:181:0;73485:7;:14;73481:1;:18;73462:181;;;73555:10;-1:-1:-1;;;;;73519:46:0;:20;:32;73540:7;73548:1;73540:10;;;;;;;;:::i;:::-;;;;;;;;;;;;73519:32;;;;;;;;;;-1:-1:-1;73519:32:0;;-1:-1:-1;;;;;73519:32:0;:46;:68;;;;;73569:18;73576:7;73584:1;73576:10;;;;;;;;:::i;:::-;;;;;;;73569:6;:18::i;:::-;73516:120;;;73620:4;73613:11;;;;;;73516:120;73501:3;;73462:181;;;-1:-1:-1;73656:5:0;;73290:375;-1:-1:-1;;;;73290:375:0:o;61679:489::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;61846:25:0;::::1;61838:64;;;::::0;-1:-1:-1;;;61838:64:0;;20556:2:1;61838:64:0::1;::::0;::::1;20538:21:1::0;20595:2;20575:18;;;20568:30;-1:-1:-1;;;20614:18:1;;;20607:56;20680:18;;61838:64:0::1;20354:350:1::0;61838:64:0::1;61922:37;-1:-1:-1::0;;;;;;;;;;;61947:11:0::1;61922:7;:37::i;:::-;61921:38;61913:72;;;::::0;-1:-1:-1;;;61913:72:0;;20911:2:1;61913:72:0::1;::::0;::::1;20893:21:1::0;20950:2;20930:18;;;20923:30;-1:-1:-1;;;20969:18:1;;;20962:51;21030:18;;61913:72:0::1;20709:345:1::0;61913:72:0::1;61998:40;-1:-1:-1::0;;;;;;;;;;;62026:11:0::1;61998:10;:40::i;:::-;-1:-1:-1::0;;;;;;62049:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;62049:42:0::1;62087:4;62049:42;::::0;;62107:53;62149:10:::1;::::0;62049:35;-1:-1:-1;;;;;;;;;;;50719:28:0;62107:53:::1;::::0;62049:35;62107:53:::1;61679:489:::0;;:::o;65152:127::-;65214:4;65238:33;-1:-1:-1;;;;;;;;;;;65263:7:0;65238;:33::i;45932:138::-;46035:18;;;;:12;:18;;;;;45999:16;;46035:27;;:25;:27::i;57527:710::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;73724:6:::1;::::0;::::1;;73723:7;73715:38;;;;-1:-1:-1::0;;;73715:38:0::1;;;;;;;:::i;:::-;57633:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57633:25:0::2;57662:10;57633:39;57625:75;;;::::0;-1:-1:-1;;;57625:75:0;;21261:2:1;57625:75:0::2;::::0;::::2;21243:21:1::0;21300:2;21280:18;;;21273:30;-1:-1:-1;;;21319:18:1;;;21312:53;21382:18;;57625:75:0::2;21059:347:1::0;57625:75:0::2;57733:5;57739:3;57733:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57715:15;:37;57707:72;;;::::0;-1:-1:-1;;;57707:72:0;;21613:2:1;57707:72:0::2;::::0;::::2;21595:21:1::0;21652:2;21632:18;;;21625:30;-1:-1:-1;;;21671:18:1;;;21664:52;21733:18;;57707:72:0::2;21411:346:1::0;57707:72:0::2;57788:18;57809:5;57815:3;57809:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;57855:5:::2;:10:::0;;-1:-1:-1;;;;;57809:21:0;;::::2;::::0;-1:-1:-1;57855:5:0;57861:3;;57855:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;57921:8:::2;::::0;57855:28;;-1:-1:-1;57921:12:0;57917:102:::2;;57978:5;57966:8;;57956:7;:18;;;;:::i;:::-;57955:28;;;;:::i;:::-;57946:37:::0;-1:-1:-1;57994:17:0::2;57946:37:::0;57994:17;::::2;:::i;:::-;;;57917:102;58027:52;-1:-1:-1::0;;;;;58027:31:0;::::2;58059:10;58071:7:::0;58027:31:::2;:52::i;:::-;58090:10:::0;;58086:80:::2;;58113:45;-1:-1:-1::0;;;;;58113:31:0;::::2;58145:4;58151:6:::0;58113:31:::2;:45::i;:::-;58179:54;::::0;;21936:25:1;;;21992:2;21977:18;;21970:34;;;58205:10:0::2;::::0;58200:3;;58179:54:::2;::::0;21909:18:1;58179:54:0::2;;;;;;;57618:619;;;57527:710:::0;;:::o;63436:170::-;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;63540:6:::1;:14:::0;;-1:-1:-1;;63540:14:0::1;::::0;;63570:28:::1;::::0;63587:10:::1;::::0;63570:28:::1;::::0;63549:5:::1;::::0;63570:28:::1;63436:170:::0;:::o;62176:298::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;62302:41:::1;-1:-1:-1::0;;;;;;;;;;;62331:11:0::1;62302;:41::i;:::-;-1:-1:-1::0;;;;;;62354:35:0;::::1;62392:5;62354:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;62354:43:0::1;::::0;;62413:53;62455:10:::1;::::0;62354:35;-1:-1:-1;;;;;;;;;;;50719:28:0;62413:53:::1;::::0;62392:5;62413:53:::1;62176:298:::0;;:::o;52174:52::-;;;;;;;;;;;;;;;;;;;;51928:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51928:20:0;;;;-1:-1:-1;51928:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51928:20:0;;;;:::o;63613:237::-;25561:4;25800:16;25561:4;25800:10;:16::i;:::-;52444:4:::1;63706:10;:21;;;;63698:46;;;::::0;-1:-1:-1;;;63698:46:0;;22217:2:1;63698:46:0::1;::::0;::::1;22199:21:1::0;22256:2;22236:18;;;22229:30;-1:-1:-1;;;22275:18:1;;;22268:42;22327:18;;63698:46:0::1;22015:336:1::0;63698:46:0::1;63768:8;::::0;;63783:21:::1;::::0;::::1;::::0;;;;63816:30:::1;::::0;;22529:25:1;;;22585:2;22570:18;;22563:51;;;;63768:8:0;;63816:30:::1;::::0;22502:18:1;63816:30:0::1;;;;;;;63691:159;63613:237:::0;;:::o;65287:959::-;-1:-1:-1;;;;;65405:14:0;;65370:7;65405:14;;;:8;:14;;;;;:23;;65370:7;;65405:14;65420:7;;65405:23;;;;;;:::i;:::-;;;;;;;;;65386:42;;;;;;;;65405:23;;;;;;;65386:42;;-1:-1:-1;;;;;65386:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65386:42:0;;;;;;;;65455:5;:20;;65386:42;;-1:-1:-1;65455:5:0;:20;;;;;;:::i;:::-;;;;;;;;;;65435:40;;;;;;;;65455:20;;;;;;;65435:40;;-1:-1:-1;;;;;65435:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65435:40:0;;;;;;;;;65538:14;;;;65435:40;;-1:-1:-1;65520:32:0;:15;:32;65516:65;;;65572:1;65565:8;;;;;;65516:65;65630:19;65652:4;:16;;;65630:38;;;;65725:19;65765:4;:12;;;65747:30;;:15;:30;:99;;65832:14;;;;65814:32;;;;:15;:32;:::i;:::-;65747:99;;;65790:11;65747:99;65725:121;;65891:23;65935:11;65917:4;:15;;;:29;;;;:::i;:::-;65891:55;-1:-1:-1;65998:24:0;66025:29;66043:11;65891:55;66025:29;:::i;:::-;65998:56;;66141:4;:15;;;66122:16;:34;66118:93;;;-1:-1:-1;66188:15:0;;;;66118:93;66226:16;65287:959;-1:-1:-1;;;;;;;;65287:959:0:o;45246:133::-;45317:7;45344:18;;;:12;:18;;;;;:27;;:25;:27::i;64272:316::-;-1:-1:-1;;;;;64413:14:0;;64368:28;64413:14;;;:8;:14;;;;;:21;64335:16;;64368:28;-1:-1:-1;;;;;64399:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64399:36:0;-1:-1:-1;64368:67:0;-1:-1:-1;64447:9:0;64442:114;-1:-1:-1;;;;;64466:14:0;;;;;;:8;:14;;;;;:21;64462:25;;64442:114;;;-1:-1:-1;;;;;64522:14:0;;;;;;:8;:14;;;;;:17;;64537:1;;64522:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;64505:11;64517:1;64505:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;64489:3;;64442:114;;;-1:-1:-1;64569:11:0;64272:316;-1:-1:-1;;64272:316:0:o;51890:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51890:31:0;;-1:-1:-1;51890:31:0;:::o;64777:244::-;64837:7;64856:17;64876:5;64882:3;64876:10;;;;;;;;:::i;:::-;;;;;;;;;64856:30;;;;;;;;64876:10;;;;;;;64856:30;;-1:-1:-1;;;;;64856:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64856:30:0;;;;;;;;;;-1:-1:-1;64920:29:0;;64856:30;64920:29;:::i;:::-;64896:53;-1:-1:-1;64991:5:0;64967:20;64896:53;64983:4;64967:20;:::i;:::-;64966:30;;;;:::i;:::-;64959:37;64777:244;-1:-1:-1;;;;64777:244:0:o;28051:140::-;27253:7;27280:12;;;;;;;;;;:22;;;25800:16;25811:4;25800:10;:16::i;:::-;28157:26:::1;28169:4;28175:7;28157:11;:26::i;63016:232::-:0;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;-1:-1:-1;;;;;63115:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63107:59;;;;-1:-1:-1::0;;;63107:59:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63173:25:0;::::1;63201:5;63173:25:::0;;;:17:::1;:25;::::0;;;;;;:33;;-1:-1:-1;;63173:33:0::1;::::0;;63218:26;::::1;::::0;::::1;::::0;63191:6;;63218:26:::1;:::i;54642:2477::-:0;54931:16;-1:-1:-1;;;;;;;;;;;25800:16:0;25811:4;25800:10;:16::i;:::-;73724:6:::1;::::0;::::1;;73723:7;73715:38;;;;-1:-1:-1::0;;;73715:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54992:26:0;::::2;54984:59;;;::::0;-1:-1:-1;;;54984:59:0;;23177:2:1;54984:59:0::2;::::0;::::2;23159:21:1::0;23216:2;23196:18;;;23189:30;-1:-1:-1;;;23235:18:1;;;23228:50;23295:18;;54984:59:0::2;22975:344:1::0;54984:59:0::2;-1:-1:-1::0;;;;;55058:34:0;::::2;55050:66;;;::::0;-1:-1:-1;;;55050:66:0;;23526:2:1;55050:66:0::2;::::0;::::2;23508:21:1::0;23565:2;23545:18;;;23538:30;-1:-1:-1;;;23584:18:1;;;23577:49;23643:18;;55050:66:0::2;23324:343:1::0;55050:66:0::2;55155:12;-1:-1:-1::0;;;;;55131:36:0::2;55139:11;-1:-1:-1::0;;;;;55131:36:0::2;::::0;55123:73:::2;;;::::0;-1:-1:-1;;;55123:73:0;;23874:2:1;55123:73:0::2;::::0;::::2;23856:21:1::0;23913:2;23893:18;;;23886:30;-1:-1:-1;;;23932:18:1;;;23925:54;23996:18;;55123:73:0::2;23672:348:1::0;55123:73:0::2;-1:-1:-1::0;;;;;55211:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55203:65;;;;-1:-1:-1::0;;;55203:65:0::2;;;;;;;:::i;:::-;55284:61;55312:10;55332:11;55284:27;:61::i;:::-;55283:62;55275:109;;;::::0;-1:-1:-1;;;55275:109:0;;24227:2:1;55275:109:0::2;::::0;::::2;24209:21:1::0;24266:2;24246:18;;;24239:30;24305:34;24285:18;;;24278:62;-1:-1:-1;;;24356:18:1;;;24349:32;24398:19;;55275:109:0::2;24025:398:1::0;55275:109:0::2;55430:16:::0;;55449:15:::2;55430:34;::::0;;::::2;;55422:65;;;::::0;-1:-1:-1;;;55422:65:0;;24630:2:1;55422:65:0::2;::::0;::::2;24612:21:1::0;24669:2;24649:18;;;24642:30;-1:-1:-1;;;24688:18:1;;;24681:48;24746:18;;55422:65:0::2;24428:342:1::0;55422:65:0::2;55533:9:::0;;55525:44:::2;;;::::0;-1:-1:-1;;;55525:44:0;;24977:2:1;55525:44:0::2;::::0;::::2;24959:21:1::0;25016:2;24996:18;;;24989:30;-1:-1:-1;;;25035:18:1;;;25028:48;25093:18;;55525:44:0::2;24775:342:1::0;55525:44:0::2;55584:9;::::0;::::2;::::0;55576:54:::2;;;::::0;-1:-1:-1;;;55576:54:0;;25324:2:1;55576:54:0::2;::::0;::::2;25306:21:1::0;25363:2;25343:18;;;25336:30;25402;25382:18;;;25375:58;25450:18;;55576:54:0::2;25122:352:1::0;55576:54:0::2;55645:9:::0;;::::2;::::0;55637:51:::2;;;::::0;-1:-1:-1;;;55637:51:0;;25681:2:1;55637:51:0::2;::::0;::::2;25663:21:1::0;25720:2;25700:18;;;25693:30;-1:-1:-1;;;25739:18:1;;;25732:55;25804:18;;55637:51:0::2;25479:349:1::0;55637:51:0::2;55703:9:::0;;::::2;::::0;55695:46:::2;;;::::0;-1:-1:-1;;;55695:46:0;;26035:2:1;55695:46:0::2;::::0;::::2;26017:21:1::0;26074:2;26054:18;;;26047:30;-1:-1:-1;;;26093:18:1;;;26086:50;26153:18;;55695:46:0::2;25833:344:1::0;55695:46:0::2;55784:16:::0;;55754:27:::2;::::0;55784:34:::2;::::0;55803:15:::2;::::0;55784:34:::2;;;:::i;:::-;55754:64;;55855:1;55833:19;:23;55825:58;;;::::0;-1:-1:-1;;;55825:58:0;;26384:2:1;55825:58:0::2;::::0;::::2;26366:21:1::0;26423:2;26403:18;;;26396:30;-1:-1:-1;;;26442:18:1;;;26435:52;26504:18;;55825:58:0::2;26182:346:1::0;55825:58:0::2;55946:19;55991:11;-1:-1:-1::0;;;;;55968:45:0::2;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55946:69;;56021:20;56059:12;-1:-1:-1::0;;;;;56044:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56021:62:::0;-1:-1:-1;56127:96:0::2;56165:10;56185:4;56204:18;56021:62:::0;56204:2:::2;:18;:::i;:::-;56192:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56127:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56270:475;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56270:475:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56259:5:::2;::::0;56270:475;;56389:18:::2;56393:14:::0;56389:2:::2;:18;:::i;:::-;56377:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56270:475:::0;;56736:1:::2;56270:475;::::0;;::::2;::::0;;;;56436:9;::::2;::::0;56270:475;;;;;;;;56469:9;::::2;::::0;56270:475;;;;;;56554:18:::2;56558:14:::0;56554:2:::2;:18;:::i;:::-;56542:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56270:475;;;;56603:1;56270:475;;;;56625:15;56270:475;;;;56660:13;56674:1;56660:16;;;;;;;:::i;:::-;;;;;56270:475;;;;;;56699:13;56713:1;56699:16;;;;;;;:::i;:::-;;;;;56270:475;;;;::::0;56259:487:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56259:487:0::2;;;;;-1:-1:-1::0;;;;;56259:487:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56259:487:0::2;;;;;-1:-1:-1::0;;;;;56259:487:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56783:16;56802:13;;56783:32;;56822:16;:30;56839:12;-1:-1:-1::0;;;;;56822:30:0::2;-1:-1:-1::0;;;;;56822:30:0::2;;;;;;;;;;;;56858:8;56822:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56874:15;:37;56898:11;-1:-1:-1::0;;;;;56874:37:0::2;-1:-1:-1::0;;;;;56874:37:0::2;;;;;;;;;;;;56917:8;56874:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56966:10;56933:20;:30;56954:8;56933:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;56933:43:0::2;;;;;-1:-1:-1::0;;;;;56933:43:0::2;;;;;;56991:13;;56989:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;57016:71:0;;::::2;::::0;;::::2;57031:8:::0;57016:71:::2;57077:6:::0;57084:1:::2;57077:9;;;;57016:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;57016:71:0::2;;;;;;;;57107:8:::0;54642:2477;-1:-1:-1;;;;;;;;;54642:2477:0:o;67260:141::-;67331:14;67361:36;67383:4;67389:7;67361:21;:36::i;25908:204::-;25993:4;-1:-1:-1;;;;;;26017:47:0;;-1:-1:-1;;;26017:47:0;;:87;;-1:-1:-1;;;;;;;;;;23481:40:0;;;26068:36;23381:148;26557:105;26624:30;26635:4;22507:10;26624;:30::i;:::-;26557:105;:::o;9052:162::-;9162:43;;-1:-1:-1;;;;;28297:32:1;;;9162:43:0;;;28279:51:1;28346:18;;;28339:34;;;9135:71:0;;9155:5;;9177:14;;;;;28252:18:1;;9162:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9162:43:0;;;;;;;;;;;9135:19;:71::i;69995:139::-;70054:13;70105:17;70118:3;70105:12;:17::i;46177:263::-;46263:4;46280:12;46295:31;46312:4;46318:7;46295:16;:31::i;:::-;46280:46;;46341:7;46337:71;;;46365:18;;;;:12;:18;;;;;:31;;46388:7;46365:22;:31::i;46548:268::-;46635:4;46652:12;46667:32;46685:4;46691:7;46667:17;:32::i;:::-;46652:47;;46714:7;46710:74;;;46738:18;;;;:12;:18;;;;;:34;;46764:7;46738:25;:34::i;49103:293::-;48505:1;49237:7;;:19;49229:63;;;;-1:-1:-1;;;49229:63:0;;28586:2:1;49229:63:0;;;28568:21:1;28625:2;28605:18;;;28598:30;28664:33;28644:18;;;28637:61;28715:18;;49229:63:0;28384:355:1;49229:63:0;48505:1;49370:18;;49103:293::o;72733:340::-;72805:7;72923:1;72912:8;:12;;;72908:96;;;72953:12;72964:1;72953:8;:12;:::i;:::-;72946:20;;:2;:20;:::i;72908:96::-;-1:-1:-1;73021:1:0;;72733:340;-1:-1:-1;72733:340:0:o;68221:783::-;68323:16;;;;:11;:16;;;;;:23;;;;68294:26;;;;;:52;;68323:23;68294:52;:::i;:::-;68276:15;:70;68272:719;;;68359:18;68380:5;68386:3;68380:10;;;;;;;;:::i;:::-;;;;;;;;;68415:16;;;:11;:16;;;;;;;:20;68380:10;;;;;;;;-1:-1:-1;68415:20:0;;68411:500;;;68476:16;;;;:11;:16;;;;;:21;;;68452:20;;;:45;;68476:21;;68452:20;;:45;;68476:21;;68452:45;:::i;:::-;;;;-1:-1:-1;;68554:16:0;;;;:11;:16;;;;;:23;;;68530:20;;;;:47;68526:134;;68621:16;;;;:11;:16;;;;;:23;;;68598:20;;;:46;68526:134;68411:500;;;68716:16;;;;:11;:16;;;;;:21;;;68692:20;;;:45;;68716:21;;68692:20;;:45;;68716:21;;68692:45;:::i;:::-;;;;-1:-1:-1;;68794:16:0;;;;:11;:16;;;;;:23;;;68770:20;;;;:47;68766:134;;68861:16;;;;:11;:16;;;;;:23;;;68838:20;;;:46;68766:134;-1:-1:-1;68931:16:0;;;;:11;:16;;;;;68967:15;68931:52;;:26;;;;:52;68221:783::o;67712:495::-;67761:18;67782:5;67788:3;67782:10;;;;;;;;:::i;:::-;;;;;;;;;;;67761:31;;67805:19;67827:4;:14;;;67805:36;;67852:11;67867:1;67852:16;67848:29;;67870:7;;67712:495;:::o;67848:29::-;67885:26;67932:4;:14;;;67914:15;:32;;;;:::i;:::-;67885:61;;67957:18;67979:1;67957:23;67953:36;;67982:7;;;67712:495;:::o;67953:36::-;68057:16;;;;68003:13;;68057:22;;-1:-1:-1;;;68057:16:0;;;;68076:3;68057:22;:::i;:::-;68019:61;;68020:32;68034:18;68020:11;:32;:::i;:::-;68019:61;;;;:::i;:::-;68003:77;;68119:11;68111:5;:19;:45;;68137:19;68151:5;68137:11;:19;:::i;:::-;68111:45;;;68133:1;68111:45;68094:14;;;:62;-1:-1:-1;;;68163:40:0;68187:15;68163:40;:14;;;;:40;-1:-1:-1;67712:495:0:o;69012:961::-;69070:13;69092:17;69112:5;69118:3;69112:10;;;;;;;;:::i;:::-;;;;;;;;;69092:30;;;;;;;;69112:10;;;;;;;69092:30;;-1:-1:-1;;;;;69092:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69092:30:0;;;;;;;;;;-1:-1:-1;69207:32:0;;:15;:32;:::i;:::-;69183:56;;69246:13;69295:4;:16;;;69262:49;;69279:13;69262:4;:14;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;69340:14;;;;69246:65;;-1:-1:-1;69365:19:0;;;69361:104;;;69397:20;69412:5;69397:20;;:::i;:::-;;;69361:104;;;-1:-1:-1;69456:1:0;69361:104;69477:19;69522:4;:15;;;-1:-1:-1;;;;;69499:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69477:73;;69557:17;69577:28;69601:3;69577:23;:28::i;:::-;69557:48;;69665:17;69693:4;:22;;;69719:1;69693:27;69689:150;;-1:-1:-1;69745:4:0;69689:150;;;69809:22;;;;69787:18;:11;69801:4;69787:18;:::i;:::-;69786:45;;;;:::i;:::-;69774:57;;69689:150;69851:21;69888:18;69893:13;69888:2;:18;:::i;:::-;69882:25;;:2;:25;:::i;:::-;69875:33;;:2;:33;:::i;:::-;69851:57;-1:-1:-1;69965:4:0;69851:57;69924:21;69936:9;69924;:21;:::i;:::-;:37;;;;:::i;:::-;69923:46;;;;:::i;:::-;69915:54;69012:961;-1:-1:-1;;;;;;;;;;69012:961:0:o;9459:190::-;9587:53;;-1:-1:-1;;;;;29522:32:1;;;9587:53:0;;;29504:51:1;29591:32;;;29571:18;;;29564:60;29640:18;;;29633:34;;;9560:81:0;;9580:5;;9602:18;;;;;29477::1;;9587:53:0;29302:371:1;40246:158:0;40320:7;40371:22;40375:3;40387:5;40371:3;:22::i;40954:282::-;41017:16;41046:22;41071:19;41079:3;41071:7;:19::i;39775:117::-;39838:7;39865:19;39873:3;35103:18;;35020:109;26798:201;26887:22;26895:4;26901:7;26887;:22::i;:::-;26882:110;;26933:47;;-1:-1:-1;;;26933:47:0;;-1:-1:-1;;;;;28297:32:1;;26933:47:0;;;28279:51:1;28346:18;;;28339:34;;;28252:18;;26933:47:0;28105:274:1;15645:738:0;15726:18;15755:19;15895:4;15892:1;15885:4;15879:11;15872:4;15866;15862:15;15859:1;15852:5;15845;15840:60;15954:7;15944:180;;15999:4;15993:11;16045:16;16042:1;16037:3;16022:40;16092:16;16087:3;16080:29;15944:180;-1:-1:-1;;16203:1:0;16197:8;16152:16;;-1:-1:-1;16232:15:0;;:68;;16284:11;16299:1;16284:16;;16232:68;;;-1:-1:-1;;;;;16250:26:0;;;:31;16232:68;16228:148;;;16357:5;16324:40;;-1:-1:-1;;;16324:40:0;;;;;;;;:::i;29634:324::-;29711:4;29733:22;29741:4;29747:7;29733;:22::i;:::-;29728:223;;29772:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29772:29:0;;;;;;;;;:36;;-1:-1:-1;;29772:36:0;29804:4;29772:36;;;29855:12;22507:10;;22427:98;29855:12;-1:-1:-1;;;;;29828:40:0;29846:7;-1:-1:-1;;;;;29828:40:0;29840:4;29828:40;;;;;;;;;;-1:-1:-1;29890:4:0;29883:11;;29728:223;-1:-1:-1;29934:5:0;29927:12;;38950:152;39020:4;39044:50;39049:3;-1:-1:-1;;;;;39069:23:0;;39044:4;:50::i;30202:325::-;30280:4;30301:22;30309:4;30315:7;30301;:22::i;:::-;30297:223;;;30372:5;30340:12;;;;;;;;;;;-1:-1:-1;;;;;30340:29:0;;;;;;;;;;:37;;-1:-1:-1;;30340:37:0;;;30397:40;22507:10;;30340:12;;30397:40;;30372:5;30397:40;-1:-1:-1;30459:4:0;30452:11;;39278:158;39351:4;39375:53;39383:3;-1:-1:-1;;;;;39403:23:0;;39375:7;:53::i;71085:1580::-;71154:7;71170:17;71190:5;71196:3;71190:10;;;;;;;;:::i;:::-;;;;;;;;;71170:30;;;;;;;;71190:10;;;;;;;71170:30;;-1:-1:-1;;;;;71170:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71170:30:0;;;;;;;;71234:16;;;;;;;;;71207:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71306:20;71170:30;;-1:-1:-1;71207:43:0;71404:15;71246:3;71404:10;:15::i;:::-;71377:42;;71426:26;71473:4;:13;;;71455:31;;:15;:31;:89;;71543:1;71455:89;;;71517:13;;;;71499:31;;;;:15;:31;:::i;:::-;71426:118;;71649:25;71705:4;:12;;;71678:16;71697:4;71678:23;;;;:::i;:::-;71677:40;;;;:::i;:::-;71649:68;-1:-1:-1;71761:19:0;71815:22;:18;71836:1;71815:22;:::i;:::-;71784:26;71793:17;71784:6;:26;:::i;:::-;71783:55;;;;:::i;:::-;71761:77;;71954:10;:17;;;71931:10;:20;;;:40;;;;:::i;:::-;71912:15;:59;71908:633;;71988:14;;71984:550;;;72073:15;;;;72063:25;;;;:::i;:::-;;;72172:10;:17;;;72163:6;:26;72159:93;;;72219:10;:17;;;72210:26;;72159:93;71984:550;;;72338:15;;;;72328:25;;;;:::i;:::-;;;72443:10;:17;;;72434:6;:26;72430:93;;;72490:10;:17;;;72481:26;;72430:93;72582:11;72573:6;:20;72569:72;;;72613:20;72622:11;72613:6;:20;:::i;:::-;72606:27;71085:1580;-1:-1:-1;;;;;;;;;71085:1580:0:o;72569:72::-;-1:-1:-1;72660:1:0;;71085:1580;-1:-1:-1;;;;;;;;71085:1580:0:o;35483:120::-;35550:7;35577:3;:11;;35589:5;35577:18;;;;;;;;:::i;:::-;;;;;;;;;35570:25;;35483:120;;;;:::o;36153:111::-;36209:16;36245:3;:11;;36238:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36153:111;;;:::o;32725:416::-;32788:4;34900:21;;;:14;;;:21;;;;;;32805:329;;-1:-1:-1;32848:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;33033:18;;33009:21;;;:14;;;:21;;;;;;:42;;;;33066:11;;33317:1400;33383:4;33514:21;;;:14;;;:21;;;;;;33552:13;;33548:1162;;33925:18;33946:12;33957:1;33946:8;:12;:::i;:::-;33993:18;;33925:33;;-1:-1:-1;33973:17:0;;33993:22;;34014:1;;33993:22;:::i;:::-;33973:42;;34050:9;34036:10;:23;34032:385;;34080:17;34100:3;:11;;34112:9;34100:22;;;;;;;;:::i;:::-;;;;;;;;;34080:42;;34250:9;34224:3;:11;;34236:10;34224:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34365:25;;;:14;;;:25;;;;;:36;;;34032:385;34498:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34604:3;:14;;:21;34619:5;34604:21;;;;;;;;;;;34597:28;;;34649:4;34642:11;;;;;;;33548:1162;34693:5;34686:12;;;;;70143:929;70199:7;70215:17;70235:5;70241:3;70235:10;;;;;;;;:::i;:::-;;;;;;;;;70215:30;;;;;;;;70235:10;;;;;;;70215:30;;-1:-1:-1;;;;;70215:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70215:30:0;;;;;;;;;;-1:-1:-1;70262:27:0;;70258:65;;-1:-1:-1;70310:4:0;;70143:929;-1:-1:-1;;70143:929:0:o;70258:65::-;70335:19;70380:4;:15;;;-1:-1:-1;;;;;70357:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70335:73;;70415:20;70461:4;:16;;;-1:-1:-1;;;;;70438:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70415:75;-1:-1:-1;70505:22:0;70530:42;70558:13;70415:75;70530:42;:::i;:::-;70505:67;;70610:1;70589:17;:22;;;70585:484;;70697:21;70747:30;70759:17;70747:2;:30;:::i;:::-;70721:4;:22;;;:57;;;;:::i;:::-;70697:81;;70822:13;70797:4;:14;;;70814:4;70797:21;;;;:::i;:::-;70796:39;;;;:::i;:::-;70789:46;70143:929;-1:-1:-1;;;;;;;70143:929:0:o;70585:484::-;70924:20;70977:18;70978:17;70977:18;:::i;:::-;70965:31;;:2;:31;:::i;:::-;70947:4;:14;;;:50;;;;:::i;:::-;71039:22;;;;70924:73;;-1:-1:-1;71016:19:0;70924:73;71031:4;71016:19;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;-1:-1:-1;;;;;1511:6:1;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;-1:-1:-1;;;;;1714:6:1;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;;-1:-1:-1;3495:3:1;;2799:705;-1:-1:-1;;;;;2799:705:1:o;3509:226::-;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6634:487::-;6711:6;6719;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6841:23;;;-1:-1:-1;6961:2:1;6946:18;;6933:32;;-1:-1:-1;7043:2:1;7028:18;;7015:32;7056:33;7015:32;7056:33;:::i;:::-;7108:7;7098:17;;;6634:487;;;;;:::o;7126:346::-;7194:6;7202;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;-1:-1:-1;;7316:23:1;;;7436:2;7421:18;;;7408:32;;-1:-1:-1;7126:346:1:o;7477:203::-;-1:-1:-1;;;;;7641:32:1;;;;7623:51;;7611:2;7596:18;;7477:203::o;7685:388::-;7753:6;7761;7814:2;7802:9;7793:7;7789:23;7785:32;7782:52;;;7830:1;7827;7820:12;7782:52;7869:9;7856:23;7888:31;7913:5;7888:31;:::i;:::-;7938:5;-1:-1:-1;7995:2:1;7980:18;;7967:32;8008:33;7967:32;8008:33;:::i;8078:637::-;8268:2;8280:21;;;8350:13;;8253:18;;;8372:22;;;8220:4;;8451:15;;;8425:2;8410:18;;;8220:4;8494:195;8508:6;8505:1;8502:13;8494:195;;;8573:13;;-1:-1:-1;;;;;8569:39:1;8557:52;;8638:2;8664:15;;;;8629:12;;;;8605:1;8523:9;8494:195;;10182:163;10249:20;;10309:10;10298:22;;10288:33;;10278:61;;10335:1;10332;10325:12;10278:61;10182:163;;;:::o;10350:184::-;10408:6;10461:2;10449:9;10440:7;10436:23;10432:32;10429:52;;;10477:1;10474;10467:12;10429:52;10500:28;10518:9;10500:28;:::i;10539:127::-;10600:10;10595:3;10591:20;10588:1;10581:31;10631:4;10628:1;10621:15;10655:4;10652:1;10645:15;10671:372;10742:2;10736:9;10807:2;10788:13;;-1:-1:-1;;10784:27:1;10772:40;;-1:-1:-1;;;;;10827:34:1;;10863:22;;;10824:62;10821:185;;;10928:10;10923:3;10919:20;10916:1;10909:31;10963:4;10960:1;10953:15;10991:4;10988:1;10981:15;10821:185;11022:2;11015:22;10671:372;;-1:-1:-1;10671:372:1:o;11048:566::-;11097:5;11150:3;11143:4;11135:6;11131:17;11127:27;11117:55;;11168:1;11165;11158:12;11117:55;11269:19;11247:2;11269:19;:::i;:::-;11312:3;11350:2;11342:6;11338:15;11376:3;11368:6;11365:15;11362:35;;;11393:1;11390;11383:12;11362:35;11417:6;11432:151;11448:6;11443:3;11440:15;11432:151;;;11516:22;11534:3;11516:22;:::i;:::-;11504:35;;11568:4;11559:14;;;;11465;11432:151;;11619:1115;11763:6;11771;11779;11787;11840:3;11828:9;11819:7;11815:23;11811:33;11808:53;;;11857:1;11854;11847:12;11808:53;11896:9;11883:23;11915:31;11940:5;11915:31;:::i;:::-;11965:5;-1:-1:-1;12022:2:1;12007:18;;11994:32;12035:33;11994:32;12035:33;:::i;:::-;12087:7;-1:-1:-1;12132:2:1;12117:18;;12113:32;-1:-1:-1;12103:60:1;;12159:1;12156;12149:12;12103:60;12261:20;12238:3;12261:20;:::i;:::-;12303:3;12344;12333:9;12329:19;12371:7;12363:6;12360:19;12357:39;;;12392:1;12389;12382:12;12357:39;12431:2;12420:9;12416:18;12443:202;12459:6;12454:3;12451:15;12443:202;;;12553:17;;12583:20;;12632:2;12623:12;;;;12476;12443:202;;;12447:3;12664:5;12654:15;;12688:40;12720:7;12712:6;12688:40;:::i;:::-;12678:50;;;;;11619:1115;;;;;;;:::o;12739:127::-;12800:10;12795:3;12791:20;12788:1;12781:31;12831:4;12828:1;12821:15;12855:4;12852:1;12845:15;12871:342;13073:2;13055:21;;;13112:2;13092:18;;;13085:30;-1:-1:-1;;;13146:2:1;13131:18;;13124:48;13204:2;13189:18;;12871:342::o;13560:127::-;13621:10;13616:3;13612:20;13609:1;13602:31;13652:4;13649:1;13642:15;13676:4;13673:1;13666:15;13692:128;13759:9;;;13780:11;;;13777:37;;;13794:18;;:::i;14529:273::-;14597:6;14650:2;14638:9;14629:7;14625:23;14621:32;14618:52;;;14666:1;14663;14656:12;14618:52;14698:9;14692:16;14748:4;14741:5;14737:16;14730:5;14727:27;14717:55;;14768:1;14765;14758:12;16219:136;16258:3;16286:5;16276:39;;16295:18;;:::i;:::-;-1:-1:-1;;;16331:18:1;;16219:136::o;16360:125::-;16425:9;;;16446:10;;;16443:36;;;16459:18;;:::i;16490:127::-;16551:10;16546:3;16542:20;16539:1;16532:31;16582:4;16579:1;16572:15;16606:4;16603:1;16596:15;18378:168;18451:9;;;18482;;18499:15;;;18493:22;;18479:37;18469:71;;18520:18;;:::i;18551:217::-;18591:1;18617;18607:132;;18661:10;18656:3;18652:20;18649:1;18642:31;18696:4;18693:1;18686:15;18724:4;18721:1;18714:15;18607:132;-1:-1:-1;18753:9:1;;18551:217::o;19487:184::-;19557:6;19610:2;19598:9;19589:7;19585:23;19581:32;19578:52;;;19626:1;19623;19616:12;19578:52;-1:-1:-1;19649:16:1;;19487:184;-1:-1:-1;19487:184:1:o;22625:345::-;22827:2;22809:21;;;22866:2;22846:18;;;22839:30;-1:-1:-1;;;22900:2:1;22885:18;;22878:51;22961:2;22946:18;;22625:345::o;26533:375::-;26621:1;26639:5;26653:249;26674:1;26664:8;26661:15;26653:249;;;26724:4;26719:3;26715:14;26709:4;26706:24;26703:50;;;26733:18;;:::i;:::-;26783:1;26773:8;26769:16;26766:49;;;26797:16;;;;26766:49;26880:1;26876:16;;;;;26836:15;;26653:249;;;26533:375;;;;;;:::o;26913:902::-;26962:5;26992:8;26982:80;;-1:-1:-1;27033:1:1;27047:5;;26982:80;27081:4;27071:76;;-1:-1:-1;27118:1:1;27132:5;;27071:76;27163:4;27181:1;27176:59;;;;27249:1;27244:174;;;;27156:262;;27176:59;27206:1;27197:10;;27220:5;;;27244:174;27281:3;27271:8;27268:17;27265:43;;;27288:18;;:::i;:::-;-1:-1:-1;;27344:1:1;27330:16;;27403:5;;27156:262;;27502:2;27492:8;27489:16;27483:3;27477:4;27474:13;27470:36;27464:2;27454:8;27451:16;27446:2;27440:4;27437:12;27433:35;27430:77;27427:203;;;-1:-1:-1;27539:19:1;;;27615:5;;27427:203;27662:42;-1:-1:-1;;27687:8:1;27681:4;27662:42;:::i;:::-;27740:6;27736:1;27732:6;27728:19;27719:7;27716:32;27713:58;;;27751:18;;:::i;:::-;27789:20;;26913:902;-1:-1:-1;;;26913:902:1:o;27820:140::-;27878:5;27907:47;27948:4;27938:8;27934:19;27928:4;27907:47;:::i;27965:135::-;28004:3;28025:17;;;28022:43;;28045:18;;:::i;:::-;-1:-1:-1;28092:1:1;28081:13;;27965:135::o;28744:151::-;28834:4;28827:12;;;28813;;;28809:31;;28852:14;;28849:40;;;28869:18;;:::i;28900:244::-;29011:10;28984:18;;;29004;;;28980:43;29043:28;;;;29090:24;;;29080:58;;29118:18;;:::i;29149:148::-;29237:4;29216:12;;;29230;;;29212:31;;29255:13;;29252:39;;;29271:18;;:::i;29957:184::-;29994:4;30043:16;;;30025;;;;30021:39;-1:-1:-1;;30075:19:1;;30106:4;30096:15;;30072:40;30069:66;;;30115:18;;:::i;30146:179::-;30179:3;30212:20;;;30244:21;;;30241:47;;30268:18;;:::i;:::-;30308:1;30304:15;;30146:179;-1:-1:-1;;30146:179:1:o
Swarm Source
ipfs://985771176569316e52a4cb3b0d4f91e1501601df1076e20b2058c9c3f5c63f90
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.