More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 578 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 13074587 | 1115 days ago | IN | 0 ETH | 0.01708483 | ||||
Withdraw | 12720799 | 1170 days ago | IN | 0 ETH | 0.00273508 | ||||
Withdraw | 12643365 | 1182 days ago | IN | 0 ETH | 0.00440703 | ||||
Withdraw | 12539374 | 1198 days ago | IN | 0 ETH | 0.01119112 | ||||
Withdraw | 12514835 | 1202 days ago | IN | 0 ETH | 0.01085707 | ||||
Withdraw | 12482671 | 1207 days ago | IN | 0 ETH | 0.03144133 | ||||
Withdraw | 12313176 | 1233 days ago | IN | 0 ETH | 0.03107765 | ||||
Withdraw | 12307506 | 1234 days ago | IN | 0 ETH | 0.02486212 | ||||
Withdraw | 12292917 | 1236 days ago | IN | 0 ETH | 0.05549616 | ||||
Withdraw | 11950035 | 1289 days ago | IN | 0 ETH | 0.02509982 | ||||
Withdraw | 11949946 | 1289 days ago | IN | 0 ETH | 0.02286347 | ||||
Withdraw | 11949919 | 1289 days ago | IN | 0 ETH | 0.01719999 | ||||
Withdraw | 11852958 | 1304 days ago | IN | 0 ETH | 0.0135875 | ||||
Withdraw | 11754124 | 1319 days ago | IN | 0 ETH | 0.03262072 | ||||
Get All Rewards | 11746364 | 1320 days ago | IN | 0 ETH | 0.00435305 | ||||
Get All Rewards | 11743531 | 1321 days ago | IN | 0 ETH | 0.00618133 | ||||
Get All Rewards | 11650477 | 1335 days ago | IN | 0 ETH | 0.0017956 | ||||
Withdraw | 11650463 | 1335 days ago | IN | 0 ETH | 0.0245491 | ||||
Withdraw | 11647075 | 1336 days ago | IN | 0 ETH | 0.02430496 | ||||
Withdraw | 11622392 | 1339 days ago | IN | 0 ETH | 0.0295464 | ||||
Withdraw | 11619393 | 1340 days ago | IN | 0 ETH | 0.03025916 | ||||
Withdraw | 11613296 | 1341 days ago | IN | 0 ETH | 0.03863118 | ||||
Withdraw | 11607382 | 1342 days ago | IN | 0 ETH | 0.0033 | ||||
Withdraw | 11593992 | 1344 days ago | IN | 0 ETH | 0.02187141 | ||||
Withdraw | 11593984 | 1344 days ago | IN | 0 ETH | 0.01805936 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ValueMultiVaultBank
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-09 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IValueVaultMaster { function bank(address) view external returns (address); function isVault(address) view external returns (bool); function isController(address) view external returns (bool); function isStrategy(address) view external returns (bool); function slippage(address) view external returns (uint); function convertSlippage(address _input, address _output) view external returns (uint); function valueToken() view external returns (address); function govVault() view external returns (address); function insuranceFund() view external returns (address); function performanceReward() view external returns (address); function govVaultProfitShareFee() view external returns (uint); function gasFee() view external returns (uint); function insuranceFee() view external returns (uint); function withdrawalProtectionFee() view external returns (uint); } interface IValueMultiVault { function cap() external view returns (uint); function getConverter(address _want) external view returns (address); function getVaultMaster() external view returns (address); function balance() external view returns (uint); function token() external view returns (address); function available(address _want) external view returns (uint); function accept(address _input) external view returns (bool); function claimInsurance() external; function earn(address _want) external; function harvest(address reserve, uint amount) external; function withdraw_fee(uint _shares) external view returns (uint); function calc_token_amount_deposit(uint[] calldata _amounts) external view returns (uint); function calc_token_amount_withdraw(uint _shares, address _output) external view returns (uint); function convert_rate(address _input, uint _amount) external view returns (uint); function getPricePerFullShare() external view returns (uint); function get_virtual_price() external view returns (uint); // average dollar value of vault share token function deposit(address _input, uint _amount, uint _min_mint_amount) external returns (uint _mint_amount); function depositFor(address _account, address _to, address _input, uint _amount, uint _min_mint_amount) external returns (uint _mint_amount); function depositAll(uint[] calldata _amounts, uint _min_mint_amount) external returns (uint _mint_amount); function depositAllFor(address _account, address _to, uint[] calldata _amounts, uint _min_mint_amount) external returns (uint _mint_amount); function withdraw(uint _shares, address _output, uint _min_output_amount) external returns (uint); function withdrawFor(address _account, uint _shares, address _output, uint _min_output_amount) external returns (uint _output_amount); function harvestStrategy(address _strategy) external; function harvestWant(address _want) external; function harvestAllStrategies() external; } interface IMultiVaultConverter { function token() external returns (address); function get_virtual_price() external view returns (uint); function convert_rate(address _input, address _output, uint _inputAmount) external view returns (uint _outputAmount); function calc_token_amount_deposit(uint[] calldata _amounts) external view returns (uint _shareAmount); function calc_token_amount_withdraw(uint _shares, address _output) external view returns (uint _outputAmount); function convert(address _input, address _output, uint _inputAmount) external returns (uint _outputAmount); function convertAll(uint[] calldata _amounts) external returns (uint _outputAmount); } interface IFreeFromUpTo { function freeFromUpTo(address from, uint value) external returns (uint freed); } contract ValueMultiVaultBank { using SafeMath for uint; using SafeERC20 for IERC20; IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c); modifier discountCHI(uint8 _flag) { if ((_flag & 0x1) == 0) { _; } else { uint gasStart = gasleft(); _; uint gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length; chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41130); } } IERC20 public valueToken = IERC20(0x49E833337ECe7aFE375e44F4E3e8481029218E5c); address public governance; address public strategist; // who can call harvestXXX() IValueVaultMaster public vaultMaster; struct UserInfo { uint amount; mapping(uint8 => uint) rewardDebt; mapping(uint8 => uint) accumulatedEarned; // will accumulate every time user harvest } struct RewardPoolInfo { IERC20 rewardToken; // Address of rewardPool token contract. uint lastRewardBlock; // Last block number that rewardPool distribution occurs. uint endRewardBlock; // Block number which rewardPool distribution ends. uint rewardPerBlock; // Reward token amount to distribute per block. uint accRewardPerShare; // Accumulated rewardPool per share, times 1e18. uint totalPaidRewards; // for stat only } mapping(address => RewardPoolInfo[]) public rewardPoolInfos; // vault address => pool info mapping(address => mapping(address => UserInfo)) public userInfo; // vault address => account => userInfo event Deposit(address indexed vault, address indexed user, uint amount); event Withdraw(address indexed vault, address indexed user, uint amount); event RewardPaid(address indexed vault, uint pid, address indexed user, uint reward); constructor(IERC20 _valueToken, IValueVaultMaster _vaultMaster) public { valueToken = _valueToken; vaultMaster = _vaultMaster; governance = msg.sender; strategist = msg.sender; } function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); governance = _governance; } function setStrategist(address _strategist) external { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setVaultMaster(IValueVaultMaster _vaultMaster) external { require(msg.sender == governance, "!governance"); vaultMaster = _vaultMaster; } function addVaultRewardPool(address _vault, IERC20 _rewardToken, uint _startBlock, uint _endRewardBlock, uint _rewardPerBlock) external { require(msg.sender == governance, "!governance"); RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault]; require(rewardPools.length < 8, "exceed rwdPoolLim"); _startBlock = (block.number > _startBlock) ? block.number : _startBlock; require(_startBlock <= _endRewardBlock, "sVB>eVB"); updateReward(_vault); rewardPools.push(RewardPoolInfo({ rewardToken : _rewardToken, lastRewardBlock : _startBlock, endRewardBlock : _endRewardBlock, rewardPerBlock : _rewardPerBlock, accRewardPerShare : 0, totalPaidRewards : 0 })); } function updateRewardPool(address _vault, uint8 _pid, uint _endRewardBlock, uint _rewardPerBlock) external { require(msg.sender == governance, "!governance"); updateRewardPool(_vault, _pid); RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid]; require(block.number <= rewardPool.endRewardBlock, "late"); rewardPool.endRewardBlock = _endRewardBlock; rewardPool.rewardPerBlock = _rewardPerBlock; } function updateReward(address _vault) public { uint8 rewardPoolLength = uint8(rewardPoolInfos[_vault].length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { updateRewardPool(_vault, _pid); } } function updateRewardPool(address _vault, uint8 _pid) public { RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid]; uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number; if (_endRewardBlockApplicable > rewardPool.lastRewardBlock) { uint lpSupply = IERC20(address(_vault)).balanceOf(address(this)); if (lpSupply > 0) { uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock); uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); rewardPool.accRewardPerShare = rewardPool.accRewardPerShare.add(_incRewardPerShare); } rewardPool.lastRewardBlock = _endRewardBlockApplicable; } } function cap(IValueMultiVault _vault) external view returns (uint) { return _vault.cap(); } function approveForSpender(IERC20 _token, address _spender, uint _amount) external { require(msg.sender == governance, "!governance"); require(!vaultMaster.isVault(address(_token)), "vaultToken"); _token.safeApprove(_spender, _amount); } function deposit(IValueMultiVault _vault, address _input, uint _amount, uint _min_mint_amount, bool _isStake, uint8 _flag) public discountCHI(_flag) { require(_vault.accept(_input), "vault does not accept this asset"); require(_amount > 0, "!_amount"); if (!_isStake) { _vault.depositFor(msg.sender, msg.sender, _input, _amount, _min_mint_amount); } else { uint _mint_amount = _vault.depositFor(msg.sender, address(this), _input, _amount, _min_mint_amount); _stakeVaultShares(address(_vault), _mint_amount); } } function depositAll(IValueMultiVault _vault, uint[] calldata _amounts, uint _min_mint_amount, bool _isStake, uint8 _flag) public discountCHI(_flag) { if (!_isStake) { _vault.depositAllFor(msg.sender, msg.sender, _amounts, _min_mint_amount); } else { uint _mint_amount = _vault.depositAllFor(msg.sender, address(this), _amounts, _min_mint_amount); _stakeVaultShares(address(_vault), _mint_amount); } } function stakeVaultShares(address _vault, uint _shares) external { uint _before = IERC20(address(_vault)).balanceOf(address(this)); IERC20(address(_vault)).safeTransferFrom(msg.sender, address(this), _shares); uint _after = IERC20(address(_vault)).balanceOf(address(this)); _shares = _after.sub(_before); // Additional check for deflationary tokens _stakeVaultShares(_vault, _shares); } function _stakeVaultShares(address _vault, uint _shares) internal { UserInfo storage user = userInfo[_vault][msg.sender]; updateReward(_vault); if (user.amount > 0) { getAllRewards(_vault, msg.sender, uint8(0)); } user.amount = user.amount.add(_shares); RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault]; uint8 rewardPoolLength = uint8(rewardPools.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPools[_pid].accRewardPerShare).div(1e18); } emit Deposit(_vault, msg.sender, _shares); } // call unstake(_vault, 0) for getting reward function unstake(address _vault, uint _amount, uint8 _flag) public discountCHI(_flag) { UserInfo storage user = userInfo[_vault][msg.sender]; updateReward(_vault); if (user.amount > 0) { getAllRewards(_vault, msg.sender, uint8(0)); } if (_amount > 0) { user.amount = user.amount.sub(_amount); IERC20(address(_vault)).safeTransfer(msg.sender, _amount); } RewardPoolInfo[] storage rewardPools = rewardPoolInfos[_vault]; uint8 rewardPoolLength = uint8(rewardPools.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPools[_pid].accRewardPerShare).div(1e18); } emit Withdraw(_vault, msg.sender, _amount); } // using PUSH pattern function getAllRewards(address _vault, address _account, uint8 _flag) public discountCHI(_flag) { uint8 rewardPoolLength = uint8(rewardPoolInfos[_vault].length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { getReward(_vault, _pid, _account, uint8(0)); } } function getReward(address _vault, uint8 _pid, address _account, uint8 _flag) public discountCHI(_flag) { updateRewardPool(_vault, _pid); UserInfo storage user = userInfo[_vault][_account]; RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid]; uint _pendingReward = user.amount.mul(rewardPool.accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]); if (_pendingReward > 0) { user.accumulatedEarned[_pid] = user.accumulatedEarned[_pid].add(_pendingReward); rewardPool.totalPaidRewards = rewardPool.totalPaidRewards.add(_pendingReward); safeTokenTransfer(rewardPool.rewardToken, _account, _pendingReward); emit RewardPaid(_vault, _pid, _account, _pendingReward); user.rewardDebt[_pid] = user.amount.mul(rewardPool.accRewardPerShare).div(1e18); } } function pendingReward(address _vault, uint8 _pid, address _account) public view returns (uint _pending) { UserInfo storage user = userInfo[_vault][_account]; RewardPoolInfo storage rewardPool = rewardPoolInfos[_vault][_pid]; uint _accRewardPerShare = rewardPool.accRewardPerShare; uint lpSupply = IERC20(_vault).balanceOf(address(this)); uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number; if (_endRewardBlockApplicable > rewardPool.lastRewardBlock && lpSupply != 0) { uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock); uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); _accRewardPerShare = _accRewardPerShare.add(_incRewardPerShare); } _pending = user.amount.mul(_accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]); } function shares_owner(address _vault, address _account) public view returns (uint) { return IERC20(_vault).balanceOf(_account).add(userInfo[_vault][_account].amount); } // No rebalance implementation for lower fees and faster swaps function withdraw(address _vault, uint _shares, address _output, uint _min_output_amount, uint8 _flag) public discountCHI(_flag) { uint _userBal = IERC20(address(_vault)).balanceOf(msg.sender); if (_shares > _userBal) { uint _need = _shares.sub(_userBal); require(_need <= userInfo[_vault][msg.sender].amount, "_userBal+staked < _shares"); unstake(_vault, _need, uint8(0)); } IERC20(address(_vault)).safeTransferFrom(msg.sender, address(this), _shares); IValueMultiVault(_vault).withdrawFor(msg.sender, _shares, _output, _min_output_amount); } function exit(address _vault, address _output, uint _min_output_amount, uint8 _flag) external discountCHI(_flag) { unstake(_vault, userInfo[_vault][msg.sender].amount, uint8(0)); withdraw(_vault, IERC20(address(_vault)).balanceOf(msg.sender), _output, _min_output_amount, uint8(0)); } function withdraw_fee(IValueMultiVault _vault, uint _shares) external view returns (uint) { return _vault.withdraw_fee(_shares); } function calc_token_amount_deposit(IValueMultiVault _vault, uint[] calldata _amounts) external view returns (uint) { return _vault.calc_token_amount_deposit(_amounts); } function calc_token_amount_withdraw(IValueMultiVault _vault, uint _shares, address _output) external view returns (uint) { return _vault.calc_token_amount_withdraw(_shares, _output); } function convert_rate(IValueMultiVault _vault, address _input, uint _amount) external view returns (uint) { return _vault.convert_rate(_input, _amount); } function harvestStrategy(IValueMultiVault _vault, address _strategy, uint8 _flag) external discountCHI(_flag) { require(msg.sender == strategist || msg.sender == governance, "!strategist"); _vault.harvestStrategy(_strategy); } function harvestWant(IValueMultiVault _vault, address _want, uint8 _flag) external discountCHI(_flag) { require(msg.sender == strategist || msg.sender == governance, "!strategist"); _vault.harvestWant(_want); } function harvestAllStrategies(IValueMultiVault _vault, uint8 _flag) external discountCHI(_flag) { require(msg.sender == strategist || msg.sender == governance, "!strategist"); _vault.harvestAllStrategies(); } // Safe token transfer function, just in case if rounding error causes vinfo to not have enough token. function safeTokenTransfer(IERC20 _token, address _to, uint _amount) internal { uint bal = _token.balanceOf(address(this)); if (_amount > bal) { _token.safeTransfer(_to, bal); } else { _token.safeTransfer(_to, _amount); } } /** * This function allows governance to take unsupported tokens out of the contract. This is in an effort to make someone whole, should they seriously mess up. * There is no guarantee governance will vote to return these. It also allows for removal of airdropped tokens. */ function governanceRecoverUnsupported(IERC20 _token, uint amount, address to) external { require(msg.sender == governance, "!governance"); require(!vaultMaster.isVault(address(_token)), "vaultToken"); _token.safeTransfer(to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_valueToken","type":"address"},{"internalType":"contract IValueVaultMaster","name":"_vaultMaster","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"addVaultRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveForSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"calc_token_amount_deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_output","type":"address"}],"name":"calc_token_amount_withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"}],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"convert_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min_mint_amount","type":"uint256"},{"internalType":"bool","name":"_isStake","type":"bool"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_min_mint_amount","type":"uint256"},{"internalType":"bool","name":"_isStake","type":"bool"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint256","name":"_min_output_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestAllStrategies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"harvestWant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolInfos","outputs":[{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"totalPaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueVaultMaster","name":"_vaultMaster","type":"address"}],"name":"setVaultMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"}],"name":"shares_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"stakeVaultShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valueToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultMaster","outputs":[{"internalType":"contract IValueVaultMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint256","name":"_min_output_amount","type":"uint256"},{"internalType":"uint8","name":"_flag","type":"uint8"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueMultiVault","name":"_vault","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b0319167349e833337ece7afe375e44f4e3e8481029218e5c17905534801561003657600080fd5b50604051613bc1380380613bc18339818101604052604081101561005957600080fd5b508051602090910151600080546001600160a01b039384166001600160a01b03199182161790915560038054939092169281169290921790556001805482163390811790915560028054909216179055613b09806100b86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806382b583701161011a578063ab033ea9116100ad578063c92aecc41161007c578063c92aecc41461082a578063dd78683414610832578063ef9e2379146108c3578063effff82f146108f9578063fbce0cc61461090157610206565b8063ab033ea914610774578063af0fa8a11461079a578063aff083d4146107c9578063c7b9d5301461080457610206565b806392fe92c3116100e957806392fe92c314610697578063974c5226146106c6578063989b9e1b146106ce578063a6bf32d11461074e57610206565b806382b58370146105ac57806384570634146105ee5780638cc8ce3414610628578063903832f91461066257610206565b806347f6512b1161019d5780635aa6e6751161016c5780635aa6e675146104cb578063632447c9146104d357806365ddde07146104f9578063739b78f4146105335780637f6159591461057357610206565b806347f6512b146103ca578063516479b2146103f657806354575af41461045f578063554236691461049557610206565b806323deedcf116101d957806323deedcf146102d6578063341cd53a1461031a57806336cf893c146103685780633995843a1461039e57610206565b806309fd9fc31461020b5780630f208beb1461024c5780631f7e5a691461028c5780631fe4a686146102b2575b600080fd5b61024a6004803603608081101561022157600080fd5b506001600160a01b03813581169160ff602082013581169260408301351691606001351661092f565b005b61027a6004803603604081101561026257600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051918252519081900360200190f35b61024a600480360360208110156102a257600080fd5b50356001600160a01b0316610d38565b6102ba610da7565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360a08110156102ec57600080fd5b5080356001600160a01b0390811691602081013591604082013516906060810135906080013560ff16610db6565b61024a600480360360c081101561033057600080fd5b5080356001600160a01b0390811691602081013590911690604081013590606081013590608081013515159060a0013560ff166111f6565b61027a6004803603606081101561037e57600080fd5b506001600160a01b03813581169160208101359091169060400135611755565b61027a600480360360408110156103b457600080fd5b506001600160a01b0381351690602001356117e0565b61024a600480360360408110156103e057600080fd5b506001600160a01b03813516906020013561185b565b6104226004803603604081101561040c57600080fd5b506001600160a01b038135169060200135611986565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61024a6004803603606081101561047557600080fd5b506001600160a01b038135811691602081013591604090910135166119e1565b61027a600480360360608110156104ab57600080fd5b506001600160a01b03813581169160208101359160409091013516611aff565b6102ba611b56565b61024a600480360360208110156104e957600080fd5b50356001600160a01b0316611b65565b61024a6004803603606081101561050f57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16611ba0565b61024a6004803603608081101561054957600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013560ff16611e00565b61027a6004803603606081101561058957600080fd5b506001600160a01b03813581169160ff6020820135169160409091013516611fbc565b61024a600480360360a08110156105c257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612165565b61024a6004803603606081101561060457600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16612300565b61024a6004803603606081101561063e57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff166123d1565b61024a6004803603606081101561067857600080fd5b5080356001600160a01b0316906020810135906040013560ff16612542565b61024a600480360360408110156106ad57600080fd5b5080356001600160a01b0316906020013560ff166127d8565b6102ba612923565b61027a600480360360408110156106e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050612932565b61027a6004803603602081101561076457600080fd5b50356001600160a01b03166129a6565b61024a6004803603602081101561078a57600080fd5b50356001600160a01b0316612a13565b61024a600480360360408110156107b057600080fd5b5080356001600160a01b0316906020013560ff16612a82565b61024a600480360360808110156107df57600080fd5b506001600160a01b038135169060ff6020820135169060408101359060600135612cb0565b61024a6004803603602081101561081a57600080fd5b50356001600160a01b0316612d92565b6102ba612e01565b61024a600480360360a081101561084857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460208302840111640100000000831117156108a757600080fd5b919350915080359060208101351515906040013560ff16612e13565b61024a600480360360608110156108d957600080fd5b506001600160a01b038135811691602081013590911690604001356130ab565b6102ba6131c4565b61027a6004803603604081101561091757600080fd5b506001600160a01b03813581169160200135166131d3565b8060018116610ad25761094285856127d8565b6001600160a01b038086166000818152600560209081526040808320948816835293815283822092825260049052918220805491929160ff881690811061098557fe5b6000918252602080832060ff8a16845260018601909152604083205460069290920201600481015485549194506109da92916109d491670de0b6b3a7640000916109ce91613275565b906132ce565b90613310565b90508015610aca5760ff87166000908152600284016020526040902054610a019082613352565b60ff881660009081526002850160205260409020556005820154610a259082613352565b60058301558154610a40906001600160a01b031687836133ac565b856001600160a01b0316886001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878984604051808360ff1681526020018281526020019250505060405180910390a360048201548354610ab491670de0b6b3a7640000916109ce91613275565b60ff881660009081526001850160205260409020555b505050610d14565b60005a9050610ae186866127d8565b6001600160a01b038087166000818152600560209081526040808320948916835293815283822092825260049052918220805491929160ff8916908110610b2457fe5b6000918252602080832060ff8b1684526001860190915260408320546006929092020160048101548554919450610b6d92916109d491670de0b6b3a7640000916109ce91613275565b90508015610c5d5760ff88166000908152600284016020526040902054610b949082613352565b60ff891660009081526002850160205260409020556005820154610bb89082613352565b60058301558154610bd3906001600160a01b031688836133ac565b866001600160a01b0316896001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878a84604051808360ff1681526020018281526020019250505060405180910390a360048201548354610c4791670de0b6b3a7640000916109ce91613275565b60ff891660009081526001850160205260409020555b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b505050506040513d6020811015610d0f57600080fd5b505050505b5050505050565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b03163314610d85576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b8060018116610f7d576000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e0e57600080fd5b505afa158015610e22573d6000803e3d6000fd5b505050506040513d6020811015610e3857600080fd5b5051905080861115610ed5576000610e508783613310565b6001600160a01b0389166000908152600560209081526040808320338452909152902054909150811115610ec7576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b610ed388826000612542565b505b610eea6001600160a01b03881633308961345e565b6040805163073772d560e31b8152336004820152602481018890526001600160a01b038781166044830152606482018790529151918916916339bb96a8916084808201926020929091908290030181600087803b158015610f4a57600080fd5b505af1158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b506111ee915050565b60005a90506000876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd157600080fd5b505afa158015610fe5573d6000803e3d6000fd5b505050506040513d6020811015610ffb57600080fd5b50519050808711156110985760006110138883613310565b6001600160a01b038a16600090815260056020908152604080832033845290915290205490915081111561108a576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b61109689826000612542565b505b6110ad6001600160a01b03891633308a61345e565b6040805163073772d560e31b8152336004820152602481018990526001600160a01b038881166044830152606482018890529151918a16916339bb96a8916084808201926020929091908290030181600087803b15801561110d57600080fd5b505af1158015611121573d6000803e3d6000fd5b505050506040513d602081101561113757600080fd5b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161117857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505050505b505050505050565b806001811661144c57866001600160a01b0316639f005920876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b505050506040513d602081101561127657600080fd5b50516112c9576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b60008511611309576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b826113a75760408051631281099d60e21b8152336004820181905260248201526001600160a01b0388811660448301526064820188905260848201879052915191891691634a0426749160a4808201926020929091908290030181600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050506040513d602081101561139f57600080fd5b506114479050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038881166044830152606482018890526084820187905291516000928a1691634a0426749160a480830192602092919082900301818787803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506040513d602081101561143757600080fd5b5051905061144588826134b8565b505b61174c565b60005a9050876001600160a01b0316639f005920886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b505161151b576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b6000861161155b576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b836115f95760408051631281099d60e21b8152336004820181905260248201526001600160a01b03898116604483015260648201899052608482018890529151918a1691634a0426749160a4808201926020929091908290030181600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506040513d60208110156115f157600080fd5b506116999050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038981166044830152606482018990526084820188905291516000928b1691634a0426749160a480830192602092919082900301818787803b15801561165f57600080fd5b505af1158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b5051905061169789826134b8565b505b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816116d657fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b505050506040513d602081101561174757600080fd5b505050505b50505050505050565b6000836001600160a01b03166338b7f2cb84846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d60208110156117d657600080fd5b5051949350505050565b6000826001600160a01b0316632edeb8cf836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505190505b92915050565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118aa57600080fd5b505afa1580156118be573d6000803e3d6000fd5b505050506040513d60208110156118d457600080fd5b505190506118ed6001600160a01b03841633308561345e565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b505190506119748183613310565b925061198084846134b8565b50505050565b6004602052816000526040600020818154811061199f57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909186565b6001546001600160a01b03163314611a2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d6020811015611aa557600080fd5b505115611ae6576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b03841682846135b6565b505050565b6000836001600160a01b031663ae2841c784846040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156117ac57600080fd5b6001546001600160a01b031681565b6001600160a01b038116600090815260046020526040812054905b8160ff168160ff161015611afa57611b9883826127d8565b600101611b80565b8060018116611c77576002546001600160a01b0316331480611bcc57506001546001600160a01b031633145b611c0b576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b03166361f13e00846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b50505050611980565b60005a6002549091506001600160a01b0316331480611ca057506001546001600160a01b031633145b611cdf576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b03166361f13e00856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b5050505050505050565b8060018116611ec4576001600160a01b0385166000908152600560209081526040808320338452909152812054611e3991879190612542565b611ebf85866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6020811015611eb457600080fd5b505186866000610db6565b610d14565b60005a6001600160a01b0387166000908152600560209081526040808320338452909152812054919250611ef9918891612542565b611f7f86876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505187876000610db6565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b6001600160a01b038084166000818152600560209081526040808320948616835293815283822092825260049052918220805483919060ff8716908110611fff57fe5b906000526020600020906006020190506000816004015490506000876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b5051600284015490915060009043116120aa57436120b0565b83600201545b90508360010154811180156120c457508115155b156121245760006120e285600101548361331090919063ffffffff16565b90506000612113846109ce670de0b6b3a764000061210d8a600301548761327590919063ffffffff16565b90613275565b905061211f8582613352565b945050505b60ff88166000908152600186016020526040902054855461215891906109d490670de0b6b3a7640000906109ce9088613275565b9998505050505050505050565b6001546001600160a01b031633146121b2576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03851660009081526004602052604090208054600811612214576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b8343116122215783612223565b435b935082841115612264576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b61226d86611b65565b6040805160c0810182526001600160a01b03968716815260208082019687529181019485526060810193845260006080820181815260a08301828152855460018082018855968452949092209251600690940290920180546001600160a01b0319169390981692909217875594519186019190915591516002850155516003840155905160048301555160059091015550565b806001811661234e576001600160a01b038416600090815260046020526040812054905b8160ff168160ff1610156123475761233f868287600061092f565b600101612324565b5050611980565b60005a6001600160a01b0386166000908152600460205260408120549192505b8160ff168160ff16101561239157612389878288600061092f565b60010161236e565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b806001811661248b576002546001600160a01b03163314806123fd57506001546001600160a01b031633145b61243c576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b031663324636b3846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b60005a6002549091506001600160a01b03163314806124b457506001546001600160a01b031633145b6124f3576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b031663324636b3856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b8060018116612680576001600160a01b0384166000908152600560209081526040808320338452909152902061257785611b65565b80541561258a5761258a85336000612300565b83156125b257805461259c9085613310565b81556125b26001600160a01b03861633866135b6565b6001600160a01b0385166000908152600460205260408120805490915b8160ff168160ff16101561263757612617670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b6000918252602090912060046006909202010154875490613275565b60ff821660009081526001808701602052604090912091909155016125cf565b5060408051878152905133916001600160a01b038a16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3505050611980565b60005a6001600160a01b038616600090815260056020908152604080832033845290915290209091506126b286611b65565b8054156126c5576126c586336000612300565b84156126ed5780546126d79086613310565b81556126ed6001600160a01b03871633876135b6565b6001600160a01b0386166000908152600460205260408120805490915b8160ff168160ff16101561275657612736670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff8216600090815260018087016020526040909120919091550161270a565b5060408051888152905133916001600160a01b038b16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b6001600160a01b0382166000908152600460205260408120805460ff84169081106127ff57fe5b906000526020600020906006020190506000816002015443116128225743612828565b81600201545b90508160010154811115611980576000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051905080156129175760006128d284600101548461331090919063ffffffff16565b905060006128fd836109ce670de0b6b3a764000061210d89600301548761327590919063ffffffff16565b600486015490915061290f9082613352565b600486015550505b50600191909101555050565b6003546001600160a01b031681565b6000836001600160a01b031663ec2f4f8084846040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f191690920195506020945090925050508083038186803b1580156117ac57600080fd5b6000816001600160a01b031663355274ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d6020811015612a0b57600080fd5b505192915050565b6001546001600160a01b03163314612a60576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8060018116612b45576002546001600160a01b0316331480612aae57506001546001600160a01b031633145b612aed576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b826001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2857600080fd5b505af1158015612b3c573d6000803e3d6000fd5b50505050611afa565b60005a6002549091506001600160a01b0316331480612b6e57506001546001600160a01b031633145b612bad576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612be857600080fd5b505af1158015612bfc573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181612c3f57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c8657600080fd5b505af1158015612c9a573d6000803e3d6000fd5b505050506040513d602081101561174c57600080fd5b6001546001600160a01b03163314612cfd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612d0784846127d8565b6001600160a01b0384166000908152600460205260408120805460ff8616908110612d2e57fe5b906000526020600020906006020190508060020154431115612d80576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b60028101929092556003909101555050565b6001546001600160a01b03163314612ddf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6d4946c0e9f43f4dee607b0ef1fa1c81565b8060018116612f615782612ec057866001600160a01b0316633b3d121033338989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561137557600080fd5b6000876001600160a01b0316633b3d121033308a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561140d57600080fd5b60005a90508361300a57876001600160a01b0316633b3d121033338a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156115c757600080fd5b6000886001600160a01b0316633b3d121033308b8b8b6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561165f57600080fd5b6001546001600160a01b031633146130f8576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b5051156131b0576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b0384168383613608565b6000546001600160a01b031681565b6001600160a01b0380831660008181526005602090815260408083209486168084529482528083205481516370a0823160e01b815260048101969096529051929461326e94919391926370a0823192602480840193829003018186803b15801561323c57600080fd5b505afa158015613250573d6000803e3d6000fd5b505050506040513d602081101561326657600080fd5b505190613352565b9392505050565b60008261328457506000611855565b8282028284828161329157fe5b041461326e5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a536021913960400191505060405180910390fd5b600061326e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061371b565b600061326e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bd565b60008282018381101561326e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156133fb57600080fd5b505afa15801561340f573d6000803e3d6000fd5b505050506040513d602081101561342557600080fd5b505190508082111561344a576134456001600160a01b03851684836135b6565b611980565b6119806001600160a01b03851684846135b6565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611980908590613817565b6001600160a01b038216600090815260056020908152604080832033845290915290206134e483611b65565b8054156134f7576134f783336000612300565b80546135039083613352565b81556001600160a01b0383166000908152600460205260408120805490915b8160ff168160ff16101561356e5761354e670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff82166000908152600180870160205260409091209190915501613522565b5060408051858152905133916001600160a01b038816917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a35050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611afa908490613817565b80158061368e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b5051155b6136c95760405162461bcd60e51b8152600401808060200182810382526036815260200180613a9e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611afa908490613817565b600081836137a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561376c578181015183820152602001613754565b50505050905090810190601f1680156137995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137b357fe5b0495945050505050565b6000818484111561380f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561376c578181015183820152602001613754565b505050900390565b606061386c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c89092919063ffffffff16565b805190915015611afa5780806020019051602081101561388b57600080fd5b5051611afa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613a74602a913960400191505060405180910390fd5b60606138d784846000856138df565b949350505050565b60606138ea85613a4c565b61393b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061397a5780518252601f19909201916020918201910161395b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146139dc576040519150601f19603f3d011682016040523d82523d6000602084013e6139e1565b606091505b509150915081156139f55791506138d79050565b805115613a055780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561376c578181015183820152602001613754565b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce64736f6c634300060c003300000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806382b583701161011a578063ab033ea9116100ad578063c92aecc41161007c578063c92aecc41461082a578063dd78683414610832578063ef9e2379146108c3578063effff82f146108f9578063fbce0cc61461090157610206565b8063ab033ea914610774578063af0fa8a11461079a578063aff083d4146107c9578063c7b9d5301461080457610206565b806392fe92c3116100e957806392fe92c314610697578063974c5226146106c6578063989b9e1b146106ce578063a6bf32d11461074e57610206565b806382b58370146105ac57806384570634146105ee5780638cc8ce3414610628578063903832f91461066257610206565b806347f6512b1161019d5780635aa6e6751161016c5780635aa6e675146104cb578063632447c9146104d357806365ddde07146104f9578063739b78f4146105335780637f6159591461057357610206565b806347f6512b146103ca578063516479b2146103f657806354575af41461045f578063554236691461049557610206565b806323deedcf116101d957806323deedcf146102d6578063341cd53a1461031a57806336cf893c146103685780633995843a1461039e57610206565b806309fd9fc31461020b5780630f208beb1461024c5780631f7e5a691461028c5780631fe4a686146102b2575b600080fd5b61024a6004803603608081101561022157600080fd5b506001600160a01b03813581169160ff602082013581169260408301351691606001351661092f565b005b61027a6004803603604081101561026257600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051918252519081900360200190f35b61024a600480360360208110156102a257600080fd5b50356001600160a01b0316610d38565b6102ba610da7565b604080516001600160a01b039092168252519081900360200190f35b61024a600480360360a08110156102ec57600080fd5b5080356001600160a01b0390811691602081013591604082013516906060810135906080013560ff16610db6565b61024a600480360360c081101561033057600080fd5b5080356001600160a01b0390811691602081013590911690604081013590606081013590608081013515159060a0013560ff166111f6565b61027a6004803603606081101561037e57600080fd5b506001600160a01b03813581169160208101359091169060400135611755565b61027a600480360360408110156103b457600080fd5b506001600160a01b0381351690602001356117e0565b61024a600480360360408110156103e057600080fd5b506001600160a01b03813516906020013561185b565b6104226004803603604081101561040c57600080fd5b506001600160a01b038135169060200135611986565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61024a6004803603606081101561047557600080fd5b506001600160a01b038135811691602081013591604090910135166119e1565b61027a600480360360608110156104ab57600080fd5b506001600160a01b03813581169160208101359160409091013516611aff565b6102ba611b56565b61024a600480360360208110156104e957600080fd5b50356001600160a01b0316611b65565b61024a6004803603606081101561050f57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16611ba0565b61024a6004803603608081101561054957600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013560ff16611e00565b61027a6004803603606081101561058957600080fd5b506001600160a01b03813581169160ff6020820135169160409091013516611fbc565b61024a600480360360a08110156105c257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612165565b61024a6004803603606081101561060457600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff16612300565b61024a6004803603606081101561063e57600080fd5b5080356001600160a01b03908116916020810135909116906040013560ff166123d1565b61024a6004803603606081101561067857600080fd5b5080356001600160a01b0316906020810135906040013560ff16612542565b61024a600480360360408110156106ad57600080fd5b5080356001600160a01b0316906020013560ff166127d8565b6102ba612923565b61027a600480360360408110156106e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050612932565b61027a6004803603602081101561076457600080fd5b50356001600160a01b03166129a6565b61024a6004803603602081101561078a57600080fd5b50356001600160a01b0316612a13565b61024a600480360360408110156107b057600080fd5b5080356001600160a01b0316906020013560ff16612a82565b61024a600480360360808110156107df57600080fd5b506001600160a01b038135169060ff6020820135169060408101359060600135612cb0565b61024a6004803603602081101561081a57600080fd5b50356001600160a01b0316612d92565b6102ba612e01565b61024a600480360360a081101561084857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460208302840111640100000000831117156108a757600080fd5b919350915080359060208101351515906040013560ff16612e13565b61024a600480360360608110156108d957600080fd5b506001600160a01b038135811691602081013590911690604001356130ab565b6102ba6131c4565b61027a6004803603604081101561091757600080fd5b506001600160a01b03813581169160200135166131d3565b8060018116610ad25761094285856127d8565b6001600160a01b038086166000818152600560209081526040808320948816835293815283822092825260049052918220805491929160ff881690811061098557fe5b6000918252602080832060ff8a16845260018601909152604083205460069290920201600481015485549194506109da92916109d491670de0b6b3a7640000916109ce91613275565b906132ce565b90613310565b90508015610aca5760ff87166000908152600284016020526040902054610a019082613352565b60ff881660009081526002850160205260409020556005820154610a259082613352565b60058301558154610a40906001600160a01b031687836133ac565b856001600160a01b0316886001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878984604051808360ff1681526020018281526020019250505060405180910390a360048201548354610ab491670de0b6b3a7640000916109ce91613275565b60ff881660009081526001850160205260409020555b505050610d14565b60005a9050610ae186866127d8565b6001600160a01b038087166000818152600560209081526040808320948916835293815283822092825260049052918220805491929160ff8916908110610b2457fe5b6000918252602080832060ff8b1684526001860190915260408320546006929092020160048101548554919450610b6d92916109d491670de0b6b3a7640000916109ce91613275565b90508015610c5d5760ff88166000908152600284016020526040902054610b949082613352565b60ff891660009081526002850160205260409020556005820154610bb89082613352565b60058301558154610bd3906001600160a01b031688836133ac565b866001600160a01b0316896001600160a01b03167faf206e736916d38b56e2d559931a189bc3119b8fc6d6850bd34e382f090305878a84604051808360ff1681526020018281526020019250505060405180910390a360048201548354610c4791670de0b6b3a7640000916109ce91613275565b60ff891660009081526001850160205260409020555b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b505050506040513d6020811015610d0f57600080fd5b505050505b5050505050565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b03163314610d85576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b8060018116610f7d576000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e0e57600080fd5b505afa158015610e22573d6000803e3d6000fd5b505050506040513d6020811015610e3857600080fd5b5051905080861115610ed5576000610e508783613310565b6001600160a01b0389166000908152600560209081526040808320338452909152902054909150811115610ec7576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b610ed388826000612542565b505b610eea6001600160a01b03881633308961345e565b6040805163073772d560e31b8152336004820152602481018890526001600160a01b038781166044830152606482018790529151918916916339bb96a8916084808201926020929091908290030181600087803b158015610f4a57600080fd5b505af1158015610f5e573d6000803e3d6000fd5b505050506040513d6020811015610f7457600080fd5b506111ee915050565b60005a90506000876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd157600080fd5b505afa158015610fe5573d6000803e3d6000fd5b505050506040513d6020811015610ffb57600080fd5b50519050808711156110985760006110138883613310565b6001600160a01b038a16600090815260056020908152604080832033845290915290205490915081111561108a576040805162461bcd60e51b81526020600482015260196024820152785f7573657242616c2b7374616b6564203c205f73686172657360381b604482015290519081900360640190fd5b61109689826000612542565b505b6110ad6001600160a01b03891633308a61345e565b6040805163073772d560e31b8152336004820152602481018990526001600160a01b038881166044830152606482018890529151918a16916339bb96a8916084808201926020929091908290030181600087803b15801561110d57600080fd5b505af1158015611121573d6000803e3d6000fd5b505050506040513d602081101561113757600080fd5b506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161117857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505050505b505050505050565b806001811661144c57866001600160a01b0316639f005920876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b505050506040513d602081101561127657600080fd5b50516112c9576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b60008511611309576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b826113a75760408051631281099d60e21b8152336004820181905260248201526001600160a01b0388811660448301526064820188905260848201879052915191891691634a0426749160a4808201926020929091908290030181600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050506040513d602081101561139f57600080fd5b506114479050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038881166044830152606482018890526084820187905291516000928a1691634a0426749160a480830192602092919082900301818787803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506040513d602081101561143757600080fd5b5051905061144588826134b8565b505b61174c565b60005a9050876001600160a01b0316639f005920886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b505161151b576040805162461bcd60e51b815260206004820181905260248201527f7661756c7420646f6573206e6f74206163636570742074686973206173736574604482015290519081900360640190fd5b6000861161155b576040805162461bcd60e51b81526020600482015260086024820152670857d85b5bdd5b9d60c21b604482015290519081900360640190fd5b836115f95760408051631281099d60e21b8152336004820181905260248201526001600160a01b03898116604483015260648201899052608482018890529151918a1691634a0426749160a4808201926020929091908290030181600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506040513d60208110156115f157600080fd5b506116999050565b60408051631281099d60e21b81523360048201523060248201526001600160a01b038981166044830152606482018990526084820188905291516000928b1691634a0426749160a480830192602092919082900301818787803b15801561165f57600080fd5b505af1158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b5051905061169789826134b8565b505b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816116d657fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b505050506040513d602081101561174757600080fd5b505050505b50505050505050565b6000836001600160a01b03166338b7f2cb84846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d60208110156117d657600080fd5b5051949350505050565b6000826001600160a01b0316632edeb8cf836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505190505b92915050565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118aa57600080fd5b505afa1580156118be573d6000803e3d6000fd5b505050506040513d60208110156118d457600080fd5b505190506118ed6001600160a01b03841633308561345e565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b505190506119748183613310565b925061198084846134b8565b50505050565b6004602052816000526040600020818154811061199f57fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909186565b6001546001600160a01b03163314611a2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d6020811015611aa557600080fd5b505115611ae6576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b03841682846135b6565b505050565b6000836001600160a01b031663ae2841c784846040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156117ac57600080fd5b6001546001600160a01b031681565b6001600160a01b038116600090815260046020526040812054905b8160ff168160ff161015611afa57611b9883826127d8565b600101611b80565b8060018116611c77576002546001600160a01b0316331480611bcc57506001546001600160a01b031633145b611c0b576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b03166361f13e00846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b50505050611980565b60005a6002549091506001600160a01b0316331480611ca057506001546001600160a01b031633145b611cdf576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b03166361f13e00856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b5050505050505050565b8060018116611ec4576001600160a01b0385166000908152600560209081526040808320338452909152812054611e3991879190612542565b611ebf85866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6020811015611eb457600080fd5b505186866000610db6565b610d14565b60005a6001600160a01b0387166000908152600560209081526040808320338452909152812054919250611ef9918891612542565b611f7f86876001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505187876000610db6565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c9e57fe5b6001600160a01b038084166000818152600560209081526040808320948616835293815283822092825260049052918220805483919060ff8716908110611fff57fe5b906000526020600020906006020190506000816004015490506000876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206757600080fd5b505afa15801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b5051600284015490915060009043116120aa57436120b0565b83600201545b90508360010154811180156120c457508115155b156121245760006120e285600101548361331090919063ffffffff16565b90506000612113846109ce670de0b6b3a764000061210d8a600301548761327590919063ffffffff16565b90613275565b905061211f8582613352565b945050505b60ff88166000908152600186016020526040902054855461215891906109d490670de0b6b3a7640000906109ce9088613275565b9998505050505050505050565b6001546001600160a01b031633146121b2576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03851660009081526004602052604090208054600811612214576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b8343116122215783612223565b435b935082841115612264576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b61226d86611b65565b6040805160c0810182526001600160a01b03968716815260208082019687529181019485526060810193845260006080820181815260a08301828152855460018082018855968452949092209251600690940290920180546001600160a01b0319169390981692909217875594519186019190915591516002850155516003840155905160048301555160059091015550565b806001811661234e576001600160a01b038416600090815260046020526040812054905b8160ff168160ff1610156123475761233f868287600061092f565b600101612324565b5050611980565b60005a6001600160a01b0386166000908152600460205260408120549192505b8160ff168160ff16101561239157612389878288600061092f565b60010161236e565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b806001811661248b576002546001600160a01b03163314806123fd57506001546001600160a01b031633145b61243c576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b031663324636b3846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c5a57600080fd5b60005a6002549091506001600160a01b03163314806124b457506001546001600160a01b031633145b6124f3576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b846001600160a01b031663324636b3856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611d2e57600080fd5b8060018116612680576001600160a01b0384166000908152600560209081526040808320338452909152902061257785611b65565b80541561258a5761258a85336000612300565b83156125b257805461259c9085613310565b81556125b26001600160a01b03861633866135b6565b6001600160a01b0385166000908152600460205260408120805490915b8160ff168160ff16101561263757612617670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b6000918252602090912060046006909202010154875490613275565b60ff821660009081526001808701602052604090912091909155016125cf565b5060408051878152905133916001600160a01b038a16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3505050611980565b60005a6001600160a01b038616600090815260056020908152604080832033845290915290209091506126b286611b65565b8054156126c5576126c586336000612300565b84156126ed5780546126d79086613310565b81556126ed6001600160a01b03871633876135b6565b6001600160a01b0386166000908152600460205260408120805490915b8160ff168160ff16101561275657612736670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff8216600090815260018087016020526040909120919091550161270a565b5060408051888152905133916001600160a01b038b16917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3506000915050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611d8557fe5b6001600160a01b0382166000908152600460205260408120805460ff84169081106127ff57fe5b906000526020600020906006020190506000816002015443116128225743612828565b81600201545b90508160010154811115611980576000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288557600080fd5b505afa158015612899573d6000803e3d6000fd5b505050506040513d60208110156128af57600080fd5b5051905080156129175760006128d284600101548461331090919063ffffffff16565b905060006128fd836109ce670de0b6b3a764000061210d89600301548761327590919063ffffffff16565b600486015490915061290f9082613352565b600486015550505b50600191909101555050565b6003546001600160a01b031681565b6000836001600160a01b031663ec2f4f8084846040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f191690920195506020945090925050508083038186803b1580156117ac57600080fd5b6000816001600160a01b031663355274ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e157600080fd5b505afa1580156129f5573d6000803e3d6000fd5b505050506040513d6020811015612a0b57600080fd5b505192915050565b6001546001600160a01b03163314612a60576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b8060018116612b45576002546001600160a01b0316331480612aae57506001546001600160a01b031633145b612aed576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b826001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2857600080fd5b505af1158015612b3c573d6000803e3d6000fd5b50505050611afa565b60005a6002549091506001600160a01b0316331480612b6e57506001546001600160a01b031633145b612bad576040805162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b604482015290519081900360640190fd5b836001600160a01b0316631997db766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612be857600080fd5b505af1158015612bfc573d6000803e3d6000fd5b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181612c3f57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c8657600080fd5b505af1158015612c9a573d6000803e3d6000fd5b505050506040513d602081101561174c57600080fd5b6001546001600160a01b03163314612cfd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612d0784846127d8565b6001600160a01b0384166000908152600460205260408120805460ff8616908110612d2e57fe5b906000526020600020906006020190508060020154431115612d80576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b60028101929092556003909101555050565b6001546001600160a01b03163314612ddf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6d4946c0e9f43f4dee607b0ef1fa1c81565b8060018116612f615782612ec057866001600160a01b0316633b3d121033338989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561137557600080fd5b6000876001600160a01b0316633b3d121033308a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561140d57600080fd5b60005a90508361300a57876001600160a01b0316633b3d121033338a8a8a6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b1580156115c757600080fd5b6000886001600160a01b0316633b3d121033308b8b8b6040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561165f57600080fd5b6001546001600160a01b031633146130f8576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003546040805163652b9b4160e01b81526001600160a01b0386811660048301529151919092169163652b9b41916024808301926020929190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b5051156131b0576040805162461bcd60e51b815260206004820152600a6024820152693b30bab63a2a37b5b2b760b11b604482015290519081900360640190fd5b611afa6001600160a01b0384168383613608565b6000546001600160a01b031681565b6001600160a01b0380831660008181526005602090815260408083209486168084529482528083205481516370a0823160e01b815260048101969096529051929461326e94919391926370a0823192602480840193829003018186803b15801561323c57600080fd5b505afa158015613250573d6000803e3d6000fd5b505050506040513d602081101561326657600080fd5b505190613352565b9392505050565b60008261328457506000611855565b8282028284828161329157fe5b041461326e5760405162461bcd60e51b8152600401808060200182810382526021815260200180613a536021913960400191505060405180910390fd5b600061326e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061371b565b600061326e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bd565b60008282018381101561326e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156133fb57600080fd5b505afa15801561340f573d6000803e3d6000fd5b505050506040513d602081101561342557600080fd5b505190508082111561344a576134456001600160a01b03851684836135b6565b611980565b6119806001600160a01b03851684846135b6565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611980908590613817565b6001600160a01b038216600090815260056020908152604080832033845290915290206134e483611b65565b8054156134f7576134f783336000612300565b80546135039083613352565b81556001600160a01b0383166000908152600460205260408120805490915b8160ff168160ff16101561356e5761354e670de0b6b3a76400006109ce858460ff16815481106125fb57fe5b60ff82166000908152600180870160205260409091209190915501613522565b5060408051858152905133916001600160a01b038816917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a35050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611afa908490613817565b80158061368e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b5051155b6136c95760405162461bcd60e51b8152600401808060200182810382526036815260200180613a9e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611afa908490613817565b600081836137a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561376c578181015183820152602001613754565b50505050905090810190601f1680156137995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137b357fe5b0495945050505050565b6000818484111561380f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561376c578181015183820152602001613754565b505050900390565b606061386c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c89092919063ffffffff16565b805190915015611afa5780806020019051602081101561388b57600080fd5b5051611afa5760405162461bcd60e51b815260040180806020018281038252602a815260200180613a74602a913960400191505060405180910390fd5b60606138d784846000856138df565b949350505050565b60606138ea85613a4c565b61393b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061397a5780518252601f19909201916020918201910161395b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146139dc576040519150601f19603f3d011682016040523d82523d6000602084013e6139e1565b606091505b509150915081156139f55791506138d79050565b805115613a055780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561376c578181015183820152602001613754565b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3
-----Decoded View---------------
Arg [0] : _valueToken (address): 0x49E833337ECe7aFE375e44F4E3e8481029218E5c
Arg [1] : _vaultMaster (address): 0xEa48B3F50f3Cf2216e34e2E868Abc810B729F0E3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c
Arg [1] : 000000000000000000000000ea48b3f50f3cf2216e34e2e868abc810b729f0e3
Deployed Bytecode Sourcemap
21516:14437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30430:883;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30430:883:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23077:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23077:64:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23993:169;;;;;;;;;;;;;;;;-1:-1:-1;23993:169:0;-1:-1:-1;;;;;23993:169:0;;:::i;22176:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;22176:25:0;;;;;;;;;;;;;;32562:632;;;;;;;;;;;;;;;;-1:-1:-1;32562:632:0;;-1:-1:-1;;;;;32562:632:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26986:602::-;;;;;;;;;;;;;;;;-1:-1:-1;26986:602:0;;-1:-1:-1;;;;;26986:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34066:168::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34066:168:0;;;;;;;;;;;;;;;;;:::i;33517:144::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33517:144:0;;;;;;;;:::i;28075:436::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28075:436:0;;;;;;;;:::i;22981:59::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22981:59:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;22981:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35683:267;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35683:267:0;;;;;;;;;;;;;;;;;:::i;33860:198::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33860:198:0;;;;;;;;;;;;;;;;;:::i;22144:25::-;;;:::i;25477:247::-;;;;;;;;;;;;;;;;-1:-1:-1;25477:247:0;-1:-1:-1;;;;;25477:247:0;;:::i;34242:249::-;;;;;;;;;;;;;;;;-1:-1:-1;34242:249:0;;-1:-1:-1;;;;;34242:249:0;;;;;;;;;;;;;;;;;;:::i;33202:307::-;;;;;;;;;;;;;;;;-1:-1:-1;33202:307:0;;-1:-1:-1;;;;;33202:307:0;;;;;;;;;;;;;;;;;;;;;;;:::i;31321:975::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31321:975:0;;;;;;;;;;;;;;;;;;;:::i;24170:823::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24170:823:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30111:311::-;;;;;;;;;;;;;;;;-1:-1:-1;30111:311:0;;-1:-1:-1;;;;;30111:311:0;;;;;;;;;;;;;;;;;;:::i;34499:233::-;;;;;;;;;;;;;;;;-1:-1:-1;34499:233:0;;-1:-1:-1;;;;;34499:233:0;;;;;;;;;;;;;;;;;;:::i;29259:817::-;;;;;;;;;;;;;;;;-1:-1:-1;29259:817:0;;-1:-1:-1;;;;;29259:817:0;;;;;;;;;;;;;:::i;25732:856::-;;;;;;;;;;;;;;;;-1:-1:-1;25732:856:0;;-1:-1:-1;;;;;25732:856:0;;;;;;;;:::i;22239:36::-;;;:::i;33669:183::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33669:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33669:183:0;;-1:-1:-1;33669:183:0;-1:-1:-1;33669:183:0;:::i;26596:105::-;;;;;;;;;;;;;;;;-1:-1:-1;26596:105:0;-1:-1:-1;;;;;26596:105:0;;:::i;23667:155::-;;;;;;;;;;;;;;;;-1:-1:-1;23667:155:0;-1:-1:-1;;;;;23667:155:0;;:::i;34740:231::-;;;;;;;;;;;;;;;;-1:-1:-1;34740:231:0;;-1:-1:-1;;;;;34740:231:0;;;;;;;;:::i;25001:468::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25001:468:0;;;;;;;;;;;;;;;;;;;;:::i;23830:155::-;;;;;;;;;;;;;;;;-1:-1:-1;23830:155:0;-1:-1:-1;;;;;23830:155:0;;:::i;21617:93::-;;;:::i;27596:471::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27596:471:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27596:471:0;-1:-1:-1;27596:471:0;;;;;;;;;;;;;;;;:::i;26709:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26709:269:0;;;;;;;;;;;;;;;;;:::i;22058:77::-;;;:::i;32304:182::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32304:182:0;;;;;;;;;;:::i;30430:883::-;30527:5;21777:3;21769:11;;21764:279;;30545:30:::1;30562:6;30570:4;30545:16;:30::i;:::-;-1:-1:-1::0;;;;;30610:16:0;;::::1;30586:21;30610:16:::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;30683:23;;;:15:::1;:23:::0;;;;;:29;;30610:26;;30586:21;30683:29:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;;::::1;::::0;;;30805:21:::1;::::0;::::1;::::0;;:15:::1;::::0;::::1;:21:::0;;;;;;;30683:29:::1;::::0;;;::::1;;30761:28;::::0;::::1;::::0;30745:11;;30683:29;;-1:-1:-1;30745:82:0::1;::::0;30805:21;30745:55:::1;::::0;30795:4:::1;::::0;30745:45:::1;::::0;:15:::1;:45::i;:::-;:49:::0;::::1;:55::i;:::-;:59:::0;::::1;:82::i;:::-;30723:104:::0;-1:-1:-1;30842:18:0;;30838:468:::1;;30908:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;;:48:::1;::::0;30941:14;30908:32:::1;:48::i;:::-;30877:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;:79;31001:27:::1;::::0;::::1;::::0;:47:::1;::::0;31033:14;31001:31:::1;:47::i;:::-;30971:27;::::0;::::1;:77:::0;31081:22;;31063:67:::1;::::0;-1:-1:-1;;;;;31081:22:0::1;31105:8:::0;31115:14;31063:17:::1;:67::i;:::-;31175:8;-1:-1:-1::0;;;;;31150:50:0::1;31161:6;-1:-1:-1::0;;;;;31150:50:0::1;;31169:4;31185:14;31150:50;;;;;;;;;;;;;;;;;;;;;;;;;;31255:28;::::0;::::1;::::0;31239:11;;:55:::1;::::0;31289:4:::1;::::0;31239:45:::1;::::0;:15:::1;:45::i;:55::-;31215:21;::::0;::::1;;::::0;;;:15:::1;::::0;::::1;:21;::::0;;;;:79;30838:468:::1;21803:1;;;21764:279:::0;;;21837:13;21853:9;21837:25;;30545:30:::1;30562:6;30570:4;30545:16;:30::i;:::-;-1:-1:-1::0;;;;;30610:16:0;;::::1;30586:21;30610:16:::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;30683:23;;;:15:::1;:23:::0;;;;;:29;;30610:26;;30586:21;30683:29:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;;::::1;::::0;;;30805:21:::1;::::0;::::1;::::0;;:15:::1;::::0;::::1;:21:::0;;;;;;;30683:29:::1;::::0;;;::::1;;30761:28;::::0;::::1;::::0;30745:11;;30683:29;;-1:-1:-1;30745:82:0::1;::::0;30805:21;30745:55:::1;::::0;30795:4:::1;::::0;30745:45:::1;::::0;:15:::1;:45::i;:82::-;30723:104:::0;-1:-1:-1;30842:18:0;;30838:468:::1;;30908:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;;:48:::1;::::0;30941:14;30908:32:::1;:48::i;:::-;30877:28;::::0;::::1;;::::0;;;:22:::1;::::0;::::1;:28;::::0;;;;:79;31001:27:::1;::::0;::::1;::::0;:47:::1;::::0;31033:14;31001:31:::1;:47::i;:::-;30971:27;::::0;::::1;:77:::0;31081:22;;31063:67:::1;::::0;-1:-1:-1;;;;;31081:22:0::1;31105:8:::0;31115:14;31063:17:::1;:67::i;:::-;31175:8;-1:-1:-1::0;;;;;31150:50:0::1;31161:6;-1:-1:-1::0;;;;;31150:50:0::1;;31169:4;31185:14;31150:50;;;;;;;;;;;;;;;;;;;;;;;;;;31255:28;::::0;::::1;::::0;31239:11;;:55:::1;::::0;31289:4:::1;::::0;31239:45:::1;::::0;:15:::1;:45::i;:55::-;31215:21;::::0;::::1;;::::0;;;:15:::1;::::0;::::1;:21;::::0;;;;:79;30838:468:::1;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;30430:883;;;;;:::o;23077:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;23993:169::-;24091:10;;-1:-1:-1;;;;;24091:10:0;24077;:24;24069:48;;;;;-1:-1:-1;;;24069:48:0;;;;;;;;;;;;-1:-1:-1;;;24069:48:0;;;;;;;;;;;;;;;24128:11;:26;;-1:-1:-1;;;;;;24128:26:0;-1:-1:-1;;;;;24128:26:0;;;;;;;;;;23993:169::o;22176:25::-;;;-1:-1:-1;;;;;22176:25:0;;:::o;32562:632::-;32684:5;21777:3;21769:11;;21764:279;;32702:13:::1;32733:6;-1:-1:-1::0;;;;;32718:33:0::1;;32752:10;32718:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;32718:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32718:45:0;;-1:-1:-1;32778:18:0;;::::1;32774:229;;;32813:10;32826:21;:7:::0;32838:8;32826:11:::1;:21::i;:::-;-1:-1:-1::0;;;;;32879:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;32896:10:::1;32879:28:::0;;;;;;;:35;32813:34;;-1:-1:-1;32870:44:0;::::1;;32862:82;;;::::0;;-1:-1:-1;;;32862:82:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32862:82:0;;;;;;;;;;;;;::::1;;32959:32;32967:6;32975:5;32988:1;32959:7;:32::i;:::-;32774:229;;33013:76;-1:-1:-1::0;;;;;33013:40:0;::::1;33054:10;33074:4;33081:7:::0;33013:40:::1;:76::i;:::-;33100:86;::::0;;-1:-1:-1;;;33100:86:0;;33137:10:::1;33100:86;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;33100:86:0;;::::1;::::0;;;;;;;;;;;;:36;;::::1;::::0;::::1;::::0;:86;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;33100:36:0;:86;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21764:279:0;;-1:-1:-1;;21764:279:0;;21837:13;21853:9;21837:25;;32702:13:::1;32733:6;-1:-1:-1::0;;;;;32718:33:0::1;;32752:10;32718:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;32718:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32718:45:0;;-1:-1:-1;32778:18:0;;::::1;32774:229;;;32813:10;32826:21;:7:::0;32838:8;32826:11:::1;:21::i;:::-;-1:-1:-1::0;;;;;32879:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;32896:10:::1;32879:28:::0;;;;;;;:35;32813:34;;-1:-1:-1;32870:44:0;::::1;;32862:82;;;::::0;;-1:-1:-1;;;32862:82:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32862:82:0;;;;;;;;;;;;;::::1;;32959:32;32967:6;32975:5;32988:1;32959:7;:32::i;:::-;32774:229;;33013:76;-1:-1:-1::0;;;;;33013:40:0;::::1;33054:10;33074:4;33081:7:::0;33013:40:::1;:76::i;:::-;33100:86;::::0;;-1:-1:-1;;;33100:86:0;;33137:10:::1;33100:86;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;33100:86:0;;::::1;::::0;;;;;;;;;;;;:36;;::::1;::::0;::::1;::::0;:86;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;33100:36:0;:86;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;32562:632;;;;;;:::o;26986:602::-;27128:5;21777:3;21769:11;;21764:279;;27154:6:::1;-1:-1:-1::0;;;;;27154:13:0::1;;27168:6;27154:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;27154:21:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27154:21:0;27146:66:::1;;;::::0;;-1:-1:-1;;;27146:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27241:1;27231:7;:11;27223:32;;;::::0;;-1:-1:-1;;;27223:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27223:32:0;;;;;;;;;;;;;::::1;;27273:8;27268:313;;27298:76;::::0;;-1:-1:-1;;;27298:76:0;;27316:10:::1;27298:76;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;27298:76:0;;::::1;::::0;;;;;;;;;;;;;;;;;;:17;;::::1;::::0;::::1;::::0;:76;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;27298:17:0;:76;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27268:313:0::1;::::0;-1:-1:-1;27268:313:0::1;;27427:79;::::0;;-1:-1:-1;;;27427:79:0;;27445:10:::1;27427:79;::::0;::::1;::::0;27465:4:::1;27427:79:::0;;;;-1:-1:-1;;;;;27427:79:0;;::::1;::::0;;;;;;;;;;;;;;;;;;27407:17:::1;::::0;27427;::::1;::::0;::::1;::::0;:79;;;;;::::1;::::0;;;;;;;;27407:17;27427;:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27427:79:0;;-1:-1:-1;27521:48:0::1;27547:6:::0;27427:79;27521:17:::1;:48::i;:::-;27268:313;;21764:279:::0;;;21837:13;21853:9;21837:25;;27154:6:::1;-1:-1:-1::0;;;;;27154:13:0::1;;27168:6;27154:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;27154:21:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27154:21:0;27146:66:::1;;;::::0;;-1:-1:-1;;;27146:66:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27241:1;27231:7;:11;27223:32;;;::::0;;-1:-1:-1;;;27223:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27223:32:0;;;;;;;;;;;;;::::1;;27273:8;27268:313;;27298:76;::::0;;-1:-1:-1;;;27298:76:0;;27316:10:::1;27298:76;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;27298:76:0;;::::1;::::0;;;;;;;;;;;;;;;;;;:17;;::::1;::::0;::::1;::::0;:76;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;27298:17:0;:76;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27268:313:0::1;::::0;-1:-1:-1;27268:313:0::1;;27427:79;::::0;;-1:-1:-1;;;27427:79:0;;27445:10:::1;27427:79;::::0;::::1;::::0;27465:4:::1;27427:79:::0;;;;-1:-1:-1;;;;;27427:79:0;;::::1;::::0;;;;;;;;;;;;;;;;;;27407:17:::1;::::0;27427;::::1;::::0;::::1;::::0;:79;;;;;::::1;::::0;;;;;;;;27407:17;27427;:79;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27427:79:0;;-1:-1:-1;27521:48:0::1;27547:6:::0;27427:79;27521:17:::1;:48::i;:::-;27268:313;;21893:13:::0;21940:2;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21764:279:0;26986:602;;;;;;;:::o;34066:168::-;34166:4;34190:6;-1:-1:-1;;;;;34190:19:0;;34210:6;34218:7;34190:36;;;;;;;;;;;;;-1:-1:-1;;;;;34190:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34190:36:0;;34066:168;-1:-1:-1;;;;34066:168:0:o;33517:144::-;33601:4;33625:6;-1:-1:-1;;;;;33625:19:0;;33645:7;33625:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33625:28:0;;-1:-1:-1;33517:144:0;;;;;:::o;28075:436::-;28151:12;28181:6;-1:-1:-1;;;;;28166:33:0;;28208:4;28166:48;;;;;;;;;;;;;-1:-1:-1;;;;;28166:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28166:48:0;;-1:-1:-1;28225:76:0;-1:-1:-1;;;;;28225:40:0;;28266:10;28286:4;28293:7;28225:40;:76::i;:::-;28312:11;28341:6;-1:-1:-1;;;;;28326:33:0;;28368:4;28326:48;;;;;;;;;;;;;-1:-1:-1;;;;;28326:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28326:48:0;;-1:-1:-1;28395:19:0;28326:48;28406:7;28395:10;:19::i;:::-;28385:29;;28469:34;28487:6;28495:7;28469:17;:34::i;:::-;28075:436;;;;:::o;22981:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22981:59:0;;;;-1:-1:-1;22981:59:0;;-1:-1:-1;22981:59:0;;;;:::o;35683:267::-;35803:10;;-1:-1:-1;;;;;35803:10:0;35789;:24;35781:48;;;;;-1:-1:-1;;;35781:48:0;;;;;;;;;;;;-1:-1:-1;;;35781:48:0;;;;;;;;;;;;;;;35849:11;;:36;;;-1:-1:-1;;;35849:36:0;;-1:-1:-1;;;;;35849:36:0;;;;;;;;;:11;;;;;:19;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35849:36:0;35848:37;35840:60;;;;;-1:-1:-1;;;35840:60:0;;;;;;;;;;;;-1:-1:-1;;;35840:60:0;;;;;;;;;;;;;;;35911:31;-1:-1:-1;;;;;35911:19:0;;35931:2;35935:6;35911:19;:31::i;:::-;35683:267;;;:::o;33860:198::-;33975:4;33999:6;-1:-1:-1;;;;;33999:33:0;;34033:7;34042;33999:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33999:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22144:25;;;-1:-1:-1;;;;;22144:25:0;;:::o;25477:247::-;-1:-1:-1;;;;;25564:23:0;;25533:22;25564:23;;;:15;:23;;;;;:30;;25606:111;25634:16;25627:23;;:4;:23;;;25606:111;;;25675:30;25692:6;25700:4;25675:16;:30::i;:::-;25652:6;;25606:111;;34242:249;34345:5;21777:3;21769:11;;21764:279;;34385:10:::1;::::0;-1:-1:-1;;;;;34385:10:0::1;34371;:24;::::0;:52:::1;;-1:-1:-1::0;34413:10:0::1;::::0;-1:-1:-1;;;;;34413:10:0::1;34399;:24;34371:52;34363:76;;;::::0;;-1:-1:-1;;;34363:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34363:76:0;;;;;;;;;;;;;::::1;;34450:6;-1:-1:-1::0;;;;;34450:22:0::1;;34473:9;34450:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;34450:33:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21764:279:::0;;;21837:13;21853:9;34385:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34385:10:0::1;34371;:24;::::0;:52:::1;;-1:-1:-1::0;34413:10:0::1;::::0;-1:-1:-1;;;;;34413:10:0::1;34399;:24;34371:52;34363:76;;;::::0;;-1:-1:-1;;;34363:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34363:76:0;;;;;;;;;;;;;::::1;;34450:6;-1:-1:-1::0;;;;;34450:22:0::1;;34473:9;34450:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;34450:33:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;;-1:-1:-1;21928:9:0;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;34242:249:0;;;;:::o;33202:307::-;33308:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;33342:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;33359:10:::1;33342:28:::0;;;;;;;:35;33326:62:::1;::::0;33334:6;;33342:35;33326:7:::1;:62::i;:::-;33399:102;33408:6;33431;-1:-1:-1::0;;;;;33416:33:0::1;;33450:10;33416:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;33416:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33416:45:0;33463:7;33472:18;33498:1:::1;33399:8;:102::i;:::-;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;33342:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;;;33359:10:::1;33342:28:::0;;;;;;;:35;21837:25;;-1:-1:-1;33326:62:0::1;::::0;33334:6;;33326:7:::1;:62::i;:::-;33399:102;33408:6;33431;-1:-1:-1::0;;;;;33416:33:0::1;;33450:10;33416:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;33416:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33416:45:0;33463:7;33472:18;33498:1:::1;33399:8;:102::i;:::-;21893:13:::0;21940:2;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;31321:975;-1:-1:-1;;;;;31461:16:0;;;31411:13;31461:16;;;:8;:16;;;;;;;;:26;;;;;;;;;;;31534:23;;;:15;:23;;;;;:29;;31411:13;;31534:23;:29;;;;;;;;;;;;;;;;;;;;31498:65;;31574:23;31600:10;:28;;;31574:54;;31639:13;31662:6;-1:-1:-1;;;;;31655:24:0;;31688:4;31655:39;;;;;;;;;;;;;-1:-1:-1;;;;;31655:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31655:39:0;31753:25;;;;31655:39;;-1:-1:-1;31705:30:0;;31738:12;:40;:83;;31809:12;31738:83;;;31781:10;:25;;;31738:83;31705:116;;31864:10;:26;;;31836:25;:54;:71;;;;-1:-1:-1;31894:13:0;;;31836:71;31832:363;;;31924:15;31942:57;31972:10;:26;;;31942:25;:29;;:57;;;;:::i;:::-;31924:75;;32014:23;32040:65;32096:8;32040:51;32086:4;32040:41;32055:10;:25;;;32040:10;:14;;:41;;;;:::i;:::-;:45;;:51::i;:65::-;32014:91;-1:-1:-1;32141:42:0;:18;32014:91;32141:22;:42::i;:::-;32120:63;;31832:363;;;32266:21;;;;;;;:15;;;:21;;;;;;32216:11;;:72;;32266:21;32216:45;;32256:4;;32216:35;;32232:18;32216:15;:35::i;:72::-;32205:83;31321:975;-1:-1:-1;;;;;;;;;31321:975:0:o;24170:823::-;24339:10;;-1:-1:-1;;;;;24339:10:0;24325;:24;24317:48;;;;;-1:-1:-1;;;24317:48:0;;;;;;;;;;;;-1:-1:-1;;;24317:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24415:23:0;;24376:36;24415:23;;;:15;:23;;;;;24457:18;;24478:1;-1:-1:-1;24449:52:0;;;;;-1:-1:-1;;;24449:52:0;;;;;;;;;;;;-1:-1:-1;;;24449:52:0;;;;;;;;;;;;;;;24542:11;24527:12;:26;24526:57;;24572:11;24526:57;;;24557:12;24526:57;24512:71;;24617:15;24602:11;:30;;24594:50;;;;;-1:-1:-1;;;24594:50:0;;;;;;;;;;;;-1:-1:-1;;;24594:50:0;;;;;;;;;;;;;;;24655:20;24668:6;24655:12;:20::i;:::-;24703:281;;;;;;;;-1:-1:-1;;;;;24703:281:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24703:281:0;;;;;;;;;;;;24686:299;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24686:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24170:823:0:o;30111:311::-;30200:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;30249:23:0;::::1;30218:22;30249:23:::0;;;:15:::1;:23;::::0;;;;:30;;30291:124:::1;30319:16;30312:23;;:4;:23;;;30291:124;;;30360:43;30370:6;30378:4;30384:8;30400:1;30360:9;:43::i;:::-;30337:6;;30291:124;;;;21803:1;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;30249:23:0;::::1;30218:22;30249:23:::0;;;:15:::1;:23;::::0;;;;:30;21837:25;;-1:-1:-1;30291:124:0::1;30319:16;30312:23;;:4;:23;;;30291:124;;;30360:43;30370:6;30378:4;30384:8;30400:1;30360:9;:43::i;:::-;30337:6;;30291:124;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;34499:233;34594:5;21777:3;21769:11;;21764:279;;34634:10:::1;::::0;-1:-1:-1;;;;;34634:10:0::1;34620;:24;::::0;:52:::1;;-1:-1:-1::0;34662:10:0::1;::::0;-1:-1:-1;;;;;34662:10:0::1;34648;:24;34620:52;34612:76;;;::::0;;-1:-1:-1;;;34612:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34612:76:0;;;;;;;;;;;;;::::1;;34699:6;-1:-1:-1::0;;;;;34699:18:0::1;;34718:5;34699:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;34699:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21764:279:::0;21837:13;21853:9;34634:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34634:10:0::1;34620;:24;::::0;:52:::1;;-1:-1:-1::0;34662:10:0::1;::::0;-1:-1:-1;;;;;34662:10:0::1;34648;:24;34620:52;34612:76;;;::::0;;-1:-1:-1;;;34612:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34612:76:0;;;;;;;;;;;;;::::1;;34699:6;-1:-1:-1::0;;;;;34699:18:0::1;;34718:5;34699:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;34699:25:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;29259:817:::0;29338:5;21777:3;21769:11;;21764:279;;-1:-1:-1;;;;;29380:16:0;::::1;29356:21;29380:16:::0;;;:8:::1;:16;::::0;;;;;;;29397:10:::1;29380:28:::0;;;;;;;29419:20:::1;29389:6:::0;29419:12:::1;:20::i;:::-;29454:11:::0;;:15;29450:91:::1;;29486:43;29500:6;29508:10;29526:1;29486:13;:43::i;:::-;29555:11:::0;;29551:154:::1;;29597:11:::0;;:24:::1;::::0;29613:7;29597:15:::1;:24::i;:::-;29583:38:::0;;29636:57:::1;-1:-1:-1::0;;;;;29636:36:0;::::1;29673:10;29685:7:::0;29636:36:::1;:57::i;:::-;-1:-1:-1::0;;;;;29754:23:0;::::1;29715:36;29754:23:::0;;;:15:::1;:23;::::0;;;;29819:18;;29754:23;;29849:167:::1;29877:16;29870:23;;:4;:23;;;29849:167;;;29942:62;29999:4;29942:52;29958:11;29970:4;29958:17;;;;;;;;;;;::::0;;;::::1;::::0;;;:35:::1;:17;::::0;;::::1;;:35;::::0;29942:11;;;:15:::1;:52::i;:62::-;29918:21;::::0;::::1;;::::0;;;:15:::1;::::0;;::::1;:21;::::0;;;;;:86;;;;29895:6:::1;29849:167;;;-1:-1:-1::0;30031:37:0::1;::::0;;;;;;;30048:10:::1;::::0;-1:-1:-1;;;;;30031:37:0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;21803:1;;;21764:279:::0;;;21837:13;21853:9;-1:-1:-1;;;;;29380:16:0;::::1;29356:21;29380:16:::0;;;:8:::1;:16;::::0;;;;;;;29397:10:::1;29380:28:::0;;;;;;;21837:25;;-1:-1:-1;29419:20:0::1;29389:6:::0;29419:12:::1;:20::i;:::-;29454:11:::0;;:15;29450:91:::1;;29486:43;29500:6;29508:10;29526:1;29486:13;:43::i;:::-;29555:11:::0;;29551:154:::1;;29597:11:::0;;:24:::1;::::0;29613:7;29597:15:::1;:24::i;:::-;29583:38:::0;;29636:57:::1;-1:-1:-1::0;;;;;29636:36:0;::::1;29673:10;29685:7:::0;29636:36:::1;:57::i;:::-;-1:-1:-1::0;;;;;29754:23:0;::::1;29715:36;29754:23:::0;;;:15:::1;:23;::::0;;;;29819:18;;29754:23;;29849:167:::1;29877:16;29870:23;;:4;:23;;;29849:167;;;29942:62;29999:4;29942:52;29958:11;29970:4;29958:17;;;;;;;;;29942:62;29918:21;::::0;::::1;;::::0;;;:15:::1;::::0;;::::1;:21;::::0;;;;;:86;;;;29895:6:::1;29849:167;;;-1:-1:-1::0;30031:37:0::1;::::0;;;;;;;30048:10:::1;::::0;-1:-1:-1;;;;;30031:37:0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;21928:9;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;25732:856;-1:-1:-1;;;;;25840:23:0;;25804:33;25840:23;;;:15;:23;;;;;:29;;;;;;;;;;;;;;;;;;;;;;25804:65;;25880:30;25928:10;:25;;;25913:12;:40;:83;;25984:12;25913:83;;;25956:10;:25;;;25913:83;25880:116;;26039:10;:26;;;26011:25;:54;26007:574;;;26082:13;26113:6;-1:-1:-1;;;;;26098:33:0;;26140:4;26098:48;;;;;;;;;;;;;-1:-1:-1;;;;;26098:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26098:48:0;;-1:-1:-1;26165:12:0;;26161:340;;26198:15;26216:57;26246:10;:26;;;26216:25;:29;;:57;;;;:::i;:::-;26198:75;;26292:23;26318:65;26374:8;26318:51;26364:4;26318:41;26333:10;:25;;;26318:10;:14;;:41;;;;:::i;:65::-;26433:28;;;;26292:91;;-1:-1:-1;26433:52:0;;26292:91;26433:32;:52::i;:::-;26402:28;;;:83;-1:-1:-1;;26161:340:0;-1:-1:-1;26515:26:0;;;;;:54;-1:-1:-1;;25732:856:0:o;22239:36::-;;;-1:-1:-1;;;;;22239:36:0;;:::o;33669:183::-;33778:4;33802:6;-1:-1:-1;;;;;33802:32:0;;33835:8;;33802:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33802:42:0;;;;;-1:-1:-1;33802:42:0;;-1:-1:-1;33802:42:0;;-1:-1:-1;;;33802:42:0;;;;;;;;;;;;;;;26596:105;26657:4;26681:6;-1:-1:-1;;;;;26681:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26681:12:0;;26596:105;-1:-1:-1;;26596:105:0:o;23667:155::-;23753:10;;-1:-1:-1;;;;;23753:10:0;23739;:24;23731:48;;;;;-1:-1:-1;;;23731:48:0;;;;;;;;;;;;-1:-1:-1;;;23731:48:0;;;;;;;;;;;;;;;23790:10;:24;;-1:-1:-1;;;;;;23790:24:0;-1:-1:-1;;;;;23790:24:0;;;;;;;;;;23667:155::o;34740:231::-;34829:5;21777:3;21769:11;;21764:279;;34869:10:::1;::::0;-1:-1:-1;;;;;34869:10:0::1;34855;:24;::::0;:52:::1;;-1:-1:-1::0;34897:10:0::1;::::0;-1:-1:-1;;;;;34897:10:0::1;34883;:24;34855:52;34847:76;;;::::0;;-1:-1:-1;;;34847:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34847:76:0;;;;;;;;;;;;;::::1;;34934:6;-1:-1:-1::0;;;;;34934:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21764:279:::0;;;21837:13;21853:9;34869:10:::1;::::0;21837:25;;-1:-1:-1;;;;;;34869:10:0::1;34855;:24;::::0;:52:::1;;-1:-1:-1::0;34897:10:0::1;::::0;-1:-1:-1;;;;;34897:10:0::1;34883;:24;34855:52;34847:76;;;::::0;;-1:-1:-1;;;34847:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34847:76:0;;;;;;;;;;;;;::::1;;34934:6;-1:-1:-1::0;;;;;34934:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;21893:13:0;;-1:-1:-1;;21940:2:0;21945:8;21940:20;;-1:-1:-1;21928:9:0;21917:8;21909:5;:16;:28;:51;21893:67;;21667:42;-1:-1:-1;;;;;21975:16:0;;21992:10;22025:5;22005:8;22016:5;22005:16;22004:26;;;;;;21975:56;;;;;;;;;;;;;-1:-1:-1;;;;;21975:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25001:468;25141:10;;-1:-1:-1;;;;;25141:10:0;25127;:24;25119:48;;;;;-1:-1:-1;;;25119:48:0;;;;;;;;;;;;-1:-1:-1;;;25119:48:0;;;;;;;;;;;;;;;25178:30;25195:6;25203:4;25178:16;:30::i;:::-;-1:-1:-1;;;;;25255:23:0;;25219:33;25255:23;;;:15;:23;;;;;:29;;;;;;;;;;;;;;;;;;;;;;25219:65;;25319:10;:25;;;25303:12;:41;;25295:58;;;;;-1:-1:-1;;;25295:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;25295:58:0;;;;;;;;;;;;;;;25364:25;;;:43;;;;25418:25;;;;:43;-1:-1:-1;;25001:468:0:o;23830:155::-;23916:10;;-1:-1:-1;;;;;23916:10:0;23902;:24;23894:48;;;;;-1:-1:-1;;;23894:48:0;;;;;;;;;;;;-1:-1:-1;;;23894:48:0;;;;;;;;;;;;;;;23953:10;:24;;-1:-1:-1;;;;;;23953:24:0;-1:-1:-1;;;;;23953:24:0;;;;;;;;;;23830:155::o;21617:93::-;21667:42;21617:93;:::o;27596:471::-;27737:5;21777:3;21769:11;;21764:279;;27760:8:::1;27755:305;;27785:6;-1:-1:-1::0;;;;;27785:20:0::1;;27806:10;27818;27830:8;;27840:16;27785:72;;;;;;;;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;27755:305;27890:17;27910:6;-1:-1:-1::0;;;;;27910:20:0::1;;27931:10;27951:4;27958:8;;27968:16;27910:75;;;;;;;;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21764:279:::0;21837:13;21853:9;21837:25;;27760:8:::1;27755:305;;27785:6;-1:-1:-1::0;;;;;27785:20:0::1;;27806:10;27818;27830:8;;27840:16;27785:72;;;;;;;;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;-1:-1:-1::0;;;;;27785:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;27755:305;27890:17;27910:6;-1:-1:-1::0;;;;;27910:20:0::1;;27931:10;27951:4;27958:8;;27968:16;27910:75;;;;;;;;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;-1:-1:-1::0;;;;;27910:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;26709:269:::0;26825:10;;-1:-1:-1;;;;;26825:10:0;26811;:24;26803:48;;;;;-1:-1:-1;;;26803:48:0;;;;;;;;;;;;-1:-1:-1;;;26803:48:0;;;;;;;;;;;;;;;26871:11;;:36;;;-1:-1:-1;;;26871:36:0;;-1:-1:-1;;;;;26871:36:0;;;;;;;;;:11;;;;;:19;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26871:36:0;26870:37;26862:60;;;;;-1:-1:-1;;;26862:60:0;;;;;;;;;;;;-1:-1:-1;;;26862:60:0;;;;;;;;;;;;;;;26933:37;-1:-1:-1;;;;;26933:18:0;;26952:8;26962:7;26933:18;:37::i;22058:77::-;;;-1:-1:-1;;;;;22058:77:0;;:::o;32304:182::-;-1:-1:-1;;;;;32444:16:0;;;32381:4;32444:16;;;:8;:16;;;;;;;;:26;;;;;;;;;;;;:33;32405:34;;-1:-1:-1;;;32405:34:0;;;;;;;;;;;32381:4;;32405:73;;32444:33;;:16;;32405:24;;:34;;;;;;;;;;32444:16;32405:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32405:34:0;;:38;:73::i;:::-;32398:80;32304:182;-1:-1:-1;;;32304:182:0:o;4969:471::-;5027:7;5272:6;5268:47;;-1:-1:-1;5302:1:0;5295:8;;5268:47;5339:5;;;5343:1;5339;:5;:1;5363:5;;;;;:10;5355:56;;;;-1:-1:-1;;;5355:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5916:132;5974:7;6001:39;6005:1;6008;6001:39;;;;;;;;;;;;;;;;;:3;:39::i;4079:136::-;4137:7;4164:43;4168:1;4171;4164:43;;;;;;;;;;;;;;;;;:3;:43::i;3615:181::-;3673:7;3705:5;;;3729:6;;;;3721:46;;;;;-1:-1:-1;;;3721:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35087:290;35176:8;35187:6;-1:-1:-1;;;;;35187:16:0;;35212:4;35187:31;;;;;;;;;;;;;-1:-1:-1;;;;;35187:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35187:31:0;;-1:-1:-1;35233:13:0;;;35229:141;;;35263:29;-1:-1:-1;;;;;35263:19:0;;35283:3;35288;35263:19;:29::i;:::-;35229:141;;;35325:33;-1:-1:-1;;;;;35325:19:0;;35345:3;35350:7;35325:19;:33::i;14781:205::-;14909:68;;;-1:-1:-1;;;;;14909:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14909:68:0;-1:-1:-1;;;14909:68:0;;;14882:96;;14902:5;;14882:19;:96::i;28519:681::-;-1:-1:-1;;;;;28620:16:0;;28596:21;28620:16;;;:8;:16;;;;;;;;28637:10;28620:28;;;;;;;28659:20;28629:6;28659:12;:20::i;:::-;28694:11;;:15;28690:91;;28726:43;28740:6;28748:10;28766:1;28726:13;:43::i;:::-;28805:11;;:24;;28821:7;28805:15;:24::i;:::-;28791:38;;-1:-1:-1;;;;;28879:23:0;;28791:11;28879:23;;;:15;:23;;;;;28944:18;;28879:23;;28974:167;29002:16;28995:23;;:4;:23;;;28974:167;;;29067:62;29124:4;29067:52;29083:11;29095:4;29083:17;;;;;;;;;29067:62;29043:21;;;;;;;:15;;;;:21;;;;;;:86;;;;29020:6;28974:167;;;-1:-1:-1;29156:36:0;;;;;;;;29172:10;;-1:-1:-1;;;;;29156:36:0;;;;;;;;;;;;28519:681;;;;;:::o;14596:177::-;14706:58;;;-1:-1:-1;;;;;14706:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14706:58:0;-1:-1:-1;;;14706:58:0;;;14679:86;;14699:5;;14679:19;:86::i;15255:622::-;15625:10;;;15624:62;;-1:-1:-1;15641:39:0;;;-1:-1:-1;;;15641:39:0;;15665:4;15641:39;;;;-1:-1:-1;;;;;15641:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15641:39:0;:44;15624:62;15616:152;;;;-1:-1:-1;;;15616:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15806:62;;;-1:-1:-1;;;;;15806:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15806:62:0;-1:-1:-1;;;15806:62:0;;;15779:90;;15799:5;;15779:19;:90::i;6544:278::-;6630:7;6665:12;6658:5;6650:28;;;;-1:-1:-1;;;6650:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6689:9;6705:1;6701;:5;;;;;;;6544:278;-1:-1:-1;;;;;6544:278:0:o;4518:192::-;4604:7;4640:12;4632:6;;;;4624:29;;;;-1:-1:-1;;;4624:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4676:5:0;;;4518:192::o;16901:761::-;17325:23;17351:69;17379:4;17351:69;;;;;;;;;;;;;;;;;17359:5;-1:-1:-1;;;;;17351:27:0;;;:69;;;;;:::i;:::-;17435:17;;17325:95;;-1:-1:-1;17435:21:0;17431:224;;17577:10;17566:30;;;;;;;;;;;;;;;-1:-1:-1;17566:30:0;17558:85;;;;-1:-1:-1;;;17558:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11674:196;11777:12;11809:53;11832:6;11840:4;11846:1;11849:12;11809:22;:53::i;:::-;11802:60;11674:196;-1:-1:-1;;;;11674:196:0:o;13051:979::-;13181:12;13214:18;13225:6;13214:10;:18::i;:::-;13206:60;;;;;-1:-1:-1;;;13206:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13340:12;13354:23;13381:6;-1:-1:-1;;;;;13381:11:0;13401:8;13412:4;13381:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13381:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13339:78;;;;13432:7;13428:595;;;13463:10;-1:-1:-1;13456:17:0;;-1:-1:-1;13456:17:0;13428:595;13577:17;;:21;13573:439;;13840:10;13834:17;13901:15;13888:10;13884:2;13880:19;13873:44;13788:148;13976:20;;-1:-1:-1;;;13976:20:0;;;;;;;;;;;;;;;;;13983:12;;13976:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8756:422;9123:20;9162:8;;;8756:422::o
Swarm Source
ipfs://b3edf526a6139da816766cdf5223b2e0bdebd1cae768e38a40fadb929391c5ce
Loading...
Loading
Loading...
Loading
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.