Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap In | 16068189 | 649 days ago | IN | 0.1 ETH | 0.0056761 | ||||
Zap In | 16048170 | 652 days ago | IN | 0.01 ETH | 0.00521606 | ||||
Zap In | 15428013 | 741 days ago | IN | 0.05 ETH | 0.00283433 | ||||
Zap In | 15427942 | 741 days ago | IN | 0.05 ETH | 0.00277548 | ||||
Zap In | 15427864 | 741 days ago | IN | 0 ETH | 0.0029667 | ||||
Zap In | 15365423 | 751 days ago | IN | 0 ETH | 0.00705566 | ||||
Zap In | 15295330 | 762 days ago | IN | 0 ETH | 0.00672629 | ||||
Zap In | 15295250 | 762 days ago | IN | 0 ETH | 0.00397776 | ||||
Zap In | 15294218 | 762 days ago | IN | 0.005 ETH | 0.00231388 | ||||
Zap In | 15288329 | 763 days ago | IN | 0 ETH | 0.00415867 | ||||
Zap In | 15283501 | 764 days ago | IN | 0.00168 ETH | 0.01235809 | ||||
0x60806040 | 15275982 | 765 days ago | IN | 0 ETH | 0.02652071 |
Loading...
Loading
Contract Name:
ZapInCurveGVault
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-04 */ // Sources flattened with hardhat v2.9.9 https://hardhat.org // File contracts/interfaces/IVault.sol interface IVault { function deposit(uint256) external; function deposit(uint256 amount, address recipient) external returns (uint256); function deposit(uint256 amount, address recipient, bytes32 referral) external returns (uint256); function withdraw(uint256) external; function withdraw(uint256 maxShares, address recipient) external returns (uint256); function withdraw(uint256 maxShares, address recipient, uint256 maxLoss, address endRecipient) external returns (uint256); function getPricePerFullShare() external view returns (uint256); function token() external view returns (address); function decimals() external view returns (uint256); // V2 function pricePerShare() external view returns (uint256); } // File contracts/interfaces/IWETH.sol interface IWETH { function deposit() external payable; function withdraw(uint256 wad) external; } // File contracts/interfaces/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { function decimals() external view returns (uint8); /** * @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 ); } // File contracts/interfaces/ICurveSwap.sol interface ICurveSwap { function coins(int128 arg0) external view returns (address); function underlying_coins(int128 arg0) external view returns (address); function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; } // File contracts/interfaces/ICurveEthSwap.sol interface ICurveEthSwap { function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external payable returns (uint256); } // File contracts/interfaces/ICurveRegistry.sol interface ICurveRegistry { function getSwapAddress(address tokenAddress) external view returns (address swapAddress); function getTokenAddress(address swapAddress) external view returns (address tokenAddress); function getDepositAddress(address swapAddress) external view returns (address depositAddress); function getPoolTokens(address swapAddress) external view returns (address[4] memory poolTokens); function shouldAddUnderlying(address swapAddress) external view returns (bool); function getNumTokens(address swapAddress) external view returns (uint8 numTokens); function isBtcPool(address swapAddress) external view returns (bool); function isEthPool(address swapAddress) external view returns (bool); function isUnderlyingToken( address swapAddress, address tokenContractAddress ) external view returns (bool, uint8); } // File contracts/libraries/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/libraries/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/libraries/Address.sol pragma solidity ^0.8.0; /** * @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 on 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" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/libraries/SafeERC20.sol pragma solidity ^0.8.0; /** * @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 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) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _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" ); } } } // File contracts/ZapInBase.sol pragma solidity ^0.8.0; abstract contract ZapInBase is Ownable { using SafeERC20 for IERC20; bool public stopped = false; // SwapTarget => approval status mapping(address => bool) public approvedTargets; address internal constant ETHAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // Circuit breaker modifiers modifier stopInEmergency() { if (stopped) { revert("Paused"); } else { _; } } function _pullTokens(address token, uint256 amount) internal returns (uint256) { if (token == address(0)) { require(msg.value > 0, "No eth sent"); return msg.value; } require(amount > 0, "Invalid token amount"); require(msg.value == 0, "Eth sent with token"); // Transfer token require( IERC20(token).allowance(msg.sender, address(this)) >= amount, "Token is not approved" ); IERC20(token).safeTransferFrom(msg.sender, address(this), amount); return amount; } function _getBalance(address token) internal view returns (uint256 balance) { if (token == address(0)) { balance = address(this).balance; } else { balance = IERC20(token).balanceOf(address(this)); } } function _approveToken(address token, address spender) internal { IERC20 _token = IERC20(token); if (_token.allowance(address(this), spender) > 0) return; else { _token.safeApprove(spender, type(uint256).max); } } function _approveToken( address token, address spender, uint256 amount ) internal { IERC20(token).safeApprove(spender, 0); IERC20(token).safeApprove(spender, amount); } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } ///@notice Withdraw tokens like a sweep function function withdrawTokens(address[] calldata tokens) external onlyOwner { for (uint256 i = 0; i < tokens.length; i++) { uint256 qty; // Check weather if is native or just ERC20 if (tokens[i] == ETHAddress) { qty = address(this).balance; Address.sendValue(payable(owner()), qty); } else { qty = IERC20(tokens[i]).balanceOf(address(this)); IERC20(tokens[i]).safeTransfer(owner(), qty); } } } function setApprovedTargets( address[] calldata targets, bool[] calldata isApproved ) external onlyOwner { require(targets.length == isApproved.length, "Invalid Input length"); for (uint256 i = 0; i < targets.length; i++) { approvedTargets[targets[i]] = isApproved[i]; } } receive() external payable { require(msg.sender != tx.origin, "Do not send ETH directly"); } } // File contracts/ZapInCurveGVault.sol // Copyright (C) 2021 Zapper (Zapper.fi) // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Affero General Public License for more details. ///@author Zapper, modified and adapted for Grizzly.fi. ///@notice This contract adds liquidity to Curve pools with ETH or ERC20 tokens and subsequently deposits into a gVault. ///@notice These files have been changed from the original Zapper ones. pragma solidity ^0.8.0; contract ZapInCurveGVault is ZapInBase { using SafeERC20 for IERC20; ICurveRegistry public curveReg; address private constant wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; constructor(ICurveRegistry _curveRegistry) { curveReg = _curveRegistry; // 0x0c32FCDC542d7A00ddcb0fF1AC6e266a04eEBDB1 // NOTE 0x exchange for swaps approvedTargets[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true; } event zapInCurve(address sender, address pool, uint256 tokensRec); event zapInVault(address sender, address gVault, uint256 sharesRec); /** @notice This function adds liquidity to a Curve pool with ETH or ERC20 tokens @param fromTokenAddress The token used for entry (address(0) if ether) @param toTokenAddress The intermediate ERC20 token to swap to @param swapAddress Curve swap address for the pool @param incomingTokenQty The amount of fromTokenAddress to invest @param minPoolTokens The minimum acceptable quantity of Curve LP to receive. Reverts otherwise! @param swapTarget Execution target for the first swap @param swapData DEX quote data // Vault Deposit @param gVault Grizzly Vault address @return sharesReceived Quantity of Grizzly Vault shares received */ function ZapIn( address fromTokenAddress, address toTokenAddress, address swapAddress, uint256 incomingTokenQty, uint256 minPoolTokens, address swapTarget, bytes calldata swapData, // data from 0xProtocol API address gVault, bytes32 referral ) external payable stopInEmergency returns (uint256 sharesReceived) { uint256 toInvest = _pullTokens(fromTokenAddress, incomingTokenQty); if (fromTokenAddress == address(0)) { fromTokenAddress = ETHAddress; } // Perform zapIn to Curve LP Tokens uint256 crvTokensBought = _performZapIn( fromTokenAddress, toTokenAddress, swapAddress, toInvest, swapTarget, swapData ); require( crvTokensBought > minPoolTokens, "Received less than minPoolTokens" ); address poolTokenAddress = curveReg.getTokenAddress(swapAddress); emit zapInCurve(msg.sender, poolTokenAddress, crvTokensBought); // Safety check for underlying Vault Token = address LP require(poolTokenAddress == IVault(gVault).token(), "Wrong LpAddress"); // Here we deposit the Curve LP tokens into the corresponding gVault sharesReceived = _vaultDeposit( poolTokenAddress, crvTokensBought, gVault, referral ); } function _vaultDeposit( address underlyingVaultToken, uint256 amount, address gVault, bytes32 referral ) internal returns (uint256 tokensReceived) { _approveToken(underlyingVaultToken, gVault); // _approveToken(address token, address spender) uint256 iniGVaultBal = IERC20(gVault).balanceOf(address(this)); IVault(gVault).deposit(amount, address(this), referral); tokensReceived = IERC20(gVault).balanceOf(address(this)) - iniGVaultBal; IERC20(gVault).safeTransfer(msg.sender, tokensReceived); emit zapInVault(msg.sender, gVault, tokensReceived); } function _performZapIn( address fromTokenAddress, address toTokenAddress, address swapAddress, uint256 toInvest, address swapTarget, bytes memory swapData ) internal returns (uint256 crvTokensBought) { (bool isUnderlying, uint8 underlyingIndex) = curveReg.isUnderlyingToken( swapAddress, fromTokenAddress ); if (isUnderlying) { crvTokensBought = _enterCurve( swapAddress, toInvest, underlyingIndex ); } else { // Swap tokens using 0x swap uint256 tokensBought = _fillQuote( fromTokenAddress, toTokenAddress, toInvest, swapTarget, swapData ); if (toTokenAddress == address(0)) toTokenAddress = ETHAddress; // Get underlying token index (isUnderlying, underlyingIndex) = curveReg.isUnderlyingToken( swapAddress, toTokenAddress ); if (isUnderlying) { crvTokensBought = _enterCurve( swapAddress, tokensBought, underlyingIndex ); } else { (uint256 tokens, uint8 metaIndex) = _enterMetaPool( swapAddress, toTokenAddress, tokensBought ); crvTokensBought = _enterCurve(swapAddress, tokens, metaIndex); } } } /** @notice This function gets adds the liquidity for meta pools and returns the token index and swap tokens @param swapAddress Curve swap address for the pool @param toTokenAddress The ERC20 token to which from token to be convert @param swapTokens quantity of toToken to invest @return tokensBought quantity of curve LP acquired @return index index of LP token in swapAddress whose pool tokens were acquired */ function _enterMetaPool( address swapAddress, address toTokenAddress, uint256 swapTokens ) internal returns (uint256 tokensBought, uint8 index) { address[4] memory poolTokens = curveReg.getPoolTokens(swapAddress); for (uint8 i = 0; i < 4; i++) { address intermediateSwapAddress = curveReg.getSwapAddress( poolTokens[i] ); if (intermediateSwapAddress != address(0)) { (, index) = curveReg.isUnderlyingToken( intermediateSwapAddress, toTokenAddress ); tokensBought = _enterCurve( intermediateSwapAddress, swapTokens, index ); return (tokensBought, i); } } } function _fillQuote( address fromTokenAddress, address toTokenAddress, uint256 amount, address swapTarget, bytes memory swapData ) internal returns (uint256 amountBought) { if (fromTokenAddress == toTokenAddress) { return amount; } if (swapTarget == wethTokenAddress) { IWETH(wethTokenAddress).deposit{value: amount}(); return amount; } uint256 valueToSend; if (fromTokenAddress == ETHAddress) { valueToSend = amount; } else { _approveToken(fromTokenAddress, swapTarget, amount); } uint256 initialBalance = _getBalance(toTokenAddress); require(approvedTargets[swapTarget], "Target not Authorized"); (bool success, ) = swapTarget.call{value: valueToSend}(swapData); require(success, "Error Swapping Tokens"); amountBought = _getBalance(toTokenAddress) - initialBalance; require(amountBought > 0, "Swapped To Invalid Intermediate"); } /** @notice This function adds liquidity to a curve pool @param swapAddress Curve swap address for the pool @param amount The quantity of tokens being added as liquidity @param index The token index for the add_liquidity call @return crvTokensBought the quantity of curve LP tokens received */ function _enterCurve( address swapAddress, uint256 amount, uint8 index ) internal returns (uint256 crvTokensBought) { address tokenAddress = curveReg.getTokenAddress(swapAddress); address depositAddress = curveReg.getDepositAddress(swapAddress); uint256 initialBalance = _getBalance(tokenAddress); address entryToken = curveReg.getPoolTokens(swapAddress)[index]; if (entryToken != ETHAddress) { IERC20(entryToken).safeIncreaseAllowance( address(depositAddress), amount ); } uint256 numTokens = curveReg.getNumTokens(swapAddress); bool addUnderlying = curveReg.shouldAddUnderlying(swapAddress); if (numTokens == 4) { uint256[4] memory amounts; amounts[index] = amount; if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } else if (numTokens == 3) { uint256[3] memory amounts; amounts[index] = amount; if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } else { uint256[2] memory amounts; amounts[index] = amount; if (curveReg.isEthPool(depositAddress)) { ICurveEthSwap(depositAddress).add_liquidity{value: amount}( amounts, 0 ); } else if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } crvTokensBought = _getBalance(tokenAddress) - initialBalance; } function updateCurveRegistry(ICurveRegistry newCurveRegistry) external onlyOwner { require(newCurveRegistry != curveReg, "Already using this Registry"); curveReg = newCurveRegistry; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ICurveRegistry","name":"_curveRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensRec","type":"uint256"}],"name":"zapInCurve","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"gVault","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesRec","type":"uint256"}],"name":"zapInVault","type":"event"},{"inputs":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"address","name":"swapAddress","type":"address"},{"internalType":"uint256","name":"incomingTokenQty","type":"uint256"},{"internalType":"uint256","name":"minPoolTokens","type":"uint256"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"},{"internalType":"address","name":"gVault","type":"address"},{"internalType":"bytes32","name":"referral","type":"bytes32"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"sharesReceived","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveReg","outputs":[{"internalType":"contract ICurveRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bool[]","name":"isApproved","type":"bool[]"}],"name":"setApprovedTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleContractActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ICurveRegistry","name":"newCurveRegistry","type":"address"}],"name":"updateCurveRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260008060146101000a81548160ff0219169083151502179055503480156200002b57600080fd5b5060405162004820380380620048208339818101604052810190620000519190620001d3565b600062000063620001b460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600180600073def1c0ded9bec7f1a1670819833240f027b25eff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000261565b600033905090565b600081519050620001cd8162000247565b92915050565b600060208284031215620001e657600080fd5b6000620001f684828501620001bc565b91505092915050565b60006200020c8262000227565b9050919050565b60006200022082620001ff565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002528162000213565b81146200025e57600080fd5b50565b6145af80620002716000396000f3fe6080604052600436106100a05760003560e01c806375f12b211161006457806375f12b21146101cd5780638da5cb5b146101f85780639735a634146102235780639779d1a61461024c578063e595338214610289578063f2fde38b146102b257610116565b80631385d24c1461011b5780631b7b89ca14610132578063374b09f8146101625780635ecb16cd1461018d578063715018a6146101b657610116565b36610116573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010b90613f47565b60405180910390fd5b005b600080fd5b34801561012757600080fd5b506101306102db565b005b61014c60048036038101906101479190613188565b610383565b6040516101599190614147565b60405180910390f35b34801561016e57600080fd5b506101776106ba565b6040516101849190613e6a565b60405180910390f35b34801561019957600080fd5b506101b460048036038101906101af9190613294565b6106e0565b005b3480156101c257600080fd5b506101cb61098b565b005b3480156101d957600080fd5b506101e2610ac5565b6040516101ef9190613e4f565b60405180910390f35b34801561020457600080fd5b5061020d610ad8565b60405161021a9190613c8b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906132d9565b610b01565b005b34801561025857600080fd5b50610273600480360381019061026e9190613136565b610cde565b6040516102809190613e4f565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab91906133dc565b610cfe565b005b3480156102be57600080fd5b506102d960048036038101906102d49190613136565b610e4f565b005b6102e3610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610301610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034e90614087565b60405180910390fd5b600060149054906101000a900460ff1615600060146101000a81548160ff021916908315150217905550565b60008060149054906101000a900460ff16156103d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cb90613ee7565b60405180910390fd5b60006103e08c8a611000565b9050600073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16141561042f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9b505b60006104838d8d8d858c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061120b565b90508881116104c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104be90613ea7565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8d7b6698d6040518263ffffffff1660e01b81526004016105249190613c8b565b60206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610574919061315f565b90507e3030f1f3b7f987b17d689c7b6d1c64935c0e4b4d1316cd2c2108e960cd55b13382846040516105a893929190613ccf565b60405180910390a18573ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e919061315f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290613f07565b60405180910390fd5b6106a781838888611432565b93505050509a9950505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106e8610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610706610ad8565b73ffffffffffffffffffffffffffffffffffffffff161461075c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075390614087565b60405180910390fd5b60005b8282905081101561098657600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168484848181106107d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906107e59190613136565b73ffffffffffffffffffffffffffffffffffffffff16141561081a5747905061081561080f610ad8565b82611660565b610972565b838383818110610853577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906108689190613136565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108a09190613c8b565b60206040518083038186803b1580156108b857600080fd5b505afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190613405565b90506109716108fd610ad8565b82868686818110610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061094c9190613136565b73ffffffffffffffffffffffffffffffffffffffff166117549092919063ffffffff16565b5b50808061097e9061440d565b91505061075f565b505050565b610993610ff8565b73ffffffffffffffffffffffffffffffffffffffff166109b1610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90614087565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b09610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610b27610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490614087565b60405180910390fd5b818190508484905014610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614067565b60405180910390fd5b60005b84849050811015610cd757828282818110610c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c21919061334e565b60016000878785818110610c5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c739190613136565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ccf9061440d565b915050610bc8565b5050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b610d06610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610d24610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190614087565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0290613f27565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e57610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610e75610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290614087565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110815760003411611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614047565b60405180910390fd5b349050611205565b600082116110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90613fc7565b60405180910390fd5b60003414611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90613fe7565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611143929190613ca6565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111939190613405565b10156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906140c7565b60405180910390fd5b6112013330848673ffffffffffffffffffffffffffffffffffffffff166117da909392919063ffffffff16565b8190505b92915050565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa30888b6040518363ffffffff1660e01b815260040161126d929190613ca6565b604080518083038186803b15801561128457600080fd5b505afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906133a0565b9150915081156112d8576112d1878783611863565b9250611426565b60006112e78a8a8989896121c7565b9050600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156113365773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee98505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa30898b6040518363ffffffff1660e01b8152600401611393929190613ca6565b604080518083038186803b1580156113aa57600080fd5b505afa1580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e291906133a0565b80935081945050508215611402576113fb888284611863565b9350611424565b6000806114108a8c856124d5565b9150915061141f8a8383611863565b955050505b505b50509695505050505050565b600061143e85846127a5565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114799190613c8b565b60206040518083038186803b15801561149157600080fd5b505afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190613405565b90508373ffffffffffffffffffffffffffffffffffffffff16637b98afcd8630866040518463ffffffff1660e01b815260040161150893929190614162565b602060405180830381600087803b15801561152257600080fd5b505af1158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190613405565b50808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115959190613c8b565b60206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e59190613405565b6115ef91906142ff565b915061161c33838673ffffffffffffffffffffffffffffffffffffffff166117549092919063ffffffff16565b7f73d4d12a5ddaf204619face1133d619da814125c29841dc71c9a011e5ffe31cf33858460405161164f93929190613ccf565b60405180910390a150949350505050565b804710156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614007565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516116c990613c76565b60006040518083038185875af1925050503d8060008114611706576040519150601f19603f3d011682016040523d82523d6000602084013e61170b565b606091505b505090508061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613fa7565b60405180910390fd5b505050565b6117d58363a9059cbb60e01b8484604051602401611773929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b505050565b61185d846323b872dd60e01b8585856040516024016117fb93929190613ccf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b50505050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8d7b669866040518263ffffffff1660e01b81526004016118c19190613c8b565b60206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611911919061315f565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d83a7f67876040518263ffffffff1660e01b81526004016119709190613c8b565b60206040518083038186803b15801561198857600080fd5b505afa15801561199c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c0919061315f565b905060006119cd8361295b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca4f2803896040518263ffffffff1660e01b8152600401611a2c9190613c8b565b60806040518083038186803b158015611a4457600080fd5b505afa158015611a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7c919061326b565b8660ff1660048110611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b3157611b3083888373ffffffffffffffffffffffffffffffffffffffff16612a2a9092919063ffffffff16565b5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633aa3eb018a6040518263ffffffff1660e01b8152600401611b8e9190613c8b565b60206040518083038186803b158015611ba657600080fd5b505afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde919061342e565b60ff1690506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329a552a48b6040518263ffffffff1660e01b8152600401611c409190613c8b565b60206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613377565b90506004821415611dda57611ca3612eab565b89818a60ff1660048110611ce0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508115611d65578573ffffffffffffffffffffffffffffffffffffffff1663dc3a2d8182600060016040518463ffffffff1660e01b8152600401611d2e93929190613e18565b600060405180830381600087803b158015611d4857600080fd5b505af1158015611d5c573d6000803e3d6000fd5b50505050611dd4565b8573ffffffffffffffffffffffffffffffffffffffff1663029b2f348260006040518363ffffffff1660e01b8152600401611da1929190613def565b600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050505b506121a4565b6003821415611f2257611deb612ecd565b89818a60ff1660038110611e28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508115611ead578573ffffffffffffffffffffffffffffffffffffffff16632b6e993a82600060016040518463ffffffff1660e01b8152600401611e7693929190613db8565b600060405180830381600087803b158015611e9057600080fd5b505af1158015611ea4573d6000803e3d6000fd5b50505050611f1c565b8573ffffffffffffffffffffffffffffffffffffffff16634515cef38260006040518363ffffffff1660e01b8152600401611ee9929190613d8f565b600060405180830381600087803b158015611f0357600080fd5b505af1158015611f17573d6000803e3d6000fd5b505050505b506121a3565b611f2a612eef565b89818a60ff1660028110611f67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018181525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0055046876040518263ffffffff1660e01b8152600401611fcb9190613c8b565b60206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201b9190613377565b156120b5578573ffffffffffffffffffffffffffffffffffffffff16630b4c7e4d8b8360006040518463ffffffff1660e01b815260040161205d929190613d2f565b6020604051808303818588803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120af9190613405565b506121a1565b8115612131578573ffffffffffffffffffffffffffffffffffffffff1663ee22be2382600060016040518463ffffffff1660e01b81526004016120fa93929190613d58565b600060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506121a0565b8573ffffffffffffffffffffffffffffffffffffffff16630b4c7e4d8260006040518363ffffffff1660e01b815260040161216d929190613d2f565b600060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050505b5b505b5b836121ae8761295b565b6121b891906142ff565b96505050505050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612205578390506124cc565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ca5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b50505050508390506124cc565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561231c57849050612328565b612327878587612b4b565b5b60006123338761295b565b9050600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613ec7565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff1683866040516123e99190613c5f565b60006040518083038185875af1925050503d8060008114612426576040519150601f19603f3d011682016040523d82523d6000602084013e61242b565b606091505b505090508061246f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246690613f87565b60405180910390fd5b816124798961295b565b61248391906142ff565b9350600084116124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90614127565b60405180910390fd5b5050505b95945050505050565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca4f2803876040518263ffffffff1660e01b81526004016125359190613c8b565b60806040518083038186803b15801561254d57600080fd5b505afa158015612561573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612585919061326b565b905060005b60048160ff16101561279a576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bbff1a66848460ff1660048110612612577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040518263ffffffff1660e01b81526004016126339190613c8b565b60206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612683919061315f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461278657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa3082896040518363ffffffff1660e01b8152600401612716929190613ca6565b604080518083038186803b15801561272d57600080fd5b505afa158015612741573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276591906133a0565b905080945050612776818786611863565b945084829450945050505061279d565b50808061279290614456565b91505061258a565b50505b935093915050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016127e7929190613ca6565b60206040518083038186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128379190613405565b11156128435750612890565b61288e827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8373ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b505b5050565b60006128f6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d059092919063ffffffff16565b905060008151111561295657808060200190518101906129169190613377565b612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c906140e7565b60405180910390fd5b5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299957479050612a25565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129d29190613c8b565b60206040518083038186803b1580156129ea57600080fd5b505afa1580156129fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a229190613405565b90505b919050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b8152600401612a68929190613ca6565b60206040518083038186803b158015612a8057600080fd5b505afa158015612a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab89190613405565b612ac291906142a9565b9050612b458463095ea7b360e01b8584604051602401612ae3929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b50505050565b612b778260008573ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b612ba282828573ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b505050565b6000811480612c40575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612bee929190613ca6565b60206040518083038186803b158015612c0657600080fd5b505afa158015612c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3e9190613405565b145b612c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7690614107565b60405180910390fd5b612d008363095ea7b360e01b8484604051602401612c9e929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b505050565b6060612d148484600085612d1d565b90509392505050565b606082471015612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614027565b60405180910390fd5b612d6b85612e31565b612daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da1906140a7565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612dd39190613c5f565b60006040518083038185875af1925050503d8060008114612e10576040519150601f19603f3d011682016040523d82523d6000602084013e612e15565b606091505b5091509150612e25828286612e44565b92505050949350505050565b600080823b905060008111915050919050565b60608315612e5457829050612ea4565b600083511115612e675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b9190613e85565b60405180910390fd5b9392505050565b6040518060800160405280600490602082028036833780820191505090505090565b6040518060600160405280600390602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b6000612f24612f1f846141ca565b614199565b90508082856020860282011115612f3a57600080fd5b60005b85811015612f6a5781612f508882612f89565b845260208401935060208301925050600181019050612f3d565b5050509392505050565b600081359050612f83816144ef565b92915050565b600081519050612f98816144ef565b92915050565b600082601f830112612faf57600080fd5b6004612fbc848285612f11565b91505092915050565b60008083601f840112612fd757600080fd5b8235905067ffffffffffffffff811115612ff057600080fd5b60208301915083602082028301111561300857600080fd5b9250929050565b60008083601f84011261302157600080fd5b8235905067ffffffffffffffff81111561303a57600080fd5b60208301915083602082028301111561305257600080fd5b9250929050565b60008135905061306881614506565b92915050565b60008151905061307d81614506565b92915050565b6000813590506130928161451d565b92915050565b60008083601f8401126130aa57600080fd5b8235905067ffffffffffffffff8111156130c357600080fd5b6020830191508360018202830111156130db57600080fd5b9250929050565b6000813590506130f181614534565b92915050565b6000813590506131068161454b565b92915050565b60008151905061311b8161454b565b92915050565b60008151905061313081614562565b92915050565b60006020828403121561314857600080fd5b600061315684828501612f74565b91505092915050565b60006020828403121561317157600080fd5b600061317f84828501612f89565b91505092915050565b6000806000806000806000806000806101208b8d0312156131a857600080fd5b60006131b68d828e01612f74565b9a505060206131c78d828e01612f74565b99505060406131d88d828e01612f74565b98505060606131e98d828e016130f7565b97505060806131fa8d828e016130f7565b96505060a061320b8d828e01612f74565b95505060c08b013567ffffffffffffffff81111561322857600080fd5b6132348d828e01613098565b945094505060e06132478d828e01612f74565b9250506101006132598d828e01613083565b9150509295989b9194979a5092959850565b60006080828403121561327d57600080fd5b600061328b84828501612f9e565b91505092915050565b600080602083850312156132a757600080fd5b600083013567ffffffffffffffff8111156132c157600080fd5b6132cd85828601612fc5565b92509250509250929050565b600080600080604085870312156132ef57600080fd5b600085013567ffffffffffffffff81111561330957600080fd5b61331587828801612fc5565b9450945050602085013567ffffffffffffffff81111561333457600080fd5b6133408782880161300f565b925092505092959194509250565b60006020828403121561336057600080fd5b600061336e84828501613059565b91505092915050565b60006020828403121561338957600080fd5b60006133978482850161306e565b91505092915050565b600080604083850312156133b357600080fd5b60006133c18582860161306e565b92505060206133d285828601613121565b9150509250929050565b6000602082840312156133ee57600080fd5b60006133fc848285016130e2565b91505092915050565b60006020828403121561341757600080fd5b60006134258482850161310c565b91505092915050565b60006020828403121561344057600080fd5b600061344e84828501613121565b91505092915050565b60006134638383613c41565b60208301905092915050565b61347881614333565b82525050565b6134878161420e565b613491818461426c565b925061349c826141f0565b8060005b838110156134cd5781516134b48782613457565b96506134bf83614245565b9250506001810190506134a0565b505050505050565b6134de81614219565b6134e88184614277565b92506134f3826141fa565b8060005b8381101561352457815161350b8782613457565b965061351683614252565b9250506001810190506134f7565b505050505050565b61353581614224565b61353f8184614282565b925061354a82614204565b8060005b8381101561357b5781516135628782613457565b965061356d8361425f565b92505060018101905061354e565b505050505050565b61358c81614345565b82525050565b61359b81614351565b82525050565b60006135ac8261422f565b6135b6818561428d565b93506135c68185602086016143da565b80840191505092915050565b6135db816143a4565b82525050565b6135ea816143c8565b82525050565b60006135fb8261423a565b6136058185614298565b93506136158185602086016143da565b61361e816144de565b840191505092915050565b6000613636602083614298565b91507f5265636569766564206c657373207468616e206d696e506f6f6c546f6b656e736000830152602082019050919050565b6000613676601583614298565b91507f546172676574206e6f7420417574686f72697a656400000000000000000000006000830152602082019050919050565b60006136b6600683614298565b91507f50617573656400000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006136f6600f83614298565b91507f57726f6e67204c704164647265737300000000000000000000000000000000006000830152602082019050919050565b6000613736601b83614298565b91507f416c7265616479207573696e67207468697320526567697374727900000000006000830152602082019050919050565b6000613776601883614298565b91507f446f206e6f742073656e6420455448206469726563746c7900000000000000006000830152602082019050919050565b60006137b6602683614298565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061381c601583614298565b91507f4572726f72205377617070696e6720546f6b656e7300000000000000000000006000830152602082019050919050565b600061385c603a83614298565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006138c2601483614298565b91507f496e76616c696420746f6b656e20616d6f756e740000000000000000000000006000830152602082019050919050565b6000613902601383614298565b91507f4574682073656e74207769746820746f6b656e000000000000000000000000006000830152602082019050919050565b6000613942601d83614298565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000613982602683614298565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139e8600b83614298565b91507f4e6f206574682073656e740000000000000000000000000000000000000000006000830152602082019050919050565b6000613a28601483614298565b91507f496e76616c696420496e707574206c656e6774680000000000000000000000006000830152602082019050919050565b6000613a68602083614298565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613aa860008361428d565b9150600082019050919050565b6000613ac2601d83614298565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613b02601583614298565b91507f546f6b656e206973206e6f7420617070726f76656400000000000000000000006000830152602082019050919050565b6000613b42602a83614298565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba8603683614298565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000613c0e601f83614298565b91507f5377617070656420546f20496e76616c696420496e7465726d656469617465006000830152602082019050919050565b613c4a8161438d565b82525050565b613c598161438d565b82525050565b6000613c6b82846135a1565b915081905092915050565b6000613c8182613a9b565b9150819050919050565b6000602082019050613ca0600083018461346f565b92915050565b6000604082019050613cbb600083018561346f565b613cc8602083018461346f565b9392505050565b6000606082019050613ce4600083018661346f565b613cf1602083018561346f565b613cfe6040830184613c50565b949350505050565b6000604082019050613d1b600083018561346f565b613d286020830184613c50565b9392505050565b6000606082019050613d44600083018561347e565b613d5160408301846135e1565b9392505050565b6000608082019050613d6d600083018661347e565b613d7a60408301856135e1565b613d876060830184613583565b949350505050565b6000608082019050613da460008301856134d5565b613db160608301846135e1565b9392505050565b600060a082019050613dcd60008301866134d5565b613dda60608301856135e1565b613de76080830184613583565b949350505050565b600060a082019050613e04600083018561352c565b613e1160808301846135e1565b9392505050565b600060c082019050613e2d600083018661352c565b613e3a60808301856135e1565b613e4760a0830184613583565b949350505050565b6000602082019050613e646000830184613583565b92915050565b6000602082019050613e7f60008301846135d2565b92915050565b60006020820190508181036000830152613e9f81846135f0565b905092915050565b60006020820190508181036000830152613ec081613629565b9050919050565b60006020820190508181036000830152613ee081613669565b9050919050565b60006020820190508181036000830152613f00816136a9565b9050919050565b60006020820190508181036000830152613f20816136e9565b9050919050565b60006020820190508181036000830152613f4081613729565b9050919050565b60006020820190508181036000830152613f6081613769565b9050919050565b60006020820190508181036000830152613f80816137a9565b9050919050565b60006020820190508181036000830152613fa08161380f565b9050919050565b60006020820190508181036000830152613fc08161384f565b9050919050565b60006020820190508181036000830152613fe0816138b5565b9050919050565b60006020820190508181036000830152614000816138f5565b9050919050565b6000602082019050818103600083015261402081613935565b9050919050565b6000602082019050818103600083015261404081613975565b9050919050565b60006020820190508181036000830152614060816139db565b9050919050565b6000602082019050818103600083015261408081613a1b565b9050919050565b600060208201905081810360008301526140a081613a5b565b9050919050565b600060208201905081810360008301526140c081613ab5565b9050919050565b600060208201905081810360008301526140e081613af5565b9050919050565b6000602082019050818103600083015261410081613b35565b9050919050565b6000602082019050818103600083015261412081613b9b565b9050919050565b6000602082019050818103600083015261414081613c01565b9050919050565b600060208201905061415c6000830184613c50565b92915050565b60006060820190506141776000830186613c50565b614184602083018561346f565b6141916040830184613592565b949350505050565b6000604051905081810181811067ffffffffffffffff821117156141c0576141bf6144af565b5b8060405250919050565b600067ffffffffffffffff8211156141e5576141e46144af565b5b602082029050919050565b6000819050919050565b6000819050919050565b6000819050919050565b600060029050919050565b600060039050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b60006142b48261438d565b91506142bf8361438d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f4576142f3614480565b5b828201905092915050565b600061430a8261438d565b91506143158361438d565b92508282101561432857614327614480565b5b828203905092915050565b600061433e8261436d565b9050919050565b60008115159050919050565b6000819050919050565b600061436682614333565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143af826143b6565b9050919050565b60006143c18261436d565b9050919050565b60006143d38261438d565b9050919050565b60005b838110156143f85780820151818401526020810190506143dd565b83811115614407576000848401525b50505050565b60006144188261438d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561444b5761444a614480565b5b600182019050919050565b600061446182614397565b915060ff82141561447557614474614480565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144f881614333565b811461450357600080fd5b50565b61450f81614345565b811461451a57600080fd5b50565b61452681614351565b811461453157600080fd5b50565b61453d8161435b565b811461454857600080fd5b50565b6145548161438d565b811461455f57600080fd5b50565b61456b81614397565b811461457657600080fd5b5056fea2646970667358221220828e11e0f7f76377aaccb4e27bd3ac19281a530feef0cc09155e5f43b3dd381f64736f6c63430008000033000000000000000000000000a5d0918610b1183db6c8299243b977b2ef920ce7
Deployed Bytecode
0x6080604052600436106100a05760003560e01c806375f12b211161006457806375f12b21146101cd5780638da5cb5b146101f85780639735a634146102235780639779d1a61461024c578063e595338214610289578063f2fde38b146102b257610116565b80631385d24c1461011b5780631b7b89ca14610132578063374b09f8146101625780635ecb16cd1461018d578063715018a6146101b657610116565b36610116573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010b90613f47565b60405180910390fd5b005b600080fd5b34801561012757600080fd5b506101306102db565b005b61014c60048036038101906101479190613188565b610383565b6040516101599190614147565b60405180910390f35b34801561016e57600080fd5b506101776106ba565b6040516101849190613e6a565b60405180910390f35b34801561019957600080fd5b506101b460048036038101906101af9190613294565b6106e0565b005b3480156101c257600080fd5b506101cb61098b565b005b3480156101d957600080fd5b506101e2610ac5565b6040516101ef9190613e4f565b60405180910390f35b34801561020457600080fd5b5061020d610ad8565b60405161021a9190613c8b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906132d9565b610b01565b005b34801561025857600080fd5b50610273600480360381019061026e9190613136565b610cde565b6040516102809190613e4f565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab91906133dc565b610cfe565b005b3480156102be57600080fd5b506102d960048036038101906102d49190613136565b610e4f565b005b6102e3610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610301610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034e90614087565b60405180910390fd5b600060149054906101000a900460ff1615600060146101000a81548160ff021916908315150217905550565b60008060149054906101000a900460ff16156103d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cb90613ee7565b60405180910390fd5b60006103e08c8a611000565b9050600073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16141561042f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9b505b60006104838d8d8d858c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061120b565b90508881116104c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104be90613ea7565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8d7b6698d6040518263ffffffff1660e01b81526004016105249190613c8b565b60206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610574919061315f565b90507e3030f1f3b7f987b17d689c7b6d1c64935c0e4b4d1316cd2c2108e960cd55b13382846040516105a893929190613ccf565b60405180910390a18573ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f657600080fd5b505afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e919061315f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290613f07565b60405180910390fd5b6106a781838888611432565b93505050509a9950505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106e8610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610706610ad8565b73ffffffffffffffffffffffffffffffffffffffff161461075c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075390614087565b60405180910390fd5b60005b8282905081101561098657600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168484848181106107d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906107e59190613136565b73ffffffffffffffffffffffffffffffffffffffff16141561081a5747905061081561080f610ad8565b82611660565b610972565b838383818110610853577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906108689190613136565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108a09190613c8b565b60206040518083038186803b1580156108b857600080fd5b505afa1580156108cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f09190613405565b90506109716108fd610ad8565b82868686818110610937577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061094c9190613136565b73ffffffffffffffffffffffffffffffffffffffff166117549092919063ffffffff16565b5b50808061097e9061440d565b91505061075f565b505050565b610993610ff8565b73ffffffffffffffffffffffffffffffffffffffff166109b1610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90614087565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b09610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610b27610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490614087565b60405180910390fd5b818190508484905014610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614067565b60405180910390fd5b60005b84849050811015610cd757828282818110610c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c21919061334e565b60016000878785818110610c5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c739190613136565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ccf9061440d565b915050610bc8565b5050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b610d06610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610d24610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190614087565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0290613f27565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e57610ff8565b73ffffffffffffffffffffffffffffffffffffffff16610e75610ad8565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec290614087565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110815760003411611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614047565b60405180910390fd5b349050611205565b600082116110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90613fc7565b60405180910390fd5b60003414611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90613fe7565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611143929190613ca6565b60206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111939190613405565b10156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906140c7565b60405180910390fd5b6112013330848673ffffffffffffffffffffffffffffffffffffffff166117da909392919063ffffffff16565b8190505b92915050565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa30888b6040518363ffffffff1660e01b815260040161126d929190613ca6565b604080518083038186803b15801561128457600080fd5b505afa158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc91906133a0565b9150915081156112d8576112d1878783611863565b9250611426565b60006112e78a8a8989896121c7565b9050600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156113365773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee98505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa30898b6040518363ffffffff1660e01b8152600401611393929190613ca6565b604080518083038186803b1580156113aa57600080fd5b505afa1580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e291906133a0565b80935081945050508215611402576113fb888284611863565b9350611424565b6000806114108a8c856124d5565b9150915061141f8a8383611863565b955050505b505b50509695505050505050565b600061143e85846127a5565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114799190613c8b565b60206040518083038186803b15801561149157600080fd5b505afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190613405565b90508373ffffffffffffffffffffffffffffffffffffffff16637b98afcd8630866040518463ffffffff1660e01b815260040161150893929190614162565b602060405180830381600087803b15801561152257600080fd5b505af1158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190613405565b50808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115959190613c8b565b60206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e59190613405565b6115ef91906142ff565b915061161c33838673ffffffffffffffffffffffffffffffffffffffff166117549092919063ffffffff16565b7f73d4d12a5ddaf204619face1133d619da814125c29841dc71c9a011e5ffe31cf33858460405161164f93929190613ccf565b60405180910390a150949350505050565b804710156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614007565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516116c990613c76565b60006040518083038185875af1925050503d8060008114611706576040519150601f19603f3d011682016040523d82523d6000602084013e61170b565b606091505b505090508061174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613fa7565b60405180910390fd5b505050565b6117d58363a9059cbb60e01b8484604051602401611773929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b505050565b61185d846323b872dd60e01b8585856040516024016117fb93929190613ccf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b50505050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8d7b669866040518263ffffffff1660e01b81526004016118c19190613c8b565b60206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611911919061315f565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d83a7f67876040518263ffffffff1660e01b81526004016119709190613c8b565b60206040518083038186803b15801561198857600080fd5b505afa15801561199c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c0919061315f565b905060006119cd8361295b565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca4f2803896040518263ffffffff1660e01b8152600401611a2c9190613c8b565b60806040518083038186803b158015611a4457600080fd5b505afa158015611a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7c919061326b565b8660ff1660048110611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b3157611b3083888373ffffffffffffffffffffffffffffffffffffffff16612a2a9092919063ffffffff16565b5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633aa3eb018a6040518263ffffffff1660e01b8152600401611b8e9190613c8b565b60206040518083038186803b158015611ba657600080fd5b505afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde919061342e565b60ff1690506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329a552a48b6040518263ffffffff1660e01b8152600401611c409190613c8b565b60206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613377565b90506004821415611dda57611ca3612eab565b89818a60ff1660048110611ce0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508115611d65578573ffffffffffffffffffffffffffffffffffffffff1663dc3a2d8182600060016040518463ffffffff1660e01b8152600401611d2e93929190613e18565b600060405180830381600087803b158015611d4857600080fd5b505af1158015611d5c573d6000803e3d6000fd5b50505050611dd4565b8573ffffffffffffffffffffffffffffffffffffffff1663029b2f348260006040518363ffffffff1660e01b8152600401611da1929190613def565b600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050505b506121a4565b6003821415611f2257611deb612ecd565b89818a60ff1660038110611e28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508115611ead578573ffffffffffffffffffffffffffffffffffffffff16632b6e993a82600060016040518463ffffffff1660e01b8152600401611e7693929190613db8565b600060405180830381600087803b158015611e9057600080fd5b505af1158015611ea4573d6000803e3d6000fd5b50505050611f1c565b8573ffffffffffffffffffffffffffffffffffffffff16634515cef38260006040518363ffffffff1660e01b8152600401611ee9929190613d8f565b600060405180830381600087803b158015611f0357600080fd5b505af1158015611f17573d6000803e3d6000fd5b505050505b506121a3565b611f2a612eef565b89818a60ff1660028110611f67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018181525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0055046876040518263ffffffff1660e01b8152600401611fcb9190613c8b565b60206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201b9190613377565b156120b5578573ffffffffffffffffffffffffffffffffffffffff16630b4c7e4d8b8360006040518463ffffffff1660e01b815260040161205d929190613d2f565b6020604051808303818588803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120af9190613405565b506121a1565b8115612131578573ffffffffffffffffffffffffffffffffffffffff1663ee22be2382600060016040518463ffffffff1660e01b81526004016120fa93929190613d58565b600060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506121a0565b8573ffffffffffffffffffffffffffffffffffffffff16630b4c7e4d8260006040518363ffffffff1660e01b815260040161216d929190613d2f565b600060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050505b5b505b5b836121ae8761295b565b6121b891906142ff565b96505050505050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612205578390506124cc565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ca5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122a957600080fd5b505af11580156122bd573d6000803e3d6000fd5b50505050508390506124cc565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561231c57849050612328565b612327878587612b4b565b5b60006123338761295b565b9050600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b890613ec7565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff1683866040516123e99190613c5f565b60006040518083038185875af1925050503d8060008114612426576040519150601f19603f3d011682016040523d82523d6000602084013e61242b565b606091505b505090508061246f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246690613f87565b60405180910390fd5b816124798961295b565b61248391906142ff565b9350600084116124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90614127565b60405180910390fd5b5050505b95945050505050565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca4f2803876040518263ffffffff1660e01b81526004016125359190613c8b565b60806040518083038186803b15801561254d57600080fd5b505afa158015612561573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612585919061326b565b905060005b60048160ff16101561279a576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bbff1a66848460ff1660048110612612577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040518263ffffffff1660e01b81526004016126339190613c8b565b60206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612683919061315f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461278657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e09fa3082896040518363ffffffff1660e01b8152600401612716929190613ca6565b604080518083038186803b15801561272d57600080fd5b505afa158015612741573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276591906133a0565b905080945050612776818786611863565b945084829450945050505061279d565b50808061279290614456565b91505061258a565b50505b935093915050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016127e7929190613ca6565b60206040518083038186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128379190613405565b11156128435750612890565b61288e827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8373ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b505b5050565b60006128f6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d059092919063ffffffff16565b905060008151111561295657808060200190518101906129169190613377565b612955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294c906140e7565b60405180910390fd5b5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299957479050612a25565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129d29190613c8b565b60206040518083038186803b1580156129ea57600080fd5b505afa1580156129fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a229190613405565b90505b919050565b6000818473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b8152600401612a68929190613ca6565b60206040518083038186803b158015612a8057600080fd5b505afa158015612a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab89190613405565b612ac291906142a9565b9050612b458463095ea7b360e01b8584604051602401612ae3929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b50505050565b612b778260008573ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b612ba282828573ffffffffffffffffffffffffffffffffffffffff16612ba79092919063ffffffff16565b505050565b6000811480612c40575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612bee929190613ca6565b60206040518083038186803b158015612c0657600080fd5b505afa158015612c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3e9190613405565b145b612c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7690614107565b60405180910390fd5b612d008363095ea7b360e01b8484604051602401612c9e929190613d06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612894565b505050565b6060612d148484600085612d1d565b90509392505050565b606082471015612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614027565b60405180910390fd5b612d6b85612e31565b612daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da1906140a7565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612dd39190613c5f565b60006040518083038185875af1925050503d8060008114612e10576040519150601f19603f3d011682016040523d82523d6000602084013e612e15565b606091505b5091509150612e25828286612e44565b92505050949350505050565b600080823b905060008111915050919050565b60608315612e5457829050612ea4565b600083511115612e675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b9190613e85565b60405180910390fd5b9392505050565b6040518060800160405280600490602082028036833780820191505090505090565b6040518060600160405280600390602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b6000612f24612f1f846141ca565b614199565b90508082856020860282011115612f3a57600080fd5b60005b85811015612f6a5781612f508882612f89565b845260208401935060208301925050600181019050612f3d565b5050509392505050565b600081359050612f83816144ef565b92915050565b600081519050612f98816144ef565b92915050565b600082601f830112612faf57600080fd5b6004612fbc848285612f11565b91505092915050565b60008083601f840112612fd757600080fd5b8235905067ffffffffffffffff811115612ff057600080fd5b60208301915083602082028301111561300857600080fd5b9250929050565b60008083601f84011261302157600080fd5b8235905067ffffffffffffffff81111561303a57600080fd5b60208301915083602082028301111561305257600080fd5b9250929050565b60008135905061306881614506565b92915050565b60008151905061307d81614506565b92915050565b6000813590506130928161451d565b92915050565b60008083601f8401126130aa57600080fd5b8235905067ffffffffffffffff8111156130c357600080fd5b6020830191508360018202830111156130db57600080fd5b9250929050565b6000813590506130f181614534565b92915050565b6000813590506131068161454b565b92915050565b60008151905061311b8161454b565b92915050565b60008151905061313081614562565b92915050565b60006020828403121561314857600080fd5b600061315684828501612f74565b91505092915050565b60006020828403121561317157600080fd5b600061317f84828501612f89565b91505092915050565b6000806000806000806000806000806101208b8d0312156131a857600080fd5b60006131b68d828e01612f74565b9a505060206131c78d828e01612f74565b99505060406131d88d828e01612f74565b98505060606131e98d828e016130f7565b97505060806131fa8d828e016130f7565b96505060a061320b8d828e01612f74565b95505060c08b013567ffffffffffffffff81111561322857600080fd5b6132348d828e01613098565b945094505060e06132478d828e01612f74565b9250506101006132598d828e01613083565b9150509295989b9194979a5092959850565b60006080828403121561327d57600080fd5b600061328b84828501612f9e565b91505092915050565b600080602083850312156132a757600080fd5b600083013567ffffffffffffffff8111156132c157600080fd5b6132cd85828601612fc5565b92509250509250929050565b600080600080604085870312156132ef57600080fd5b600085013567ffffffffffffffff81111561330957600080fd5b61331587828801612fc5565b9450945050602085013567ffffffffffffffff81111561333457600080fd5b6133408782880161300f565b925092505092959194509250565b60006020828403121561336057600080fd5b600061336e84828501613059565b91505092915050565b60006020828403121561338957600080fd5b60006133978482850161306e565b91505092915050565b600080604083850312156133b357600080fd5b60006133c18582860161306e565b92505060206133d285828601613121565b9150509250929050565b6000602082840312156133ee57600080fd5b60006133fc848285016130e2565b91505092915050565b60006020828403121561341757600080fd5b60006134258482850161310c565b91505092915050565b60006020828403121561344057600080fd5b600061344e84828501613121565b91505092915050565b60006134638383613c41565b60208301905092915050565b61347881614333565b82525050565b6134878161420e565b613491818461426c565b925061349c826141f0565b8060005b838110156134cd5781516134b48782613457565b96506134bf83614245565b9250506001810190506134a0565b505050505050565b6134de81614219565b6134e88184614277565b92506134f3826141fa565b8060005b8381101561352457815161350b8782613457565b965061351683614252565b9250506001810190506134f7565b505050505050565b61353581614224565b61353f8184614282565b925061354a82614204565b8060005b8381101561357b5781516135628782613457565b965061356d8361425f565b92505060018101905061354e565b505050505050565b61358c81614345565b82525050565b61359b81614351565b82525050565b60006135ac8261422f565b6135b6818561428d565b93506135c68185602086016143da565b80840191505092915050565b6135db816143a4565b82525050565b6135ea816143c8565b82525050565b60006135fb8261423a565b6136058185614298565b93506136158185602086016143da565b61361e816144de565b840191505092915050565b6000613636602083614298565b91507f5265636569766564206c657373207468616e206d696e506f6f6c546f6b656e736000830152602082019050919050565b6000613676601583614298565b91507f546172676574206e6f7420417574686f72697a656400000000000000000000006000830152602082019050919050565b60006136b6600683614298565b91507f50617573656400000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006136f6600f83614298565b91507f57726f6e67204c704164647265737300000000000000000000000000000000006000830152602082019050919050565b6000613736601b83614298565b91507f416c7265616479207573696e67207468697320526567697374727900000000006000830152602082019050919050565b6000613776601883614298565b91507f446f206e6f742073656e6420455448206469726563746c7900000000000000006000830152602082019050919050565b60006137b6602683614298565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061381c601583614298565b91507f4572726f72205377617070696e6720546f6b656e7300000000000000000000006000830152602082019050919050565b600061385c603a83614298565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006138c2601483614298565b91507f496e76616c696420746f6b656e20616d6f756e740000000000000000000000006000830152602082019050919050565b6000613902601383614298565b91507f4574682073656e74207769746820746f6b656e000000000000000000000000006000830152602082019050919050565b6000613942601d83614298565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000613982602683614298565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139e8600b83614298565b91507f4e6f206574682073656e740000000000000000000000000000000000000000006000830152602082019050919050565b6000613a28601483614298565b91507f496e76616c696420496e707574206c656e6774680000000000000000000000006000830152602082019050919050565b6000613a68602083614298565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613aa860008361428d565b9150600082019050919050565b6000613ac2601d83614298565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613b02601583614298565b91507f546f6b656e206973206e6f7420617070726f76656400000000000000000000006000830152602082019050919050565b6000613b42602a83614298565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba8603683614298565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000613c0e601f83614298565b91507f5377617070656420546f20496e76616c696420496e7465726d656469617465006000830152602082019050919050565b613c4a8161438d565b82525050565b613c598161438d565b82525050565b6000613c6b82846135a1565b915081905092915050565b6000613c8182613a9b565b9150819050919050565b6000602082019050613ca0600083018461346f565b92915050565b6000604082019050613cbb600083018561346f565b613cc8602083018461346f565b9392505050565b6000606082019050613ce4600083018661346f565b613cf1602083018561346f565b613cfe6040830184613c50565b949350505050565b6000604082019050613d1b600083018561346f565b613d286020830184613c50565b9392505050565b6000606082019050613d44600083018561347e565b613d5160408301846135e1565b9392505050565b6000608082019050613d6d600083018661347e565b613d7a60408301856135e1565b613d876060830184613583565b949350505050565b6000608082019050613da460008301856134d5565b613db160608301846135e1565b9392505050565b600060a082019050613dcd60008301866134d5565b613dda60608301856135e1565b613de76080830184613583565b949350505050565b600060a082019050613e04600083018561352c565b613e1160808301846135e1565b9392505050565b600060c082019050613e2d600083018661352c565b613e3a60808301856135e1565b613e4760a0830184613583565b949350505050565b6000602082019050613e646000830184613583565b92915050565b6000602082019050613e7f60008301846135d2565b92915050565b60006020820190508181036000830152613e9f81846135f0565b905092915050565b60006020820190508181036000830152613ec081613629565b9050919050565b60006020820190508181036000830152613ee081613669565b9050919050565b60006020820190508181036000830152613f00816136a9565b9050919050565b60006020820190508181036000830152613f20816136e9565b9050919050565b60006020820190508181036000830152613f4081613729565b9050919050565b60006020820190508181036000830152613f6081613769565b9050919050565b60006020820190508181036000830152613f80816137a9565b9050919050565b60006020820190508181036000830152613fa08161380f565b9050919050565b60006020820190508181036000830152613fc08161384f565b9050919050565b60006020820190508181036000830152613fe0816138b5565b9050919050565b60006020820190508181036000830152614000816138f5565b9050919050565b6000602082019050818103600083015261402081613935565b9050919050565b6000602082019050818103600083015261404081613975565b9050919050565b60006020820190508181036000830152614060816139db565b9050919050565b6000602082019050818103600083015261408081613a1b565b9050919050565b600060208201905081810360008301526140a081613a5b565b9050919050565b600060208201905081810360008301526140c081613ab5565b9050919050565b600060208201905081810360008301526140e081613af5565b9050919050565b6000602082019050818103600083015261410081613b35565b9050919050565b6000602082019050818103600083015261412081613b9b565b9050919050565b6000602082019050818103600083015261414081613c01565b9050919050565b600060208201905061415c6000830184613c50565b92915050565b60006060820190506141776000830186613c50565b614184602083018561346f565b6141916040830184613592565b949350505050565b6000604051905081810181811067ffffffffffffffff821117156141c0576141bf6144af565b5b8060405250919050565b600067ffffffffffffffff8211156141e5576141e46144af565b5b602082029050919050565b6000819050919050565b6000819050919050565b6000819050919050565b600060029050919050565b600060039050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b60006142b48261438d565b91506142bf8361438d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142f4576142f3614480565b5b828201905092915050565b600061430a8261438d565b91506143158361438d565b92508282101561432857614327614480565b5b828203905092915050565b600061433e8261436d565b9050919050565b60008115159050919050565b6000819050919050565b600061436682614333565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143af826143b6565b9050919050565b60006143c18261436d565b9050919050565b60006143d38261438d565b9050919050565b60005b838110156143f85780820151818401526020810190506143dd565b83811115614407576000848401525b50505050565b60006144188261438d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561444b5761444a614480565b5b600182019050919050565b600061446182614397565b915060ff82141561447557614474614480565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144f881614333565b811461450357600080fd5b50565b61450f81614345565b811461451a57600080fd5b50565b61452681614351565b811461453157600080fd5b50565b61453d8161435b565b811461454857600080fd5b50565b6145548161438d565b811461455f57600080fd5b50565b61456b81614397565b811461457657600080fd5b5056fea2646970667358221220828e11e0f7f76377aaccb4e27bd3ac19281a530feef0cc09155e5f43b3dd381f64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5d0918610b1183db6c8299243b977b2ef920ce7
-----Decoded View---------------
Arg [0] : _curveRegistry (address): 0xa5d0918610b1183Db6c8299243b977B2eF920cE7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5d0918610b1183db6c8299243b977b2ef920ce7
Deployed Bytecode Sourcemap
27147:10334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26188:9;26174:23;;:10;:23;;;;26166:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;27147:10334;;;;;25079:86;;;;;;;;;;;;;:::i;:::-;;28520:1511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27228:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25227:543;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9258:148;;;;;;;;;;;;;:::i;:::-;;23205:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8607:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25778:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23279:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37249:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9561:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25079:86;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25150:7:::1;;;;;;;;;;;25149:8;25139:7;;:18;;;;;;;;;;;;;;;;;;25079:86::o:0;28520:1511::-;28892:22;23510:7;;;;;;;;;;;23506:90;;;23534:16;;;;;;;;;;:::i;:::-;;;;;;;;23506:90;28927:16:::1;28946:47;28958:16;28976;28946:11;:47::i;:::-;28927:66;;29036:1;29008:30;;:16;:30;;;29004:92;;;23383:42;29055:29;;29004:92;29153:23;29179:181;29207:16;29238:14;29267:11;29293:8;29316:10;29341:8;;29179:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:181::i;:::-;29153:207;;29413:13;29395:15;:31;29373:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;29499:24;29526:8;;;;;;;;;;;:24;;;29551:11;29526:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29499:64;;29581:57;29592:10;29604:16;29622:15;29581:57;;;;;;;;:::i;:::-;;;;;;;;29751:6;29744:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29724:42;;:16;:42;;;29716:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29894:129;29922:16;29953:15;29983:6;30004:8;29894:13;:129::i;:::-;29877:146;;23583:1;;;28520:1511:::0;;;;;;;;;;;;:::o;27228:30::-;;;;;;;;;;;;;:::o;25227:543::-;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25313:9:::1;25308:455;25332:6;;:13;;25328:1;:17;25308:455;;;25367:11;23383:42;25454:23;;:6;;25461:1;25454:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;;;25450:302;;;25504:21;25498:27;;25544:40;25570:7;:5;:7::i;:::-;25580:3;25544:17;:40::i;:::-;25450:302;;;25638:6;;25645:1;25638:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25631:27;;;25667:4;25631:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25625:48;;25692:44;25723:7;:5;:7::i;:::-;25732:3;25699:6;;25706:1;25699:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25692:30;;;;:44;;;;;:::i;:::-;25450:302;25308:455;25347:3;;;;;:::i;:::-;;;;25308:455;;;;25227:543:::0;;:::o;9258:148::-;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9365:1:::1;9328:40;;9349:6;::::0;::::1;;;;;;;;9328:40;;;;;;;;;;;;9396:1;9379:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;9258:148::o:0;23205:27::-;;;;;;;;;;;;;:::o;8607:87::-;8653:7;8680:6;;;;;;;;;;;8673:13;;8607:87;:::o;25778:342::-;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25943:10:::1;;:17;;25925:7;;:14;;:35;25917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26003:9;25998:115;26022:7;;:14;;26018:1;:18;25998:115;;;26088:10;;26099:1;26088:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26058:15;:27;26074:7;;26082:1;26074:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26058:27;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;26038:3;;;;;:::i;:::-;;;;25998:115;;;;25778:342:::0;;;;:::o;23279:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;37249:229::-;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37392:8:::1;;;;;;;;;;;37372:28;;:16;:28;;;;37364:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37454:16;37443:8;;:27;;;;;;;;;;;;;;;;;;37249:229:::0;:::o;9561:281::-;8838:12;:10;:12::i;:::-;8827:23;;:7;:5;:7::i;:::-;:23;;;8819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9684:1:::1;9664:22;;:8;:22;;;;9642:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9797:8;9768:38;;9789:6;::::0;::::1;;;;;;;;9768:38;;;;;;;;;;;;9826:8;9817:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;9561:281:::0;:::o;7153:98::-;7206:7;7233:10;7226:17;;7153:98;:::o;23611:624::-;23699:7;23745:1;23728:19;;:5;:19;;;23724:120;;;23784:1;23772:9;:13;23764:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;23823:9;23816:16;;;;23724:120;23871:1;23862:6;:10;23854:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;23929:1;23916:9;:14;23908:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;24070:6;24023:5;24016:23;;;24040:10;24060:4;24016:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;23994:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;24136:65;24167:10;24187:4;24194:6;24143:5;24136:30;;;;:65;;;;;;:::i;:::-;24221:6;24214:13;;23611:624;;;;;:::o;30699:1679::-;30933:23;30970:17;30989:21;31014:8;;;;;;;;;;;:26;;;31055:11;31081:16;31014:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30969:139;;;;31125:12;31121:1250;;;31172:117;31202:11;31232:8;31259:15;31172:11;:117::i;:::-;31154:135;;31121:1250;;;31364:20;31387:176;31416:16;31451:14;31484:8;31511:10;31540:8;31387:10;:176::i;:::-;31364:199;;31608:1;31582:28;;:14;:28;;;31578:61;;;23383:42;31612:27;;31578:61;31733:8;;;;;;;;;;;:26;;;31778:11;31808:14;31733:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31699:138;;;;;;;;31858:12;31854:506;;;31909:137;31943:11;31977:12;32012:15;31909:11;:137::i;:::-;31891:155;;31854:506;;;32088:14;32104:15;32123:139;32160:11;32194:14;32231:12;32123:14;:139::i;:::-;32087:175;;;;32301:43;32313:11;32326:6;32334:9;32301:11;:43::i;:::-;32283:61;;31854:506;;;31121:1250;;30699:1679;;;;;;;;;;:::o;30039:652::-;30203:22;30238:43;30252:20;30274:6;30238:13;:43::i;:::-;30343:20;30373:6;30366:24;;;30399:4;30366:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30343:62;;30423:6;30416:22;;;30439:6;30455:4;30462:8;30416:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30541:12;30506:6;30499:24;;;30532:4;30499:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;30482:71;;30566:55;30594:10;30606:14;30573:6;30566:27;;;;:55;;;;;:::i;:::-;30637:46;30648:10;30660:6;30668:14;30637:46;;;;;;;;:::i;:::-;;;;;;;;30039:652;;;;;;;:::o;11983:469::-;12112:6;12087:21;:31;;12065:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;12267:12;12285:9;:14;;12307:6;12285:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12266:52;;;12351:7;12329:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11983:469;;;:::o;19168:248::-;19285:123;19319:5;19362:23;;;19387:2;19391:5;19339:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19285:19;:123::i;:::-;19168:248;;;:::o;19424:285::-;19568:133;19602:5;19645:27;;;19674:4;19680:2;19684:5;19622:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19568:19;:133::i;:::-;19424:285;;;;:::o;35201:2040::-;35324:23;35360:20;35383:8;;;;;;;;;;;:24;;;35408:11;35383:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35360:60;;35431:22;35456:8;;;;;;;;;;;:26;;;35483:11;35456:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35431:64;;35506:22;35531:25;35543:12;35531:11;:25::i;:::-;35506:50;;35567:18;35588:8;;;;;;;;;;;:22;;;35611:11;35588:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35624:5;35588:42;;;;;;;;;;;;;;;;;;;;;35567:63;;23383:42;35645:24;;:10;:24;;;35641:179;;35686:122;35753:14;35787:6;35693:10;35686:40;;;;:122;;;;;:::i;:::-;35641:179;35832:17;35852:8;;;;;;;;;;;:21;;;35874:11;35852:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35832:54;;;;35897:18;35918:8;;;;;;;;;;;:28;;;35947:11;35918:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35897:62;;35989:1;35976:9;:14;35972:1191;;;36007:25;;:::i;:::-;36064:6;36047:7;36055:5;36047:14;;;;;;;;;;;;;;;;;;;;:23;;;;;36089:13;36085:205;;;36134:14;36123:40;;;36164:7;36173:1;36176:4;36123:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36085:205;;;36233:14;36222:40;;;36263:7;36272:1;36222:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36085:205;35972:1191;;;;36324:1;36311:9;:14;36307:856;;;36342:25;;:::i;:::-;36399:6;36382:7;36390:5;36382:14;;;;;;;;;;;;;;;;;;;;:23;;;;;36424:13;36420:205;;;36469:14;36458:40;;;36499:7;36508:1;36511:4;36458:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36420:205;;;36568:14;36557:40;;;36598:7;36607:1;36557:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36420:205;36307:856;;;;36657:25;;:::i;:::-;36714:6;36697:7;36705:5;36697:14;;;;;;;;;;;;;;;;;;;;:23;;;;;36739:8;;;;;;;;;;;:18;;;36758:14;36739:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36735:417;;;36808:14;36794:43;;;36845:6;36875:7;36905:1;36794:131;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36735:417;;;36951:13;36947:205;;;36996:14;36985:40;;;37026:7;37035:1;37038:4;36985:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:205;;;37095:14;37084:40;;;37125:7;37134:1;37084:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:205;36735:417;36307:856;;35972:1191;37219:14;37191:25;37203:12;37191:11;:25::i;:::-;:42;;;;:::i;:::-;37173:60;;35201:2040;;;;;;;;;;;:::o;33754:1090::-;33953:20;34010:14;33990:34;;:16;:34;;;33986:80;;;34048:6;34041:13;;;;33986:80;27320:42;34082:30;;:10;:30;;;34078:139;;;27320:42;34129:31;;;34168:6;34129:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34199:6;34192:13;;;;34078:139;34229:19;23383:42;34263:30;;:16;:30;;;34259:167;;;34324:6;34310:20;;34259:167;;;34363:51;34377:16;34395:10;34407:6;34363:13;:51::i;:::-;34259:167;34438:22;34463:27;34475:14;34463:11;:27::i;:::-;34438:52;;34511:15;:27;34527:10;34511:27;;;;;;;;;;;;;;;;;;;;;;;;;34503:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34576:12;34594:10;:15;;34617:11;34630:8;34594:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34575:64;;;34658:7;34650:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34749:14;34719:27;34731:14;34719:11;:27::i;:::-;:44;;;;:::i;:::-;34704:59;;34799:1;34784:12;:16;34776:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33754:1090;;;;;;;;;;;:::o;32864:882::-;33005:20;33027:11;33051:28;33082:8;;;;;;;;;;;:22;;;33105:11;33082:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33051:66;;33133:7;33128:611;33150:1;33146;:5;;;33128:611;;;33173:31;33207:8;;;;;;;;;;;:23;;;33249:10;33260:1;33249:13;;;;;;;;;;;;;;;;;;;;;33207:70;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33173:104;;33331:1;33296:37;;:23;:37;;;33292:436;;33366:8;;;;;;;;;;;:26;;;33415:23;33461:14;33366:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33354:140;;;;;;33530:137;33564:23;33610:10;33643:5;33530:11;:137::i;:::-;33515:152;;33696:12;33710:1;33688:24;;;;;;;;;33292:436;33128:611;33153:3;;;;;:::i;:::-;;;;33128:611;;;;32864:882;;;;;;;;:::o;24541:267::-;24616:13;24639:5;24616:29;;24703:1;24660:6;:16;;;24685:4;24692:7;24660:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;24656:145;;;24706:7;;;24656:145;24743:46;24762:7;24771:17;24743:6;:18;;;;:46;;;;;:::i;:::-;24541:267;;;;:::o;22189:860::-;22613:23;22639:106;22681:4;22639:106;;;;;;;;;;;;;;;;;22647:5;22639:27;;;;:106;;;;;:::i;:::-;22613:132;;22780:1;22760:10;:17;:21;22756:286;;;22933:10;22922:30;;;;;;;;;;;;:::i;:::-;22896:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;22756:286;22189:860;;;:::o;24243:290::-;24329:15;24383:1;24366:19;;:5;:19;;;24362:164;;;24412:21;24402:31;;24362:164;;;24483:5;24476:23;;;24508:4;24476:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24466:48;;24362:164;24243:290;;;:::o;20693:420::-;20824:20;20889:5;20847;:15;;;20871:4;20878:7;20847:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;20824:70;;20905:200;20939:5;21000:22;;;21041:7;21067:12;20959:135;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20905:19;:200::i;:::-;20693:420;;;;:::o;24816:223::-;24941:37;24967:7;24976:1;24948:5;24941:25;;;;:37;;;;;:::i;:::-;24989:42;25015:7;25024:6;24996:5;24989:25;;;;:42;;;;;:::i;:::-;24816:223;;;:::o;19978:707::-;20405:1;20396:5;:10;20395:62;;;;20455:1;20412:5;:15;;;20436:4;20443:7;20412:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;20395:62;20373:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;20550:127;20584:5;20627:22;;;20651:7;20660:5;20604:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20550:19;:127::i;:::-;19978:707;;;:::o;13641:229::-;13778:12;13810:52;13832:6;13840:4;13846:1;13849:12;13810:21;:52::i;:::-;13803:59;;13641:229;;;;;:::o;14857:632::-;15027:12;15099:5;15074:21;:30;;15052:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;15189:18;15200:6;15189:10;:18::i;:::-;15181:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;15315:12;15329:23;15356:6;:11;;15375:5;15396:4;15356:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15314:97;;;;15429:52;15447:7;15456:10;15468:12;15429:17;:52::i;:::-;15422:59;;;;14857:632;;;;;;:::o;10604:444::-;10664:4;10872:12;10996:7;10984:20;10976:28;;11039:1;11032:4;:8;11025:15;;;10604:444;;;:::o;17780:777::-;17930:12;17959:7;17955:595;;;17990:10;17983:17;;;;17955:595;18124:1;18104:10;:17;:21;18100:439;;;18367:10;18361:17;18428:15;18415:10;18411:2;18407:19;18400:44;18315:148;18510:12;18503:20;;;;;;;;;;;:::i;:::-;;;;;;;;17780:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25:587:1:-;;155:78;170:62;225:6;170:62;:::i;:::-;155:78;:::i;:::-;146:87;;253:5;279:6;329:3;321:4;313:6;309:17;304:3;300:27;297:36;294:2;;;346:1;343;336:12;294:2;374:1;359:247;384:6;381:1;378:13;359:247;;;451:3;479:48;523:3;511:10;479:48;:::i;:::-;474:3;467:61;557:4;552:3;548:14;541:21;;591:4;586:3;582:14;575:21;;419:187;406:1;403;399:9;394:14;;359:247;;;363:14;136:476;;;;;;;:::o;618:139::-;;702:6;689:20;680:29;;718:33;745:5;718:33;:::i;:::-;670:87;;;;:::o;763:143::-;;851:6;845:13;836:22;;867:33;894:5;867:33;:::i;:::-;826:80;;;;:::o;930:294::-;;1059:3;1052:4;1044:6;1040:17;1036:27;1026:2;;1077:1;1074;1067:12;1026:2;1104:4;1126:92;1214:3;1206:6;1198;1126:92;:::i;:::-;1117:101;;1016:208;;;;;:::o;1247:367::-;;;1380:3;1373:4;1365:6;1361:17;1357:27;1347:2;;1398:1;1395;1388:12;1347:2;1434:6;1421:20;1411:30;;1464:18;1456:6;1453:30;1450:2;;;1496:1;1493;1486:12;1450:2;1533:4;1525:6;1521:17;1509:29;;1587:3;1579:4;1571:6;1567:17;1557:8;1553:32;1550:41;1547:2;;;1604:1;1601;1594:12;1547:2;1337:277;;;;;:::o;1634:364::-;;;1764:3;1757:4;1749:6;1745:17;1741:27;1731:2;;1782:1;1779;1772:12;1731:2;1818:6;1805:20;1795:30;;1848:18;1840:6;1837:30;1834:2;;;1880:1;1877;1870:12;1834:2;1917:4;1909:6;1905:17;1893:29;;1971:3;1963:4;1955:6;1951:17;1941:8;1937:32;1934:41;1931:2;;;1988:1;1985;1978:12;1931:2;1721:277;;;;;:::o;2004:133::-;;2085:6;2072:20;2063:29;;2101:30;2125:5;2101:30;:::i;:::-;2053:84;;;;:::o;2143:137::-;;2228:6;2222:13;2213:22;;2244:30;2268:5;2244:30;:::i;:::-;2203:77;;;;:::o;2286:139::-;;2370:6;2357:20;2348:29;;2386:33;2413:5;2386:33;:::i;:::-;2338:87;;;;:::o;2444:351::-;;;2561:3;2554:4;2546:6;2542:17;2538:27;2528:2;;2579:1;2576;2569:12;2528:2;2615:6;2602:20;2592:30;;2645:18;2637:6;2634:30;2631:2;;;2677:1;2674;2667:12;2631:2;2714:4;2706:6;2702:17;2690:29;;2768:3;2760:4;2752:6;2748:17;2738:8;2734:32;2731:41;2728:2;;;2785:1;2782;2775:12;2728:2;2518:277;;;;;:::o;2801:183::-;;2907:6;2894:20;2885:29;;2923:55;2972:5;2923:55;:::i;:::-;2875:109;;;;:::o;2990:139::-;;3074:6;3061:20;3052:29;;3090:33;3117:5;3090:33;:::i;:::-;3042:87;;;;:::o;3135:143::-;;3223:6;3217:13;3208:22;;3239:33;3266:5;3239:33;:::i;:::-;3198:80;;;;:::o;3284:139::-;;3370:6;3364:13;3355:22;;3386:31;3411:5;3386:31;:::i;:::-;3345:78;;;;:::o;3429:262::-;;3537:2;3525:9;3516:7;3512:23;3508:32;3505:2;;;3553:1;3550;3543:12;3505:2;3596:1;3621:53;3666:7;3657:6;3646:9;3642:22;3621:53;:::i;:::-;3611:63;;3567:117;3495:196;;;;:::o;3697:284::-;;3816:2;3804:9;3795:7;3791:23;3787:32;3784:2;;;3832:1;3829;3822:12;3784:2;3875:1;3900:64;3956:7;3947:6;3936:9;3932:22;3900:64;:::i;:::-;3890:74;;3846:128;3774:207;;;;:::o;3987:1559::-;;;;;;;;;;;4250:3;4238:9;4229:7;4225:23;4221:33;4218:2;;;4267:1;4264;4257:12;4218:2;4310:1;4335:53;4380:7;4371:6;4360:9;4356:22;4335:53;:::i;:::-;4325:63;;4281:117;4437:2;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4408:118;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4821:3;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4792:119;4950:3;4977:53;5022:7;5013:6;5002:9;4998:22;4977:53;:::i;:::-;4967:63;;4921:119;5107:3;5096:9;5092:19;5079:33;5139:18;5131:6;5128:30;5125:2;;;5171:1;5168;5161:12;5125:2;5207:64;5263:7;5254:6;5243:9;5239:22;5207:64;:::i;:::-;5189:82;;;;5050:231;5320:3;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5291:119;5449:3;5476:53;5521:7;5512:6;5501:9;5497:22;5476:53;:::i;:::-;5466:63;;5420:119;4208:1338;;;;;;;;;;;;;:::o;5552:331::-;;5694:3;5682:9;5673:7;5669:23;5665:33;5662:2;;;5711:1;5708;5701:12;5662:2;5754:1;5779:87;5858:7;5849:6;5838:9;5834:22;5779:87;:::i;:::-;5769:97;;5725:151;5652:231;;;;:::o;5889:425::-;;;6032:2;6020:9;6011:7;6007:23;6003:32;6000:2;;;6048:1;6045;6038:12;6000:2;6119:1;6108:9;6104:17;6091:31;6149:18;6141:6;6138:30;6135:2;;;6181:1;6178;6171:12;6135:2;6217:80;6289:7;6280:6;6269:9;6265:22;6217:80;:::i;:::-;6199:98;;;;6062:245;5990:324;;;;;:::o;6320:727::-;;;;;6512:2;6500:9;6491:7;6487:23;6483:32;6480:2;;;6528:1;6525;6518:12;6480:2;6599:1;6588:9;6584:17;6571:31;6629:18;6621:6;6618:30;6615:2;;;6661:1;6658;6651:12;6615:2;6697:80;6769:7;6760:6;6749:9;6745:22;6697:80;:::i;:::-;6679:98;;;;6542:245;6854:2;6843:9;6839:18;6826:32;6885:18;6877:6;6874:30;6871:2;;;6917:1;6914;6907:12;6871:2;6953:77;7022:7;7013:6;7002:9;6998:22;6953:77;:::i;:::-;6935:95;;;;6797:243;6470:577;;;;;;;:::o;7053:256::-;;7158:2;7146:9;7137:7;7133:23;7129:32;7126:2;;;7174:1;7171;7164:12;7126:2;7217:1;7242:50;7284:7;7275:6;7264:9;7260:22;7242:50;:::i;:::-;7232:60;;7188:114;7116:193;;;;:::o;7315:278::-;;7431:2;7419:9;7410:7;7406:23;7402:32;7399:2;;;7447:1;7444;7437:12;7399:2;7490:1;7515:61;7568:7;7559:6;7548:9;7544:22;7515:61;:::i;:::-;7505:71;;7461:125;7389:204;;;;:::o;7599:430::-;;;7730:2;7718:9;7709:7;7705:23;7701:32;7698:2;;;7746:1;7743;7736:12;7698:2;7789:1;7814:61;7867:7;7858:6;7847:9;7843:22;7814:61;:::i;:::-;7804:71;;7760:125;7924:2;7950:62;8004:7;7995:6;7984:9;7980:22;7950:62;:::i;:::-;7940:72;;7895:127;7688:341;;;;;:::o;8035:306::-;;8165:2;8153:9;8144:7;8140:23;8136:32;8133:2;;;8181:1;8178;8171:12;8133:2;8224:1;8249:75;8316:7;8307:6;8296:9;8292:22;8249:75;:::i;:::-;8239:85;;8195:139;8123:218;;;;:::o;8347:284::-;;8466:2;8454:9;8445:7;8441:23;8437:32;8434:2;;;8482:1;8479;8472:12;8434:2;8525:1;8550:64;8606:7;8597:6;8586:9;8582:22;8550:64;:::i;:::-;8540:74;;8496:128;8424:207;;;;:::o;8637:280::-;;8754:2;8742:9;8733:7;8729:23;8725:32;8722:2;;;8770:1;8767;8760:12;8722:2;8813:1;8838:62;8892:7;8883:6;8872:9;8868:22;8838:62;:::i;:::-;8828:72;;8784:126;8712:205;;;;:::o;8923:179::-;;9013:46;9055:3;9047:6;9013:46;:::i;:::-;9091:4;9086:3;9082:14;9068:28;;9003:99;;;;:::o;9108:118::-;9195:24;9213:5;9195:24;:::i;:::-;9190:3;9183:37;9173:53;;:::o;9264:694::-;9400:52;9446:5;9400:52;:::i;:::-;9468:84;9545:6;9540:3;9468:84;:::i;:::-;9461:91;;9576:54;9624:5;9576:54;:::i;:::-;9653:7;9684:1;9669:282;9694:6;9691:1;9688:13;9669:282;;;9770:6;9764:13;9797:63;9856:3;9841:13;9797:63;:::i;:::-;9790:70;;9883:58;9934:6;9883:58;:::i;:::-;9873:68;;9729:222;9716:1;9713;9709:9;9704:14;;9669:282;;;9673:14;9376:582;;;;;:::o;9996:694::-;10132:52;10178:5;10132:52;:::i;:::-;10200:84;10277:6;10272:3;10200:84;:::i;:::-;10193:91;;10308:54;10356:5;10308:54;:::i;:::-;10385:7;10416:1;10401:282;10426:6;10423:1;10420:13;10401:282;;;10502:6;10496:13;10529:63;10588:3;10573:13;10529:63;:::i;:::-;10522:70;;10615:58;10666:6;10615:58;:::i;:::-;10605:68;;10461:222;10448:1;10445;10441:9;10436:14;;10401:282;;;10405:14;10108:582;;;;;:::o;10728:694::-;10864:52;10910:5;10864:52;:::i;:::-;10932:84;11009:6;11004:3;10932:84;:::i;:::-;10925:91;;11040:54;11088:5;11040:54;:::i;:::-;11117:7;11148:1;11133:282;11158:6;11155:1;11152:13;11133:282;;;11234:6;11228:13;11261:63;11320:3;11305:13;11261:63;:::i;:::-;11254:70;;11347:58;11398:6;11347:58;:::i;:::-;11337:68;;11193:222;11180:1;11177;11173:9;11168:14;;11133:282;;;11137:14;10840:582;;;;;:::o;11428:109::-;11509:21;11524:5;11509:21;:::i;:::-;11504:3;11497:34;11487:50;;:::o;11543:118::-;11630:24;11648:5;11630:24;:::i;:::-;11625:3;11618:37;11608:53;;:::o;11667:373::-;;11799:38;11831:5;11799:38;:::i;:::-;11853:88;11934:6;11929:3;11853:88;:::i;:::-;11846:95;;11950:52;11995:6;11990:3;11983:4;11976:5;11972:16;11950:52;:::i;:::-;12027:6;12022:3;12018:16;12011:23;;11775:265;;;;;:::o;12046:175::-;12155:59;12208:5;12155:59;:::i;:::-;12150:3;12143:72;12133:88;;:::o;12227:147::-;12322:45;12361:5;12322:45;:::i;:::-;12317:3;12310:58;12300:74;;:::o;12380:364::-;;12496:39;12529:5;12496:39;:::i;:::-;12551:71;12615:6;12610:3;12551:71;:::i;:::-;12544:78;;12631:52;12676:6;12671:3;12664:4;12657:5;12653:16;12631:52;:::i;:::-;12708:29;12730:6;12708:29;:::i;:::-;12703:3;12699:39;12692:46;;12472:272;;;;;:::o;12750:330::-;;12913:67;12977:2;12972:3;12913:67;:::i;:::-;12906:74;;13010:34;13006:1;13001:3;12997:11;12990:55;13071:2;13066:3;13062:12;13055:19;;12896:184;;;:::o;13086:319::-;;13249:67;13313:2;13308:3;13249:67;:::i;:::-;13242:74;;13346:23;13342:1;13337:3;13333:11;13326:44;13396:2;13391:3;13387:12;13380:19;;13232:173;;;:::o;13411:303::-;;13574:66;13638:1;13633:3;13574:66;:::i;:::-;13567:73;;13670:8;13666:1;13661:3;13657:11;13650:29;13705:2;13700:3;13696:12;13689:19;;13557:157;;;:::o;13720:313::-;;13883:67;13947:2;13942:3;13883:67;:::i;:::-;13876:74;;13980:17;13976:1;13971:3;13967:11;13960:38;14024:2;14019:3;14015:12;14008:19;;13866:167;;;:::o;14039:325::-;;14202:67;14266:2;14261:3;14202:67;:::i;:::-;14195:74;;14299:29;14295:1;14290:3;14286:11;14279:50;14355:2;14350:3;14346:12;14339:19;;14185:179;;;:::o;14370:322::-;;14533:67;14597:2;14592:3;14533:67;:::i;:::-;14526:74;;14630:26;14626:1;14621:3;14617:11;14610:47;14683:2;14678:3;14674:12;14667:19;;14516:176;;;:::o;14698:370::-;;14861:67;14925:2;14920:3;14861:67;:::i;:::-;14854:74;;14958:34;14954:1;14949:3;14945:11;14938:55;15024:8;15019:2;15014:3;15010:12;15003:30;15059:2;15054:3;15050:12;15043:19;;14844:224;;;:::o;15074:319::-;;15237:67;15301:2;15296:3;15237:67;:::i;:::-;15230:74;;15334:23;15330:1;15325:3;15321:11;15314:44;15384:2;15379:3;15375:12;15368:19;;15220:173;;;:::o;15399:390::-;;15562:67;15626:2;15621:3;15562:67;:::i;:::-;15555:74;;15659:34;15655:1;15650:3;15646:11;15639:55;15725:28;15720:2;15715:3;15711:12;15704:50;15780:2;15775:3;15771:12;15764:19;;15545:244;;;:::o;15795:318::-;;15958:67;16022:2;16017:3;15958:67;:::i;:::-;15951:74;;16055:22;16051:1;16046:3;16042:11;16035:43;16104:2;16099:3;16095:12;16088:19;;15941:172;;;:::o;16119:317::-;;16282:67;16346:2;16341:3;16282:67;:::i;:::-;16275:74;;16379:21;16375:1;16370:3;16366:11;16359:42;16427:2;16422:3;16418:12;16411:19;;16265:171;;;:::o;16442:327::-;;16605:67;16669:2;16664:3;16605:67;:::i;:::-;16598:74;;16702:31;16698:1;16693:3;16689:11;16682:52;16760:2;16755:3;16751:12;16744:19;;16588:181;;;:::o;16775:370::-;;16938:67;17002:2;16997:3;16938:67;:::i;:::-;16931:74;;17035:34;17031:1;17026:3;17022:11;17015:55;17101:8;17096:2;17091:3;17087:12;17080:30;17136:2;17131:3;17127:12;17120:19;;16921:224;;;:::o;17151:309::-;;17314:67;17378:2;17373:3;17314:67;:::i;:::-;17307:74;;17411:13;17407:1;17402:3;17398:11;17391:34;17451:2;17446:3;17442:12;17435:19;;17297:163;;;:::o;17466:318::-;;17629:67;17693:2;17688:3;17629:67;:::i;:::-;17622:74;;17726:22;17722:1;17717:3;17713:11;17706:43;17775:2;17770:3;17766:12;17759:19;;17612:172;;;:::o;17790:330::-;;17953:67;18017:2;18012:3;17953:67;:::i;:::-;17946:74;;18050:34;18046:1;18041:3;18037:11;18030:55;18111:2;18106:3;18102:12;18095:19;;17936:184;;;:::o;18126:297::-;;18306:83;18387:1;18382:3;18306:83;:::i;:::-;18299:90;;18415:1;18410:3;18406:11;18399:18;;18289:134;;;:::o;18429:327::-;;18592:67;18656:2;18651:3;18592:67;:::i;:::-;18585:74;;18689:31;18685:1;18680:3;18676:11;18669:52;18747:2;18742:3;18738:12;18731:19;;18575:181;;;:::o;18762:319::-;;18925:67;18989:2;18984:3;18925:67;:::i;:::-;18918:74;;19022:23;19018:1;19013:3;19009:11;19002:44;19072:2;19067:3;19063:12;19056:19;;18908:173;;;:::o;19087:374::-;;19250:67;19314:2;19309:3;19250:67;:::i;:::-;19243:74;;19347:34;19343:1;19338:3;19334:11;19327:55;19413:12;19408:2;19403:3;19399:12;19392:34;19452:2;19447:3;19443:12;19436:19;;19233:228;;;:::o;19467:386::-;;19630:67;19694:2;19689:3;19630:67;:::i;:::-;19623:74;;19727:34;19723:1;19718:3;19714:11;19707:55;19793:24;19788:2;19783:3;19779:12;19772:46;19844:2;19839:3;19835:12;19828:19;;19613:240;;;:::o;19859:329::-;;20022:67;20086:2;20081:3;20022:67;:::i;:::-;20015:74;;20119:33;20115:1;20110:3;20106:11;20099:54;20179:2;20174:3;20170:12;20163:19;;20005:183;;;:::o;20194:108::-;20271:24;20289:5;20271:24;:::i;:::-;20266:3;20259:37;20249:53;;:::o;20308:118::-;20395:24;20413:5;20395:24;:::i;:::-;20390:3;20383:37;20373:53;;:::o;20432:271::-;;20584:93;20673:3;20664:6;20584:93;:::i;:::-;20577:100;;20694:3;20687:10;;20566:137;;;;:::o;20709:379::-;;20915:147;21058:3;20915:147;:::i;:::-;20908:154;;21079:3;21072:10;;20897:191;;;:::o;21094:222::-;;21225:2;21214:9;21210:18;21202:26;;21238:71;21306:1;21295:9;21291:17;21282:6;21238:71;:::i;:::-;21192:124;;;;:::o;21322:332::-;;21481:2;21470:9;21466:18;21458:26;;21494:71;21562:1;21551:9;21547:17;21538:6;21494:71;:::i;:::-;21575:72;21643:2;21632:9;21628:18;21619:6;21575:72;:::i;:::-;21448:206;;;;;:::o;21660:442::-;;21847:2;21836:9;21832:18;21824:26;;21860:71;21928:1;21917:9;21913:17;21904:6;21860:71;:::i;:::-;21941:72;22009:2;21998:9;21994:18;21985:6;21941:72;:::i;:::-;22023;22091:2;22080:9;22076:18;22067:6;22023:72;:::i;:::-;21814:288;;;;;;:::o;22108:332::-;;22267:2;22256:9;22252:18;22244:26;;22280:71;22348:1;22337:9;22333:17;22324:6;22280:71;:::i;:::-;22361:72;22429:2;22418:9;22414:18;22405:6;22361:72;:::i;:::-;22234:206;;;;;:::o;22446:440::-;;22659:2;22648:9;22644:18;22636:26;;22672:117;22786:1;22775:9;22771:17;22762:6;22672:117;:::i;:::-;22799:80;22875:2;22864:9;22860:18;22851:6;22799:80;:::i;:::-;22626:260;;;;;:::o;22892:539::-;;23127:3;23116:9;23112:19;23104:27;;23141:117;23255:1;23244:9;23240:17;23231:6;23141:117;:::i;:::-;23268:80;23344:2;23333:9;23329:18;23320:6;23268:80;:::i;:::-;23358:66;23420:2;23409:9;23405:18;23396:6;23358:66;:::i;:::-;23094:337;;;;;;:::o;23437:441::-;;23650:3;23639:9;23635:19;23627:27;;23664:117;23778:1;23767:9;23763:17;23754:6;23664:117;:::i;:::-;23791:80;23867:2;23856:9;23852:18;23843:6;23791:80;:::i;:::-;23617:261;;;;;:::o;23884:540::-;;24119:3;24108:9;24104:19;24096:27;;24133:117;24247:1;24236:9;24232:17;24223:6;24133:117;:::i;:::-;24260:80;24336:2;24325:9;24321:18;24312:6;24260:80;:::i;:::-;24350:67;24412:3;24401:9;24397:19;24388:6;24350:67;:::i;:::-;24086:338;;;;;;:::o;24430:442::-;;24643:3;24632:9;24628:19;24620:27;;24657:117;24771:1;24760:9;24756:17;24747:6;24657:117;:::i;:::-;24784:81;24860:3;24849:9;24845:19;24836:6;24784:81;:::i;:::-;24610:262;;;;;:::o;24878:541::-;;25113:3;25102:9;25098:19;25090:27;;25127:117;25241:1;25230:9;25226:17;25217:6;25127:117;:::i;:::-;25254:81;25330:3;25319:9;25315:19;25306:6;25254:81;:::i;:::-;25345:67;25407:3;25396:9;25392:19;25383:6;25345:67;:::i;:::-;25080:339;;;;;;:::o;25425:210::-;;25550:2;25539:9;25535:18;25527:26;;25563:65;25625:1;25614:9;25610:17;25601:6;25563:65;:::i;:::-;25517:118;;;;:::o;25641:266::-;;25794:2;25783:9;25779:18;25771:26;;25807:93;25897:1;25886:9;25882:17;25873:6;25807:93;:::i;:::-;25761:146;;;;:::o;25913:313::-;;26064:2;26053:9;26049:18;26041:26;;26113:9;26107:4;26103:20;26099:1;26088:9;26084:17;26077:47;26141:78;26214:4;26205:6;26141:78;:::i;:::-;26133:86;;26031:195;;;;:::o;26232:419::-;;26436:2;26425:9;26421:18;26413:26;;26485:9;26479:4;26475:20;26471:1;26460:9;26456:17;26449:47;26513:131;26639:4;26513:131;:::i;:::-;26505:139;;26403:248;;;:::o;26657:419::-;;26861:2;26850:9;26846:18;26838:26;;26910:9;26904:4;26900:20;26896:1;26885:9;26881:17;26874:47;26938:131;27064:4;26938:131;:::i;:::-;26930:139;;26828:248;;;:::o;27082:419::-;;27286:2;27275:9;27271:18;27263:26;;27335:9;27329:4;27325:20;27321:1;27310:9;27306:17;27299:47;27363:131;27489:4;27363:131;:::i;:::-;27355:139;;27253:248;;;:::o;27507:419::-;;27711:2;27700:9;27696:18;27688:26;;27760:9;27754:4;27750:20;27746:1;27735:9;27731:17;27724:47;27788:131;27914:4;27788:131;:::i;:::-;27780:139;;27678:248;;;:::o;27932:419::-;;28136:2;28125:9;28121:18;28113:26;;28185:9;28179:4;28175:20;28171:1;28160:9;28156:17;28149:47;28213:131;28339:4;28213:131;:::i;:::-;28205:139;;28103:248;;;:::o;28357:419::-;;28561:2;28550:9;28546:18;28538:26;;28610:9;28604:4;28600:20;28596:1;28585:9;28581:17;28574:47;28638:131;28764:4;28638:131;:::i;:::-;28630:139;;28528:248;;;:::o;28782:419::-;;28986:2;28975:9;28971:18;28963:26;;29035:9;29029:4;29025:20;29021:1;29010:9;29006:17;28999:47;29063:131;29189:4;29063:131;:::i;:::-;29055:139;;28953:248;;;:::o;29207:419::-;;29411:2;29400:9;29396:18;29388:26;;29460:9;29454:4;29450:20;29446:1;29435:9;29431:17;29424:47;29488:131;29614:4;29488:131;:::i;:::-;29480:139;;29378:248;;;:::o;29632:419::-;;29836:2;29825:9;29821:18;29813:26;;29885:9;29879:4;29875:20;29871:1;29860:9;29856:17;29849:47;29913:131;30039:4;29913:131;:::i;:::-;29905:139;;29803:248;;;:::o;30057:419::-;;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30228:248;;;:::o;30482:419::-;;30686:2;30675:9;30671:18;30663:26;;30735:9;30729:4;30725:20;30721:1;30710:9;30706:17;30699:47;30763:131;30889:4;30763:131;:::i;:::-;30755:139;;30653:248;;;:::o;30907:419::-;;31111:2;31100:9;31096:18;31088:26;;31160:9;31154:4;31150:20;31146:1;31135:9;31131:17;31124:47;31188:131;31314:4;31188:131;:::i;:::-;31180:139;;31078:248;;;:::o;31332:419::-;;31536:2;31525:9;31521:18;31513:26;;31585:9;31579:4;31575:20;31571:1;31560:9;31556:17;31549:47;31613:131;31739:4;31613:131;:::i;:::-;31605:139;;31503:248;;;:::o;31757:419::-;;31961:2;31950:9;31946:18;31938:26;;32010:9;32004:4;32000:20;31996:1;31985:9;31981:17;31974:47;32038:131;32164:4;32038:131;:::i;:::-;32030:139;;31928:248;;;:::o;32182:419::-;;32386:2;32375:9;32371:18;32363:26;;32435:9;32429:4;32425:20;32421:1;32410:9;32406:17;32399:47;32463:131;32589:4;32463:131;:::i;:::-;32455:139;;32353:248;;;:::o;32607:419::-;;32811:2;32800:9;32796:18;32788:26;;32860:9;32854:4;32850:20;32846:1;32835:9;32831:17;32824:47;32888:131;33014:4;32888:131;:::i;:::-;32880:139;;32778:248;;;:::o;33032:419::-;;33236:2;33225:9;33221:18;33213:26;;33285:9;33279:4;33275:20;33271:1;33260:9;33256:17;33249:47;33313:131;33439:4;33313:131;:::i;:::-;33305:139;;33203:248;;;:::o;33457:419::-;;33661:2;33650:9;33646:18;33638:26;;33710:9;33704:4;33700:20;33696:1;33685:9;33681:17;33674:47;33738:131;33864:4;33738:131;:::i;:::-;33730:139;;33628:248;;;:::o;33882:419::-;;34086:2;34075:9;34071:18;34063:26;;34135:9;34129:4;34125:20;34121:1;34110:9;34106:17;34099:47;34163:131;34289:4;34163:131;:::i;:::-;34155:139;;34053:248;;;:::o;34307:419::-;;34511:2;34500:9;34496:18;34488:26;;34560:9;34554:4;34550:20;34546:1;34535:9;34531:17;34524:47;34588:131;34714:4;34588:131;:::i;:::-;34580:139;;34478:248;;;:::o;34732:419::-;;34936:2;34925:9;34921:18;34913:26;;34985:9;34979:4;34975:20;34971:1;34960:9;34956:17;34949:47;35013:131;35139:4;35013:131;:::i;:::-;35005:139;;34903:248;;;:::o;35157:222::-;;35288:2;35277:9;35273:18;35265:26;;35301:71;35369:1;35358:9;35354:17;35345:6;35301:71;:::i;:::-;35255:124;;;;:::o;35385:442::-;;35572:2;35561:9;35557:18;35549:26;;35585:71;35653:1;35642:9;35638:17;35629:6;35585:71;:::i;:::-;35666:72;35734:2;35723:9;35719:18;35710:6;35666:72;:::i;:::-;35748;35816:2;35805:9;35801:18;35792:6;35748:72;:::i;:::-;35539:288;;;;;;:::o;35833:283::-;;35899:2;35893:9;35883:19;;35941:4;35933:6;35929:17;36048:6;36036:10;36033:22;36012:18;36000:10;35997:34;35994:62;35991:2;;;36059:18;;:::i;:::-;35991:2;36099:10;36095:2;36088:22;35873:243;;;;:::o;36122:249::-;;36287:18;36279:6;36276:30;36273:2;;;36309:18;;:::i;:::-;36273:2;36359:4;36351:6;36347:17;36339:25;;36202:169;;;:::o;36377:98::-;;36465:3;36457:11;;36447:28;;;:::o;36481:98::-;;36569:3;36561:11;;36551:28;;;:::o;36585:98::-;;36673:3;36665:11;;36655:28;;;:::o;36689:104::-;;36782:4;36772:14;;36761:32;;;:::o;36799:104::-;;36892:4;36882:14;;36871:32;;;:::o;36909:104::-;;37002:4;36992:14;;36981:32;;;:::o;37019:98::-;;37104:5;37098:12;37088:22;;37077:40;;;:::o;37123:99::-;;37209:5;37203:12;37193:22;;37182:40;;;:::o;37228:111::-;;37328:4;37323:3;37319:14;37311:22;;37301:38;;;:::o;37345:111::-;;37445:4;37440:3;37436:14;37428:22;;37418:38;;;:::o;37462:111::-;;37562:4;37557:3;37553:14;37545:22;;37535:38;;;:::o;37579:143::-;;37713:3;37698:18;;37688:34;;;;:::o;37728:143::-;;37862:3;37847:18;;37837:34;;;;:::o;37877:143::-;;38011:3;37996:18;;37986:34;;;;:::o;38026:147::-;;38164:3;38149:18;;38139:34;;;;:::o;38179:169::-;;38297:6;38292:3;38285:19;38337:4;38332:3;38328:14;38313:29;;38275:73;;;;:::o;38354:305::-;;38413:20;38431:1;38413:20;:::i;:::-;38408:25;;38447:20;38465:1;38447:20;:::i;:::-;38442:25;;38601:1;38533:66;38529:74;38526:1;38523:81;38520:2;;;38607:18;;:::i;:::-;38520:2;38651:1;38648;38644:9;38637:16;;38398:261;;;;:::o;38665:191::-;;38725:20;38743:1;38725:20;:::i;:::-;38720:25;;38759:20;38777:1;38759:20;:::i;:::-;38754:25;;38798:1;38795;38792:8;38789:2;;;38803:18;;:::i;:::-;38789:2;38848:1;38845;38841:9;38833:17;;38710:146;;;;:::o;38862:96::-;;38928:24;38946:5;38928:24;:::i;:::-;38917:35;;38907:51;;;:::o;38964:90::-;;39041:5;39034:13;39027:21;39016:32;;39006:48;;;:::o;39060:77::-;;39126:5;39115:16;;39105:32;;;:::o;39143:118::-;;39231:24;39249:5;39231:24;:::i;:::-;39220:35;;39210:51;;;:::o;39267:126::-;;39344:42;39337:5;39333:54;39322:65;;39312:81;;;:::o;39399:77::-;;39465:5;39454:16;;39444:32;;;:::o;39482:86::-;;39557:4;39550:5;39546:16;39535:27;;39525:43;;;:::o;39574:170::-;;39679:59;39732:5;39679:59;:::i;:::-;39666:72;;39656:88;;;:::o;39750:135::-;;39855:24;39873:5;39855:24;:::i;:::-;39842:37;;39832:53;;;:::o;39891:121::-;;39982:24;40000:5;39982:24;:::i;:::-;39969:37;;39959:53;;;:::o;40018:307::-;40086:1;40096:113;40110:6;40107:1;40104:13;40096:113;;;40195:1;40190:3;40186:11;40180:18;40176:1;40171:3;40167:11;40160:39;40132:2;40129:1;40125:10;40120:15;;40096:113;;;40227:6;40224:1;40221:13;40218:2;;;40307:1;40298:6;40293:3;40289:16;40282:27;40218:2;40067:258;;;;:::o;40331:233::-;;40393:24;40411:5;40393:24;:::i;:::-;40384:33;;40439:66;40432:5;40429:77;40426:2;;;40509:18;;:::i;:::-;40426:2;40556:1;40549:5;40545:13;40538:20;;40374:190;;;:::o;40570:167::-;;40630:22;40646:5;40630:22;:::i;:::-;40621:31;;40674:4;40667:5;40664:15;40661:2;;;40682:18;;:::i;:::-;40661:2;40729:1;40722:5;40718:13;40711:20;;40611:126;;;:::o;40743:180::-;40791:77;40788:1;40781:88;40888:4;40885:1;40878:15;40912:4;40909:1;40902:15;40929:180;40977:77;40974:1;40967:88;41074:4;41071:1;41064:15;41098:4;41095:1;41088:15;41115:102;;41207:2;41203:7;41198:2;41191:5;41187:14;41183:28;41173:38;;41163:54;;;:::o;41223:122::-;41296:24;41314:5;41296:24;:::i;:::-;41289:5;41286:35;41276:2;;41335:1;41332;41325:12;41276:2;41266:79;:::o;41351:116::-;41421:21;41436:5;41421:21;:::i;:::-;41414:5;41411:32;41401:2;;41457:1;41454;41447:12;41401:2;41391:76;:::o;41473:122::-;41546:24;41564:5;41546:24;:::i;:::-;41539:5;41536:35;41526:2;;41585:1;41582;41575:12;41526:2;41516:79;:::o;41601:166::-;41696:46;41736:5;41696:46;:::i;:::-;41689:5;41686:57;41676:2;;41757:1;41754;41747:12;41676:2;41666:101;:::o;41773:122::-;41846:24;41864:5;41846:24;:::i;:::-;41839:5;41836:35;41826:2;;41885:1;41882;41875:12;41826:2;41816:79;:::o;41901:118::-;41972:22;41988:5;41972:22;:::i;:::-;41965:5;41962:33;41952:2;;42009:1;42006;41999:12;41952:2;41942:77;:::o
Swarm Source
ipfs://828e11e0f7f76377aaccb4e27bd3ac19281a530feef0cc09155e5f43b3dd381f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.