ETH Price: $2,433.87 (-2.20%)

Contract

0x994cC3a3fC0e1cB9A16f5eD06Cf52169c09ab480
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit144844662022-03-30 0:52:18923 days ago1648601538IN
0x994cC3a3...9c09ab480
0 ETH0.0339078734.47162673
Harvest144843842022-03-30 0:32:59923 days ago1648600379IN
0x994cC3a3...9c09ab480
0 ETH0.0411748233.3525741
Deposit144740392022-03-28 10:03:02924 days ago1648461782IN
0x994cC3a3...9c09ab480
0 ETH0.0313965431.94484912
Deposit144718962022-03-28 2:03:12924 days ago1648432992IN
0x994cC3a3...9c09ab480
0 ETH0.0352590435.79322576
Deposit144650912022-03-27 0:42:03926 days ago1648341723IN
0x994cC3a3...9c09ab480
0 ETH0.0581266358.32985821
Harvest144650362022-03-27 0:30:19926 days ago1648341019IN
0x994cC3a3...9c09ab480
0 ETH0.12874411104.28576249
Repay144458462022-03-24 0:39:47929 days ago1648082387IN
0x994cC3a3...9c09ab480
0 ETH0.0531548754.7395828
Report144458142022-03-24 0:33:26929 days ago1648082006IN
0x994cC3a3...9c09ab480
0 ETH0.0081694454.07295138
Claim Rewards144457922022-03-24 0:29:52929 days ago1648081792IN
0x994cC3a3...9c09ab480
0 ETH0.0321514175.8171784
Repay144265932022-03-21 0:46:53932 days ago1647823613IN
0x994cC3a3...9c09ab480
0 ETH0.0207553723.33335785
Harvest144265642022-03-21 0:40:31932 days ago1647823231IN
0x994cC3a3...9c09ab480
0 ETH0.0282037822.99558382
Repay144073822022-03-18 1:11:28934 days ago1647565888IN
0x994cC3a3...9c09ab480
0 ETH0.11321224127.977235
Harvest144072452022-03-18 0:39:08935 days ago1647563948IN
0x994cC3a3...9c09ab480
0 ETH0.0735968159.42732424
Repay143880782022-03-15 0:48:26938 days ago1647305306IN
0x994cC3a3...9c09ab480
0 ETH0.0215167724.30842861
Harvest143880082022-03-15 0:31:32938 days ago1647304292IN
0x994cC3a3...9c09ab480
0 ETH0.028020622.60586346
Deposit143688622022-03-12 1:02:01940 days ago1647046921IN
0x994cC3a3...9c09ab480
0 ETH0.0284148529.11635902
Harvest143687372022-03-12 0:33:31941 days ago1647045211IN
0x994cC3a3...9c09ab480
0 ETH0.0202993916.39102512
Deposit143648782022-03-11 10:04:55941 days ago1646993095IN
0x994cC3a3...9c09ab480
0 ETH0.0189703419.45483126
Repay143494022022-03-09 0:37:01944 days ago1646786221IN
0x994cC3a3...9c09ab480
0 ETH0.04565751.61293236
Harvest143493742022-03-09 0:30:08944 days ago1646785808IN
0x994cC3a3...9c09ab480
0 ETH0.0711312657.43590158
Deposit143301522022-03-06 0:40:42947 days ago1646527242IN
0x994cC3a3...9c09ab480
0 ETH0.0248434725.51536629
Harvest143301002022-03-06 0:29:32947 days ago1646526572IN
0x994cC3a3...9c09ab480
0 ETH0.0537546943.84773511
Deposit143156212022-03-03 18:19:57949 days ago1646331597IN
0x994cC3a3...9c09ab480
0 ETH0.0933744995.75820819
Repay143108372022-03-03 0:37:28950 days ago1646267848IN
0x994cC3a3...9c09ab480
0 ETH0.0357431440.27972527
Harvest143108032022-03-03 0:30:58950 days ago1646267458IN
0x994cC3a3...9c09ab480
0 ETH0.0452728834.87157114
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyConvexAlUsdDai

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

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 DepositZapAlUsd3Crv {
    // Curve.fi Factory USD Metapool v2
    function add_liquidity(
        address _pool,
        uint[4] calldata _amounts,
        uint _min_mint_amount
    ) external returns (uint);

    function remove_liquidity_one_coin(
        address _pool,
        uint _burn_amount,
        int128 _i,
        uint _min_amount
    ) external returns (uint);

    function calc_withdraw_one_coin(
        address _pool,
        uint _amount,
        int128 _i
    ) external view returns (uint);
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IFundManager {
    function token() external view returns (address);

    function borrow(uint amount) external returns (uint);

    function repay(uint amount) external returns (uint);

    function report(uint gain, uint loss) external;

    function getDebt(address strategy) external view returns (uint);
}

library SafeERC20 {
    using SafeMath for uint;
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        uint newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        uint newAllowance = token.allowance(address(this), spender).sub(
            value,
            "SafeERC20: decreased allowance below zero"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint a, uint b) internal pure returns (bool, uint) {
        uint c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint a, uint b) internal pure returns (bool, uint) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint a, uint b) internal pure returns (bool, uint) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint a, uint b) internal pure returns (bool, uint) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint a, uint b) internal pure returns (bool, uint) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint a, uint b) internal pure returns (uint) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint a, uint b) internal pure returns (uint) {
        if (a == 0) return 0;
        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

interface StableSwapAlUsd3Crv {
    function coins(uint _i) external view returns (address);

    function get_virtual_price() external view returns (uint);
}

abstract contract Strategy {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    event SetNextTimeLock(address nextTimeLock);
    event AcceptTimeLock(address timeLock);
    event SetAdmin(address admin);
    event Authorize(address addr, bool authorized);
    event SetTreasury(address treasury);
    event SetFundManager(address fundManager);

    event Deposit(uint amount, uint borrowed);
    event Repay(uint amount, uint repaid);
    event Withdraw(uint amount, uint withdrawn, uint loss);
    event ClaimRewards(uint profit);
    event Skim(uint total, uint debt, uint profit);
    event Report(uint gain, uint loss, uint free, uint total, uint debt);

    // Privilege - time lock >= admin >= authorized addresses
    address public timeLock;
    address public nextTimeLock;
    address public admin;
    address public treasury; // Profit is sent to this address

    // authorization other than time lock and admin
    mapping(address => bool) public authorized;

    IERC20 public immutable token;
    IFundManager public fundManager;

    // Performance fee sent to treasury
    uint public perfFee = 1000;
    uint private constant PERF_FEE_CAP = 2000; // Upper limit to performance fee
    uint internal constant PERF_FEE_MAX = 10000;

    bool public claimRewardsOnMigrate = true;

    constructor(
        address _token,
        address _fundManager,
        address _treasury
    ) {
        // Don't allow accidentally sending perf fee to 0 address
        require(_treasury != address(0), "treasury = 0 address");

        timeLock = msg.sender;
        admin = msg.sender;
        treasury = _treasury;

        require(
            IFundManager(_fundManager).token() == _token,
            "fund manager token != token"
        );

        fundManager = IFundManager(_fundManager);
        token = IERC20(_token);

        IERC20(_token).safeApprove(_fundManager, type(uint).max);
    }

    modifier onlyTimeLock() {
        require(msg.sender == timeLock, "!time lock");
        _;
    }

    modifier onlyTimeLockOrAdmin() {
        require(msg.sender == timeLock || msg.sender == admin, "!auth");
        _;
    }

    modifier onlyAuthorized() {
        require(
            msg.sender == timeLock || msg.sender == admin || authorized[msg.sender],
            "!auth"
        );
        _;
    }

    modifier onlyFundManager() {
        require(msg.sender == address(fundManager), "!fund manager");
        _;
    }

    /*
    @notice Set next time lock
    @param _nextTimeLock Address of next time lock
    @dev nextTimeLock can become timeLock by calling acceptTimeLock()
    */
    function setNextTimeLock(address _nextTimeLock) external onlyTimeLock {
        // Allow next time lock to be zero address (cancel next time lock)
        nextTimeLock = _nextTimeLock;
        emit SetNextTimeLock(_nextTimeLock);
    }

    /*
    @notice Set timeLock to msg.sender
    @dev msg.sender must be nextTimeLock
    */
    function acceptTimeLock() external {
        require(msg.sender == nextTimeLock, "!next time lock");
        timeLock = msg.sender;
        nextTimeLock = address(0);
        emit AcceptTimeLock(msg.sender);
    }

    /*
    @notice Set admin
    @param _admin Address of admin
    */
    function setAdmin(address _admin) external onlyTimeLockOrAdmin {
        require(_admin != address(0), "admin = 0 address");
        admin = _admin;
        emit SetAdmin(_admin);
    }

    /*
    @notice Set authorization
    @param _addr Address to authorize
    @param _authorized Boolean
    */
    function authorize(address _addr, bool _authorized) external onlyTimeLockOrAdmin {
        require(_addr != address(0), "addr = 0 address");
        authorized[_addr] = _authorized;
        emit Authorize(_addr, _authorized);
    }

    /*
    @notice Set treasury
    @param _treasury Address of treasury
    */
    function setTreasury(address _treasury) external onlyTimeLockOrAdmin {
        // Don't allow accidentally sending perf fee to 0 address
        require(_treasury != address(0), "treasury = 0 address");
        treasury = _treasury;
        emit SetTreasury(_treasury);
    }

    /*
    @notice Set performance fee
    @param _fee Performance fee
    */
    function setPerfFee(uint _fee) external onlyTimeLockOrAdmin {
        require(_fee <= PERF_FEE_CAP, "fee > cap");
        perfFee = _fee;
    }

    function setFundManager(address _fundManager) external onlyTimeLock {
        if (address(fundManager) != address(0)) {
            token.safeApprove(address(fundManager), 0);
        }

        require(
            IFundManager(_fundManager).token() == address(token),
            "new fund manager token != token"
        );

        fundManager = IFundManager(_fundManager);
        token.safeApprove(_fundManager, type(uint).max);

        emit SetFundManager(_fundManager);
    }

    /*
    @notice Set `claimRewardsOnMigrate`. If `false` skip call to `claimRewards`
            when `migrate` is called.
    @param _claimRewards Boolean to call or skip call to `claimRewards`
    */
    function setClaimRewardsOnMigrate(bool _claimRewards) external onlyTimeLockOrAdmin {
        claimRewardsOnMigrate = _claimRewards;
    }

    /*
    @notice Transfer funds from `_from` address. Used for migration.
    @param _from Address to transfer token from
    @param _amount Amount of token to transfer
    */
    function transferTokenFrom(address _from, uint _amount) external onlyAuthorized {
        token.safeTransferFrom(_from, address(this), _amount);
    }

    /*
    @notice Returns approximate amount of token locked in this contract
    @dev Output may vary depending on price pulled from external DeFi contracts
    */
    function totalAssets() external view virtual returns (uint);

    /*
    @notice Deposit into strategy
    @param _amount Amount of token to deposit from fund manager
    @param _min Minimum amount borrowed
    */
    function deposit(uint _amount, uint _min) external virtual;

    /*
    @notice Withdraw token from this contract
    @dev Only callable by fund manager
    @dev Returns current loss = debt to fund manager - total assets
    */
    function withdraw(uint _amount) external virtual returns (uint);

    /*
    @notice Repay fund manager
    @param _amount Amount of token to repay to fund manager
    @param _min Minimum amount repaid
    @dev Call report after this to report any loss
    */
    function repay(uint _amount, uint _min) external virtual;

    /*
    @notice Claim any reward tokens, sell for token
    @param _minProfit Minumum amount of token to gain from selling rewards
    */
    function claimRewards(uint _minProfit) external virtual;

    /*
    @notice Free up any profit over debt
    */
    function skim() external virtual;

    /*
    @notice Report gain or loss back to fund manager
    @param _minTotal Minimum value of total assets.
               Used to protect against price manipulation.
    @param _maxTotal Maximum value of total assets Used
               Used to protect against price manipulation.  
    */
    function report(uint _minTotal, uint _maxTotal) external virtual;

    /*
    @notice Claim rewards, skim and report
    @param _minProfit Minumum amount of token to gain from selling rewards
    @param _minTotal Minimum value of total assets.
               Used to protect against price manipulation.
    @param _maxTotal Maximum value of total assets Used
               Used to protect against price manipulation.  
    */
    function harvest(
        uint _minProfit,
        uint _minTotal,
        uint _maxTotal
    ) external virtual;

    /*
    @notice Migrate to new version of this strategy
    @param _strategy Address of new strategy
    @dev Only callable by fund manager
    */
    function migrate(address _strategy) external virtual;

    /*
    @notice Transfer token accidentally sent here back to admin
    @param _token Address of token to transfer
    */
    function sweep(address _token) external virtual;
}

contract StrategyConvexAlUsd is Strategy {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    // Uniswap and Sushiswap //
    // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    uint private constant NUM_REWARDS = 3;
    // address of DEX (uniswap or sushiswap) to use for selling reward tokens
    // CRV, CVX, ALCX
    address[NUM_REWARDS] public dex;

    address private constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52;
    address private constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B;
    address private constant ALCX = 0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF;

    // Solc 0.7 cannot create constant arrays
    address[NUM_REWARDS] private REWARDS = [CRV, CVX, ALCX];

    // Convex //
    Booster private constant BOOSTER =
        Booster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);
    // pool id
    uint private constant PID = 36;
    BaseRewardPool private constant REWARD =
        BaseRewardPool(0x02E2151D4F351881017ABdF2DD2b51150841d5B3);
    bool public shouldClaimExtras = true;

    // Curve //
    // DepositZap alUSD + 3CRV
    DepositZapAlUsd3Crv private constant ZAP =
        DepositZapAlUsd3Crv(0xA79828DF1850E8a3A3064576f380D90aECDD3359);
    // StableSwap alUSD + 3CRV (meta pool)
    StableSwapAlUsd3Crv private constant CURVE_POOL =
        StableSwapAlUsd3Crv(0x43b4FdFD4Ff969587185cDB6f0BD875c5Fc83f8c);
    // LP token for curve pool (same contract as CURVE_POOL)
    IERC20 private constant CURVE_LP =
        IERC20(0x43b4FdFD4Ff969587185cDB6f0BD875c5Fc83f8c);

    // prevent slippage from deposit / withdraw
    uint public slip = 100;
    uint private constant SLIP_MAX = 10000;

    /*
    0 - alUSD
    1 - DAI
    2 - USDC
    3 - USDT
    */
    // multipliers to normalize token decimals to 10 ** 18
    uint[4] private MULS = [1, 1, 1e12, 1e12];
    uint private immutable MUL; // multiplier of token
    uint private immutable INDEX; // index of token

    // DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F
    // USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
    // USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7

    constructor(
        address _token,
        address _fundManager,
        address _treasury,
        uint _index
    ) Strategy(_token, _fundManager, _treasury) {
        // disable alUSD
        require(_index > 0, "index = 0");
        INDEX = _index;
        MUL = MULS[_index];

        (address lptoken, , , address crvRewards, , ) = BOOSTER.poolInfo(PID);
        require(address(CURVE_LP) == lptoken, "curve pool lp != pool info lp");
        require(address(REWARD) == crvRewards, "reward != pool info reward");

        IERC20(_token).safeApprove(address(ZAP), type(uint).max);
        // deposit into BOOSTER
        CURVE_LP.safeApprove(address(BOOSTER), type(uint).max);
        // withdraw from ZAP
        CURVE_LP.safeApprove(address(ZAP), type(uint).max);

        _setDex(0, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CRV - sushiswap
        _setDex(1, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CVX - sushiswap
        _setDex(2, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // ALCX - 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 (ALCX) from Convex
    function setShouldClaimExtras(bool _shouldClaimExtras) external onlyAuthorized {
        shouldClaimExtras = _shouldClaimExtras;
    }

    function _totalAssets() private view returns (uint total) {
        /*
        s0 = shares in meta pool
        p0 = price per share of meta pool
        s1 = shares in base pool
        p1 = price per share of base pool
        a = amount of tokens (DAI, USDC, USDT)

        s1 = s0 * p0
        a = s1 * p1

        a = s0 * p0 * p1
        */
        // amount of Curve LP tokens in Convex
        uint lpBal = REWARD.balanceOf(address(this));
        // amount of alUSD or DAI, USDC, USDT converted from Curve LP
        // BASE_POOL.get_virtual_price is included in CURVE_POOL.get_virtual_price
        // so CURVE_POOL.get_virtual_price = p0 * p1
        total = lpBal.mul(CURVE_POOL.get_virtual_price()) / (MUL * 1e18);
        total = total.add(token.balanceOf(address(this)));
    }

    function totalAssets() external view override returns (uint) {
        return _totalAssets();
    }

    function _deposit() private {
        uint bal = token.balanceOf(address(this));
        if (bal > 0) {
            uint[4] memory amounts;
            amounts[INDEX] = bal;
            /*
            shares = token amount * multiplier * 1e18 / price per share
            */
            uint pricePerShare = CURVE_POOL.get_virtual_price();
            uint shares = bal.mul(MUL).mul(1e18).div(pricePerShare);
            uint min = shares.mul(SLIP_MAX - slip) / SLIP_MAX;

            ZAP.add_liquidity(address(CURVE_POOL), amounts, min);
        }

        uint lpBal = CURVE_LP.balanceOf(address(this));
        if (lpBal > 0) {
            require(BOOSTER.deposit(PID, lpBal, true), "deposit failed");
        }
    }

    function deposit(uint _amount, uint _min) external override onlyAuthorized {
        require(_amount > 0, "deposit = 0");

        uint borrowed = fundManager.borrow(_amount);
        require(borrowed >= _min, "borrowed < min");

        _deposit();
        emit Deposit(_amount, borrowed);
    }

    function _calcSharesToWithdraw(
        uint _amount,
        uint _total,
        uint _totalShares
    ) private pure returns (uint) {
        /*
        calculate shares to withdraw

        a = amount of token to withdraw
        T = total amount of token locked in external liquidity pool
        s = shares to withdraw
        P = total shares deposited into external liquidity pool

        a / T = s / P
        s = a / T * P
        */
        if (_total > 0) {
            // avoid rounding errors and cap shares to be <= total shares
            if (_amount >= _total) {
                return _totalShares;
            }
            return _amount.mul(_totalShares) / _total;
        }
        return 0;
    }

    function _withdraw(uint _amount) private returns (uint) {
        uint bal = token.balanceOf(address(this));
        if (_amount <= bal) {
            return _amount;
        }

        uint total = _totalAssets();

        if (_amount >= total) {
            _amount = total;
        }

        uint need = _amount - bal;
        uint totalShares = REWARD.balanceOf(address(this));
        // total assets is always >= bal
        uint shares = _calcSharesToWithdraw(need, total - bal, totalShares);

        // withdraw from Convex
        if (shares > 0) {
            // true = claim CRV and ALCX
            require(REWARD.withdrawAndUnwrap(shares, false), "reward withdraw failed");
        }

        // withdraw from Curve
        uint lpBal = CURVE_LP.balanceOf(address(this));
        if (shares > lpBal) {
            shares = lpBal;
        }

        if (shares > 0) {
            uint min = need.mul(SLIP_MAX - slip) / SLIP_MAX;
            ZAP.remove_liquidity_one_coin(
                address(CURVE_POOL),
                shares,
                int128(INDEX),
                min
            );
        }

        uint balAfter = token.balanceOf(address(this));
        if (balAfter < _amount) {
            return balAfter;
        }
        // balAfter >= _amount >= total
        // requested to withdraw all so return balAfter
        if (_amount >= total) {
            return balAfter;
        }
        // requested withdraw < all
        return _amount;
    }

    function withdraw(uint _amount)
        external
        override
        onlyFundManager
        returns (uint loss)
    {
        require(_amount > 0, "withdraw = 0");

        // availabe <= _amount
        uint available = _withdraw(_amount);

        uint debt = fundManager.getDebt(address(this));
        uint total = _totalAssets();
        if (debt > total) {
            loss = debt - total;
        }

        if (available > 0) {
            token.safeTransfer(msg.sender, available);
        }

        emit Withdraw(_amount, available, loss);
    }

    function repay(uint _amount, uint _min) external override onlyAuthorized {
        require(_amount > 0, "repay = 0");
        // availabe <= _amount
        uint available = _withdraw(_amount);
        uint repaid = fundManager.repay(available);
        require(repaid >= _min, "repaid < min");

        emit Repay(_amount, repaid);
    }

    /*
    @dev Uniswap fails with zero address so no check is necessary here
    */
    function _swap(
        address _dex,
        address _tokenIn,
        address _tokenOut,
        uint _amount
    ) private {
        // create dynamic array with 3 elements
        address[] memory path = new address[](3);
        path[0] = _tokenIn;
        path[1] = WETH;
        path[2] = _tokenOut;

        UniswapV2Router(_dex).swapExactTokensForTokens(
            _amount,
            1,
            path,
            address(this),
            block.timestamp
        );
    }

    function _claimRewards(uint _minProfit) private {
        // calculate profit = balance of token after - balance of token before
        uint diff = token.balanceOf(address(this));

        require(
            REWARD.getReward(address(this), shouldClaimExtras),
            "get reward failed"
        );

        for (uint i = 0; i < NUM_REWARDS; i++) {
            uint rewardBal = IERC20(REWARDS[i]).balanceOf(address(this));
            if (rewardBal > 0) {
                _swap(dex[i], REWARDS[i], address(token), rewardBal);
            }
        }

        diff = token.balanceOf(address(this)) - diff;
        require(diff >= _minProfit, "profit < min");

        // transfer performance fee to treasury
        if (diff > 0) {
            uint fee = diff.mul(perfFee) / PERF_FEE_MAX;
            if (fee > 0) {
                token.safeTransfer(treasury, fee);
                diff = diff.sub(fee);
            }
        }

        emit ClaimRewards(diff);
    }

    function claimRewards(uint _minProfit) external override onlyAuthorized {
        _claimRewards(_minProfit);
    }

    function _skim() private {
        uint total = _totalAssets();
        uint debt = fundManager.getDebt(address(this));
        require(total > debt, "total <= debt");

        uint profit = total - debt;
        // reassign to actual amount withdrawn
        profit = _withdraw(profit);

        emit Skim(total, debt, profit);
    }

    function skim() external override onlyAuthorized {
        _skim();
    }

    function _report(uint _minTotal, uint _maxTotal) private {
        uint total = _totalAssets();
        require(total >= _minTotal, "total < min");
        require(total <= _maxTotal, "total > max");

        uint gain = 0;
        uint loss = 0;
        uint free = 0; // balance of token
        uint debt = fundManager.getDebt(address(this));
        if (total > debt) {
            gain = total - debt;

            free = token.balanceOf(address(this));
            if (gain > free) {
                gain = free;
            }
        } else {
            loss = debt - total;
        }

        if (gain > 0 || loss > 0) {
            fundManager.report(gain, loss);
        }

        emit Report(gain, loss, free, total, debt);
    }

    function report(uint _minTotal, uint _maxTotal) external override onlyAuthorized {
        _report(_minTotal, _maxTotal);
    }

    function harvest(
        uint _minProfit,
        uint _minTotal,
        uint _maxTotal
    ) external override onlyAuthorized {
        _claimRewards(_minProfit);
        _skim();
        _report(_minTotal, _maxTotal);
    }

    function migrate(address _strategy) external override onlyFundManager {
        Strategy strat = Strategy(_strategy);
        require(address(strat.token()) == address(token), "strategy token != token");
        require(
            address(strat.fundManager()) == address(fundManager),
            "strategy fund manager != fund manager"
        );

        if (claimRewardsOnMigrate) {
            _claimRewards(1);
        }

        uint bal = _withdraw(type(uint).max);
        token.safeApprove(_strategy, bal);
        strat.transferTokenFrom(address(this), bal);
    }

    /*
    @notice Transfer token accidentally sent here to admin
    @param _token Address of token to transfer
    */
    function sweep(address _token) external override onlyAuthorized {
        require(_token != address(token), "protected token");
        for (uint i = 0; i < NUM_REWARDS; i++) {
            require(_token != REWARDS[i], "protected token");
        }
        IERC20(_token).safeTransfer(admin, IERC20(_token).balanceOf(address(this)));
    }
}

interface UniswapV2Router {
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

contract StrategyConvexAlUsdDai is StrategyConvexAlUsd {
    constructor(address _fundManager, address _treasury)
        StrategyConvexAlUsd(
            0x6B175474E89094C44Da98b954EedeAC495271d0F,
            _fundManager,
            _treasury,
            1
        )
    {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"timeLock","type":"address"}],"name":"AcceptTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"Authorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaid","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gain","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"free","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"}],"name":"Report","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundManager","type":"address"}],"name":"SetFundManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nextTimeLock","type":"address"}],"name":"SetNextTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"Skim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsOnMigrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundManager","outputs":[{"internalType":"contract IFundManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"},{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextTimeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"},{"internalType":"address","name":"_dex","type":"address"}],"name":"setDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"}],"name":"setFundManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextTimeLock","type":"address"}],"name":"setNextTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPerfFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimExtras","type":"bool"}],"name":"setShouldClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slip","type":"uint256"}],"name":"setSlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6103e86006556007805460ff1916600117905561014060405273d533a949740bb3306d119cc777fa900ba034cd5260e0908152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6101005273dbdb4d16eda451d0503b854cf79d55697f90c8df610120526200007490600b90600362000a95565b50600e805460ff191660019081179091556064600f5560408051608081018252828152602081019290925264e8d4a510009082018190526060820152620000c090601090600462000af2565b50348015620000ce57600080fd5b50604051620045773803806200457783398181016040526040811015620000f457600080fd5b508051602090910151736b175474e89094c44da98b954eedeac495271d0f828260018383836001600160a01b03811662000175576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b158015620001eb57600080fd5b505afa15801562000200573d6000803e3d6000fd5b505050506040513d60208110156200021757600080fd5b50516001600160a01b03161462000275576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b031916608052620002c490841683600019620005c9602090811b62001c9617901c565b5050506000811162000309576040805162461bcd60e51b81526020600482015260096024820152680696e646578203d20360bc1b604482015290519081900360640190fd5b60c0819052601081600481106200031c57fe5b015460a05260408051631526fe2760e01b81526024600482018190529151600092839273f403c135812408bfbe8713b5a23a04b3d48aae3192631526fe27928281019260c0929190829003018186803b1580156200037957600080fd5b505afa1580156200038e573d6000803e3d6000fd5b505050506040513d60c0811015620003a557600080fd5b50805160609091015190925090507343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b0383161462000425576040805162461bcd60e51b815260206004820152601d60248201527f637572766520706f6f6c206c7020213d20706f6f6c20696e666f206c70000000604482015290519081900360640190fd5b7302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b0382161462000497576040805162461bcd60e51b815260206004820152601a60248201527f72657761726420213d20706f6f6c20696e666f20726577617264000000000000604482015290519081900360640190fd5b620004d273a79828df1850e8a3a3064576f380d90aecdd3359600019886001600160a01b0316620005c960201b62001c96179092919060201c565b620005157343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c73f403c135812408bfbe8713b5a23a04b3d48aae31600019620005c9602090811b62001c9617901c565b620005587343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c73a79828df1850e8a3a3064576f380d90aecdd3359600019620005c9602090811b62001c9617901c565b62000579600073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b6200059a600173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b620005bb600273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b505050505050505062000b43565b80158062000653575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200062357600080fd5b505afa15801562000638573d6000803e3d6000fd5b505050506040513d60208110156200064f57600080fd5b5051155b620006905760405162461bcd60e51b8152600401808060200182810382526036815260200180620045416036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620006e8918591620007a716565b505050565b6000600b8360038110620006fd57fe5b01546001600160a01b031690506000600884600381106200071a57fe5b01546001600160a01b031614620007605762000760600884600381106200073d57fe5b01546001600160a01b0383811691166000620005c9602090811b62001c9617901c565b81600884600381106200076f57fe5b0180546001600160a01b0319166001600160a01b03928316179055620006e890821683600019620005c9602090811b62001c9617901c565b600062000803826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200086360201b62001da9179092919060201c565b805190915015620006e8578080602001905160208110156200082457600080fd5b5051620006e85760405162461bcd60e51b815260040180806020018281038252602a81526020018062004517602a913960400191505060405180910390fd5b60606200087484846000856200087e565b90505b9392505050565b606082471015620008c15760405162461bcd60e51b8152600401808060200182810382526026815260200180620044f16026913960400191505060405180910390fd5b620008cc85620009e5565b6200091e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106200095e5780518252601f1990920191602091820191016200093d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620009c2576040519150601f19603f3d011682016040523d82523d6000602084013e620009c7565b606091505b509092509050620009da828286620009eb565b979650505050505050565b3b151590565b60608315620009fc57508162000877565b82511562000a0d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a5957818101518382015260200162000a3f565b50505050905090810190601f16801562000a875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b826003810192821562000ae0579160200282015b8281111562000ae057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000aa9565b5062000aee92915062000b2c565b5090565b826004810192821562000ae0579160200282015b8281111562000ae0578251829064ffffffffff1690559160200191906001019062000b06565b5b8082111562000aee576000815560010162000b2d565b60805160601c60a05160c05161391f62000bd260003980612b455280612e07525080611eb45280612ece52508061062052806108b15280610b355280610b615280610c6f5280610fe8528061156552806117365280611c745280611f575280611fff528061223a528061226c528061238b52806126ba52806128225280612beb5280612d5c525061391f6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b6107a0565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b50356107af565b6102316004803603604081101561028057600080fd5b506001600160a01b03813516906020013561082e565b610231600480360360208110156102ac57600080fd5b50356108dd565b61023161099c565b610231610a1c565b61023b610ac1565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610ac7565b61030e6004803603602081101561030757600080fd5b5035610cd7565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610cf7565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d8d565b61023b6004803603602081101561039757600080fd5b5035610e9b565b610231600480360360208110156103b457600080fd5b50351515611057565b610231600480360360208110156103d357600080fd5b503515156110c6565b61023b61114f565b6103ec611155565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b031661115e565b61030e6111fe565b61030e61120d565b6102316004803603602081101561044c57600080fd5b50356001600160a01b031661121c565b6102316004803603602081101561047257600080fd5b503561131b565b6102316004803603604081101561048f57600080fd5b50803590602001356113bf565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b031661143f565b61030e6114e2565b6103ec6114f1565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b03166114fa565b6102316004803603602081101561051457600080fd5b50356001600160a01b031661150f565b61030e6117c8565b6102316004803603604081101561054257600080fd5b50803590602001356117d7565b6102316004803603604081101561056557600080fd5b508035906020013561199f565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611b61565b61030e611c63565b61030e611c72565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415610697576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60005b600381101561070c57600b81600381106106b057fe5b01546001600160a01b0383811691161415610704576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60010161069a565b50600254604080516370a0823160e01b8152306004820152905161079d926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d602081101561078a57600080fd5b50516001600160a01b0384169190611dc2565b50565b60006107aa611e14565b905090565b6000546001600160a01b03163314806107d257506002546001600160a01b031633145b806107ec57503360009081526004602052604090205460ff165b610825576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61079d81611ffb565b6000546001600160a01b031633148061085157506002546001600160a01b031633145b8061086b57503360009081526004602052604090205460ff165b6108a4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168330846123fa565b5050565b6000546001600160a01b031633148061090057506002546001600160a01b031633145b8061091a57503360009081526004602052604090205460ff165b610953576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610997576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b03163314806109bf57506002546001600160a01b031633145b806109d957503360009081526004602052604090205460ff165b610a12576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a1a61245a565b565b6001546001600160a01b03163314610a6d576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610b5f57600554610b5f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691166000611c96565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d6020811015610bec57600080fd5b50516001600160a01b031614610c49576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c98907f00000000000000000000000000000000000000000000000000000000000000001682600019611c96565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610ce757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d1a57506002546001600160a01b031633145b80610d3457503360009081526004602052604090205460ff165b610d6d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d7683611ffb565b610d7e61245a565b610d88828261257c565b505050565b6000546001600160a01b0316331480610db057506002546001600160a01b031633145b610de9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e37576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610eed576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f31576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f3c8361281d565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d6020811015610fb757600080fd5b505190506000610fc5611e14565b905080821115610fd55780820393505b821561100f5761100f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385611dc2565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061107a57506002546001600160a01b031633145b6110b3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110e957506002546001600160a01b031633145b8061110357503360009081526004602052604090205460ff165b61113c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b031633146111aa576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061123f57506002546001600160a01b031633145b611278576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061133e57506002546001600160a01b031633145b611377576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d08111156113ba576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113e257506002546001600160a01b031633145b806113fc57503360009081526004602052604090205460ff165b611435576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d9828261257c565b6000546001600160a01b0316331461148b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114d8576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108d98282612cbf565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b0316331461155e576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50516001600160a01b03161461164d576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b50516001600160a01b0316146117055760405162461bcd60e51b81526004018080602001828103825260258152602001806138446025913960400191505060405180910390fd5b60075460ff161561171a5761171a6001611ffb565b600061172760001961281d565b905061175d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611c96565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b03163314806117fa57506002546001600160a01b031633145b8061181457503360009081526004602052604090205460ff165b61184d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161188e576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006118998361281d565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b505190508281101561195e576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806119c257506002546001600160a01b031633145b806119dc57503360009081526004602052604090205460ff165b611a15576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611a58576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611aa557600080fd5b505af1158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b5051905081811015611b19576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611b21612d58565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b8457506002546001600160a01b031633145b611bbd576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611c0f576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580611d1c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6020811015611d1857600080fd5b5051155b611d575760405162461bcd60e51b81526004018080602001828103825260368152602001806138b46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d8890849061314f565b6060611db88484600085613200565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8890849061314f565b604080516370a0823160e01b8152306004820152905160009182917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b158015611e6a57600080fd5b505afa158015611e7e573d6000803e3d6000fd5b505050506040513d6020811015611e9457600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000000291611f48917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c9163bb7b8b8091600480820192602092909190829003018186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d6020811015611f3f57600080fd5b5051839061335b565b81611f4f57fe5b049150611ff57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505183906133bd565b91505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b5051600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507302e2151d4f351881017abdf2dd2b51150841d5b391637050ccd9916044808201926020929091908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505161216c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612268576000600b826003811061218757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b50519050801561225f5761225f6008836003811061221557fe5b01546001600160a01b0316600b846003811061222d57fe5b01546001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084613417565b5060010161216f565b50807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b50510390508181101561234a576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156123c357600061271061236a6006548461335b90919063ffffffff16565b8161237157fe5b04905080156123c1576003546123b4906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611dc2565b6123be8282613657565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261245490859061314f565b50505050565b6000612464611e14565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b1580156124b557600080fd5b505afa1580156124c9573d6000803e3d6000fd5b505050506040513d60208110156124df57600080fd5b50519050808211612527576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036125338161281d565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612586611e14565b9050828110156125cb576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561260e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b505190508085111561273f57604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561270057600080fd5b505afa158015612714573d6000803e3d6000fd5b505050506040513d602081101561272a57600080fd5b505191508184111561273a578193505b612745565b84810392505b60008411806127545750600083115b156127c6576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b505190508083116128cb5782915050612cba565b60006128d5611e14565b90508084106128e2578093505b604080516370a0823160e01b81523060048201529051838603916000917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b50519050600061297783868603846136b4565b90508015612a5a577302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d6020811015612a0e57600080fd5b5051612a5a576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b5051905080821115612ae9578091505b8115612be7576000612710612b0d600f54612710038761335b90919063ffffffff16565b81612b1457fe5b604080516314f6943160e11b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820152602481018790527f0000000000000000000000000000000000000000000000000000000000000000600f0b60448201529290910460648301819052905190925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848083019260209291908290030181600087803b158015612bb957600080fd5b505af1158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5050505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c5657600080fd5b505afa158015612c6a573d6000803e3d6000fd5b505050506040513d6020811015612c8057600080fd5b5051905088811015612c9a579650612cba95505050505050565b858910612caf579650612cba95505050505050565b889750505050505050505b919050565b6000600b8360038110612cce57fe5b01546001600160a01b03169050600060088460038110612cea57fe5b01546001600160a01b031614612d2057612d2060088460038110612d0a57fe5b01546001600160a01b0383811691166000611c96565b8160088460038110612d2e57fe5b0180546001600160a01b0319166001600160a01b03928316179055610d8890821683600019611c96565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dc757600080fd5b505afa158015612ddb573d6000803e3d6000fd5b505050506040513d6020811015612df157600080fd5b505190508015612ff657612e036137ff565b81817f000000000000000000000000000000000000000000000000000000000000000060048110612e3057fe5b60200201818152505060007343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b505190506000612efe82612ef8670de0b6b3a7640000612ef2887f000000000000000000000000000000000000000000000000000000000000000061335b565b9061335b565b906136ee565b90506000612710612f1e600f54612710038461335b90919063ffffffff16565b81612f2557fe5b60405163384e03db60e01b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820181815293909204935073a79828df1850e8a3a3064576f380d90aecdd33599263384e03db92918891869160240183608080838360005b83811015612f99578181015183820152602001612f81565b505050509050018281526020019350505050602060405180830381600087803b158015612fc557600080fd5b505af1158015612fd9573d6000803e3d6000fd5b505050506040513d6020811015612fef57600080fd5b5050505050505b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b15801561304b57600080fd5b505afa15801561305f573d6000803e3d6000fd5b505050506040513d602081101561307557600080fd5b5051905080156108d957604080516321d0683360e11b8152602460048201819052810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d602081101561310b57600080fd5b50516108d9576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006131a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611da99092919063ffffffff16565b805190915015610d88578080602001905160208110156131c357600080fd5b5051610d885760405162461bcd60e51b815260040180806020018281038252602a81526020018061388a602a913960400191505060405180910390fd5b6060824710156132415760405162461bcd60e51b815260040180806020018281038252602681526020018061381e6026913960400191505060405180910390fd5b61324a85613755565b61329b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106132d95780518252601f1990920191602091820191016132ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b509150915061335082828661375b565b979650505050505050565b60008261336a575060006133b7565b8282028284828161337757fe5b04146133b45760405162461bcd60e51b81526004018080602001828103825260218152602001806138696021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156133b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061344857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061348a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816002815181106134b857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561355d578181015183820152602001613545565b505050509050019650505050505050600060405180830381600087803b15801561358657600080fd5b505af115801561359a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135c357600080fd5b81019080805160405193929190846401000000008211156135e357600080fd5b9083019060208201858111156135f857600080fd5b825186602082028301116401000000008211171561361557600080fd5b82525081516020918201928201910280838360005b8381101561364257818101518382015260200161362a565b50505050905001604052505050505050505050565b6000828211156136ae576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136e4578284106136ca575080611dbb565b826136d5858461335b565b816136dc57fe5b049050611dbb565b5060009392505050565b6000808211613744576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161374d57fe5b049392505050565b3b151590565b6060831561376a575081611dbb565b82511561377a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137c45781810151838201526020016137ac565b50505050905090810190601f1680156137f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220d4e1fce61da3f06c658d8f1eebda1f16e590a6b524e3579fb3a177fd464f4f9964736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b6107a0565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b50356107af565b6102316004803603604081101561028057600080fd5b506001600160a01b03813516906020013561082e565b610231600480360360208110156102ac57600080fd5b50356108dd565b61023161099c565b610231610a1c565b61023b610ac1565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610ac7565b61030e6004803603602081101561030757600080fd5b5035610cd7565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610cf7565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d8d565b61023b6004803603602081101561039757600080fd5b5035610e9b565b610231600480360360208110156103b457600080fd5b50351515611057565b610231600480360360208110156103d357600080fd5b503515156110c6565b61023b61114f565b6103ec611155565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b031661115e565b61030e6111fe565b61030e61120d565b6102316004803603602081101561044c57600080fd5b50356001600160a01b031661121c565b6102316004803603602081101561047257600080fd5b503561131b565b6102316004803603604081101561048f57600080fd5b50803590602001356113bf565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b031661143f565b61030e6114e2565b6103ec6114f1565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b03166114fa565b6102316004803603602081101561051457600080fd5b50356001600160a01b031661150f565b61030e6117c8565b6102316004803603604081101561054257600080fd5b50803590602001356117d7565b6102316004803603604081101561056557600080fd5b508035906020013561199f565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611b61565b61030e611c63565b61030e611c72565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b03161415610697576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60005b600381101561070c57600b81600381106106b057fe5b01546001600160a01b0383811691161415610704576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60010161069a565b50600254604080516370a0823160e01b8152306004820152905161079d926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d602081101561078a57600080fd5b50516001600160a01b0384169190611dc2565b50565b60006107aa611e14565b905090565b6000546001600160a01b03163314806107d257506002546001600160a01b031633145b806107ec57503360009081526004602052604090205460ff165b610825576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61079d81611ffb565b6000546001600160a01b031633148061085157506002546001600160a01b031633145b8061086b57503360009081526004602052604090205460ff165b6108a4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d96001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f168330846123fa565b5050565b6000546001600160a01b031633148061090057506002546001600160a01b031633145b8061091a57503360009081526004602052604090205460ff165b610953576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610997576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b03163314806109bf57506002546001600160a01b031633145b806109d957503360009081526004602052604090205460ff165b610a12576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a1a61245a565b565b6001546001600160a01b03163314610a6d576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610b5f57600554610b5f906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f811691166000611c96565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d6020811015610bec57600080fd5b50516001600160a01b031614610c49576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c98907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1682600019611c96565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610ce757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d1a57506002546001600160a01b031633145b80610d3457503360009081526004602052604090205460ff165b610d6d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d7683611ffb565b610d7e61245a565b610d88828261257c565b505050565b6000546001600160a01b0316331480610db057506002546001600160a01b031633145b610de9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e37576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610eed576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f31576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f3c8361281d565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d6020811015610fb757600080fd5b505190506000610fc5611e14565b905080821115610fd55780820393505b821561100f5761100f6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163385611dc2565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061107a57506002546001600160a01b031633145b6110b3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110e957506002546001600160a01b031633145b8061110357503360009081526004602052604090205460ff165b61113c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b031633146111aa576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061123f57506002546001600160a01b031633145b611278576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061133e57506002546001600160a01b031633145b611377576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d08111156113ba576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113e257506002546001600160a01b031633145b806113fc57503360009081526004602052604090205460ff165b611435576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d9828261257c565b6000546001600160a01b0316331461148b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114d8576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108d98282612cbf565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b0316331461155e576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50516001600160a01b03161461164d576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b50516001600160a01b0316146117055760405162461bcd60e51b81526004018080602001828103825260258152602001806138446025913960400191505060405180910390fd5b60075460ff161561171a5761171a6001611ffb565b600061172760001961281d565b905061175d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f168483611c96565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b03163314806117fa57506002546001600160a01b031633145b8061181457503360009081526004602052604090205460ff165b61184d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161188e576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006118998361281d565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b505190508281101561195e576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806119c257506002546001600160a01b031633145b806119dc57503360009081526004602052604090205460ff165b611a15576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611a58576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611aa557600080fd5b505af1158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b5051905081811015611b19576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611b21612d58565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b8457506002546001600160a01b031633145b611bbd576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611c0f576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b801580611d1c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6020811015611d1857600080fd5b5051155b611d575760405162461bcd60e51b81526004018080602001828103825260368152602001806138b46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d8890849061314f565b6060611db88484600085613200565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8890849061314f565b604080516370a0823160e01b8152306004820152905160009182917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b158015611e6a57600080fd5b505afa158015611e7e573d6000803e3d6000fd5b505050506040513d6020811015611e9457600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000010291611f48917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c9163bb7b8b8091600480820192602092909190829003018186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d6020811015611f3f57600080fd5b5051839061335b565b81611f4f57fe5b049150611ff57f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505183906133bd565b91505090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b5051600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507302e2151d4f351881017abdf2dd2b51150841d5b391637050ccd9916044808201926020929091908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505161216c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612268576000600b826003811061218757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b50519050801561225f5761225f6008836003811061221557fe5b01546001600160a01b0316600b846003811061222d57fe5b01546001600160a01b03167f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f84613417565b5060010161216f565b50807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b50510390508181101561234a576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156123c357600061271061236a6006548461335b90919063ffffffff16565b8161237157fe5b04905080156123c1576003546123b4906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911683611dc2565b6123be8282613657565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261245490859061314f565b50505050565b6000612464611e14565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b1580156124b557600080fd5b505afa1580156124c9573d6000803e3d6000fd5b505050506040513d60208110156124df57600080fd5b50519050808211612527576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036125338161281d565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612586611e14565b9050828110156125cb576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561260e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b505190508085111561273f57604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16916370a08231916024808301926020929190829003018186803b15801561270057600080fd5b505afa158015612714573d6000803e3d6000fd5b505050506040513d602081101561272a57600080fd5b505191508184111561273a578193505b612745565b84810392505b60008411806127545750600083115b156127c6576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b505190508083116128cb5782915050612cba565b60006128d5611e14565b90508084106128e2578093505b604080516370a0823160e01b81523060048201529051838603916000917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b50519050600061297783868603846136b4565b90508015612a5a577302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d6020811015612a0e57600080fd5b5051612a5a576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b5051905080821115612ae9578091505b8115612be7576000612710612b0d600f54612710038761335b90919063ffffffff16565b81612b1457fe5b604080516314f6943160e11b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820152602481018790527f0000000000000000000000000000000000000000000000000000000000000001600f0b60448201529290910460648301819052905190925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848083019260209291908290030181600087803b158015612bb957600080fd5b505af1158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5050505b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c5657600080fd5b505afa158015612c6a573d6000803e3d6000fd5b505050506040513d6020811015612c8057600080fd5b5051905088811015612c9a579650612cba95505050505050565b858910612caf579650612cba95505050505050565b889750505050505050505b919050565b6000600b8360038110612cce57fe5b01546001600160a01b03169050600060088460038110612cea57fe5b01546001600160a01b031614612d2057612d2060088460038110612d0a57fe5b01546001600160a01b0383811691166000611c96565b8160088460038110612d2e57fe5b0180546001600160a01b0319166001600160a01b03928316179055610d8890821683600019611c96565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dc757600080fd5b505afa158015612ddb573d6000803e3d6000fd5b505050506040513d6020811015612df157600080fd5b505190508015612ff657612e036137ff565b81817f000000000000000000000000000000000000000000000000000000000000000160048110612e3057fe5b60200201818152505060007343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b505190506000612efe82612ef8670de0b6b3a7640000612ef2887f000000000000000000000000000000000000000000000000000000000000000161335b565b9061335b565b906136ee565b90506000612710612f1e600f54612710038461335b90919063ffffffff16565b81612f2557fe5b60405163384e03db60e01b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820181815293909204935073a79828df1850e8a3a3064576f380d90aecdd33599263384e03db92918891869160240183608080838360005b83811015612f99578181015183820152602001612f81565b505050509050018281526020019350505050602060405180830381600087803b158015612fc557600080fd5b505af1158015612fd9573d6000803e3d6000fd5b505050506040513d6020811015612fef57600080fd5b5050505050505b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b15801561304b57600080fd5b505afa15801561305f573d6000803e3d6000fd5b505050506040513d602081101561307557600080fd5b5051905080156108d957604080516321d0683360e11b8152602460048201819052810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d602081101561310b57600080fd5b50516108d9576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006131a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611da99092919063ffffffff16565b805190915015610d88578080602001905160208110156131c357600080fd5b5051610d885760405162461bcd60e51b815260040180806020018281038252602a81526020018061388a602a913960400191505060405180910390fd5b6060824710156132415760405162461bcd60e51b815260040180806020018281038252602681526020018061381e6026913960400191505060405180910390fd5b61324a85613755565b61329b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106132d95780518252601f1990920191602091820191016132ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b509150915061335082828661375b565b979650505050505050565b60008261336a575060006133b7565b8282028284828161337757fe5b04146133b45760405162461bcd60e51b81526004018080602001828103825260218152602001806138696021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156133b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061344857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061348a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816002815181106134b857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561355d578181015183820152602001613545565b505050509050019650505050505050600060405180830381600087803b15801561358657600080fd5b505af115801561359a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135c357600080fd5b81019080805160405193929190846401000000008211156135e357600080fd5b9083019060208201858111156135f857600080fd5b825186602082028301116401000000008211171561361557600080fd5b82525081516020918201928201910280838360005b8381101561364257818101518382015260200161362a565b50505050905001604052505050505050505050565b6000828211156136ae576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136e4578284106136ca575080611dbb565b826136d5858461335b565b816136dc57fe5b049050611dbb565b5060009392505050565b6000808211613744576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161374d57fe5b049392505050565b3b151590565b6060831561376a575081611dbb565b82511561377a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137c45781810151838201526020016137ac565b50505050905090810190601f1680156137f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220d4e1fce61da3f06c658d8f1eebda1f16e590a6b524e3579fb3a177fd464f4f9964736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b

