Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
7 addresses found via
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12412175 | 866 days 2 hrs ago | IN | Create: HAaveProtocolV2 | 0 ETH | 0.61650594 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HAaveProtocolV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-11 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/interface/IProxy.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IProxy { function batchExec(address[] calldata tos, bytes32[] calldata configs, bytes[] memory datas) external payable; function execs(address[] calldata tos, bytes32[] calldata configs, bytes[] memory datas) external payable; } // File: contracts/interface/IERC20Usdt.sol pragma solidity ^0.6.0; interface IERC20Usdt { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external; function transferFrom(address sender, address recipient, uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/Config.sol pragma solidity ^0.6.0; contract Config { // function signature of "postProcess()" bytes4 public constant POSTPROCESS_SIG = 0xc2722916; // The base amount of percentage function uint256 public constant PERCENTAGE_BASE = 1 ether; // Handler post-process type. Others should not happen now. enum HandlerType {Token, Custom, Others} } // File: contracts/lib/LibCache.sol pragma solidity ^0.6.0; library LibCache { function set( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, bytes32 _value ) internal { _cache[_key] = _value; } function setAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, address _value ) internal { _cache[_key] = bytes32(uint256(uint160(_value))); } function setUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key, uint256 _value ) internal { _cache[_key] = bytes32(_value); } function getAddress( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (address ret) { ret = address(uint160(uint256(_cache[_key]))); } function getUint256( mapping(bytes32 => bytes32) storage _cache, bytes32 _key ) internal view returns (uint256 ret) { ret = uint256(_cache[_key]); } function get(mapping(bytes32 => bytes32) storage _cache, bytes32 _key) internal view returns (bytes32 ret) { ret = _cache[_key]; } } // File: contracts/lib/LibStack.sol pragma solidity ^0.6.0; library LibStack { function setAddress(bytes32[] storage _stack, address _input) internal { _stack.push(bytes32(uint256(uint160(_input)))); } function set(bytes32[] storage _stack, bytes32 _input) internal { _stack.push(_input); } function setHandlerType(bytes32[] storage _stack, Config.HandlerType _input) internal { _stack.push(bytes12(uint96(_input))); } function getAddress(bytes32[] storage _stack) internal returns (address ret) { ret = address(uint160(uint256(peek(_stack)))); _stack.pop(); } function getSig(bytes32[] storage _stack) internal returns (bytes4 ret) { ret = bytes4(peek(_stack)); _stack.pop(); } function get(bytes32[] storage _stack) internal returns (bytes32 ret) { ret = peek(_stack); _stack.pop(); } function peek(bytes32[] storage _stack) internal view returns (bytes32 ret) { require(_stack.length > 0, "stack empty"); ret = _stack[_stack.length - 1]; } } // File: contracts/Storage.sol pragma solidity ^0.6.0; /// @notice A cache structure composed by a bytes32 array contract Storage { using LibCache for mapping(bytes32 => bytes32); using LibStack for bytes32[]; bytes32[] public stack; mapping(bytes32 => bytes32) public cache; // keccak256 hash of "msg.sender" // prettier-ignore bytes32 public constant MSG_SENDER_KEY = 0xb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a; // keccak256 hash of "cube.counter" // prettier-ignore bytes32 public constant CUBE_COUNTER_KEY = 0xf9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be; modifier isStackEmpty() { require(stack.length == 0, "Stack not empty"); _; } modifier isCubeCounterZero() { require(_getCubeCounter() == 0, "Cube counter not zero"); _; } modifier isInitialized() { require(_getSender() != address(0), "Sender is not initialized"); _; } modifier isNotInitialized() { require(_getSender() == address(0), "Sender is initialized"); _; } function _setSender() internal isNotInitialized { cache.setAddress(MSG_SENDER_KEY, msg.sender); } function _resetSender() internal { cache.setAddress(MSG_SENDER_KEY, address(0)); } function _getSender() internal view returns (address) { return cache.getAddress(MSG_SENDER_KEY); } function _addCubeCounter() internal { cache.setUint256(CUBE_COUNTER_KEY, _getCubeCounter() + 1); } function _resetCubeCounter() internal { cache.setUint256(CUBE_COUNTER_KEY, 0); } function _getCubeCounter() internal view returns (uint256) { return cache.getUint256(CUBE_COUNTER_KEY); } } // File: contracts/handlers/HandlerBase.sol pragma solidity ^0.6.0; abstract contract HandlerBase is Storage, Config { using SafeERC20 for IERC20; function postProcess() external payable virtual { revert("Invalid post process"); /* Implementation template bytes4 sig = stack.getSig(); if (sig == bytes4(keccak256(bytes("handlerFunction_1()")))) { // Do something } else if (sig == bytes4(keccak256(bytes("handlerFunction_2()")))) { bytes32 temp = stack.get(); // Do something } else revert("Invalid post process"); */ } function _updateToken(address token) internal { stack.setAddress(token); // Ignore token type to fit old handlers // stack.setHandlerType(uint256(HandlerType.Token)); } function _updatePostProcess(bytes32[] memory params) internal { for (uint256 i = params.length; i > 0; i--) { stack.set(params[i - 1]); } stack.set(msg.sig); stack.setHandlerType(HandlerType.Custom); } function getContractName() public pure virtual returns (string memory); function _revertMsg(string memory functionName, string memory reason) internal view { revert( string( abi.encodePacked( _uint2String(_getCubeCounter()), "_", getContractName(), "_", functionName, ": ", reason ) ) ); } function _revertMsg(string memory functionName) internal view { _revertMsg(functionName, "Unspecified"); } function _uint2String(uint256 n) internal pure returns (string memory) { if (n == 0) { return "0"; } else { uint256 len = 0; for (uint256 temp = n; temp > 0; temp /= 10) { len++; } bytes memory str = new bytes(len); for (uint256 i = len; i > 0; i--) { str[i - 1] = bytes1(uint8(48 + (n % 10))); n /= 10; } return string(str); } } function _getBalance(address token, uint256 amount) internal view returns (uint256) { if (amount != uint256(-1)) { return amount; } // ETH case if ( token == address(0) || token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) ) { return address(this).balance; } // ERC20 token case return IERC20(token).balanceOf(address(this)); } function _tokenApprove( address token, address spender, uint256 amount ) internal { try IERC20Usdt(token).approve(spender, amount) {} catch { IERC20(token).safeApprove(spender, 0); IERC20(token).safeApprove(spender, amount); } } } // File: contracts/handlers/weth/IWETH9.sol pragma solidity ^0.6.0; interface IWETH9 { fallback() external payable; function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/handlers/aavev2/ILendingPoolAddressesProviderV2.sol pragma solidity 0.6.12; /** * @title LendingPoolAddressesProvider contract * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles * - Acting also as factory of proxies and admin of those, so with right to change its implementations * - Owned by the Aave Governance * @author Aave **/ interface ILendingPoolAddressesProviderV2 { event MarketIdSet(string newMarketId); event LendingPoolUpdated(address indexed newAddress); event ConfigurationAdminUpdated(address indexed newAddress); event EmergencyAdminUpdated(address indexed newAddress); event LendingPoolConfiguratorUpdated(address indexed newAddress); event LendingPoolCollateralManagerUpdated(address indexed newAddress); event PriceOracleUpdated(address indexed newAddress); event LendingRateOracleUpdated(address indexed newAddress); event ProxyCreated(bytes32 id, address indexed newAddress); event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy); function getMarketId() external view returns (string memory); function setMarketId(string calldata marketId) external; function setAddress(bytes32 id, address newAddress) external; function setAddressAsProxy(bytes32 id, address impl) external; function getAddress(bytes32 id) external view returns (address); function getLendingPool() external view returns (address); function setLendingPoolImpl(address pool) external; function getLendingPoolConfigurator() external view returns (address); function setLendingPoolConfiguratorImpl(address configurator) external; function getLendingPoolCollateralManager() external view returns (address); function setLendingPoolCollateralManager(address manager) external; function getPoolAdmin() external view returns (address); function setPoolAdmin(address admin) external; function getEmergencyAdmin() external view returns (address); function setEmergencyAdmin(address admin) external; function getPriceOracle() external view returns (address); function setPriceOracle(address priceOracle) external; function getLendingRateOracle() external view returns (address); function setLendingRateOracle(address lendingRateOracle) external; } // File: contracts/handlers/aavev2/libraries/DataTypes.sol pragma solidity 0.6.12; library DataTypes { // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties. struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; //the current stable borrow rate. Expressed in ray uint128 currentStableBorrowRate; uint40 lastUpdateTimestamp; //tokens addresses address aTokenAddress; address stableDebtTokenAddress; address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //the id of the reserve. Represents the position in the list of the active reserves uint8 id; } struct ReserveConfigurationMap { //bit 0-15: LTV //bit 16-31: Liq. threshold //bit 32-47: Liq. bonus //bit 48-55: Decimals //bit 56: Reserve is active //bit 57: reserve is frozen //bit 58: borrowing is enabled //bit 59: stable rate borrowing enabled //bit 60-63: reserved //bit 64-79: reserve factor uint256 data; } struct UserConfigurationMap { uint256 data; } enum InterestRateMode {NONE, STABLE, VARIABLE} } // File: contracts/handlers/aavev2/ILendingPoolV2.sol pragma solidity 0.6.12; interface ILendingPoolV2 { /** * @dev Emitted on deposit() * @param reserve The address of the underlying asset of the reserve * @param user The address initiating the deposit * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens * @param amount The amount deposited * @param referral The referral code used **/ event Deposit( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint16 indexed referral ); /** * @dev Emitted on withdraw() * @param reserve The address of the underlyng asset being withdrawn * @param user The address initiating the withdrawal, owner of aTokens * @param to Address that will receive the underlying * @param amount The amount to be withdrawn **/ event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); /** * @dev Emitted on borrow() and flashLoan() when debt needs to be opened * @param reserve The address of the underlying asset being borrowed * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just * initiator of the transaction on flashLoan() * @param onBehalfOf The address that will be getting the debt * @param amount The amount borrowed out * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable * @param borrowRate The numeric rate at which the user has borrowed * @param referral The referral code used **/ event Borrow( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint256 borrowRateMode, uint256 borrowRate, uint16 indexed referral ); /** * @dev Emitted on repay() * @param reserve The address of the underlying asset of the reserve * @param user The beneficiary of the repayment, getting his debt reduced * @param repayer The address of the user initiating the repay(), providing the funds * @param amount The amount repaid **/ event Repay( address indexed reserve, address indexed user, address indexed repayer, uint256 amount ); /** * @dev Emitted on swapBorrowRateMode() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user swapping his rate mode * @param rateMode The rate mode that the user wants to swap to **/ event Swap(address indexed reserve, address indexed user, uint256 rateMode); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); /** * @dev Emitted on rebalanceStableBorrowRate() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user for which the rebalance has been executed **/ event RebalanceStableBorrowRate(address indexed reserve, address indexed user); /** * @dev Emitted on flashLoan() * @param target The address of the flash loan receiver contract * @param initiator The address initiating the flash loan * @param asset The address of the asset being flash borrowed * @param amount The amount flash borrowed * @param premium The fee flash borrowed * @param referralCode The referral code used **/ event FlashLoan( address indexed target, address indexed initiator, address indexed asset, uint256 amount, uint256 premium, uint16 referralCode ); /** * @dev Emitted when the pause is triggered. */ event Paused(); /** * @dev Emitted when the pause is lifted. */ event Unpaused(); /** * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via * LendingPoolCollateral manager using a DELEGATECALL * This allows to have the events in the generated ABI for LendingPool. * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator * @param liquidator The address of the liquidator * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, address indexed user, uint256 debtToCover, uint256 liquidatedCollateralAmount, address liquidator, bool receiveAToken ); /** * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal, * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it * gets added to the LendingPool ABI * @param reserve The address of the underlying asset of the reserve * @param liquidityRate The new liquidity rate * @param stableBorrowRate The new stable borrow rate * @param variableBorrowRate The new variable borrow rate * @param liquidityIndex The new liquidity index * @param variableBorrowIndex The new variable borrow index **/ event ReserveDataUpdated( address indexed reserve, uint256 liquidityRate, uint256 stableBorrowRate, uint256 variableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex ); /** * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. * - E.g. User deposits 100 USDC and gets in return 100 aUSDC * @param asset The address of the underlying asset to deposit * @param amount The amount to be deposited * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens * is a different wallet * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function deposit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; /** * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC * @param asset The address of the underlying asset to withdraw * @param amount The underlying amount to be withdrawn * - Send the value type(uint256).max in order to withdraw the whole aToken balance * @param to Address that will receive the underlying, same as msg.sender if the user * wants to receive it on his own wallet, or a different address if the beneficiary is a * different wallet * @return The final amount withdrawn **/ function withdraw( address asset, uint256 amount, address to ) external returns (uint256); /** * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower * already deposited enough collateral, or he was given enough allowance by a credit delegator on the * corresponding debt token (StableDebtToken or VariableDebtToken) * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet * and 100 stable/variable debt tokens, depending on the `interestRateMode` * @param asset The address of the underlying asset to borrow * @param amount The amount to be borrowed * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator * if he has been given credit delegation allowance **/ function borrow( address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf ) external; /** * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address * @param asset The address of the borrowed underlying asset previously borrowed * @param amount The amount to repay * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the * user calling the function if he wants to reduce/remove his own debt, or the address of any other * other borrower whose debt should be removed * @return The final amount repaid **/ function repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) external returns (uint256); /** * @dev Allows a borrower to swap his debt between stable and variable mode, or viceversa * @param asset The address of the underlying asset borrowed * @param rateMode The rate mode that the user wants to swap to **/ function swapBorrowRateMode(address asset, uint256 rateMode) external; /** * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. * - Users can be rebalanced if the following conditions are satisfied: * 1. Usage ratio is above 95% * 2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been * borrowed at a stable rate and depositors are not earning enough * @param asset The address of the underlying asset borrowed * @param user The address of the user to be rebalanced **/ function rebalanceStableBorrowRate(address asset, address user) external; /** * @dev Allows depositors to enable/disable a specific deposited asset as collateral * @param asset The address of the underlying asset deposited * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise **/ function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; /** * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ function liquidationCall( address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken ) external; /** * @dev Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration. * For further details please visit https://developers.aave.com * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface * @param assets The addresses of the assets being flash-borrowed * @param amounts The amounts amounts being flash-borrowed * @param modes Types of the debt to open if the flash loan is not returned: * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 * @param params Variadic packed params to pass to the receiver as extra information * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function flashLoan( address receiverAddress, address[] calldata assets, uint256[] calldata amounts, uint256[] calldata modes, address onBehalfOf, bytes calldata params, uint16 referralCode ) external; /** * @dev Returns the user account data across all the reserves * @param user The address of the user * @return totalCollateralETH the total collateral in ETH of the user * @return totalDebtETH the total debt in ETH of the user * @return availableBorrowsETH the borrowing power left of the user * @return currentLiquidationThreshold the liquidation threshold of the user * @return ltv the loan to value of the user * @return healthFactor the current health factor of the user **/ function getUserAccountData(address user) external view returns ( uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor ); function initReserve( address reserve, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress ) external; function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external; function setConfiguration(address reserve, uint256 configuration) external; /** * @dev Returns the configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The configuration of the reserve **/ function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory); /** * @dev Returns the configuration of the user across all the reserves * @param user The user address * @return The configuration of the user **/ function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory); /** * @dev Returns the normalized income normalized income of the reserve * @param asset The address of the underlying asset of the reserve * @return The reserve's normalized income */ function getReserveNormalizedIncome(address asset) external view returns (uint256); /** * @dev Returns the normalized variable debt per unit of asset * @param asset The address of the underlying asset of the reserve * @return The reserve normalized variable debt */ function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); /** * @dev Returns the state and configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The state of the reserve **/ function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); function finalizeTransfer( address asset, address from, address to, uint256 amount, uint256 balanceFromAfter, uint256 balanceToBefore ) external; function getReservesList() external view returns (address[] memory); function getAddressesProvider() external view returns (ILendingPoolAddressesProviderV2); function setPause(bool val) external; function paused() external view returns (bool); } // File: contracts/handlers/aavev2/IFlashLoanReceiver.sol pragma solidity ^0.6.0; interface IFlashLoanReceiver { function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external returns (bool); } // File: contracts/handlers/aavev2/HAaveProtocolV2.sol pragma solidity ^0.6.0; contract HAaveProtocolV2 is HandlerBase, IFlashLoanReceiver { using SafeERC20 for IERC20; using SafeMath for uint256; // prettier-ignore address public constant PROVIDER = 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5; // prettier-ignore address payable public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // prettier-ignore address payable public constant ETHER = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint16 public constant REFERRAL_CODE = 56; function getContractName() public pure override returns (string memory) { return "HAaveProtocolV2"; } function deposit(address asset, uint256 amount) external payable { amount = _getBalance(asset, amount); _deposit(asset, amount); } function depositETH(uint256 amount) external payable { amount = _getBalance(ETHER, amount); IWETH9(WETH).deposit{value: amount}(); _deposit(WETH, amount); _updateToken(WETH); } function withdraw(address asset, uint256 amount) external payable returns (uint256 withdrawAmount) { withdrawAmount = _withdraw(asset, amount); _updateToken(asset); } function withdrawETH(uint256 amount) external payable returns (uint256 withdrawAmount) { withdrawAmount = _withdraw(WETH, amount); IWETH9(WETH).withdraw(withdrawAmount); } function repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) external payable returns (uint256 remainDebt) { remainDebt = _repay(asset, amount, rateMode, onBehalfOf); } function repayETH( uint256 amount, uint256 rateMode, address onBehalfOf ) external payable returns (uint256 remainDebt) { IWETH9(WETH).deposit{value: amount}(); remainDebt = _repay(WETH, amount, rateMode, onBehalfOf); _updateToken(WETH); } function borrow( address asset, uint256 amount, uint256 rateMode ) external payable { address onBehalfOf = _getSender(); _borrow(asset, amount, rateMode, onBehalfOf); _updateToken(asset); } function borrowETH(uint256 amount, uint256 rateMode) external payable { address onBehalfOf = _getSender(); _borrow(WETH, amount, rateMode, onBehalfOf); IWETH9(WETH).withdraw(amount); } function flashLoan( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata modes, bytes calldata params ) external payable { if (assets.length != amounts.length) { _revertMsg("flashLoan", "assets and amounts do not match"); } if (assets.length != modes.length) { _revertMsg("flashLoan", "assets and modes do not match"); } address onBehalfOf = _getSender(); address pool = ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool(); try ILendingPoolV2(pool).flashLoan( address(this), assets, amounts, modes, onBehalfOf, params, REFERRAL_CODE ) {} catch Error(string memory reason) { _revertMsg("flashLoan", reason); } catch { _revertMsg("flashLoan"); } // approve lending pool zero for (uint256 i = 0; i < assets.length; i++) { IERC20(assets[i]).safeApprove(pool, 0); if (modes[i] != 0) _updateToken(assets[i]); } } function executeOperation( address[] memory assets, uint256[] memory amounts, uint256[] memory premiums, address initiator, bytes memory params ) external override returns (bool) { if ( msg.sender != ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool() ) { _revertMsg("executeOperation", "invalid caller"); } if (initiator != address(this)) { _revertMsg("executeOperation", "not initiated by the proxy"); } (address[] memory tos, bytes32[] memory configs, bytes[] memory datas) = abi.decode(params, (address[], bytes32[], bytes[])); IProxy(address(this)).execs(tos, configs, datas); address pool = ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool(); for (uint256 i = 0; i < assets.length; i++) { uint256 amountOwing = amounts[i].add(premiums[i]); IERC20(assets[i]).safeApprove(pool, amountOwing); } return true; } /* ========== INTERNAL FUNCTIONS ========== */ function _deposit(address asset, uint256 amount) internal { (address pool, address aToken) = _getLendingPoolAndAToken(asset); IERC20(asset).safeApprove(pool, amount); try ILendingPoolV2(pool).deposit( asset, amount, address(this), REFERRAL_CODE ) {} catch Error(string memory reason) { _revertMsg("deposit", reason); } catch { _revertMsg("deposit"); } IERC20(asset).safeApprove(pool, 0); _updateToken(aToken); } function _withdraw(address asset, uint256 amount) internal returns (uint256 withdrawAmount) { (address pool, address aToken) = _getLendingPoolAndAToken(asset); amount = _getBalance(aToken, amount); try ILendingPoolV2(pool).withdraw(asset, amount, address(this)) returns (uint256 ret) { withdrawAmount = ret; } catch Error(string memory reason) { _revertMsg("withdraw", reason); } catch { _revertMsg("withdraw"); } } function _repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) internal returns (uint256 remainDebt) { address pool = ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool(); IERC20(asset).safeApprove(pool, amount); try ILendingPoolV2(pool).repay(asset, amount, rateMode, onBehalfOf) {} catch Error(string memory reason) { _revertMsg("repay", reason); } catch { _revertMsg("repay"); } IERC20(asset).safeApprove(pool, 0); DataTypes.ReserveData memory reserve = ILendingPoolV2(pool).getReserveData(asset); remainDebt = DataTypes.InterestRateMode(rateMode) == DataTypes.InterestRateMode.STABLE ? IERC20(reserve.stableDebtTokenAddress).balanceOf(onBehalfOf) : IERC20(reserve.variableDebtTokenAddress).balanceOf(onBehalfOf); } function _borrow( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) internal { address pool = ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool(); try ILendingPoolV2(pool).borrow( asset, amount, rateMode, REFERRAL_CODE, onBehalfOf ) {} catch Error(string memory reason) { _revertMsg("borrow", reason); } catch { _revertMsg("borrow"); } } function _getLendingPoolAndAToken(address underlying) internal view returns (address pool, address aToken) { pool = ILendingPoolAddressesProviderV2(PROVIDER).getLendingPool(); try ILendingPoolV2(pool).getReserveData(underlying) returns ( DataTypes.ReserveData memory data ) { aToken = data.aTokenAddress; if (aToken == address(0)) _revertMsg("General", "aToken should not be zero address"); } catch Error(string memory reason) { _revertMsg("General", reason); } catch { _revertMsg("General"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"CUBE_COUNTER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETHER","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MSG_SENDER_KEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POSTPROCESS_SIG","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVIDER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFERRAL_CODE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rateMode","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rateMode","type":"uint256"}],"name":"borrowETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cache","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"modes","type":"uint256[]"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"postProcess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rateMode","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"repay","outputs":[{"internalType":"uint256","name":"remainDebt","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rateMode","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"repayETH","outputs":[{"internalType":"uint256","name":"remainDebt","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stack","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612b75806100206000396000f3fe6080604052600436106101345760003560e01c8063920f5c84116100ab578063dc9031c41161006f578063dc9031c4146102c5578063f14210a6146102e5578063f3fef3a3146102f8578063f538ba511461030b578063f5f5ba721461031e578063fa2901a51461034057610134565b8063920f5c841461024857806399eb59b914610275578063ad5c464814610295578063c1bce0b7146102aa578063c2722916146102bd57610134565b806347e7ef24116100fd57806347e7ef24146101d25780635358fbda146101e757806354296154146101fa578063573ade811461020d5780636fab3b731461022057806387c139431461023357610134565b8062d34411146101395780630f532d18146101645780631413dc7d146101865780633583849a1461019b57806342cb1fbc146101bd575b600080fd5b34801561014557600080fd5b5061014e610362565b60405161015b91906125b0565b60405180910390f35b34801561017057600080fd5b5061017961037a565b60405161015b9190612805565b34801561019257600080fd5b5061017961039e565b3480156101a757600080fd5b506101b06103c2565b60405161015b91906129b8565b3480156101c957600080fd5b5061014e6103c7565b6101e56101e0366004611edd565b6103df565b005b6101e56101f536600461228f565b6103f9565b6101e5610208366004611f85565b6104bf565b61017961021b366004611f3c565b61079b565b6101e561022e3660046123ba565b6107b2565b34801561023f57600080fd5b5061017961084c565b34801561025457600080fd5b50610268610263366004612153565b610858565b60405161015b91906127fa565b34801561028157600080fd5b5061017961029036600461228f565b610b5d565b3480156102a157600080fd5b5061014e610b6f565b6101e56102b8366004611f08565b610b87565b6101e5610bae565b3480156102d157600080fd5b506101796102e036600461228f565b610bcf565b6101796102f336600461228f565b610bed565b610179610306366004611edd565b610c7e565b6101796103193660046123db565b610c9b565b34801561032a57600080fd5b50610333610d4b565b60405161015b9190612823565b34801561034c57600080fd5b50610355610d75565b60405161015b919061280e565b73b53c1a33016b2dc2ff3653530bff1848a515c8c581565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b603881565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6103e98282610d80565b90506103f58282610e4c565b5050565b61041773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82610d80565b905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561046857600080fd5b505af115801561047c573d6000803e3d6000fd5b505050505061049f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282610e4c565b6104bc73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610f57565b50565b8685146105265761052660405180604001604052806009815260200168333630b9b42637b0b760b91b8152506040518060400160405280601f81526020017f61737365747320616e6420616d6f756e747320646f206e6f74206d6174636800815250610f62565b86831461058d5761058d60405180604001604052806009815260200168333630b9b42637b0b760b91b8152506040518060400160405280601d81526020017f61737365747320616e64206d6f64657320646f206e6f74206d61746368000000815250610f62565b6000610597610fb5565b9050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105e857600080fd5b505afa1580156105fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106209190611ec1565b60405163ab9c4b5d60e01b81529091506001600160a01b0382169063ab9c4b5d906106649030908e908e908e908e908e908e908c908f908f906038906004016125de565b600060405180830381600087803b15801561067e57600080fd5b505af192505050801561068f575060015b6107015761069b612a64565b806106a657506106d7565b6106d160405180604001604052806009815260200168333630b9b42637b0b760b91b81525082610f62565b50610701565b61070160405180604001604052806009815260200168333630b9b42637b0b760b91b815250610fe7565b60005b8981101561078e576107438260008d8d8581811061071e57fe5b90506020020160208101906107339190611ea5565b6001600160a01b03169190611014565b86868281811061074f57fe5b90506020020135600014610786576107868b8b8381811061076c57fe5b90506020020160208101906107819190611ea5565b610f57565b600101610704565b5050505050505050505050565b60006107a985858585611113565b95945050505050565b60006107bc610fb5565b90506107de73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc284848461146a565b604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90610815908690600401612805565b600060405180830381600087803b15801561082f57600080fd5b505af1158015610843573d6000803e3d6000fd5b50505050505050565b670de0b6b3a764000081565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a757600080fd5b505afa1580156108bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df9190611ec1565b6001600160a01b0316336001600160a01b03161461094f5761094f6040518060400160405280601081526020016f32bc32b1baba32a7b832b930ba34b7b760811b8152506040518060400160405280600e81526020016d34b73b30b634b21031b0b63632b960911b815250610f62565b6001600160a01b03831630146109c6576109c66040518060400160405280601081526020016f32bc32b1baba32a7b832b930ba34b7b760811b8152506040518060400160405280601a81526020017f6e6f7420696e69746961746564206279207468652070726f7879000000000000815250610f62565b6060806060848060200190518101906109df919061206e565b604051637193850960e01b815292955090935091503090637193850990610a0e90869086908690600401612766565b600060405180830381600087803b158015610a2857600080fd5b505af1158015610a3c573d6000803e3d6000fd5b50505050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8f57600080fd5b505afa158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac79190611ec1565b905060005b8a51811015610b4c576000610b108a8381518110610ae657fe5b60200260200101518c8481518110610afa57fe5b60200260200101516115c790919063ffffffff16565b9050610b4383828e8581518110610b2357fe5b60200260200101516001600160a01b03166110149092919063ffffffff16565b50600101610acc565b5060019a9950505050505050505050565b60016020526000908152604090205481565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000610b91610fb5565b9050610b9f8484848461146a565b610ba884610f57565b50505050565b60405162461bcd60e51b8152600401610bc6906128b3565b60405180910390fd5b60008181548110610bdc57fe5b600091825260209091200154905081565b6000610c0d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836115ec565b604051632e1a7d4d60e01b815290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90610c47908490600401612805565b600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050919050565b6000610c8a83836115ec565b9050610c9583610f57565b92915050565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b5050505050610d2573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858585611113565b9050610d4473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610f57565b9392505050565b60408051808201909152600f81526e2420b0bb32a83937ba37b1b7b62b1960891b60208201525b90565b636139148b60e11b81565b60006000198214610d92575080610c95565b6001600160a01b0383161580610dc457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610dd0575047610c95565b6040516370a0823160e01b81526001600160a01b038416906370a0823190610dfc9030906004016125b0565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4491906123a2565b600080610e5884611705565b9092509050610e716001600160a01b0385168385611014565b60405163e8eda9df60e01b81526001600160a01b0383169063e8eda9df90610ea4908790879030906038906004016126da565b600060405180830381600087803b158015610ebe57600080fd5b505af1925050508015610ecf575060015b610f3d57610edb612a64565b80610ee65750610f15565b610f0f6040518060400160405280600781526020016619195c1bdcda5d60ca1b81525082610f62565b50610f3d565b610f3d6040518060400160405280600781526020016619195c1bdcda5d60ca1b815250610fe7565b610f526001600160a01b038516836000611014565b610ba8815b6104bc6000826118d5565b610f72610f6d6118f7565b611924565b610f7a610d4b565b8383604051602001610f8f9493929190612532565b60408051601f198184030181529082905262461bcd60e51b8252610bc691600401612823565b6000610fe260017fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a611a01565b905090565b6104bc816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b815250610f62565b80158061109c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061104a90309086906004016125c4565b60206040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a91906123a2565b155b6110b85760405162461bcd60e51b8152600401610bc690612962565b61110e8363095ea7b360e01b84846040516024016110d792919061269e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a14565b505050565b60008073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116357600080fd5b505afa158015611177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119b9190611ec1565b90506111b16001600160a01b0387168287611014565b60405163573ade8160e01b81526001600160a01b0382169063573ade81906111e3908990899089908990600401612707565b602060405180830381600087803b1580156111fd57600080fd5b505af192505050801561122d575060408051601f3d908101601f1916820190925261122a918101906123a2565b60015b61129c57611239612a64565b806112445750611271565b61126b60405180604001604052806005815260200164726570617960d81b81525082610f62565b50611297565b61129760405180604001604052806005815260200164726570617960d81b815250610fe7565b61129e565b505b6112b36001600160a01b038716826000611014565b6112bb611baf565b6040516335ea6a7560e01b81526001600160a01b038316906335ea6a75906112e7908a906004016125b0565b6101806040518083038186803b15801561130057600080fd5b505afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133891906122a7565b9050600185600281111561134857fe5b600281111561135357fe5b146113de578061012001516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040161138991906125b0565b60206040518083038186803b1580156113a157600080fd5b505afa1580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906123a2565b61145f565b8061010001516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040161140f91906125b0565b60206040518083038186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f91906123a2565b979650505050505050565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f19190611ec1565b60405163a415bcad60e01b81529091506001600160a01b0382169063a415bcad90611529908890889088906038908990600401612732565b600060405180830381600087803b15801561154357600080fd5b505af1925050508015611554575060015b6115c057611560612a64565b8061156b5750611599565b61159360405180604001604052806006815260200165626f72726f7760d01b81525082610f62565b506115c0565b6115c060405180604001604052806006815260200165626f72726f7760d01b815250610fe7565b5050505050565b600082820183811015610d445760405162461bcd60e51b8152600401610bc690612836565b60008060006115fa85611705565b915091506116088185610d80565b604051631a4ca37b60e21b81529094506001600160a01b038316906369328dec9061163b908890889030906004016126b7565b602060405180830381600087803b15801561165557600080fd5b505af1925050508015611685575060408051601f3d908101601f19168201909252611682918101906123a2565b60015b6116fa57611691612a64565b8061169c57506116cc565b6116c660405180604001604052806008815260200167776974686472617760c01b81525082610f62565b506116f5565b6116f560405180604001604052806008815260200167776974686472617760c01b815250610fe7565b6116fd565b92505b505092915050565b60008073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561175557600080fd5b505afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190611ec1565b6040516335ea6a7560e01b81529092506001600160a01b038316906335ea6a75906117bc9086906004016125b0565b6101806040518083038186803b1580156117d557600080fd5b505afa925050508015611805575060408051601f3d908101601f19168201909252611802918101906122a7565b60015b61187857611811612a64565b8061181c575061184b565b6118456040518060400160405280600781526020016611d95b995c985b60ca1b81525082610f62565b50611873565b6118736040518060400160405280600781526020016611d95b995c985b60ca1b815250610fe7565b6118d0565b60e081015191506001600160a01b0382166118ce576118ce6040518060400160405280600781526020016611d95b995c985b60ca1b815250604051806060016040528060218152602001612b1f60219139610f62565b505b915091565b8154600181018355600092835260209092206001600160a01b03909116910155565b6000610fe260017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be611a01565b60608161194957506040805180820190915260018152600360fc1b60208201526119fc565b6000825b80156119635760019190910190600a900461194d565b5060608167ffffffffffffffff8111801561197d57600080fd5b506040519080825280601f01601f1916602001820160405280156119a8576020820181803683370190505b509050815b80156119f257600a850660300160f81b8260018303815181106119cc57fe5b60200101906001600160f81b031916908160001a905350600a85049450600019016119ad565b5091506119fc9050565b919050565b6000908152602091909152604090205490565b6060611a69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611aa39092919063ffffffff16565b80519091501561110e5780806020019051810190611a87919061226f565b61110e5760405162461bcd60e51b8152600401610bc690612918565b6060611ab28484600085611aba565b949350505050565b606082471015611adc5760405162461bcd60e51b8152600401610bc69061286d565b611ae585611b70565b611b015760405162461bcd60e51b8152600401610bc6906128e1565b60006060866001600160a01b03168587604051611b1e9190612516565b60006040518083038185875af1925050503d8060008114611b5b576040519150601f19603f3d011682016040523d82523d6000602084013e611b60565b606091505b509150915061145f828286611b76565b3b151590565b60608315611b85575081610d44565b825115611b955782518084602001fd5b8160405162461bcd60e51b8152600401610bc69190612823565b604051806101800160405280611bc3611c1a565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b6040518060200160405280600081525090565b8035610c9581612b09565b8051610c9581612b09565b60008083601f840112611c54578182fd5b50813567ffffffffffffffff811115611c6b578182fd5b6020830191508360208083028501011115611c8557600080fd5b9250929050565b600082601f830112611c9c578081fd5b8151611caf611caa826129ee565b6129c7565b818152915060208083019084810181840286018201871015611cd057600080fd5b60005b84811015611cef57815184529282019290820190600101611cd3565b505050505092915050565b600082601f830112611d0a578081fd5b8151611d18611caa826129ee565b818152915060208083019084810160005b84811015611cef578151870188603f820112611d4457600080fd5b83810151611d54611caa82612a0e565b81815260408b81848601011115611d6a57600080fd5b611d7983888401838701612a32565b50865250509282019290820190600101611d29565b600082601f830112611d9e578081fd5b8135611dac611caa826129ee565b818152915060208083019084810181840286018201871015611dcd57600080fd5b60005b84811015611cef57813584529282019290820190600101611dd0565b600082601f830112611dfc578081fd5b8135611e0a611caa82612a0e565b9150808252836020828501011115611e2157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611e4b578081fd5b611e5560206129c7565b9151825250919050565b80516fffffffffffffffffffffffffffffffff81168114610c9557600080fd5b805164ffffffffff81168114610c9557600080fd5b805160ff81168114610c9557600080fd5b600060208284031215611eb6578081fd5b8135610d4481612b09565b600060208284031215611ed2578081fd5b8151610d4481612b09565b60008060408385031215611eef578081fd5b8235611efa81612b09565b946020939093013593505050565b600080600060608486031215611f1c578081fd5b8335611f2781612b09565b95602085013595506040909401359392505050565b60008060008060808587031215611f51578182fd5b8435611f5c81612b09565b935060208501359250604085013591506060850135611f7a81612b09565b939692955090935050565b6000806000806000806000806080898b031215611fa0578586fd5b883567ffffffffffffffff80821115611fb7578788fd5b611fc38c838d01611c43565b909a50985060208b0135915080821115611fdb578788fd5b611fe78c838d01611c43565b909850965060408b0135915080821115611fff578586fd5b61200b8c838d01611c43565b909650945060608b0135915080821115612023578384fd5b818b0191508b601f830112612036578384fd5b813581811115612044578485fd5b8c6020828501011115612055578485fd5b6020830194508093505050509295985092959890939650565b600080600060608486031215612082578081fd5b835167ffffffffffffffff80821115612099578283fd5b818601915086601f8301126120ac578283fd5b81516120ba611caa826129ee565b80828252602080830192508086018b8283870289010111156120da578788fd5b8796505b84871015612104576120f08c82611c38565b8452600196909601959281019281016120de565b50890151909750935050508082111561211b578283fd5b61212787838801611c8c565b9350604086015191508082111561213c578283fd5b5061214986828701611cfa565b9150509250925092565b600080600080600060a0868803121561216a578283fd5b853567ffffffffffffffff80821115612181578485fd5b818801915088601f830112612194578485fd5b81356121a2611caa826129ee565b80828252602080830192508086018d8283870289010111156121c257898afd5b8996505b848710156121ed5780356121d981612b09565b8452600196909601959281019281016121c6565b509099508a01359350505080821115612204578485fd5b61221089838a01611d8e565b95506040880135915080821115612225578485fd5b61223189838a01611d8e565b94506122408960608a01611c2d565b93506080880135915080821115612255578283fd5b5061226288828901611dec565b9150509295509295909350565b600060208284031215612280578081fd5b81518015158114610d44578182fd5b6000602082840312156122a0578081fd5b5035919050565b60006101808083850312156122ba578182fd5b6122c3816129c7565b90506122cf8484611e3a565b81526122de8460208501611e5f565b60208201526122f08460408501611e5f565b60408201526123028460608501611e5f565b60608201526123148460808501611e5f565b60808201526123268460a08501611e5f565b60a08201526123388460c08501611e7f565b60c082015261234a8460e08501611c38565b60e082015261010061235e85828601611c38565b9082015261012061237185858301611c38565b9082015261014061238485858301611c38565b9082015261016061239785858301611e94565b908201529392505050565b6000602082840312156123b3578081fd5b5051919050565b600080604083850312156123cc578182fd5b50508035926020909101359150565b6000806000606084860312156123ef578081fd5b8335925060208401359150604084013561240881612b09565b809150509250925092565b6001600160a01b0316815260200190565b6001600160a01b03169052565b6000815180845260208085018081965082840281019150828601855b858110156124775782840389526124658483516124e2565b9885019893509084019060010161244d565b5091979650505050505050565b81835260006001600160fb1b0383111561249c578081fd5b6020830280836020870137939093016020019283525090919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526124fa816020860160208601612a32565b601f01601f19169290920160200192915050565b61ffff169052565b60008251612528818460208701612a32565b9190910192915050565b60008551612544818460208a01612a32565b8083019050605f60f81b8082528651612564816001850160208b01612a32565b6001920191820152845161257f816002840160208901612a32565b6101d160f51b6002929091019182015283516125a2816004840160208801612a32565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038c16815260e060208083018290529082018b90526000908c906101008401835b8e811015612631578284016126248361261f8388611c2d565b612413565b9094509150600101612606565b508481036040860152612645818d8f612484565b92505050828103606084015261265c81898b612484565b905061266b6080840188612424565b82810360a084015261267e8186886124b8565b91505061268e60c083018461250e565b9c9b505050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b6001600160a01b0395861681526020810194909452604084019290925261ffff166060830152909116608082015260a00190565b606080825284519082018190526000906020906080840190828801845b828110156127a657612796848351612424565b9284019290840190600101612783565b50505083810382850152855180825286830191830190845b818110156127da578351835292840192918401916001016127be565b505084810360408601526127ee8187612431565b98975050505050505050565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610d4460208301846124e2565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b61ffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156129e657600080fd5b604052919050565b600067ffffffffffffffff821115612a04578081fd5b5060209081020190565b600067ffffffffffffffff821115612a24578081fd5b50601f01601f191660200190565b60005b83811015612a4d578181015183820152602001612a35565b83811115610ba85750506000910152565b60e01c90565b600060443d1015612a7457610d72565b600481823e6308c379a0612a888251612a5e565b14612a9257610d72565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612ac25750505050610d72565b82840192508251915080821115612adc5750505050610d72565b503d83016020828401011115612af457505050610d72565b601f01601f1916810160200160405291505090565b6001600160a01b03811681146104bc57600080fdfe61546f6b656e2073686f756c64206e6f74206265207a65726f2061646472657373a264697066735822122035451690bfe60f86edd33d73630acdaa60badf51b2214745bc5b992ac3c0c0bc64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101345760003560e01c8063920f5c84116100ab578063dc9031c41161006f578063dc9031c4146102c5578063f14210a6146102e5578063f3fef3a3146102f8578063f538ba511461030b578063f5f5ba721461031e578063fa2901a51461034057610134565b8063920f5c841461024857806399eb59b914610275578063ad5c464814610295578063c1bce0b7146102aa578063c2722916146102bd57610134565b806347e7ef24116100fd57806347e7ef24146101d25780635358fbda146101e757806354296154146101fa578063573ade811461020d5780636fab3b731461022057806387c139431461023357610134565b8062d34411146101395780630f532d18146101645780631413dc7d146101865780633583849a1461019b57806342cb1fbc146101bd575b600080fd5b34801561014557600080fd5b5061014e610362565b60405161015b91906125b0565b60405180910390f35b34801561017057600080fd5b5061017961037a565b60405161015b9190612805565b34801561019257600080fd5b5061017961039e565b3480156101a757600080fd5b506101b06103c2565b60405161015b91906129b8565b3480156101c957600080fd5b5061014e6103c7565b6101e56101e0366004611edd565b6103df565b005b6101e56101f536600461228f565b6103f9565b6101e5610208366004611f85565b6104bf565b61017961021b366004611f3c565b61079b565b6101e561022e3660046123ba565b6107b2565b34801561023f57600080fd5b5061017961084c565b34801561025457600080fd5b50610268610263366004612153565b610858565b60405161015b91906127fa565b34801561028157600080fd5b5061017961029036600461228f565b610b5d565b3480156102a157600080fd5b5061014e610b6f565b6101e56102b8366004611f08565b610b87565b6101e5610bae565b3480156102d157600080fd5b506101796102e036600461228f565b610bcf565b6101796102f336600461228f565b610bed565b610179610306366004611edd565b610c7e565b6101796103193660046123db565b610c9b565b34801561032a57600080fd5b50610333610d4b565b60405161015b9190612823565b34801561034c57600080fd5b50610355610d75565b60405161015b919061280e565b73b53c1a33016b2dc2ff3653530bff1848a515c8c581565b7fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a81565b7ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be81565b603881565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6103e98282610d80565b90506103f58282610e4c565b5050565b61041773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82610d80565b905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561046857600080fd5b505af115801561047c573d6000803e3d6000fd5b505050505061049f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282610e4c565b6104bc73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610f57565b50565b8685146105265761052660405180604001604052806009815260200168333630b9b42637b0b760b91b8152506040518060400160405280601f81526020017f61737365747320616e6420616d6f756e747320646f206e6f74206d6174636800815250610f62565b86831461058d5761058d60405180604001604052806009815260200168333630b9b42637b0b760b91b8152506040518060400160405280601d81526020017f61737365747320616e64206d6f64657320646f206e6f74206d61746368000000815250610f62565b6000610597610fb5565b9050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105e857600080fd5b505afa1580156105fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106209190611ec1565b60405163ab9c4b5d60e01b81529091506001600160a01b0382169063ab9c4b5d906106649030908e908e908e908e908e908e908c908f908f906038906004016125de565b600060405180830381600087803b15801561067e57600080fd5b505af192505050801561068f575060015b6107015761069b612a64565b806106a657506106d7565b6106d160405180604001604052806009815260200168333630b9b42637b0b760b91b81525082610f62565b50610701565b61070160405180604001604052806009815260200168333630b9b42637b0b760b91b815250610fe7565b60005b8981101561078e576107438260008d8d8581811061071e57fe5b90506020020160208101906107339190611ea5565b6001600160a01b03169190611014565b86868281811061074f57fe5b90506020020135600014610786576107868b8b8381811061076c57fe5b90506020020160208101906107819190611ea5565b610f57565b600101610704565b5050505050505050505050565b60006107a985858585611113565b95945050505050565b60006107bc610fb5565b90506107de73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc284848461146a565b604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90610815908690600401612805565b600060405180830381600087803b15801561082f57600080fd5b505af1158015610843573d6000803e3d6000fd5b50505050505050565b670de0b6b3a764000081565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a757600080fd5b505afa1580156108bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df9190611ec1565b6001600160a01b0316336001600160a01b03161461094f5761094f6040518060400160405280601081526020016f32bc32b1baba32a7b832b930ba34b7b760811b8152506040518060400160405280600e81526020016d34b73b30b634b21031b0b63632b960911b815250610f62565b6001600160a01b03831630146109c6576109c66040518060400160405280601081526020016f32bc32b1baba32a7b832b930ba34b7b760811b8152506040518060400160405280601a81526020017f6e6f7420696e69746961746564206279207468652070726f7879000000000000815250610f62565b6060806060848060200190518101906109df919061206e565b604051637193850960e01b815292955090935091503090637193850990610a0e90869086908690600401612766565b600060405180830381600087803b158015610a2857600080fd5b505af1158015610a3c573d6000803e3d6000fd5b50505050600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8f57600080fd5b505afa158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac79190611ec1565b905060005b8a51811015610b4c576000610b108a8381518110610ae657fe5b60200260200101518c8481518110610afa57fe5b60200260200101516115c790919063ffffffff16565b9050610b4383828e8581518110610b2357fe5b60200260200101516001600160a01b03166110149092919063ffffffff16565b50600101610acc565b5060019a9950505050505050505050565b60016020526000908152604090205481565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000610b91610fb5565b9050610b9f8484848461146a565b610ba884610f57565b50505050565b60405162461bcd60e51b8152600401610bc6906128b3565b60405180910390fd5b60008181548110610bdc57fe5b600091825260209091200154905081565b6000610c0d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2836115ec565b604051632e1a7d4d60e01b815290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90610c47908490600401612805565b600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050919050565b6000610c8a83836115ec565b9050610c9583610f57565b92915050565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b5050505050610d2573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2858585611113565b9050610d4473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610f57565b9392505050565b60408051808201909152600f81526e2420b0bb32a83937ba37b1b7b62b1960891b60208201525b90565b636139148b60e11b81565b60006000198214610d92575080610c95565b6001600160a01b0383161580610dc457506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15610dd0575047610c95565b6040516370a0823160e01b81526001600160a01b038416906370a0823190610dfc9030906004016125b0565b60206040518083038186803b158015610e1457600080fd5b505afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4491906123a2565b600080610e5884611705565b9092509050610e716001600160a01b0385168385611014565b60405163e8eda9df60e01b81526001600160a01b0383169063e8eda9df90610ea4908790879030906038906004016126da565b600060405180830381600087803b158015610ebe57600080fd5b505af1925050508015610ecf575060015b610f3d57610edb612a64565b80610ee65750610f15565b610f0f6040518060400160405280600781526020016619195c1bdcda5d60ca1b81525082610f62565b50610f3d565b610f3d6040518060400160405280600781526020016619195c1bdcda5d60ca1b815250610fe7565b610f526001600160a01b038516836000611014565b610ba8815b6104bc6000826118d5565b610f72610f6d6118f7565b611924565b610f7a610d4b565b8383604051602001610f8f9493929190612532565b60408051601f198184030181529082905262461bcd60e51b8252610bc691600401612823565b6000610fe260017fb2f2618cecbbb6e7468cc0f2aa43858ad8d153e0280b22285e28e853bb9d453a611a01565b905090565b6104bc816040518060400160405280600b81526020016a155b9cdc1958da599a595960aa1b815250610f62565b80158061109c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061104a90309086906004016125c4565b60206040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a91906123a2565b155b6110b85760405162461bcd60e51b8152600401610bc690612962565b61110e8363095ea7b360e01b84846040516024016110d792919061269e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a14565b505050565b60008073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116357600080fd5b505afa158015611177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119b9190611ec1565b90506111b16001600160a01b0387168287611014565b60405163573ade8160e01b81526001600160a01b0382169063573ade81906111e3908990899089908990600401612707565b602060405180830381600087803b1580156111fd57600080fd5b505af192505050801561122d575060408051601f3d908101601f1916820190925261122a918101906123a2565b60015b61129c57611239612a64565b806112445750611271565b61126b60405180604001604052806005815260200164726570617960d81b81525082610f62565b50611297565b61129760405180604001604052806005815260200164726570617960d81b815250610fe7565b61129e565b505b6112b36001600160a01b038716826000611014565b6112bb611baf565b6040516335ea6a7560e01b81526001600160a01b038316906335ea6a75906112e7908a906004016125b0565b6101806040518083038186803b15801561130057600080fd5b505afa158015611314573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133891906122a7565b9050600185600281111561134857fe5b600281111561135357fe5b146113de578061012001516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040161138991906125b0565b60206040518083038186803b1580156113a157600080fd5b505afa1580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906123a2565b61145f565b8061010001516001600160a01b03166370a08231856040518263ffffffff1660e01b815260040161140f91906125b0565b60206040518083038186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f91906123a2565b979650505050505050565b600073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f19190611ec1565b60405163a415bcad60e01b81529091506001600160a01b0382169063a415bcad90611529908890889088906038908990600401612732565b600060405180830381600087803b15801561154357600080fd5b505af1925050508015611554575060015b6115c057611560612a64565b8061156b5750611599565b61159360405180604001604052806006815260200165626f72726f7760d01b81525082610f62565b506115c0565b6115c060405180604001604052806006815260200165626f72726f7760d01b815250610fe7565b5050505050565b600082820183811015610d445760405162461bcd60e51b8152600401610bc690612836565b60008060006115fa85611705565b915091506116088185610d80565b604051631a4ca37b60e21b81529094506001600160a01b038316906369328dec9061163b908890889030906004016126b7565b602060405180830381600087803b15801561165557600080fd5b505af1925050508015611685575060408051601f3d908101601f19168201909252611682918101906123a2565b60015b6116fa57611691612a64565b8061169c57506116cc565b6116c660405180604001604052806008815260200167776974686472617760c01b81525082610f62565b506116f5565b6116f560405180604001604052806008815260200167776974686472617760c01b815250610fe7565b6116fd565b92505b505092915050565b60008073b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561175557600080fd5b505afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190611ec1565b6040516335ea6a7560e01b81529092506001600160a01b038316906335ea6a75906117bc9086906004016125b0565b6101806040518083038186803b1580156117d557600080fd5b505afa925050508015611805575060408051601f3d908101601f19168201909252611802918101906122a7565b60015b61187857611811612a64565b8061181c575061184b565b6118456040518060400160405280600781526020016611d95b995c985b60ca1b81525082610f62565b50611873565b6118736040518060400160405280600781526020016611d95b995c985b60ca1b815250610fe7565b6118d0565b60e081015191506001600160a01b0382166118ce576118ce6040518060400160405280600781526020016611d95b995c985b60ca1b815250604051806060016040528060218152602001612b1f60219139610f62565b505b915091565b8154600181018355600092835260209092206001600160a01b03909116910155565b6000610fe260017ff9543f11459ccccd21306c8881aaab675ff49d988c1162fd1dd9bbcdbe4446be611a01565b60608161194957506040805180820190915260018152600360fc1b60208201526119fc565b6000825b80156119635760019190910190600a900461194d565b5060608167ffffffffffffffff8111801561197d57600080fd5b506040519080825280601f01601f1916602001820160405280156119a8576020820181803683370190505b509050815b80156119f257600a850660300160f81b8260018303815181106119cc57fe5b60200101906001600160f81b031916908160001a905350600a85049450600019016119ad565b5091506119fc9050565b919050565b6000908152602091909152604090205490565b6060611a69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611aa39092919063ffffffff16565b80519091501561110e5780806020019051810190611a87919061226f565b61110e5760405162461bcd60e51b8152600401610bc690612918565b6060611ab28484600085611aba565b949350505050565b606082471015611adc5760405162461bcd60e51b8152600401610bc69061286d565b611ae585611b70565b611b015760405162461bcd60e51b8152600401610bc6906128e1565b60006060866001600160a01b03168587604051611b1e9190612516565b60006040518083038185875af1925050503d8060008114611b5b576040519150601f19603f3d011682016040523d82523d6000602084013e611b60565b606091505b509150915061145f828286611b76565b3b151590565b60608315611b85575081610d44565b825115611b955782518084602001fd5b8160405162461bcd60e51b8152600401610bc69190612823565b604051806101800160405280611bc3611c1a565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b6040518060200160405280600081525090565b8035610c9581612b09565b8051610c9581612b09565b60008083601f840112611c54578182fd5b50813567ffffffffffffffff811115611c6b578182fd5b6020830191508360208083028501011115611c8557600080fd5b9250929050565b600082601f830112611c9c578081fd5b8151611caf611caa826129ee565b6129c7565b818152915060208083019084810181840286018201871015611cd057600080fd5b60005b84811015611cef57815184529282019290820190600101611cd3565b505050505092915050565b600082601f830112611d0a578081fd5b8151611d18611caa826129ee565b818152915060208083019084810160005b84811015611cef578151870188603f820112611d4457600080fd5b83810151611d54611caa82612a0e565b81815260408b81848601011115611d6a57600080fd5b611d7983888401838701612a32565b50865250509282019290820190600101611d29565b600082601f830112611d9e578081fd5b8135611dac611caa826129ee565b818152915060208083019084810181840286018201871015611dcd57600080fd5b60005b84811015611cef57813584529282019290820190600101611dd0565b600082601f830112611dfc578081fd5b8135611e0a611caa82612a0e565b9150808252836020828501011115611e2157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611e4b578081fd5b611e5560206129c7565b9151825250919050565b80516fffffffffffffffffffffffffffffffff81168114610c9557600080fd5b805164ffffffffff81168114610c9557600080fd5b805160ff81168114610c9557600080fd5b600060208284031215611eb6578081fd5b8135610d4481612b09565b600060208284031215611ed2578081fd5b8151610d4481612b09565b60008060408385031215611eef578081fd5b8235611efa81612b09565b946020939093013593505050565b600080600060608486031215611f1c578081fd5b8335611f2781612b09565b95602085013595506040909401359392505050565b60008060008060808587031215611f51578182fd5b8435611f5c81612b09565b935060208501359250604085013591506060850135611f7a81612b09565b939692955090935050565b6000806000806000806000806080898b031215611fa0578586fd5b883567ffffffffffffffff80821115611fb7578788fd5b611fc38c838d01611c43565b909a50985060208b0135915080821115611fdb578788fd5b611fe78c838d01611c43565b909850965060408b0135915080821115611fff578586fd5b61200b8c838d01611c43565b909650945060608b0135915080821115612023578384fd5b818b0191508b601f830112612036578384fd5b813581811115612044578485fd5b8c6020828501011115612055578485fd5b6020830194508093505050509295985092959890939650565b600080600060608486031215612082578081fd5b835167ffffffffffffffff80821115612099578283fd5b818601915086601f8301126120ac578283fd5b81516120ba611caa826129ee565b80828252602080830192508086018b8283870289010111156120da578788fd5b8796505b84871015612104576120f08c82611c38565b8452600196909601959281019281016120de565b50890151909750935050508082111561211b578283fd5b61212787838801611c8c565b9350604086015191508082111561213c578283fd5b5061214986828701611cfa565b9150509250925092565b600080600080600060a0868803121561216a578283fd5b853567ffffffffffffffff80821115612181578485fd5b818801915088601f830112612194578485fd5b81356121a2611caa826129ee565b80828252602080830192508086018d8283870289010111156121c257898afd5b8996505b848710156121ed5780356121d981612b09565b8452600196909601959281019281016121c6565b509099508a01359350505080821115612204578485fd5b61221089838a01611d8e565b95506040880135915080821115612225578485fd5b61223189838a01611d8e565b94506122408960608a01611c2d565b93506080880135915080821115612255578283fd5b5061226288828901611dec565b9150509295509295909350565b600060208284031215612280578081fd5b81518015158114610d44578182fd5b6000602082840312156122a0578081fd5b5035919050565b60006101808083850312156122ba578182fd5b6122c3816129c7565b90506122cf8484611e3a565b81526122de8460208501611e5f565b60208201526122f08460408501611e5f565b60408201526123028460608501611e5f565b60608201526123148460808501611e5f565b60808201526123268460a08501611e5f565b60a08201526123388460c08501611e7f565b60c082015261234a8460e08501611c38565b60e082015261010061235e85828601611c38565b9082015261012061237185858301611c38565b9082015261014061238485858301611c38565b9082015261016061239785858301611e94565b908201529392505050565b6000602082840312156123b3578081fd5b5051919050565b600080604083850312156123cc578182fd5b50508035926020909101359150565b6000806000606084860312156123ef578081fd5b8335925060208401359150604084013561240881612b09565b809150509250925092565b6001600160a01b0316815260200190565b6001600160a01b03169052565b6000815180845260208085018081965082840281019150828601855b858110156124775782840389526124658483516124e2565b9885019893509084019060010161244d565b5091979650505050505050565b81835260006001600160fb1b0383111561249c578081fd5b6020830280836020870137939093016020019283525090919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526124fa816020860160208601612a32565b601f01601f19169290920160200192915050565b61ffff169052565b60008251612528818460208701612a32565b9190910192915050565b60008551612544818460208a01612a32565b8083019050605f60f81b8082528651612564816001850160208b01612a32565b6001920191820152845161257f816002840160208901612a32565b6101d160f51b6002929091019182015283516125a2816004840160208801612a32565b016004019695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038c16815260e060208083018290529082018b90526000908c906101008401835b8e811015612631578284016126248361261f8388611c2d565b612413565b9094509150600101612606565b508481036040860152612645818d8f612484565b92505050828103606084015261265c81898b612484565b905061266b6080840188612424565b82810360a084015261267e8186886124b8565b91505061268e60c083018461250e565b9c9b505050505050505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b6001600160a01b0395861681526020810194909452604084019290925261ffff166060830152909116608082015260a00190565b606080825284519082018190526000906020906080840190828801845b828110156127a657612796848351612424565b9284019290840190600101612783565b50505083810382850152855180825286830191830190845b818110156127da578351835292840192918401916001016127be565b505084810360408601526127ee8187612431565b98975050505050505050565b901515815260200190565b90815260200190565b6001600160e01b031991909116815260200190565b600060208252610d4460208301846124e2565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b602080825260149082015273496e76616c696420706f73742070726f6365737360601b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b61ffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156129e657600080fd5b604052919050565b600067ffffffffffffffff821115612a04578081fd5b5060209081020190565b600067ffffffffffffffff821115612a24578081fd5b50601f01601f191660200190565b60005b83811015612a4d578181015183820152602001612a35565b83811115610ba85750506000910152565b60e01c90565b600060443d1015612a7457610d72565b600481823e6308c379a0612a888251612a5e565b14612a9257610d72565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612ac25750505050610d72565b82840192508251915080821115612adc5750505050610d72565b503d83016020828401011115612af457505050610d72565b601f01601f1916810160200160405291505090565b6001600160a01b03811681146104bc57600080fdfe61546f6b656e2073686f756c64206e6f74206265207a65726f2061646472657373a264697066735822122035451690bfe60f86edd33d73630acdaa60badf51b2214745bc5b992ac3c0c0bc64736f6c634300060c0033
Deployed Bytecode Sourcemap
50354:8418:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50513:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23332:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23513:109::-;;;;;;;;;;;;;:::i;50822:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50733:82::-;;;;;;;;;;;;;:::i;50995:153::-;;;;;;:::i;:::-;;:::i;:::-;;51156:219;;;;;;:::i;:::-;;:::i;52902:1241::-;;;;;;:::i;:::-;;:::i;51848:248::-;;;;;;:::i;:::-;;:::i;52678:216::-;;;;;;:::i;:::-;;:::i;20315:49::-;;;;;;;;;;;;;:::i;54151:1091::-;;;;;;;;;;-1:-1:-1;54151:1091:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23220:40::-;;;;;;;;;;-1:-1:-1;23220:40:0;;;;;:::i;:::-;;:::i;50621:81::-;;;;;;;;;;;;;:::i;52417:253::-;;;;;;:::i;:::-;;:::i;24982:479::-;;;:::i;23191:22::-;;;;;;;;;;-1:-1:-1;23191:22:0;;;;;:::i;:::-;;:::i;51614:226::-;;;;;;:::i;:::-;;:::i;51383:223::-;;;;;;:::i;:::-;;:::i;52104:305::-;;;;;;:::i;:::-;;:::i;50872:115::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20208:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50513:77::-;50548:42;50513:77;:::o;23332:107::-;23373:66;23332:107;:::o;23513:109::-;23556:66;23513:109;:::o;50822:41::-;50861:2;50822:41;:::o;50733:82::-;50773:42;50733:82;:::o;50995:153::-;51080:26;51092:5;51099:6;51080:11;:26::i;:::-;51071:35;;51117:23;51126:5;51133:6;51117:8;:23::i;:::-;50995:153;;:::o;51156:219::-;51229:26;50773:42;51248:6;51229:11;:26::i;:::-;51220:35;;50660:42;-1:-1:-1;;;;;51266:20:0;;51294:6;51266:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51314:22;50660:42;51329:6;51314:8;:22::i;:::-;51349:18;50660:42;51349:12;:18::i;:::-;51156:219;:::o;52902:1241::-;53100:31;;;53096:122;;53148:58;;;;;;;;;;;;;;-1:-1:-1;;;53148:58:0;;;;;;;;;;;;;;;;;;;;:10;:58::i;:::-;53234:29;;;53230:118;;53280:56;;;;;;;;;;;;;;-1:-1:-1;;;53280:56:0;;;;;;;;;;;;;;;;;;;;:10;:56::i;:::-;53360:18;53381:12;:10;:12::i;:::-;53360:33;;53404:12;50548:42;-1:-1:-1;;;;;53432:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53520:238;;-1:-1:-1;;;53520:238:0;;53404:86;;-1:-1:-1;;;;;;53520:30:0;;;;;:238;;53577:4;;53601:6;;;;53626:7;;;;53652:5;;;;53676:10;;53705:6;;;;50861:2;;53520:238;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53503:417;;;;:::i;:::-;;;;;;;;53820:31;;;;;;;;;;;;;;-1:-1:-1;;;53820:31:0;;;53844:6;53820:10;:31::i;:::-;53771:92;53503:417;;;53885:23;;;;;;;;;;;;;;-1:-1:-1;;;53885:23:0;;;:10;:23::i;:::-;53975:9;53970:166;53990:17;;;53970:166;;;54029:38;54059:4;54065:1;54036:6;;54043:1;54036:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54029:29:0;;:38;:29;:38::i;:::-;54086:5;;54092:1;54086:8;;;;;;;;;;;;;54098:1;54086:13;54082:42;;54101:23;54114:6;;54121:1;54114:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;54101:12;:23::i;:::-;54009:3;;53970:166;;;;52902:1241;;;;;;;;;;:::o;51848:248::-;52001:18;52045:43;52052:5;52059:6;52067:8;52077:10;52045:6;:43::i;:::-;52032:56;51848:248;-1:-1:-1;;;;;51848:248:0:o;52678:216::-;52759:18;52780:12;:10;:12::i;:::-;52759:33;;52803:43;50660:42;52817:6;52825:8;52835:10;52803:7;:43::i;:::-;52857:29;;-1:-1:-1;;;52857:29:0;;50660:42;;52857:21;;:29;;52879:6;;52857:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52678:216;;;:::o;20315:49::-;20357:7;20315:49;:::o;54151:1091::-;54374:4;50548:42;-1:-1:-1;;;;;54436:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54409:85:0;:10;-1:-1:-1;;;;;54409:85:0;;54391:190;;54521:48;;;;;;;;;;;;;;-1:-1:-1;;;54521:48:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54521:48:0;;;:10;:48::i;:::-;-1:-1:-1;;;;;54597:26:0;;54618:4;54597:26;54593:119;;54640:60;;;;;;;;;;;;;;-1:-1:-1;;;54640:60:0;;;;;;;;;;;;;;;;;;;;:10;:60::i;:::-;54725:20;54747:24;54773:20;54821:6;54810:51;;;;;;;;;;;;:::i;:::-;54872:48;;-1:-1:-1;;;54872:48:0;;54724:137;;-1:-1:-1;54724:137:0;;-1:-1:-1;54724:137:0;-1:-1:-1;54887:4:0;;54872:27;;:48;;54724:137;;;;;;54872:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54933:12;50548:42;-1:-1:-1;;;;;54961:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54933:86;;55035:9;55030:183;55054:6;:13;55050:1;:17;55030:183;;;55089:19;55111:27;55126:8;55135:1;55126:11;;;;;;;;;;;;;;55111:7;55119:1;55111:10;;;;;;;;;;;;;;:14;;:27;;;;:::i;:::-;55089:49;;55153:48;55183:4;55189:11;55160:6;55167:1;55160:9;;;;;;;;;;;;;;-1:-1:-1;;;;;55153:29:0;;;:48;;;;;:::i;:::-;-1:-1:-1;55069:3:0;;55030:183;;;-1:-1:-1;55230:4:0;;54151:1091;-1:-1:-1;;;;;;;;;;54151:1091:0:o;23220:40::-;;;;;;;;;;;;;:::o;50621:81::-;50660:42;50621:81;:::o;52417:253::-;52544:18;52565:12;:10;:12::i;:::-;52544:33;;52588:44;52596:5;52603:6;52611:8;52621:10;52588:7;:44::i;:::-;52643:19;52656:5;52643:12;:19::i;:::-;52417:253;;;;:::o;24982:479::-;25041:30;;-1:-1:-1;;;25041:30:0;;;;;;;:::i;:::-;;;;;;;;23191:22;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23191:22:0;:::o;51614:226::-;51704:22;51761:23;50660:42;51777:6;51761:9;:23::i;:::-;51795:37;;-1:-1:-1;;;51795:37:0;;51744:40;;-1:-1:-1;50660:42:0;;51795:21;;:37;;51744:40;;51795:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51614:226;;;:::o;51383:223::-;51485:22;51542:24;51552:5;51559:6;51542:9;:24::i;:::-;51525:41;;51579:19;51592:5;51579:12;:19::i;:::-;51383:223;;;;:::o;52104:305::-;52236:18;50660:42;-1:-1:-1;;;;;52267:20:0;;52295:6;52267:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52328:42;50660;52341:6;52349:8;52359:10;52328:6;:42::i;:::-;52315:55;;52383:18;50660:42;52383:12;:18::i;:::-;52104:305;;;;;:::o;50872:115::-;50955:24;;;;;;;;;;;;-1:-1:-1;;;50955:24:0;;;;50872:115;;:::o;20208:51::-;-1:-1:-1;;;20208:51:0;:::o;27149:500::-;27251:7;-1:-1:-1;;27280:6:0;:21;27276:67;;-1:-1:-1;27325:6:0;27318:13;;27276:67;-1:-1:-1;;;;;27394:19:0;;;;:96;;-1:-1:-1;;;;;;27430:60:0;;27447:42;27430:60;27394:96;27376:181;;;-1:-1:-1;27524:21:0;27517:28;;27376:181;27603:38;;-1:-1:-1;;;27603:38:0;;-1:-1:-1;;;;;27603:23:0;;;;;:38;;27635:4;;27603:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55304:612::-;55374:12;55388:14;55406:31;55431:5;55406:24;:31::i;:::-;55373:64;;-1:-1:-1;55373:64:0;-1:-1:-1;55448:39:0;-1:-1:-1;;;;;55448:25:0;;55373:64;55480:6;55448:25;:39::i;:::-;55517:156;;-1:-1:-1;;;55517:156:0;;-1:-1:-1;;;;;55517:28:0;;;;;:156;;55564:5;;55588:6;;55621:4;;50861:2;;55517:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55500:331;;;;:::i;:::-;;;;;;;;55735:29;;;;;;;;;;;;;;-1:-1:-1;;;55735:29:0;;;55757:6;55735:10;:29::i;:::-;55686:90;55500:331;;;55798:21;;;;;;;;;;;;;;-1:-1:-1;;;55798:21:0;;;:10;:21::i;:::-;55843:34;-1:-1:-1;;;;;55843:25:0;;55869:4;55875:1;55843:25;:34::i;:::-;55888:20;55901:6;25469:200;25526:23;:5;25543;25526:16;:23::i;26019:470::-;26222:31;26235:17;:15;:17::i;:::-;26222:12;:31::i;:::-;26302:17;:15;:17::i;:::-;26368:12;26430:6;26183:272;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26183:272:0;;;;;;;;;;-1:-1:-1;;;26137:344:0;;;;;;;:::i;24341:112::-;24386:7;24413:32;:5;23373:66;24413:16;:32::i;:::-;24406:39;;24341:112;:::o;26497:120::-;26570:39;26581:12;26570:39;;;;;;;;;;;;;-1:-1:-1;;;26570:39:0;;;:10;:39::i;16583:622::-;16953:10;;;16952:62;;-1:-1:-1;16969:39:0;;-1:-1:-1;;;16969:39:0;;-1:-1:-1;;;;;16969:15:0;;;;;:39;;16993:4;;17000:7;;16969:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;16952:62;16944:152;;;;-1:-1:-1;;;16944:152:0;;;;;;;:::i;:::-;17107:90;17127:5;17157:22;;;17181:7;17190:5;17134:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17134:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17134:62:0;-1:-1:-1;;;;;;17134:62:0;;;;;;;;;;17107:19;:90::i;:::-;16583:622;;;:::o;56492:985::-;56638:18;56669:12;50548:42;-1:-1:-1;;;;;56697:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56669:86;-1:-1:-1;56766:39:0;-1:-1:-1;;;;;56766:25:0;;56669:86;56798:6;56766:25;:39::i;:::-;56835:63;;-1:-1:-1;;;56835:63:0;;-1:-1:-1;;;;;56835:26:0;;;;;:63;;56862:5;;56869:6;;56877:8;;56887:10;;56835:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56835:63:0;;;;;;;;-1:-1:-1;;56835:63:0;;;;;;;;;;;;:::i;:::-;;;56818:234;;;;:::i;:::-;;;;;;;;56960:27;;;;;;;;;;;;;;-1:-1:-1;;;56960:27:0;;;56980:6;56960:10;:27::i;:::-;56911:88;56818:234;;;57021:19;;;;;;;;;;;;;;-1:-1:-1;;;57021:19:0;;;:10;:19::i;:::-;56818:234;;;;;57064:34;-1:-1:-1;;;;;57064:25:0;;57090:4;57096:1;57064:25;:34::i;:::-;57111:36;;:::i;:::-;57163:42;;-1:-1:-1;;;57163:42:0;;-1:-1:-1;;;;;57163:35:0;;;;;:42;;57199:5;;57163:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57111:94;-1:-1:-1;57282:33:0;57256:8;57229:36;;;;;;;;:86;;;;;;;;;:240;;57414:7;:32;;;-1:-1:-1;;;;;57407:50:0;;57458:10;57407:62;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57229:240;;;57338:7;:30;;;-1:-1:-1;;;;;57331:48:0;;57380:10;57331:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57216:253;56492:985;-1:-1:-1;;;;;;;56492:985:0:o;57485:607::-;57634:12;50548:42;-1:-1:-1;;;;;57662:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57750:179;;-1:-1:-1;;;57750:179:0;;57634:86;;-1:-1:-1;;;;;;57750:27:0;;;;;:179;;57796:5;;57820:6;;57845:8;;50861:2;;57904:10;;57750:179;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57733:352;;;;:::i;:::-;;;;;;;;57991:28;;;;;;;;;;;;;;-1:-1:-1;;;57991:28:0;;;58012:6;57991:10;:28::i;:::-;57942:89;57733:352;;;58053:20;;;;;;;;;;;;;;-1:-1:-1;;;58053:20:0;;;:10;:20::i;:::-;57485:607;;;;;:::o;3773:181::-;3831:7;3863:5;;;3887:6;;;;3879:46;;;;-1:-1:-1;;;3879:46:0;;;;;;;:::i;55924:560::-;56010:22;56051:12;56065:14;56083:31;56108:5;56083:24;:31::i;:::-;56050:64;;;;56134:27;56146:6;56154;56134:11;:27::i;:::-;56191:59;;-1:-1:-1;;;56191:59:0;;56125:36;;-1:-1:-1;;;;;;56191:29:0;;;;;:59;;56221:5;;56125:36;;56244:4;;56191:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56191:59:0;;;;;;;;-1:-1:-1;;56191:59:0;;;;;;;;;;;;:::i;:::-;;;56174:303;;;;:::i;:::-;;;;;;;;56379:30;;;;;;;;;;;;;;-1:-1:-1;;;56379:30:0;;;56402:6;56379:10;:30::i;:::-;56330:91;56174:303;;;56443:22;;;;;;;;;;;;;;-1:-1:-1;;;56443:22:0;;;:10;:22::i;:::-;56174:303;;;56314:3;-1:-1:-1;56174:303:0;55924:560;;;;;;:::o;58100:669::-;58204:12;58218:14;50548:42;-1:-1:-1;;;;;58257:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58330:47;;-1:-1:-1;;;58330:47:0;;58250:65;;-1:-1:-1;;;;;;58330:35:0;;;;;:47;;58366:10;;58330:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58330:47:0;;;;;;;;-1:-1:-1;;58330:47:0;;;;;;;;;;;;:::i;:::-;;;58326:436;;;;:::i;:::-;;;;;;;;58666:29;;;;;;;;;;;;;;-1:-1:-1;;;58666:29:0;;;58688:6;58666:10;:29::i;:::-;58617:90;58326:436;;;58729:21;;;;;;;;;;;;;;-1:-1:-1;;;58729:21:0;;;:10;:21::i;:::-;58326:436;;;58470:18;;;;;-1:-1:-1;;;;;;58507:20:0;;58503:101;;58546:58;;;;;;;;;;;;;;-1:-1:-1;;;58546:58:0;;;;;;;;;;;;;;;;;;;;:10;:58::i;:::-;58378:238;58326:436;58100:669;;;:::o;21838:136::-;21920:46;;;;;;;21932:33;21920:46;;;;;;;-1:-1:-1;;;;;21940:24:0;;;21920:46;;;21838:136::o;24683:119::-;24733:7;24760:34;:5;23556:66;24760:16;:34::i;26625:516::-;26681:13;26711:6;26707:427;;-1:-1:-1;26734:10:0;;;;;;;;;;;;-1:-1:-1;;;26734:10:0;;;;;;26707:427;26777:11;26827:1;26807:85;26830:8;;26807:85;;26871:5;;;;;;26848:2;26840:10;;26807:85;;;;26906:16;26935:3;26925:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26925:14:0;-1:-1:-1;26906:33:0;-1:-1:-1;26971:3:0;26954:136;26976:5;;26954:136;;27043:2;27039:1;:6;27033:2;:13;27020:28;;27007:3;27015:1;27011;:5;27007:10;;;;;;;;;;;:41;-1:-1:-1;;;;;27007:41:0;;;;;;;;-1:-1:-1;27072:2:0;27067:7;;;-1:-1:-1;;;26983:3:0;26954:136;;;-1:-1:-1;27118:3:0;-1:-1:-1;27104:18:0;;-1:-1:-1;27104:18:0;26707:427;26625:516;;;:::o;21159:203::-;21285:11;21339:12;;;;;;;;;;;;;21159:203::o;18229:761::-;18653:23;18679:69;18707:4;18679:69;;;;;;;;;;;;;;;;;18687:5;-1:-1:-1;;;;;18679:27:0;;;:69;;;;;:::i;:::-;18763:17;;18653:95;;-1:-1:-1;18763:21:0;18759:224;;18905:10;18894:30;;;;;;;;;;;;:::i;:::-;18886:85;;;;-1:-1:-1;;;18886:85:0;;;;;;;:::i;11923:195::-;12026:12;12058:52;12080:6;12088:4;12094:1;12097:12;12058:21;:52::i;:::-;12051:59;11923:195;-1:-1:-1;;;;11923:195:0:o;12975:530::-;13102:12;13160:5;13135:21;:30;;13127:81;;;;-1:-1:-1;;;13127:81:0;;;;;;;:::i;:::-;13227:18;13238:6;13227:10;:18::i;:::-;13219:60;;;;-1:-1:-1;;;13219:60:0;;;;;;;:::i;:::-;13353:12;13367:23;13394:6;-1:-1:-1;;;;;13394:11:0;13414:5;13422:4;13394:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13352:75;;;;13445:52;13463:7;13472:10;13484:12;13445:17;:52::i;9005:422::-;9372:20;9411:8;;;9005:422::o;14511:742::-;14626:12;14655:7;14651:595;;;-1:-1:-1;14686:10:0;14679:17;;14651:595;14800:17;;:21;14796:439;;15063:10;15057:17;15124:15;15111:10;15107:2;15103:19;15096:44;15011:148;15206:12;15199:20;;-1:-1:-1;;;15199:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;142:134::-;220:13;;238:33;220:13;238:33;:::i;301:352::-;;;431:3;424:4;416:6;412:17;408:27;398:2;;-1:-1;;439:12;398:2;-1:-1;469:20;;509:18;498:30;;495:2;;;-1:-1;;531:12;495:2;575:4;567:6;563:17;551:29;;626:3;575:4;;610:6;606:17;567:6;592:32;;589:41;586:2;;;643:1;;633:12;586:2;391:262;;;;;:::o;2160:722::-;;2288:3;2281:4;2273:6;2269:17;2265:27;2255:2;;-1:-1;;2296:12;2255:2;2336:6;2330:13;2358:80;2373:64;2430:6;2373:64;:::i;:::-;2358:80;:::i;:::-;2466:21;;;2349:89;-1:-1;2510:4;2523:14;;;;2498:17;;;2612;;;2603:27;;;;2600:36;-1:-1;2597:2;;;2649:1;;2639:12;2597:2;2674:1;2659:217;2684:6;2681:1;2678:13;2659:217;;;5088:13;;2752:61;;2827:14;;;;2855;;;;2706:1;2699:9;2659:217;;;2663:14;;;;;2248:634;;;;:::o;2906:713::-;;3043:3;3036:4;3028:6;3024:17;3020:27;3010:2;;-1:-1;;3051:12;3010:2;3091:6;3085:13;3113:89;3128:73;3194:6;3128:73;:::i;3113:89::-;3230:21;;;3104:98;-1:-1;3274:4;3287:14;;;;3262:17;;;3382:1;3367:246;3392:6;3389:1;3386:13;3367:246;;;3468:3;3462:10;3266:6;3450:23;6071:3;6052:17;3450:23;6052:17;6048:27;6038:2;;3382:1;;6079:12;6038:2;3274:4;3450:23;;6113:13;6141:64;6156:48;6197:6;6156:48;:::i;6141:64::-;6225:6;6218:5;6211:21;6249:17;6329:3;6249:17;6320:6;3450:23;6311:16;;6308:25;6305:2;;;3382:1;;6336:12;6305:2;6356:39;6388:6;3274:4;6287:5;6283:16;6249:17;3450:23;6249:17;6356:39;:::i;:::-;-1:-1;3480:70;;-1:-1;;3564:14;;;;3592;;;;3414:1;3407:9;3367:246;;4023:707;;4140:3;4133:4;4125:6;4121:17;4117:27;4107:2;;-1:-1;;4148:12;4107:2;4195:6;4182:20;4217:80;4232:64;4289:6;4232:64;:::i;4217:80::-;4325:21;;;4208:89;-1:-1;4369:4;4382:14;;;;4357:17;;;4471;;;4462:27;;;;4459:36;-1:-1;4456:2;;;4508:1;;4498:12;4456:2;4533:1;4518:206;4543:6;4540:1;4537:13;4518:206;;;9359:20;;4611:50;;4675:14;;;;4703;;;;4565:1;4558:9;4518:206;;5510:440;;5611:3;5604:4;5596:6;5592:17;5588:27;5578:2;;-1:-1;;5619:12;5578:2;5666:6;5653:20;5688:64;5703:48;5744:6;5703:48;:::i;5688:64::-;5679:73;;5772:6;5765:5;5758:21;5876:3;5808:4;5867:6;5800;5858:16;;5855:25;5852:2;;;5893:1;;5883:12;5852:2;45576:6;5808:4;5800:6;5796:17;5808:4;5834:5;5830:16;45553:30;45632:1;45614:16;;;5808:4;45614:16;45607:27;5834:5;5571:379;-1:-1;;5571:379::o;6456:361::-;;6597:4;6585:9;6580:3;6576:19;6572:30;6569:2;;;-1:-1;;6605:12;6569:2;6633:20;6597:4;6633:20;:::i;:::-;9507:13;;6710:86;;-1:-1;6624:29;6563:254;-1:-1;6563:254::o;9151:134::-;9229:13;;44964:34;44953:46;;47315:35;;47305:2;;47364:1;;47354:12;9570:132;9647:13;;45381:12;45370:24;;47562:34;;47552:2;;47610:1;;47600:12;9709:130;9785:13;;45477:4;45466:16;;47683:33;;47673:2;;47730:1;;47720:12;9846:241;;9950:2;9938:9;9929:7;9925:23;9921:32;9918:2;;;-1:-1;;9956:12;9918:2;85:6;72:20;97:33;124:5;97:33;:::i;10094:263::-;;10209:2;10197:9;10188:7;10184:23;10180:32;10177:2;;;-1:-1;;10215:12;10177:2;226:6;220:13;238:33;265:5;238:33;:::i;10364:366::-;;;10485:2;10473:9;10464:7;10460:23;10456:32;10453:2;;;-1:-1;;10491:12;10453:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10543:63;10643:2;10682:22;;;;9359:20;;-1:-1;;;10447:283::o;10737:491::-;;;;10875:2;10863:9;10854:7;10850:23;10846:32;10843:2;;;-1:-1;;10881:12;10843:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10933:63;11033:2;11072:22;;9359:20;;-1:-1;11141:2;11180:22;;;9359:20;;10837:391;-1:-1;;;10837:391::o;11235:617::-;;;;;11390:3;11378:9;11369:7;11365:23;11361:33;11358:2;;;-1:-1;;11397:12;11358:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;11449:63;-1:-1;11549:2;11588:22;;9359:20;;-1:-1;11657:2;11696:22;;9359:20;;-1:-1;11765:2;11804:22;;72:20;97:33;72:20;97:33;:::i;:::-;11352:500;;;;-1:-1;11352:500;;-1:-1;;11352:500::o;11859:1209::-;;;;;;;;;12138:3;12126:9;12117:7;12113:23;12109:33;12106:2;;;-1:-1;;12145:12;12106:2;12203:17;12190:31;12241:18;;12233:6;12230:30;12227:2;;;-1:-1;;12263:12;12227:2;12301:80;12373:7;12364:6;12353:9;12349:22;12301:80;:::i;:::-;12283:98;;-1:-1;12283:98;-1:-1;12446:2;12431:18;;12418:32;;-1:-1;12459:30;;;12456:2;;;-1:-1;;12492:12;12456:2;12530:80;12602:7;12593:6;12582:9;12578:22;12530:80;:::i;:::-;12512:98;;-1:-1;12512:98;-1:-1;12675:2;12660:18;;12647:32;;-1:-1;12688:30;;;12685:2;;;-1:-1;;12721:12;12685:2;12759:80;12831:7;12822:6;12811:9;12807:22;12759:80;:::i;:::-;12741:98;;-1:-1;12741:98;-1:-1;12904:2;12889:18;;12876:32;;-1:-1;12917:30;;;12914:2;;;-1:-1;;12950:12;12914:2;13035:6;13024:9;13020:22;;;5279:3;5272:4;5264:6;5260:17;5256:27;5246:2;;-1:-1;;5287:12;5246:2;5330:6;5317:20;12241:18;5349:6;5346:30;5343:2;;;-1:-1;;5379:12;5343:2;5474:3;12446:2;5454:17;5415:6;5440:32;;5437:41;5434:2;;;-1:-1;;5481:12;5434:2;12446;5415:6;5411:17;12970:82;;;;;;;;12100:968;;;;;;;;;;;:::o;13075:940::-;;;;13308:2;13296:9;13287:7;13283:23;13279:32;13276:2;;;-1:-1;;13314:12;13276:2;13365:17;13359:24;13403:18;;13395:6;13392:30;13389:2;;;-1:-1;;13425:12;13389:2;13527:6;13516:9;13512:22;;;1540:3;1533:4;1525:6;1521:17;1517:27;1507:2;;-1:-1;;1548:12;1507:2;1588:6;1582:13;1610:80;1625:64;1682:6;1625:64;:::i;1610:80::-;1696:16;1732:6;1725:5;1718:21;1762:4;;1779:3;1775:14;1768:21;;1762:4;1754:6;1750:17;1884:3;1762:4;;1868:6;1864:17;1754:6;1855:27;;1852:36;1849:2;;;-1:-1;;1891:12;1849:2;-1:-1;1917:10;;1911:217;1936:6;1933:1;1930:13;1911:217;;;2016:48;2060:3;2048:10;2016:48;:::i;:::-;2004:61;;1958:1;1951:9;;;;;2079:14;;;;2107;;1911:217;;;-1:-1;13587:18;;13581:25;13445:99;;-1:-1;13581:25;-1:-1;;;13615:30;;;13612:2;;;-1:-1;;13648:12;13612:2;13678:89;13759:7;13750:6;13739:9;13735:22;13678:89;:::i;:::-;13668:99;;13825:2;13814:9;13810:18;13804:25;13790:39;;13403:18;13841:6;13838:30;13835:2;;;-1:-1;;13871:12;13835:2;;13901:98;13991:7;13982:6;13971:9;13967:22;13901:98;:::i;:::-;13891:108;;;13270:745;;;;;:::o;14022:1255::-;;;;;;14278:3;14266:9;14257:7;14253:23;14249:33;14246:2;;;-1:-1;;14285:12;14246:2;14343:17;14330:31;14381:18;;14373:6;14370:30;14367:2;;;-1:-1;;14403:12;14367:2;14494:6;14483:9;14479:22;;;796:3;789:4;781:6;777:17;773:27;763:2;;-1:-1;;804:12;763:2;851:6;838:20;873:80;888:64;945:6;888:64;:::i;873:80::-;959:16;995:6;988:5;981:21;1025:4;;1042:3;1038:14;1031:21;;1025:4;1017:6;1013:17;1147:3;1025:4;;1131:6;1127:17;1017:6;1118:27;;1115:36;1112:2;;;-1:-1;;1154:12;1112:2;-1:-1;1180:10;;1174:206;1199:6;1196:1;1193:13;1174:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1267:50;;1221:1;1214:9;;;;;1331:14;;;;1359;;1174:206;;;-1:-1;14423:88;;-1:-1;14561:18;;14548:32;;-1:-1;;;14589:30;;;14586:2;;;-1:-1;;14622:12;14586:2;14652:78;14722:7;14713:6;14702:9;14698:22;14652:78;:::i;:::-;14642:88;;14795:2;14784:9;14780:18;14767:32;14753:46;;14381:18;14811:6;14808:30;14805:2;;;-1:-1;;14841:12;14805:2;14871:78;14941:7;14932:6;14921:9;14917:22;14871:78;:::i;:::-;14861:88;;15004:53;15049:7;14986:2;15029:9;15025:22;15004:53;:::i;:::-;14994:63;;15122:3;15111:9;15107:19;15094:33;15080:47;;14381:18;15139:6;15136:30;15133:2;;;-1:-1;;15169:12;15133:2;;15199:62;15253:7;15244:6;15233:9;15229:22;15199:62;:::i;:::-;15189:72;;;14240:1037;;;;;;;;:::o;15284:257::-;;15396:2;15384:9;15375:7;15371:23;15367:32;15364:2;;;-1:-1;;15402:12;15364:2;4819:6;4813:13;47095:5;44635:13;44628:21;47073:5;47070:32;47060:2;;-1:-1;;47106:12;15548:241;;15652:2;15640:9;15631:7;15627:23;15623:32;15620:2;;;-1:-1;;15658:12;15620:2;-1:-1;4940:20;;15614:175;-1:-1;15614:175::o;15796:322::-;;15940:3;;15928:9;15919:7;15915:23;15911:33;15908:2;;;-1:-1;;15947:12;15908:2;7026:22;15940:3;7026:22;:::i;:::-;7017:31;;7139:101;7236:3;7212:22;7139:101;:::i;:::-;7121:16;7114:127;7345:60;7401:3;7312:2;7381:9;7377:22;7345:60;:::i;:::-;7312:2;7331:5;7327:16;7320:86;7515:60;7571:3;7482:2;7551:9;7547:22;7515:60;:::i;:::-;7482:2;7501:5;7497:16;7490:86;7686:60;7742:3;7653:2;7722:9;7718:22;7686:60;:::i;:::-;7653:2;7672:5;7668:16;7661:86;7863:60;7919:3;7829;7899:9;7895:22;7863:60;:::i;:::-;7829:3;7849:5;7845:16;7838:86;8038:60;8094:3;8004;8074:9;8070:22;8038:60;:::i;:::-;8004:3;8024:5;8020:16;8013:86;8209:59;8264:3;8175;8244:9;8240:22;8209:59;:::i;:::-;8175:3;8195:5;8191:16;8184:85;8373:60;8429:3;8339;8409:9;8405:22;8373:60;:::i;:::-;8339:3;8359:5;8355:16;8348:86;8513:3;8549:60;8605:3;8513;8585:9;8581:22;8549:60;:::i;:::-;8529:18;;;8522:88;8691:3;8727:60;8783:3;8759:22;;;8727:60;:::i;:::-;8707:18;;;8700:88;8872:3;8908:60;8964:3;8940:22;;;8908:60;:::i;:::-;8888:18;;;8881:88;9028:3;9064:58;9118:3;9094:22;;;9064:58;:::i;:::-;9044:18;;;9037:86;9048:5;15902:216;-1:-1;;;15902:216::o;16373:263::-;;16488:2;16476:9;16467:7;16463:23;16459:32;16456:2;;;-1:-1;;16494:12;16456:2;-1:-1;9507:13;;16450:186;-1:-1;16450:186::o;16643:366::-;;;16764:2;16752:9;16743:7;16739:23;16735:32;16732:2;;;-1:-1;;16770:12;16732:2;-1:-1;;9359:20;;;16922:2;16961:22;;;9359:20;;-1:-1;16726:283::o;17016:491::-;;;;17154:2;17142:9;17133:7;17129:23;17125:32;17122:2;;;-1:-1;;17160:12;17122:2;9372:6;9359:20;17212:63;;17312:2;17355:9;17351:22;9359:20;17320:63;;17420:2;17463:9;17459:22;72:20;97:33;124:5;97:33;:::i;:::-;17428:63;;;;17116:391;;;;;:::o;17515:173::-;-1:-1;;;;;45164:54;18163:45;;17677:4;17668:14;;17595:93::o;18076:137::-;-1:-1;;;;;45164:54;18163:45;;18157:56::o;20639:920::-;;20859:5;41603:12;42800:6;42795:3;42788:19;42837:4;;42832:3;42828:14;20871:102;;;;42837:4;21030:6;21026:17;21021:3;21017:27;21005:39;;42837:4;21124:5;41132:14;-1:-1;21163:357;21188:6;21185:1;21182:13;21163:357;;;21250:9;21244:4;21240:20;21235:3;21228:33;17998:64;18058:3;21295:6;21289:13;17998:64;:::i;:::-;21499:14;;;;21309:90;-1:-1;42289:14;;;;21210:1;21203:9;21163:357;;;-1:-1;21543:10;;20781:778;-1:-1;;;;;;;20781:778::o;21598:467::-;42788:19;;;21598:467;-1:-1;;;;;21846:78;;21843:2;;;-1:-1;;21927:12;21843:2;42837:4;21962:6;21958:17;45576:6;45571:3;42837:4;42832:3;42828:14;45553:30;45614:16;;;;42837:4;45614:16;45607:27;;;-1:-1;45614:16;;21730:335;-1:-1;21730:335::o;22554:297::-;;42800:6;42795:3;42788:19;45576:6;45571:3;42837:4;42832:3;42828:14;45553:30;-1:-1;42837:4;45623:6;42832:3;45614:16;;45607:27;42837:4;46009:7;;46013:2;22837:6;45993:14;45989:28;42832:3;22806:39;;22799:46;;22654:197;;;;;:::o;22859:323::-;;22991:5;41603:12;42800:6;42795:3;42788:19;23074:52;23119:6;42837:4;42832:3;42828:14;42837:4;23100:5;23096:16;23074:52;:::i;:::-;46009:7;45993:14;-1:-1;;45989:28;23138:39;;;;42837:4;23138:39;;22939:243;-1:-1;;22939:243::o;27137:110::-;45083:6;45072:18;27206:36;;27200:47::o;27374:271::-;;23349:5;41603:12;23460:52;23505:6;23500:3;23493:4;23486:5;23482:16;23460:52;:::i;:::-;23524:16;;;;;27508:137;-1:-1;;27508:137::o;27652:1559::-;;23349:5;41603:12;23460:52;23505:6;23500:3;23493:4;23486:5;23482:16;23460:52;:::i;:::-;23533:6;23528:3;23524:16;23517:23;;-1:-1;;;25956:3;25943:11;25936:24;23349:5;41603:12;23460:52;23505:6;25921:1;25983:3;25979:11;23493:4;23486:5;23482:16;23460:52;:::i;:::-;25921:1;23524:16;;;;;25936:24;41603:12;;23460:52;41603:12;25979:11;;;23493:4;23482:16;;23460:52;:::i;:::-;-1:-1;;;25979:11;23524:16;;;;;;;26668:25;41603:12;;23460:52;41603:12;26712:11;;;23493:4;23482:16;;23460:52;:::i;:::-;23524:16;26712:11;23524:16;;28235:976;-1:-1;;;;;;28235:976::o;29218:222::-;-1:-1;;;;;45164:54;;;;18163:45;;29345:2;29330:18;;29316:124::o;29708:333::-;-1:-1;;;;;45164:54;;;18163:45;;45164:54;;30027:2;30012:18;;18163:45;29863:2;29848:18;;29834:207::o;30048:1498::-;-1:-1;;;;;45164:54;;18163:45;;30550:3;30669:2;30654:18;;;30647:48;;;30535:19;;;42788;;;30048:1498;;18806:21;;42828:14;;;30048:1498;18833:291;18858:6;18855:1;18852:13;18833:291;;;30669:2;18954:6;44338:12;18975:63;19034:3;44312:39;44338:12;18954:6;44312:39;:::i;:::-;18975:63;:::i;:::-;19045:72;;-1:-1;18968:70;-1:-1;18880:1;18873:9;18833:291;;;18837:14;30875:9;30869:4;30865:20;30860:2;30849:9;30845:18;30838:48;30900:118;31013:4;31004:6;30996;30900:118;:::i;:::-;30892:126;;;;31066:9;31060:4;31056:20;31051:2;31040:9;31036:18;31029:48;31091:118;31204:4;31195:6;31187;31091:118;:::i;:::-;31083:126;;31220:73;31288:3;31277:9;31273:19;31264:6;31220:73;:::i;:::-;31342:9;31336:4;31332:20;31326:3;31315:9;31311:19;31304:49;31367:86;31448:4;31439:6;31431;31367:86;:::i;:::-;31359:94;;;31464:72;31531:3;31520:9;31516:19;31506:7;31464:72;:::i;:::-;30521:1025;;;;;;;;;;;;;;:::o;31553:333::-;-1:-1;;;;;45164:54;;;;18163:45;;31872:2;31857:18;;22245:37;31708:2;31693:18;;31679:207::o;31893:444::-;-1:-1;;;;;45164:54;;;18163:45;;32240:2;32225:18;;22245:37;;;;45164:54;;;32323:2;32308:18;;18163:45;32076:2;32061:18;;32047:290::o;32344:552::-;-1:-1;;;;;45164:54;;;18163:45;;32718:2;32703:18;;22245:37;;;;45164:54;;32801:2;32786:18;;18163:45;45083:6;45072:18;;;32882:2;32867:18;;27206:36;32553:3;32538:19;;32524:372::o;32903:556::-;-1:-1;;;;;45164:54;;;18163:45;;33279:2;33264:18;;22245:37;;;;33362:2;33347:18;;22245:37;;;;45164:54;;;33445:2;33430:18;;18163:45;33114:3;33099:19;;33085:374::o;33466:664::-;-1:-1;;;;;45164:54;;;18163:45;;33868:2;33853:18;;22245:37;;;;33951:2;33936:18;;22245:37;;;;45083:6;45072:18;34032:2;34017:18;;27206:36;45164:54;;;34115:3;34100:19;;18163:45;33703:3;33688:19;;33674:456::o;34137:924::-;34488:2;34502:47;;;41603:12;;34473:18;;;42788:19;;;34137:924;;42837:4;;42828:14;;;;41132;;;34137:924;19593:260;19618:6;19615:1;19612:13;19593:260;;;17602:46;17644:3;19685:6;19679:13;17602:46;:::i;:::-;17668:14;;;;42289;;;;19640:1;19633:9;19593:260;;;-1:-1;;;34709:20;;;34689:18;;;34682:48;41603:12;;42788:19;;;41132:14;;;;42828;;;-1:-1;20322:260;20347:6;20344:1;20341:13;20322:260;;;20408:13;;22245:37;;42289:14;;;;17850;;;;19640:1;20362:9;20322:260;;;20326:14;;34900:9;34894:4;34890:20;34885:2;34874:9;34870:18;34863:48;34925:126;35046:4;35037:6;34925:126;:::i;:::-;34917:134;34459:602;-1:-1;;;;;;;;34459:602::o;35068:210::-;44635:13;;44628:21;22138:34;;35189:2;35174:18;;35160:118::o;35285:222::-;22245:37;;;35412:2;35397:18;;35383:124::o;35514:218::-;-1:-1;;;;;;44801:78;;;;22483:36;;35639:2;35624:18;;35610:122::o;35739:310::-;;35886:2;35907:17;35900:47;35961:78;35886:2;35875:9;35871:18;36025:6;35961:78;:::i;36056:416::-;36256:2;36270:47;;;24498:2;36241:18;;;42788:19;24534:29;42828:14;;;24514:50;24583:12;;;36227:245::o;36479:416::-;36679:2;36693:47;;;24834:2;36664:18;;;42788:19;24870:34;42828:14;;;24850:55;-1:-1;;;24925:12;;;24918:30;24967:12;;;36650:245::o;36902:416::-;37102:2;37116:47;;;25218:2;37087:18;;;42788:19;-1:-1;;;42828:14;;;25234:43;25296:12;;;37073:245::o;37325:416::-;37525:2;37539:47;;;25547:2;37510:18;;;42788:19;25583:31;42828:14;;;25563:52;25634:12;;;37496:245::o;37748:416::-;37948:2;37962:47;;;26229:2;37933:18;;;42788:19;26265:34;42828:14;;;26245:55;-1:-1;;;26320:12;;;26313:34;26366:12;;;37919:245::o;38171:416::-;38371:2;38385:47;;;26962:2;38356:18;;;42788:19;26998:34;42828:14;;;26978:55;-1:-1;;;27053:12;;;27046:46;27111:12;;;38342:245::o;38594:218::-;45083:6;45072:18;;;;27206:36;;38719:2;38704:18;;38690:122::o;39048:256::-;39110:2;39104:9;39136:17;;;39211:18;39196:34;;39232:22;;;39193:62;39190:2;;;39268:1;;39258:12;39190:2;39110;39277:22;39088:216;;-1:-1;39088:216::o;39311:304::-;;39470:18;39462:6;39459:30;39456:2;;;-1:-1;;39492:12;39456:2;-1:-1;39537:4;39525:17;;;39590:15;;39393:222::o;40564:321::-;;40707:18;40699:6;40696:30;40693:2;;;-1:-1;;40729:12;40693:2;-1:-1;46009:7;40783:17;-1:-1;;40779:33;40870:4;40860:15;;40630:255::o;45649:268::-;45714:1;45721:101;45735:6;45732:1;45729:13;45721:101;;;45802:11;;;45796:18;45783:11;;;45776:39;45757:2;45750:10;45721:101;;;45837:6;45834:1;45831:13;45828:2;;;-1:-1;;45714:1;45884:16;;45877:27;45698:219::o;46030:106::-;46115:3;46111:15;;46083:53::o;46144:739::-;;46217:4;46199:16;46196:26;46193:2;;;46225:5;;46193:2;46259:1;-1:-1;;46238:23;46334:10;46277:34;-1:-1;46302:8;46277:34;:::i;:::-;46326:19;46316:2;;46349:5;;46316:2;46380;46374:9;46416:16;-1:-1;;46412:24;46259:1;46374:9;46388:49;46463:4;46457:11;46544:16;46496:18;46544:16;46537:4;46529:6;46525:17;46522:39;46496:18;46488:6;46485:30;46476:91;46473:2;;;46575:5;;;;;;46473:2;46613:6;46607:4;46603:17;46592:28;;46645:3;46639:10;46625:24;;46496:18;46660:6;46657:30;46654:2;;;46690:5;;;;;;46654:2;;46767:16;46761:4;46757:27;46727:4;46734:6;46722:3;46714:27;;46749:36;46746:2;;;46788:5;;;;;46746:2;46009:7;45993:14;-1:-1;;45989:28;46812:50;;46727:4;46812:50;46380:2;46801:62;46820:3;-1:-1;;46187:696;:::o;46890:117::-;-1:-1;;;;;45164:54;;46949:35;;46939:2;;46998:1;;46988:12
Swarm Source
ipfs://35451690bfe60f86edd33d73630acdaa60badf51b2214745bc5b992ac3c0c0bc
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.