More Info
Private Name Tags
ContractCreator
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repay | 13124516 | 1265 days ago | IN | 0 ETH | 0.06773216 | ||||
Deposit | 13117629 | 1266 days ago | IN | 0 ETH | 0.05006096 | ||||
Report | 13117504 | 1266 days ago | IN | 0 ETH | 0.01050395 | ||||
Claim Rewards | 13117489 | 1266 days ago | IN | 0 ETH | 0.02888081 | ||||
Deposit | 13104839 | 1268 days ago | IN | 0 ETH | 0.0251909 | ||||
Report | 13104738 | 1268 days ago | IN | 0 ETH | 0.00599372 | ||||
Claim Rewards | 13104710 | 1268 days ago | IN | 0 ETH | 0.01680376 | ||||
Deposit | 13085408 | 1271 days ago | IN | 0 ETH | 0.04712394 | ||||
Report | 13085302 | 1271 days ago | IN | 0 ETH | 0.00746872 | ||||
Claim Rewards | 13085264 | 1271 days ago | IN | 0 ETH | 0.02705817 | ||||
Deposit | 13052449 | 1276 days ago | IN | 0 ETH | 0.01095374 | ||||
Report | 13052274 | 1276 days ago | IN | 0 ETH | 0.00371283 | ||||
Claim Rewards | 13052258 | 1276 days ago | IN | 0 ETH | 0.01073297 | ||||
Report | 13047557 | 1277 days ago | IN | 0 ETH | 0.00294774 | ||||
Claim Rewards | 13047542 | 1277 days ago | IN | 0 ETH | 0.00792631 | ||||
Deposit | 13047407 | 1277 days ago | IN | 0 ETH | 0.00992564 | ||||
Report | 13033090 | 1279 days ago | IN | 0 ETH | 0.00531743 | ||||
Claim Rewards | 13033071 | 1279 days ago | IN | 0 ETH | 0.0140031 | ||||
Deposit | 13014934 | 1282 days ago | IN | 0 ETH | 0.03061909 | ||||
Set Admin | 13002574 | 1284 days ago | IN | 0 ETH | 0.00162722 | ||||
Set Next Time Lo... | 13002571 | 1284 days ago | IN | 0 ETH | 0.00254451 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyCompLevDai
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-11 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.6; 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. uint 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, uint 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, uint 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, uint 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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(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); } } } } interface CErc20 { function mint(uint mintAmount) external returns (uint); function redeemUnderlying(uint redeemAmount) external returns (uint); function borrow(uint borrowAmount) external returns (uint); function repayBorrow(uint repayAmount) external returns (uint); function redeem(uint) external returns (uint); function borrowBalanceCurrent(address account) external returns (uint); function balanceOfUnderlying(address account) external returns (uint); function getAccountSnapshot(address account) external view returns ( uint, uint, uint, uint ); } interface Comptroller { function markets(address cToken) external view returns ( bool, uint, bool ); // Claim all the COMP accrued by holder in specific markets function claimComp(address holder, address[] calldata cTokens) external; } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint); /** * @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, uint 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 (uint); /** * @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, uint 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, uint 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, uint 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, uint value); } interface IFundManager { function token() external view returns (address); function borrow(uint amount) external returns (uint); function repay(uint amount) external returns (uint); function report(uint gain, uint loss) external; function getDebt(address strategy) external view returns (uint); } library SafeERC20 { using SafeMath for uint; using Address for address; function safeTransfer( IERC20 token, address to, uint value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint 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, uint 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, uint value ) internal { uint newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint value ) internal { uint 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" ); } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint a, uint b) internal pure returns (bool, uint) { uint c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint a, uint b) internal pure returns (bool, uint) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint a, uint b) internal pure returns (bool, uint) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint a, uint b) internal pure returns (bool, uint) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint a, uint b) internal pure returns (bool, uint) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint a, uint b) internal pure returns (uint) { uint 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(uint a, uint b) internal pure returns (uint) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint a, uint b) internal pure returns (uint) { if (a == 0) return 0; uint c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. 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(uint a, uint b) internal pure returns (uint) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint a, uint b) internal pure returns (uint) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b > 0, errorMessage); return a % b; } } abstract contract Strategy { using SafeERC20 for IERC20; using SafeMath for uint; event SetNextTimeLock(address nextTimeLock); event AcceptTimeLock(address timeLock); event SetAdmin(address admin); event Authorize(address addr, bool authorized); event SetTreasury(address treasury); event SetFundManager(address fundManager); event Deposit(uint amount, uint borrowed); event Repay(uint amount, uint repaid); event Withdraw(uint amount, uint withdrawn, uint loss); event ClaimRewards(uint profit); event Skim(uint total, uint debt, uint profit); event Report(uint gain, uint loss, uint free, uint total, uint debt); // Privilege - time lock >= admin >= authorized addresses address public timeLock; address public nextTimeLock; address public admin; address public treasury; // Profit is sent to this address // authorization other than time lock and admin mapping(address => bool) public authorized; IERC20 public immutable token; IFundManager public fundManager; // Performance fee sent to treasury uint public perfFee = 1000; uint private constant PERF_FEE_CAP = 2000; // Upper limit to performance fee uint internal constant PERF_FEE_MAX = 10000; bool public claimRewardsOnMigrate = true; constructor( address _token, address _fundManager, address _treasury ) { // Don't allow accidentally sending perf fee to 0 address require(_treasury != address(0), "treasury = 0 address"); timeLock = msg.sender; admin = msg.sender; treasury = _treasury; require( IFundManager(_fundManager).token() == _token, "fund manager token != token" ); fundManager = IFundManager(_fundManager); token = IERC20(_token); IERC20(_token).safeApprove(_fundManager, type(uint).max); } modifier onlyTimeLock() { require(msg.sender == timeLock, "!time lock"); _; } modifier onlyTimeLockOrAdmin() { require(msg.sender == timeLock || msg.sender == admin, "!auth"); _; } modifier onlyAuthorized() { require( msg.sender == timeLock || msg.sender == admin || authorized[msg.sender], "!auth" ); _; } modifier onlyFundManager() { require(msg.sender == address(fundManager), "!fund manager"); _; } /* @notice Set next time lock @param _nextTimeLock Address of next time lock @dev nextTimeLock can become timeLock by calling acceptTimeLock() */ function setNextTimeLock(address _nextTimeLock) external onlyTimeLock { // Allow next time lock to be zero address (cancel next time lock) nextTimeLock = _nextTimeLock; emit SetNextTimeLock(_nextTimeLock); } /* @notice Set timeLock to msg.sender @dev msg.sender must be nextTimeLock */ function acceptTimeLock() external { require(msg.sender == nextTimeLock, "!next time lock"); timeLock = msg.sender; nextTimeLock = address(0); emit AcceptTimeLock(msg.sender); } /* @notice Set admin @param _admin Address of admin */ function setAdmin(address _admin) external onlyTimeLockOrAdmin { require(_admin != address(0), "admin = 0 address"); admin = _admin; emit SetAdmin(_admin); } /* @notice Set authorization @param _addr Address to authorize @param _authorized Boolean */ function authorize(address _addr, bool _authorized) external onlyTimeLockOrAdmin { require(_addr != address(0), "addr = 0 address"); authorized[_addr] = _authorized; emit Authorize(_addr, _authorized); } /* @notice Set treasury @param _treasury Address of treasury */ function setTreasury(address _treasury) external onlyTimeLockOrAdmin { // Don't allow accidentally sending perf fee to 0 address require(_treasury != address(0), "treasury = 0 address"); treasury = _treasury; emit SetTreasury(_treasury); } /* @notice Set performance fee @param _fee Performance fee */ function setPerfFee(uint _fee) external onlyTimeLockOrAdmin { require(_fee <= PERF_FEE_CAP, "fee > cap"); perfFee = _fee; } function setFundManager(address _fundManager) external onlyTimeLock { if (address(fundManager) != address(0)) { token.safeApprove(address(fundManager), 0); } require( IFundManager(_fundManager).token() == address(token), "new fund manager token != token" ); fundManager = IFundManager(_fundManager); token.safeApprove(_fundManager, type(uint).max); emit SetFundManager(_fundManager); } /* @notice Set `claimRewardsOnMigrate`. If `false` skip call to `claimRewards` when `migrate` is called. @param _claimRewards Boolean to call or skip call to `claimRewards` */ function setClaimRewardsOnMigrate(bool _claimRewards) external onlyTimeLockOrAdmin { claimRewardsOnMigrate = _claimRewards; } /* @notice Transfer funds from `_from` address. Used for migration. @param _from Address to transfer token from @param _amount Amount of token to transfer */ function transferTokenFrom(address _from, uint _amount) external onlyAuthorized { token.safeTransferFrom(_from, address(this), _amount); } /* @notice Returns approximate amount of token locked in this contract @dev Output may vary depending on price pulled from external DeFi contracts */ function totalAssets() external view virtual returns (uint); /* @notice Deposit into strategy @param _amount Amount of token to deposit from fund manager @param _min Minimum amount borrowed */ function deposit(uint _amount, uint _min) external virtual; /* @notice Withdraw token from this contract @dev Only callable by fund manager @dev Returns current loss = debt to fund manager - total assets */ function withdraw(uint _amount) external virtual returns (uint); /* @notice Repay fund manager @param _amount Amount of token to repay to fund manager @param _min Minimum amount repaid @dev Call report after this to report any loss */ function repay(uint _amount, uint _min) external virtual; /* @notice Claim any reward tokens, sell for token @param _minProfit Minumum amount of token to gain from selling rewards */ function claimRewards(uint _minProfit) external virtual; /* @notice Free up any profit over debt */ function skim() external virtual; /* @notice Report gain or loss back to fund manager @param _minTotal Minimum value of total assets. Used to protect against price manipulation. @param _maxTotal Maximum value of total assets Used Used to protect against price manipulation. */ function report(uint _minTotal, uint _maxTotal) external virtual; /* @notice Claim rewards, skim and report @param _minProfit Minumum amount of token to gain from selling rewards @param _minTotal Minimum value of total assets. Used to protect against price manipulation. @param _maxTotal Maximum value of total assets Used Used to protect against price manipulation. */ function harvest( uint _minProfit, uint _minTotal, uint _maxTotal ) external virtual; /* @notice Migrate to new version of this strategy @param _strategy Address of new strategy @dev Only callable by fund manager */ function migrate(address _strategy) external virtual; /* @notice Transfer token accidentally sent here back to admin @param _token Address of token to transfer */ function sweep(address _token) external virtual; } contract StrategyCompLev is Strategy { using SafeERC20 for IERC20; using SafeMath for uint; // Uniswap and Sushiswap // // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public dex; // Compound // Comptroller private constant comptroller = Comptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); IERC20 private constant comp = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888); CErc20 private immutable cToken; uint public buffer = 0.04 * 1e18; constructor( address _token, address _fundManager, address _treasury, address _cToken ) Strategy(_token, _fundManager, _treasury) { require(_cToken != address(0), "cToken = zero address"); cToken = CErc20(_cToken); IERC20(_token).safeApprove(_cToken, type(uint).max); _setDex(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // Sushiswap } function _setDex(address _dex) private { if (dex != address(0)) { comp.safeApprove(dex, 0); } dex = _dex; comp.safeApprove(_dex, type(uint).max); } function setDex(address _dex) external onlyTimeLock { require(_dex != address(0), "dex = 0 address"); _setDex(_dex); } function _totalAssets() private view returns (uint total) { // WARNING: This returns balance last time someone transacted with cToken (uint error, uint cTokenBal, uint borrowed, uint exchangeRate) = cToken .getAccountSnapshot(address(this)); if (error > 0) { // something is wrong, return 0 return 0; } uint supplied = cTokenBal.mul(exchangeRate) / 1e18; if (supplied < borrowed) { // something is wrong, return 0 return 0; } total = token.balanceOf(address(this)).add(supplied - borrowed); } /* @notice Returns amount of tokens locked in this contract */ function totalAssets() external view override returns (uint) { return _totalAssets(); } /* @dev buffer = 0 means safe collateral ratio = market collateral ratio buffer = 1e18 means safe collateral ratio = 0 */ function setBuffer(uint _buffer) external onlyAuthorized { require(_buffer > 0 && _buffer <= 1e18, "buffer"); buffer = _buffer; } function _getMarketCollateralRatio() private view returns (uint) { /* This can be changed by Compound Governance, with a minimum waiting period of five days */ (, uint col, ) = comptroller.markets(address(cToken)); return col; } function _getSafeCollateralRatio(uint _marketCol) private view returns (uint) { if (_marketCol > buffer) { return _marketCol - buffer; } return 0; } // Not view function function _getSupplied() private returns (uint) { return cToken.balanceOfUnderlying(address(this)); } // Not view function function _getBorrowed() private returns (uint) { return cToken.borrowBalanceCurrent(address(this)); } // Not view function. Call using static call from web3 function getLivePosition() external returns ( uint supplied, uint borrowed, uint marketCol, uint safeCol ) { supplied = _getSupplied(); borrowed = _getBorrowed(); marketCol = _getMarketCollateralRatio(); safeCol = _getSafeCollateralRatio(marketCol); } // @dev This returns balance last time someone transacted with cToken function getCachedPosition() external view returns ( uint supplied, uint borrowed, uint marketCol, uint safeCol ) { // ignore first output, which is error code (, uint cTokenBal, uint _borrowed, uint exchangeRate) = cToken .getAccountSnapshot(address(this)); supplied = cTokenBal.mul(exchangeRate) / 1e18; borrowed = _borrowed; marketCol = _getMarketCollateralRatio(); safeCol = _getSafeCollateralRatio(marketCol); } // @dev This modifier checks collateral ratio after leverage or deleverage modifier checkCollateralRatio() { _; uint supplied = _getSupplied(); uint borrowed = _getBorrowed(); uint marketCol = _getMarketCollateralRatio(); uint safeCol = _getSafeCollateralRatio(marketCol); // borrowed / supplied <= safe col // supplied can = 0 so we check borrowed <= supplied * safe col // max borrow uint max = supplied.mul(safeCol) / 1e18; require(borrowed <= max, "borrowed > max"); } // @dev In case infinite approval is reduced so that strategy cannot function function approve(uint _amount) external onlyAuthorized { token.safeApprove(address(cToken), _amount); } function _supply(uint _amount) private { require(cToken.mint(_amount) == 0, "mint"); } // @dev Execute manual recovery by admin // @dev `_amount` must be >= balance of token function supplyManual(uint _amount) external onlyAuthorized { _supply(_amount); } function _borrow(uint _amount) private { require(cToken.borrow(_amount) == 0, "borrow"); } // @dev Execute manual recovery by admin function borrowManual(uint _amount) external onlyAuthorized { _borrow(_amount); } function _repay(uint _amount) private { require(cToken.repayBorrow(_amount) == 0, "repay"); } // @dev Execute manual recovery by admin // @dev `_amount` must be >= balance of token function repayManual(uint _amount) external onlyAuthorized { _repay(_amount); } function _redeem(uint _amount) private { require(cToken.redeemUnderlying(_amount) == 0, "redeem"); } // @dev Execute manual recovery by admin function redeemManual(uint _amount) external onlyAuthorized { _redeem(_amount); } function _getMaxLeverageRatio(uint _col) private pure returns (uint) { /* c = collateral ratio geometric series converges to 1 / (1 - c) */ // multiplied by 1e18 return uint(1e36).div(uint(1e18).sub(_col)); } function _getBorrowAmount( uint _supplied, uint _borrowed, uint _col ) private pure returns (uint) { /* c = collateral ratio s = supplied b = borrowed x = amount to borrow (b + x) / s <= c becomes x <= sc - b */ // max borrow uint max = _supplied.mul(_col) / 1e18; if (_borrowed >= max) { return 0; } return max - _borrowed; } /* Find total supply S_n after n iterations starting with S_0 supplied and B_0 borrowed c = collateral ratio S_i = supplied after i iterations B_i = borrowed after i iterations S_0 = current supplied B_0 = current borrowed borrowed and supplied after n iterations B_n = cS_(n-1) S_n = S_(n-1) + (cS_(n-1) - B_(n-1)) you can prove using algebra and induction that B_n / S_n <= c S_n - S_(n-1) = c^(n-1) * (cS_0 - B_0) S_n = S_0 + sum (c^i * (cS_0 - B_0)), 0 <= i <= n - 1 = S_0 + (1 - c^n) / (1 - c) S_n <= S_0 + (cS_0 - B_0) / (1 - c) */ function _leverage(uint _targetSupply) private checkCollateralRatio { // buffer = 1e18 means safe collateral ratio = 0 if (buffer >= 1e18) { return; } uint supplied = _getSupplied(); uint borrowed = _getBorrowed(); uint unleveraged = supplied.sub(borrowed); // supply with 0 leverage require(_targetSupply >= supplied, "leverage"); uint marketCol = _getMarketCollateralRatio(); uint safeCol = _getSafeCollateralRatio(marketCol); uint lev = _getMaxLeverageRatio(safeCol); // 99% to be safe, and save gas uint max = (unleveraged.mul(lev) / 1e18).mul(9900) / 10000; if (_targetSupply >= max) { _targetSupply = max; } uint i; while (supplied < _targetSupply) { // target is usually reached in 9 iterations require(i < 25, "max iteration"); // use market collateral to calculate borrow amount // this is done so that supplied can reach _targetSupply // 99.99% is borrowed to be safe uint borrowAmount = _getBorrowAmount(supplied, borrowed, marketCol).mul( 9999 ) / 10000; require(borrowAmount > 0, "borrow = 0"); if (supplied.add(borrowAmount) > _targetSupply) { // borrow > 0 since supplied < _targetSupply borrowAmount = _targetSupply.sub(supplied); } _borrow(borrowAmount); // end loop with _supply, this ensures no borrowed amount is unutilized _supply(borrowAmount); // supplied > _getSupplied(), by about 3 * 1e12 %, but we use local variable to save gas supplied = supplied.add(borrowAmount); // _getBorrowed == borrowed borrowed = borrowed.add(borrowAmount); i++; } } function leverage(uint _targetSupply) external onlyAuthorized { _leverage(_targetSupply); } function _deposit() private { uint bal = token.balanceOf(address(this)); if (bal > 0) { _supply(bal); // leverage to max _leverage(type(uint).max); } } /* @notice Deposit token into this strategy @param _amount Amount of token to deposit @param _min Minimum amount to borrow from fund manager */ function deposit(uint _amount, uint _min) external override onlyAuthorized { require(_amount > 0, "deposit = 0"); uint borrowed = fundManager.borrow(_amount); require(borrowed >= _min, "borrowed < min"); _deposit(); emit Deposit(_amount, borrowed); } function _getRedeemAmount( uint _supplied, uint _borrowed, uint _col ) private pure returns (uint) { /* c = collateral ratio s = supplied b = borrowed r = redeem b / (s - r) <= c becomes r <= s - b / c */ // min supply // b / c = min supply needed to borrow b uint min = _borrowed.mul(1e18).div(_col); if (_supplied <= min) { return 0; } return _supplied - min; } /* Find S_0, amount of supply with 0 leverage, after n iterations starting with S_n supplied and B_n borrowed c = collateral ratio S_n = current supplied B_n = current borrowed S_(n-i) = supplied after i iterations B_(n-i) = borrowed after i iterations R_(n-i) = Redeemable after i iterations = S_(n-i) - B_(n-i) / c where B_(n-i) / c = min supply needed to borrow B_(n-i) For 0 <= k <= n - 1 S_k = S_(k+1) - R_(k+1) B_k = B_(k+1) - R_(k+1) and S_k - B_k = S_(k+1) - B_(k+1) so S_0 - B_0 = S_1 - S_2 = ... = S_n - B_n S_0 has 0 leverage so B_0 = 0 and we get S_0 = S_0 - B_0 = S_n - B_n ------------------------------------------ Find S_(n-k), amount of supply, after k iterations starting with S_n supplied and B_n borrowed with algebra and induction you can derive that R_(n-k) = R_n / c^k S_(n-k) = S_n - sum R_(n-i), 0 <= i <= k - 1 = S_n - R_n * ((1 - 1/c^k) / (1 - 1/c)) Equation above is valid for S_(n - k) k < n */ function _deleverage(uint _targetSupply) private checkCollateralRatio { uint supplied = _getSupplied(); uint borrowed = _getBorrowed(); uint unleveraged = supplied.sub(borrowed); require(_targetSupply <= supplied, "deleverage"); uint marketCol = _getMarketCollateralRatio(); // min supply if (_targetSupply <= unleveraged) { _targetSupply = unleveraged; } uint i; while (supplied > _targetSupply) { // target is usually reached in 8 iterations require(i < 25, "max iteration"); // 99.99% to be safe uint redeemAmount = (_getRedeemAmount(supplied, borrowed, marketCol)).mul( 9999 ) / 10000; require(redeemAmount > 0, "redeem = 0"); if (supplied.sub(redeemAmount) < _targetSupply) { // redeem > 0 since supplied > _targetSupply redeemAmount = supplied.sub(_targetSupply); } _redeem(redeemAmount); _repay(redeemAmount); // supplied < _geSupplied(), by about 7 * 1e12 % supplied = supplied.sub(redeemAmount); // borrowed == _getBorrowed() borrowed = borrowed.sub(redeemAmount); i++; } } function deleverage(uint _targetSupply) external onlyAuthorized { _deleverage(_targetSupply); } // @dev Returns amount available for transfer function _withdraw(uint _amount) private returns (uint) { uint bal = token.balanceOf(address(this)); if (_amount <= bal) { return _amount; } uint redeemAmount = _amount - bal; /* c = collateral ratio s = supplied b = borrowed r = amount to redeem x = amount to repay where r <= s - b (can't redeem more than unleveraged supply) and x <= b (can't repay more than borrowed) and (b - x) / (s - x - r) <= c (stay below c after redeem and repay) so pick x such that (b - cs + cr) / (1 - c) <= x <= b when b <= cs left side of equation above <= cr / (1 - c) so pick x such that cr / (1 - c) <= x <= b */ uint supplied = _getSupplied(); uint borrowed = _getBorrowed(); uint marketCol = _getMarketCollateralRatio(); uint safeCol = _getSafeCollateralRatio(marketCol); uint unleveraged = supplied.sub(borrowed); // r <= s - b if (redeemAmount > unleveraged) { redeemAmount = unleveraged; } // cr / (1 - c) <= x <= b uint repayAmount = redeemAmount.mul(safeCol).div(uint(1e18).sub(safeCol)); if (repayAmount > borrowed) { repayAmount = borrowed; } _deleverage(supplied.sub(repayAmount)); _redeem(redeemAmount); uint balAfter = token.balanceOf(address(this)); if (balAfter < _amount) { return balAfter; } return _amount; } /* @notice Withdraw undelying token to erc20Vault @param _amount Amount of token to withdraw @dev Returns current loss = debt to fund manager - total assets @dev Caller should implement guard against slippage */ function withdraw(uint _amount) external override onlyFundManager returns (uint loss) { require(_amount > 0, "withdraw = 0"); // availabe <= _amount uint available = _withdraw(_amount); uint debt = fundManager.getDebt(address(this)); uint total = _totalAssets(); if (debt > total) { loss = debt - total; } if (available > 0) { token.safeTransfer(msg.sender, available); } emit Withdraw(_amount, available, loss); } function repay(uint _amount, uint _min) external override { require(_amount > 0, "repay = 0"); // availabe <= _amount uint available = _withdraw(_amount); uint repaid = fundManager.repay(available); require(repaid >= _min, "repaid < min"); emit Repay(_amount, repaid); } /* @dev Uniswap fails with zero address so no check is necessary here */ function _swap( address _from, address _to, uint _amount ) private { // create dynamic array with 3 elements address[] memory path = new address[](3); path[0] = _from; path[1] = WETH; path[2] = _to; UniswapV2Router(dex).swapExactTokensForTokens( _amount, 1, path, address(this), block.timestamp ); } function _claimRewards(uint _minProfit) private { // calculate profit = balance of token after - balance of token before uint diff = token.balanceOf(address(this)); // claim COMP address[] memory cTokens = new address[](1); cTokens[0] = address(cToken); comptroller.claimComp(address(this), cTokens); uint compBal = comp.balanceOf(address(this)); if (compBal > 0) { _swap(address(comp), address(token), compBal); } diff = token.balanceOf(address(this)) - diff; require(diff >= _minProfit, "profit < min"); // transfer performance fee to treasury if (diff > 0) { uint fee = diff.mul(perfFee) / PERF_FEE_MAX; if (fee > 0) { token.safeTransfer(treasury, fee); diff = diff.sub(fee); } } emit ClaimRewards(diff); } function claimRewards(uint _minProfit) external override onlyAuthorized { _claimRewards(_minProfit); } function _skim() private { uint total = _totalAssets(); uint debt = fundManager.getDebt(address(this)); require(total > debt, "total <= debt"); uint profit = total - debt; // reassign to actual amount withdrawn profit = _withdraw(profit); emit Skim(total, debt, profit); } function skim() external override onlyAuthorized { _skim(); } function _report(uint _minTotal, uint _maxTotal) private { uint total = _totalAssets(); require(total >= _minTotal, "total < min"); require(total <= _maxTotal, "total > max"); uint gain = 0; uint loss = 0; uint free = 0; uint debt = fundManager.getDebt(address(this)); if (total > debt) { gain = total - debt; free = token.balanceOf(address(this)); if (gain > free) { gain = free; } } else { loss = debt - total; } if (gain > 0 || loss > 0) { fundManager.report(gain, loss); } emit Report(gain, loss, free, total, debt); } function report(uint _minTotal, uint _maxTotal) external override onlyAuthorized { _report(_minTotal, _maxTotal); } function harvest( uint _minProfit, uint _minTotal, uint _maxTotal ) external override onlyAuthorized { _claimRewards(_minProfit); _skim(); _report(_minTotal, _maxTotal); } function migrate(address _strategy) external override onlyFundManager { Strategy strat = Strategy(_strategy); require(address(strat.token()) == address(token), "strategy token != token"); require( address(strat.fundManager()) == address(fundManager), "strategy fund manager != fund manager" ); if (claimRewardsOnMigrate) { _claimRewards(1); } uint bal = _withdraw(type(uint).max); token.safeApprove(_strategy, bal); strat.transferTokenFrom(address(this), bal); } /* @notice Transfer token accidentally sent here to admin @param _token Address of token to transfer */ function sweep(address _token) external override onlyAuthorized { require(_token != address(token), "protected token"); require(_token != address(cToken), "protected token"); require(_token != address(comp), "protected token"); IERC20(_token).safeTransfer(admin, IERC20(_token).balanceOf(address(this))); } } interface UniswapV2Router { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); } contract StrategyCompLevDai is StrategyCompLev { constructor(address _fundManager, address _treasury) StrategyCompLev( 0x6B175474E89094C44Da98b954EedeAC495271d0F, _fundManager, _treasury, 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643 ) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"timeLock","type":"address"}],"name":"AcceptTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"Authorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaid","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gain","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"free","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"}],"name":"Report","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundManager","type":"address"}],"name":"SetFundManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nextTimeLock","type":"address"}],"name":"SetNextTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"Skim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrowManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsOnMigrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetSupply","type":"uint256"}],"name":"deleverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundManager","outputs":[{"internalType":"contract IFundManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCachedPosition","outputs":[{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"borrowed","type":"uint256"},{"internalType":"uint256","name":"marketCol","type":"uint256"},{"internalType":"uint256","name":"safeCol","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLivePosition","outputs":[{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"borrowed","type":"uint256"},{"internalType":"uint256","name":"marketCol","type":"uint256"},{"internalType":"uint256","name":"safeCol","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"},{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetSupply","type":"uint256"}],"name":"leverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextTimeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeemManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repayManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"}],"name":"setDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"}],"name":"setFundManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextTimeLock","type":"address"}],"name":"setNextTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPerfFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"supplyManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526103e86006556007805460ff19166001179055668e1bc9bf0400006008553480156200002f57600080fd5b5060405162004b0838038062004b08833981810160405260408110156200005557600080fd5b508051602090910151736b175474e89094c44da98b954eedeac495271d0f8282735d3a536e4d6dbd6114cc1ead35777bab948e36438383836001600160a01b038116620000e9576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d60208110156200018b57600080fd5b50516001600160a01b031614620001e9576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b0319166080526200023890841683600019620002f8602090811b620021f517901c565b5050506001600160a01b03811662000297576040805162461bcd60e51b815260206004820152601560248201527f63546f6b656e203d207a65726f20616464726573730000000000000000000000604482015290519081900360640190fd5b606081901b6001600160601b03191660a052620002cd6001600160a01b03851682600019620002f8602090811b620021f517901c565b620002ec73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6200041c565b505050505050620007b3565b80158062000382575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200035257600080fd5b505afa15801562000367573d6000803e3d6000fd5b505050506040513d60208110156200037e57600080fd5b5051155b620003bf5760405162461bcd60e51b815260040180806020018281038252603681526020018062004ad26036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915262000417918591620004c516565b505050565b60075461010090046001600160a01b0316156200047357600754620004739073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b03166000620002f8602090811b620021f517901c565b60078054610100600160a81b0319166101006001600160a01b03841602179055620004c273c00e94cb662c3520282e6f5717214004a7f2688882600019620002f8602090811b620021f517901c565b50565b600062000521826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200058160201b62002308179092919060201c565b80519091501562000417578080602001905160208110156200054257600080fd5b5051620004175760405162461bcd60e51b815260040180806020018281038252602a81526020018062004aa8602a913960400191505060405180910390fd5b60606200059284846000856200059c565b90505b9392505050565b606082471015620005df5760405162461bcd60e51b815260040180806020018281038252602681526020018062004a826026913960400191505060405180910390fd5b620005ea8562000703565b6200063c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106200067c5780518252601f1990920191602091820191016200065b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620006e0576040519150601f19603f3d011682016040523d82523d6000602084013e620006e5565b606091505b509092509050620006f882828662000709565b979650505050505050565b3b151590565b606083156200071a57508162000595565b8251156200072b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007775781810151838201526020016200075d565b50505050905090810190601f168015620007a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c60a05160601c6142146200086e600039806107a55280610a5e52806119a6528061237d52806125e95280612a1e528061312e52806131d0528061346a528061372f52806138b3528061398052508061072c5280610a255280610ce35280610d0f5280610e1d528061117652806119845280611a365280611c0752806121d3528061247f528061252a528061277c52806127a452806128c35280612d2f5280612e975280612fe152806137fe52506142146000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80637372bb4111610146578063b9181611116100c3578063edaafe2011610087578063edaafe201461063c578063ef5f380014610644578063f0f4426014610661578063f849521f14610687578063f851a440146106a4578063fc0c546a146106ac57610253565b8063b9181611146105a2578063ce5494bb146105c8578063d085835a146105ee578063d8aed145146105f6578063e2bbb1581461061957610253565b8063acd431a81161010a578063acd431a814610526578063adc7ea3714610543578063b06fca9614610560578063b127df871461057d578063b759f9541461058557610253565b80637372bb41146104a4578063753c0985146104c1578063775d35e5146104e45780639fdabec2146104ec578063ac0489261461050957610253565b80632d1fb389116101d457806347a02a441161019857806347a02a441461042457806361d027b31461044a5780636209ec2d1461046e578063692058c214610476578063704b6c021461047e57610253565b80632d1fb389146103785780632e1a7d4d146103a65780633739795c146103c357806342d14c83146103e2578063447fa8b7146103fe57610253565b80631dd19cb41161021b5780631dd19cb4146103115780631e39831e1461031957806322b2ba7314610321578063232a306014610329578063284fa3441461034f57610253565b806301681a621461025857806301e1d114146102805780630962ef791461029a5780630acf8481146102b75780631ada33a8146102e3575b600080fd5b61027e6004803603602081101561026e57600080fd5b50356001600160a01b03166106b4565b005b610288610913565b60408051918252519081900360200190f35b61027e600480360360208110156102b057600080fd5b5035610923565b61027e600480360360408110156102cd57600080fd5b506001600160a01b0381351690602001356109a2565b6102eb610a51565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61027e610b4a565b61027e610bca565b610288610c6f565b61027e6004803603602081101561033f57600080fd5b50356001600160a01b0316610c75565b61027e6004803603606081101561036557600080fd5b5080359060208101359060400135610e85565b61027e6004803603604081101561038e57600080fd5b506001600160a01b0381351690602001351515610f1b565b610288600480360360208110156103bc57600080fd5b5035611029565b61027e600480360360208110156103d957600080fd5b503515156111e5565b6103ea611254565b604080519115158252519081900360200190f35b61027e6004803603602081101561041457600080fd5b50356001600160a01b031661125d565b61027e6004803603602081101561043a57600080fd5b50356001600160a01b03166112ff565b61045261139f565b604080516001600160a01b039092168252519081900360200190f35b6104526113ae565b6104526113bd565b61027e6004803603602081101561049457600080fd5b50356001600160a01b03166113d1565b61027e600480360360208110156104ba57600080fd5b50356114d0565b61027e600480360360408110156104d757600080fd5b5080359060200135611574565b6102eb6115f4565b61027e6004803603602081101561050257600080fd5b5035611629565b61027e6004803603602081101561051f57600080fd5b50356116a8565b61027e6004803603602081101561053c57600080fd5b5035611727565b61027e6004803603602081101561055957600080fd5b50356117a6565b61027e6004803603602081101561057657600080fd5b5035611873565b6104526118f2565b61027e6004803603602081101561059b57600080fd5b5035611901565b6103ea600480360360208110156105b857600080fd5b50356001600160a01b03166119cb565b61027e600480360360208110156105de57600080fd5b50356001600160a01b03166119e0565b610452611c99565b61027e6004803603604081101561060c57600080fd5b5080359060200135611ca8565b61027e6004803603604081101561062f57600080fd5b5080359060200135611dfa565b610288611fbc565b61027e6004803603602081101561065a57600080fd5b5035611fc2565b61027e6004803603602081101561067757600080fd5b50356001600160a01b0316612041565b61027e6004803603602081101561069d57600080fd5b5035612143565b6104526121c2565b6104526121d1565b6000546001600160a01b03163314806106d757506002546001600160a01b031633145b806106f157503360009081526004602052604090205460ff165b61072a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614156107a3576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561081c576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001600160a01b03811673c00e94cb662c3520282e6f5717214004a7f268881415610880576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600254604080516370a0823160e01b81523060048201529051610910926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50516001600160a01b0384169190612321565b50565b600061091d612373565b90505b90565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081612526565b6000546001600160a01b03163314806109c557506002546001600160a01b031633145b806109df57503360009081526004602052604090205460ff165b610a18576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016833084612934565b5050565b60008060008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d6080811015610af357600080fd5b50602081015160408201516060909201519094509092509050670de0b6b3a7640000610b1f8483612994565b81610b2657fe5b049650819550610b346129f6565b9450610b3f85612aaf565b935050505090919293565b6000546001600160a01b0316331480610b6d57506002546001600160a01b031633145b80610b8757503360009081526004602052604090205460ff165b610bc0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610bc8612acf565b565b6001546001600160a01b03163314610c1b576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610cc1576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610d0d57600554610d0d906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911660006121f5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610df7576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610e46907f000000000000000000000000000000000000000000000000000000000000000016826000196121f5565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b6000546001600160a01b0316331480610ea857506002546001600160a01b031633145b80610ec257503360009081526004602052604090205460ff165b610efb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610f0483612526565b610f0c612acf565b610f168282612bf1565b505050565b6000546001600160a01b0316331480610f3e57506002546001600160a01b031633145b610f77576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610fc5576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b0316331461107b576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600082116110bf576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b60006110ca83612e92565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d602081101561114557600080fd5b505190506000611153612373565b9050808211156111635780820393505b821561119d5761119d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385612321565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061120857506002546001600160a01b031633145b611241576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60075460ff1681565b6000546001600160a01b031633146112a9576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166112f6576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b610910816130a1565b6000546001600160a01b0316331461134b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b60075461010090046001600160a01b031681565b6000546001600160a01b03163314806113f457506002546001600160a01b031633145b61142d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661147c576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806114f357506002546001600160a01b031633145b61152c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d081111561156f576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061159757506002546001600160a01b031633145b806115b157503360009081526004602052604090205460ff165b6115ea576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d8282612bf1565b60008060008061160261312a565b935061160c6131cc565b92506116166129f6565b915061162182612aaf565b905090919293565b6000546001600160a01b031633148061164c57506002546001600160a01b031633145b8061166657503360009081526004602052604090205460ff165b61169f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161323d565b6000546001600160a01b03163314806116cb57506002546001600160a01b031633145b806116e557503360009081526004602052604090205460ff165b61171e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613468565b6000546001600160a01b031633148061174a57506002546001600160a01b031633145b8061176457503360009081526004602052604090205460ff165b61179d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613534565b6000546001600160a01b03163314806117c957506002546001600160a01b031633145b806117e357503360009081526004602052604090205460ff165b61181c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000811180156118345750670de0b6b3a76400008111155b61186e576040805162461bcd60e51b8152602060048201526006602482015265313ab33332b960d11b604482015290519081900360640190fd5b600855565b6000546001600160a01b031633148061189657506002546001600160a01b031633145b806118b057503360009081526004602052604090205460ff165b6118e9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161372d565b6001546001600160a01b031681565b6000546001600160a01b031633148061192457506002546001600160a01b031633145b8061193e57503360009081526004602052604090205460ff165b611977576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109106001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836121f5565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611a2f576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9757600080fd5b505afa158015611aab573d6000803e3d6000fd5b505050506040513d6020811015611ac157600080fd5b50516001600160a01b031614611b1e576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b50516001600160a01b031614611bd65760405162461bcd60e51b81526004018080602001828103825260258152602001806141396025913960400191505060405180910390fd5b60075460ff1615611beb57611beb6001612526565b6000611bf8600019612e92565b9050611c2e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684836121f5565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b60008211611ce9576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611cf483612e92565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b505050506040513d6020811015611d7157600080fd5b5051905082811015611db9576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b0316331480611e1d57506002546001600160a01b031633145b80611e3757503360009081526004602052604090205460ff165b611e70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611eb3576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050506040513d6020811015611f2a57600080fd5b5051905081811015611f74576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611f7c6137fa565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b60085481565b6000546001600160a01b0316331480611fe557506002546001600160a01b031633145b80611fff57503360009081526004602052604090205460ff165b612038576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610910816138b1565b6000546001600160a01b031633148061206457506002546001600160a01b031633145b61209d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166120ef576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6000546001600160a01b031633148061216657506002546001600160a01b031633145b8061218057503360009081526004602052604090205460ff165b6121b9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161397e565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b80158061227b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b5051155b6122b65760405162461bcd60e51b81526004018080602001828103825260368152602001806141a96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f16908490613a4b565b60606123178484600085613afc565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f16908490613a4b565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b1580156123e857600080fd5b505afa1580156123fc573d6000803e3d6000fd5b505050506040513d608081101561241257600080fd5b50805160208201516040830151606090930151919650945090925090508315612442576000945050505050610920565b6000670de0b6b3a76400006124578584612994565b8161245e57fe5b0490508281101561247757600095505050505050610920565b61251c8382037f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b505190613c57565b9550505050505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505160408051600180825281830190925291925060009190602080830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061261557fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561269b578181015183820152602001612683565b505050509050019350505050600060405180830381600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c00e94cb662c3520282e6f5717214004a7f2688892506370a0823191602480820192602092909190829003018186803b15801561272e57600080fd5b505afa158015612742573d6000803e3d6000fd5b505050506040513d602081101561275857600080fd5b5051905080156127a1576127a173c00e94cb662c3520282e6f5717214004a7f268887f000000000000000000000000000000000000000000000000000000000000000083613cb1565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d602081101561283957600080fd5b505103925083831015612882576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b82156128fb5760006127106128a26006548661299490919063ffffffff16565b816128a957fe5b04905080156128f9576003546128ec906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612321565b6128f68482613f05565b93505b505b6040805184815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261298e908590613a4b565b50505050565b6000826129a3575060006129f0565b828202828482816129b057fe5b04146129ed5760405162461bcd60e51b815260040180806020018281038252602181526020018061415e6021913960400191505060405180910390fd5b90505b92915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316638e8f294b7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060606040518083038186803b158015612a7a57600080fd5b505afa158015612a8e573d6000803e3d6000fd5b505050506040513d6060811015612aa457600080fd5b506020015191505090565b6000600854821115612ac657506008548103612aca565b5060005b919050565b6000612ad9612373565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015612b2a57600080fd5b505afa158015612b3e573d6000803e3d6000fd5b505050506040513d6020811015612b5457600080fd5b50519050808211612b9c576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b808203612ba881612e92565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612bfb612373565b905082811015612c40576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612c83576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b158015612cd457600080fd5b505afa158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b5051905080851115612db457604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b5051915081841115612daf578193505b612dba565b84810392505b6000841180612dc95750600083115b15612e3b576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b158015612e2257600080fd5b505af1158015612e36573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f0257600080fd5b505afa158015612f16573d6000803e3d6000fd5b505050506040513d6020811015612f2c57600080fd5b50519050808311612f405782915050612aca565b8083036000612f4d61312a565b90506000612f596131cc565b90506000612f656129f6565b90506000612f7282612aaf565b90506000612f808585613f05565b905080861115612f8e578095505b6000612fb5612fa5670de0b6b3a764000085613f05565b612faf8986612994565b90613f62565b905084811115612fc25750835b612fd4612fcf8783613f05565b61323d565b612fdd876138b1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b505190508a811015613092579850612aca975050505050505050565b50989998505050505050505050565b60075461010090046001600160a01b0316156130e9576007546130e99073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b031660006121f5565b60078054610100600160a81b0319166101006001600160a01b0384160217905561091073c00e94cb662c3520282e6f5717214004a7f26888826000196121f5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633af9e669306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b505af11580156131af573d6000803e3d6000fd5b505050506040513d60208110156131c557600080fd5b5051905090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317bfdfbc306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b600061324761312a565b905060006132536131cc565b905060006132618383613f05565b9050828411156132a5576040805162461bcd60e51b815260206004820152600a60248201526964656c6576657261676560b01b604482015290519081900360640190fd5b60006132af6129f6565b90508185116132bc578194505b60005b858511156133c5576019811061330c576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061332861270f613322898988613fc9565b90612994565b8161332f57fe5b04905060008111613374576040805162461bcd60e51b815260206004820152600a602482015269072656465656d203d20360b41b604482015290519081900360640190fd5b8661337f8783613f05565b10156133925761338f8688613f05565b90505b61339b816138b1565b6133a481613468565b6133ae8682613f05565b95506133ba8582613f05565b9450506001016132bf565b505050505060006133d461312a565b905060006133e06131cc565b905060006133ec6129f6565b905060006133f982612aaf565b90506000670de0b6b3a76400006134108684612994565b8161341757fe5b04905080841115613460576040805162461bcd60e51b815260206004820152600e60248201526d0c4dee4e4deeecac8407c40dac2f60931b604482015290519081900360640190fd5b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156134ce57600080fd5b505af11580156134e2573d6000803e3d6000fd5b505050506040513d60208110156134f857600080fd5b505115610910576040805162461bcd60e51b8152602060048201526005602482015264726570617960d81b604482015290519081900360640190fd5b670de0b6b3a76400006008541061354a57613723565b600061355461312a565b905060006135606131cc565b9050600061356e8383613f05565b9050828410156135b0576040805162461bcd60e51b81526020600482015260086024820152676c6576657261676560c01b604482015290519081900360640190fd5b60006135ba6129f6565b905060006135c782612aaf565b905060006135d482613fff565b905060006127106136026126ac670de0b6b3a76400006135f48987612994565b816135fb57fe5b0490612994565b8161360957fe5b049050808810613617578097505b60005b8888101561371a5760198110613667576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061367d61270f6133228c8c8b61402c565b8161368457fe5b049050600081116136c9576040805162461bcd60e51b815260206004820152600a6024820152690626f72726f77203d20360b41b604482015290519081900360640190fd5b896136d48a83613c57565b11156136e7576136e48a8a613f05565b90505b6136f08161397e565b6136f98161372d565b6137038982613c57565b985061370f8882613c57565b97505060010161361a565b50505050505050505b60006133d461312a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d60208110156137bd57600080fd5b505115610910576040805162461bcd60e51b815260206004808301919091526024820152631b5a5b9d60e21b604482015290519081900360640190fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561386957600080fd5b505afa15801561387d573d6000803e3d6000fd5b505050506040513d602081101561389357600080fd5b505190508015610910576138a68161372d565b610910600019613534565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561391757600080fd5b505af115801561392b573d6000803e3d6000fd5b505050506040513d602081101561394157600080fd5b505115610910576040805162461bcd60e51b815260206004820152600660248201526572656465656d60d01b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156139e457600080fd5b505af11580156139f8573d6000803e3d6000fd5b505050506040513d6020811015613a0e57600080fd5b505115610910576040805162461bcd60e51b8152602060048201526006602482015265626f72726f7760d01b604482015290519081900360640190fd5b6000613aa0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123089092919063ffffffff16565b805190915015610f1657808060200190516020811015613abf57600080fd5b5051610f165760405162461bcd60e51b815260040180806020018281038252602a81526020018061417f602a913960400191505060405180910390fd5b606082471015613b3d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141136026913960400191505060405180910390fd5b613b4685614068565b613b97576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310613bd55780518252601f199092019160209182019101613bb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c37576040519150601f19603f3d011682016040523d82523d6000602084013e613c3c565b606091505b5091509150613c4c82828661406e565b979650505050505050565b6000828201838110156129ed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051600380825260808201909252600091602082016060803683370190505090508381600081518110613ce257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d2457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613d5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600760019054906101000a90046001600160a01b03166001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613e0c578181015183820152602001613df4565b505050509050019650505050505050600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e7257600080fd5b8101908080516040519392919084640100000000821115613e9257600080fd5b908301906020820185811115613ea757600080fd5b8251866020820283011164010000000082111715613ec457600080fd5b82525081516020918201928201910280838360005b83811015613ef1578181015183820152602001613ed9565b505050509050016040525050505050505050565b600082821115613f5c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211613fb8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613fc157fe5b049392505050565b600080613fe283612faf86670de0b6b3a7640000612994565b9050808511613ff557600091505061231a565b9093039392505050565b60006129f0614016670de0b6b3a764000084613f05565b6ec097ce7bc90715b34b9f100000000090613f62565b600080670de0b6b3a76400006140428685612994565b8161404957fe5b04905080841061405d57600091505061231a565b929092039392505050565b3b151590565b6060831561407d57508161231a565b82511561408d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140d75781810151838201526020016140bf565b50505050905090810190601f1680156141045780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae999102895264736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80637372bb4111610146578063b9181611116100c3578063edaafe2011610087578063edaafe201461063c578063ef5f380014610644578063f0f4426014610661578063f849521f14610687578063f851a440146106a4578063fc0c546a146106ac57610253565b8063b9181611146105a2578063ce5494bb146105c8578063d085835a146105ee578063d8aed145146105f6578063e2bbb1581461061957610253565b8063acd431a81161010a578063acd431a814610526578063adc7ea3714610543578063b06fca9614610560578063b127df871461057d578063b759f9541461058557610253565b80637372bb41146104a4578063753c0985146104c1578063775d35e5146104e45780639fdabec2146104ec578063ac0489261461050957610253565b80632d1fb389116101d457806347a02a441161019857806347a02a441461042457806361d027b31461044a5780636209ec2d1461046e578063692058c214610476578063704b6c021461047e57610253565b80632d1fb389146103785780632e1a7d4d146103a65780633739795c146103c357806342d14c83146103e2578063447fa8b7146103fe57610253565b80631dd19cb41161021b5780631dd19cb4146103115780631e39831e1461031957806322b2ba7314610321578063232a306014610329578063284fa3441461034f57610253565b806301681a621461025857806301e1d114146102805780630962ef791461029a5780630acf8481146102b75780631ada33a8146102e3575b600080fd5b61027e6004803603602081101561026e57600080fd5b50356001600160a01b03166106b4565b005b610288610913565b60408051918252519081900360200190f35b61027e600480360360208110156102b057600080fd5b5035610923565b61027e600480360360408110156102cd57600080fd5b506001600160a01b0381351690602001356109a2565b6102eb610a51565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61027e610b4a565b61027e610bca565b610288610c6f565b61027e6004803603602081101561033f57600080fd5b50356001600160a01b0316610c75565b61027e6004803603606081101561036557600080fd5b5080359060208101359060400135610e85565b61027e6004803603604081101561038e57600080fd5b506001600160a01b0381351690602001351515610f1b565b610288600480360360208110156103bc57600080fd5b5035611029565b61027e600480360360208110156103d957600080fd5b503515156111e5565b6103ea611254565b604080519115158252519081900360200190f35b61027e6004803603602081101561041457600080fd5b50356001600160a01b031661125d565b61027e6004803603602081101561043a57600080fd5b50356001600160a01b03166112ff565b61045261139f565b604080516001600160a01b039092168252519081900360200190f35b6104526113ae565b6104526113bd565b61027e6004803603602081101561049457600080fd5b50356001600160a01b03166113d1565b61027e600480360360208110156104ba57600080fd5b50356114d0565b61027e600480360360408110156104d757600080fd5b5080359060200135611574565b6102eb6115f4565b61027e6004803603602081101561050257600080fd5b5035611629565b61027e6004803603602081101561051f57600080fd5b50356116a8565b61027e6004803603602081101561053c57600080fd5b5035611727565b61027e6004803603602081101561055957600080fd5b50356117a6565b61027e6004803603602081101561057657600080fd5b5035611873565b6104526118f2565b61027e6004803603602081101561059b57600080fd5b5035611901565b6103ea600480360360208110156105b857600080fd5b50356001600160a01b03166119cb565b61027e600480360360208110156105de57600080fd5b50356001600160a01b03166119e0565b610452611c99565b61027e6004803603604081101561060c57600080fd5b5080359060200135611ca8565b61027e6004803603604081101561062f57600080fd5b5080359060200135611dfa565b610288611fbc565b61027e6004803603602081101561065a57600080fd5b5035611fc2565b61027e6004803603602081101561067757600080fd5b50356001600160a01b0316612041565b61027e6004803603602081101561069d57600080fd5b5035612143565b6104526121c2565b6104526121d1565b6000546001600160a01b03163314806106d757506002546001600160a01b031633145b806106f157503360009081526004602052604090205460ff165b61072a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031614156107a3576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316816001600160a01b0316141561081c576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001600160a01b03811673c00e94cb662c3520282e6f5717214004a7f268881415610880576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600254604080516370a0823160e01b81523060048201529051610910926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50516001600160a01b0384169190612321565b50565b600061091d612373565b90505b90565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081612526565b6000546001600160a01b03163314806109c557506002546001600160a01b031633145b806109df57503360009081526004602052604090205460ff165b610a18576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16833084612934565b5050565b60008060008060008060007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d6080811015610af357600080fd5b50602081015160408201516060909201519094509092509050670de0b6b3a7640000610b1f8483612994565b81610b2657fe5b049650819550610b346129f6565b9450610b3f85612aaf565b935050505090919293565b6000546001600160a01b0316331480610b6d57506002546001600160a01b031633145b80610b8757503360009081526004602052604090205460ff165b610bc0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610bc8612acf565b565b6001546001600160a01b03163314610c1b576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610cc1576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610d0d57600554610d0d906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911660006121f5565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610df7576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610e46907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16826000196121f5565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b6000546001600160a01b0316331480610ea857506002546001600160a01b031633145b80610ec257503360009081526004602052604090205460ff165b610efb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610f0483612526565b610f0c612acf565b610f168282612bf1565b505050565b6000546001600160a01b0316331480610f3e57506002546001600160a01b031633145b610f77576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610fc5576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b0316331461107b576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600082116110bf576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b60006110ca83612e92565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d602081101561114557600080fd5b505190506000611153612373565b9050808211156111635780820393505b821561119d5761119d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163385612321565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061120857506002546001600160a01b031633145b611241576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60075460ff1681565b6000546001600160a01b031633146112a9576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166112f6576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b610910816130a1565b6000546001600160a01b0316331461134b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b60075461010090046001600160a01b031681565b6000546001600160a01b03163314806113f457506002546001600160a01b031633145b61142d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661147c576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806114f357506002546001600160a01b031633145b61152c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d081111561156f576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061159757506002546001600160a01b031633145b806115b157503360009081526004602052604090205460ff165b6115ea576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d8282612bf1565b60008060008061160261312a565b935061160c6131cc565b92506116166129f6565b915061162182612aaf565b905090919293565b6000546001600160a01b031633148061164c57506002546001600160a01b031633145b8061166657503360009081526004602052604090205460ff165b61169f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161323d565b6000546001600160a01b03163314806116cb57506002546001600160a01b031633145b806116e557503360009081526004602052604090205460ff165b61171e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613468565b6000546001600160a01b031633148061174a57506002546001600160a01b031633145b8061176457503360009081526004602052604090205460ff165b61179d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613534565b6000546001600160a01b03163314806117c957506002546001600160a01b031633145b806117e357503360009081526004602052604090205460ff165b61181c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000811180156118345750670de0b6b3a76400008111155b61186e576040805162461bcd60e51b8152602060048201526006602482015265313ab33332b960d11b604482015290519081900360640190fd5b600855565b6000546001600160a01b031633148061189657506002546001600160a01b031633145b806118b057503360009081526004602052604090205460ff165b6118e9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161372d565b6001546001600160a01b031681565b6000546001600160a01b031633148061192457506002546001600160a01b031633145b8061193e57503360009081526004602052604090205460ff165b611977576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109106001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f167f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643836121f5565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611a2f576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9757600080fd5b505afa158015611aab573d6000803e3d6000fd5b505050506040513d6020811015611ac157600080fd5b50516001600160a01b031614611b1e576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b50516001600160a01b031614611bd65760405162461bcd60e51b81526004018080602001828103825260258152602001806141396025913960400191505060405180910390fd5b60075460ff1615611beb57611beb6001612526565b6000611bf8600019612e92565b9050611c2e6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1684836121f5565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b60008211611ce9576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611cf483612e92565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b505050506040513d6020811015611d7157600080fd5b5051905082811015611db9576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b0316331480611e1d57506002546001600160a01b031633145b80611e3757503360009081526004602052604090205460ff165b611e70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611eb3576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050506040513d6020811015611f2a57600080fd5b5051905081811015611f74576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611f7c6137fa565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b60085481565b6000546001600160a01b0316331480611fe557506002546001600160a01b031633145b80611fff57503360009081526004602052604090205460ff165b612038576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610910816138b1565b6000546001600160a01b031633148061206457506002546001600160a01b031633145b61209d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166120ef576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6000546001600160a01b031633148061216657506002546001600160a01b031633145b8061218057503360009081526004602052604090205460ff165b6121b9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161397e565b6002546001600160a01b031681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b80158061227b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b5051155b6122b65760405162461bcd60e51b81526004018080602001828103825260368152602001806141a96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f16908490613a4b565b60606123178484600085613afc565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f16908490613a4b565b60008060008060007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b1580156123e857600080fd5b505afa1580156123fc573d6000803e3d6000fd5b505050506040513d608081101561241257600080fd5b50805160208201516040830151606090930151919650945090925090508315612442576000945050505050610920565b6000670de0b6b3a76400006124578584612994565b8161245e57fe5b0490508281101561247757600095505050505050610920565b61251c8382037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b505190613c57565b9550505050505090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505160408051600180825281830190925291925060009190602080830190803683370190505090507f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061261557fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561269b578181015183820152602001612683565b505050509050019350505050600060405180830381600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c00e94cb662c3520282e6f5717214004a7f2688892506370a0823191602480820192602092909190829003018186803b15801561272e57600080fd5b505afa158015612742573d6000803e3d6000fd5b505050506040513d602081101561275857600080fd5b5051905080156127a1576127a173c00e94cb662c3520282e6f5717214004a7f268887f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f83613cb1565b827f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d602081101561283957600080fd5b505103925083831015612882576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b82156128fb5760006127106128a26006548661299490919063ffffffff16565b816128a957fe5b04905080156128f9576003546128ec906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911683612321565b6128f68482613f05565b93505b505b6040805184815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261298e908590613a4b565b50505050565b6000826129a3575060006129f0565b828202828482816129b057fe5b04146129ed5760405162461bcd60e51b815260040180806020018281038252602181526020018061415e6021913960400191505060405180910390fd5b90505b92915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316638e8f294b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060606040518083038186803b158015612a7a57600080fd5b505afa158015612a8e573d6000803e3d6000fd5b505050506040513d6060811015612aa457600080fd5b506020015191505090565b6000600854821115612ac657506008548103612aca565b5060005b919050565b6000612ad9612373565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015612b2a57600080fd5b505afa158015612b3e573d6000803e3d6000fd5b505050506040513d6020811015612b5457600080fd5b50519050808211612b9c576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b808203612ba881612e92565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612bfb612373565b905082811015612c40576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612c83576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b158015612cd457600080fd5b505afa158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b5051905080851115612db457604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16916370a08231916024808301926020929190829003018186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b5051915081841115612daf578193505b612dba565b84810392505b6000841180612dc95750600083115b15612e3b576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b158015612e2257600080fd5b505af1158015612e36573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f0257600080fd5b505afa158015612f16573d6000803e3d6000fd5b505050506040513d6020811015612f2c57600080fd5b50519050808311612f405782915050612aca565b8083036000612f4d61312a565b90506000612f596131cc565b90506000612f656129f6565b90506000612f7282612aaf565b90506000612f808585613f05565b905080861115612f8e578095505b6000612fb5612fa5670de0b6b3a764000085613f05565b612faf8986612994565b90613f62565b905084811115612fc25750835b612fd4612fcf8783613f05565b61323d565b612fdd876138b1565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b505190508a811015613092579850612aca975050505050505050565b50989998505050505050505050565b60075461010090046001600160a01b0316156130e9576007546130e99073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b031660006121f5565b60078054610100600160a81b0319166101006001600160a01b0384160217905561091073c00e94cb662c3520282e6f5717214004a7f26888826000196121f5565b60007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316633af9e669306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b505af11580156131af573d6000803e3d6000fd5b505050506040513d60208110156131c557600080fd5b5051905090565b60007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b03166317bfdfbc306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b600061324761312a565b905060006132536131cc565b905060006132618383613f05565b9050828411156132a5576040805162461bcd60e51b815260206004820152600a60248201526964656c6576657261676560b01b604482015290519081900360640190fd5b60006132af6129f6565b90508185116132bc578194505b60005b858511156133c5576019811061330c576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061332861270f613322898988613fc9565b90612994565b8161332f57fe5b04905060008111613374576040805162461bcd60e51b815260206004820152600a602482015269072656465656d203d20360b41b604482015290519081900360640190fd5b8661337f8783613f05565b10156133925761338f8688613f05565b90505b61339b816138b1565b6133a481613468565b6133ae8682613f05565b95506133ba8582613f05565b9450506001016132bf565b505050505060006133d461312a565b905060006133e06131cc565b905060006133ec6129f6565b905060006133f982612aaf565b90506000670de0b6b3a76400006134108684612994565b8161341757fe5b04905080841115613460576040805162461bcd60e51b815260206004820152600e60248201526d0c4dee4e4deeecac8407c40dac2f60931b604482015290519081900360640190fd5b505050505050565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156134ce57600080fd5b505af11580156134e2573d6000803e3d6000fd5b505050506040513d60208110156134f857600080fd5b505115610910576040805162461bcd60e51b8152602060048201526005602482015264726570617960d81b604482015290519081900360640190fd5b670de0b6b3a76400006008541061354a57613723565b600061355461312a565b905060006135606131cc565b9050600061356e8383613f05565b9050828410156135b0576040805162461bcd60e51b81526020600482015260086024820152676c6576657261676560c01b604482015290519081900360640190fd5b60006135ba6129f6565b905060006135c782612aaf565b905060006135d482613fff565b905060006127106136026126ac670de0b6b3a76400006135f48987612994565b816135fb57fe5b0490612994565b8161360957fe5b049050808810613617578097505b60005b8888101561371a5760198110613667576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061367d61270f6133228c8c8b61402c565b8161368457fe5b049050600081116136c9576040805162461bcd60e51b815260206004820152600a6024820152690626f72726f77203d20360b41b604482015290519081900360640190fd5b896136d48a83613c57565b11156136e7576136e48a8a613f05565b90505b6136f08161397e565b6136f98161372d565b6137038982613c57565b985061370f8882613c57565b97505060010161361a565b50505050505050505b60006133d461312a565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d60208110156137bd57600080fd5b505115610910576040805162461bcd60e51b815260206004808301919091526024820152631b5a5b9d60e21b604482015290519081900360640190fd5b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561386957600080fd5b505afa15801561387d573d6000803e3d6000fd5b505050506040513d602081101561389357600080fd5b505190508015610910576138a68161372d565b610910600019613534565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561391757600080fd5b505af115801561392b573d6000803e3d6000fd5b505050506040513d602081101561394157600080fd5b505115610910576040805162461bcd60e51b815260206004820152600660248201526572656465656d60d01b604482015290519081900360640190fd5b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156139e457600080fd5b505af11580156139f8573d6000803e3d6000fd5b505050506040513d6020811015613a0e57600080fd5b505115610910576040805162461bcd60e51b8152602060048201526006602482015265626f72726f7760d01b604482015290519081900360640190fd5b6000613aa0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123089092919063ffffffff16565b805190915015610f1657808060200190516020811015613abf57600080fd5b5051610f165760405162461bcd60e51b815260040180806020018281038252602a81526020018061417f602a913960400191505060405180910390fd5b606082471015613b3d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141136026913960400191505060405180910390fd5b613b4685614068565b613b97576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310613bd55780518252601f199092019160209182019101613bb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c37576040519150601f19603f3d011682016040523d82523d6000602084013e613c3c565b606091505b5091509150613c4c82828661406e565b979650505050505050565b6000828201838110156129ed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051600380825260808201909252600091602082016060803683370190505090508381600081518110613ce257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d2457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613d5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600760019054906101000a90046001600160a01b03166001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613e0c578181015183820152602001613df4565b505050509050019650505050505050600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e7257600080fd5b8101908080516040519392919084640100000000821115613e9257600080fd5b908301906020820185811115613ea757600080fd5b8251866020820283011164010000000082111715613ec457600080fd5b82525081516020918201928201910280838360005b83811015613ef1578181015183820152602001613ed9565b505050509050016040525050505050505050565b600082821115613f5c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211613fb8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613fc157fe5b049392505050565b600080613fe283612faf86670de0b6b3a7640000612994565b9050808511613ff557600091505061231a565b9093039392505050565b60006129f0614016670de0b6b3a764000084613f05565b6ec097ce7bc90715b34b9f100000000090613f62565b600080670de0b6b3a76400006140428685612994565b8161404957fe5b04905080841061405d57600091505061231a565b929092039392505050565b3b151590565b6060831561407d57508161231a565b82511561408d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140d75781810151838201526020016140bf565b50505050905090810190601f1680156141045780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae999102895264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
-----Decoded View---------------
Arg [0] : _fundManager (address): 0x7C765C474D231fd915dc78832b478F309071cba7
Arg [1] : _treasury (address): 0x86d10751B18F3fE331C146546868a07224A8598B
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c765c474d231fd915dc78832b478f309071cba7
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode Sourcemap
52621:318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51796:347;;;;;;;;;;;;;;;;-1:-1:-1;51796:347:0;-1:-1:-1;;;;;51796:347:0;;:::i;:::-;;33372:101;;;:::i;:::-;;;;;;;;;;;;;;;;49377:116;;;;;;;;;;;;;;;;-1:-1:-1;49377:116:0;;:::i;28481:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28481:152:0;;;;;;;;:::i;35100:577::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49853:75;;;:::i;25969:218::-;;;:::i;24043:26::-;;;:::i;27436:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27436:498:0;-1:-1:-1;;;;;27436:498:0;;:::i;50830:235::-;;;;;;;;;;;;;;;;-1:-1:-1;50830:235:0;;;;;;;;;;;;:::i;26585:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26585:235:0;;;;;;;;;;:::i;46931:584::-;;;;;;;;;;;;;;;;-1:-1:-1;46931:584:0;;:::i;28151:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28151:139:0;;;;:::i;24210:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;32505:141;;;;;;;;;;;;;;;;-1:-1:-1;32505:141:0;-1:-1:-1;;;;;32505:141:0;;:::i;25624:239::-;;;;;;;;;;;;;;;;-1:-1:-1;25624:239:0;-1:-1:-1;;;;;25624:239:0;;:::i;23756:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23756:23:0;;;;;;;;;;;;;;23962:31;;;:::i;31537:18::-;;;:::i;26270:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26270:189:0;-1:-1:-1;;;;;26270:189:0;;:::i;27282:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27282:146:0;;:::i;50693:129::-;;;;;;;;;;;;;;;;-1:-1:-1;50693:129:0;;;;;;;:::i;34641:376::-;;;:::i;44869:109::-;;;;;;;;;;;;;;;;-1:-1:-1;44869:109:0;;:::i;37254:93::-;;;;;;;;;;;;;;;;-1:-1:-1;37254:93:0;;:::i;41031:105::-;;;;;;;;;;;;;;;;-1:-1:-1;41031:105:0;;:::i;33628:152::-;;;;;;;;;;;;;;;;-1:-1:-1;33628:152:0;;:::i;36678:95::-;;;;;;;;;;;;;;;;-1:-1:-1;36678:95:0;;:::i;23695:27::-;;;:::i;36348:117::-;;;;;;;;;;;;;;;;-1:-1:-1;36348:117:0;;:::i;23875:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23875:42:0;-1:-1:-1;;;;;23875:42:0;;:::i;51073:591::-;;;;;;;;;;;;;;;;-1:-1:-1;51073:591:0;-1:-1:-1;;;;;51073:591:0;;:::i;23665:23::-;;;:::i;47523:331::-;;;;;;;;;;;;;;;;-1:-1:-1;47523:331:0;;;;;;;:::i;41543:304::-;;;;;;;;;;;;;;;;-1:-1:-1;41543:304:0;;;;;;;:::i;31824:32::-;;;:::i;37523:95::-;;;;;;;;;;;;;;;;-1:-1:-1;37523:95:0;;:::i;26912:280::-;;;;;;;;;;;;;;;;-1:-1:-1;26912:280:0;-1:-1:-1;;;;;26912:280:0;;:::i;36939:95::-;;;;;;;;;;;;;;;;-1:-1:-1;36939:95:0;;:::i;23729:20::-;;;:::i;23926:29::-;;;:::i;51796:347::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;51897:5:::1;-1:-1:-1::0;;;;;51879:24:0::1;:6;-1:-1:-1::0;;;;;51879:24:0::1;;;51871:52;;;::::0;;-1:-1:-1;;;51871:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51871:52:0;;;;;;;;;;;;;::::1;;51960:6;-1:-1:-1::0;;;;;51942:25:0::1;:6;-1:-1:-1::0;;;;;51942:25:0::1;;;51934:53;;;::::0;;-1:-1:-1;;;51934:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51934:53:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;52006:23:0;::::1;31736:42;52006:23;;51998:51;;;::::0;;-1:-1:-1;;;51998:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51998:51:0;;;;;;;;;;;;;::::1;;52088:5;::::0;52095:39:::1;::::0;;-1:-1:-1;;;52095:39:0;;52128:4:::1;52095:39;::::0;::::1;::::0;;;52060:75:::1;::::0;-1:-1:-1;;;;;52088:5:0;;::::1;::::0;52095:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52095:39:0;-1:-1:-1;;;;;52060:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;51796:347:::0;:::o;33372:101::-;33427:4;33451:14;:12;:14::i;:::-;33444:21;;33372:101;;:::o;49377:116::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;49460:25:::1;49474:10;49460:13;:25::i;28481:152::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;28572:53:::1;-1:-1:-1::0;;;;;28572:5:0::1;:22;28595:5:::0;28610:4:::1;28617:7:::0;28572:22:::1;:53::i;:::-;28481:152:::0;;:::o;35100:577::-;35193:13;35221;35249:14;35278:12;35374:14;35390;35406:17;35427:6;-1:-1:-1;;;;;35427:35:0;;35471:4;35427:50;;;;;;;;;;;;;-1:-1:-1;;;;;35427:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35427:50:0;;;;;;;;;;;;;;;-1:-1:-1;35427:50:0;;-1:-1:-1;35427:50:0;-1:-1:-1;35529:4:0;35499:27;35427:50;;35499:13;:27::i;:::-;:34;;;;;;35488:45;;35555:9;35544:20;;35587:27;:25;:27::i;:::-;35575:39;;35635:34;35659:9;35635:23;:34::i;:::-;35625:44;;35100:577;;;;;;;:::o;49853:75::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;49913:7:::1;:5;:7::i;:::-;49853:75::o:0;25969:218::-;26037:12;;-1:-1:-1;;;;;26037:12:0;26023:10;:26;26015:54;;;;;-1:-1:-1;;;26015:54:0;;;;;;;;;;;;-1:-1:-1;;;26015:54:0;;;;;;;;;;;;;;;26080:8;:21;;-1:-1:-1;;;;;;26080:21:0;;;26091:10;26080:21;;;;;;;26112:25;;;;;;;26153:26;;;;;;;;;;;;;;;;25969:218::o;24043:26::-;;;;:::o;27436:498::-;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;27527:11:::1;::::0;-1:-1:-1;;;;;27527:11:0::1;27519:34:::0;27515:109:::1;;27596:11;::::0;27570:42:::1;::::0;-1:-1:-1;;;;;27570:5:0::1;:17:::0;::::1;::::0;27596:11:::1;;27570:17;:42::i;:::-;27704:5;-1:-1:-1::0;;;;;27658:52:0::1;27671:12;-1:-1:-1::0;;;;;27658:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27658:34:0;-1:-1:-1;;;;;27658:52:0::1;;27636:133;;;::::0;;-1:-1:-1;;;27636:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27782:11;:40:::0;;-1:-1:-1;;;;;;27782:40:0::1;-1:-1:-1::0;;;;;27782:40:0;;::::1;::::0;;;::::1;::::0;;;27833:47:::1;::::0;:5:::1;:17;27782:40:::0;-1:-1:-1;;27833:17:0::1;:47::i;:::-;27898:28;::::0;;-1:-1:-1;;;;;27898:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27436:498:::0;:::o;50830:235::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;50974:25:::1;50988:10;50974:13;:25::i;:::-;51010:7;:5;:7::i;:::-;51028:29;51036:9;51047;51028:7;:29::i;:::-;50830:235:::0;;;:::o;26585:::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26685:19:0;::::1;26677:48;;;::::0;;-1:-1:-1;;;26677:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26677:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;26736:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;26736:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26783:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;26585:235:::0;;:::o;46931:584::-;25395:11;;47042:9;;-1:-1:-1;;;;;25395:11:0;25373:10;:34;25365:60;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;;;;47087:1:::1;47077:7;:11;47069:36;;;::::0;;-1:-1:-1;;;47069:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47069:36:0;;;;;;;;;;;;;::::1;;47150:14;47167:18;47177:7;47167:9;:18::i;:::-;47210:11;::::0;:34:::1;::::0;;-1:-1:-1;;;47210:34:0;;47238:4:::1;47210:34;::::0;::::1;::::0;;;47150:35;;-1:-1:-1;47198:9:0::1;::::0;-1:-1:-1;;;;;47210:11:0;;::::1;::::0;:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;:11;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47210:34:0;;-1:-1:-1;47255:10:0::1;47268:14;:12;:14::i;:::-;47255:27;;47304:5;47297:4;:12;47293:64;;;47340:5;47333:4;:12;47326:19;;47293:64;47373:13:::0;;47369:87:::1;;47403:41;-1:-1:-1::0;;;;;47403:5:0::1;:18;47422:10;47434:9:::0;47403:18:::1;:41::i;:::-;47473:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25436:1;;;46931:584:::0;;;:::o;28151:139::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;28245:21:::1;:37:::0;;-1:-1:-1;;28245:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28151:139::o;24210:40::-;;;;;;:::o;32505:141::-;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32576:18:0;::::1;32568:46;;;::::0;;-1:-1:-1;;;32568:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32568:46:0;;;;;;;;;;;;;::::1;;32625:13;32633:4;32625:7;:13::i;25624:239::-:0;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;25781:12:::1;:28:::0;;-1:-1:-1;;;;;25781:28:0;::::1;-1:-1:-1::0;;;;;;25781:28:0;;::::1;::::0;::::1;::::0;;;25825:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;25624:239:::0;:::o;23756:23::-;;;-1:-1:-1;;;;;23756:23:0;;:::o;23962:31::-;;;-1:-1:-1;;;;;23962:31:0;;:::o;31537:18::-;;;;;;-1:-1:-1;;;;;31537:18:0;;:::o;26270:189::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26352:20:0;::::1;26344:50;;;::::0;;-1:-1:-1;;;26344:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26344:50:0;;;;;;;;;;;;;::::1;;26405:5;:14:::0;;-1:-1:-1;;;;;26405:14:0;::::1;-1:-1:-1::0;;;;;;26405:14:0;;::::1;::::0;::::1;::::0;;;26435:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26270:189:::0;:::o;27282:146::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;24113:4:::1;27361;:20;;27353:42;;;::::0;;-1:-1:-1;;;27353:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27353:42:0;;;;;;;;;;;;;::::1;;27406:7;:14:::0;27282:146::o;50693:129::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;50785:29:::1;50793:9;50804;50785:7;:29::i;34641:376::-:0;34718:13;34746;34774:14;34803:12;34854:14;:12;:14::i;:::-;34843:25;;34890:14;:12;:14::i;:::-;34879:25;;34927:27;:25;:27::i;:::-;34915:39;;34975:34;34999:9;34975:23;:34::i;:::-;34965:44;;34641:376;;;;:::o;44869:109::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;44944:26:::1;44956:13;44944:11;:26::i;37254:93::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37324:15:::1;37331:7;37324:6;:15::i;41031:105::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;41104:24:::1;41114:13;41104:9;:24::i;33628:152::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;33714:1:::1;33704:7;:11;:30;;;;;33730:4;33719:7;:15;;33704:30;33696:49;;;::::0;;-1:-1:-1;;;33696:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33696:49:0;;;;;;;;;;;;;::::1;;33756:6;:16:::0;33628:152::o;36678:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;36749:16:::1;36757:7;36749;:16::i;23695:27::-:0;;;-1:-1:-1;;;;;23695:27:0;;:::o;36348:117::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;36414:43:::1;-1:-1:-1::0;;;;;36414:5:0::1;:17;36440:6;36449:7:::0;36414:17:::1;:43::i;23875:42::-:0;;;;;;;;;;;;;;;:::o;51073:591::-;25395:11;;-1:-1:-1;;;;;25395:11:0;25373:10;:34;25365:60;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;;;;51154:14:::1;51180:9;51154:36;;51243:5;-1:-1:-1::0;;;;;51209:40:0::1;51217:5;-1:-1:-1::0;;;;;51217:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51217:13:0;-1:-1:-1;;;;;51209:40:0::1;;51201:76;;;::::0;;-1:-1:-1;;;51201:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51350:11;::::0;51318:19:::1;::::0;;-1:-1:-1;;;51318:19:0;;;;-1:-1:-1;;;;;51350:11:0;;::::1;::::0;51318:17;::::1;::::0;::::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:17;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51318:19:0;-1:-1:-1;;;;;51310:52:0::1;;51288:139;;;;-1:-1:-1::0;;;51288:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:21;::::0;::::1;;51440:70;;;51482:16;51496:1;51482:13;:16::i;:::-;51522:8;51533:25;-1:-1:-1::0;;51533:9:0::1;:25::i;:::-;51522:36:::0;-1:-1:-1;51569:33:0::1;-1:-1:-1::0;;;;;51569:5:0::1;:17;51587:9:::0;51522:36;51569:17:::1;:33::i;:::-;51613:43;::::0;;-1:-1:-1;;;51613:43:0;;51645:4:::1;51613:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;51613:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;51613:43:0;;;;;;;-1:-1:-1;51613:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25436:1;;51073:591:::0;:::o;23665:23::-;;;-1:-1:-1;;;;;23665:23:0;;:::o;47523:331::-;47610:1;47600:7;:11;47592:33;;;;;-1:-1:-1;;;47592:33:0;;;;;;;;;;;;-1:-1:-1;;;47592:33:0;;;;;;;;;;;;;;;47668:14;47685:18;47695:7;47685:9;:18::i;:::-;47728:11;;:28;;;-1:-1:-1;;;47728:28:0;;;;;;;;;;47668:35;;-1:-1:-1;47714:11:0;;-1:-1:-1;;;;;47728:11:0;;;;:17;;:28;;;;;;;;;;;;;;;47714:11;47728;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47728:28:0;;-1:-1:-1;47775:14:0;;;;47767:39;;;;;-1:-1:-1;;;47767:39:0;;;;;;;;;;;;-1:-1:-1;;;47767:39:0;;;;;;;;;;;;;;;47824:22;;;;;;;;;;;;;;;;;;;;;;;;;47523:331;;;;:::o;41543:304::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;41647:1:::1;41637:7;:11;41629:35;;;::::0;;-1:-1:-1;;;41629:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41629:35:0;;;;;;;;;;;;;::::1;;41693:11;::::0;:27:::1;::::0;;-1:-1:-1;;;41693:27:0;;::::1;::::0;::::1;::::0;;;;;41677:13:::1;::::0;-1:-1:-1;;;;;41693:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;41677:13;41693:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41693:27:0;;-1:-1:-1;41739:16:0;;::::1;;41731:43;;;::::0;;-1:-1:-1;;;41731:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41731:43:0;;;;;;;;;;;;;::::1;;41787:10;:8;:10::i;:::-;41813:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25310:1;41543:304:::0;;:::o;31824:32::-;;;;:::o;37523:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37594:16:::1;37602:7;37594;:16::i;26912:280::-:0;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27067:23:0;::::1;27059:56;;;::::0;;-1:-1:-1;;;27059:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27059:56:0;;;;;;;;;;;;;::::1;;27126:8;:20:::0;;-1:-1:-1;;;;;27126:20:0;::::1;-1:-1:-1::0;;;;;;27126:20:0;;::::1;::::0;::::1;::::0;;;27162:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26912:280:::0;:::o;36939:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37010:16:::1;37018:7;37010;:16::i;23729:20::-:0;;;-1:-1:-1;;;;;23729:20:0;;:::o;23926:29::-;;;:::o;13377:704::-;13792:10;;;13791:62;;-1:-1:-1;13808:39:0;;;-1:-1:-1;;;13808:39:0;;13832:4;13808:39;;;;-1:-1:-1;;;;;13808:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13808:39:0;:44;13791:62;13769:166;;;;-1:-1:-1;;;13769:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14000:62;;;-1:-1:-1;;;;;14000:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14000:62:0;-1:-1:-1;;;14000:62:0;;;13946:127;;13980:5;;13946:19;:127::i;3640:229::-;3777:12;3809:52;3831:6;3839:4;3845:1;3848:12;3809:21;:52::i;:::-;3802:59;;3640:229;;;;;;:::o;12573:245::-;12741:58;;;-1:-1:-1;;;;;12741:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12741:58:0;-1:-1:-1;;;12741:58:0;;;12687:123;;12721:5;;12687:19;:123::i;32654:632::-;32700:10;32807;32819:14;32835:13;32850:17;32871:6;-1:-1:-1;;;;;32871:35:0;;32915:4;32871:50;;;;;;;;;;;;;-1:-1:-1;;;;;32871:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32871:50:0;;;;;;;;;;;;;;;;;-1:-1:-1;32871:50:0;-1:-1:-1;32871:50:0;;-1:-1:-1;32871:50:0;-1:-1:-1;32938:9:0;;32934:95;;33016:1;33009:8;;;;;;;;32934:95;33039:13;33085:4;33055:27;:9;33069:12;33055:13;:27::i;:::-;:34;;;;;;33039:50;;33115:8;33104;:19;33100:105;;;33192:1;33185:8;;;;;;;;;33100:105;33223:55;33269:8;33258;:19;33223:5;-1:-1:-1;;;;;33223:15:0;;33247:4;33223:30;;;;;;;;;;;;;-1:-1:-1;;;;;33223:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33223:30:0;;:34;:55::i;:::-;33215:63;;32654:632;;;;;;:::o;48424:945::-;48563:9;48575:5;-1:-1:-1;;;;;48575:15:0;;48599:4;48575:30;;;;;;;;;;;;;-1:-1:-1;;;;;48575:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48575:30:0;48668:16;;;48682:1;48668:16;;;;;;;;;48575:30;;-1:-1:-1;48641:24:0;;48668:16;;;;;;;;;;;;-1:-1:-1;48668:16:0;48641:43;;48716:6;48695:7;48703:1;48695:10;;;;;;;;-1:-1:-1;;;;;48695:28:0;;;:10;;;;;;;;;;:28;48734:45;;;-1:-1:-1;;;48734:45:0;;48764:4;48734:45;;;;;;;;;;;;;;;;;;;;31648:42;;48734:21;;48764:4;;48771:7;;48734:45;;;;;;;;;;;;;;-1:-1:-1;48734:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48807:29:0;;;-1:-1:-1;;;48807:29:0;;48830:4;48807:29;;;;;;48792:12;;-1:-1:-1;31736:42:0;;-1:-1:-1;48807:14:0;;:29;;;;;;;;;;;;;;;31736:42;48807:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48807:29:0;;-1:-1:-1;48851:11:0;;48847:89;;48879:45;31736:42;48908:5;48916:7;48879:5;:45::i;:::-;48988:4;48955:5;-1:-1:-1;;;;;48955:15:0;;48979:4;48955:30;;;;;;;;;;;;;-1:-1:-1;;;;;48955:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48955:30:0;:37;;-1:-1:-1;49011:18:0;;;;49003:43;;;;;-1:-1:-1;;;49003:43:0;;;;;;;;;;;;-1:-1:-1;;;49003:43:0;;;;;;;;;;;;;;;49112:8;;49108:218;;49137:8;24196:5;49148:17;49157:7;;49148:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;49199:7:0;;49195:120;;49246:8;;49227:33;;-1:-1:-1;;;;;49227:5:0;:18;;;49246:8;49256:3;49227:18;:33::i;:::-;49286:13;:4;49295:3;49286:8;:13::i;:::-;49279:20;;49195:120;49108:218;;49343:18;;;;;;;;;;;;;;;;;48424:945;;;;:::o;12826:282::-;13021:68;;;-1:-1:-1;;;;;13021:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13021:68:0;-1:-1:-1;;;13021:68:0;;;12967:133;;13001:5;;12967:19;:133::i;:::-;12826:282;;;;:::o;19073:208::-;19125:4;19146:6;19142:20;;-1:-1:-1;19161:1:0;19154:8;;19142:20;19182:5;;;19186:1;19182;:5;:1;19206:5;;;;;:10;19198:56;;;;-1:-1:-1;;;19198:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19272:1;-1:-1:-1;19073:208:0;;;;;:::o;33788:287::-;33847:4;33996:8;31648:42;-1:-1:-1;;;;;34010:19:0;;34038:6;34010:36;;;;;;;;;;;;;-1:-1:-1;;;;;34010:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34010:36:0;;;;-1:-1:-1;;33788:287:0;:::o;34083:193::-;34155:4;34189:6;;34176:10;:19;34172:78;;;-1:-1:-1;34232:6:0;;34219:19;;34212:26;;34172:78;-1:-1:-1;34267:1:0;34083:193;;;;:::o;49501:344::-;49537:10;49550:14;:12;:14::i;:::-;49587:11;;:34;;;-1:-1:-1;;;49587:34:0;;49615:4;49587:34;;;;;;49537:27;;-1:-1:-1;49575:9:0;;-1:-1:-1;;;;;49587:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49587:34:0;;-1:-1:-1;49640:12:0;;;49632:38;;;;;-1:-1:-1;;;49632:38:0;;;;;;;;;;;;-1:-1:-1;;;49632:38:0;;;;;;;;;;;;;;;49697:12;;;49777:17;49697:12;49777:9;:17::i;:::-;49812:25;;;;;;;;;;;;;;;;;;;;49768:26;;-1:-1:-1;49812:25:0;;;;;;;;;;49501:344;;;:::o;49936:749::-;50004:10;50017:14;:12;:14::i;:::-;50004:27;;50059:9;50050:5;:18;;50042:42;;;;;-1:-1:-1;;;50042:42:0;;;;;;;;;;;;-1:-1:-1;;;50042:42:0;;;;;;;;;;;;;;;50112:9;50103:5;:18;;50095:42;;;;;-1:-1:-1;;;50095:42:0;;;;;;;;;;;;-1:-1:-1;;;50095:42:0;;;;;;;;;;;;;;;50234:11;;:34;;;-1:-1:-1;;;50234:34:0;;50262:4;50234:34;;;;;;50150:9;;;;;;;;-1:-1:-1;;;;;50234:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50234:34:0;;-1:-1:-1;50285:12:0;;;50281:247;;;50357:30;;;-1:-1:-1;;;50357:30:0;;50381:4;50357:30;;;;;;50321:12;;;;-1:-1:-1;;;;;;50357:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50357:30:0;;-1:-1:-1;50406:11:0;;;50402:63;;;50445:4;50438:11;;50402:63;50281:247;;;50511:5;50504:4;:12;50497:19;;50281:247;50551:1;50544:4;:8;:20;;;;50563:1;50556:4;:8;50544:20;50540:83;;;50581:11;;:30;;;-1:-1:-1;;;50581:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50581:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50540:83;50640:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49936:749;;;;;;;:::o;45037:1644::-;45087:4;45104:8;45115:5;-1:-1:-1;;;;;45115:15:0;;45139:4;45115:30;;;;;;;;;;;;;-1:-1:-1;;;;;45115:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45115:30:0;;-1:-1:-1;45160:14:0;;;45156:61;;45198:7;45191:14;;;;;45156:61;45249:13;;;45229:17;45884:14;:12;:14::i;:::-;45868:30;;45909:13;45925:14;:12;:14::i;:::-;45909:30;;45950:14;45967:27;:25;:27::i;:::-;45950:44;;46005:12;46020:34;46044:9;46020:23;:34::i;:::-;46005:49;-1:-1:-1;46065:16:0;46084:22;:8;46097;46084:12;:22::i;:::-;46065:41;;46159:11;46144:12;:26;46140:85;;;46202:11;46187:26;;46140:85;46270:16;46289:54;46319:23;46324:4;46334:7;46319:14;:23::i;:::-;46289:25;:12;46306:7;46289:16;:25::i;:::-;:29;;:54::i;:::-;46270:73;;46372:8;46358:11;:22;46354:77;;;-1:-1:-1;46411:8:0;46354:77;46443:38;46455:25;:8;46468:11;46455:12;:25::i;:::-;46443:11;:38::i;:::-;46492:21;46500:12;46492:7;:21::i;:::-;46526:13;46542:5;-1:-1:-1;;;;;46542:15:0;;46566:4;46542:30;;;;;;;;;;;;;-1:-1:-1;;;;;46542:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46542:30:0;;-1:-1:-1;46587:18:0;;;46583:66;;;46629:8;-1:-1:-1;46622:15:0;;-1:-1:-1;;;;;;;;46622:15:0;46583:66;-1:-1:-1;46666:7:0;;45037:1644;-1:-1:-1;;;;;;;;;45037:1644:0:o;32292:205::-;32346:3;;;;;-1:-1:-1;;;;;32346:3:0;:17;32342:74;;32397:3;;32380:24;;31736:42;;32397:3;;;-1:-1:-1;;;;;32397:3:0;32402:1;32380:16;:24::i;:::-;32428:3;:10;;-1:-1:-1;;;;;;32428:10:0;;-1:-1:-1;;;;;32428:10:0;;;;;;32451:38;31736:42;32428:10;-1:-1:-1;;32451:16:0;:38::i;34310:114::-;34351:4;34375:6;-1:-1:-1;;;;;34375:26:0;;34410:4;34375:41;;;;;;;;;;;;;-1:-1:-1;;;;;34375:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34375:41:0;;-1:-1:-1;34310:114:0;:::o;34458:115::-;34499:4;34523:6;-1:-1:-1;;;;;34523:27:0;;34559:4;34523:42;;;;;;;;;;;;;-1:-1:-1;;;;;34523:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;43516:1345;43597:13:::1;43613:14;:12;:14::i;:::-;43597:30;;43638:13;43654:14;:12;:14::i;:::-;43638:30:::0;-1:-1:-1;43679:16:0::1;43698:22;:8:::0;43638:30;43698:12:::1;:22::i;:::-;43679:41;;43756:8;43739:13;:25;;43731:48;;;::::0;;-1:-1:-1;;;43731:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43731:48:0;;;;;;;;;;;;;::::1;;43790:14;43807:27;:25;:27::i;:::-;43790:44;;43889:11;43872:13;:28;43868:88;;43933:11;43917:27;;43868:88;43966:6;43983:871;44001:13;43990:8;:24;43983:871;;;44101:2;44097:1;:6;44089:32;;;::::0;;-1:-1:-1;;;44089:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44089:32:0;;;;;;;;;;;;;::::1;;44170:17;44284:5;44190:91;44262:4;44191:47;44208:8;44218;44228:9;44191:16;:47::i;:::-;44190:53:::0;::::1;:91::i;:::-;:99;;;;;;44170:119;;44327:1;44312:12;:16;44304:39;;;::::0;;-1:-1:-1;;;44304:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44304:39:0;;;;;;;;;;;;;::::1;;44391:13:::0;44362:26:::1;:8:::0;44375:12;44362::::1;:26::i;:::-;:42;44358:187;;;44502:27;:8:::0;44515:13;44502:12:::1;:27::i;:::-;44487:42;;44358:187;44559:21;44567:12;44559:7;:21::i;:::-;44595:20;44602:12;44595:6;:20::i;:::-;44703:26;:8:::0;44716:12;44703::::1;:26::i;:::-;44692:37:::0;-1:-1:-1;44798:26:0::1;:8:::0;44811:12;44798::::1;:26::i;:::-;44787:37:::0;-1:-1:-1;;44839:3:0::1;;43983:871;;;35808:1;;;;;35820:13:::0;35836:14;:12;:14::i;:::-;35820:30;;35861:13;35877:14;:12;:14::i;:::-;35861:30;;35902:14;35919:27;:25;:27::i;:::-;35902:44;;35957:12;35972:34;35996:9;35972:23;:34::i;:::-;35957:49;-1:-1:-1;36157:8:0;36192:4;36168:21;:8;35957:49;36168:12;:21::i;:::-;:28;;;;;;36157:39;;36227:3;36215:8;:15;;36207:42;;;;;-1:-1:-1;;;36207:42:0;;;;;;;;;;;;-1:-1:-1;;;36207:42:0;;;;;;;;;;;;;;;43516:1345;;;;;;:::o;37042:107::-;37099:6;-1:-1:-1;;;;;37099:18:0;;37118:7;37099:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37099:27:0;:32;37091:50;;;;;-1:-1:-1;;;37091:50:0;;;;;;;;;;;;-1:-1:-1;;;37091:50:0;;;;;;;;;;;;;;39084:1939;39235:4:::1;39225:6;;:14;39221:53;;39256:7;;39221:53;39284:13;39300:14;:12;:14::i;:::-;39284:30;;39325:13;39341:14;:12;:14::i;:::-;39325:30:::0;-1:-1:-1;39366:16:0::1;39385:22;:8:::0;39325:30;39385:12:::1;:22::i;:::-;39366:41;;39469:8;39452:13;:25;;39444:46;;;::::0;;-1:-1:-1;;;39444:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39444:46:0;;;;;;;;;;;;;::::1;;39501:14;39518:27;:25;:27::i;:::-;39501:44;;39556:12;39571:34;39595:9;39571:23;:34::i;:::-;39556:49;;39616:8;39627:29;39648:7;39627:20;:29::i;:::-;39616:40:::0;-1:-1:-1;39708:8:0::1;39761:5;39719:39;39753:4;39743;39720:20;:11:::0;39616:40;39720:15:::1;:20::i;:::-;:27;;;;;;::::0;39719:33:::1;:39::i;:::-;:47;;;;;;39708:58;;39798:3;39781:13;:20;39777:72;;39834:3;39818:19;;39777:72;39859:6;39876:1140;39894:13;39883:8;:24;39876:1140;;;39994:2;39990:1;:6;39982:32;;;::::0;;-1:-1:-1;;;39982:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39982:32:0;;;;;;;;;;;;;::::1;;40210:17;40322:5;40230:89;40300:4;40230:47;40247:8;40257;40267:9;40230:16;:47::i;:89::-;:97;;;;;;40210:117;;40365:1;40350:12;:16;40342:39;;;::::0;;-1:-1:-1;;;40342:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40342:39:0;;;;;;;;;;;;;::::1;;40429:13:::0;40400:26:::1;:8:::0;40413:12;40400::::1;:26::i;:::-;:42;40396:187;;;40540:27;:13:::0;40558:8;40540:17:::1;:27::i;:::-;40525:42;;40396:187;40597:21;40605:12;40597:7;:21::i;:::-;40718;40726:12;40718:7;:21::i;:::-;40867:26;:8:::0;40880:12;40867::::1;:26::i;:::-;40856:37:::0;-1:-1:-1;40960:26:0::1;:8:::0;40973:12;40960::::1;:26::i;:::-;40949:37:::0;-1:-1:-1;;41001:3:0::1;;39876:1140;;;35808:1;;;;;;;;;35820:13:::0;35836:14;:12;:14::i;36473:100::-;36531:6;-1:-1:-1;;;;;36531:11:0;;36543:7;36531:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36531:20:0;:25;36523:42;;;;;-1:-1:-1;;;36523:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;36523:42:0;;;;;;;;;;;;;;41144:222;41183:8;41194:5;-1:-1:-1;;;;;41194:15:0;;41218:4;41194:30;;;;;;;;;;;;;-1:-1:-1;;;;;41194:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41194:30:0;;-1:-1:-1;41239:7:0;;41235:124;;41263:12;41271:3;41263:7;:12::i;:::-;41322:25;-1:-1:-1;;41322:9:0;:25::i;37355:114::-;37413:6;-1:-1:-1;;;;;37413:23:0;;37437:7;37413:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37413:32:0;:37;37405:56;;;;;-1:-1:-1;;;37405:56:0;;;;;;;;;;;;-1:-1:-1;;;37405:56:0;;;;;;;;;;;;;;36781:104;36839:6;-1:-1:-1;;;;;36839:13:0;;36853:7;36839:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36839:22:0;:27;36831:46;;;;;-1:-1:-1;;;36831:46:0;;;;;;;;;;;;-1:-1:-1;;;36831:46:0;;;;;;;;;;;;;;15272:860;15696:23;15722:106;15764:4;15722:106;;;;;;;;;;;;;;;;;15730:5;-1:-1:-1;;;;;15722:27:0;;;:106;;;;;:::i;:::-;15843:17;;15696:132;;-1:-1:-1;15843:21:0;15839:286;;16016:10;16005:30;;;;;;;;;;;;;;;-1:-1:-1;16005:30:0;15979:134;;;;-1:-1:-1;;;15979:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4853:605;5020:12;5092:5;5067:21;:30;;5045:118;;;;-1:-1:-1;;;5045:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5182:18;5193:6;5182:10;:18::i;:::-;5174:60;;;;;-1:-1:-1;;;5174:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5308:12;5322:23;5349:6;-1:-1:-1;;;;;5349:11:0;5368:5;5375:4;5349:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5349:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:73;;;;5398:52;5416:7;5425:10;5437:12;5398:17;:52::i;:::-;5391:59;4853:605;-1:-1:-1;;;;;;;4853:605:0:o;18215:167::-;18267:4;18293:5;;;18317:6;;;;18309:46;;;;;-1:-1:-1;;;18309:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;47950:466;48133:16;;;48147:1;48133:16;;;;;;;;;48109:21;;48133:16;;;;;;;;;;-1:-1:-1;48133:16:0;48109:40;;48170:5;48160:4;48165:1;48160:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;48160:15:0;;;-1:-1:-1;;;;;48160:15:0;;;;;31488:42;48186:4;48191:1;48186:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;48186:14:0;;;-1:-1:-1;;;;;48186:14:0;;;;;48221:3;48211:4;48216:1;48211:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;48211:13:0;;;-1:-1:-1;;;;;48211:13:0;;;;;48253:3;;;;;;;;;-1:-1:-1;;;;;48253:3:0;-1:-1:-1;;;;;48237:45:0;;48297:7;48319:1;48335:4;48362;48382:15;48237:171;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47950:466;;;;:::o;18665:149::-;18717:4;18747:1;18742;:6;;18734:49;;;;;-1:-1:-1;;;18734:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18801:5:0;;;18665:149::o;19759:144::-;19811:4;19840:1;19836;:5;19828:44;;;;;-1:-1:-1;;;19828:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19894:1;19890;:5;;;;;;;19759:144;-1:-1:-1;;;19759:144:0:o;41855:548::-;41980:4;;42266:29;42290:4;42266:19;:9;42280:4;42266:13;:19::i;:29::-;42255:40;;42323:3;42310:9;:16;42306:57;;42350:1;42343:8;;;;;42306:57;42380:15;;;;41855:548;-1:-1:-1;;;41855:548:0:o;37626:280::-;37689:4;37862:36;37877:20;37882:4;37892;37877:14;:20::i;:::-;37867:4;;37862:14;:36::i;37914:502::-;38039:4;;38304;38282:19;:9;38296:4;38282:13;:19::i;:::-;:26;;;;;;38271:37;;38336:3;38323:9;:16;38319:57;;38363:1;38356:8;;;;;38319:57;38393:15;;;;;37914:502;-1:-1:-1;;;37914:502:0:o;683:441::-;1060:20;1108:8;;;683:441::o;7683:777::-;7833:12;7862:7;7858:595;;;-1:-1:-1;7893:10:0;7886:17;;7858:595;8007:17;;:21;8003:439;;8270:10;8264:17;8331:15;8318:10;8314:2;8310:19;8303:44;8218:148;8413:12;8406:20;;-1:-1:-1;;;8406:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae9991028952
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.