-----Decoded View---------------
Arg [0] : _fundManager (address): 0x7C765C474D231fd915dc78832b478F309071cba7
Arg [1] : _treasury (address): 0x86d10751B18F3fE331C146546868a07224A8598B

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c765c474d231fd915dc78832b478f309071cba7
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b


Deployed Bytecode Sourcemap

46115:289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45292:345;;;;;;;;;;;;;;;;-1:-1:-1;45292:345:0;-1:-1:-1;;;;;45292:345:0;;:::i;:::-;;36829:101;;;:::i;:::-;;;;;;;;;;;;;;;;42855:116;;;;;;;;;;;;;;;;-1:-1:-1;42855:116:0;;:::i;28930:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28930:152:0;;;;;;;;:::i;35670:135::-;;;;;;;;;;;;;;;;-1:-1:-1;35670:135:0;;:::i;43331:75::-;;;:::i;26418:218::-;;;:::i;24492:26::-;;;:::i;27885:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27885:498:0;-1:-1:-1;;;;;27885:498:0;;:::i;32136:31::-;;;;;;;;;;;;;;;;-1:-1:-1;32136:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;32136:31:0;;;;;;;;;;;;;;44326:235;;;;;;;;;;;;;;;;-1:-1:-1;44326:235:0;;;;;;;;;;;;:::i;27034:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27034:235:0;;;;;;;;;;:::i;40294:584::-;;;;;;;;;;;;;;;;-1:-1:-1;40294:584:0;;:::i;28600:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28600:139:0;;;;:::i;35865:136::-;;;;;;;;;;;;;;;;-1:-1:-1;35865:136:0;;;;:::i;33421:22::-;;;:::i;24659:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;26073:239;;;;;;;;;;;;;;;;-1:-1:-1;26073:239:0;-1:-1:-1;;;;;26073:239:0;;:::i;24205:23::-;;;:::i;24411:31::-;;;:::i;26719:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26719:189:0;-1:-1:-1;;;;;26719:189:0;;:::i;27731:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27731:146:0;;:::i;44189:129::-;;;;;;;;;;;;;;;;-1:-1:-1;44189:129:0;;;;;;;:::i;35372:154::-;;;;;;;;;;;;;;;;-1:-1:-1;35372:154:0;;;;;;-1:-1:-1;;;;;35372:154:0;;:::i;24144:27::-;;;:::i;32818:36::-;;;:::i;24324:42::-;;;;;;;;;;;;;;;;-1:-1:-1;24324:42:0;-1:-1:-1;;;;;24324:42:0;;:::i;44569:591::-;;;;;;;;;;;;;;;;-1:-1:-1;44569:591:0;-1:-1:-1;;;;;44569:591:0;;:::i;24114:23::-;;;:::i;40886:346::-;;;;;;;;;;;;;;;;-1:-1:-1;40886:346:0;;;;;;;:::i;37686:304::-;;;;;;;;;;;;;;;;-1:-1:-1;37686:304:0;;;;;;;:::i;27361:280::-;;;;;;;;;;;;;;;;-1:-1:-1;27361:280:0;-1:-1:-1;;;;;27361:280:0;;:::i;24178:20::-;;;:::i;24375:29::-;;;:::i;45292:345::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;45393:5:::1;-1:-1:-1::0;;;;;45375:24:0::1;:6;-1:-1:-1::0;;;;;45375:24:0::1;;;45367:52;;;::::0;;-1:-1:-1;;;45367:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45367:52:0;;;;;;;;;;;;;::::1;;45435:6;45430:114;32026:1;45447;:15;45430:114;;;45502:7;45510:1;45502:10;;;;;;;;::::0;-1:-1:-1;;;;;45492:20:0;;::::1;45502:10:::0;::::1;45492:20;;45484:48;;;::::0;;-1:-1:-1;;;45484:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45484:48:0;;;;;;;;;;;;;::::1;;45464:3;;45430:114;;;-1:-1:-1::0;45582:5:0::1;::::0;45589:39:::1;::::0;;-1:-1:-1;;;45589:39:0;;45622:4:::1;45589:39;::::0;::::1;::::0;;;45554:75:::1;::::0;-1:-1:-1;;;;;45582:5:0;;::::1;::::0;45589:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45589:39:0;-1:-1:-1;;;;;45554:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;45292:345:::0;:::o;36829:101::-;36884:4;36908:14;:12;:14::i;:::-;36901:21;;36829:101;:::o;42855:116::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;42938:25:::1;42952:10;42938:13;:25::i;28930:152::-:0;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;29021:53:::1;-1:-1:-1::0;;;;;29021:5:0::1;:22;29044:5:::0;29059:4:::1;29066:7:::0;29021:22:::1;:53::i;:::-;28930:152:::0;;:::o;35670:135::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;33483:5:::1;35742;:17;;35734:40;;;::::0;;-1:-1:-1;;;35734:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35734:40:0;;;;;;;;;;;;;::::1;;35785:4;:12:::0;35670:135::o;43331:75::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;43391:7:::1;:5;:7::i;:::-;43331:75::o:0;26418:218::-;26486:12;;-1:-1:-1;;;;;26486:12:0;26472:10;:26;26464:54;;;;;-1:-1:-1;;;26464:54:0;;;;;;;;;;;;-1:-1:-1;;;26464:54:0;;;;;;;;;;;;;;;26529:8;:21;;-1:-1:-1;;;;;;26529:21:0;;;26540:10;26529:21;;;;;;;26561:25;;;;;;;26602:26;;;;;;;;;;;;;;;;26418:218::o;24492:26::-;;;;:::o;27885:498::-;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;27976:11:::1;::::0;-1:-1:-1;;;;;27976:11:0::1;27968:34:::0;27964:109:::1;;28045:11;::::0;28019:42:::1;::::0;-1:-1:-1;;;;;28019:5:0::1;:17:::0;::::1;::::0;28045:11:::1;;28019:17;:42::i;:::-;28153:5;-1:-1:-1::0;;;;;28107:52:0::1;28120:12;-1:-1:-1::0;;;;;28107:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28107:34:0;-1:-1:-1;;;;;28107:52:0::1;;28085:133;;;::::0;;-1:-1:-1;;;28085:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28231:11;:40:::0;;-1:-1:-1;;;;;;28231:40:0::1;-1:-1:-1::0;;;;;28231:40:0;;::::1;::::0;;;::::1;::::0;;;28282:47:::1;::::0;:5:::1;:17;28231:40:::0;-1:-1:-1;;28282:17:0::1;:47::i;:::-;28347:28;::::0;;-1:-1:-1;;;;;28347:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27885:498:::0;:::o;32136:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32136:31:0;;-1:-1:-1;32136:31:0;:::o;44326:235::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;44470:25:::1;44484:10;44470:13;:25::i;:::-;44506:7;:5;:7::i;:::-;44524:29;44532:9;44543;44524:7;:29::i;:::-;44326:235:::0;;;:::o;27034:::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27134:19:0;::::1;27126:48;;;::::0;;-1:-1:-1;;;27126:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27126:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;27185:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;27185:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27232:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;27034:235:::0;;:::o;40294:584::-;25844:11;;40405:9;;-1:-1:-1;;;;;25844:11:0;25822:10;:34;25814:60;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;;;;40450:1:::1;40440:7;:11;40432:36;;;::::0;;-1:-1:-1;;;40432:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40432:36:0;;;;;;;;;;;;;::::1;;40513:14;40530:18;40540:7;40530:9;:18::i;:::-;40573:11;::::0;:34:::1;::::0;;-1:-1:-1;;;40573:34:0;;40601:4:::1;40573:34;::::0;::::1;::::0;;;40513:35;;-1:-1:-1;40561:9:0::1;::::0;-1:-1:-1;;;;;40573: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;40573:34:0;;-1:-1:-1;40618:10:0::1;40631:14;:12;:14::i;:::-;40618:27;;40667:5;40660:4;:12;40656:64;;;40703:5;40696:4;:12;40689:19;;40656:64;40736:13:::0;;40732:87:::1;;40766:41;-1:-1:-1::0;;;;;40766:5:0::1;:18;40785:10;40797:9:::0;40766:18:::1;:41::i;:::-;40836:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25885:1;;;40294:584:::0;;;:::o;28600:139::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;28694:21:::1;:37:::0;;-1:-1:-1;;28694:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28600:139::o;35865:136::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;35955:17:::1;:38:::0;;-1:-1:-1;;35955:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35865:136::o;33421:22::-;;;;:::o;24659:40::-;;;;;;:::o;26073:239::-;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;26230:12:::1;:28:::0;;-1:-1:-1;;;;;26230:28:0;::::1;-1:-1:-1::0;;;;;;26230:28:0;;::::1;::::0;::::1;::::0;;;26274:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26073:239:::0;:::o;24205:23::-;;;-1:-1:-1;;;;;24205:23:0;;:::o;24411:31::-;;;-1:-1:-1;;;;;24411:31:0;;:::o;26719:189::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26801:20:0;::::1;26793:50;;;::::0;;-1:-1:-1;;;26793:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26793:50:0;;;;;;;;;;;;;::::1;;26854:5;:14:::0;;-1:-1:-1;;;;;26854:14:0;::::1;-1:-1:-1::0;;;;;;26854:14:0;;::::1;::::0;::::1;::::0;;;26884:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26719:189:::0;:::o;27731:146::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;24562:4:::1;27810;:20;;27802:42;;;::::0;;-1:-1:-1;;;27802:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27802:42:0;;;;;;;;;;;;;::::1;;27855:7;:14:::0;27731:146::o;44189:129::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;44281:29:::1;44289:9;44300;44281:7;:29::i;35372:154::-:0;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35452:18:0;::::1;35444:46;;;::::0;;-1:-1:-1;;;35444:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35444:46:0;;;;;;;;;;;;;::::1;;35501:17;35509:2;35513:4;35501:7;:17::i;24144:27::-:0;;;-1:-1:-1;;;;;24144:27:0;;:::o;32818:36::-;;;;;;:::o;24324:42::-;;;;;;;;;;;;;;;:::o;44569:591::-;25844:11;;-1:-1:-1;;;;;25844:11:0;25822:10;:34;25814:60;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;;;;44650:14:::1;44676:9;44650:36;;44739:5;-1:-1:-1::0;;;;;44705:40:0::1;44713:5;-1:-1:-1::0;;;;;44713:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44713:13:0;-1:-1:-1;;;;;44705:40:0::1;;44697:76;;;::::0;;-1:-1:-1;;;44697:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;44846:11;::::0;44814:19:::1;::::0;;-1:-1:-1;;;44814:19:0;;;;-1:-1:-1;;;;;44846:11:0;;::::1;::::0;44814: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;44814:19:0;-1:-1:-1;;;;;44806:52:0::1;;44784:139;;;;-1:-1:-1::0;;;44784:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44940:21;::::0;::::1;;44936:70;;;44978:16;44992:1;44978:13;:16::i;:::-;45018:8;45029:25;-1:-1:-1::0;;45029:9:0::1;:25::i;:::-;45018:36:::0;-1:-1:-1;45065:33:0::1;-1:-1:-1::0;;;;;45065:5:0::1;:17;45083:9:::0;45018:36;45065:17:::1;:33::i;:::-;45109:43;::::0;;-1:-1:-1;;;45109:43:0;;45141:4:::1;45109:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;45109:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;45109:43:0;;;;;;;-1:-1:-1;45109:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25885:1;;44569:591:::0;:::o;24114:23::-;;;-1:-1:-1;;;;;24114:23:0;;:::o;40886:346::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;40988:1:::1;40978:7;:11;40970:33;;;::::0;;-1:-1:-1;;;40970:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40970:33:0;;;;;;;;;;;;;::::1;;41046:14;41063:18;41073:7;41063:9;:18::i;:::-;41106:11;::::0;:28:::1;::::0;;-1:-1:-1;;;41106:28:0;;::::1;::::0;::::1;::::0;;;;;41046:35;;-1:-1:-1;41092:11:0::1;::::0;-1:-1:-1;;;;;41106:11:0;;::::1;::::0;:17:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;41092:11;41106;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41106:28:0;;-1:-1:-1;41153:14:0;;::::1;;41145:39;;;::::0;;-1:-1:-1;;;41145:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41145:39:0;;;;;;;;;;;;;::::1;;41202:22;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25759:1;;40886:346:::0;;:::o;37686:304::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;37790:1:::1;37780:7;:11;37772:35;;;::::0;;-1:-1:-1;;;37772:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37772:35:0;;;;;;;;;;;;;::::1;;37836:11;::::0;:27:::1;::::0;;-1:-1:-1;;;37836:27:0;;::::1;::::0;::::1;::::0;;;;;37820:13:::1;::::0;-1:-1:-1;;;;;37836:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;37820:13;37836:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37836:27:0;;-1:-1:-1;37882:16:0;;::::1;;37874:43;;;::::0;;-1:-1:-1;;;37874:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37874:43:0;;;;;;;;;;;;;::::1;;37930:10;:8;:10::i;:::-;37956:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25759:1;37686:304:::0;;:::o;27361:280::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27516:23:0;::::1;27508:56;;;::::0;;-1:-1:-1;;;27508:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27508:56:0;;;;;;;;;;;;;::::1;;27575:8;:20:::0;;-1:-1:-1;;;;;27575:20:0;::::1;-1:-1:-1::0;;;;;;27575:20:0;;::::1;::::0;::::1;::::0;;;27611:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27361:280:::0;:::o;24178:20::-;;;-1:-1:-1;;;;;24178:20:0;;:::o;24375:29::-;;;:::o;13660:704::-;14075:10;;;14074:62;;-1:-1:-1;14091:39:0;;;-1:-1:-1;;;14091:39:0;;14115:4;14091:39;;;;-1:-1:-1;;;;;14091:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14091:39:0;:44;14074:62;14052:166;;;;-1:-1:-1;;;14052:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14283:62;;;-1:-1:-1;;;;;14283:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14283:62:0;-1:-1:-1;;;14283:62:0;;;14229:127;;14263:5;;14229: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;12856:245::-;13024:58;;;-1:-1:-1;;;;;13024:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13024:58:0;-1:-1:-1;;;13024:58:0;;;12970:123;;13004:5;;12970:19;:123::i;36009:812::-;36438:31;;;-1:-1:-1;;;36438:31:0;;36463:4;36438:31;;;;;;36055:10;;;;32768:42;;36438:16;;:31;;;;;;;;;;;;;;32768:42;36438:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:31:0;36707:30;;;-1:-1:-1;;;36707:30:0;;;;36438:31;;-1:-1:-1;36748:4:0;36742:3;:10;;36697:41;;33157:42;;36707:28;;:30;;;;;36438:31;;36707:30;;;;;;;;33157:42;36707:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36707:30:0;36697:5;;:9;:41::i;:::-;:56;;;;;;36689:64;;36772:41;36782:5;-1:-1:-1;;;;;36782:15:0;;36806:4;36782:30;;;;;;;;;;;;;-1:-1:-1;;;;;36782:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36782:30:0;36772:5;;:9;:41::i;:::-;36764:49;;36009:812;;:::o;41844:1003::-;41983:9;41995:5;-1:-1:-1;;;;;41995:15:0;;42019:4;41995:30;;;;;;;;;;;;;-1:-1:-1;;;;;41995:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41995:30:0;42092:17;;42060:50;;;-1:-1:-1;;;42060:50:0;;42085:4;42060:50;;;;42092:17;;;;42060:50;;;;;;;41995:30;;-1:-1:-1;32768:42:0;;42060:16;;:50;;;;;41995:30;;42060:50;;;;;;;;42092:17;32768:42;42060:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42060:50:0;42038:117;;;;;-1:-1:-1;;;42038:117:0;;;;;;;;;;;;-1:-1:-1;;;42038:117:0;;;;;;;;;;;;;;;42173:6;42168:246;32026:1;42185;:15;42168:246;;;42222:14;42246:7;42254:1;42246:10;;;;;;;;;42239:43;;;-1:-1:-1;;;42239:43:0;;42276:4;42239:43;;;;;;-1:-1:-1;;;;;42246:10:0;;;;42239:28;;:43;;;;;;;;;;;;;;;42246:10;42239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42239:43:0;;-1:-1:-1;42301:13:0;;42297:106;;42335:52;42341:3;42345:1;42341:6;;;;;;;;;-1:-1:-1;;;;;42341:6:0;42349:7;42357:1;42349:10;;;;;;;;;-1:-1:-1;;;;;42349:10:0;42369:5;42377:9;42335:5;:52::i;:::-;-1:-1:-1;42202:3:0;;42168:246;;;;42466:4;42433:5;-1:-1:-1;;;;;42433:15:0;;42457:4;42433:30;;;;;;;;;;;;;-1:-1:-1;;;;;42433:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42433:30:0;:37;;-1:-1:-1;42489:18:0;;;;42481:43;;;;;-1:-1:-1;;;42481:43:0;;;;;;;;;;;;-1:-1:-1;;;42481:43:0;;;;;;;;;;;;;;;42590:8;;42586:218;;42615:8;24645:5;42626:17;42635:7;;42626:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;42677:7:0;;42673:120;;42724:8;;42705:33;;-1:-1:-1;;;;;42705:5:0;:18;;;42724:8;42734:3;42705:18;:33::i;:::-;42764:13;:4;42773:3;42764:8;:13::i;:::-;42757:20;;42673:120;42586:218;;42821:18;;;;;;;;;;;;;;;;;41844:1003;;:::o;13109:282::-;13304:68;;;-1:-1:-1;;;;;13304:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13304:68:0;-1:-1:-1;;;13304:68:0;;;13250:133;;13284:5;;13250:19;:133::i;:::-;13109:282;;;;:::o;42979:344::-;43015:10;43028:14;:12;:14::i;:::-;43065:11;;:34;;;-1:-1:-1;;;43065:34:0;;43093:4;43065:34;;;;;;43015:27;;-1:-1:-1;43053:9:0;;-1:-1:-1;;;;;43065:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43065:34:0;;-1:-1:-1;43118:12:0;;;43110:38;;;;;-1:-1:-1;;;43110:38:0;;;;;;;;;;;;-1:-1:-1;;;43110:38:0;;;;;;;;;;;;;;;43175:12;;;43255:17;43175:12;43255:9;:17::i;:::-;43290:25;;;;;;;;;;;;;;;;;;;;43246:26;;-1:-1:-1;43290:25:0;;;;;;;;;;42979:344;;;:::o;43414:767::-;43482:10;43495:14;:12;:14::i;:::-;43482:27;;43537:9;43528:5;:18;;43520:42;;;;;-1:-1:-1;;;43520:42:0;;;;;;;;;;;;-1:-1:-1;;;43520:42:0;;;;;;;;;;;;;;;43590:9;43581:5;:18;;43573:42;;;;;-1:-1:-1;;;43573:42:0;;;;;;;;;;;;-1:-1:-1;;;43573:42:0;;;;;;;;;;;;;;;43732:11;;:34;;;-1:-1:-1;;;43732:34:0;;43760:4;43732:34;;;;;;43628:9;;;;;;;;-1:-1:-1;;;;;43732:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43732:34:0;;-1:-1:-1;43781:12:0;;;43777:247;;;43853:30;;;-1:-1:-1;;;43853:30:0;;43877:4;43853:30;;;;;;43817:12;;;;-1:-1:-1;;;;;;43853:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43853:30:0;;-1:-1:-1;43902:11:0;;;43898:63;;;43941:4;43934:11;;43898:63;43777:247;;;44007:5;44000:4;:12;43993:19;;43777:247;44047:1;44040:4;:8;:20;;;;44059:1;44052:4;:8;44040:20;44036:83;;;44077:11;;:30;;;-1:-1:-1;;;44077:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44077:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44036:83;44136:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43414:767;;;;;;;:::o;38751:1535::-;38801:4;38818:8;38829:5;-1:-1:-1;;;;;38829:15:0;;38853:4;38829:30;;;;;;;;;;;;;-1:-1:-1;;;;;38829:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38829:30:0;;-1:-1:-1;38874:14:0;;;38870:61;;38912:7;38905:14;;;;;38870:61;38943:10;38956:14;:12;:14::i;:::-;38943:27;;38998:5;38987:7;:16;38983:64;;39030:5;39020:15;;38983:64;39114:31;;;-1:-1:-1;;;39114:31:0;;39139:4;39114:31;;;;;;39071:13;;;;39059:9;;32768:42;;39114:16;;:31;;;;;;;;;;;;;;32768:42;39114:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39114:31:0;;-1:-1:-1;39198:11:0;39212:53;39234:4;39240:11;;;39114:31;39212:21;:53::i;:::-;39198:67;-1:-1:-1;39315:10:0;;39311:159;;32768:42;-1:-1:-1;;;;;39392:24:0;;39417:6;39425:5;39392:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39392:39:0;39384:74;;;;;-1:-1:-1;;;39384:74:0;;;;;;;;;;;;-1:-1:-1;;;39384:74:0;;;;;;;;;;;;;;;39527:33;;;-1:-1:-1;;;39527:33:0;;39554:4;39527:33;;;;;;39514:10;;33320:42;;39527:18;;:33;;;;;;;;;;;;;;;33320:42;39527:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39527:33:0;;-1:-1:-1;39575:14:0;;;39571:61;;;39615:5;39606:14;;39571:61;39648:10;;39644:266;;39675:8;33483:5;39686:25;39706:4;;33483:5;39695:15;39686:4;:8;;:25;;;;:::i;:::-;:36;;;;;39737:161;;;-1:-1:-1;;;39737:161:0;;33157:42;39737:161;;;;;;;;;;39855:5;39737:161;;;;;;39686:36;;;;39737:161;;;;;;;;39686:36;;-1:-1:-1;32984:42:0;;39737:29;;:161;;;;;;;;;;;;;;-1:-1:-1;32984:42:0;39737:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39644:266:0;39922:13;39938:5;-1:-1:-1;;;;;39938:15:0;;39962:4;39938:30;;;;;;;;;;;;;-1:-1:-1;;;;;39938:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39938:30:0;;-1:-1:-1;39983:18:0;;;39979:66;;;40025:8;-1:-1:-1;40018:15:0;;-1:-1:-1;;;;;;40018:15:0;39979:66;40168:5;40157:7;:16;40153:64;;40197:8;-1:-1:-1;40190:15:0;;-1:-1:-1;;;;;;40190:15:0;40153:64;40271:7;40264:14;;;;;;;;;38751:1535;;;;:::o;35024:340::-;35083:13;35106:7;35114:2;35106:11;;;;;;;;;-1:-1:-1;;;;;35106:11:0;;-1:-1:-1;35106:11:0;35169:3;35173:2;35169:7;;;;;;;;;-1:-1:-1;;;;;35169:7:0;:21;35165:84;;35207:30;35226:3;35230:2;35226:7;;;;;;;;;-1:-1:-1;;;;;35207:18:0;;;;35226:7;;35207:18;:30::i;:::-;35271:4;35261:3;35265:2;35261:7;;;;;;;;:14;;-1:-1:-1;;;;;;35261:14:0;-1:-1:-1;;;;;35261:14:0;;;;;;35316:40;;:18;;35335:4;-1:-1:-1;;35316:18:0;:40::i;36938:740::-;36977:8;36988:5;-1:-1:-1;;;;;36988:15:0;;37012:4;36988:30;;;;;;;;;;;;;-1:-1:-1;;;;;36988:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36988:30:0;;-1:-1:-1;37033:7:0;;37029:471;;37057:22;;:::i;:::-;37111:3;37094:7;37102:5;37094:14;;;;;;;;;;:20;;;;;37234:18;33157:42;-1:-1:-1;;;;;37255:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37255:30:0;;-1:-1:-1;37300:11:0;37314:41;37255:30;37314:22;37331:4;37314:12;:3;37322;37314:7;:12::i;:::-;:16;;:22::i;:::-;:26;;:41::i;:::-;37300:55;;37370:8;33483:5;37381:27;37403:4;;33483:5;37392:15;37381:6;:10;;:27;;;;:::i;:::-;:38;;;;;37436:52;;-1:-1:-1;;;37436:52:0;;33157:42;37436:52;;;;;;37381:38;;;;;-1:-1:-1;32984:42:0;;37436:17;;33157:42;37475:7;;37381:38;;37436:52;;37475:7;37436:52;;;37475:7;-1:-1:-1;37436:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37029:471:0;37525:33;;;-1:-1:-1;;;37525:33:0;;37552:4;37525:33;;;;;;37512:10;;33320:42;;37525:18;;:33;;;;;;;;;;;;;;;33320:42;37525:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37525:33:0;;-1:-1:-1;37573:9:0;;37569:102;;37607:33;;;-1:-1:-1;;;37607:33:0;;32694:2;37607:33;;;;;;;;;;;37635:4;37607:33;;;;;;32600:42;;37607:15;;:33;;;;;;;;;;;;;;-1:-1:-1;32600:42:0;37607:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37607:33:0;37599:60;;;;;-1:-1:-1;;;37599:60:0;;;;;;;;;;;;-1:-1:-1;;;37599:60:0;;;;;;;;;;;;;;15555:860;15979:23;16005:106;16047:4;16005:106;;;;;;;;;;;;;;;;;16013:5;-1:-1:-1;;;;;16005:27:0;;;:106;;;;;:::i;:::-;16126:17;;15979:132;;-1:-1:-1;16126:21:0;16122:286;;16299:10;16288:30;;;;;;;;;;;;;;;-1:-1:-1;16288:30:0;16262:134;;;;-1:-1:-1;;;16262: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;19356:208::-;19408:4;19429:6;19425:20;;-1:-1:-1;19444:1:0;19437:8;;19425:20;19465:5;;;19469:1;19465;:5;:1;19489:5;;;;;:10;19481:56;;;;-1:-1:-1;;;19481:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19555:1;-1:-1:-1;19356:208:0;;;;;:::o;18498:167::-;18550:4;18576:5;;;18600:6;;;;18592:46;;;;;-1:-1:-1;;;18592:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:508;41543:16;;;41557:1;41543:16;;;;;;;;;41519:21;;41543:16;;;;;;;;;;-1:-1:-1;41543:16:0;41519:40;;41580:8;41570:4;41575:1;41570:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;41570:18:0;;;-1:-1:-1;;;;;41570:18:0;;;;;31941:42;41599:4;41604:1;41599:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;41599:14:0;;;-1:-1:-1;;;;;41599:14:0;;;;;41634:9;41624:4;41629:1;41624:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;41624:19:0;;;-1:-1:-1;;;;;41624:19:0;;;;;41672:4;-1:-1:-1;;;;;41656:46:0;;41717:7;41739:1;41755:4;41782;41802:15;41656:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:508;;;;;:::o;18948:149::-;19000:4;19030:1;19025;:6;;19017:49;;;;;-1:-1:-1;;;19017:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19084:5:0;;;18948:149::o;37998:745::-;38131:4;38471:10;;38467:250;;38588:6;38577:7;:17;38573:77;;-1:-1:-1;38622:12:0;38615:19;;38573:77;38699:6;38671:25;:7;38683:12;38671:11;:25::i;:::-;:34;;;;;;38664:41;;;;38467:250;-1:-1:-1;38734:1:0;37998:745;;;;;:::o;20042:144::-;20094:4;20123:1;20119;:5;20111:44;;;;;-1:-1:-1;;;20111:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20177:1;20173;:5;;;;;;;20042:144;-1:-1:-1;;;20042: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://d4e1fce61da3f06c658d8f1eebda1f16e590a6b524e3579fb3a177fd464f4f99

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.