Source Code
Overview
S Balance
0 S
Token Holdings
More Info
ContractCreator
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 19165393 | 23 hrs ago | IN | 0 S | 0.00035968 | ||||
Deposit | 19164095 | 24 hrs ago | IN | 0 S | 0.00040137 | ||||
New Bond | 19163500 | 24 hrs ago | IN | 0 S | 0.00047753 | ||||
Close Bond | 19104600 | 29 hrs ago | IN | 0 S | 0.00008259 | ||||
Deposit | 18963748 | 43 hrs ago | IN | 0 S | 0.00029728 | ||||
Redeem | 18948285 | 45 hrs ago | IN | 0 S | 0.00010555 | ||||
Redeem | 18726005 | 2 days ago | IN | 0 S | 0.00013265 | ||||
Deposit | 18045652 | 5 days ago | IN | 0 S | 0.00029728 | ||||
Redeem | 18045561 | 5 days ago | IN | 0 S | 0.00008678 | ||||
Redeem | 17769043 | 6 days ago | IN | 0 S | 0.00011388 | ||||
Redeem | 17756052 | 6 days ago | IN | 0 S | 0.00011402 | ||||
Deposit | 17755636 | 6 days ago | IN | 0 S | 0.00032098 | ||||
Deposit | 17749436 | 6 days ago | IN | 0 S | 0.00029728 | ||||
Redeem | 17739786 | 6 days ago | IN | 0 S | 0.00011388 | ||||
Deposit | 17714596 | 6 days ago | IN | 0 S | 0.00041015 | ||||
New Bond | 17714267 | 6 days ago | IN | 0 S | 0.00051707 | ||||
Whitelist Token | 17713480 | 6 days ago | IN | 0 S | 0.00013036 | ||||
Grant Auctioneer... | 17713068 | 6 days ago | IN | 0 S | 0.00019439 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19165393 | 23 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19164095 | 24 hrs ago | 0 S | ||||
19163500 | 24 hrs ago | 0 S | ||||
19163500 | 24 hrs ago | 0 S | ||||
19104600 | 29 hrs ago | 0 S | ||||
18963748 | 43 hrs ago | 0 S | ||||
18963748 | 43 hrs ago | 0 S | ||||
18963748 | 43 hrs ago | 0 S |
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-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 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] * 10 ** 18) / 1000, 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]; // Get decimals for both tokens for precise calculations uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); // Get current control variable and debt ratio uint256 currentCV = _currentControlVariable(_id); uint256 debtRatio = _debtRatio(_id); // Scale up before division to maintain precision // Use a higher precision factor (1e36) to prevent overflow while maintaining precision uint256 scaledPrice = (currentCV * debtRatio) * (10 ** (36 - payoutDecimals - quoteDecimals)); // Perform division last to minimize precision loss // Divide by 1e18 twice because debtRatio is scaled by 1e18 and we want final precision of 1e18 price = scaledPrice / 1e18 / 1e18; // Apply minimum price check after all calculations if (price < term.minimumPrice) { price = term.minimumPrice; } // Add safety check for maximum price to prevent unreasonable values // This value should be adjusted based on your specific needs require(price <= type(uint256).max / 1e18, "Price overflow"); } 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]; // Get decimals for precise calculation uint8 quoteDecimals = uint8(IERC20Metadata(address(term.quoteToken)).decimals()); uint8 payoutDecimals = uint8(IERC20Metadata(address(term.payoutToken)).decimals()); // Normalize totalDebt to 18 decimals (totalDebt is in payoutToken) uint256 totalDebt = term.totalDebt * (10**(18 - payoutDecimals)); // Normalize quote tokens raised to 18 decimals uint256 quoteBalance = term.quoteTokensRaised * (10 ** (18 - quoteDecimals)); // Prevent division by zero if (quoteBalance == 0) { return 1e18; } // Calculate debt ratio with high precision // Result is scaled to 1e18 uint256 debtRatio = (totalDebt * 1e18) / quoteBalance; return debtRatio; } 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 * 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
60a060405234801561000f575f5ffd5b5060405161464c38038061464c83398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b6080516143d061027c5f395f81816108070152611f5a01526143d05ff3fe608060405234801561000f575f5ffd5b50600436106102e5575f3560e01c806391de4d0711610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107c7578063ea5e0c60146107da578063ed421a9c14610802578063f9a6466414610829575f5ffd5b8063d547741f14610798578063d627d25e146107ab578063d918a16e146107be575f5ffd5b8063c8558f1b14610725578063ca15c87314610738578063cfe9232b1461074b578063d04cffeb1461075f578063d1af1fbc14610772578063d382fe9214610785575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee2614610672578063c0680e2014610685578063c0aa0e8a14610698578063c5f0d05c14610712575f5ffd5b8063b33712c5146105f7578063bc063e1a146105ff578063bc3b2b1214610608575f5ffd5b806391de4d07146105845780639b299d9a146105975780639cd85b5b146105aa578063a217fddf146105bd578063a3246ad3146105c4578063b2f5de94146105e4575f5ffd5b806336568abe116102515780637b30564e1161020b5780638dbdbe6d116101e65780638dbdbe6d1461050c5780639010d07c1461051f578063909b2bb81461054a57806391d1485414610571575f5ffd5b80637b30564e146104935780637bde82f2146104a65780638ad59c70146104b9575f5ffd5b806336568abe1461041e578063439766ce146104315780635c975abb146104395780636247f6f2146104465780636e76fc8f14610459578063725dafe014610480575f5ffd5b8063172c44ec116102a2578063172c44ec146103a75780631b014e85146103ba57806324760807146103cd578063248a9ca3146103d657806327507458146103f85780632f2ff15d1461040b575f5ffd5b806301ffc9a7146102e957806306b40ea3146103115780630868335e146103325780630fb81eb4146103525780631227b40214610367578063154347b514610387575b5f5ffd5b6102fc6102f7366004613ca7565b61083c565b60405190151581526020015b60405180910390f35b61032461031f366004613ce2565b610866565b604051908152602001610308565b610345610340366004613d0c565b610891565b6040516103089190613e13565b610365610360366004613e61565b610941565b005b61037a610375366004613e61565b610ad6565b6040516103089190613e78565b61039a610395366004613e87565b610bc2565b6040516103089190613ea2565b6103246103b5366004613e61565b610c2b565b61039a6103c8366004613e87565b610c35565b61032460045481565b6103246103e4366004613e61565b5f9081526020819052604090206001015490565b6102fc610406366004613e61565b610c9c565b610365610419366004613ed9565b610d20565b61036561042c366004613ed9565b610d4a565b610365610d82565b6003546102fc9060ff1681565b610365610454366004613e87565b610de6565b6103247f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61036561048e366004613ed9565b610fcc565b6102fc6104a1366004613ce2565b6110eb565b6103246104b4366004613ed9565b61118f565b6104cc6104c7366004613ce2565b611424565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c001610308565b61036561051a366004613f07565b611489565b61053261052d366004613f3d565b611aee565b6040516001600160a01b039091168152602001610308565b6103247fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102fc61057f366004613ed9565b611b0c565b6102fc610592366004613f5d565b611b34565b6103656105a5366004613e87565b611c30565b6102fc6105b8366004613e87565b611d62565b6103245f81565b6105d76105d2366004613e61565b611d7a565b6040516103089190613f89565b6103656105f2366004613e61565b611d93565b610365611fc3565b6103246103e881565b610648610616366004613e61565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610308565b610365610680366004613e87565b612024565b610324610693366004613ce2565b6120a1565b6106ab6106a6366004613e61565b6120ba565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610308565b610365610720366004613fe1565b61213a565b610324610733366004613ce2565b6121db565b610324610746366004613e61565b6123c5565b6103245f51602061437b5f395f51905f5281565b61039a61076d366004613e87565b6123db565b610532610780366004613e61565b6124c1565b610324610793366004613e61565b6124e9565b6103656107a6366004613ed9565b6125d3565b6103656107b9366004613e87565b6125f7565b610324600e5481565b6103246107d5366004614096565b6126d0565b6105326107e8366004613e61565b600a6020525f90815260409020546001600160a01b031681565b6105327f000000000000000000000000000000000000000000000000000000000000000081565b610324610837366004613ce2565b612e66565b5f6001600160e01b03198216635a05180f60e01b1480610860575061086082612e71565b92915050565b600c602052815f5260405f20818154811061087f575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108ad576108ad613ffa565b6040519080825280602002602001820160405280156108e657816020015b6108d3613c41565b8152602001906001900390816108cb5790505b5090505f5b838110156109395761091485858381811061090857610908614129565b90506020020135610ad6565b82828151811061092657610926614129565b60209081029190910101526001016108eb565b509392505050565b5f51602061437b5f395f51905f5261095881612ea5565b60035460ff16156109845760405162461bcd60e51b815260040161097b9061413d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109d95760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161097b565b42600683815481106109ed576109ed614129565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a2d57610a2d614129565b905f5260205f2090600a02016003015460068481548110610a5057610a50614129565b905f5260205f2090600a020160020154610a6a919061417d565b9050610aa7338260068681548110610a8457610a84614129565b5f91825260209091206001600a9092020101546001600160a01b03169190612eb2565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610ade613c41565b5f60068381548110610af257610af2614129565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b3a85612f11565b8152602001610b48856124e9565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b9985610c9c565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c1f57602002820191905f5260205f20905b815481526020019060010190808311610c0b575b50505050509050919050565b5f61086082612f11565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c1f57602002820191905f5260205f2090815481526020019060010190808311610c0b5750505050509050919050565b5f60068281548110610cb057610cb0614129565b5f91825260209091206009600a90920201015463ffffffff164211801590610860575060068281548110610ce657610ce6614129565b905f5260205f2090600a02016006015460068381548110610d0957610d09614129565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d3a81612ea5565b610d448383612f1b565b50505050565b6001600160a01b0381163314610d735760405163334bd91960e11b815260040160405180910390fd5b610d7d8282612f46565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610dac81612ea5565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e1081612ea5565b6001600160a01b038216610e5e5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161097b565b6001600160a01b0382165f9081526009602052604090205460ff1615610ec65760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c697374656400000000000000604482015260640161097b565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f20575060408051601f3d908101601f19168201909252610f1d91810190614190565b60015b610f625760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161097b565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b031633146110245760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161097b565b61103b5f51602061437b5f395f51905f5282611b0c565b6110785760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161097b565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061111757611117614129565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f611198612f71565b6001600160a01b0382165f908152600d602052604081205490815b801561141657806111c3816141b0565b6001600160a01b0387165f908152600d60205260408120805492945090925090839081106111f3576111f3614129565b905f5260205f209060050201905086816003015403611410575f61121787846121db565b9050801561140e5780826001015f828254611232919061417d565b90915550611242905081856141c5565b935061125c878260068b81548110610a8457610a84614129565b81600101545f0361140e576001600160a01b0387165f908152600d602052604090205461128b9060019061417d565b831461139c576001600160a01b0387165f908152600d6020526040902080546112b69060019061417d565b815481106112c6576112c6614129565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061130657611306614129565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d602052604090208054806113c2576113c26141d8565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b506111b3565b509150506108606001600255565b600d602052815f5260405f20818154811061143d575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b611491612f71565b6001600160a01b0381166114de5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161097b565b60065483106115235760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161097b565b5f6006848154811061153757611537614129565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115945760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161097b565b80600601548160030154106115eb5760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161097b565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015611631573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116559190614190565b90505f61166182612fc8565b9050808510156116b35760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161097b565b6116bc86612ff3565b6116c586613135565b5f6116cf876131f6565b90505f816116e588670de0b6b3a76400006141ec565b6116ef9190614203565b90505f61271086600301548760060154611709919061417d565b611715906107086141ec565b61171f9190614203565b9050808211156117715760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161097b565b856006015482876003015461178691906141c5565b11156117d45760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e64206465627400000000000000604482015260640161097b565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561181d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118419190614222565b90506118586001600160a01b03831633308d61344f565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561189c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c09190614222565b90508a6118cd838361417d565b1461191a5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e7400000000000000604482015260640161097b565b8a60068d8154811061192e5761192e614129565b905f5260205f2090600a02016007015f82825461194b91906141c5565b925050819055508460068d8154811061196657611966614129565b905f5260205f2090600a02016003015f82825461198391906141c5565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a08401926119f69291600160201b9004166141c5565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611ad3908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d7d6001600255565b5f828152600160205260408120611b059083613488565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b8e57602002820191905f5260205f20905b815481526020019060010190808311611b7a575b509394505f93505050505b8151811015611c2657846001600160a01b0316600a5f848481518110611bc157611bc1614129565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611c0e5750611c0e828281518110611c0157611c01614129565b6020026020010151610c9c565b15611c1e57600192505050610860565b600101611b99565b505f949350505050565b5f611c3a81612ea5565b6001600160a01b038216611c905760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e6565722061646472657373000000000000604482015260640161097b565b611ca75f51602061437b5f395f51905f5283611b0c565b15611cec5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161097b565b611d035f51602061437b5f395f51905f5283612f1b565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061437b5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108605f51602061437b5f395f51905f5283611b0c565b5f81815260016020526040902060609061086090613493565b5f51602061437b5f395f51905f52611daa81612ea5565b60035460ff1615611dcd5760405162461bcd60e51b815260040161097b9061413d565b5f828152600a60205260409020546001600160a01b03163314611e325760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e656572000000000000000000604482015260640161097b565b60068281548110611e4557611e45614129565b5f91825260209091206009600a90920201015463ffffffff164211611ea55760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161097b565b5f60068381548110611eb957611eb9614129565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611eea57611eea614129565b5f918252602082206007600a909202010154600e5490925015611f3157612710600e5483611f1891906141ec565b611f229190614203565b9050611f2e818361417d565b91505b611f456001600160a01b0384163384612eb2565b8015611f7f57611f7f6001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083612eb2565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63611fed81612ea5565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61202e81612ea5565b6120455f51602061437b5f395f51905f5283612f46565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061437b5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061087f575f80fd5b600681815481106120c9575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f61214481612ea5565b6103e88263ffffffff16111561218b5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161097b565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061220757612207614129565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a08301526006805492945091811061228757612287614129565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b90910481166101408301529184015190925016421015612347575f92505050610860565b5f81610140015163ffffffff1690505f8360a0015163ffffffff16421161238257608084015161237d9063ffffffff164261417d565b612384565b815b90505f8285602001516123979190614203565b90505f6123a483836141ec565b905085602001518111156123b9575060208501515b98975050505050505050565b5f8181526001602052604081206108609061349f565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561240f5761240f613ffa565b604051908082528060200260200182016040528015612438578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156124ba576001600160a01b0384165f908152600d6020526040902080548290811061248557612485614129565b905f5260205f209060050201600301548282815181106124a7576124a7614129565b602090810291909101015260010161243d565b5092915050565b600581815481106124d0575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f600683815481106124fe576124fe614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506125b0919061417d565b90506127106125c1826107086141ec565b6125cb9190614203565b949350505050565b5f828152602081905260409020600101546125ed81612ea5565b610d448383612f46565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e61262181612ea5565b6001600160a01b0382165f9081526009602052604090205460ff166126805760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604482015260640161097b565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06191016110df565b5f5f51602061437b5f395f51905f526126e881612ea5565b60035460ff161561270b5760405162461bcd60e51b815260040161097b9061413d565b6001600160a01b0386166127585760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161097b565b6001600160a01b0385166127a45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161097b565b856001600160a01b0316856001600160a01b0316036128055760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e740000000000000000604482015260640161097b565b6001600160a01b0386165f9081526009602052604090205460ff166128645760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604482015260640161097b565b61286e3386611b34565b156128c65760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161097b565b82514263ffffffff909116116129135760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161097b565b83516129565760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161097b565b60208401516129a75760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161097b565b60408401516129f85760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e203000000000000000604482015260640161097b565b6060840151612a405760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161097b565b82515f90612a5590429063ffffffff1661417d565b90505f8111612a9f5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161097b565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612adc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b009190614190565b9050612b303330612b1284600a61431c565b8951612b1e91906141ec565b6001600160a01b038c1692919061344f565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612b5f84600a61431c565b8951612b6b91906141ec565b81525f60208083019190915289015160408201526060016103e88960026020020151612b9f90670de0b6b3a76400006141ec565b612ba99190614203565b8152602001612bb984600a61431c565b60608a0151612bc891906141ec565b81526020015f8152602001428152602001875f60028110612beb57612beb614129565b602002015163ffffffff16815260200187600160028110612c0e57612c0e614129565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612e079061432a565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a60016020020151604051612e5291815260200190565b60405180910390a498975050505050505050565b5f611b0583836121db565b5f6001600160e01b03198216637965db0b60e01b148061086057506301ffc9a760e01b6001600160e01b0319831614610860565b612eaf81336134a8565b50565b6040516001600160a01b03838116602483015260448201839052610d7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506134e1565b5f610860826131f6565b5f5f612f27848461354d565b90508015611b05575f84815260016020526040902061093990846135dc565b5f5f612f5284846135f0565b90508015611b05575f8481526001602052604090206109399084613659565b6002805403612fc25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161097b565b60028055565b5f60028260ff161115612feb57612fe0600283614342565b61086090600a61431c565b506001919050565b5f818152600760205260409020600381015460049091015461301591906141c5565b421115612eaf575f6006828154811061303057613030614129565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156130bb575f828152600760205260408120600101546004830180549192909161307f9084906141c5565b90915550505f828152600760205260409020600201546004820154106130b6575f8281526007602052604090206002015460048201555b613118565b5f82815260076020526040812060010154600483018054919290916130e190849061417d565b90915550505f82815260076020526040902060020154600482015411613118575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061314957613149614129565b905f5260205f2090600a020190505f81600301549050805f0361316b57505050565b5f82600801544261317c919061417d565b9050805f0361318b5750505050565b60098301545f906131aa90600160201b900463ffffffff16606461435b565b63ffffffff166131ba83856141ec565b6131c49190614203565b90508281116131dc576131d7818461417d565b6131de565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061320b5761320b614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156132e2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133069190614190565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613348573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061336c9190614190565b90505f6133788661366d565b90505f61338487613899565b90505f83613393866024614342565b61339d9190614342565b6133a890600a61431c565b6133b283856141ec565b6133bc91906141ec565b9050670de0b6b3a76400006133d18183614203565b6133db9190614203565b96508560a001518710156133f1578560a0015196505b613404670de0b6b3a76400005f19614203565b8711156134445760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b604482015260640161097b565b505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d449186918216906323b872dd90608401612edf565b5f611b058383613a9c565b60605f611b0583613ac2565b5f610860825490565b6134b28282611b0c565b610fc85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161097b565b5f5f60205f8451602086015f885af180613500576040513d5f823e3d81fd5b50505f513d91508115613517578060011415613524565b6001600160a01b0384163b155b15610d4457604051635274afe760e01b81526001600160a01b038516600482015260240161097b565b5f6135588383611b0c565b6135d5575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561358d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610860565b505f610860565b5f611b05836001600160a01b038416613b19565b5f6135fb8383611b0c565b156135d5575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610860565b5f611b05836001600160a01b038416613b5e565b5f5f6006838154811061368257613682614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161378186613899565b90505f84610120015163ffffffff16421161379c575f6137b2565b6101208501516137b29063ffffffff164261417d565b90505f8560c0015183670de0b6b3a76400006137ce91906141ec565b6137d89190614203565b90505f6137e68360016141c5565b6137f083876141ec565b6137fa9190614203565b90508560600151866080015161381091906141c5565b421161386c5785511561384757602086015161382c90866141c5565b9450856040015185111561384257856040015194505b61386c565b6020860151613856908661417d565b9450856040015185101561386c57856040015194505b8085111561388b5761387e818661417d565b9998505050505050505050565b505f98975050505050505050565b5f5f600683815481106138ae576138ae614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613986573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139aa9190614190565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139ed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a119190614190565b90505f613a1f826012614342565b613a2a90600a61431c565b8460600151613a3991906141ec565b90505f613a47846012614342565b613a5290600a61431c565b8560e00151613a6191906141ec565b9050805f03613a7e5750670de0b6b3a76400009695505050505050565b5f81613a9284670de0b6b3a76400006141ec565b6123b99190614203565b5f825f018281548110613ab157613ab1614129565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c1f57602002820191905f5260205f2090815481526020019060010190808311610c0b5750505050509050919050565b5f8181526001830160205260408120546135d557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610860565b5f8181526001830160205260408120548015613c38575f613b8060018361417d565b85549091505f90613b939060019061417d565b9050808214613bf2575f865f018281548110613bb157613bb1614129565b905f5260205f200154905080875f018481548110613bd157613bd1614129565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c0357613c036141d8565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610860565b5f915050610860565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613cb7575f5ffd5b81356001600160e01b031981168114611b05575f5ffd5b6001600160a01b0381168114612eaf575f5ffd5b5f5f60408385031215613cf3575f5ffd5b8235613cfe81613cce565b946020939093013593505050565b5f5f60208385031215613d1d575f5ffd5b823567ffffffffffffffff811115613d33575f5ffd5b8301601f81018513613d43575f5ffd5b803567ffffffffffffffff811115613d59575f5ffd5b8560208260051b8401011115613d6d575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613da460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613de760c08401826001600160a01b03169052565b5060e0810151613dfb60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613e5657613e3f838551613d7d565b602093909301926101409290920191600101613e2c565b509095945050505050565b5f60208284031215613e71575f5ffd5b5035919050565b61014081016108608284613d7d565b5f60208284031215613e97575f5ffd5b8135611b0581613cce565b602080825282518282018190525f918401906040840190835b81811015613e56578351835260209384019390920191600101613ebb565b5f5f60408385031215613eea575f5ffd5b823591506020830135613efc81613cce565b809150509250929050565b5f5f5f60608486031215613f19575f5ffd5b83359250602084013591506040840135613f3281613cce565b809150509250925092565b5f5f60408385031215613f4e575f5ffd5b50508035926020909101359150565b5f5f60408385031215613f6e575f5ffd5b8235613f7981613cce565b91506020830135613efc81613cce565b602080825282518282018190525f918401906040840190835b81811015613e565783516001600160a01b0316835260209384019390920191600101613fa2565b803563ffffffff81168114613fdc575f5ffd5b919050565b5f60208284031215613ff1575f5ffd5b611b0582613fc9565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261405a575f5ffd5b614064604061400e565b806040840185811115614075575f5ffd5b845b81811015613e565761408881613fc9565b845260209384019301614077565b5f5f5f5f61010085870312156140aa575f5ffd5b84356140b581613cce565b935060208501356140c581613cce565b9250605f850186136140d5575f5ffd5b6140df608061400e565b8060c08701888111156140f0575f5ffd5b604088015b8181101561410d5780358452602093840193016140f5565b5081945061411b898261404b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561086057610860614169565b5f602082840312156141a0575f5ffd5b815160ff81168114611b05575f5ffd5b5f816141be576141be614169565b505f190190565b8082018082111561086057610860614169565b634e487b7160e01b5f52603160045260245ffd5b808202811582820484141761086057610860614169565b5f8261421d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614232575f5ffd5b5051919050565b6001815b60018411156142745780850481111561425857614258614169565b600184161561426657908102905b60019390931c92800261423d565b935093915050565b5f8261428a57506001610860565b8161429657505f610860565b81600181146142ac57600281146142b6576142d2565b6001915050610860565b60ff8411156142c7576142c7614169565b50506001821b610860565b5060208310610133831016604e8410600b84101617156142f5575081810a610860565b6143015f198484614239565b805f190482111561431457614314614169565b029392505050565b5f611b0560ff84168361427c565b5f6001820161433b5761433b614169565b5060010190565b60ff828116828216039081111561086057610860614169565b63ffffffff81811683821602908116908181146124ba576124ba61416956fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220e9ee73769890ae37b3176764a96d7274917b61073a03027340f4b3b7e4f9aede64736f6c634300081b00330000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102e5575f3560e01c806391de4d0711610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107c7578063ea5e0c60146107da578063ed421a9c14610802578063f9a6466414610829575f5ffd5b8063d547741f14610798578063d627d25e146107ab578063d918a16e146107be575f5ffd5b8063c8558f1b14610725578063ca15c87314610738578063cfe9232b1461074b578063d04cffeb1461075f578063d1af1fbc14610772578063d382fe9214610785575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee2614610672578063c0680e2014610685578063c0aa0e8a14610698578063c5f0d05c14610712575f5ffd5b8063b33712c5146105f7578063bc063e1a146105ff578063bc3b2b1214610608575f5ffd5b806391de4d07146105845780639b299d9a146105975780639cd85b5b146105aa578063a217fddf146105bd578063a3246ad3146105c4578063b2f5de94146105e4575f5ffd5b806336568abe116102515780637b30564e1161020b5780638dbdbe6d116101e65780638dbdbe6d1461050c5780639010d07c1461051f578063909b2bb81461054a57806391d1485414610571575f5ffd5b80637b30564e146104935780637bde82f2146104a65780638ad59c70146104b9575f5ffd5b806336568abe1461041e578063439766ce146104315780635c975abb146104395780636247f6f2146104465780636e76fc8f14610459578063725dafe014610480575f5ffd5b8063172c44ec116102a2578063172c44ec146103a75780631b014e85146103ba57806324760807146103cd578063248a9ca3146103d657806327507458146103f85780632f2ff15d1461040b575f5ffd5b806301ffc9a7146102e957806306b40ea3146103115780630868335e146103325780630fb81eb4146103525780631227b40214610367578063154347b514610387575b5f5ffd5b6102fc6102f7366004613ca7565b61083c565b60405190151581526020015b60405180910390f35b61032461031f366004613ce2565b610866565b604051908152602001610308565b610345610340366004613d0c565b610891565b6040516103089190613e13565b610365610360366004613e61565b610941565b005b61037a610375366004613e61565b610ad6565b6040516103089190613e78565b61039a610395366004613e87565b610bc2565b6040516103089190613ea2565b6103246103b5366004613e61565b610c2b565b61039a6103c8366004613e87565b610c35565b61032460045481565b6103246103e4366004613e61565b5f9081526020819052604090206001015490565b6102fc610406366004613e61565b610c9c565b610365610419366004613ed9565b610d20565b61036561042c366004613ed9565b610d4a565b610365610d82565b6003546102fc9060ff1681565b610365610454366004613e87565b610de6565b6103247f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61036561048e366004613ed9565b610fcc565b6102fc6104a1366004613ce2565b6110eb565b6103246104b4366004613ed9565b61118f565b6104cc6104c7366004613ce2565b611424565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c001610308565b61036561051a366004613f07565b611489565b61053261052d366004613f3d565b611aee565b6040516001600160a01b039091168152602001610308565b6103247fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102fc61057f366004613ed9565b611b0c565b6102fc610592366004613f5d565b611b34565b6103656105a5366004613e87565b611c30565b6102fc6105b8366004613e87565b611d62565b6103245f81565b6105d76105d2366004613e61565b611d7a565b6040516103089190613f89565b6103656105f2366004613e61565b611d93565b610365611fc3565b6103246103e881565b610648610616366004613e61565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610308565b610365610680366004613e87565b612024565b610324610693366004613ce2565b6120a1565b6106ab6106a6366004613e61565b6120ba565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610308565b610365610720366004613fe1565b61213a565b610324610733366004613ce2565b6121db565b610324610746366004613e61565b6123c5565b6103245f51602061437b5f395f51905f5281565b61039a61076d366004613e87565b6123db565b610532610780366004613e61565b6124c1565b610324610793366004613e61565b6124e9565b6103656107a6366004613ed9565b6125d3565b6103656107b9366004613e87565b6125f7565b610324600e5481565b6103246107d5366004614096565b6126d0565b6105326107e8366004613e61565b600a6020525f90815260409020546001600160a01b031681565b6105327f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d81565b610324610837366004613ce2565b612e66565b5f6001600160e01b03198216635a05180f60e01b1480610860575061086082612e71565b92915050565b600c602052815f5260405f20818154811061087f575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108ad576108ad613ffa565b6040519080825280602002602001820160405280156108e657816020015b6108d3613c41565b8152602001906001900390816108cb5790505b5090505f5b838110156109395761091485858381811061090857610908614129565b90506020020135610ad6565b82828151811061092657610926614129565b60209081029190910101526001016108eb565b509392505050565b5f51602061437b5f395f51905f5261095881612ea5565b60035460ff16156109845760405162461bcd60e51b815260040161097b9061413d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109d95760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b604482015260640161097b565b42600683815481106109ed576109ed614129565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a2d57610a2d614129565b905f5260205f2090600a02016003015460068481548110610a5057610a50614129565b905f5260205f2090600a020160020154610a6a919061417d565b9050610aa7338260068681548110610a8457610a84614129565b5f91825260209091206001600a9092020101546001600160a01b03169190612eb2565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610ade613c41565b5f60068381548110610af257610af2614129565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b3a85612f11565b8152602001610b48856124e9565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b9985610c9c565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c1f57602002820191905f5260205f20905b815481526020019060010190808311610c0b575b50505050509050919050565b5f61086082612f11565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c1f57602002820191905f5260205f2090815481526020019060010190808311610c0b5750505050509050919050565b5f60068281548110610cb057610cb0614129565b5f91825260209091206009600a90920201015463ffffffff164211801590610860575060068281548110610ce657610ce6614129565b905f5260205f2090600a02016006015460068381548110610d0957610d09614129565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d3a81612ea5565b610d448383612f1b565b50505050565b6001600160a01b0381163314610d735760405163334bd91960e11b815260040160405180910390fd5b610d7d8282612f46565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610dac81612ea5565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e1081612ea5565b6001600160a01b038216610e5e5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b604482015260640161097b565b6001600160a01b0382165f9081526009602052604090205460ff1615610ec65760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c697374656400000000000000604482015260640161097b565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f20575060408051601f3d908101601f19168201909252610f1d91810190614190565b60015b610f625760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b604482015260640161097b565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b031633146110245760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b604482015260640161097b565b61103b5f51602061437b5f395f51905f5282611b0c565b6110785760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b604482015260640161097b565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061111757611117614129565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f611198612f71565b6001600160a01b0382165f908152600d602052604081205490815b801561141657806111c3816141b0565b6001600160a01b0387165f908152600d60205260408120805492945090925090839081106111f3576111f3614129565b905f5260205f209060050201905086816003015403611410575f61121787846121db565b9050801561140e5780826001015f828254611232919061417d565b90915550611242905081856141c5565b935061125c878260068b81548110610a8457610a84614129565b81600101545f0361140e576001600160a01b0387165f908152600d602052604090205461128b9060019061417d565b831461139c576001600160a01b0387165f908152600d6020526040902080546112b69060019061417d565b815481106112c6576112c6614129565b905f5260205f209060050201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f20848154811061130657611306614129565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d602052604090208054806113c2576113c26141d8565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b506111b3565b509150506108606001600255565b600d602052815f5260405f20818154811061143d575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b611491612f71565b6001600160a01b0381166114de5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b604482015260640161097b565b60065483106115235760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b604482015260640161097b565b5f6006848154811061153757611537614129565b5f9182526020909120600a90910201600981015490915063ffffffff164211156115945760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b604482015260640161097b565b80600601548160030154106115eb5760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e642063617061636974792072656163686564000000604482015260640161097b565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015611631573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116559190614190565b90505f61166182612fc8565b9050808510156116b35760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c6400604482015260640161097b565b6116bc86612ff3565b6116c586613135565b5f6116cf876131f6565b90505f816116e588670de0b6b3a76400006141ec565b6116ef9190614203565b90505f61271086600301548760060154611709919061417d565b611715906107086141ec565b61171f9190614203565b9050808211156117715760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f77656400604482015260640161097b565b856006015482876003015461178691906141c5565b11156117d45760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e64206465627400000000000000604482015260640161097b565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561181d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118419190614222565b90506118586001600160a01b03831633308d61344f565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561189c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c09190614222565b90508a6118cd838361417d565b1461191a5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e7400000000000000604482015260640161097b565b8a60068d8154811061192e5761192e614129565b905f5260205f2090600a02016007015f82825461194b91906141c5565b925050819055508460068d8154811061196657611966614129565b905f5260205f2090600a02016003015f82825461198391906141c5565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160c08101845260018e01549094168452908301889052908201889052606082018e905263ffffffff42818116608085015260098d015492939260a08401926119f69291600160201b9004166141c5565b63ffffffff9081169091528254600181810185555f948552602094859020845160059093020180546001600160a01b039384166001600160a01b0319909116178155948401519085015560408084015160028601556060840151600386015560808401516004909501805460a0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611ad3908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d7d6001600255565b5f828152600160205260408120611b059083613488565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611b8e57602002820191905f5260205f20905b815481526020019060010190808311611b7a575b509394505f93505050505b8151811015611c2657846001600160a01b0316600a5f848481518110611bc157611bc1614129565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611c0e5750611c0e828281518110611c0157611c01614129565b6020026020010151610c9c565b15611c1e57600192505050610860565b600101611b99565b505f949350505050565b5f611c3a81612ea5565b6001600160a01b038216611c905760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e6565722061646472657373000000000000604482015260640161097b565b611ca75f51602061437b5f395f51905f5283611b0c565b15611cec5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b604482015260640161097b565b611d035f51602061437b5f395f51905f5283612f1b565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061437b5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108605f51602061437b5f395f51905f5283611b0c565b5f81815260016020526040902060609061086090613493565b5f51602061437b5f395f51905f52611daa81612ea5565b60035460ff1615611dcd5760405162461bcd60e51b815260040161097b9061413d565b5f828152600a60205260409020546001600160a01b03163314611e325760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e656572000000000000000000604482015260640161097b565b60068281548110611e4557611e45614129565b5f91825260209091206009600a90920201015463ffffffff164211611ea55760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b604482015260640161097b565b5f60068381548110611eb957611eb9614129565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611eea57611eea614129565b5f918252602082206007600a909202010154600e5490925015611f3157612710600e5483611f1891906141ec565b611f229190614203565b9050611f2e818361417d565b91505b611f456001600160a01b0384163384612eb2565b8015611f7f57611f7f6001600160a01b0384167f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d83612eb2565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63611fed81612ea5565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61202e81612ea5565b6120455f51602061437b5f395f51905f5283612f46565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061437b5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f20818154811061087f575f80fd5b600681815481106120c9575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f61214481612ea5565b6103e88263ffffffff16111561218b5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640161097b565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061220757612207614129565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a08301526006805492945091811061228757612287614129565b5f9182526020918290206040805161016081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260099092015463ffffffff808216610120840152600160201b90910481166101408301529184015190925016421015612347575f92505050610860565b5f81610140015163ffffffff1690505f8360a0015163ffffffff16421161238257608084015161237d9063ffffffff164261417d565b612384565b815b90505f8285602001516123979190614203565b90505f6123a483836141ec565b905085602001518111156123b9575060208501515b98975050505050505050565b5f8181526001602052604081206108609061349f565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561240f5761240f613ffa565b604051908082528060200260200182016040528015612438578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156124ba576001600160a01b0384165f908152600d6020526040902080548290811061248557612485614129565b905f5260205f209060050201600301548282815181106124a7576124a7614129565b602090810291909101015260010161243d565b5092915050565b600581815481106124d0575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f600683815481106124fe576124fe614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506125b0919061417d565b90506127106125c1826107086141ec565b6125cb9190614203565b949350505050565b5f828152602081905260409020600101546125ed81612ea5565b610d448383612f46565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e61262181612ea5565b6001600160a01b0382165f9081526009602052604090205460ff166126805760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604482015260640161097b565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a06191016110df565b5f5f51602061437b5f395f51905f526126e881612ea5565b60035460ff161561270b5760405162461bcd60e51b815260040161097b9061413d565b6001600160a01b0386166127585760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b604482015260640161097b565b6001600160a01b0385166127a45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b604482015260640161097b565b856001600160a01b0316856001600160a01b0316036128055760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e740000000000000000604482015260640161097b565b6001600160a01b0386165f9081526009602052604090205460ff166128645760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b604482015260640161097b565b61286e3386611b34565b156128c65760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b606482015260840161097b565b82514263ffffffff909116116129135760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b604482015260640161097b565b83516129565760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161097b565b60208401516129a75760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e203000000000604482015260640161097b565b60408401516129f85760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e203000000000000000604482015260640161097b565b6060840151612a405760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b604482015260640161097b565b82515f90612a5590429063ffffffff1661417d565b90505f8111612a9f5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b604482015260640161097b565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612adc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b009190614190565b9050612b303330612b1284600a61431c565b8951612b1e91906141ec565b6001600160a01b038c1692919061344f565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612b5f84600a61431c565b8951612b6b91906141ec565b81525f60208083019190915289015160408201526060016103e88960026020020151612b9f90670de0b6b3a76400006141ec565b612ba99190614203565b8152602001612bb984600a61431c565b60608a0151612bc891906141ec565b81526020015f8152602001428152602001875f60028110612beb57612beb614129565b602002015163ffffffff16815260200187600160028110612c0e57612c0e614129565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612e079061432a565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a60016020020151604051612e5291815260200190565b60405180910390a498975050505050505050565b5f611b0583836121db565b5f6001600160e01b03198216637965db0b60e01b148061086057506301ffc9a760e01b6001600160e01b0319831614610860565b612eaf81336134a8565b50565b6040516001600160a01b03838116602483015260448201839052610d7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506134e1565b5f610860826131f6565b5f5f612f27848461354d565b90508015611b05575f84815260016020526040902061093990846135dc565b5f5f612f5284846135f0565b90508015611b05575f8481526001602052604090206109399084613659565b6002805403612fc25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161097b565b60028055565b5f60028260ff161115612feb57612fe0600283614342565b61086090600a61431c565b506001919050565b5f818152600760205260409020600381015460049091015461301591906141c5565b421115612eaf575f6006828154811061303057613030614129565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156130bb575f828152600760205260408120600101546004830180549192909161307f9084906141c5565b90915550505f828152600760205260409020600201546004820154106130b6575f8281526007602052604090206002015460048201555b613118565b5f82815260076020526040812060010154600483018054919290916130e190849061417d565b90915550505f82815260076020526040902060020154600482015411613118575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061314957613149614129565b905f5260205f2090600a020190505f81600301549050805f0361316b57505050565b5f82600801544261317c919061417d565b9050805f0361318b5750505050565b60098301545f906131aa90600160201b900463ffffffff16606461435b565b63ffffffff166131ba83856141ec565b6131c49190614203565b90508281116131dc576131d7818461417d565b6131de565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061320b5761320b614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156132e2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133069190614190565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613348573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061336c9190614190565b90505f6133788661366d565b90505f61338487613899565b90505f83613393866024614342565b61339d9190614342565b6133a890600a61431c565b6133b283856141ec565b6133bc91906141ec565b9050670de0b6b3a76400006133d18183614203565b6133db9190614203565b96508560a001518710156133f1578560a0015196505b613404670de0b6b3a76400005f19614203565b8711156134445760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b604482015260640161097b565b505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d449186918216906323b872dd90608401612edf565b5f611b058383613a9c565b60605f611b0583613ac2565b5f610860825490565b6134b28282611b0c565b610fc85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161097b565b5f5f60205f8451602086015f885af180613500576040513d5f823e3d81fd5b50505f513d91508115613517578060011415613524565b6001600160a01b0384163b155b15610d4457604051635274afe760e01b81526001600160a01b038516600482015260240161097b565b5f6135588383611b0c565b6135d5575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561358d3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610860565b505f610860565b5f611b05836001600160a01b038416613b19565b5f6135fb8383611b0c565b156135d5575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610860565b5f611b05836001600160a01b038416613b5e565b5f5f6006838154811061368257613682614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff161515895296870154998801999099529385015496860196909652908301549084015292015492810192909252519193509161378186613899565b90505f84610120015163ffffffff16421161379c575f6137b2565b6101208501516137b29063ffffffff164261417d565b90505f8560c0015183670de0b6b3a76400006137ce91906141ec565b6137d89190614203565b90505f6137e68360016141c5565b6137f083876141ec565b6137fa9190614203565b90508560600151866080015161381091906141c5565b421161386c5785511561384757602086015161382c90866141c5565b9450856040015185111561384257856040015194505b61386c565b6020860151613856908661417d565b9450856040015185101561386c57856040015194505b8085111561388b5761387e818661417d565b9998505050505050505050565b505f98975050505050505050565b5f5f600683815481106138ae576138ae614129565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613986573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139aa9190614190565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139ed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a119190614190565b90505f613a1f826012614342565b613a2a90600a61431c565b8460600151613a3991906141ec565b90505f613a47846012614342565b613a5290600a61431c565b8560e00151613a6191906141ec565b9050805f03613a7e5750670de0b6b3a76400009695505050505050565b5f81613a9284670de0b6b3a76400006141ec565b6123b99190614203565b5f825f018281548110613ab157613ab1614129565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c1f57602002820191905f5260205f2090815481526020019060010190808311610c0b5750505050509050919050565b5f8181526001830160205260408120546135d557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610860565b5f8181526001830160205260408120548015613c38575f613b8060018361417d565b85549091505f90613b939060019061417d565b9050808214613bf2575f865f018281548110613bb157613bb1614129565b905f5260205f200154905080875f018481548110613bd157613bd1614129565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c0357613c036141d8565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610860565b5f915050610860565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613cb7575f5ffd5b81356001600160e01b031981168114611b05575f5ffd5b6001600160a01b0381168114612eaf575f5ffd5b5f5f60408385031215613cf3575f5ffd5b8235613cfe81613cce565b946020939093013593505050565b5f5f60208385031215613d1d575f5ffd5b823567ffffffffffffffff811115613d33575f5ffd5b8301601f81018513613d43575f5ffd5b803567ffffffffffffffff811115613d59575f5ffd5b8560208260051b8401011115613d6d575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613da460208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613de760c08401826001600160a01b03169052565b5060e0810151613dfb60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613e5657613e3f838551613d7d565b602093909301926101409290920191600101613e2c565b509095945050505050565b5f60208284031215613e71575f5ffd5b5035919050565b61014081016108608284613d7d565b5f60208284031215613e97575f5ffd5b8135611b0581613cce565b602080825282518282018190525f918401906040840190835b81811015613e56578351835260209384019390920191600101613ebb565b5f5f60408385031215613eea575f5ffd5b823591506020830135613efc81613cce565b809150509250929050565b5f5f5f60608486031215613f19575f5ffd5b83359250602084013591506040840135613f3281613cce565b809150509250925092565b5f5f60408385031215613f4e575f5ffd5b50508035926020909101359150565b5f5f60408385031215613f6e575f5ffd5b8235613f7981613cce565b91506020830135613efc81613cce565b602080825282518282018190525f918401906040840190835b81811015613e565783516001600160a01b0316835260209384019390920191600101613fa2565b803563ffffffff81168114613fdc575f5ffd5b919050565b5f60208284031215613ff1575f5ffd5b611b0582613fc9565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261405a575f5ffd5b614064604061400e565b806040840185811115614075575f5ffd5b845b81811015613e565761408881613fc9565b845260209384019301614077565b5f5f5f5f61010085870312156140aa575f5ffd5b84356140b581613cce565b935060208501356140c581613cce565b9250605f850186136140d5575f5ffd5b6140df608061400e565b8060c08701888111156140f0575f5ffd5b604088015b8181101561410d5780358452602093840193016140f5565b5081945061411b898261404b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561086057610860614169565b5f602082840312156141a0575f5ffd5b815160ff81168114611b05575f5ffd5b5f816141be576141be614169565b505f190190565b8082018082111561086057610860614169565b634e487b7160e01b5f52603160045260245ffd5b808202811582820484141761086057610860614169565b5f8261421d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614232575f5ffd5b5051919050565b6001815b60018411156142745780850481111561425857614258614169565b600184161561426657908102905b60019390931c92800261423d565b935093915050565b5f8261428a57506001610860565b8161429657505f610860565b81600181146142ac57600281146142b6576142d2565b6001915050610860565b60ff8411156142c7576142c7614169565b50506001821b610860565b5060208310610133831016604e8410600b84101617156142f5575081810a610860565b6143015f198484614239565b805f190482111561431457614314614169565b029392505050565b5f611b0560ff84168361427c565b5f6001820161433b5761433b614169565b5060010190565b60ff828116828216039081111561086057610860614169565b63ffffffff81811683821602908116908181146124ba576124ba61416956fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220e9ee73769890ae37b3176764a96d7274917b61073a03027340f4b3b7e4f9aede64736f6c634300081b0033
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
50489:23424:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44035:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44035:214:0;;;;;;;;52153:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52153:53:0;1101:177:1;66732:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56948:393::-;;;;;;:::i;:::-;;:::i;:::-;;66076:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63796:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64853:107::-;;;;;;:::i;:::-;;:::i;63946:138::-;;;;;;:::i;:::-;;:::i;51775:28::-;;;;;;27108:122;;;;;;:::i;:::-;27173:7;27200:12;;;;;;;;;;:22;;;;27108:122;64421:162;;;;;;:::i;:::-;;:::i;27540:138::-;;;;;;:::i;:::-;;:::i;28677:251::-;;;;;;:::i;:::-;;:::i;63083:165::-;;;:::i;50854:18::-;;;;;;;;;62303:525;;;;;;:::i;:::-;;:::i;50765:80::-;;50812:33;50765:80;;58069:350;;;;;;:::i;:::-;;:::i;67228:174::-;;;;;;:::i;:::-;;:::i;60285:1074::-;;;;;;:::i;:::-;;:::i;52213: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;52213:43:0;6038:591:1;58546:1731:0;;;;;;:::i;:::-;;:::i;44848:144::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7641:32:1;;;7623:51;;7611:2;7596:18;44848:144:0;7477:203:1;50674:84:0;;50723:35;50674:84;;26124:138;;;;;;:::i;:::-;;:::i;73424:375::-;;;;;;:::i;:::-;;:::i;61499:489::-;;;;;;:::i;:::-;;:::i;64972:127::-;;;;;;:::i;:::-;;:::i;25436:49::-;;25481:4;25436:49;;45852:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57347:710::-;;;;;;:::i;:::-;;:::i;63256:170::-;;;:::i;52330:38::-;;52364:4;52330:38;;51875: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;51875:45:0;8720:473:1;61996:298:0;;;;;;:::i;:::-;;:::i;52094:52::-;;;;;;:::i;:::-;;:::i;51848: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;51848:20:0;9198:979:1;63433:237:0;;;;;;:::i;:::-;;:::i;65107:959::-;;;;;;:::i;:::-;;:::i;45166:133::-;;;;;;:::i;:::-;;:::i;50597:70::-;;-1:-1:-1;;;;;;;;;;;50597:70:0;;64092:316;;;;;;:::i;:::-;;:::i;51810:31::-;;;;;;:::i;:::-;;:::i;64597:244::-;;;;;;:::i;:::-;;:::i;27971:140::-;;;;;;:::i;:::-;;:::i;62836:232::-;;;;;;:::i;:::-;;:::i;52300:23::-;;;;;;54562:2377;;;;;;:::i;:::-;;:::i;52032:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52032:55:0;;;52264:29;;;;;67080:141;;;;;;:::i;:::-;;:::i;44035:214::-;44120:4;-1:-1:-1;;;;;;44144:57:0;;-1:-1:-1;;;44144:57:0;;:97;;;44205:36;44229:11;44205:23;:36::i;:::-;44137:104;44035:214;-1:-1:-1;;44035:214:0:o;52153:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66732:342::-;66817:23;66849:31;66904:9;66883:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;66849:72:0;-1:-1:-1;66939:9:0;66934:110;66954:20;;;66934:110;;;67005:31;67023:9;;67033:1;67023:12;;;;;;;:::i;:::-;;;;;;;67005:17;:31::i;:::-;66992:7;67000:1;66992:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;66976:3;;66934:110;;;-1:-1:-1;67063:7:0;66732:342;-1:-1:-1;;;66732:342:0:o;56948:393::-;-1:-1:-1;;;;;;;;;;;25720:16:0;25731:4;25720:10;:16::i;:::-;73858:6:::1;::::0;::::1;;73857:7;73849:38;;;;-1:-1:-1::0;;;73849:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57040:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57040:25:0::2;57069:10;57040:39;57036:69;;57081:24;::::0;-1:-1:-1;;;57081:24:0;;13420:2:1;57081: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;;57081:24:0::2;13218:337:1::0;57036:69:0::2;57141:15;57112:5;57118:3;57112:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57166:18;57213:5;57219:3;57213:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57187:5;57193:3;57187:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57166:67;;57242;57286:10;57298;57249:5;57255:3;57249:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57249:22:0::2;::::0;57242:67;:43:::2;:67::i;:::-;57323:14;::::0;57333:3;;57323:14:::2;::::0;;;::::2;57029:312;56948:393:::0;;:::o;66076:648::-;66142:21;;:::i;:::-;66176:18;66197:5;66203:8;66197:15;;;;;;;;:::i;:::-;;;;;;;;;;66240:476;;;;;;;;66197:15;;;;;;;66282;;-1:-1:-1;;;;;66282:15:0;;;66240:476;;66282:15;66325:16;;;;66240:476;;;;;;;66197:15;;-1:-1:-1;66240:476:0;;;66363:24;66378:8;66363:14;:24::i;:::-;66240:476;;;;66413:26;66430:8;66413:16;:26::i;:::-;66240:476;;66467:16;;;;-1:-1:-1;;;66467:16:0;;;;66240:476;;;;;;;;66513:17;;;;66240:476;;;;;;;;-1:-1:-1;66557:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;66557:30:0;66240:476;;;;;;66610:16;66557:30;66610:6;:16::i;:::-;66240:476;;;;66652:14;;;;66240:476;;;;66691:13;;;;;;;66240:476;;;;;;;;66233:483;66076:648;-1:-1:-1;;66076:648:0:o;63796:142::-;-1:-1:-1;;;;;63903:27:0;;;;;;:15;:27;;;;;;;;;63896:34;;;;;;;;;;;;;;;;;63866:16;;63896:34;;;63903:27;63896:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63796:142;;;:::o;64853:107::-;64905:7;64933:19;64948:3;64933:14;:19::i;63946:138::-;-1:-1:-1;;;;;64052:24:0;;;;;;:16;:24;;;;;;;;;64045:31;;;;;;;;;;;;;;;;;64013:16;;64045:31;;;64052:24;64045:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63946:138;;;:::o;64421:162::-;64471:4;64515:5;64521:3;64515:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;64496:15;:38;;;;:83;;;64561:5;64567:3;64561:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;64538:5;64544:3;64538:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;64489:90;64421:162;-1:-1:-1;;64421:162:0:o;27540:138::-;27173:7;27200:12;;;;;;;;;;:22;;;25720:16;25731:4;25720:10;:16::i;:::-;27645:25:::1;27656:4;27662:7;27645:10;:25::i;:::-;;27540:138:::0;;;:::o;28677:251::-;-1:-1:-1;;;;;28771:34:0;;22427:10;28771:34;28767:104;;28829:30;;-1:-1:-1;;;28829:30:0;;;;;;;;;;;28767:104;28883:37;28895:4;28901:18;28883:11;:37::i;:::-;;28677:251;;:::o;63083:165::-;50812:33;25720:16;25731:4;25720:10;:16::i;:::-;63185:6:::1;:13:::0;;-1:-1:-1;;63185:13:0::1;63194:4;63185:13;::::0;;63214:26:::1;::::0;63229:10:::1;::::0;63214:26:::1;::::0;63185:6:::1;::::0;63214:26:::1;63083:165:::0;:::o;62303:525::-;50723:35;25720:16;25731:4;25720:10;:16::i;:::-;-1:-1:-1;;;;;62430:20:0;::::1;62422:54;;;::::0;-1:-1:-1;;;62422:54:0;;14027:2:1;62422: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;;62422:54:0::1;13825:345:1::0;62422:54:0::1;-1:-1:-1::0;;;;;62496:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;62495:26;62487:64;;;::::0;-1:-1:-1;;;62487:64:0;;14377:2:1;62487:64:0::1;::::0;::::1;14359:21:1::0;14416:2;14396:18;;;14389:30;14455:27;14435:18;;;14428:55;14500:18;;62487:64:0::1;14175:349:1::0;62487:64:0::1;62623:6;-1:-1:-1::0;;;;;62608:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;62608:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;62608:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;62604:217;;62780:29;::::0;-1:-1:-1;;;62780:29:0;;15009:2:1;62780: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;;62780:29:0::1;14807:343:1::0;62604:217:0::1;-1:-1:-1::0;;;;;;62673:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;62673:32:0::1;62701:4;62673:32:::0;;::::1;::::0;;;62720:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;62720:26:0::1;::::0;;::::1;::::0;;62604:217:::1;62303:525:::0;;:::o;58069:350::-;58158:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58158:30:0;58192:10;58158:44;58150:73;;;;-1:-1:-1;;;58150:73:0;;15357:2:1;58150:73:0;;;15339:21:1;15396:2;15376:18;;;15369:30;-1:-1:-1;;;15415:18:1;;;15408:46;15471:18;;58150:73:0;15155:340:1;58150:73:0;58238:39;-1:-1:-1;;;;;;;;;;;58263:13:0;58238:7;:39::i;:::-;58230:66;;;;-1:-1:-1;;;58230:66:0;;15702:2:1;58230:66:0;;;15684:21:1;15741:2;15721:18;;;15714:30;-1:-1:-1;;;15760:18:1;;;15753:44;15814:18;;58230:66:0;15500:338:1;58230:66:0;58303:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58303:46:0;-1:-1:-1;;;;;58303:46:0;;;;;;;;58361:54;;16045:25:1;;;58389:10:0;16086:18:1;;;16079:60;;;;16155:18;;;16148:60;;;;58361:54:0;;16033:2:1;16018:18;58361:54:0;;;;;;;;58069:350;;:::o;67228:174::-;-1:-1:-1;;;;;67330:14:0;;67298:4;67330:14;;;:8;:14;;;;;:23;;67298:4;;67330:14;67345:7;;67330:23;;;;;;:::i;:::-;;;;;;;;;;67311:42;;;;;;;;67330:23;;;;;;;67311:42;;-1:-1:-1;;;;;67311:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67311:42:0;;;;;;;;;;;67367:15;:31;;;-1:-1:-1;;67228:174:0;;;;:::o;60285:1074::-;60359:22;48943:21;:19;:21::i;:::-;-1:-1:-1;;;;;60407:14:0;::::1;60390;60407::::0;;;:8:::1;:14;::::0;;;;:21;;;60471:852:::1;60496:5:::0;;60471:852:::1;;60515:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;60568:14:0;::::1;60541:24;60568:14:::0;;;:8:::1;:14;::::0;;;;:17;;60515:3;;-1:-1:-1;60541:24:0;;-1:-1:-1;60568:14:0;60515:3;;60568:17;::::1;;;;;:::i;:::-;;;;;;;;;;;60541:44;;60624:3;60600:11;:20;;;:27:::0;60596:720:::1;;60644:14;60661:30;60683:4;60689:1;60661:21;:30::i;:::-;60644:47:::0;-1:-1:-1;60724:10:0;;60720:585:::1;;60781:6;60755:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60806:23:0::1;::::0;-1:-1:-1;60823:6:0;60806:23;::::1;:::i;:::-;;;60930:57;60974:4;60980:6;60937:5;60943:3;60937:10;;;;;;;;:::i;60930:57::-;61028:11;:22;;;61054:1;61028:27:::0;61024:266:::1;;-1:-1:-1::0;;;;;61089:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;61113:1:::1;::::0;61089:25:::1;:::i;:::-;61084:1;:30;61080:148;;-1:-1:-1::0;;;;;61163:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;61178:21;;:25:::1;::::0;61202:1:::1;::::0;61178:25:::1;:::i;:::-;61163:41;;;;;;;;:::i;:::-;;;;;;;;;;;61143:8;:14;61152:4;-1:-1:-1::0;;;;;61143:14:0::1;-1:-1:-1::0;;;;;61143:14:0::1;;;;;;;;;;;;61158:1;61143:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;61143:61:0::1;-1:-1:-1::0;;;;;61143: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;;61143:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;61143:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;61143:61:0;;;;;;;;;::::1;::::0;;61080:148:::1;-1:-1:-1::0;;;;;61250:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;61250:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;61250:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;61250:20:0;;;;;61024:266:::1;60629:687;60596:720;60504:819;60471:852;;;-1:-1:-1::0;61342:13:0;-1:-1:-1;;48987:20:0;48381:1;49507:7;:22;49324:213;52213:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52213:43:0;;;;-1:-1:-1;52213:43:0;;-1:-1:-1;52213:43:0;;;;;;;-1:-1:-1;;;52213:43:0;;;;:::o;58546:1731::-;48943:21;:19;:21::i;:::-;-1:-1:-1;;;;;58641:18:0;::::1;58633:51;;;::::0;-1:-1:-1;;;58633:51:0;;16824:2:1;58633: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;;58633:51:0::1;16622:344:1::0;58633:51:0::1;58705:5;:12:::0;58699:18;::::1;58691:48;;;::::0;-1:-1:-1;;;58691:48:0;;17173:2:1;58691: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;;58691:48:0::1;16971:341:1::0;58691:48:0::1;58746:18;58767:5;58773:3;58767:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;58811:13;::::0;::::1;::::0;58767:10;;-1:-1:-1;58811:13:0::1;;58792:15;:32;;58784:59;;;::::0;-1:-1:-1;;;58784:59:0;;17519:2:1;58784: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;;58784:59:0::1;17317:338:1::0;58784:59:0::1;58875:4;:12;;;58858:4;:14;;;:29;58850:71;;;::::0;-1:-1:-1;;;58850:71:0;;17862:2:1;58850:71:0::1;::::0;::::1;17844:21:1::0;17901:2;17881:18;;;17874:30;17940:31;17920:18;;;17913:59;17989:18;;58850:71:0::1;17660:353:1::0;58850:71:0::1;58975:15:::0;;58952:51:::1;::::0;;-1:-1:-1;;;58952:51:0;;;;58930:19:::1;::::0;-1:-1:-1;;;;;58975:15:0::1;::::0;58952:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;58975:15;58952:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58930:73;;59010:22;59035:38;59059:13;59035:23;:38::i;:::-;59010:63;;59098:14;59088:6;:24;;59080:68;;;::::0;-1:-1:-1;;;59080:68:0;;18220:2:1;59080:68:0::1;::::0;::::1;18202:21:1::0;18259:2;18239:18;;;18232:30;18298:33;18278:18;;;18271:61;18349:18;;59080:68:0::1;18018:355:1::0;59080:68:0::1;59157:10;59163:3;59157:5;:10::i;:::-;59174:15;59185:3;59174:10;:15::i;:::-;59198:13;59214:17;59227:3;59214:12;:17::i;:::-;59198:33:::0;-1:-1:-1;59238:14:0::1;59198:33:::0;59256:13:::1;:6:::0;59265:4:::1;59256:13;:::i;:::-;59255:23;;;;:::i;:::-;59238:40;;59285:17;59348:5;59322:4;:14;;;59307:4;:12;;;:29;;;;:::i;:::-;59306:38;::::0;59340:4:::1;59306:38;:::i;:::-;59305:48;;;;:::i;:::-;59285:68;;59384:9;59374:6;:19;;59366:63;;;::::0;-1:-1:-1;;;59366:63:0;;18975:2:1;59366:63:0::1;::::0;::::1;18957:21:1::0;19014:2;18994:18;;;18987:30;19053:33;19033:18;;;19026:61;19104:18;;59366:63:0::1;18773:355:1::0;59366:63:0::1;59471:4;:12;;;59461:6;59444:4;:14;;;:23;;;;:::i;:::-;:39;;59436:77;;;::::0;-1:-1:-1;;;59436:77:0;;19335:2:1;59436:77:0::1;::::0;::::1;19317:21:1::0;19374:2;19354:18;;;19347:30;19413:27;19393:18;;;19386:55;19458:18;;59436:77:0::1;19133:349:1::0;59436:77:0::1;59549:15:::0;;59596:35:::1;::::0;-1:-1:-1;;;59596:35:0;;59625:4:::1;59596:35;::::0;::::1;7623:51:1::0;-1:-1:-1;;;;;59549:15:0;;::::1;::::0;59522:17:::1;::::0;59549:15;;59596:20:::1;::::0;7596:18:1;;59596:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59572:59:::0;-1:-1:-1;59638:62:0::1;-1:-1:-1::0;;;;;59638:27:0;::::1;59666:10;59686:4;59693:6:::0;59638:27:::1;:62::i;:::-;59730:35;::::0;-1:-1:-1;;;59730:35:0;;59759:4:::1;59730:35;::::0;::::1;7623:51:1::0;59707:20:0::1;::::0;-1:-1:-1;;;;;59730:20:0;::::1;::::0;::::1;::::0;7596:18:1;;59730:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59707:58:::0;-1:-1:-1;59812:6:0;59780:28:::1;59795:13:::0;59707:58;59780:28:::1;:::i;:::-;:38;59772:76;;;::::0;-1:-1:-1;;;59772:76:0;;19878:2:1;59772:76:0::1;::::0;::::1;19860:21:1::0;19917:2;19897:18;;;19890:30;19956:27;19936:18;;;19929:55;20001:18;;59772:76:0::1;19676:349:1::0;59772:76:0::1;59893:6;59861:5;59867:3;59861:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;59930:6;59906:5;59912:3;59906:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;59945:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;59965:240;;::::1;::::0;::::1;::::0;;59994:16:::1;::::0;::::1;::::0;;;::::1;59965:240:::0;;;;::::1;::::0;;;;;;;;;;;;;;;::::1;60119:15;59965:240:::0;;::::1;::::0;;;;60162:16:::1;::::0;::::1;::::0;59945:14;;59965:240;;;;;60162:34:::1;::::0;60119:15;-1:-1:-1;;;60162:16:0;::::1;;:34;:::i;:::-;59965:240;::::0;;::::1;::::0;;;59945:261;;::::1;::::0;;::::1;::::0;;-1:-1:-1;59945:261:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;59945:261:0;;::::1;-1:-1:-1::0;;;;;;59945: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;;;59945:261:0::1;-1:-1:-1::0;;59945:261:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;60222:47;;60242:3;;60222:47;::::1;::::0;::::1;::::0;::::1;::::0;60247:6;;60255;;60263:5;;20232:25:1;;;20288:2;20273:18;;20266:34;;;;20331:2;20316:18;;20309:34;20220:2;20205:18;;20030:319;60222:47:0::1;;;;;;;;58626:1651;;;;;;;;;48987:20:::0;48381:1;49507:7;:22;49324:213;44848:144;44929:7;44956:18;;;:12;:18;;;;;:28;;44978:5;44956:21;:28::i;:::-;44949:35;44848:144;-1:-1:-1;;;44848:144:0:o;26124:138::-;26201:4;26225:12;;;;;;;;;;;-1:-1:-1;;;;;26225:29:0;;;;;;;;;;;;;;;26124:138::o;73424:375::-;-1:-1:-1;;;;;73562:27:0;;73522:4;73562:27;;;:15;:27;;;;;;;;73535:54;;;;;;;;;;;;;;;;;73522:4;;73535:54;;73562:27;73535:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73535:54:0;;-1:-1:-1;73600:9:0;;-1:-1:-1;;;;73596:181:0;73619:7;:14;73615:1;:18;73596:181;;;73689:10;-1:-1:-1;;;;;73653:46:0;:20;:32;73674:7;73682:1;73674:10;;;;;;;;:::i;:::-;;;;;;;;;;;;73653:32;;;;;;;;;;-1:-1:-1;73653:32:0;;-1:-1:-1;;;;;73653:32:0;:46;:68;;;;;73703:18;73710:7;73718:1;73710:10;;;;;;;;:::i;:::-;;;;;;;73703:6;:18::i;:::-;73650:120;;;73754:4;73747:11;;;;;;73650:120;73635:3;;73596:181;;;-1:-1:-1;73790:5:0;;73424:375;-1:-1:-1;;;;73424:375:0:o;61499:489::-;25481:4;25720:16;25481:4;25720:10;:16::i;:::-;-1:-1:-1;;;;;61666:25:0;::::1;61658:64;;;::::0;-1:-1:-1;;;61658:64:0;;20556:2:1;61658:64:0::1;::::0;::::1;20538:21:1::0;20595:2;20575:18;;;20568:30;20634:28;20614:18;;;20607:56;20680:18;;61658:64:0::1;20354:350:1::0;61658:64:0::1;61742:37;-1:-1:-1::0;;;;;;;;;;;61767:11:0::1;61742:7;:37::i;:::-;61741:38;61733:72;;;::::0;-1:-1:-1;;;61733:72:0;;20911:2:1;61733: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;;61733:72:0::1;20709:345:1::0;61733:72:0::1;61818:40;-1:-1:-1::0;;;;;;;;;;;61846:11:0::1;61818:10;:40::i;:::-;-1:-1:-1::0;;;;;;61869:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;61869:42:0::1;61907:4;61869:42;::::0;;61927:53;61969:10:::1;::::0;61869:35;-1:-1:-1;;;;;;;;;;;50639:28:0;61927:53:::1;::::0;61869:35;61927:53:::1;61499:489:::0;;:::o;64972:127::-;65034:4;65058:33;-1:-1:-1;;;;;;;;;;;65083:7:0;65058;:33::i;45852:138::-;45955:18;;;;:12;:18;;;;;45919:16;;45955:27;;:25;:27::i;57347:710::-;-1:-1:-1;;;;;;;;;;;25720:16:0;25731:4;25720:10;:16::i;:::-;73858:6:::1;::::0;::::1;;73857:7;73849:38;;;;-1:-1:-1::0;;;73849:38:0::1;;;;;;;:::i;:::-;57453:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57453:25:0::2;57482:10;57453:39;57445:75;;;::::0;-1:-1:-1;;;57445:75:0;;21261:2:1;57445:75:0::2;::::0;::::2;21243:21:1::0;21300:2;21280:18;;;21273:30;21339:25;21319:18;;;21312:53;21382:18;;57445:75:0::2;21059:347:1::0;57445:75:0::2;57553:5;57559:3;57553:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57535:15;:37;57527:72;;;::::0;-1:-1:-1;;;57527:72:0;;21613:2:1;57527: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;;57527:72:0::2;21411:346:1::0;57527:72:0::2;57608:18;57629:5;57635:3;57629:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;57675:5:::2;:10:::0;;-1:-1:-1;;;;;57629:21:0;;::::2;::::0;-1:-1:-1;57675:5:0;57681:3;;57675:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;57741:8:::2;::::0;57675:28;;-1:-1:-1;57741:12:0;57737:102:::2;;57798:5;57786:8;;57776:7;:18;;;;:::i;:::-;57775:28;;;;:::i;:::-;57766:37:::0;-1:-1:-1;57814:17:0::2;57766:37:::0;57814:17;::::2;:::i;:::-;;;57737:102;57847:52;-1:-1:-1::0;;;;;57847:31:0;::::2;57879:10;57891:7:::0;57847:31:::2;:52::i;:::-;57910:10:::0;;57906:80:::2;;57933:45;-1:-1:-1::0;;;;;57933:31:0;::::2;57965:4;57971:6:::0;57933:31:::2;:45::i;:::-;57999:54;::::0;;21936:25:1;;;21992:2;21977:18;;21970:34;;;58025:10:0::2;::::0;58020:3;;57999:54:::2;::::0;21909:18:1;57999:54:0::2;;;;;;;57438:619;;;57347:710:::0;;:::o;63256:170::-;50812:33;25720:16;25731:4;25720:10;:16::i;:::-;63360:6:::1;:14:::0;;-1:-1:-1;;63360:14:0::1;::::0;;63390:28:::1;::::0;63407:10:::1;::::0;63390:28:::1;::::0;63369:5:::1;::::0;63390:28:::1;63256:170:::0;:::o;61996:298::-;25481:4;25720:16;25481:4;25720:10;:16::i;:::-;62122:41:::1;-1:-1:-1::0;;;;;;;;;;;62151:11:0::1;62122;:41::i;:::-;-1:-1:-1::0;;;;;;62174:35:0;::::1;62212:5;62174:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;62174:43:0::1;::::0;;62233:53;62275:10:::1;::::0;62174:35;-1:-1:-1;;;;;;;;;;;50639:28:0;62233:53:::1;::::0;62212:5;62233:53:::1;61996:298:::0;;:::o;52094:52::-;;;;;;;;;;;;;;;;;;;;51848:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51848:20:0;;;;-1:-1:-1;51848:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51848:20:0;;;;:::o;63433:237::-;25481:4;25720:16;25481:4;25720:10;:16::i;:::-;52364:4:::1;63526:10;:21;;;;63518:46;;;::::0;-1:-1:-1;;;63518:46:0;;22217:2:1;63518: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;;63518:46:0::1;22015:336:1::0;63518:46:0::1;63588:8;::::0;;63603:21:::1;::::0;::::1;::::0;;;;63636:30:::1;::::0;;22529:25:1;;;22585:2;22570:18;;22563:51;;;;63588:8:0;;63636:30:::1;::::0;22502:18:1;63636:30:0::1;;;;;;;63511:159;63433:237:::0;;:::o;65107:959::-;-1:-1:-1;;;;;65225:14:0;;65190:7;65225:14;;;:8;:14;;;;;:23;;65190:7;;65225:14;65240:7;;65225:23;;;;;;:::i;:::-;;;;;;;;;65206:42;;;;;;;;65225:23;;;;;;;65206:42;;-1:-1:-1;;;;;65206:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65206:42:0;;;;;;;;65275:5;:20;;65206:42;;-1:-1:-1;65275:5:0;:20;;;;;;:::i;:::-;;;;;;;;;;65255:40;;;;;;;;65275:20;;;;;;;65255:40;;-1:-1:-1;;;;;65255:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65255:40:0;;;;;;;;;65358:14;;;;65255:40;;-1:-1:-1;65340:32:0;:15;:32;65336:65;;;65392:1;65385:8;;;;;;65336:65;65450:19;65472:4;:16;;;65450:38;;;;65545:19;65585:4;:12;;;65567:30;;:15;:30;:99;;65652:14;;;;65634:32;;;;:15;:32;:::i;:::-;65567:99;;;65610:11;65567:99;65545:121;;65711:23;65755:11;65737:4;:15;;;:29;;;;:::i;:::-;65711:55;-1:-1:-1;65818:24:0;65845:29;65863:11;65711:55;65845:29;:::i;:::-;65818:56;;65961:4;:15;;;65942:16;:34;65938:93;;;-1:-1:-1;66008:15:0;;;;65938:93;66046:16;65107:959;-1:-1:-1;;;;;;;;65107:959:0:o;45166:133::-;45237:7;45264:18;;;:12;:18;;;;;:27;;:25;:27::i;64092:316::-;-1:-1:-1;;;;;64233:14:0;;64188:28;64233:14;;;:8;:14;;;;;:21;64155:16;;64188:28;64219:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64219:36:0;-1:-1:-1;64188:67:0;-1:-1:-1;64267:9:0;64262:114;-1:-1:-1;;;;;64286:14:0;;;;;;:8;:14;;;;;:21;64282:25;;64262:114;;;-1:-1:-1;;;;;64342:14:0;;;;;;:8;:14;;;;;:17;;64357:1;;64342:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;64325:11;64337:1;64325:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;64309:3;;64262:114;;;-1:-1:-1;64389:11:0;64092:316;-1:-1:-1;;64092:316:0:o;51810:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51810:31:0;;-1:-1:-1;51810:31:0;:::o;64597:244::-;64657:7;64676:17;64696:5;64702:3;64696:10;;;;;;;;:::i;:::-;;;;;;;;;64676:30;;;;;;;;64696:10;;;;;;;64676:30;;-1:-1:-1;;;;;64676:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64676:30:0;;;;;;;;;;-1:-1:-1;64740:29:0;;64676:30;64740:29;:::i;:::-;64716:53;-1:-1:-1;64811:5:0;64787:20;64716:53;64803:4;64787:20;:::i;:::-;64786:30;;;;:::i;:::-;64779:37;64597:244;-1:-1:-1;;;;64597:244:0:o;27971:140::-;27173:7;27200:12;;;;;;;;;;:22;;;25720:16;25731:4;25720:10;:16::i;:::-;28077:26:::1;28089:4;28095:7;28077:11;:26::i;62836:232::-:0;50723:35;25720:16;25731:4;25720:10;:16::i;:::-;-1:-1:-1;;;;;62935:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;62927:59;;;::::0;-1:-1:-1;;;62927:59:0;;22827:2:1;62927:59:0::1;::::0;::::1;22809:21:1::0;22866:2;22846:18;;;22839:30;-1:-1:-1;;;22885:18:1;;;22878:51;22946:18;;62927:59:0::1;22625:345:1::0;62927:59:0::1;-1:-1:-1::0;;;;;62993:25:0;::::1;63021:5;62993:25:::0;;;:17:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;62993:33:0::1;::::0;;63038:26;;7623:51:1;;;63038:26:0::1;::::0;7596:18:1;63038:26:0::1;7477:203:1::0;54562:2377:0;54851:16;-1:-1:-1;;;;;;;;;;;25720:16:0;25731:4;25720:10;:16::i;:::-;73858:6:::1;::::0;::::1;;73857:7;73849:38;;;;-1:-1:-1::0;;;73849:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54912:26:0;::::2;54904:59;;;::::0;-1:-1:-1;;;54904:59:0;;23177:2:1;54904: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;;54904:59:0::2;22975:344:1::0;54904:59:0::2;-1:-1:-1::0;;;;;54978:34:0;::::2;54970:66;;;::::0;-1:-1:-1;;;54970:66:0;;23526:2:1;54970: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;;54970:66:0::2;23324:343:1::0;54970:66:0::2;55075:12;-1:-1:-1::0;;;;;55051:36:0::2;55059:11;-1:-1:-1::0;;;;;55051:36:0::2;::::0;55043:73:::2;;;::::0;-1:-1:-1;;;55043:73:0;;23874:2:1;55043:73:0::2;::::0;::::2;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:26;23932:18;;;23925:54;23996:18;;55043:73:0::2;23672:348:1::0;55043:73:0::2;-1:-1:-1::0;;;;;55131:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55123:65;;;::::0;-1:-1:-1;;;55123:65:0;;22827:2:1;55123:65:0::2;::::0;::::2;22809:21:1::0;22866:2;22846:18;;;22839:30;-1:-1:-1;;;22885:18:1;;;22878:51;22946:18;;55123:65:0::2;22625:345:1::0;55123:65:0::2;55204:61;55232:10;55252:11;55204:27;:61::i;:::-;55203:62;55195:109;;;::::0;-1:-1:-1;;;55195:109:0;;24227:2:1;55195: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;;55195:109:0::2;24025:398:1::0;55195:109:0::2;55350:16:::0;;55369:15:::2;55350:34;::::0;;::::2;;55342:65;;;::::0;-1:-1:-1;;;55342:65:0;;24630:2:1;55342: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;;55342:65:0::2;24428:342:1::0;55342:65:0::2;55453:9:::0;;55445:44:::2;;;::::0;-1:-1:-1;;;55445:44:0;;24977:2:1;55445: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;;55445:44:0::2;24775:342:1::0;55445:44:0::2;55504:9;::::0;::::2;::::0;55496:54:::2;;;::::0;-1:-1:-1;;;55496:54:0;;25324:2:1;55496:54:0::2;::::0;::::2;25306:21:1::0;25363:2;25343:18;;;25336:30;25402;25382:18;;;25375:58;25450:18;;55496:54:0::2;25122:352:1::0;55496:54:0::2;55565:9:::0;;::::2;::::0;55557:51:::2;;;::::0;-1:-1:-1;;;55557:51:0;;25681:2:1;55557:51:0::2;::::0;::::2;25663:21:1::0;25720:2;25700:18;;;25693:30;25759:27;25739:18;;;25732:55;25804:18;;55557:51:0::2;25479:349:1::0;55557:51:0::2;55623:9:::0;;::::2;::::0;55615:46:::2;;;::::0;-1:-1:-1;;;55615:46:0;;26035:2:1;55615: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;;55615:46:0::2;25833:344:1::0;55615:46:0::2;55704:16:::0;;55674:27:::2;::::0;55704:34:::2;::::0;55723:15:::2;::::0;55704:34:::2;;;:::i;:::-;55674:64;;55775:1;55753:19;:23;55745:58;;;::::0;-1:-1:-1;;;55745:58:0;;26384:2:1;55745: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;;55745:58:0::2;26182:346:1::0;55745:58:0::2;55866:20;55904:12;-1:-1:-1::0;;;;;55889:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55866:62:::0;-1:-1:-1;55972:96:0::2;56010:10;56030:4;56049:18;55866:62:::0;56049:2:::2;:18;:::i;:::-;56037:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;55972:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56115:450;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56115:450:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56104:5:::2;::::0;56115:450;;56234:18:::2;56238:14:::0;56234:2:::2;:18;:::i;:::-;56222:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56115:450:::0;;56556:1:::2;56115:450;::::0;;::::2;::::0;;;;56281:9;::::2;::::0;56115:450;;;;;;56339:4:::2;56281:6:::0;56322:1:::2;56315:9;;;::::0;:20:::2;::::0;56327:8:::2;56315:20;:::i;:::-;56314:29;;;;:::i;:::-;56115:450:::0;;::::2;;56374:18;56378:14:::0;56374:2:::2;:18;:::i;:::-;56362:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56115:450;;;;56423:1;56115:450;;;;56445:15;56115:450;;;;56480:13;56494:1;56480:16;;;;;;;:::i;:::-;;;;;56115:450;;;;;;56519:13;56533:1;56519:16;;;;;;;:::i;:::-;;;;;56115:450;;;;::::0;56104:462:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56104:462:0::2;;;;;-1:-1:-1::0;;;;;56104:462:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56104:462:0::2;;;;;-1:-1:-1::0;;;;;56104:462:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56603:16;56622:13;;56603:32;;56642:16;:30;56659:12;-1:-1:-1::0;;;;;56642:30:0::2;-1:-1:-1::0;;;;;56642:30:0::2;;;;;;;;;;;;56678:8;56642:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56694:15;:37;56718:11;-1:-1:-1::0;;;;;56694:37:0::2;-1:-1:-1::0;;;;;56694:37:0::2;;;;;;;;;;;;56737:8;56694:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56786:10;56753:20;:30;56774:8;56753:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;56753:43:0::2;;;;;-1:-1:-1::0;;;;;56753:43:0::2;;;;;;56811:13;;56809:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;56836:71:0;;::::2;::::0;;::::2;56851:8:::0;56836:71:::2;56897:6:::0;56904:1:::2;56897:9;;;;56836:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;56836:71:0::2;;;;;;;;56927:8:::0;54562:2377;-1:-1:-1;;;;;;;;54562:2377:0:o;67080:141::-;67151:14;67181:36;67203:4;67209:7;67181:21;:36::i;25828:204::-;25913:4;-1:-1:-1;;;;;;25937:47:0;;-1:-1:-1;;;25937:47:0;;:87;;-1:-1:-1;;;;;;;;;;23401:40:0;;;25988:36;23301:148;26477:105;26544:30;26555:4;22427:10;26544;:30::i;:::-;26477:105;:::o;8972:162::-;9082:43;;-1:-1:-1;;;;;28297:32:1;;;9082:43:0;;;28279:51:1;28346:18;;;28339:34;;;9055:71:0;;9075:5;;9097:14;;;;;28252:18:1;;9082:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9082:43:0;;;;;;;;;;;9055:19;:71::i;70169:139::-;70228:13;70279:17;70292:3;70279:12;:17::i;46097:263::-;46183:4;46200:12;46215:31;46232:4;46238:7;46215:16;:31::i;:::-;46200:46;;46261:7;46257:71;;;46285:18;;;;:12;:18;;;;;:31;;46308:7;46285:22;:31::i;46468:268::-;46555:4;46572:12;46587:32;46605:4;46611:7;46587:17;:32::i;:::-;46572:47;;46634:7;46630:74;;;46658:18;;;;:12;:18;;;;;:34;;46684:7;46658:25;:34::i;49023:293::-;48425:1;49157:7;;:19;49149:63;;;;-1:-1:-1;;;49149:63:0;;28586:2:1;49149:63:0;;;28568:21:1;28625:2;28605:18;;;28598:30;28664:33;28644:18;;;28637:61;28715:18;;49149:63:0;28384:355:1;49149:63:0;48425:1;49290:18;;49023:293::o;72876:340::-;72948:7;73066:1;73055:8;:12;;;73051:96;;;73096:12;73107:1;73096:8;:12;:::i;:::-;73089:20;;:2;:20;:::i;73051:96::-;-1:-1:-1;73164:1:0;;72876:340;-1:-1:-1;72876:340:0:o;68041:783::-;68143:16;;;;:11;:16;;;;;:23;;;;68114:26;;;;;:52;;68143:23;68114:52;:::i;:::-;68096:15;:70;68092:719;;;68179:18;68200:5;68206:3;68200:10;;;;;;;;:::i;:::-;;;;;;;;;68235:16;;;:11;:16;;;;;;;:20;68200:10;;;;;;;;-1:-1:-1;68235:20:0;;68231:500;;;68296:16;;;;:11;:16;;;;;:21;;;68272:20;;;:45;;68296:21;;68272:20;;:45;;68296:21;;68272:45;:::i;:::-;;;;-1:-1:-1;;68374:16:0;;;;:11;:16;;;;;:23;;;68350:20;;;;:47;68346:134;;68441:16;;;;:11;:16;;;;;:23;;;68418:20;;;:46;68346:134;68231:500;;;68536:16;;;;:11;:16;;;;;:21;;;68512:20;;;:45;;68536:21;;68512:20;;:45;;68536:21;;68512:45;:::i;:::-;;;;-1:-1:-1;;68614:16:0;;;;:11;:16;;;;;:23;;;68590:20;;;;:47;68586:134;;68681:16;;;;:11;:16;;;;;:23;;;68658:20;;;:46;68586:134;-1:-1:-1;68751:16:0;;;;:11;:16;;;;;68787:15;68751:52;;:26;;;;:52;68041:783::o;67532:495::-;67581:18;67602:5;67608:3;67602:10;;;;;;;;:::i;:::-;;;;;;;;;;;67581:31;;67625:19;67647:4;:14;;;67625:36;;67672:11;67687:1;67672:16;67668:29;;67690:7;;67532:495;:::o;67668:29::-;67705:26;67752:4;:14;;;67734:15;:32;;;;:::i;:::-;67705:61;;67777:18;67799:1;67777:23;67773:36;;67802:7;;;67532:495;:::o;67773:36::-;67877:16;;;;67823:13;;67877:22;;-1:-1:-1;;;67877:16:0;;;;67896:3;67877:22;:::i;:::-;67839:61;;67840:32;67854:18;67840:11;:32;:::i;:::-;67839:61;;;;:::i;:::-;67823:77;;67939:11;67931:5;:19;:45;;67957:19;67971:5;67957:11;:19;:::i;:::-;67931:45;;;67953:1;67931:45;67914:14;;;:62;-1:-1:-1;;;67983:40:0;68007:15;67983:40;:14;;;;:40;-1:-1:-1;67532:495:0:o;68832:1315::-;68890:13;68912:17;68932:5;68938:3;68932:10;;;;;;;;:::i;:::-;;;;;;;;;68912:30;;;;;;;;68932:10;;;;;;;68912:30;;-1:-1:-1;;;;;68912:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68912:30:0;;;;;;;;69040:52;;-1:-1:-1;;;69040:52:0;;;;68912:30;;-1:-1:-1;68912:30:0;69040:50;;:52;;;;68932:10;;69040:52;;;;;;68912:30;69040:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69017:75;;69099:19;69144:4;:15;;;-1:-1:-1;;;;;69121:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69099:73;;69237:17;69257:28;69281:3;69257:23;:28::i;:::-;69237:48;;69292:17;69312:15;69323:3;69312:10;:15::i;:::-;69292:35;-1:-1:-1;69488:19:0;69566:13;69544:19;69549:14;69544:2;:19;:::i;:::-;:35;;;;:::i;:::-;69537:43;;:2;:43;:::i;:::-;69511:21;69523:9;69511;:21;:::i;:::-;69510:71;;;;:::i;:::-;69488:93;-1:-1:-1;69781:4:0;69760:18;69781:4;69488:93;69760:18;:::i;:::-;:25;;;;:::i;:::-;69752:33;;69867:4;:17;;;69859:5;:25;69855:75;;;69905:4;:17;;;69897:25;;69855:75;70100:24;70120:4;-1:-1:-1;;70100:24:0;:::i;:::-;70091:5;:33;;70083:60;;;;-1:-1:-1;;;70083:60:0;;29351:2:1;70083:60:0;;;29333:21:1;29390:2;29370:18;;;29363:30;-1:-1:-1;;;29409:18:1;;;29402:44;29463:18;;70083:60:0;29149:338:1;70083:60:0;68905:1242;;;;;;68832:1315;;;:::o;9379:190::-;9507:53;;-1:-1:-1;;;;;29712:32:1;;;9507:53:0;;;29694:51:1;29781:32;;;29761:18;;;29754:60;29830:18;;;29823:34;;;9480:81:0;;9500:5;;9522:18;;;;;29667::1;;9507:53:0;29492:371:1;40166:158:0;40240:7;40291:22;40295:3;40307:5;40291:3;:22::i;40874:282::-;40937:16;40966:22;40991:19;40999:3;40991:7;:19::i;39695:117::-;39758:7;39785:19;39793:3;35023:18;;34940:109;26718:201;26807:22;26815:4;26821:7;26807;:22::i;:::-;26802:110;;26853:47;;-1:-1:-1;;;26853:47:0;;-1:-1:-1;;;;;28297:32:1;;26853:47:0;;;28279:51:1;28346:18;;;28339:34;;;28252:18;;26853:47:0;28105:274:1;15565:738:0;15646:18;15675:19;15815:4;15812:1;15805:4;15799:11;15792:4;15786;15782:15;15779:1;15772:5;15765;15760:60;15874:7;15864:180;;15919:4;15913:11;15965:16;15962:1;15957:3;15942:40;16012:16;16007:3;16000:29;15864:180;-1:-1:-1;;16123:1:0;16117:8;16072:16;;-1:-1:-1;16152:15:0;;:68;;16204:11;16219:1;16204:16;;16152:68;;;-1:-1:-1;;;;;16170:26:0;;;:31;16152:68;16148:148;;;16244:40;;-1:-1:-1;;;16244:40:0;;-1:-1:-1;;;;;7641:32:1;;16244:40:0;;;7623:51:1;7596:18;;16244:40:0;7477:203:1;29554:324:0;29631:4;29653:22;29661:4;29667:7;29653;:22::i;:::-;29648:223;;29692:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29692:29:0;;;;;;;;;:36;;-1:-1:-1;;29692:36:0;29724:4;29692:36;;;29775:12;22427:10;;22347:98;29775:12;-1:-1:-1;;;;;29748:40:0;29766:7;-1:-1:-1;;;;;29748:40:0;29760:4;29748:40;;;;;;;;;;-1:-1:-1;29810:4:0;29803:11;;29648:223;-1:-1:-1;29854:5:0;29847:12;;38870:152;38940:4;38964:50;38969:3;-1:-1:-1;;;;;38989:23:0;;38964:4;:50::i;30122:325::-;30200:4;30221:22;30229:4;30235:7;30221;:22::i;:::-;30217:223;;;30292:5;30260:12;;;;;;;;;;;-1:-1:-1;;;;;30260:29:0;;;;;;;;;;:37;;-1:-1:-1;;30260:37:0;;;30317:40;22427:10;;30260:12;;30317:40;;30292:5;30317:40;-1:-1:-1;30379:4:0;30372:11;;39198:158;39271:4;39295:53;39303:3;-1:-1:-1;;;;;39323:23:0;;39295:7;:53::i;71228:1580::-;71297:7;71313:17;71333:5;71339:3;71333:10;;;;;;;;:::i;:::-;;;;;;;;;71313:30;;;;;;;;71333:10;;;;;;;71313:30;;-1:-1:-1;;;;;71313:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71313:30:0;;;;;;;;71377:16;;;;;;;;;71350:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71449:20;71313:30;;-1:-1:-1;71350:43:0;71547:15;71389:3;71547:10;:15::i;:::-;71520:42;;71569:26;71616:4;:13;;;71598:31;;:15;:31;:89;;71686:1;71598:89;;;71660:13;;;;71642:31;;;;:15;:31;:::i;:::-;71569:118;;71792:25;71848:4;:12;;;71821:16;71840:4;71821:23;;;;:::i;:::-;71820:40;;;;:::i;:::-;71792:68;-1:-1:-1;71904:19:0;71958:22;:18;71979:1;71958:22;:::i;:::-;71927:26;71936:17;71927:6;:26;:::i;:::-;71926:55;;;;:::i;:::-;71904:77;;72097:10;:17;;;72074:10;:20;;;:40;;;;:::i;:::-;72055:15;:59;72051:633;;72131:14;;72127:550;;;72216:15;;;;72206:25;;;;:::i;:::-;;;72315:10;:17;;;72306:6;:26;72302:93;;;72362:10;:17;;;72353:26;;72302:93;72127:550;;;72481:15;;;;72471:25;;;;:::i;:::-;;;72586:10;:17;;;72577:6;:26;72573:93;;;72633:10;:17;;;72624:26;;72573:93;72725:11;72716:6;:20;72712:72;;;72756:20;72765:11;72756:6;:20;:::i;:::-;72749:27;71228:1580;-1:-1:-1;;;;;;;;;71228:1580:0:o;72712:72::-;-1:-1:-1;72803:1:0;;71228:1580;-1:-1:-1;;;;;;;;71228:1580:0:o;70317:898::-;70373:7;70393:17;70413:5;70419:3;70413:10;;;;;;;;:::i;:::-;;;;;;;;;70393:30;;;;;;;;70413:10;;;;;;;70393:30;;-1:-1:-1;;;;;70393:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70393:30:0;;;;;;;;70509:51;;-1:-1:-1;;;70509:51:0;;;;70393:30;;-1:-1:-1;70393:30:0;70509:49;;:51;;;;70413:10;;70509:51;;;;;;70393:30;70509:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70481:80;;70568:20;70620:4;:16;;;-1:-1:-1;;;;;70597:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70568:82;-1:-1:-1;70732:17:0;70775:19;70568:82;70775:2;:19;:::i;:::-;70770:25;;:2;:25;:::i;:::-;70752:4;:14;;;:44;;;;:::i;:::-;70732:64;-1:-1:-1;70862:20:0;70918:18;70923:13;70918:2;:18;:::i;:::-;70911:26;;:2;:26;:::i;:::-;70885:4;:22;;;:53;;;;:::i;:::-;70862:76;;70988:12;71004:1;70988:17;70984:55;;-1:-1:-1;71026:4:0;;70317:898;-1:-1:-1;;;;;;70317:898:0:o;70984:55::-;71129:17;71170:12;71150:16;:9;71162:4;71150:16;:::i;:::-;71149:33;;;;:::i;35403:120::-;35470:7;35497:3;:11;;35509:5;35497:18;;;;;;;;:::i;:::-;;;;;;;;;35490:25;;35403:120;;;;:::o;36073:111::-;36129:16;36165:3;:11;;36158:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36073:111;;;:::o;32645:416::-;32708:4;34820:21;;;:14;;;:21;;;;;;32725:329;;-1:-1:-1;32768:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;32953:18;;32929:21;;;:14;;;:21;;;;;;:42;;;;32986:11;;33237:1400;33303:4;33434:21;;;:14;;;:21;;;;;;33472:13;;33468:1162;;33845:18;33866:12;33877:1;33866:8;:12;:::i;:::-;33913:18;;33845:33;;-1:-1:-1;33893:17:0;;33913:22;;33934:1;;33913:22;:::i;:::-;33893:42;;33970:9;33956:10;:23;33952:385;;34000:17;34020:3;:11;;34032:9;34020:22;;;;;;;;:::i;:::-;;;;;;;;;34000:42;;34170:9;34144:3;:11;;34156:10;34144:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34285:25;;;:14;;;:25;;;;;:36;;;33952:385;34418:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34524:3;:14;;:21;34539:5;34524:21;;;;;;;;;;;34517:28;;;34569:4;34562:11;;;;;;;33468:1162;34613:5;34606:12;;;;;-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;1519:18;1511:6;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;1722:18;1714:6;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;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;;10842:18;10827:34;;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;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
Swarm Source
ipfs://e9ee73769890ae37b3176764a96d7274917b61073a03027340f4b3b7e4f9aede
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.