Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repay | 13124542 | 1265 days ago | IN | 0 ETH | 0.06727533 | ||||
Deposit | 13117596 | 1266 days ago | IN | 0 ETH | 0.0849967 | ||||
Harvest | 13117467 | 1266 days ago | IN | 0 ETH | 0.15556965 | ||||
Deposit | 13104798 | 1268 days ago | IN | 0 ETH | 0.05732485 | ||||
Harvest | 13104687 | 1268 days ago | IN | 0 ETH | 0.07722623 | ||||
Deposit | 13085386 | 1271 days ago | IN | 0 ETH | 0.04595543 | ||||
Harvest | 13085239 | 1271 days ago | IN | 0 ETH | 0.10866131 | ||||
Deposit | 13052427 | 1276 days ago | IN | 0 ETH | 0.02827197 | ||||
Harvest | 13052235 | 1276 days ago | IN | 0 ETH | 0.04189603 | ||||
Harvest | 13047515 | 1277 days ago | IN | 0 ETH | 0.0326324 | ||||
Deposit | 13047386 | 1277 days ago | IN | 0 ETH | 0.02590061 | ||||
Set Admin | 13039681 | 1278 days ago | IN | 0 ETH | 0.00168364 | ||||
Set Next Time Lo... | 13039674 | 1278 days ago | IN | 0 ETH | 0.00225825 | ||||
Authorize | 13033380 | 1279 days ago | IN | 0 ETH | 0.00167453 | ||||
Authorize | 13033353 | 1279 days ago | IN | 0 ETH | 0.00352787 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyConvexUsdpDai
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-16 */ /** *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 BaseRewardPool { function balanceOf(address _account) external view returns (uint); function getReward(address _account, bool _claimExtras) external returns (bool); function withdrawAndUnwrap(uint amount, bool claim) external returns (bool); } interface Booster { function poolInfo(uint _pid) external view returns ( address lptoken, address token, address gauge, address crvRewards, address stash, bool shutdown ); function deposit( uint _pid, uint _amount, bool _stake ) external returns (bool); function withdraw(uint _pid, uint _amount) external returns (bool); } interface DepositZapUsdp3Crv { function add_liquidity(uint[4] calldata _amounts, uint _min_mint_amount) external returns (uint); function remove_liquidity_one_coin( uint _burn_amount, int128 _i, uint _min_amount ) external returns (uint); function calc_withdraw_one_coin( address _pool, uint _amount, int128 _i ) external view returns (uint); } 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; } } interface StableSwapUsdp3Crv { function coins(uint _i) external view returns (address); function get_virtual_price() external view returns (uint); } 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 StrategyConvexUsdp is Strategy { using SafeERC20 for IERC20; using SafeMath for uint; // Uniswap and Sushiswap // // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; uint private constant NUM_REWARDS = 2; // address of DEX (uniswap or sushiswap) to use for selling reward tokens // CRV, CVX address[NUM_REWARDS] public dex; address private constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52; address private constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; // Solc 0.7 cannot create constant arrays address[NUM_REWARDS] private REWARDS = [CRV, CVX]; // Convex // Booster private constant BOOSTER = Booster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); // pool id uint private constant PID = 28; BaseRewardPool private constant REWARD = BaseRewardPool(0x24DfFd1949F888F91A0c8341Fc98a3F280a782a8); bool public shouldClaimExtras = true; // Curve // // Deposit USDP + 3CRV DepositZapUsdp3Crv private constant ZAP = DepositZapUsdp3Crv(0x3c8cAee4E09296800f8D29A68Fa3837e2dae4940); // StableSwap USDP + 3CRV (meta pool) StableSwapUsdp3Crv private constant CURVE_POOL = StableSwapUsdp3Crv(0x42d7025938bEc20B69cBae5A77421082407f053A); // LP token for curve pool (USDP / 3CRV) IERC20 private constant CURVE_LP = IERC20(0x7Eb40E450b9655f4B3cC4259BCC731c63ff55ae6); // prevent slippage from deposit / withdraw uint public slip = 100; uint private constant SLIP_MAX = 10000; /* 0 - USDP 1 - DAI 2 - USDC 3 - USDT */ // multipliers to normalize token decimals to 10 ** 18 uint[4] private MULS = [1, 1, 1e12, 1e12]; uint private immutable MUL; // multiplier of token uint private immutable INDEX; // index of token // DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F // USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 // USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7 constructor( address _token, address _fundManager, address _treasury, uint _index ) Strategy(_token, _fundManager, _treasury) { // disable USDP require(_index > 0, "index = 0"); INDEX = _index; MUL = MULS[_index]; (address lptoken, , , address crvRewards, , ) = BOOSTER.poolInfo(PID); require(address(CURVE_LP) == lptoken, "curve pool lp != pool info lp"); require(address(REWARD) == crvRewards, "reward != pool info reward"); IERC20(_token).safeApprove(address(ZAP), type(uint).max); // deposit into BOOSTER CURVE_LP.safeApprove(address(BOOSTER), type(uint).max); // withdraw from ZAP CURVE_LP.safeApprove(address(ZAP), type(uint).max); _setDex(0, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CRV - sushiswap _setDex(1, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CVX - sushiswap } function _setDex(uint _i, address _dex) private { IERC20 reward = IERC20(REWARDS[_i]); // disallow previous dex if (dex[_i] != address(0)) { reward.safeApprove(dex[_i], 0); } dex[_i] = _dex; // approve new dex reward.safeApprove(_dex, type(uint).max); } function setDex(uint _i, address _dex) external onlyTimeLock { require(_dex != address(0), "dex = 0 address"); _setDex(_i, _dex); } /* @notice Set max slippage for deposit and withdraw from Curve pool @param _slip Max amount of slippage allowed */ function setSlip(uint _slip) external onlyAuthorized { require(_slip <= SLIP_MAX, "slip > max"); slip = _slip; } // @dev Claim extra rewards from Convex function setShouldClaimExtras(bool _shouldClaimExtras) external onlyAuthorized { shouldClaimExtras = _shouldClaimExtras; } function _totalAssets() private view returns (uint total) { /* s0 = shares in meta pool p0 = price per share of meta pool s1 = shares in base pool p1 = price per share of base pool a = amount of tokens (DAI, USDC, USDT) s1 = s0 * p0 a = s1 * p1 a = s0 * p0 * p1 */ // amount of Curve LP tokens in Convex uint lpBal = REWARD.balanceOf(address(this)); // amount of USDP or DAI, USDC, USDT converted from Curve LP // BASE_POOL.get_virtual_price is included in CURVE_POOL.get_virtual_price // so CURVE_POOL.get_virtual_price = p0 * p1 total = lpBal.mul(CURVE_POOL.get_virtual_price()) / (MUL * 1e18); total = total.add(token.balanceOf(address(this))); } function totalAssets() external view override returns (uint) { return _totalAssets(); } function _deposit() private { uint bal = token.balanceOf(address(this)); if (bal > 0) { uint[4] memory amounts; amounts[INDEX] = bal; /* shares = token amount * multiplier * 1e18 / price per share */ uint pricePerShare = CURVE_POOL.get_virtual_price(); uint shares = bal.mul(MUL).mul(1e18).div(pricePerShare); uint min = shares.mul(SLIP_MAX - slip) / SLIP_MAX; ZAP.add_liquidity(amounts, min); } uint lpBal = CURVE_LP.balanceOf(address(this)); if (lpBal > 0) { require(BOOSTER.deposit(PID, lpBal, true), "deposit failed"); } } 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 _calcSharesToWithdraw( uint _amount, uint _total, uint _totalShares ) private pure returns (uint) { /* calculate shares to withdraw a = amount of token to withdraw T = total amount of token locked in external liquidity pool s = shares to withdraw P = total shares deposited into external liquidity pool a / T = s / P s = a / T * P */ if (_total > 0) { // avoid rounding errors and cap shares to be <= total shares if (_amount >= _total) { return _totalShares; } return _amount.mul(_totalShares) / _total; } return 0; } function _withdraw(uint _amount) private returns (uint) { uint bal = token.balanceOf(address(this)); if (_amount <= bal) { return _amount; } uint total = _totalAssets(); if (_amount >= total) { _amount = total; } uint need = _amount - bal; uint totalShares = REWARD.balanceOf(address(this)); // total assets is always >= bal uint shares = _calcSharesToWithdraw(need, total - bal, totalShares); // withdraw from Convex if (shares > 0) { // true = claim CRV require(REWARD.withdrawAndUnwrap(shares, false), "reward withdraw failed"); } // withdraw from Curve uint lpBal = CURVE_LP.balanceOf(address(this)); if (shares > lpBal) { shares = lpBal; } if (shares > 0) { uint min = need.mul(SLIP_MAX - slip) / SLIP_MAX; ZAP.remove_liquidity_one_coin(shares, int128(INDEX), min); } uint balAfter = token.balanceOf(address(this)); if (balAfter < _amount) { return balAfter; } // balAfter >= _amount >= total // requested to withdraw all so return balAfter if (_amount >= total) { return balAfter; } // requested withdraw < all return _amount; } 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 onlyAuthorized { 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 _dex, address _tokenIn, address _tokenOut, uint _amount ) private { // create dynamic array with 3 elements address[] memory path = new address[](3); path[0] = _tokenIn; path[1] = WETH; path[2] = _tokenOut; 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)); require( REWARD.getReward(address(this), shouldClaimExtras), "get reward failed" ); for (uint i = 0; i < NUM_REWARDS; i++) { uint rewardBal = IERC20(REWARDS[i]).balanceOf(address(this)); if (rewardBal > 0) { _swap(dex[i], REWARDS[i], address(token), rewardBal); } } 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; // balance of token 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 { for (uint i = 0; i < NUM_REWARDS; i++) { require(_token != REWARDS[i], "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 StrategyConvexUsdpDai is StrategyConvexUsdp { constructor(address _fundManager, address _treasury) StrategyConvexUsdp( 0x6B175474E89094C44Da98b954EedeAC495271d0F, _fundManager, _treasury, 1 ) {} }
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":"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":"_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":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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":"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"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"repay","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":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"},{"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":"bool","name":"_shouldClaimExtras","type":"bool"}],"name":"setShouldClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slip","type":"uint256"}],"name":"setSlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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
6103e86006556007805460ff1916600117905561012060405273d533a949740bb3306d119cc777fa900ba034cd5260e0908152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b610100526200005b90600a90600262000a5b565b50600c805460ff191660019081179091556064600d5560408051608081018252828152602081019290925264e8d4a510009082018190526060820152620000a790600e90600462000ab8565b50348015620000b557600080fd5b506040516200448b3803806200448b83398181016040526040811015620000db57600080fd5b508051602090910151736b175474e89094c44da98b954eedeac495271d0f828260018383836001600160a01b0381166200015c576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b158015620001d257600080fd5b505afa158015620001e7573d6000803e3d6000fd5b505050506040513d6020811015620001fe57600080fd5b50516001600160a01b0316146200025c576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b031916608052620002ab908416836000196200058f602090811b62001c1d17901c565b50505060008111620002f0576040805162461bcd60e51b81526020600482015260096024820152680696e646578203d20360bc1b604482015290519081900360640190fd5b60c0819052600e81600481106200030357fe5b015460a05260408051631526fe2760e01b8152601c60048201529051600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe279160248083019260c0929190829003018186803b1580156200036057600080fd5b505afa15801562000375573d6000803e3d6000fd5b505050506040513d60c08110156200038c57600080fd5b5080516060909101519092509050737eb40e450b9655f4b3cc4259bcc731c63ff55ae66001600160a01b038316146200040c576040805162461bcd60e51b815260206004820152601d60248201527f637572766520706f6f6c206c7020213d20706f6f6c20696e666f206c70000000604482015290519081900360640190fd5b7324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b038216146200047e576040805162461bcd60e51b815260206004820152601a60248201527f72657761726420213d20706f6f6c20696e666f20726577617264000000000000604482015290519081900360640190fd5b620004b9733c8caee4e09296800f8d29a68fa3837e2dae4940600019886001600160a01b03166200058f60201b62001c1d179092919060201c565b620004fc737eb40e450b9655f4b3cc4259bcc731c63ff55ae673f403c135812408bfbe8713b5a23a04b3d48aae316000196200058f602090811b62001c1d17901c565b6200053f737eb40e450b9655f4b3cc4259bcc731c63ff55ae6733c8caee4e09296800f8d29a68fa3837e2dae49406000196200058f602090811b62001c1d17901c565b62000560600073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006b3565b62000581600173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006b3565b505050505050505062000b09565b80158062000619575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620005e957600080fd5b505afa158015620005fe573d6000803e3d6000fd5b505050506040513d60208110156200061557600080fd5b5051155b620006565760405162461bcd60e51b8152600401808060200182810382526036815260200180620044556036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620006ae9185916200076d16565b505050565b6000600a8360028110620006c357fe5b01546001600160a01b03169050600060088460028110620006e057fe5b01546001600160a01b031614620007265762000726600884600281106200070357fe5b01546001600160a01b03838116911660006200058f602090811b62001c1d17901c565b81600884600281106200073557fe5b0180546001600160a01b0319166001600160a01b03928316179055620006ae908216836000196200058f602090811b62001c1d17901c565b6000620007c9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200082960201b62001d30179092919060201c565b805190915015620006ae57808060200190516020811015620007ea57600080fd5b5051620006ae5760405162461bcd60e51b815260040180806020018281038252602a8152602001806200442b602a913960400191505060405180910390fd5b60606200083a848460008562000844565b90505b9392505050565b606082471015620008875760405162461bcd60e51b8152600401808060200182810382526026815260200180620044056026913960400191505060405180910390fd5b6200089285620009ab565b620008e4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310620009245780518252601f19909201916020918201910162000903565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000988576040519150601f19603f3d011682016040523d82523d6000602084013e6200098d565b606091505b509092509050620009a0828286620009b1565b979650505050505050565b3b151590565b60608315620009c25750816200083d565b825115620009d35782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a1f57818101518382015260200162000a05565b50505050905090810190601f16801562000a4d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b826002810192821562000aa6579160200282015b8281111562000aa657825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000a6f565b5062000ab492915062000af2565b5090565b826004810192821562000aa6579160200282015b8281111562000aa6578251829064ffffffffff1690559160200191906001019062000acc565b5b8082111562000ab4576000815560010162000af3565b60805160601c60a05160c05161387262000b9360003980612ac45280612d79525080611e3b5280612e405250806108385280610abc5280610ae85280610bf65280610f6f52806114ec52806116bd5280611bfb5280611ede5280611f8652806121c152806121f35280612312528061264152806127a95280612b5d5280612cce52506138726000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b610727565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b5035610736565b6102316004803603604081101561028057600080fd5b506001600160a01b0381351690602001356107b5565b610231600480360360208110156102ac57600080fd5b5035610864565b610231610923565b6102316109a3565b61023b610a48565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610a4e565b61030e6004803603602081101561030757600080fd5b5035610c5e565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610c7e565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d14565b61023b6004803603602081101561039757600080fd5b5035610e22565b610231600480360360208110156103b457600080fd5b50351515610fde565b610231600480360360208110156103d357600080fd5b5035151561104d565b61023b6110d6565b6103ec6110dc565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b03166110e5565b61030e611185565b61030e611194565b6102316004803603602081101561044c57600080fd5b50356001600160a01b03166111a3565b6102316004803603602081101561047257600080fd5b50356112a2565b6102316004803603604081101561048f57600080fd5b5080359060200135611346565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b03166113c6565b61030e611469565b6103ec611478565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b0316611481565b6102316004803603602081101561051457600080fd5b50356001600160a01b0316611496565b61030e61174f565b6102316004803603604081101561054257600080fd5b508035906020013561175e565b6102316004803603604081101561056557600080fd5b5080359060200135611926565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611ae8565b61030e611bea565b61030e611bf9565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600281101561069357600a816002811061063757fe5b01546001600160a01b038381169116141561068b576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600101610621565b50600254604080516370a0823160e01b81523060048201529051610724926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156106e757600080fd5b505afa1580156106fb573d6000803e3d6000fd5b505050506040513d602081101561071157600080fd5b50516001600160a01b0384169190611d49565b50565b6000610731611d9b565b905090565b6000546001600160a01b031633148061075957506002546001600160a01b031633145b8061077357503360009081526004602052604090205460ff165b6107ac576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61072481611f82565b6000546001600160a01b03163314806107d857506002546001600160a01b031633145b806107f257503360009081526004602052604090205460ff165b61082b576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016833084612381565b5050565b6000546001600160a01b031633148061088757506002546001600160a01b031633145b806108a157503360009081526004602052604090205460ff165b6108da576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61271081111561091e576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600d55565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109a16123e1565b565b6001546001600160a01b031633146109f4576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610a9a576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610ae657600554610ae6906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691166000611c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d6020811015610b7357600080fd5b50516001600160a01b031614610bd0576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c1f907f00000000000000000000000000000000000000000000000000000000000000001682600019611c1d565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160028110610c6e57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610ca157506002546001600160a01b031633145b80610cbb57503360009081526004602052604090205460ff165b610cf4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610cfd83611f82565b610d056123e1565b610d0f8282612503565b505050565b6000546001600160a01b0316331480610d3757506002546001600160a01b031633145b610d70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610dbe576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610e74576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610eb8576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610ec3836127a4565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f1457600080fd5b505afa158015610f28573d6000803e3d6000fd5b505050506040513d6020811015610f3e57600080fd5b505190506000610f4c611d9b565b905080821115610f5c5780820393505b8215610f9657610f966001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385611d49565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061100157506002546001600160a01b031633145b61103a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b031633148061107057506002546001600160a01b031633145b8061108a57503360009081526004602052604090205460ff165b6110c3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b600d5481565b60075460ff1681565b6000546001600160a01b03163314611131576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b03163314806111c657506002546001600160a01b031633145b6111ff576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661124e576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806112c557506002546001600160a01b031633145b6112fe576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611341576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061136957506002546001600160a01b031633145b8061138357503360009081526004602052604090205460ff165b6113bc576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108608282612503565b6000546001600160a01b03163314611412576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b03811661145f576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108608282612c31565b6001546001600160a01b031681565b600c5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b031633146114e5576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d602081101561157757600080fd5b50516001600160a01b0316146115d4576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561161b57600080fd5b505afa15801561162f573d6000803e3d6000fd5b505050506040513d602081101561164557600080fd5b50516001600160a01b03161461168c5760405162461bcd60e51b81526004018080602001828103825260258152602001806137976025913960400191505060405180910390fd5b60075460ff16156116a1576116a16001611f82565b60006116ae6000196127a4565b90506116e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611c1d565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b031633148061178157506002546001600160a01b031633145b8061179b57503360009081526004602052604090205460ff165b6117d4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611815576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611820836127a4565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b50519050828110156118e5576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b031633148061194957506002546001600160a01b031633145b8061196357503360009081526004602052604090205460ff165b61199c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116119df576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905081811015611aa0576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611aa8612cca565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b0b57506002546001600160a01b031633145b611b44576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b96576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580611ca3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c7557600080fd5b505afa158015611c89573d6000803e3d6000fd5b505050506040513d6020811015611c9f57600080fd5b5051155b611cde5760405162461bcd60e51b81526004018080602001828103825260368152602001806138076036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d0f9084906130a2565b6060611d3f8484600085613153565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d0f9084906130a2565b604080516370a0823160e01b8152306004820152905160009182917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b158015611df157600080fd5b505afa158015611e05573d6000803e3d6000fd5b505050506040513d6020811015611e1b57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000000291611ecf917342d7025938bec20b69cbae5a77421082407f053a9163bb7b8b8091600480820192602092909190829003018186803b158015611e9c57600080fd5b505afa158015611eb0573d6000803e3d6000fd5b505050506040513d6020811015611ec657600080fd5b505183906132ae565b81611ed657fe5b049150611f7c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518390613310565b91505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ff157600080fd5b505afa158015612005573d6000803e3d6000fd5b505050506040513d602081101561201b57600080fd5b5051600c5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507324dffd1949f888f91a0c8341fc98a3f280a782a891637050ccd9916044808201926020929091908290030181600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b50516120f3576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b60028110156121ef576000600a826002811061210e57fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561215857600080fd5b505afa15801561216c573d6000803e3d6000fd5b505050506040513d602081101561218257600080fd5b5051905080156121e6576121e66008836002811061219c57fe5b01546001600160a01b0316600a84600281106121b457fe5b01546001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008461336a565b506001016120f6565b50807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b5051039050818110156122d1576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b801561234a5760006127106122f1600654846132ae90919063ffffffff16565b816122f857fe5b04905080156123485760035461233b906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611d49565b61234582826135aa565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123db9085906130a2565b50505050565b60006123eb611d9b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d602081101561246657600080fd5b505190508082116124ae576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036124ba816127a4565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b600061250d611d9b565b905082811015612552576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612595576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156125e657600080fd5b505afa1580156125fa573d6000803e3d6000fd5b505050506040513d602081101561261057600080fd5b50519050808511156126c657604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50519150818411156126c1578193505b6126cc565b84810392505b60008411806126db5750600083115b1561274d576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d602081101561283e57600080fd5b505190508083116128525782915050612c2c565b600061285c611d9b565b9050808410612869578093505b604080516370a0823160e01b81523060048201529051838603916000917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b1580156128c157600080fd5b505afa1580156128d5573d6000803e3d6000fd5b505050506040513d60208110156128eb57600080fd5b5051905060006128fe8386860384613607565b905080156129e1577324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561296b57600080fd5b505af115801561297f573d6000803e3d6000fd5b505050506040513d602081101561299557600080fd5b50516129e1576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612a3657600080fd5b505afa158015612a4a573d6000803e3d6000fd5b505050506040513d6020811015612a6057600080fd5b5051905080821115612a70578091505b8115612b59576000612710612a94600d5461271003876132ae90919063ffffffff16565b81612a9b57fe5b049050733c8caee4e09296800f8d29a68fa3837e2dae49406001600160a01b0316631a4d01d2847f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b81526004018084815260200183600f0b81526020018281526020019350505050602060405180830381600087803b158015612b2b57600080fd5b505af1158015612b3f573d6000803e3d6000fd5b505050506040513d6020811015612b5557600080fd5b5050505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bc857600080fd5b505afa158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b5051905088811015612c0c579650612c2c95505050505050565b858910612c21579650612c2c95505050505050565b889750505050505050505b919050565b6000600a8360028110612c4057fe5b01546001600160a01b03169050600060088460028110612c5c57fe5b01546001600160a01b031614612c9257612c9260088460028110612c7c57fe5b01546001600160a01b0383811691166000611c1d565b8160088460028110612ca057fe5b0180546001600160a01b0319166001600160a01b03928316179055610d0f90821683600019611c1d565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b505190508015612f4957612d75613752565b81817f000000000000000000000000000000000000000000000000000000000000000060048110612da257fe5b60200201818152505060007342d7025938bec20b69cbae5a77421082407f053a6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506000612e7082612e6a670de0b6b3a7640000612e64887f00000000000000000000000000000000000000000000000000000000000000006132ae565b906132ae565b90613641565b90506000612710612e90600d5461271003846132ae90919063ffffffff16565b81612e9757fe5b60405162a6cbcd60e21b81529190049150733c8caee4e09296800f8d29a68fa3837e2dae49409063029b2f3490869084906004018083608080838360005b83811015612eed578181015183820152602001612ed5565b5050505090500182815260200192505050602060405180830381600087803b158015612f1857600080fd5b505af1158015612f2c573d6000803e3d6000fd5b505050506040513d6020811015612f4257600080fd5b5050505050505b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612f9e57600080fd5b505afa158015612fb2573d6000803e3d6000fd5b505050506040513d6020811015612fc857600080fd5b50519050801561086057604080516321d0683360e11b8152601c60048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b5051610860576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006130f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d309092919063ffffffff16565b805190915015610d0f5780806020019051602081101561311657600080fd5b5051610d0f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806137dd602a913960400191505060405180910390fd5b6060824710156131945760405162461bcd60e51b81526004018080602001828103825260268152602001806137716026913960400191505060405180910390fd5b61319d856136a8565b6131ee576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061322c5780518252601f19909201916020918201910161320d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866136ae565b979650505050505050565b6000826132bd5750600061330a565b828202828482816132ca57fe5b04146133075760405162461bcd60e51b81526004018080602001828103825260218152602001806137bc6021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613307576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061339b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133dd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061340b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134b0578181015183820152602001613498565b505050509050019650505050505050600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561351657600080fd5b810190808051604051939291908464010000000082111561353657600080fd5b90830190602082018581111561354b57600080fd5b825186602082028301116401000000008211171561356857600080fd5b82525081516020918201928201910280838360005b8381101561359557818101518382015260200161357d565b50505050905001604052505050505050505050565b600082821115613601576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136375782841061361d575080611d42565b8261362885846132ae565b8161362f57fe5b049050611d42565b5060009392505050565b6000808211613697576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816136a057fe5b049392505050565b3b151590565b606083156136bd575081611d42565b8251156136cd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137175781810151838201526020016136ff565b50505050905090810190601f1680156137445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed64736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b610727565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b5035610736565b6102316004803603604081101561028057600080fd5b506001600160a01b0381351690602001356107b5565b610231600480360360208110156102ac57600080fd5b5035610864565b610231610923565b6102316109a3565b61023b610a48565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610a4e565b61030e6004803603602081101561030757600080fd5b5035610c5e565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610c7e565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d14565b61023b6004803603602081101561039757600080fd5b5035610e22565b610231600480360360208110156103b457600080fd5b50351515610fde565b610231600480360360208110156103d357600080fd5b5035151561104d565b61023b6110d6565b6103ec6110dc565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b03166110e5565b61030e611185565b61030e611194565b6102316004803603602081101561044c57600080fd5b50356001600160a01b03166111a3565b6102316004803603602081101561047257600080fd5b50356112a2565b6102316004803603604081101561048f57600080fd5b5080359060200135611346565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b03166113c6565b61030e611469565b6103ec611478565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b0316611481565b6102316004803603602081101561051457600080fd5b50356001600160a01b0316611496565b61030e61174f565b6102316004803603604081101561054257600080fd5b508035906020013561175e565b6102316004803603604081101561056557600080fd5b5080359060200135611926565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611ae8565b61030e611bea565b61030e611bf9565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600281101561069357600a816002811061063757fe5b01546001600160a01b038381169116141561068b576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600101610621565b50600254604080516370a0823160e01b81523060048201529051610724926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156106e757600080fd5b505afa1580156106fb573d6000803e3d6000fd5b505050506040513d602081101561071157600080fd5b50516001600160a01b0384169190611d49565b50565b6000610731611d9b565b905090565b6000546001600160a01b031633148061075957506002546001600160a01b031633145b8061077357503360009081526004602052604090205460ff165b6107ac576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61072481611f82565b6000546001600160a01b03163314806107d857506002546001600160a01b031633145b806107f257503360009081526004602052604090205460ff165b61082b576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108606001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16833084612381565b5050565b6000546001600160a01b031633148061088757506002546001600160a01b031633145b806108a157503360009081526004602052604090205460ff165b6108da576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61271081111561091e576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600d55565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109a16123e1565b565b6001546001600160a01b031633146109f4576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610a9a576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610ae657600554610ae6906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f811691166000611c1d565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d6020811015610b7357600080fd5b50516001600160a01b031614610bd0576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c1f907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1682600019611c1d565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160028110610c6e57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610ca157506002546001600160a01b031633145b80610cbb57503360009081526004602052604090205460ff165b610cf4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610cfd83611f82565b610d056123e1565b610d0f8282612503565b505050565b6000546001600160a01b0316331480610d3757506002546001600160a01b031633145b610d70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610dbe576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610e74576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610eb8576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610ec3836127a4565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f1457600080fd5b505afa158015610f28573d6000803e3d6000fd5b505050506040513d6020811015610f3e57600080fd5b505190506000610f4c611d9b565b905080821115610f5c5780820393505b8215610f9657610f966001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163385611d49565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061100157506002546001600160a01b031633145b61103a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b031633148061107057506002546001600160a01b031633145b8061108a57503360009081526004602052604090205460ff165b6110c3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b600d5481565b60075460ff1681565b6000546001600160a01b03163314611131576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b03163314806111c657506002546001600160a01b031633145b6111ff576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661124e576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806112c557506002546001600160a01b031633145b6112fe576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611341576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061136957506002546001600160a01b031633145b8061138357503360009081526004602052604090205460ff165b6113bc576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108608282612503565b6000546001600160a01b03163314611412576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b03811661145f576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108608282612c31565b6001546001600160a01b031681565b600c5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b031633146114e5576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d602081101561157757600080fd5b50516001600160a01b0316146115d4576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561161b57600080fd5b505afa15801561162f573d6000803e3d6000fd5b505050506040513d602081101561164557600080fd5b50516001600160a01b03161461168c5760405162461bcd60e51b81526004018080602001828103825260258152602001806137976025913960400191505060405180910390fd5b60075460ff16156116a1576116a16001611f82565b60006116ae6000196127a4565b90506116e46001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f168483611c1d565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b031633148061178157506002546001600160a01b031633145b8061179b57503360009081526004602052604090205460ff165b6117d4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611815576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611820836127a4565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b50519050828110156118e5576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b031633148061194957506002546001600160a01b031633145b8061196357503360009081526004602052604090205460ff165b61199c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116119df576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905081811015611aa0576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611aa8612cca565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b0b57506002546001600160a01b031633145b611b44576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b96576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b801580611ca3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c7557600080fd5b505afa158015611c89573d6000803e3d6000fd5b505050506040513d6020811015611c9f57600080fd5b5051155b611cde5760405162461bcd60e51b81526004018080602001828103825260368152602001806138076036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d0f9084906130a2565b6060611d3f8484600085613153565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d0f9084906130a2565b604080516370a0823160e01b8152306004820152905160009182917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b158015611df157600080fd5b505afa158015611e05573d6000803e3d6000fd5b505050506040513d6020811015611e1b57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000010291611ecf917342d7025938bec20b69cbae5a77421082407f053a9163bb7b8b8091600480820192602092909190829003018186803b158015611e9c57600080fd5b505afa158015611eb0573d6000803e3d6000fd5b505050506040513d6020811015611ec657600080fd5b505183906132ae565b81611ed657fe5b049150611f7c7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518390613310565b91505090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ff157600080fd5b505afa158015612005573d6000803e3d6000fd5b505050506040513d602081101561201b57600080fd5b5051600c5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507324dffd1949f888f91a0c8341fc98a3f280a782a891637050ccd9916044808201926020929091908290030181600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b50516120f3576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b60028110156121ef576000600a826002811061210e57fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561215857600080fd5b505afa15801561216c573d6000803e3d6000fd5b505050506040513d602081101561218257600080fd5b5051905080156121e6576121e66008836002811061219c57fe5b01546001600160a01b0316600a84600281106121b457fe5b01546001600160a01b03167f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8461336a565b506001016120f6565b50807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b5051039050818110156122d1576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b801561234a5760006127106122f1600654846132ae90919063ffffffff16565b816122f857fe5b04905080156123485760035461233b906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911683611d49565b61234582826135aa565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123db9085906130a2565b50505050565b60006123eb611d9b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d602081101561246657600080fd5b505190508082116124ae576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036124ba816127a4565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b600061250d611d9b565b905082811015612552576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612595576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156125e657600080fd5b505afa1580156125fa573d6000803e3d6000fd5b505050506040513d602081101561261057600080fd5b50519050808511156126c657604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16916370a08231916024808301926020929190829003018186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50519150818411156126c1578193505b6126cc565b84810392505b60008411806126db5750600083115b1561274d576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d602081101561283e57600080fd5b505190508083116128525782915050612c2c565b600061285c611d9b565b9050808410612869578093505b604080516370a0823160e01b81523060048201529051838603916000917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b1580156128c157600080fd5b505afa1580156128d5573d6000803e3d6000fd5b505050506040513d60208110156128eb57600080fd5b5051905060006128fe8386860384613607565b905080156129e1577324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561296b57600080fd5b505af115801561297f573d6000803e3d6000fd5b505050506040513d602081101561299557600080fd5b50516129e1576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612a3657600080fd5b505afa158015612a4a573d6000803e3d6000fd5b505050506040513d6020811015612a6057600080fd5b5051905080821115612a70578091505b8115612b59576000612710612a94600d5461271003876132ae90919063ffffffff16565b81612a9b57fe5b049050733c8caee4e09296800f8d29a68fa3837e2dae49406001600160a01b0316631a4d01d2847f0000000000000000000000000000000000000000000000000000000000000001846040518463ffffffff1660e01b81526004018084815260200183600f0b81526020018281526020019350505050602060405180830381600087803b158015612b2b57600080fd5b505af1158015612b3f573d6000803e3d6000fd5b505050506040513d6020811015612b5557600080fd5b5050505b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bc857600080fd5b505afa158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b5051905088811015612c0c579650612c2c95505050505050565b858910612c21579650612c2c95505050505050565b889750505050505050505b919050565b6000600a8360028110612c4057fe5b01546001600160a01b03169050600060088460028110612c5c57fe5b01546001600160a01b031614612c9257612c9260088460028110612c7c57fe5b01546001600160a01b0383811691166000611c1d565b8160088460028110612ca057fe5b0180546001600160a01b0319166001600160a01b03928316179055610d0f90821683600019611c1d565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b505190508015612f4957612d75613752565b81817f000000000000000000000000000000000000000000000000000000000000000160048110612da257fe5b60200201818152505060007342d7025938bec20b69cbae5a77421082407f053a6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506000612e7082612e6a670de0b6b3a7640000612e64887f00000000000000000000000000000000000000000000000000000000000000016132ae565b906132ae565b90613641565b90506000612710612e90600d5461271003846132ae90919063ffffffff16565b81612e9757fe5b60405162a6cbcd60e21b81529190049150733c8caee4e09296800f8d29a68fa3837e2dae49409063029b2f3490869084906004018083608080838360005b83811015612eed578181015183820152602001612ed5565b5050505090500182815260200192505050602060405180830381600087803b158015612f1857600080fd5b505af1158015612f2c573d6000803e3d6000fd5b505050506040513d6020811015612f4257600080fd5b5050505050505b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612f9e57600080fd5b505afa158015612fb2573d6000803e3d6000fd5b505050506040513d6020811015612fc857600080fd5b50519050801561086057604080516321d0683360e11b8152601c60048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b5051610860576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006130f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d309092919063ffffffff16565b805190915015610d0f5780806020019051602081101561311657600080fd5b5051610d0f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806137dd602a913960400191505060405180910390fd5b6060824710156131945760405162461bcd60e51b81526004018080602001828103825260268152602001806137716026913960400191505060405180910390fd5b61319d856136a8565b6131ee576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061322c5780518252601f19909201916020918201910161320d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866136ae565b979650505050505050565b6000826132bd5750600061330a565b828202828482816132ca57fe5b04146133075760405162461bcd60e51b81526004018080602001828103825260218152602001806137bc6021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613307576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061339b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133dd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061340b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134b0578181015183820152602001613498565b505050509050019650505050505050600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561351657600080fd5b810190808051604051939291908464010000000082111561353657600080fd5b90830190602082018581111561354b57600080fd5b825186602082028301116401000000008211171561356857600080fd5b82525081516020918201928201910280838360005b8381101561359557818101518382015260200161357d565b50505050905001604052505050505050505050565b600082821115613601576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136375782841061361d575080611d42565b8261362885846132ae565b8161362f57fe5b049050611d42565b5060009392505050565b6000808211613697576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816136a057fe5b049392505050565b3b151590565b606083156136bd575081611d42565b8251156136cd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137175781810151838201526020016136ff565b50505050905090810190601f1680156137445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed64736f6c63430007060033
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
45679:286:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44919:282;;;;;;;;;;;;;;;;-1:-1:-1;44919:282:0;-1:-1:-1;;;;;44919:282:0;;:::i;:::-;;36590:101;;;:::i;:::-;;;;;;;;;;;;;;;;42482:116;;;;;;;;;;;;;;;;-1:-1:-1;42482:116:0;;:::i;28903:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28903:152:0;;;;;;;;:::i;35437:135::-;;;;;;;;;;;;;;;;-1:-1:-1;35437:135:0;;:::i;42958:75::-;;;:::i;26391:218::-;;;:::i;24465:26::-;;;:::i;27858:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27858:498:0;-1:-1:-1;;;;;27858:498:0;;:::i;32102:31::-;;;;;;;;;;;;;;;;-1:-1:-1;32102:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;32102:31:0;;;;;;;;;;;;;;43953:235;;;;;;;;;;;;;;;;-1:-1:-1;43953:235:0;;;;;;;;;;;;:::i;27007:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27007:235:0;;;;;;;;;;:::i;39921:584::-;;;;;;;;;;;;;;;;-1:-1:-1;39921:584:0;;:::i;28573:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28573:139:0;;;;:::i;35625:136::-;;;;;;;;;;;;;;;;-1:-1:-1;35625:136:0;;;;:::i;33275:22::-;;;:::i;24632:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;26046:239;;;;;;;;;;;;;;;;-1:-1:-1;26046:239:0;-1:-1:-1;;;;;26046:239:0;;:::i;24178:23::-;;;:::i;24384:31::-;;;:::i;26692:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26692:189:0;-1:-1:-1;;;;;26692:189:0;;:::i;27704:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27704:146:0;;:::i;43816:129::-;;;;;;;;;;;;;;;;-1:-1:-1;43816:129:0;;;;;;;:::i;35139:154::-;;;;;;;;;;;;;;;;-1:-1:-1;35139:154:0;;;;;;-1:-1:-1;;;;;35139:154:0;;:::i;24117:27::-;;;:::i;32697:36::-;;;:::i;24297:42::-;;;;;;;;;;;;;;;;-1:-1:-1;24297:42:0;-1:-1:-1;;;;;24297:42:0;;:::i;44196:591::-;;;;;;;;;;;;;;;;-1:-1:-1;44196:591:0;-1:-1:-1;;;;;44196:591:0;;:::i;24087:23::-;;;:::i;40513:346::-;;;;;;;;;;;;;;;;-1:-1:-1;40513:346:0;;;;;;;:::i;37426:304::-;;;;;;;;;;;;;;;;-1:-1:-1;37426:304:0;;;;;;;:::i;27334:280::-;;;;;;;;;;;;;;;;-1:-1:-1;27334:280:0;-1:-1:-1;;;;;27334:280:0;;:::i;24151:20::-;;;:::i;24348:29::-;;;:::i;44919:282::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;44999:6:::1;44994:114;31998:1;45011;:15;44994:114;;;45066:7;45074:1;45066:10;;;;;;;;::::0;-1:-1:-1;;;;;45056:20:0;;::::1;45066:10:::0;::::1;45056:20;;45048:48;;;::::0;;-1:-1:-1;;;45048:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45048:48:0;;;;;;;;;;;;;::::1;;45028:3;;44994:114;;;-1:-1:-1::0;45146:5:0::1;::::0;45153:39:::1;::::0;;-1:-1:-1;;;45153:39:0;;45186:4:::1;45153:39;::::0;::::1;::::0;;;45118:75:::1;::::0;-1:-1:-1;;;;;45146:5:0;;::::1;::::0;45153:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45153:39:0;-1:-1:-1;;;;;45118:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;44919:282:::0;:::o;36590:101::-;36645:4;36669:14;:12;:14::i;:::-;36662:21;;36590:101;:::o;42482:116::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;42565:25:::1;42579:10;42565:13;:25::i;28903:152::-:0;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;28994:53:::1;-1:-1:-1::0;;;;;28994:5:0::1;:22;29017:5:::0;29032:4:::1;29039:7:::0;28994:22:::1;:53::i;:::-;28903:152:::0;;:::o;35437:135::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;33337:5:::1;35509;:17;;35501:40;;;::::0;;-1:-1:-1;;;35501:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35501:40:0;;;;;;;;;;;;;::::1;;35552:4;:12:::0;35437:135::o;42958:75::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;43018:7:::1;:5;:7::i;:::-;42958:75::o:0;26391:218::-;26459:12;;-1:-1:-1;;;;;26459:12:0;26445:10;:26;26437:54;;;;;-1:-1:-1;;;26437:54:0;;;;;;;;;;;;-1:-1:-1;;;26437:54:0;;;;;;;;;;;;;;;26502:8;:21;;-1:-1:-1;;;;;;26502:21:0;;;26513:10;26502:21;;;;;;;26534:25;;;;;;;26575:26;;;;;;;;;;;;;;;;26391:218::o;24465:26::-;;;;:::o;27858:498::-;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;27949:11:::1;::::0;-1:-1:-1;;;;;27949:11:0::1;27941:34:::0;27937:109:::1;;28018:11;::::0;27992:42:::1;::::0;-1:-1:-1;;;;;27992:5:0::1;:17:::0;::::1;::::0;28018:11:::1;;27992:17;:42::i;:::-;28126:5;-1:-1:-1::0;;;;;28080:52:0::1;28093:12;-1:-1:-1::0;;;;;28080:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28080:34:0;-1:-1:-1;;;;;28080:52:0::1;;28058:133;;;::::0;;-1:-1:-1;;;28058:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28204:11;:40:::0;;-1:-1:-1;;;;;;28204:40:0::1;-1:-1:-1::0;;;;;28204:40:0;;::::1;::::0;;;::::1;::::0;;;28255:47:::1;::::0;:5:::1;:17;28204:40:::0;-1:-1:-1;;28255:17:0::1;:47::i;:::-;28320:28;::::0;;-1:-1:-1;;;;;28320:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27858:498:::0;:::o;32102:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32102:31:0;;-1:-1:-1;32102:31:0;:::o;43953:235::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;44097:25:::1;44111:10;44097:13;:25::i;:::-;44133:7;:5;:7::i;:::-;44151:29;44159:9;44170;44151:7;:29::i;:::-;43953:235:::0;;;:::o;27007:::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27107:19:0;::::1;27099:48;;;::::0;;-1:-1:-1;;;27099:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27099:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;27158:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;27158:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27205:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;27007:235:::0;;:::o;39921:584::-;25817:11;;40032:9;;-1:-1:-1;;;;;25817:11:0;25795:10;:34;25787:60;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;;;;40077:1:::1;40067:7;:11;40059:36;;;::::0;;-1:-1:-1;;;40059:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40059:36:0;;;;;;;;;;;;;::::1;;40140:14;40157:18;40167:7;40157:9;:18::i;:::-;40200:11;::::0;:34:::1;::::0;;-1:-1:-1;;;40200:34:0;;40228:4:::1;40200:34;::::0;::::1;::::0;;;40140:35;;-1:-1:-1;40188:9:0::1;::::0;-1:-1:-1;;;;;40200: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;40200:34:0;;-1:-1:-1;40245:10:0::1;40258:14;:12;:14::i;:::-;40245:27;;40294:5;40287:4;:12;40283:64;;;40330:5;40323:4;:12;40316:19;;40283:64;40363:13:::0;;40359:87:::1;;40393:41;-1:-1:-1::0;;;;;40393:5:0::1;:18;40412:10;40424:9:::0;40393:18:::1;:41::i;:::-;40463:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25858:1;;;39921:584:::0;;;:::o;28573:139::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;28667:21:::1;:37:::0;;-1:-1:-1;;28667:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28573:139::o;35625:136::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;35715:17:::1;:38:::0;;-1:-1:-1;;35715:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35625:136::o;33275:22::-;;;;:::o;24632:40::-;;;;;;:::o;26046:239::-;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;26203:12:::1;:28:::0;;-1:-1:-1;;;;;26203:28:0;::::1;-1:-1:-1::0;;;;;;26203:28:0;;::::1;::::0;::::1;::::0;;;26247:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26046:239:::0;:::o;24178:23::-;;;-1:-1:-1;;;;;24178:23:0;;:::o;24384:31::-;;;-1:-1:-1;;;;;24384:31:0;;:::o;26692:189::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26774:20:0;::::1;26766:50;;;::::0;;-1:-1:-1;;;26766:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26766:50:0;;;;;;;;;;;;;::::1;;26827:5;:14:::0;;-1:-1:-1;;;;;26827:14:0;::::1;-1:-1:-1::0;;;;;;26827:14:0;;::::1;::::0;::::1;::::0;;;26857:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26692:189:::0;:::o;27704:146::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;24535:4:::1;27783;:20;;27775:42;;;::::0;;-1:-1:-1;;;27775:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27775:42:0;;;;;;;;;;;;;::::1;;27828:7;:14:::0;27704:146::o;43816:129::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;43908:29:::1;43916:9;43927;43908:7;:29::i;35139:154::-:0;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35219:18:0;::::1;35211:46;;;::::0;;-1:-1:-1;;;35211:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35211:46:0;;;;;;;;;;;;;::::1;;35268:17;35276:2;35280:4;35268:7;:17::i;24117:27::-:0;;;-1:-1:-1;;;;;24117:27:0;;:::o;32697:36::-;;;;;;:::o;24297:42::-;;;;;;;;;;;;;;;:::o;44196:591::-;25817:11;;-1:-1:-1;;;;;25817:11:0;25795:10;:34;25787:60;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;;;;44277:14:::1;44303:9;44277:36;;44366:5;-1:-1:-1::0;;;;;44332:40:0::1;44340:5;-1:-1:-1::0;;;;;44340:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44340:13:0;-1:-1:-1;;;;;44332:40:0::1;;44324:76;;;::::0;;-1:-1:-1;;;44324:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;44473:11;::::0;44441:19:::1;::::0;;-1:-1:-1;;;44441:19:0;;;;-1:-1:-1;;;;;44473:11:0;;::::1;::::0;44441: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;44441:19:0;-1:-1:-1;;;;;44433:52:0::1;;44411:139;;;;-1:-1:-1::0;;;44411:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44567:21;::::0;::::1;;44563:70;;;44605:16;44619:1;44605:13;:16::i;:::-;44645:8;44656:25;-1:-1:-1::0;;44656:9:0::1;:25::i;:::-;44645:36:::0;-1:-1:-1;44692:33:0::1;-1:-1:-1::0;;;;;44692:5:0::1;:17;44710:9:::0;44645:36;44692:17:::1;:33::i;:::-;44736:43;::::0;;-1:-1:-1;;;44736:43:0;;44768:4:::1;44736:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;44736:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;44736:43:0;;;;;;;-1:-1:-1;44736:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25858:1;;44196:591:::0;:::o;24087:23::-;;;-1:-1:-1;;;;;24087:23:0;;:::o;40513:346::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;40615:1:::1;40605:7;:11;40597:33;;;::::0;;-1:-1:-1;;;40597:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40597:33:0;;;;;;;;;;;;;::::1;;40673:14;40690:18;40700:7;40690:9;:18::i;:::-;40733:11;::::0;:28:::1;::::0;;-1:-1:-1;;;40733:28:0;;::::1;::::0;::::1;::::0;;;;;40673:35;;-1:-1:-1;40719:11:0::1;::::0;-1:-1:-1;;;;;40733:11:0;;::::1;::::0;:17:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;40719:11;40733;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40733:28:0;;-1:-1:-1;40780:14:0;;::::1;;40772:39;;;::::0;;-1:-1:-1;;;40772:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40772:39:0;;;;;;;;;;;;;::::1;;40829:22;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25732:1;;40513:346:::0;;:::o;37426:304::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;37530:1:::1;37520:7;:11;37512:35;;;::::0;;-1:-1:-1;;;37512:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37512:35:0;;;;;;;;;;;;;::::1;;37576:11;::::0;:27:::1;::::0;;-1:-1:-1;;;37576:27:0;;::::1;::::0;::::1;::::0;;;;;37560:13:::1;::::0;-1:-1:-1;;;;;37576:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;37560:13;37576:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37576:27:0;;-1:-1:-1;37622:16:0;;::::1;;37614:43;;;::::0;;-1:-1:-1;;;37614:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37614:43:0;;;;;;;;;;;;;::::1;;37670:10;:8;:10::i;:::-;37696:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25732:1;37426:304:::0;;:::o;27334:280::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27489:23:0;::::1;27481:56;;;::::0;;-1:-1:-1;;;27481:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27481:56:0;;;;;;;;;;;;;::::1;;27548:8;:20:::0;;-1:-1:-1;;;;;27548:20:0;::::1;-1:-1:-1::0;;;;;;27548:20:0;;::::1;::::0;::::1;::::0;;;27584:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27334:280:::0;:::o;24151:20::-;;;-1:-1:-1;;;;;24151:20:0;;:::o;24348:29::-;;;:::o;13634:704::-;14049:10;;;14048:62;;-1:-1:-1;14065:39:0;;;-1:-1:-1;;;14065:39:0;;14089:4;14065:39;;;;-1:-1:-1;;;;;14065:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14065:39:0;:44;14048:62;14026:166;;;;-1:-1:-1;;;14026:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14257:62;;;-1:-1:-1;;;;;14257:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14257:62:0;-1:-1:-1;;;14257:62:0;;;14203:127;;14237:5;;14203:19;:127::i;3711:229::-;3848:12;3880:52;3902:6;3910:4;3916:1;3919:12;3880:21;:52::i;:::-;3873:59;;3711:229;;;;;;:::o;12830:245::-;12998:58;;;-1:-1:-1;;;;;12998:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12998:58:0;-1:-1:-1;;;12998:58:0;;;12944:123;;12978:5;;12944:19;:123::i;35769:813::-;36198:31;;;-1:-1:-1;;;36198:31:0;;36223:4;36198:31;;;;;;35815:10;;;;32647:42;;36198:16;;:31;;;;;;;;;;;;;;32647:42;36198:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36198:31:0;36466:30;;;-1:-1:-1;;;36466:30:0;;;;36198:31;;-1:-1:-1;36507:4:0;36501:3;:10;;36456:41;;33027:42;;36466:28;;:30;;;;;36198:31;;36466:30;;;;;;;;33027:42;36466:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36466:30:0;36456:5;;:9;:41::i;:::-;:56;;;;;;36448:64;;36533:41;36543:5;-1:-1:-1;;;;;36543:15:0;;36567:4;36543:30;;;;;;;;;;;;;-1:-1:-1;;;;;36543:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36543:30:0;36533:5;;:9;:41::i;:::-;36525:49;;35769:813;;:::o;41471:1003::-;41610:9;41622:5;-1:-1:-1;;;;;41622:15:0;;41646:4;41622:30;;;;;;;;;;;;;-1:-1:-1;;;;;41622:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41622:30:0;41719:17;;41687:50;;;-1:-1:-1;;;41687:50:0;;41712:4;41687:50;;;;41719:17;;;;41687:50;;;;;;;41622:30;;-1:-1:-1;32647:42:0;;41687:16;;:50;;;;;41622:30;;41687:50;;;;;;;;41719:17;32647:42;41687:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41687:50:0;41665:117;;;;;-1:-1:-1;;;41665:117:0;;;;;;;;;;;;-1:-1:-1;;;41665:117:0;;;;;;;;;;;;;;;41800:6;41795:246;31998:1;41812;:15;41795:246;;;41849:14;41873:7;41881:1;41873:10;;;;;;;;;41866:43;;;-1:-1:-1;;;41866:43:0;;41903:4;41866:43;;;;;;-1:-1:-1;;;;;41873:10:0;;;;41866:28;;:43;;;;;;;;;;;;;;;41873:10;41866:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41866:43:0;;-1:-1:-1;41928:13:0;;41924:106;;41962:52;41968:3;41972:1;41968:6;;;;;;;;;-1:-1:-1;;;;;41968:6:0;41976:7;41984:1;41976:10;;;;;;;;;-1:-1:-1;;;;;41976:10:0;41996:5;42004:9;41962:5;:52::i;:::-;-1:-1:-1;41829:3:0;;41795:246;;;;42093:4;42060:5;-1:-1:-1;;;;;42060:15:0;;42084:4;42060:30;;;;;;;;;;;;;-1:-1:-1;;;;;42060:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42060:30:0;:37;;-1:-1:-1;42116:18:0;;;;42108:43;;;;;-1:-1:-1;;;42108:43:0;;;;;;;;;;;;-1:-1:-1;;;42108:43:0;;;;;;;;;;;;;;;42217:8;;42213:218;;42242:8;24618:5;42253:17;42262:7;;42253:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;42304:7:0;;42300:120;;42351:8;;42332:33;;-1:-1:-1;;;;;42332:5:0;:18;;;42351:8;42361:3;42332:18;:33::i;:::-;42391:13;:4;42400:3;42391:8;:13::i;:::-;42384:20;;42300:120;42213:218;;42448:18;;;;;;;;;;;;;;;;;41471:1003;;:::o;13083:282::-;13278:68;;;-1:-1:-1;;;;;13278:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13278:68:0;-1:-1:-1;;;13278:68:0;;;13224:133;;13258:5;;13224:19;:133::i;:::-;13083:282;;;;:::o;42606:344::-;42642:10;42655:14;:12;:14::i;:::-;42692:11;;:34;;;-1:-1:-1;;;42692:34:0;;42720:4;42692:34;;;;;;42642:27;;-1:-1:-1;42680:9:0;;-1:-1:-1;;;;;42692:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42692:34:0;;-1:-1:-1;42745:12:0;;;42737:38;;;;;-1:-1:-1;;;42737:38:0;;;;;;;;;;;;-1:-1:-1;;;42737:38:0;;;;;;;;;;;;;;;42802:12;;;42882:17;42802:12;42882:9;:17::i;:::-;42917:25;;;;;;;;;;;;;;;;;;;;42873:26;;-1:-1:-1;42917:25:0;;;;;;;;;;42606:344;;;:::o;43041:767::-;43109:10;43122:14;:12;:14::i;:::-;43109:27;;43164:9;43155:5;:18;;43147:42;;;;;-1:-1:-1;;;43147:42:0;;;;;;;;;;;;-1:-1:-1;;;43147:42:0;;;;;;;;;;;;;;;43217:9;43208:5;:18;;43200:42;;;;;-1:-1:-1;;;43200:42:0;;;;;;;;;;;;-1:-1:-1;;;43200:42:0;;;;;;;;;;;;;;;43359:11;;:34;;;-1:-1:-1;;;43359:34:0;;43387:4;43359:34;;;;;;43255:9;;;;;;;;-1:-1:-1;;;;;43359:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43359:34:0;;-1:-1:-1;43408:12:0;;;43404:247;;;43480:30;;;-1:-1:-1;;;43480:30:0;;43504:4;43480:30;;;;;;43444:12;;;;-1:-1:-1;;;;;;43480:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43480:30:0;;-1:-1:-1;43529:11:0;;;43525:63;;;43568:4;43561:11;;43525:63;43404:247;;;43634:5;43627:4;:12;43620:19;;43404:247;43674:1;43667:4;:8;:20;;;;43686:1;43679:4;:8;43667:20;43663:83;;;43704:11;;:30;;;-1:-1:-1;;;43704:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43704:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43663:83;43763:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43041:767;;;;;;;:::o;38491:1422::-;38541:4;38558:8;38569:5;-1:-1:-1;;;;;38569:15:0;;38593:4;38569:30;;;;;;;;;;;;;-1:-1:-1;;;;;38569:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38569:30:0;;-1:-1:-1;38614:14:0;;;38610:61;;38652:7;38645:14;;;;;38610:61;38683:10;38696:14;:12;:14::i;:::-;38683:27;;38738:5;38727:7;:16;38723:64;;38770:5;38760:15;;38723:64;38854:31;;;-1:-1:-1;;;38854:31:0;;38879:4;38854:31;;;;;;38811:13;;;;38799:9;;32647:42;;38854:16;;:31;;;;;;;;;;;;;;32647:42;38854:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38854:31:0;;-1:-1:-1;38938:11:0;38952:53;38974:4;38980:11;;;38854:31;38952:21;:53::i;:::-;38938:67;-1:-1:-1;39055:10:0;;39051:150;;32647:42;-1:-1:-1;;;;;39123:24:0;;39148:6;39156:5;39123:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39123:39:0;39115:74;;;;;-1:-1:-1;;;39115:74:0;;;;;;;;;;;;-1:-1:-1;;;39115:74:0;;;;;;;;;;;;;;;39258:33;;;-1:-1:-1;;;39258:33:0;;39285:4;39258:33;;;;;;39245:10;;33174:42;;39258:18;;:33;;;;;;;;;;;;;;;33174:42;39258:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39258:33:0;;-1:-1:-1;39306:14:0;;;39302:61;;;39346:5;39337:14;;39302:61;39379:10;;39375:162;;39406:8;33337:5;39417:25;39437:4;;33337:5;39426:15;39417:4;:8;;:25;;;;:::i;:::-;:36;;;;;;39406:47;;32857:42;-1:-1:-1;;;;;39468:29:0;;39498:6;39513:5;39521:3;39468:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39375:162:0;39549:13;39565:5;-1:-1:-1;;;;;39565:15:0;;39589:4;39565:30;;;;;;;;;;;;;-1:-1:-1;;;;;39565:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39565:30:0;;-1:-1:-1;39610:18:0;;;39606:66;;;39652:8;-1:-1:-1;39645:15:0;;-1:-1:-1;;;;;;39645:15:0;39606:66;39795:5;39784:7;:16;39780:64;;39824:8;-1:-1:-1;39817:15:0;;-1:-1:-1;;;;;;39817:15:0;39780:64;39898:7;39891:14;;;;;;;;;38491:1422;;;;:::o;34791:340::-;34850:13;34873:7;34881:2;34873:11;;;;;;;;;-1:-1:-1;;;;;34873:11:0;;-1:-1:-1;34873:11:0;34936:3;34940:2;34936:7;;;;;;;;;-1:-1:-1;;;;;34936:7:0;:21;34932:84;;34974:30;34993:3;34997:2;34993:7;;;;;;;;;-1:-1:-1;;;;;34974:18:0;;;;34993:7;;34974:18;:30::i;:::-;35038:4;35028:3;35032:2;35028:7;;;;;;;;:14;;-1:-1:-1;;;;;;35028:14:0;-1:-1:-1;;;;;35028:14:0;;;;;;35083:40;;:18;;35102:4;-1:-1:-1;;35083:18:0;:40::i;36699:719::-;36738:8;36749:5;-1:-1:-1;;;;;36749:15:0;;36773:4;36749:30;;;;;;;;;;;;;-1:-1:-1;;;;;36749:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36749:30:0;;-1:-1:-1;36794:7:0;;36790:450;;36818:22;;:::i;:::-;36872:3;36855:7;36863:5;36855:14;;;;;;;;;;:20;;;;;36995:18;33027:42;-1:-1:-1;;;;;37016:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37016:30:0;;-1:-1:-1;37061:11:0;37075:41;37016:30;37075:22;37092:4;37075:12;:3;37083;37075:7;:12::i;:::-;:16;;:22::i;:::-;:26;;:41::i;:::-;37061:55;;37131:8;33337:5;37142:27;37164:4;;33337:5;37153:15;37142:6;:10;;:27;;;;:::i;:::-;:38;;;;;37197:31;;-1:-1:-1;;;37197:31:0;;37142:38;;;;-1:-1:-1;32857:42:0;;37197:17;;37215:7;;37142:38;;37197:31;;;37215:7;37197:31;;;37215:7;37197:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36790:450:0;37265:33;;;-1:-1:-1;;;37265:33:0;;37292:4;37265:33;;;;;;37252:10;;33174:42;;37265:18;;:33;;;;;;;;;;;;;;;33174:42;37265:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37265:33:0;;-1:-1:-1;37313:9:0;;37309:102;;37347:33;;;-1:-1:-1;;;37347:33:0;;32573:2;37347:33;;;;;;;;;;37375:4;37347:33;;;;;;32479:42;;37347:15;;:33;;;;;;;;;;;;;;-1:-1:-1;32479:42:0;37347:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37347:33:0;37339:60;;;;;-1:-1:-1;;;37339:60:0;;;;;;;;;;;;-1:-1:-1;;;37339:60:0;;;;;;;;;;;;;;15529:860;15953:23;15979:106;16021:4;15979:106;;;;;;;;;;;;;;;;;15987:5;-1:-1:-1;;;;;15979:27:0;;;:106;;;;;:::i;:::-;16100:17;;15953:132;;-1:-1:-1;16100:21:0;16096:286;;16273:10;16262:30;;;;;;;;;;;;;;;-1:-1:-1;16262:30:0;16236:134;;;;-1:-1:-1;;;16236:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4924:605;5091:12;5163:5;5138:21;:30;;5116:118;;;;-1:-1:-1;;;5116:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5253:18;5264:6;5253:10;:18::i;:::-;5245:60;;;;;-1:-1:-1;;;5245:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5379:12;5393:23;5420:6;-1:-1:-1;;;;;5420:11:0;5439:5;5446:4;5420:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5420:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5378:73;;;;5469:52;5487:7;5496:10;5508:12;5469:17;:52::i;:::-;5462:59;4924:605;-1:-1:-1;;;;;;;4924:605:0:o;19330:208::-;19382:4;19403:6;19399:20;;-1:-1:-1;19418:1:0;19411:8;;19399:20;19439:5;;;19443:1;19439;:5;:1;19463:5;;;;;:10;19455:56;;;;-1:-1:-1;;;19455:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:1;-1:-1:-1;19330:208:0;;;;;:::o;18472:167::-;18524:4;18550:5;;;18574:6;;;;18566:46;;;;;-1:-1:-1;;;18566:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40955:508;41170:16;;;41184:1;41170:16;;;;;;;;;41146:21;;41170:16;;;;;;;;;;-1:-1:-1;41170:16:0;41146:40;;41207:8;41197:4;41202:1;41197:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;41197:18:0;;;-1:-1:-1;;;;;41197:18:0;;;;;31913:42;41226:4;41231:1;41226:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;41226:14:0;;;-1:-1:-1;;;;;41226:14:0;;;;;41261:9;41251:4;41256:1;41251:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;41251:19:0;;;-1:-1:-1;;;;;41251:19:0;;;;;41299:4;-1:-1:-1;;;;;41283:46:0;;41344:7;41366:1;41382:4;41409;41429:15;41283:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40955:508;;;;;:::o;18922:149::-;18974:4;19004:1;18999;:6;;18991:49;;;;;-1:-1:-1;;;18991:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19058:5:0;;;18922:149::o;37738:745::-;37871:4;38211:10;;38207:250;;38328:6;38317:7;:17;38313:77;;-1:-1:-1;38362:12:0;38355:19;;38313:77;38439:6;38411:25;:7;38423:12;38411:11;:25::i;:::-;:34;;;;;;38404:41;;;;38207:250;-1:-1:-1;38474:1:0;37738:745;;;;;:::o;20016:144::-;20068:4;20097:1;20093;:5;20085:44;;;;;-1:-1:-1;;;20085:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20151:1;20147;:5;;;;;;;20016:144;-1:-1:-1;;;20016:144:0:o;754:441::-;1131:20;1179:8;;;754:441::o;7754:777::-;7904:12;7933:7;7929:595;;;-1:-1:-1;7964:10:0;7957:17;;7929:595;8078:17;;:21;8074:439;;8341:10;8335:17;8402:15;8389:10;8385:2;8381:19;8374:44;8289:148;8484:12;8477:20;;-1:-1:-1;;;8477:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed
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.