Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 501 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repay | 16965120 | 642 days ago | IN | 0 ETH | 0.02057101 | ||||
Harvest | 16965004 | 642 days ago | IN | 0 ETH | 0.02683118 | ||||
Repay | 16943697 | 645 days ago | IN | 0 ETH | 0.0242599 | ||||
Harvest | 16943665 | 645 days ago | IN | 0 ETH | 0.03368127 | ||||
Deposit | 16925121 | 647 days ago | IN | 0 ETH | 0.02503408 | ||||
Repay | 16922394 | 648 days ago | IN | 0 ETH | 0.02565908 | ||||
Harvest | 16922361 | 648 days ago | IN | 0 ETH | 0.03062655 | ||||
Deposit | 16901390 | 651 days ago | IN | 0 ETH | 0.01455421 | ||||
Repay | 16901006 | 651 days ago | IN | 0 ETH | 0.01094115 | ||||
Harvest | 16900974 | 651 days ago | IN | 0 ETH | 0.02535144 | ||||
Repay | 16879702 | 654 days ago | IN | 0 ETH | 0.01303922 | ||||
Harvest | 16879650 | 654 days ago | IN | 0 ETH | 0.01973861 | ||||
Deposit | 16858428 | 657 days ago | IN | 0 ETH | 0.01607046 | ||||
Harvest | 16858378 | 657 days ago | IN | 0 ETH | 0.02041577 | ||||
Repay | 16836968 | 660 days ago | IN | 0 ETH | 0.02014753 | ||||
Harvest | 16836930 | 660 days ago | IN | 0 ETH | 0.0293298 | ||||
Deposit | 16815709 | 663 days ago | IN | 0 ETH | 0.02999895 | ||||
Harvest | 16815653 | 663 days ago | IN | 0 ETH | 0.04335837 | ||||
Repay | 16794275 | 666 days ago | IN | 0 ETH | 0.02672399 | ||||
Harvest | 16794242 | 666 days ago | IN | 0 ETH | 0.04136804 | ||||
Deposit | 16778096 | 668 days ago | IN | 0 ETH | 0.04768453 | ||||
Harvest | 16772949 | 669 days ago | IN | 0 ETH | 0.04705401 | ||||
Deposit | 16751630 | 672 days ago | IN | 0 ETH | 0.02203416 | ||||
Harvest | 16751569 | 672 days ago | IN | 0 ETH | 0.03547594 | ||||
Deposit | 16749669 | 672 days ago | IN | 0 ETH | 0.03105664 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17143401 | 617 days ago | 198.38794158 ETH | ||||
17143401 | 617 days ago | 198.38794158 ETH | ||||
17136345 | 618 days ago | 0.90204257 ETH | ||||
17136345 | 618 days ago | 0.59371484 ETH | ||||
17136345 | 618 days ago | 0.03425863 ETH | ||||
17136345 | 618 days ago | 0.34203829 ETH | ||||
17136345 | 618 days ago | 0.00005609 ETH | ||||
17136345 | 618 days ago | 0.00049197 ETH | ||||
17099634 | 623 days ago | 317.78954655 ETH | ||||
17099634 | 623 days ago | 317.78954655 ETH | ||||
17084769 | 625 days ago | 6.00194291 ETH | ||||
17084769 | 625 days ago | 6.00194291 ETH | ||||
17058456 | 628 days ago | 153.81788968 ETH | ||||
17058456 | 628 days ago | 153.81788968 ETH | ||||
17045804 | 630 days ago | 3.01502361 ETH | ||||
17045804 | 630 days ago | 3.01502361 ETH | ||||
17045128 | 630 days ago | 0.23024344 ETH | ||||
17045128 | 630 days ago | 0.23024344 ETH | ||||
17044767 | 630 days ago | 8.99714798 ETH | ||||
17044767 | 630 days ago | 8.99714798 ETH | ||||
17044754 | 630 days ago | 1.50390586 ETH | ||||
17044754 | 630 days ago | 1.50390586 ETH | ||||
17044671 | 630 days ago | 4.02373294 ETH | ||||
17044671 | 630 days ago | 4.02373294 ETH | ||||
17043160 | 631 days ago | 9.344614 ETH |
Loading...
Loading
Contract Name:
StrategyConvexStEth
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-11 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.6; library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface 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 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 IEthFundManager { function token() external view returns (address); function borrow(uint amount) external returns (uint); function repay(uint amount) external payable returns (uint); function report(uint gain, uint loss) external payable; 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 StableSwapStEth { function get_virtual_price() external view returns (uint); /* 0 ETH 1 STETH */ function balances(uint _index) external view returns (uint); function add_liquidity(uint[2] memory amounts, uint min) external payable; function remove_liquidity_one_coin( uint _token_amount, int128 i, uint min_amount ) external; } abstract contract StrategyEth { 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 ReceiveEth(address indexed sender, uint amount); 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; address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public constant token = ETH; IEthFundManager 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 _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( IEthFundManager(_fundManager).token() == ETH, "fund manager token != ETH" ); fundManager = IEthFundManager(_fundManager); } receive() external payable { emit ReceiveEth(msg.sender, msg.value); } function _sendEth(address _to, uint _amount) internal { require(_to != address(0), "to = 0 address"); (bool sent, ) = _to.call{value: _amount}(""); require(sent, "Send ETH failed"); } 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 { require( IEthFundManager(_fundManager).token() == ETH, "new fund manager token != ETH" ); fundManager = IEthFundManager(_fundManager); 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 Returns approximate amount of ETH 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 ETH to deposit from fund manager @param _min Minimum amount borrowed */ function deposit(uint _amount, uint _min) external virtual; /* @notice Withdraw ETH 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 ETH 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 ETH @param _minProfit Minumum amount of ETH 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 ETH 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 payable _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; } 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 StrategyConvexStEth is StrategyEth { 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 = 3; // address of DEX (uniswap or sushiswap) to use for selling reward tokens // CRV, CVX, LDO address[NUM_REWARDS] public dex; address private constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52; address private constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; address private constant LDO = 0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32; // Solc 0.7 cannot create constant arrays address[NUM_REWARDS] private REWARDS = [CRV, CVX, LDO]; // Convex // Booster private constant BOOSTER = Booster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); // pool id uint private constant PID = 25; BaseRewardPool private constant REWARD = BaseRewardPool(0x0A760466E1B4621579a82a39CB56Dda2F4E70f03); bool public shouldClaimExtras = true; // Curve // // StableSwap StETH StableSwapStEth private constant CURVE_POOL = StableSwapStEth(0xDC24316b9AE028F1497c275EB9192a3Ea0f67022); // LP token for curve pool (ETH / stETH) IERC20 private constant CURVE_LP = IERC20(0x06325440D014e39736583c165C2963BA99fAf14E); // prevent slippage from deposit / withdraw uint public slip = 100; uint private constant SLIP_MAX = 10000; /* 0 - ETH 1 - stETH */ uint private constant INDEX = 0; // index of token constructor(address _fundManager, address _treasury) StrategyEth(_fundManager, _treasury) { (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"); // deposit into BOOSTER CURVE_LP.safeApprove(address(BOOSTER), type(uint).max); _setDex(0, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CRV - sushiswap _setDex(1, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CVX - sushiswap _setDex(2, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // LDO - 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 curve pool p0 = price per share of curve pool a = amount of ETH a = s0 * p0 */ // amount of Curve LP tokens in Convex uint lpBal = REWARD.balanceOf(address(this)); // amount of ETH converted from Curve LP total = lpBal.mul(CURVE_POOL.get_virtual_price()) / 1e18; total = total.add(address(this).balance); } function totalAssets() external view override returns (uint) { return _totalAssets(); } function _deposit() private { uint bal = address(this).balance; if (bal > 0) { uint[2] memory amounts; amounts[INDEX] = bal; /* shares = ETH amount * 1e18 / price per share */ uint pricePerShare = CURVE_POOL.get_virtual_price(); uint shares = bal.mul(1e18).div(pricePerShare); uint min = shares.mul(SLIP_MAX - slip) / SLIP_MAX; CURVE_POOL.add_liquidity{value: bal}(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 ETH to withdraw T = total amount of ETH 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 = address(this).balance; 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; CURVE_POOL.remove_liquidity_one_coin(shares, int128(INDEX), min); } uint balAfter = address(this).balance; 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) { _sendEth(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{value: available}(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, uint _amount ) private { // create dynamic array with 2 elements address[] memory path = new address[](2); path[0] = _tokenIn; path[1] = WETH; UniswapV2Router(_dex).swapExactTokensForETH( _amount, 1, path, address(this), block.timestamp ); } function _claimRewards(uint _minProfit) private { // calculate profit = balance of ETH after - balance of ETH before uint diff = address(this).balance; 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], rewardBal); } } diff = address(this).balance - 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) { _sendEth(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 ETH uint debt = fundManager.getDebt(address(this)); if (total > debt) { gain = total - debt; free = address(this).balance; if (gain > free) { gain = free; } } else { loss = debt - total; } if (gain > 0 || loss > 0) { fundManager.report{value: gain}(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 payable _strategy) external override onlyFundManager { StrategyEth strat = StrategyEth(_strategy); require(address(strat.token()) == ETH, "strategy token != ETH"); require( address(strat.fundManager()) == address(fundManager), "strategy fund manager != fund manager" ); if (claimRewardsOnMigrate) { _claimRewards(1); } uint bal = _withdraw(type(uint).max); // WARNING: may lose all ETH if sent to wrong address _sendEth(address(strat), 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))); } }
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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceiveEth","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 IEthFundManager","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 payable","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":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6103e86006556007805460ff1916600117905560e060405273d533a949740bb3306d119cc777fa900ba034cd526080908152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b60a052735a98fcbea516cf06857215779fd812ca3bef1b3260c0526200007190600b90600362000943565b50600e805460ff191660011790556064600f553480156200009157600080fd5b5060405162003d6438038062003d6483398181016040526040811015620000b757600080fd5b50805160209091015181816001600160a01b0381166200011e576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b8152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9285169163fc0c546a916004808301926020929190829003018186803b158015620001a657600080fd5b505afa158015620001bb573d6000803e3d6000fd5b505050506040513d6020811015620001d257600080fd5b50516001600160a01b03161462000230576040805162461bcd60e51b815260206004820152601960248201527f66756e64206d616e6167657220746f6b656e20213d2045544800000000000000604482015290519081900360640190fd5b50600580546001600160a01b0319166001600160a01b039290921691909117905560408051631526fe2760e01b8152601960048201529051600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe279160248083019260c0929190829003018186803b158015620002a957600080fd5b505afa158015620002be573d6000803e3d6000fd5b505050506040513d60c0811015620002d557600080fd5b50805160609091015190925090507306325440d014e39736583c165c2963ba99faf14e6001600160a01b0383161462000355576040805162461bcd60e51b815260206004820152601d60248201527f637572766520706f6f6c206c7020213d20706f6f6c20696e666f206c70000000604482015290519081900360640190fd5b730a760466e1b4621579a82a39cb56dda2f4e70f036001600160a01b03821614620003c7576040805162461bcd60e51b815260206004820152601a60248201527f72657761726420213d20706f6f6c20696e666f20726577617264000000000000604482015290519081900360640190fd5b6200040a7306325440d014e39736583c165c2963ba99faf14e73f403c135812408bfbe8713b5a23a04b3d48aae3160001962000477602090811b62001bad17901c565b6200042b600073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6200059b565b6200044c600173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6200059b565b6200046d600273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6200059b565b50505050620009b7565b80158062000501575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620004d157600080fd5b505afa158015620004e6573d6000803e3d6000fd5b505050506040513d6020811015620004fd57600080fd5b5051155b6200053e5760405162461bcd60e51b815260040180806020018281038252603681526020018062003d2e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620005969185916200065516565b505050565b6000600b8360038110620005ab57fe5b01546001600160a01b03169050600060088460038110620005c857fe5b01546001600160a01b0316146200060e576200060e60088460038110620005eb57fe5b01546001600160a01b038381169116600062000477602090811b62001bad17901c565b81600884600381106200061d57fe5b0180546001600160a01b0319166001600160a01b03928316179055620005969082168360001962000477602090811b62001bad17901c565b6000620006b1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200071160201b62001cc0179092919060201c565b8051909150156200059657808060200190516020811015620006d257600080fd5b5051620005965760405162461bcd60e51b815260040180806020018281038252602a81526020018062003d04602a913960400191505060405180910390fd5b60606200072284846000856200072c565b90505b9392505050565b6060824710156200076f5760405162461bcd60e51b815260040180806020018281038252602681526020018062003cde6026913960400191505060405180910390fd5b6200077a8562000893565b620007cc576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106200080c5780518252601f199092019160209182019101620007eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000870576040519150601f19603f3d011682016040523d82523d6000602084013e62000875565b606091505b5090925090506200088882828662000899565b979650505050505050565b3b151590565b60608315620008aa57508162000725565b825115620008bb5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000907578181015183820152602001620008ed565b50505050905090810190601f168015620009355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b82600381019282156200098e579160200282015b828111156200098e57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000957565b506200099c929150620009a0565b5090565b5b808211156200099c5760008155600101620009a1565b61331780620009c76000396000f3fe6080604052600436106101f25760003560e01c806347a02a441161010d578063b157eacf116100a0578063d8aed1451161006f578063d8aed14514610695578063e2bbb158146106c5578063f0f44260146106f5578063f851a44014610728578063fc0c546a1461073d5761022f565b8063b157eacf14610605578063b91816111461061a578063ce5494bb1461064d578063d085835a146106805761022f565b80637372bb41116100dc5780637372bb411461055d578063753c0985146105875780638a36bef7146105b7578063b127df87146105f05761022f565b806347a02a44146104cd57806361d027b3146105005780636209ec2d14610515578063704b6c021461052a5761022f565b806324d16c1a116101855780633739795c116101545780633739795c1461043757806338c2eae514610463578063392c731f1461048f57806342d14c83146104a45761022f565b806324d16c1a14610356578063284fa3441461039c5780632d1fb389146103d25780632e1a7d4d1461040d5761022f565b80631dd19cb4116101c15780631dd19cb4146102e45780631e39831e146102f957806322b2ba731461030e578063232a3060146103235761022f565b806301681a621461023457806301e1d114146102695780630962ef791461029057806313b857b4146102ba5761022f565b3661022f5760408051348152905133917fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc60919081900360200190a2005b600080fd5b34801561024057600080fd5b506102676004803603602081101561025757600080fd5b50356001600160a01b0316610752565b005b34801561027557600080fd5b5061027e6108d1565b60408051918252519081900360200190f35b34801561029c57600080fd5b50610267600480360360208110156102b357600080fd5b50356108e0565b3480156102c657600080fd5b50610267600480360360208110156102dd57600080fd5b503561095f565b3480156102f057600080fd5b50610267610a1e565b34801561030557600080fd5b50610267610a9e565b34801561031a57600080fd5b5061027e610b43565b34801561032f57600080fd5b506102676004803603602081101561034657600080fd5b50356001600160a01b0316610b49565b34801561036257600080fd5b506103806004803603602081101561037957600080fd5b5035610cc7565b604080516001600160a01b039092168252519081900360200190f35b3480156103a857600080fd5b50610267600480360360608110156103bf57600080fd5b5080359060208101359060400135610ce7565b3480156103de57600080fd5b50610267600480360360408110156103f557600080fd5b506001600160a01b0381351690602001351515610d7d565b34801561041957600080fd5b5061027e6004803603602081101561043057600080fd5b5035610e8b565b34801561044357600080fd5b506102676004803603602081101561045a57600080fd5b5035151561101d565b34801561046f57600080fd5b506102676004803603602081101561048657600080fd5b5035151561108c565b34801561049b57600080fd5b5061027e611115565b3480156104b057600080fd5b506104b961111b565b604080519115158252519081900360200190f35b3480156104d957600080fd5b50610267600480360360208110156104f057600080fd5b50356001600160a01b0316611124565b34801561050c57600080fd5b506103806111c4565b34801561052157600080fd5b506103806111d3565b34801561053657600080fd5b506102676004803603602081101561054d57600080fd5b50356001600160a01b03166111e2565b34801561056957600080fd5b506102676004803603602081101561058057600080fd5b50356112e1565b34801561059357600080fd5b50610267600480360360408110156105aa57600080fd5b5080359060200135611385565b3480156105c357600080fd5b50610267600480360360408110156105da57600080fd5b50803590602001356001600160a01b0316611409565b3480156105fc57600080fd5b506103806114ac565b34801561061157600080fd5b506104b96114bb565b34801561062657600080fd5b506104b96004803603602081101561063d57600080fd5b50356001600160a01b03166114c4565b34801561065957600080fd5b506102676004803603602081101561067057600080fd5b50356001600160a01b03166114d9565b34801561068c57600080fd5b506103806116e9565b3480156106a157600080fd5b50610267600480360360408110156106b857600080fd5b50803590602001356116f8565b3480156106d157600080fd5b50610267600480360360408110156106e857600080fd5b50803590602001356118c2565b34801561070157600080fd5b506102676004803603602081101561071857600080fd5b50356001600160a01b0316611a84565b34801561073457600080fd5b50610380611b86565b34801561074957600080fd5b50610380611b95565b6000546001600160a01b031633148061077557506002546001600160a01b031633145b8061078f57503360009081526004602052604090205460ff165b6107c8576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600381101561083d57600b81600381106107e157fe5b01546001600160a01b0383811691161415610835576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001016107cb565b50600254604080516370a0823160e01b815230600482015290516108ce926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561089157600080fd5b505afa1580156108a5573d6000803e3d6000fd5b505050506040513d60208110156108bb57600080fd5b50516001600160a01b0384169190611cd9565b50565b60006108db611d2b565b905090565b6000546001600160a01b031633148061090357506002546001600160a01b031633145b8061091d57503360009081526004602052604090205460ff165b610956576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108ce81611e57565b6000546001600160a01b031633148061098257506002546001600160a01b031633145b8061099c57503360009081526004602052604090205460ff165b6109d5576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610a19576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331480610a4157506002546001600160a01b031633145b80610a5b57503360009081526004602052604090205460ff165b610a94576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a9c6120da565b565b6001546001600160a01b03163314610aef576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b95576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bec57600080fd5b505afa158015610c00573d6000803e3d6000fd5b505050506040513d6020811015610c1657600080fd5b50516001600160a01b031614610c73576040805162461bcd60e51b815260206004820152601d60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000604482015290519081900360640190fd5b600580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610cd757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d0a57506002546001600160a01b031633145b80610d2457503360009081526004602052604090205460ff165b610d5d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d6683611e57565b610d6e6120da565b610d7882826121fc565b505050565b6000546001600160a01b0316331480610da057506002546001600160a01b031633145b610dd9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e27576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610edd576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f21576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f2c8361240e565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b505190506000610fb5611d2b565b905080821115610fc55780820393505b8215610fd557610fd53384612726565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061104057506002546001600160a01b031633145b611079576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110af57506002546001600160a01b031633145b806110c957503360009081526004602052604090205460ff165b611102576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b03163314611170576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061120557506002546001600160a01b031633145b61123e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661128d576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061130457506002546001600160a01b031633145b61133d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611380576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113a857506002546001600160a01b031633145b806113c257503360009081526004602052604090205460ff165b6113fb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61140582826121fc565b5050565b6000546001600160a01b03163314611455576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114a2576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b611405828261280a565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611528576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600081905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d60208110156115ae57600080fd5b50516001600160a01b031614611603576040805162461bcd60e51b81526020600482015260156024820152740e6e8e4c2e8cacef240e8ded6cadc40427a408aa89605b1b604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561164a57600080fd5b505afa15801561165e573d6000803e3d6000fd5b505050506040513d602081101561167457600080fd5b50516001600160a01b0316146116bb5760405162461bcd60e51b815260040180806020018281038252602581526020018061323c6025913960400191505060405180910390fd5b60075460ff16156116d0576116d06001611e57565b60006116dd60001961240e565b9050610d788282612726565b6000546001600160a01b031681565b6000546001600160a01b031633148061171b57506002546001600160a01b031633145b8061173557503360009081526004602052604090205460ff165b61176e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116117af576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006117ba8361240e565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e6918591602480830192602092919082900301818588803b15801561180e57600080fd5b505af1158015611822573d6000803e3d6000fd5b50505050506040513d602081101561183957600080fd5b5051905082811015611881576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806118e557506002546001600160a01b031633145b806118ff57503360009081526004602052604090205460ff165b611938576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161197b576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b1580156119c857600080fd5b505af11580156119dc573d6000803e3d6000fd5b505050506040513d60208110156119f257600080fd5b5051905081811015611a3c576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611a446128a3565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611aa757506002546001600160a01b031633145b611ae0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b32576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b801580611c33575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c0557600080fd5b505afa158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5051155b611c6e5760405162461bcd60e51b81526004018080602001828103825260368152602001806132ac6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d78908490612b78565b6060611ccf8484600085612c29565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d78908490612b78565b604080516370a0823160e01b815230600482015290516000918291730a760466e1b4621579a82a39cb56dda2f4e70f03916370a08231916024808301926020929190829003018186803b158015611d8157600080fd5b505afa158015611d95573d6000803e3d6000fd5b505050506040513d6020811015611dab57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a764000091611e3d9173dc24316b9ae028f1497c275eb9192a3ea0f670229163bb7b8b8091600480820192602092909190829003018186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d6020811015611e3457600080fd5b50518390612d84565b81611e4457fe5b049150611e518247612de6565b91505090565b600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152514791730a760466e1b4621579a82a39cb56dda2f4e70f0391637050ccd9916044808201926020929091908290030181600087803b158015611ebb57600080fd5b505af1158015611ecf573d6000803e3d6000fd5b505050506040513d6020811015611ee557600080fd5b5051611f2c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612007576000600b8260038110611f4757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b505190508015611ffe57611ffe60088360038110611fd557fe5b01546001600160a01b0316600b8460038110611fed57fe5b01546001600160a01b031683612e40565b50600101611f2f565b5047038181101561204e576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156120a357600061271061206e60065484612d8490919063ffffffff16565b8161207557fe5b04905080156120a157600354612094906001600160a01b031682612726565b61209e828261304f565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b60006120e4611d2b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d602081101561215f57600080fd5b505190508082116121a7576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036121b38161240e565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612206611d2b565b90508281101561224b576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561228e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d602081101561230957600080fd5b505190508085111561232e57808503935047915081841115612329578193505b612334565b84810392505b60008411806123435750600083115b156123b7576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c0985918791604480830192600092919082900301818588803b15801561239d57600080fd5b505af11580156123b1573d6000803e3d6000fd5b50505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000478083116124215782915050612721565b600061242b611d2b565b9050808410612438578093505b604080516370a0823160e01b8152306004820152905183860391600091730a760466e1b4621579a82a39cb56dda2f4e70f03916370a08231916024808301926020929190829003018186803b15801561249057600080fd5b505afa1580156124a4573d6000803e3d6000fd5b505050506040513d60208110156124ba57600080fd5b5051905060006124cd83868603846130ac565b905080156125b057730a760466e1b4621579a82a39cb56dda2f4e70f036001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561253a57600080fd5b505af115801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b50516125b0576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917306325440d014e39736583c165c2963ba99faf14e916370a0823191602480820192602092909190829003018186803b15801561260557600080fd5b505afa158015612619573d6000803e3d6000fd5b505050506040513d602081101561262f57600080fd5b505190508082111561263f578091505b81156126ea576000612710612663600f546127100387612d8490919063ffffffff16565b8161266a57fe5b60408051630d2680e960e11b8152600481018790526000602482018190529390920460448301819052905190935073dc24316b9ae028f1497c275eb9192a3ea0f6702292631a4d01d2926064808201939182900301818387803b1580156126d057600080fd5b505af11580156126e4573d6000803e3d6000fd5b50505050505b478881101561270157965061272195505050505050565b85891061271657965061272195505050505050565b889750505050505050505b919050565b6001600160a01b038216612772576040805162461bcd60e51b815260206004820152600e60248201526d746f203d2030206164647265737360901b604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b5050905080610d78576040805162461bcd60e51b815260206004820152600f60248201526e14d95b99081155120819985a5b1959608a1b604482015290519081900360640190fd5b6000600b836003811061281957fe5b01546001600160a01b0316905060006008846003811061283557fe5b01546001600160a01b03161461286b5761286b6008846003811061285557fe5b01546001600160a01b0383811691166000611bad565b816008846003811061287957fe5b0180546001600160a01b0319166001600160a01b03928316179055610d7890821683600019611bad565b478015612a1f576128b26131f7565b81815260408051630176f71760e71b8152905160009173dc24316b9ae028f1497c275eb9192a3ea0f670229163bb7b8b8091600480820192602092909190829003018186803b15801561290457600080fd5b505afa158015612918573d6000803e3d6000fd5b505050506040513d602081101561292e57600080fd5b5051905060006129508261294a86670de0b6b3a7640000612d84565b906130e6565b90506000612710612970600f546127100384612d8490919063ffffffff16565b8161297757fe5b04905073dc24316b9ae028f1497c275eb9192a3ea0f670226001600160a01b0316630b4c7e4d8686846040518463ffffffff1660e01b81526004018083600260200280838360005b838110156129d75781810151838201526020016129bf565b50505050905001828152602001925050506000604051808303818588803b158015612a0157600080fd5b505af1158015612a15573d6000803e3d6000fd5b5050505050505050505b604080516370a0823160e01b815230600482015290516000917306325440d014e39736583c165c2963ba99faf14e916370a0823191602480820192602092909190829003018186803b158015612a7457600080fd5b505afa158015612a88573d6000803e3d6000fd5b505050506040513d6020811015612a9e57600080fd5b50519050801561140557604080516321d0683360e11b8152601960048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b158015612b0a57600080fd5b505af1158015612b1e573d6000803e3d6000fd5b505050506040513d6020811015612b3457600080fd5b5051611405576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b6000612bcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611cc09092919063ffffffff16565b805190915015610d7857808060200190516020811015612bec57600080fd5b5051610d785760405162461bcd60e51b815260040180806020018281038252602a815260200180613282602a913960400191505060405180910390fd5b606082471015612c6a5760405162461bcd60e51b81526004018080602001828103825260268152602001806132166026913960400191505060405180910390fd5b612c738561314d565b612cc4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310612d025780518252601f199092019160209182019101612ce3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5091509150612d79828286613153565b979650505050505050565b600082612d9357506000612de0565b82820282848281612da057fe5b0414612ddd5760405162461bcd60e51b81526004018080602001828103825260218152602001806132616021913960400191505060405180910390fd5b90505b92915050565b600082820183811015612ddd576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160028082526060820183526000926020830190803683370190505090508281600081518110612e6f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612eb157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050836001600160a01b03166318cbafe58360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612f56578181015183820152602001612f3e565b505050509050019650505050505050600060405180830381600087803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fbc57600080fd5b8101908080516040519392919084640100000000821115612fdc57600080fd5b908301906020820185811115612ff157600080fd5b825186602082028301116401000000008211171561300e57600080fd5b82525081516020918201928201910280838360005b8381101561303b578181015183820152602001613023565b505050509050016040525050505050505050565b6000828211156130a6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156130dc578284106130c2575080611cd2565b826130cd8584612d84565b816130d457fe5b049050611cd2565b5060009392505050565b600080821161313c576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161314557fe5b049392505050565b3b151590565b60608315613162575081611cd2565b8251156131725782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156131bc5781810151838201526020016131a4565b50505050905090810190601f1680156131e95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060400160405280600290602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212204f6224107447c3ce287c8fb3fbcc878091d9e1ed5d9e66b0eb856d265aa7376464736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000009501b3a6dce1bbe6094356391f3992e08ee90e3a00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode
0x6080604052600436106101f25760003560e01c806347a02a441161010d578063b157eacf116100a0578063d8aed1451161006f578063d8aed14514610695578063e2bbb158146106c5578063f0f44260146106f5578063f851a44014610728578063fc0c546a1461073d5761022f565b8063b157eacf14610605578063b91816111461061a578063ce5494bb1461064d578063d085835a146106805761022f565b80637372bb41116100dc5780637372bb411461055d578063753c0985146105875780638a36bef7146105b7578063b127df87146105f05761022f565b806347a02a44146104cd57806361d027b3146105005780636209ec2d14610515578063704b6c021461052a5761022f565b806324d16c1a116101855780633739795c116101545780633739795c1461043757806338c2eae514610463578063392c731f1461048f57806342d14c83146104a45761022f565b806324d16c1a14610356578063284fa3441461039c5780632d1fb389146103d25780632e1a7d4d1461040d5761022f565b80631dd19cb4116101c15780631dd19cb4146102e45780631e39831e146102f957806322b2ba731461030e578063232a3060146103235761022f565b806301681a621461023457806301e1d114146102695780630962ef791461029057806313b857b4146102ba5761022f565b3661022f5760408051348152905133917fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc60919081900360200190a2005b600080fd5b34801561024057600080fd5b506102676004803603602081101561025757600080fd5b50356001600160a01b0316610752565b005b34801561027557600080fd5b5061027e6108d1565b60408051918252519081900360200190f35b34801561029c57600080fd5b50610267600480360360208110156102b357600080fd5b50356108e0565b3480156102c657600080fd5b50610267600480360360208110156102dd57600080fd5b503561095f565b3480156102f057600080fd5b50610267610a1e565b34801561030557600080fd5b50610267610a9e565b34801561031a57600080fd5b5061027e610b43565b34801561032f57600080fd5b506102676004803603602081101561034657600080fd5b50356001600160a01b0316610b49565b34801561036257600080fd5b506103806004803603602081101561037957600080fd5b5035610cc7565b604080516001600160a01b039092168252519081900360200190f35b3480156103a857600080fd5b50610267600480360360608110156103bf57600080fd5b5080359060208101359060400135610ce7565b3480156103de57600080fd5b50610267600480360360408110156103f557600080fd5b506001600160a01b0381351690602001351515610d7d565b34801561041957600080fd5b5061027e6004803603602081101561043057600080fd5b5035610e8b565b34801561044357600080fd5b506102676004803603602081101561045a57600080fd5b5035151561101d565b34801561046f57600080fd5b506102676004803603602081101561048657600080fd5b5035151561108c565b34801561049b57600080fd5b5061027e611115565b3480156104b057600080fd5b506104b961111b565b604080519115158252519081900360200190f35b3480156104d957600080fd5b50610267600480360360208110156104f057600080fd5b50356001600160a01b0316611124565b34801561050c57600080fd5b506103806111c4565b34801561052157600080fd5b506103806111d3565b34801561053657600080fd5b506102676004803603602081101561054d57600080fd5b50356001600160a01b03166111e2565b34801561056957600080fd5b506102676004803603602081101561058057600080fd5b50356112e1565b34801561059357600080fd5b50610267600480360360408110156105aa57600080fd5b5080359060200135611385565b3480156105c357600080fd5b50610267600480360360408110156105da57600080fd5b50803590602001356001600160a01b0316611409565b3480156105fc57600080fd5b506103806114ac565b34801561061157600080fd5b506104b96114bb565b34801561062657600080fd5b506104b96004803603602081101561063d57600080fd5b50356001600160a01b03166114c4565b34801561065957600080fd5b506102676004803603602081101561067057600080fd5b50356001600160a01b03166114d9565b34801561068c57600080fd5b506103806116e9565b3480156106a157600080fd5b50610267600480360360408110156106b857600080fd5b50803590602001356116f8565b3480156106d157600080fd5b50610267600480360360408110156106e857600080fd5b50803590602001356118c2565b34801561070157600080fd5b506102676004803603602081101561071857600080fd5b50356001600160a01b0316611a84565b34801561073457600080fd5b50610380611b86565b34801561074957600080fd5b50610380611b95565b6000546001600160a01b031633148061077557506002546001600160a01b031633145b8061078f57503360009081526004602052604090205460ff165b6107c8576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600381101561083d57600b81600381106107e157fe5b01546001600160a01b0383811691161415610835576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001016107cb565b50600254604080516370a0823160e01b815230600482015290516108ce926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561089157600080fd5b505afa1580156108a5573d6000803e3d6000fd5b505050506040513d60208110156108bb57600080fd5b50516001600160a01b0384169190611cd9565b50565b60006108db611d2b565b905090565b6000546001600160a01b031633148061090357506002546001600160a01b031633145b8061091d57503360009081526004602052604090205460ff165b610956576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108ce81611e57565b6000546001600160a01b031633148061098257506002546001600160a01b031633145b8061099c57503360009081526004602052604090205460ff165b6109d5576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610a19576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b0316331480610a4157506002546001600160a01b031633145b80610a5b57503360009081526004602052604090205460ff165b610a94576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a9c6120da565b565b6001546001600160a01b03163314610aef576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b95576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bec57600080fd5b505afa158015610c00573d6000803e3d6000fd5b505050506040513d6020811015610c1657600080fd5b50516001600160a01b031614610c73576040805162461bcd60e51b815260206004820152601d60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000604482015290519081900360640190fd5b600580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610cd757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d0a57506002546001600160a01b031633145b80610d2457503360009081526004602052604090205460ff165b610d5d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d6683611e57565b610d6e6120da565b610d7882826121fc565b505050565b6000546001600160a01b0316331480610da057506002546001600160a01b031633145b610dd9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e27576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610edd576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f21576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f2c8361240e565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b505190506000610fb5611d2b565b905080821115610fc55780820393505b8215610fd557610fd53384612726565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061104057506002546001600160a01b031633145b611079576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110af57506002546001600160a01b031633145b806110c957503360009081526004602052604090205460ff165b611102576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b03163314611170576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061120557506002546001600160a01b031633145b61123e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661128d576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061130457506002546001600160a01b031633145b61133d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611380576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113a857506002546001600160a01b031633145b806113c257503360009081526004602052604090205460ff165b6113fb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61140582826121fc565b5050565b6000546001600160a01b03163314611455576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114a2576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b611405828261280a565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611528576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600081905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d60208110156115ae57600080fd5b50516001600160a01b031614611603576040805162461bcd60e51b81526020600482015260156024820152740e6e8e4c2e8cacef240e8ded6cadc40427a408aa89605b1b604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561164a57600080fd5b505afa15801561165e573d6000803e3d6000fd5b505050506040513d602081101561167457600080fd5b50516001600160a01b0316146116bb5760405162461bcd60e51b815260040180806020018281038252602581526020018061323c6025913960400191505060405180910390fd5b60075460ff16156116d0576116d06001611e57565b60006116dd60001961240e565b9050610d788282612726565b6000546001600160a01b031681565b6000546001600160a01b031633148061171b57506002546001600160a01b031633145b8061173557503360009081526004602052604090205460ff165b61176e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116117af576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006117ba8361240e565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e6918591602480830192602092919082900301818588803b15801561180e57600080fd5b505af1158015611822573d6000803e3d6000fd5b50505050506040513d602081101561183957600080fd5b5051905082811015611881576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806118e557506002546001600160a01b031633145b806118ff57503360009081526004602052604090205460ff165b611938576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161197b576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b1580156119c857600080fd5b505af11580156119dc573d6000803e3d6000fd5b505050506040513d60208110156119f257600080fd5b5051905081811015611a3c576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611a446128a3565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611aa757506002546001600160a01b031633145b611ae0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b32576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b801580611c33575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c0557600080fd5b505afa158015611c19573d6000803e3d6000fd5b505050506040513d6020811015611c2f57600080fd5b5051155b611c6e5760405162461bcd60e51b81526004018080602001828103825260368152602001806132ac6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d78908490612b78565b6060611ccf8484600085612c29565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d78908490612b78565b604080516370a0823160e01b815230600482015290516000918291730a760466e1b4621579a82a39cb56dda2f4e70f03916370a08231916024808301926020929190829003018186803b158015611d8157600080fd5b505afa158015611d95573d6000803e3d6000fd5b505050506040513d6020811015611dab57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a764000091611e3d9173dc24316b9ae028f1497c275eb9192a3ea0f670229163bb7b8b8091600480820192602092909190829003018186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d6020811015611e3457600080fd5b50518390612d84565b81611e4457fe5b049150611e518247612de6565b91505090565b600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152514791730a760466e1b4621579a82a39cb56dda2f4e70f0391637050ccd9916044808201926020929091908290030181600087803b158015611ebb57600080fd5b505af1158015611ecf573d6000803e3d6000fd5b505050506040513d6020811015611ee557600080fd5b5051611f2c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612007576000600b8260038110611f4757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b505190508015611ffe57611ffe60088360038110611fd557fe5b01546001600160a01b0316600b8460038110611fed57fe5b01546001600160a01b031683612e40565b50600101611f2f565b5047038181101561204e576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156120a357600061271061206e60065484612d8490919063ffffffff16565b8161207557fe5b04905080156120a157600354612094906001600160a01b031682612726565b61209e828261304f565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b60006120e4611d2b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d602081101561215f57600080fd5b505190508082116121a7576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036121b38161240e565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612206611d2b565b90508281101561224b576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561228e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d602081101561230957600080fd5b505190508085111561232e57808503935047915081841115612329578193505b612334565b84810392505b60008411806123435750600083115b156123b7576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c0985918791604480830192600092919082900301818588803b15801561239d57600080fd5b505af11580156123b1573d6000803e3d6000fd5b50505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000478083116124215782915050612721565b600061242b611d2b565b9050808410612438578093505b604080516370a0823160e01b8152306004820152905183860391600091730a760466e1b4621579a82a39cb56dda2f4e70f03916370a08231916024808301926020929190829003018186803b15801561249057600080fd5b505afa1580156124a4573d6000803e3d6000fd5b505050506040513d60208110156124ba57600080fd5b5051905060006124cd83868603846130ac565b905080156125b057730a760466e1b4621579a82a39cb56dda2f4e70f036001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561253a57600080fd5b505af115801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b50516125b0576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917306325440d014e39736583c165c2963ba99faf14e916370a0823191602480820192602092909190829003018186803b15801561260557600080fd5b505afa158015612619573d6000803e3d6000fd5b505050506040513d602081101561262f57600080fd5b505190508082111561263f578091505b81156126ea576000612710612663600f546127100387612d8490919063ffffffff16565b8161266a57fe5b60408051630d2680e960e11b8152600481018790526000602482018190529390920460448301819052905190935073dc24316b9ae028f1497c275eb9192a3ea0f6702292631a4d01d2926064808201939182900301818387803b1580156126d057600080fd5b505af11580156126e4573d6000803e3d6000fd5b50505050505b478881101561270157965061272195505050505050565b85891061271657965061272195505050505050565b889750505050505050505b919050565b6001600160a01b038216612772576040805162461bcd60e51b815260206004820152600e60248201526d746f203d2030206164647265737360901b604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b5050905080610d78576040805162461bcd60e51b815260206004820152600f60248201526e14d95b99081155120819985a5b1959608a1b604482015290519081900360640190fd5b6000600b836003811061281957fe5b01546001600160a01b0316905060006008846003811061283557fe5b01546001600160a01b03161461286b5761286b6008846003811061285557fe5b01546001600160a01b0383811691166000611bad565b816008846003811061287957fe5b0180546001600160a01b0319166001600160a01b03928316179055610d7890821683600019611bad565b478015612a1f576128b26131f7565b81815260408051630176f71760e71b8152905160009173dc24316b9ae028f1497c275eb9192a3ea0f670229163bb7b8b8091600480820192602092909190829003018186803b15801561290457600080fd5b505afa158015612918573d6000803e3d6000fd5b505050506040513d602081101561292e57600080fd5b5051905060006129508261294a86670de0b6b3a7640000612d84565b906130e6565b90506000612710612970600f546127100384612d8490919063ffffffff16565b8161297757fe5b04905073dc24316b9ae028f1497c275eb9192a3ea0f670226001600160a01b0316630b4c7e4d8686846040518463ffffffff1660e01b81526004018083600260200280838360005b838110156129d75781810151838201526020016129bf565b50505050905001828152602001925050506000604051808303818588803b158015612a0157600080fd5b505af1158015612a15573d6000803e3d6000fd5b5050505050505050505b604080516370a0823160e01b815230600482015290516000917306325440d014e39736583c165c2963ba99faf14e916370a0823191602480820192602092909190829003018186803b158015612a7457600080fd5b505afa158015612a88573d6000803e3d6000fd5b505050506040513d6020811015612a9e57600080fd5b50519050801561140557604080516321d0683360e11b8152601960048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b158015612b0a57600080fd5b505af1158015612b1e573d6000803e3d6000fd5b505050506040513d6020811015612b3457600080fd5b5051611405576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b6000612bcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611cc09092919063ffffffff16565b805190915015610d7857808060200190516020811015612bec57600080fd5b5051610d785760405162461bcd60e51b815260040180806020018281038252602a815260200180613282602a913960400191505060405180910390fd5b606082471015612c6a5760405162461bcd60e51b81526004018080602001828103825260268152602001806132166026913960400191505060405180910390fd5b612c738561314d565b612cc4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310612d025780518252601f199092019160209182019101612ce3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5091509150612d79828286613153565b979650505050505050565b600082612d9357506000612de0565b82820282848281612da057fe5b0414612ddd5760405162461bcd60e51b81526004018080602001828103825260218152602001806132616021913960400191505060405180910390fd5b90505b92915050565b600082820183811015612ddd576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160028082526060820183526000926020830190803683370190505090508281600081518110612e6f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612eb157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050836001600160a01b03166318cbafe58360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612f56578181015183820152602001612f3e565b505050509050019650505050505050600060405180830381600087803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fbc57600080fd5b8101908080516040519392919084640100000000821115612fdc57600080fd5b908301906020820185811115612ff157600080fd5b825186602082028301116401000000008211171561300e57600080fd5b82525081516020918201928201910280838360005b8381101561303b578181015183820152602001613023565b505050509050016040525050505050505050565b6000828211156130a6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156130dc578284106130c2575080611cd2565b826130cd8584612d84565b816130d457fe5b049050611cd2565b5060009392505050565b600080821161313c576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161314557fe5b049392505050565b3b151590565b60608315613162575081611cd2565b8251156131725782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156131bc5781810151838201526020016131a4565b50505050905090810190601f1680156131e95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060400160405280600290602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212204f6224107447c3ce287c8fb3fbcc878091d9e1ed5d9e66b0eb856d265aa7376464736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009501b3a6dce1bbe6094356391f3992e08ee90e3a00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
-----Decoded View---------------
Arg [0] : _fundManager (address): 0x9501B3a6DcE1Bbe6094356391F3992e08EE90E3a
Arg [1] : _treasury (address): 0x86d10751B18F3fE331C146546868a07224A8598B
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009501b3a6dce1bbe6094356391f3992e08ee90e3a
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode Sourcemap
31617:12449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25116:33;;;25139:9;25116:33;;;;25127:10;;25116:33;;;;;;;;;;31617:12449;;;;;43781:282;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43781:282:0;-1:-1:-1;;;;;43781:282:0;;:::i;:::-;;35574:101;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41336:116;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41336:116:0;;:::i;34742:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34742:135:0;;:::i;41812:75::-;;;;;;;;;;;;;:::i;26462:218::-;;;;;;;;;;;;;:::i;24372:26::-;;;;;;;;;;;;;:::i;27929:312::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27929:312:0;-1:-1:-1;;;;;27929:312:0;;:::i;32118:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32118:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;32118:31:0;;;;;;;;;;;;;;42809:235;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42809:235:0;;;;;;;;;;;;:::i;27078:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27078:235:0;;;;;;;;;;:::i;38876:574::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38876:574:0;;:::i;28458:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28458:139:0;;;;:::i;34930:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34930:136:0;;;;:::i;33204:22::-;;;;;;;;;;;;;:::i;24539:40::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;26117:239;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26117:239:0;-1:-1:-1;;;;;26117:239:0;;:::i;23995:23::-;;;;;;;;;;;;;:::i;24288:34::-;;;;;;;;;;;;;:::i;26763:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26763:189:0;-1:-1:-1;;;;;26763:189:0;;:::i;27775:146::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27775:146:0;;:::i;42672:129::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42672:129:0;;;;;;;:::i;34444:154::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34444:154:0;;;;;;-1:-1:-1;;;;;34444:154:0;;:::i;23934:27::-;;;;;;;;;;;;;:::i;32798:36::-;;;;;;;;;;;;;:::i;24114:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24114:42:0;-1:-1:-1;;;;;24114:42:0;;:::i;43052:597::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43052:597:0;-1:-1:-1;;;;;43052:597:0;;:::i;23904:23::-;;;;;;;;;;;;;:::i;39458:364::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39458:364:0;;;;;;;:::i;36396:304::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36396:304:0;;;;;;;:::i;27405:280::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27405:280:0;-1:-1:-1;;;;;27405:280:0;;:::i;23968:20::-;;;;;;;;;;;;;:::i;24246:35::-;;;;;;;;;;;;;:::i;43781:282::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;43861:6:::1;43856:114;32009:1;43873;:15;43856:114;;;43928:7;43936:1;43928:10;;;;;;;;::::0;-1:-1:-1;;;;;43918:20:0;;::::1;43928:10:::0;::::1;43918:20;;43910:48;;;::::0;;-1:-1:-1;;;43910:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43910:48:0;;;;;;;;;;;;;::::1;;43890:3;;43856:114;;;-1:-1:-1::0;44008:5:0::1;::::0;44015:39:::1;::::0;;-1:-1:-1;;;44015:39:0;;44048:4:::1;44015:39;::::0;::::1;::::0;;;43980:75:::1;::::0;-1:-1:-1;;;;;44008:5:0;;::::1;::::0;44015:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44015:39:0;-1:-1:-1;;;;;43980:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;43781:282:::0;:::o;35574:101::-;35629:4;35653:14;:12;:14::i;:::-;35646:21;;35574:101;:::o;41336:116::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;41419:25:::1;41433:10;41419:13;:25::i;34742:135::-:0;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;33266:5:::1;34814;:17;;34806:40;;;::::0;;-1:-1:-1;;;34806:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34806:40:0;;;;;;;;;;;;;::::1;;34857:4;:12:::0;34742:135::o;41812:75::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;41872:7:::1;:5;:7::i;:::-;41812:75::o:0;26462:218::-;26530:12;;-1:-1:-1;;;;;26530:12:0;26516:10;:26;26508:54;;;;;-1:-1:-1;;;26508:54:0;;;;;;;;;;;;-1:-1:-1;;;26508:54:0;;;;;;;;;;;;;;;26573:8;:21;;-1:-1:-1;;;;;;26573:21:0;;;26584:10;26573:21;;;;;;;26605:25;;;;;;;26646:26;;;;;;;;;;;;;;;;26462:218::o;24372:26::-;;;;:::o;27929:312::-;25445:8;;-1:-1:-1;;;;;25445:8:0;25431:10;:22;25423:45;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;;;;24197:42:::1;-1:-1:-1::0;;;;;28030:44:0::1;28046:12;-1:-1:-1::0;;;;;28030:35:0::1;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28030:37:0;-1:-1:-1;;;;;28030:44:0::1;;28008:123;;;::::0;;-1:-1:-1;;;28008:123:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28144:11;:43:::0;;-1:-1:-1;;;;;28144:43:0;::::1;-1:-1:-1::0;;;;;;28144:43:0;;::::1;::::0;::::1;::::0;;;28205:28:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27929:312:::0;:::o;32118:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32118:31:0;;-1:-1:-1;32118:31:0;:::o;42809:235::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;42953:25:::1;42967:10;42953:13;:25::i;:::-;42989:7;:5;:7::i;:::-;43007:29;43015:9;43026;43007:7;:29::i;:::-;42809:235:::0;;;:::o;27078:::-;25560:8;;-1:-1:-1;;;;;25560:8:0;25546:10;:22;;:45;;-1:-1:-1;25586:5:0;;-1:-1:-1;;;;;25586:5:0;25572:10;:19;25546:45;25538:63;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27178:19:0;::::1;27170:48;;;::::0;;-1:-1:-1;;;27170:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27170:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;27229:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;27229:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27276:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;27078:235:::0;;:::o;38876:574::-;25888:11;;38987:9;;-1:-1:-1;;;;;25888:11:0;25866:10;:34;25858:60;;;;;-1:-1:-1;;;25858:60:0;;;;;;;;;;;;-1:-1:-1;;;25858:60:0;;;;;;;;;;;;;;;39032:1:::1;39022:7;:11;39014:36;;;::::0;;-1:-1:-1;;;39014:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39014:36:0;;;;;;;;;;;;;::::1;;39095:14;39112:18;39122:7;39112:9;:18::i;:::-;39155:11;::::0;:34:::1;::::0;;-1:-1:-1;;;39155:34:0;;39183:4:::1;39155:34;::::0;::::1;::::0;;;39095:35;;-1:-1:-1;39143:9:0::1;::::0;-1:-1:-1;;;;;39155: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;39155:34:0;;-1:-1:-1;39200:10:0::1;39213:14;:12;:14::i;:::-;39200:27;;39249:5;39242:4;:12;39238:64;;;39285:5;39278:4;:12;39271:19;;39238:64;39318:13:::0;;39314:77:::1;;39348:31;39357:10;39369:9;39348:8;:31::i;:::-;39408:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25929:1;;;38876:574:::0;;;:::o;28458:139::-;25560:8;;-1:-1:-1;;;;;25560:8:0;25546:10;:22;;:45;;-1:-1:-1;25586:5:0;;-1:-1:-1;;;;;25586:5:0;25572:10;:19;25546:45;25538:63;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;;;;28552:21:::1;:37:::0;;-1:-1:-1;;28552:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28458:139::o;34930:136::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;35020:17:::1;:38:::0;;-1:-1:-1;;35020:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34930:136::o;33204:22::-;;;;:::o;24539:40::-;;;;;;:::o;26117:239::-;25445:8;;-1:-1:-1;;;;;25445:8:0;25431:10;:22;25423:45;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;;;;26274:12:::1;:28:::0;;-1:-1:-1;;;;;26274:28:0;::::1;-1:-1:-1::0;;;;;;26274:28:0;;::::1;::::0;::::1;::::0;;;26318:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26117:239:::0;:::o;23995:23::-;;;-1:-1:-1;;;;;23995:23:0;;:::o;24288:34::-;;;-1:-1:-1;;;;;24288:34:0;;:::o;26763:189::-;25560:8;;-1:-1:-1;;;;;25560:8:0;25546:10;:22;;:45;;-1:-1:-1;25586:5:0;;-1:-1:-1;;;;;25586:5:0;25572:10;:19;25546:45;25538:63;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26845:20:0;::::1;26837:50;;;::::0;;-1:-1:-1;;;26837:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26837:50:0;;;;;;;;;;;;;::::1;;26898:5;:14:::0;;-1:-1:-1;;;;;26898:14:0;::::1;-1:-1:-1::0;;;;;;26898:14:0;;::::1;::::0;::::1;::::0;;;26928:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26763:189:::0;:::o;27775:146::-;25560:8;;-1:-1:-1;;;;;25560:8:0;25546:10;:22;;:45;;-1:-1:-1;25586:5:0;;-1:-1:-1;;;;;25586:5:0;25572:10;:19;25546:45;25538:63;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;;;;24442:4:::1;27854;:20;;27846:42;;;::::0;;-1:-1:-1;;;27846:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27846:42:0;;;;;;;;;;;;;::::1;;27899:7;:14:::0;27775:146::o;42672:129::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;42764:29:::1;42772:9;42783;42764:7;:29::i;:::-;42672:129:::0;;:::o;34444:154::-;25445:8;;-1:-1:-1;;;;;25445:8:0;25431:10;:22;25423:45;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;-1:-1:-1;;;25423:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34524:18:0;::::1;34516:46;;;::::0;;-1:-1:-1;;;34516:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34516:46:0;;;;;;;;;;;;;::::1;;34573:17;34581:2;34585:4;34573:7;:17::i;23934:27::-:0;;;-1:-1:-1;;;;;23934:27:0;;:::o;32798:36::-;;;;;;:::o;24114:42::-;;;;;;;;;;;;;;;:::o;43052:597::-;25888:11;;-1:-1:-1;;;;;25888:11:0;25866:10;:34;25858:60;;;;;-1:-1:-1;;;25858:60:0;;;;;;;;;;;;-1:-1:-1;;;25858:60:0;;;;;;;;;;;;;;;43141:17:::1;43173:9;43141:42;;24197;-1:-1:-1::0;;;;;43202:29:0::1;43210:5;-1:-1:-1::0;;;;;43210:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43210:13:0;-1:-1:-1;;;;;43202:29:0::1;;43194:63;;;::::0;;-1:-1:-1;;;43194:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43194:63:0;;;;;;;;;;;;;::::1;;43330:11;::::0;43298:19:::1;::::0;;-1:-1:-1;;;43298:19:0;;;;-1:-1:-1;;;;;43330:11:0;;::::1;::::0;43298: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;43298:19:0;-1:-1:-1;;;;;43290:52:0::1;;43268:139;;;;-1:-1:-1::0;;;43268:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43424:21;::::0;::::1;;43420:70;;;43462:16;43476:1;43462:13;:16::i;:::-;43502:8;43513:25;-1:-1:-1::0;;43513:9:0::1;:25::i;:::-;43502:36;;43612:29;43629:5;43637:3;43612:8;:29::i;23904:23::-:0;;;-1:-1:-1;;;;;23904:23:0;;:::o;39458:364::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;39560:1:::1;39550:7;:11;39542:33;;;::::0;;-1:-1:-1;;;39542:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39542:33:0;;;;;;;;;;;;;::::1;;39618:14;39635:18;39645:7;39635:9;:18::i;:::-;39678:11;::::0;:46:::1;::::0;;-1:-1:-1;;;39678:46:0;;::::1;::::0;::::1;::::0;;;;;39618:35;;-1:-1:-1;39664:11:0::1;::::0;-1:-1:-1;;;;;39678:11:0;;::::1;::::0;:17:::1;::::0;39618:35;;39678:46;;;;;::::1;::::0;;;;;;;;39618:35;39678:11;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39678:46:0;;-1:-1:-1;39743:14:0;;::::1;;39735:39;;;::::0;;-1:-1:-1;;;39735:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39735:39:0;;;;;;;;;;;;;::::1;;39792:22;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25803:1;;39458:364:::0;;:::o;36396:304::-;25702:8;;-1:-1:-1;;;;;25702:8:0;25688:10;:22;;:45;;-1:-1:-1;25728:5:0;;-1:-1:-1;;;;;25728:5:0;25714:10;:19;25688:45;:71;;;-1:-1:-1;25748:10:0;25737:22;;;;:10;:22;;;;;;;;25688:71;25666:126;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;-1:-1:-1;;;25666:126:0;;;;;;;;;;;;;;;36500:1:::1;36490:7;:11;36482:35;;;::::0;;-1:-1:-1;;;36482:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36482:35:0;;;;;;;;;;;;;::::1;;36546:11;::::0;:27:::1;::::0;;-1:-1:-1;;;36546:27:0;;::::1;::::0;::::1;::::0;;;;;36530:13:::1;::::0;-1:-1:-1;;;;;36546:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;36530:13;36546:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36546:27:0;;-1:-1:-1;36592:16:0;;::::1;;36584:43;;;::::0;;-1:-1:-1;;;36584:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36584:43:0;;;;;;;;;;;;;::::1;;36640:10;:8;:10::i;:::-;36666:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25803:1;36396:304:::0;;:::o;27405:280::-;25560:8;;-1:-1:-1;;;;;25560:8:0;25546:10;:22;;:45;;-1:-1:-1;25586:5:0;;-1:-1:-1;;;;;25586:5:0;25572:10;:19;25546:45;25538:63;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;-1:-1:-1;;;25538:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27560:23:0;::::1;27552:56;;;::::0;;-1:-1:-1;;;27552:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27552:56:0;;;;;;;;;;;;;::::1;;27619:8;:20:::0;;-1:-1:-1;;;;;27619:20:0;::::1;-1:-1:-1::0;;;;;;27619:20:0;;::::1;::::0;::::1;::::0;;;27655:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27405:280:::0;:::o;23968:20::-;;;-1:-1:-1;;;;;23968:20:0;;:::o;24246:35::-;24197:42;24246:35;:::o;13132:704::-;13547:10;;;13546:62;;-1:-1:-1;13563:39:0;;;-1:-1:-1;;;13563:39:0;;13587:4;13563:39;;;;-1:-1:-1;;;;;13563:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13563:39:0;:44;13546:62;13524:166;;;;-1:-1:-1;;;13524:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13755:62;;;-1:-1:-1;;;;;13755:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13755:62:0;-1:-1:-1;;;13755:62:0;;;13701:127;;13735:5;;13701:19;:127::i;3640:229::-;3777:12;3809:52;3831:6;3839:4;3845:1;3848:12;3809:21;:52::i;:::-;3802:59;;3640:229;;;;;;:::o;12328:245::-;12496:58;;;-1:-1:-1;;;;;12496:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12496:58:0;-1:-1:-1;;;12496:58:0;;;12442:123;;12476:5;;12442:19;:123::i;35074:492::-;35357:31;;;-1:-1:-1;;;35357:31:0;;35382:4;35357:31;;;;;;35120:10;;;;32748:42;;35357:16;;:31;;;;;;;;;;;;;;32748:42;35357:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35357:31:0;35467:30;;;-1:-1:-1;;;35467:30:0;;;;35357:31;;-1:-1:-1;35501:4:0;;35457:41;;32956:42;;35467:28;;:30;;;;;35357:31;;35467:30;;;;;;;;32956:42;35467:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35467:30:0;35457:5;;:9;:41::i;:::-;:48;;;;;;;-1:-1:-1;35526:32:0;35457:48;35536:21;35526:9;:32::i;:::-;35518:40;;35074:492;;:::o;40373:955::-;40608:17;;40576:50;;;-1:-1:-1;;;40576:50:0;;40601:4;40576:50;;;;40608:17;;;;40576:50;;;;;;;40520:21;;32748:42;;40576:16;;:50;;;;;;;;;;;;;;;40508:9;32748:42;40576:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40576:50:0;40554:117;;;;;-1:-1:-1;;;40554:117:0;;;;;;;;;;;;-1:-1:-1;;;40554:117:0;;;;;;;;;;;;;;;40689:6;40684:230;32009:1;40701;:15;40684:230;;;40738:14;40762:7;40770:1;40762:10;;;;;;;;;40755:43;;;-1:-1:-1;;;40755:43:0;;40792:4;40755:43;;;;;;-1:-1:-1;;;;;40762:10:0;;;;40755:28;;:43;;;;;;;;;;;;;;;40762:10;40755:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40755:43:0;;-1:-1:-1;40817:13:0;;40813:90;;40851:36;40857:3;40861:1;40857:6;;;;;;;;;-1:-1:-1;;;;;40857:6:0;40865:7;40873:1;40865:10;;;;;;;;;-1:-1:-1;;;;;40865:10:0;40877:9;40851:5;:36::i;:::-;-1:-1:-1;40718:3:0;;40684:230;;;-1:-1:-1;40933:21:0;:28;40980:18;;;;40972:43;;;;;-1:-1:-1;;;40972:43:0;;;;;;;;;;;;-1:-1:-1;;;40972:43:0;;;;;;;;;;;;;;;41081:8;;41077:208;;41106:8;24525:5;41117:17;41126:7;;41117:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;41168:7:0;;41164:110;;41205:8;;41196:23;;-1:-1:-1;;;;;41205:8:0;41215:3;41196:8;:23::i;:::-;41245:13;:4;41254:3;41245:8;:13::i;:::-;41238:20;;41164:110;41077:208;;41302:18;;;;;;;;;;;;;;;;;40373:955;;:::o;41460:344::-;41496:10;41509:14;:12;:14::i;:::-;41546:11;;:34;;;-1:-1:-1;;;41546:34:0;;41574:4;41546:34;;;;;;41496:27;;-1:-1:-1;41534:9:0;;-1:-1:-1;;;;;41546:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41546:34:0;;-1:-1:-1;41599:12:0;;;41591:38;;;;;-1:-1:-1;;;41591:38:0;;;;;;;;;;;;-1:-1:-1;;;41591:38:0;;;;;;;;;;;;;;;41656:12;;;41736:17;41656:12;41736:9;:17::i;:::-;41771:25;;;;;;;;;;;;;;;;;;;;41727:26;;-1:-1:-1;41771:25:0;;;;;;;;;;41460:344;;;:::o;41895:769::-;41963:10;41976:14;:12;:14::i;:::-;41963:27;;42018:9;42009:5;:18;;42001:42;;;;;-1:-1:-1;;;42001:42:0;;;;;;;;;;;;-1:-1:-1;;;42001:42:0;;;;;;;;;;;;;;;42071:9;42062:5;:18;;42054:42;;;;;-1:-1:-1;;;42054:42:0;;;;;;;;;;;;-1:-1:-1;;;42054:42:0;;;;;;;;;;;;;;;42211:11;;:34;;;-1:-1:-1;;;42211:34:0;;42239:4;42211:34;;;;;;42109:9;;;;;;;;-1:-1:-1;;;;;42211:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42211:34:0;;-1:-1:-1;42260:12:0;;;42256:238;;;42304:4;42296:5;:12;42289:19;;42332:21;42325:28;;42379:4;42372;:11;42368:63;;;42411:4;42404:11;;42368:63;42256:238;;;42477:5;42470:4;:12;42463:19;;42256:238;42517:1;42510:4;:8;:20;;;;42529:1;42522:4;:8;42510:20;42506:96;;;42547:11;;:43;;;-1:-1:-1;;;42547:43:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42547:11:0;;;;:18;;42573:4;;42547:43;;;;;:11;;:43;;;;;;;42573:4;42547:11;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42506:96;42619:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41895:769;;;;;;;:::o;37457:1411::-;37507:4;37535:21;37571:14;;;37567:61;;37609:7;37602:14;;;;;37567:61;37640:10;37653:14;:12;:14::i;:::-;37640:27;;37695:5;37684:7;:16;37680:64;;37727:5;37717:15;;37680:64;37811:31;;;-1:-1:-1;;;37811:31:0;;37836:4;37811:31;;;;;;37768:13;;;;37756:9;;32748:42;;37811:16;;:31;;;;;;;;;;;;;;32748:42;37811:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37811:31:0;;-1:-1:-1;37895:11:0;37909:53;37931:4;37937:11;;;37811:31;37909:21;:53::i;:::-;37895:67;-1:-1:-1;38012:10:0;;38008:150;;32748:42;-1:-1:-1;;;;;38080:24:0;;38105:6;38113:5;38080:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38080:39:0;38072:74;;;;;-1:-1:-1;;;38072:74:0;;;;;;;;;;;;-1:-1:-1;;;38072:74:0;;;;;;;;;;;;;;;38215:33;;;-1:-1:-1;;;38215:33:0;;38242:4;38215:33;;;;;;38202:10;;33103:42;;38215:18;;:33;;;;;;;;;;;;;;;33103:42;38215:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38215:33:0;;-1:-1:-1;38263:14:0;;;38259:61;;;38303:5;38294:14;;38259:61;38336:10;;38332:169;;38363:8;33266:5;38374:25;38394:4;;33266:5;38383:15;38374:4;:8;;:25;;;;:::i;:::-;:36;;;;;38425:64;;;-1:-1:-1;;;38425:64:0;;;;;;;;33354:1;38425:64;;;;;;38374:36;;;;38425:64;;;;;;;;38374:36;;-1:-1:-1;32956:42:0;;38425:36;;:64;;;;;;;;;;;33354:1;32956:42;38425:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38332:169;;38529:21;38565:18;;;38561:66;;;38607:8;-1:-1:-1;38600:15:0;;-1:-1:-1;;;;;;38600:15:0;38561:66;38750:5;38739:7;:16;38735:64;;38779:8;-1:-1:-1;38772:15:0;;-1:-1:-1;;;;;;38772:15:0;38735:64;38853:7;38846:14;;;;;;;;;37457:1411;;;;:::o;25165:215::-;-1:-1:-1;;;;;25238:17:0;;25230:44;;;;;-1:-1:-1;;;25230:44:0;;;;;;;;;;;;-1:-1:-1;;;25230:44:0;;;;;;;;;;;;;;;25301:28;;25286:9;;-1:-1:-1;;;;;25301:8:0;;;25317:7;;25286:9;25301:28;25286:9;25301:28;25317:7;25301:8;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25285:44;;;25348:4;25340:32;;;;;-1:-1:-1;;;25340:32:0;;;;;;;;;;;;-1:-1:-1;;;25340:32:0;;;;;;;;;;;;;;34096:340;34155:13;34178:7;34186:2;34178:11;;;;;;;;;-1:-1:-1;;;;;34178:11:0;;-1:-1:-1;34178:11:0;34241:3;34245:2;34241:7;;;;;;;;;-1:-1:-1;;;;;34241:7:0;:21;34237:84;;34279:30;34298:3;34302:2;34298:7;;;;;;;;;-1:-1:-1;;;;;34279:18:0;;;;34298:7;;34279:18;:30::i;:::-;34343:4;34333:3;34337:2;34333:7;;;;;;;;:14;;-1:-1:-1;;;;;;34333:14:0;-1:-1:-1;;;;;34333:14:0;;;;;;34388:40;;:18;;34407:4;-1:-1:-1;;34388:18:0;:40::i;35683:705::-;35733:21;35769:7;;35765:445;;35793:22;;:::i;:::-;35830:20;;;35976:30;;;-1:-1:-1;;;35976:30:0;;;;33354:1;;32956:42;;35976:28;;:30;;;;;35830:14;;35976:30;;;;;;;;32956:42;35976:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35976:30:0;;-1:-1:-1;36021:11:0;36035:32;35976:30;36035:13;:3;36043:4;36035:7;:13::i;:::-;:17;;:32::i;:::-;36021:46;;36082:8;33266:5;36093:27;36115:4;;33266:5;36104:15;36093:6;:10;;:27;;;;:::i;:::-;:38;;;;;;36082:49;;32956:42;-1:-1:-1;;;;;36148:24:0;;36180:3;36185:7;36194:3;36148:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35765:445;;;;;36235:33;;;-1:-1:-1;;;36235:33:0;;36262:4;36235:33;;;;;;36222:10;;33103:42;;36235:18;;:33;;;;;;;;;;;;;;;33103:42;36235:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36235:33:0;;-1:-1:-1;36283:9:0;;36279:102;;36317:33;;;-1:-1:-1;;;36317:33:0;;32674:2;36317:33;;;;;;;;;;36345:4;36317:33;;;;;;32580:42;;36317:15;;:33;;;;;;;;;;;;;;-1:-1:-1;32580:42:0;36317:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36317:33:0;36309:60;;;;;-1:-1:-1;;;36309:60:0;;;;;;;;;;;;-1:-1:-1;;;36309:60:0;;;;;;;;;;;;;;15027:860;15451:23;15477:106;15519:4;15477:106;;;;;;;;;;;;;;;;;15485:5;-1:-1:-1;;;;;15477:27:0;;;:106;;;;;:::i;:::-;15598:17;;15451:132;;-1:-1:-1;15598:21:0;15594:286;;15771:10;15760:30;;;;;;;;;;;;;;;-1:-1:-1;15760:30:0;15734:134;;;;-1:-1:-1;;;15734:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4853:605;5020:12;5092:5;5067:21;:30;;5045:118;;;;-1:-1:-1;;;5045:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5182:18;5193:6;5182:10;:18::i;:::-;5174:60;;;;;-1:-1:-1;;;5174:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5308:12;5322:23;5349:6;-1:-1:-1;;;;;5349:11:0;5368:5;5375:4;5349:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5349:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:73;;;;5398:52;5416:7;5425:10;5437:12;5398:17;:52::i;:::-;5391:59;4853:605;-1:-1:-1;;;;;;;4853:605:0:o;18828:208::-;18880:4;18901:6;18897:20;;-1:-1:-1;18916:1:0;18909:8;;18897:20;18937:5;;;18941:1;18937;:5;:1;18961:5;;;;;:10;18953:56;;;;-1:-1:-1;;;18953:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19027:1;-1:-1:-1;18828:208:0;;;;;:::o;17970:167::-;18022:4;18048:5;;;18072:6;;;;18064:46;;;;;-1:-1:-1;;;18064:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;39918:447;40105:16;;;40119:1;40105:16;;;;;;;;40081:21;;40105:16;;;;;;;;;;-1:-1:-1;40105:16:0;40081:40;;40142:8;40132:4;40137:1;40132:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;40132:18:0;;;-1:-1:-1;;;;;40132:18:0;;;;;31924:42;40161:4;40166:1;40161:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;40161:14:0;;;-1:-1:-1;;;;;40161:14:0;;;;;40204:4;-1:-1:-1;;;;;40188:43:0;;40246:7;40268:1;40284:4;40311;40331:15;40188:169;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40188:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40188:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40188:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39918:447;;;;:::o;18420:149::-;18472:4;18502:1;18497;:6;;18489:49;;;;;-1:-1:-1;;;18489:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18556:5:0;;;18420:149::o;36708:741::-;36841:4;37177:10;;37173:250;;37294:6;37283:7;:17;37279:77;;-1:-1:-1;37328:12:0;37321:19;;37279:77;37405:6;37377:25;:7;37389:12;37377:11;:25::i;:::-;:34;;;;;;37370:41;;;;37173:250;-1:-1:-1;37440:1:0;36708:741;;;;;:::o;19514:144::-;19566:4;19595:1;19591;:5;19583:44;;;;;-1:-1:-1;;;19583:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19649:1;19645;:5;;;;;;;19514:144;-1:-1:-1;;;19514:144:0:o;683:441::-;1060:20;1108:8;;;683:441::o;7683:777::-;7833:12;7862:7;7858:595;;;-1:-1:-1;7893:10:0;7886:17;;7858:595;8007:17;;:21;8003:439;;8270:10;8264:17;8331:15;8318:10;8314:2;8310:19;8303:44;8218:148;8413:12;8406:20;;-1:-1:-1;;;8406:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://4f6224107447c3ce287c8fb3fbcc878091d9e1ed5d9e66b0eb856d265aa73764
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.