Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,012 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12858130 | 1222 days ago | IN | 0 ETH | 0.00129537 | ||||
In Case Tokenget... | 12165531 | 1329 days ago | IN | 0 ETH | 0.00386256 | ||||
Toggle Contract ... | 11457383 | 1438 days ago | IN | 0 ETH | 0.00269577 | ||||
Zap Out | 11271757 | 1467 days ago | IN | 0 ETH | 0.01867376 | ||||
Zap Out | 11270982 | 1467 days ago | IN | 0 ETH | 0.01297844 | ||||
Zap Out | 11268980 | 1467 days ago | IN | 0 ETH | 0.00546564 | ||||
Zap Out | 11268586 | 1467 days ago | IN | 0 ETH | 0.04546873 | ||||
Zap Out | 11267500 | 1467 days ago | IN | 0 ETH | 0.06587689 | ||||
Zap Out | 11265086 | 1468 days ago | IN | 0 ETH | 0.01562662 | ||||
Zap Out | 11263674 | 1468 days ago | IN | 0 ETH | 0.01443758 | ||||
Zap Out | 11262571 | 1468 days ago | IN | 0 ETH | 0.02003907 | ||||
Zap Out | 11261768 | 1468 days ago | IN | 0 ETH | 0.00819954 | ||||
Zap Out | 11261169 | 1468 days ago | IN | 0 ETH | 0.02088284 | ||||
Zap Out | 11260236 | 1468 days ago | IN | 0 ETH | 0.04122324 | ||||
Zap Out | 11258321 | 1469 days ago | IN | 0 ETH | 0.00338365 | ||||
Zap Out | 11256276 | 1469 days ago | IN | 0 ETH | 0.03855449 | ||||
Zap Out | 11255495 | 1469 days ago | IN | 0 ETH | 0.04363862 | ||||
Zap Out | 11251577 | 1470 days ago | IN | 0 ETH | 0.01903596 | ||||
Zap Out | 11250396 | 1470 days ago | IN | 0 ETH | 0.07519516 | ||||
Zap Out | 11249394 | 1470 days ago | IN | 0 ETH | 0.02749609 | ||||
Zap Out | 11247779 | 1470 days ago | IN | 0 ETH | 0.08206181 | ||||
Zap Out | 11241813 | 1471 days ago | IN | 0 ETH | 0.00407079 | ||||
Zap Out | 11241608 | 1471 days ago | IN | 0 ETH | 0.04733176 | ||||
Zap Out | 11240256 | 1471 days ago | IN | 0 ETH | 0.0414988 | ||||
Zap Out | 11239614 | 1471 days ago | IN | 0 ETH | 0.01174111 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11268980 | 1467 days ago | 1.05855366 ETH | ||||
11268980 | 1467 days ago | 1.05855366 ETH | ||||
11261768 | 1468 days ago | 6.77741598 ETH | ||||
11261768 | 1468 days ago | 6.77741598 ETH | ||||
11258321 | 1469 days ago | 2.26498753 ETH | ||||
11258321 | 1469 days ago | 2.26498753 ETH | ||||
11257696 | 1469 days ago | 8.61192796 ETH | ||||
11257696 | 1469 days ago | 8.61192796 ETH | ||||
11256019 | 1469 days ago | 4.79073721 ETH | ||||
11256019 | 1469 days ago | 4.79073721 ETH | ||||
11253643 | 1469 days ago | 2.4171074 ETH | ||||
11253643 | 1469 days ago | 2.4171074 ETH | ||||
11249238 | 1470 days ago | 1.99513528 ETH | ||||
11249238 | 1470 days ago | 1.99513528 ETH | ||||
11241813 | 1471 days ago | 0.09489422 ETH | ||||
11241813 | 1471 days ago | 0.09489422 ETH | ||||
11240301 | 1471 days ago | 4.8452027 ETH | ||||
11240301 | 1471 days ago | 4.8452027 ETH | ||||
11233971 | 1472 days ago | 1.07078472 ETH | ||||
11233971 | 1472 days ago | 1.07078472 ETH | ||||
11231039 | 1473 days ago | 7.29327472 ETH | ||||
11231039 | 1473 days ago | 7.29327472 ETH | ||||
11230592 | 1473 days ago | 0.03544006 ETH | ||||
11230592 | 1473 days ago | 0.03544006 ETH | ||||
11227960 | 1473 days ago | 2.19943142 ETH |
Loading...
Loading
Contract Name:
Curve_General_ZapOut_V2
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-27 */ // File: node_modules\@openzeppelin\contracts\utils\Address.sol pragma solidity ^0.5.5; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: node_modules\@openzeppelin\contracts\token\ERC20\IERC20.sol pragma solidity ^0.5.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 { /** * @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: node_modules\@openzeppelin\contracts\GSN\Context.sol pragma solidity ^0.5.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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: node_modules\@openzeppelin\contracts\ownership\Ownable.sol pragma solidity ^0.5.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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: node_modules\@openzeppelin\contracts\utils\ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: node_modules\@openzeppelin\contracts\math\SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts\Curve\Curve_General_Zapout_V1_2.sol // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // Copyright (C) 2020 zapper, nodarjanashia, suhailg, apoorvlathey, seb, sumit // 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. // // Visit <https://www.gnu.org/licenses/>for a copy of the GNU Affero General Public License ///@author Zapper ///@notice this contract implements one click ZapOut from Curve Pools pragma solidity 0.5.12; /** * @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 ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // interface interface ICurveExchange { // function coins() external view returns (address[] memory); function coins(int128 arg0) external view returns (address); function underlying_coins(int128 arg0) external view returns (address); function balances(int128 arg0) external view returns (uint256); function remove_liquidity(uint256 _amount, uint256[4] calldata min_amounts) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount, bool donate_dust ) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function exchange_underlying( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external returns (uint256); } interface ICurveExchangeBTC { function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; } interface ICurveExchangeSBTC { function remove_liquidity(uint256 _amount, uint256[3] calldata min_amounts) external; } interface ICurveExchangeRenBTC { function remove_liquidity(uint256 _amount, uint256[2] calldata min_amounts) external; } interface IuniswapFactory { function getExchange(address token) external view returns (address exchange); } interface IuniswapExchange { // converting ERC20 to ERC20 and transfer function tokenToTokenTransferInput( uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr ) external returns (uint256 tokens_bought); function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold); function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold); function tokenToEthTransferInput( uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient ) external returns (uint256 eth_bought); function balanceOf(address _owner) external view returns (uint256); function transfer(address _to, uint256 _value) external returns (bool); function transferFrom( address from, address to, uint256 tokens ) external returns (bool success); } interface IWETH { function deposit() external payable; function withdraw(uint256) external; } interface cERC20 { function redeem(uint256) external returns (uint256); } interface yERC20 { function withdraw(uint256 _amount) external; } interface IUniswapRouter02 { //get estimated amountOut function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); //token 2 token function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); //eth 2 token function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); //token 2 eth function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } interface IBalancer { function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external returns (uint tokenAmountOut, uint spotPriceAfter); } contract Curve_General_ZapOut_V2 is ReentrancyGuard, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using Address for address; bool private stopped = false; uint16 public goodwill; address public dzgoodwillAddress; IBalancer private constant BalWBTCPool = IBalancer(0x294de1cdE8b04bf6d25F98f1d547052F8080A177); IuniswapFactory private constant UniSwapFactoryAddress = IuniswapFactory( 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95 ); IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); address private constant wethTokenAddress = address( 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ); address private constant WBTCTokenAddress = address( 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 ); address private constant DaiTokenAddress = address( 0x6B175474E89094C44Da98b954EedeAC495271d0F ); address private constant UsdcTokenAddress = address( 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 ); address private constant UsdtTokenAddress = address( 0xdAC17F958D2ee523a2206206994597C13D831ec7 ); address public sUsdTokenAddress = address( 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51 ); address private constant bUsdTokenAddress = address( 0x4Fabb145d64652a948d72533023f6E7A623C7C53 ); address private constant sUSDCurveExchangeAddress = address( 0xFCBa3E75865d2d561BE8D220616520c171F12851 ); address private constant sUSDCurvePoolTokenAddress = address( 0xC25a3A3b969415c80451098fa907EC722572917F ); address private constant yCurveExchangeAddress = address( 0xbBC81d23Ea2c3ec7e56D39296F0cbB648873a5d3 ); address private constant yCurvePoolTokenAddress = address( 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8 ); address private constant bUSDCurveExchangeAddress = address( 0xb6c057591E073249F2D9D88Ba59a46CFC9B59EdB ); address private constant bUSDCurvePoolTokenAddress = address( 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B ); address private constant paxCurveExchangeAddress = address( 0xA50cCc70b6a011CffDdf45057E39679379187287 ); address private constant paxCurvePoolTokenAddress = address( 0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8 ); address private constant renCurvePoolTokenAddress = address( 0x49849C98ae39Fff122806C06791Fa73784FB3675 ); address private constant sbtcCurvePoolTokenAddress = address( 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3 ); address private constant renCurveExchangeAddress = address( 0x93054188d876f558f4a66B2EF1d97d16eDf0895B ); address private constant sbtcCurveExchangeAddress = address( 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714 ); address private constant yDAI = address(0xC2cB1040220768554cf699b0d863A3cd4324ce32); address private constant yUSDC = address(0xd6aD7a6750A7593E092a9B218d66C0A814a3436e); address private constant yUSDT = address(0x83f798e925BcD4017Eb265844FDDAbb448f1707D); address private constant yBUSD = address(0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE); address private constant yTUSD = address(0x73a052500105205d34Daf004eAb301916DA8190f); address private constant ycDAI = address(0x99d1Fa417f94dcD62BfE781a1213c092a47041Bc); address private constant ycUSDC = address(0x9777d7E2b60bB01759D0E2f8be2095df444cb07E); address private constant ycUSDT = address(0x1bE5d71F2dA660BFdee8012dDc58D024448A0A59); mapping(address => address) public exchange2Token; mapping(address => address) public cToken; mapping(address => address) public yToken; constructor( uint16 _goodwill, address _dzgoodwillAddress ) public { goodwill = _goodwill; dzgoodwillAddress = _dzgoodwillAddress; approveToken(); setCRVTokenAddresses(); setcTokens(); setyTokens(); } function approveToken() public { IERC20(sUSDCurvePoolTokenAddress).approve( sUSDCurveExchangeAddress, uint256(-1) ); IERC20(yCurvePoolTokenAddress).approve( yCurveExchangeAddress, uint256(-1) ); IERC20(bUSDCurvePoolTokenAddress).approve( bUSDCurveExchangeAddress, uint256(-1) ); IERC20(paxCurvePoolTokenAddress).approve( paxCurveExchangeAddress, uint256(-1) ); IERC20(renCurvePoolTokenAddress).approve( renCurveExchangeAddress, uint256(-1) ); IERC20(sbtcCurvePoolTokenAddress).approve( sbtcCurveExchangeAddress, uint256(-1) ); } function setcTokens() public onlyOwner { cToken[address( 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643 )] = DaiTokenAddress; cToken[address( 0x39AA39c021dfbaE8faC545936693aC917d5E7563 )] = UsdcTokenAddress; cToken[address( 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9 )] = UsdtTokenAddress; cToken[address( 0xC11b1268C1A384e55C48c2391d8d480264A3A7F4 )] = WBTCTokenAddress; } function setyTokens() public onlyOwner { //y tokens yToken[yDAI] = DaiTokenAddress; yToken[yUSDC] = UsdcTokenAddress; yToken[yUSDT] = UsdtTokenAddress; yToken[yBUSD] = bUsdTokenAddress; //yc tokens yToken[ycDAI] = DaiTokenAddress; yToken[ycUSDC] = UsdcTokenAddress; yToken[ycUSDT] = UsdtTokenAddress; } function setCRVTokenAddresses() public onlyOwner { exchange2Token[sUSDCurveExchangeAddress] = sUSDCurvePoolTokenAddress; exchange2Token[yCurveExchangeAddress] = yCurvePoolTokenAddress; exchange2Token[bUSDCurveExchangeAddress] = bUSDCurvePoolTokenAddress; exchange2Token[paxCurveExchangeAddress] = paxCurvePoolTokenAddress; exchange2Token[renCurveExchangeAddress] = renCurvePoolTokenAddress; exchange2Token[sbtcCurveExchangeAddress] = sbtcCurvePoolTokenAddress; } function addCRVToken(address _exchangeAddress, address _crvTokenAddress) public onlyOwner { exchange2Token[_exchangeAddress] = _crvTokenAddress; } function addCToken(address _cToken, address _underlyingToken) public onlyOwner { cToken[_cToken] = _underlyingToken; } function addYToken(address _yToken, address _underlyingToken) public onlyOwner { yToken[_yToken] = _underlyingToken; } function set_new_sUSDTokenAddress(address _new_sUSDTokenAddress) public onlyOwner { sUsdTokenAddress = _new_sUSDTokenAddress; } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } function ZapoutToUnderlying( address _toWhomToIssue, address _curveExchangeAddress, uint256 _IncomingCRV, uint256 _tokenCount ) public stopInEmergency { require( _curveExchangeAddress == sUSDCurveExchangeAddress || _curveExchangeAddress == yCurveExchangeAddress || _curveExchangeAddress == bUSDCurveExchangeAddress || _curveExchangeAddress == paxCurveExchangeAddress || _curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress, "Invalid Curve Pool Address" ); uint256 goodwillPortion = SafeMath.div( SafeMath.mul(_IncomingCRV, goodwill), 10000 ); require( IERC20(exchange2Token[_curveExchangeAddress]).transferFrom( msg.sender, dzgoodwillAddress, goodwillPortion ), "Error transferring goodwill" ); require( IERC20(exchange2Token[_curveExchangeAddress]).transferFrom( msg.sender, address(this), SafeMath.sub(_IncomingCRV, goodwillPortion) ), "Error transferring CRV" ); require(SafeMath.sub(_IncomingCRV, goodwillPortion) > 0, "Here"); address[] memory coins; if ( (_curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress) ) { coins = getCoins(_curveExchangeAddress, _tokenCount); } else { coins = getUnderlyingCoins(_curveExchangeAddress, _tokenCount); } if (_tokenCount == 4) { ICurveExchange(_curveExchangeAddress).remove_liquidity( SafeMath.sub(_IncomingCRV, goodwillPortion), [uint256(0), 0, 0, 0] ); } else if (_tokenCount == 3) { ICurveExchangeSBTC(_curveExchangeAddress).remove_liquidity( SafeMath.sub(_IncomingCRV, goodwillPortion), [uint256(0), 0, 0] ); } else if (_tokenCount == 2) { ICurveExchangeRenBTC(_curveExchangeAddress).remove_liquidity( SafeMath.sub(_IncomingCRV, goodwillPortion), [uint256(0), 0] ); } for (uint256 index = 0; index < _tokenCount; index++) { uint256 tokenReceived = IERC20(coins[index]).balanceOf( address(this) ); if (tokenReceived > 0) SafeERC20.safeTransfer( IERC20(coins[index]), _toWhomToIssue, tokenReceived ); } } function ZapOut( address payable _toWhomToIssue, address _curveExchangeAddress, uint256 _tokenCount, uint256 _IncomingCRV, address _ToTokenAddress, uint256 _minToTokens ) public stopInEmergency returns (uint256 ToTokensBought) { require( _curveExchangeAddress == sUSDCurveExchangeAddress || _curveExchangeAddress == yCurveExchangeAddress || _curveExchangeAddress == bUSDCurveExchangeAddress || _curveExchangeAddress == paxCurveExchangeAddress || _curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress, "Invalid Curve Pool Address" ); uint256 goodwillPortion = SafeMath.div( SafeMath.mul(_IncomingCRV, goodwill), 10000 ); require( IERC20(exchange2Token[_curveExchangeAddress]).transferFrom( msg.sender, dzgoodwillAddress, goodwillPortion ), "Error transferring goodwill" ); require( IERC20(exchange2Token[_curveExchangeAddress]).transferFrom( msg.sender, address(this), SafeMath.sub(_IncomingCRV, goodwillPortion) ), "Error transferring CRV" ); (bool flag, uint256 i) = _getIntermediateToken( _ToTokenAddress, _curveExchangeAddress, _tokenCount ); if ( flag && (_curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress) ) { uint256 tokenBought = _exitCurve( _curveExchangeAddress, i, SafeMath.sub(_IncomingCRV, goodwillPortion) ); require(tokenBought > 0, "No liquidity removed"); ToTokensBought = _swap( _ToTokenAddress, WBTCTokenAddress, _toWhomToIssue, tokenBought ); } else if (flag) { uint256 tokenBought = _exitCurve( _curveExchangeAddress, i, SafeMath.sub(_IncomingCRV, goodwillPortion) ); require(tokenBought > 0, "No liquidity removed"); // if wbtc, coin else underlying coin ToTokensBought = _swap( _ToTokenAddress, ICurveExchange(_curveExchangeAddress).underlying_coins( int128(i) ), _toWhomToIssue, tokenBought ); } else { //split CRV tokens received uint256 _crv = (_IncomingCRV.sub(goodwillPortion)).div(2); uint256 tokenBought = _exitCurve( _curveExchangeAddress, 0, _crv ); require(tokenBought > 0, "No liquidity removed"); //swap dai ToTokensBought = _swap( _ToTokenAddress, ICurveExchange(_curveExchangeAddress).underlying_coins( int128(0) ), _toWhomToIssue, tokenBought ); tokenBought = _exitCurve( _curveExchangeAddress, 1, (_IncomingCRV.sub(goodwillPortion)).sub(_crv) ); require(tokenBought > 0, "No liquidity removed"); //swap usdc ToTokensBought += _swap( _ToTokenAddress, ICurveExchange(_curveExchangeAddress).underlying_coins( int128(1) ), _toWhomToIssue, tokenBought ); } require(ToTokensBought >= _minToTokens, "ERR: High Slippage"); } function _exitCurve( address _curveExchangeAddress, uint256 i, uint256 _IncomingCRV ) internal returns (uint256 tokenReceived) { // Withdraw to intermediate token from Curve if ( _curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress ) { ICurveExchangeBTC(_curveExchangeAddress).remove_liquidity_one_coin( _IncomingCRV, int128(i), 0 ); tokenReceived = IERC20( ICurveExchange(_curveExchangeAddress).coins(int128(i)) ) .balanceOf(address(this)); } else { ICurveExchange(_curveExchangeAddress).remove_liquidity_one_coin( _IncomingCRV, int128(i), 0, false ); tokenReceived = IERC20( ICurveExchange(_curveExchangeAddress).underlying_coins( int128(i) ) ) .balanceOf(address(this)); } require(tokenReceived > 0, "No token received"); } function _swap( address _toToken, address _fromToken, address payable _toWhomToIssue, uint256 _amount ) internal returns (uint256) { if (_toToken == _fromToken) { SafeERC20.safeTransfer(IERC20(_fromToken), _toWhomToIssue, _amount); return _amount; } else if (_toToken == address(0)) { return _token2Eth(_fromToken, _amount, _toWhomToIssue); } else { return _token2Token( _fromToken, _toWhomToIssue, _toToken, _amount ); } } function _getIntermediateToken( address _ToTokenAddress, address _curveExchangeAddress, uint256 _tokenCount ) public view returns (bool, uint256) { address[] memory coins = getCoins(_curveExchangeAddress, _tokenCount); address[] memory underlyingCoins = getUnderlyingCoins( _curveExchangeAddress, _tokenCount ); //check if toToken is coin (bool isCurveToken, uint256 index) = isBound(_ToTokenAddress, coins); if (isCurveToken) return (true, index); ////check if toToken is underlying coin (isCurveToken, index) = isBound(_ToTokenAddress, underlyingCoins); if (isCurveToken) return (true, index); if ( _curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress ) { //return wbtc for renBTC & sBTC pools return (true, 1); } else return (false, 0); } function isBound(address _token, address[] memory coins) internal pure returns (bool, uint256) { if (_token == address(0)) return (false, 0); for (uint256 i = 0; i < coins.length; i++) { if (_token == coins[i]) { return (true, i); } } return (false, 0); } function getUnderlyingCoins( address _curveExchangeAddress, uint256 _tokenCount ) public view returns (address[] memory) { if ( _curveExchangeAddress == renCurveExchangeAddress || _curveExchangeAddress == sbtcCurveExchangeAddress ) { return new address[](_tokenCount); } address[] memory coins = new address[](_tokenCount); for (uint256 i = 0; i < _tokenCount; i++) { address coin = ICurveExchange(_curveExchangeAddress) .underlying_coins(int128(i)); coins[i] = coin; } return coins; } function getCoins(address _curveExchangeAddress, uint256 _tokenCount) public view returns (address[] memory) { address[] memory coins = new address[](_tokenCount); for (uint256 i = 0; i < _tokenCount; i++) { address coin = ICurveExchange(_curveExchangeAddress).coins( int128(i) ); coins[i] = coin; } return coins; } function _token2Eth( address _FromTokenContractAddress, uint256 tokens2Trade, address payable _toWhomToIssue ) public returns (uint256) { if (_FromTokenContractAddress == wethTokenAddress) { IWETH(wethTokenAddress).withdraw(tokens2Trade); _toWhomToIssue.transfer(tokens2Trade); return tokens2Trade; } if(_FromTokenContractAddress == WBTCTokenAddress) { IERC20(WBTCTokenAddress).approve( address(BalWBTCPool), tokens2Trade ); (uint256 wethBought, ) = BalWBTCPool.swapExactAmountIn( WBTCTokenAddress, tokens2Trade, wethTokenAddress, 0, uint(-1) ); IWETH(wethTokenAddress).withdraw(wethBought); (bool success, ) = _toWhomToIssue.call.value(wethBought)(""); require(success, "ETH Transfer failed."); return wethBought; } //unwrap (uint256 tokensUnwrapped, address fromToken) = _unwrap( _FromTokenContractAddress, tokens2Trade ); IERC20(fromToken).approve( address(uniswapRouter), tokensUnwrapped ); address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; uint256 ethBought = uniswapRouter.swapExactTokensForETH( tokensUnwrapped, 1, path, _toWhomToIssue, now + 60 )[path.length - 1]; require(ethBought > 0, "Error in swapping Eth: 1"); return ethBought; } /** @notice This function is used to swap tokens @param _FromTokenContractAddress The token address to swap from @param _ToWhomToIssue The address to transfer after swap @param _ToTokenContractAddress The token address to swap to @param tokens2Trade The quantity of tokens to swap @return The amount of tokens returned after swap */ function _token2Token( address _FromTokenContractAddress, address _ToWhomToIssue, address _ToTokenContractAddress, uint256 tokens2Trade ) public returns (uint256 tokenBought) { //unwrap (uint256 tokensUnwrapped, address fromToken) = _unwrap( _FromTokenContractAddress, tokens2Trade ); IERC20(fromToken).approve( address(uniswapRouter), tokensUnwrapped ); address[] memory path = new address[](3); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; path[2] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokensUnwrapped, 1, path, _ToWhomToIssue, now + 60 )[path.length - 1]; require(tokenBought > 0, "Error in swapping ERC: 1"); } function _unwrap(address _FromTokenContractAddress, uint256 tokens2Trade) internal returns (uint256 tokensUnwrapped, address toToken) { if (cToken[_FromTokenContractAddress] != address(0)) { require( cERC20(_FromTokenContractAddress).redeem(tokens2Trade) == 0, "Error in unwrapping" ); toToken = cToken[_FromTokenContractAddress]; } else if (yToken[_FromTokenContractAddress] != address(0)) { yERC20(_FromTokenContractAddress).withdraw(tokens2Trade); toToken = yToken[_FromTokenContractAddress]; } else { toToken = _FromTokenContractAddress; } tokensUnwrapped = IERC20(toToken).balanceOf(address(this)); } function set_new_goodwill(uint16 _new_goodwill) public onlyOwner { require( _new_goodwill >= 0 && _new_goodwill < 10000, "GoodWill Value not allowed" ); goodwill = _new_goodwill; } function set_new_dzgoodwillAddress(address _new_dzgoodwillAddress) public onlyOwner { dzgoodwillAddress = _new_dzgoodwillAddress; } function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner { uint256 qty = _TokenAddress.balanceOf(address(this)); _TokenAddress.transfer(owner(), qty); } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() public onlyOwner { uint256 contractBalance = address(this).balance; address payable _to = owner().toPayable(); _to.transfer(contractBalance); } function() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint16","name":"_goodwill","type":"uint16"},{"internalType":"address","name":"_dzgoodwillAddress","type":"address"}],"payable":false,"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"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_curveExchangeAddress","type":"address"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"},{"internalType":"uint256","name":"_IncomingCRV","type":"uint256"},{"internalType":"address","name":"_ToTokenAddress","type":"address"},{"internalType":"uint256","name":"_minToTokens","type":"uint256"}],"name":"ZapOut","outputs":[{"internalType":"uint256","name":"ToTokensBought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_curveExchangeAddress","type":"address"},{"internalType":"uint256","name":"_IncomingCRV","type":"uint256"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"}],"name":"ZapoutToUnderlying","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_ToTokenAddress","type":"address"},{"internalType":"address","name":"_curveExchangeAddress","type":"address"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"}],"name":"_getIntermediateToken","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"},{"internalType":"address payable","name":"_toWhomToIssue","type":"address"}],"name":"_token2Eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToWhomToIssue","type":"address"},{"internalType":"address","name":"_ToTokenContractAddress","type":"address"},{"internalType":"uint256","name":"tokens2Trade","type":"uint256"}],"name":"_token2Token","outputs":[{"internalType":"uint256","name":"tokenBought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_exchangeAddress","type":"address"},{"internalType":"address","name":"_crvTokenAddress","type":"address"}],"name":"addCRVToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_cToken","type":"address"},{"internalType":"address","name":"_underlyingToken","type":"address"}],"name":"addCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_yToken","type":"address"},{"internalType":"address","name":"_underlyingToken","type":"address"}],"name":"addYToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dzgoodwillAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchange2Token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_curveExchangeAddress","type":"address"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"}],"name":"getCoins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_curveExchangeAddress","type":"address"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"}],"name":"getUnderlyingCoins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sUsdTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setCRVTokenAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_dzgoodwillAddress","type":"address"}],"name":"set_new_dzgoodwillAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_sUSDTokenAddress","type":"address"}],"name":"set_new_sUSDTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setcTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setyTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"yToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000805460ff60a81b19169055600280546001600160a01b0319167357ab1ec28d129707052df4df418d58a2d46d5f511790553480156200004457600080fd5b5060405162004b5038038062004b50833981810160405260408110156200006a57600080fd5b5080516020909101516000805460ff19166001178155620000936001600160e01b036200017816565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805461ffff60b01b191676010000000000000000000000000000000000000000000061ffff851602179055600180546001600160a01b0319166001600160a01b038316179055620001376200017c565b6200014a6001600160e01b03620005c816565b6200015d6001600160e01b03620007cf16565b620001706001600160e01b036200095c16565b505062000b9b565b3390565b604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273fcba3e75865d2d561be8d220616520c171f1285160048201526000196024820152905173c25a3a3b969415c80451098fa907ec722572917f9163095ea7b39160448083019260209291908290030181600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d60208110156200023157600080fd5b5050604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360048201526000196024820152905173df5e0e81dff6faf3a7e52ba697820c5e32d806a89163095ea7b39160448083019260209291908290030181600087803b158015620002bc57600080fd5b505af1158015620002d1573d6000803e3d6000fd5b505050506040513d6020811015620002e857600080fd5b5050604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273b6c057591e073249f2d9d88ba59a46cfc9b59edb600482015260001960248201529051733b3ac5386837dc563660fb6a0937dfaa5924333b9163095ea7b39160448083019260209291908290030181600087803b1580156200037357600080fd5b505af115801562000388573d6000803e3d6000fd5b505050506040513d60208110156200039f57600080fd5b5050604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273a50ccc70b6a011cffddf45057e3967937918728760048201526000196024820152905173d905e2eaebe188fc92179b6350807d8bd91db0d89163095ea7b39160448083019260209291908290030181600087803b1580156200042a57600080fd5b505af11580156200043f573d6000803e3d6000fd5b505050506040513d60208110156200045657600080fd5b5050604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527393054188d876f558f4a66b2ef1d97d16edf0895b6004820152600019602482015290517349849c98ae39fff122806c06791fa73784fb36759163095ea7b39160448083019260209291908290030181600087803b158015620004e157600080fd5b505af1158015620004f6573d6000803e3d6000fd5b505050506040513d60208110156200050d57600080fd5b5050604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152737fc77b5c7614e1533320ea6ddc2eb61fa00a971460048201526000196024820152905173075b1bb99792c9e1041ba13afef80c91a1e70fb39163095ea7b39160448083019260209291908290030181600087803b1580156200059857600080fd5b505af1158015620005ad573d6000803e3d6000fd5b505050506040513d6020811015620005c457600080fd5b5050565b620005db6001600160e01b0362000b7016565b6200063657604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201819052602482015260008051602062004b30833981519152604482015290519081900360640190fd5b60036020527f53391dedc3e81cef5e47e9093ef30d8238b4742df60b43c1c4aa3210cb31d23780546001600160a01b031990811673c25a3a3b969415c80451098fa907ec722572917f179091557fe383329dac8fc0739fd275ada4335c51b16c805d31097a1c2d46ecf4d64727be8054821673df5e0e81dff6faf3a7e52ba697820c5e32d806a81790557f7028020495fd0447d46caa182b14ce543fdf83cd9e6a49827a6ad7f45fd602cf80548216733b3ac5386837dc563660fb6a0937dfaa5924333b1790557f10c914fdad9b470b488d148ced5983be0348f39150f4e2ee9cd61071580716618054821673d905e2eaebe188fc92179b6350807d8bd91db0d81790557f6b952f6a36563f2ba577572e1f977783269346465b32a3eaaf6833e2a8ea9ae9805482167349849c98ae39fff122806c06791fa73784fb3675179055737fc77b5c7614e1533320ea6ddc2eb61fa00a97146000527f3d8122bacbd44602332daa2535661007f9ba01b86e4f0a84b8d5578ac34eb7ab805490911673075b1bb99792c9e1041ba13afef80c91a1e70fb3179055565b620007e26001600160e01b0362000b7016565b6200083d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201819052602482015260008051602062004b30833981519152604482015290519081900360640190fd5b60046020527f9fa92590da772b8c7fb9b5c455f569c1e3b3f19b63b83984b0ad8152649d53c480546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f179091557f47336cdcec23a27b85486918d6039b4af5f1421830ccd0a370172929a3ba591d8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481790557ffdcc55c9209b72836c1663792b9373b7fc794df515e1786c2bf1ccb392cc986c8054821673dac17f958d2ee523a2206206994597c13d831ec717905573c11b1268c1a384e55c48c2391d8d480264a3a7f46000527f95643f1b9a362cfa919fcd7641b664d3c6babcbcdd02d9be89fb7619d0513d918054909116732260fac5e5542a773aa44fbcfedf7c193bc2c599179055565b6200096f6001600160e01b0362000b7016565b620009ca57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201819052602482015260008051602062004b30833981519152604482015290519081900360640190fd5b60056020527fcd0c56b339b8c11f28550296fb02c601c0f0d2b0a871a232e7ede8f60930fe2080546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f9081179092557fc9dd26e10c6aa3f2d3c2d260c6883303719298610be0c765b3d1ed02cc678ebe8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489081179091557f25ef11bc9a17a2aaf6527ca0724babca28f15494b22af766e38359d1de9232de8054831673dac17f958d2ee523a2206206994597c13d831ec79081179091557f043aac9e3157b2b225737e481b907496d765f1618d45daa2575dfd9cb59a8fa580548416734fabb145d64652a948d72533023f6e7a623c7c531790557f89df9f238397ef183f1ca50f637969787c661d5f71f32cdc40feac933131774e805484169094179093557f0ea70601683ce558af2e75662d595f86f3aeabd5b34baf4537bc4b4a840bf518805483169091179055731be5d71f2da660bfdee8012ddc58d024448a0a596000527f29310642ac503b600420594813b025fb2b9f7ec1ee94e7bec0cf614d88ea411680549091169091179055565b6000805461010090046001600160a01b031662000b8c62000178565b6001600160a01b031614905090565b613f858062000bab6000396000f3fe6080604052600436106101cd5760003560e01c80638f32d59b116100f7578063be29491111610095578063e471d14511610064578063e471d145146106ee578063ee9d084a14610737578063efc119811461076a578063f2fde38b1461077f576101cd565b8063be2949111461061a578063c2b030641461065d578063c3a8fcb0146106a6578063dcf48ca9146106bb576101cd565b8063a872775b116100d1578063a872775b14610569578063a8dd3d641461057e578063aac9e8f2146105b1578063b10e1dbc146105ec576101cd565b80638f32d59b146104f257806399b71d5c1461051b578063a70bba6714610530576101cd565b806366f45ba61161016f5780637efeb4ad1161013e5780637efeb4ad1461048057806380996f9914610495578063849e25f4146104aa5780638da5cb5b146104dd576101cd565b806366f45ba6146103405780636c6a0f8a1461037b578063715018a6146103e257806376f7eb1e146103f7576101cd565b806333eeac10116101ab57806333eeac101461026e5780633ccfd60b146102cc578063551196d5146102e15780635de0398e14610314576101cd565b8063108d79fb146101cf5780631385d24c1461021e578063146b9f7014610233575b005b3480156101db57600080fd5b50610202600480360360208110156101f257600080fd5b50356001600160a01b03166107b2565b604080516001600160a01b039092168252519081900360200190f35b34801561022a57600080fd5b506101cd6107cd565b34801561023f57600080fd5b506101cd6004803603604081101561025657600080fd5b506001600160a01b0381358116916020013516610835565b34801561027a57600080fd5b506102b16004803603606081101561029157600080fd5b506001600160a01b038135811691602081013590911690604001356108aa565b60408051921515835260208301919091528051918290030190f35b3480156102d857600080fd5b506101cd610989565b3480156102ed57600080fd5b506101cd6004803603602081101561030457600080fd5b50356001600160a01b0316610a2b565b34801561032057600080fd5b50610329610b81565b6040805161ffff9092168252519081900360200190f35b34801561034c57600080fd5b506101cd6004803603604081101561036357600080fd5b506001600160a01b0381358116916020013516610b92565b34801561038757600080fd5b506103d0600480360360c081101561039e57600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135916080820135169060a00135610c07565b60408051918252519081900360200190f35b3480156103ee57600080fd5b506101cd6113a4565b34801561040357600080fd5b506104306004803603604081101561041a57600080fd5b506001600160a01b03813516906020013561143a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046c578181015183820152602001610454565b505050509050019250505060405180910390f35b34801561048c57600080fd5b506102026115aa565b3480156104a157600080fd5b506101cd6115b9565b3480156104b657600080fd5b506101cd600480360360208110156104cd57600080fd5b50356001600160a01b031661171f565b3480156104e957600080fd5b50610202611788565b3480156104fe57600080fd5b5061050761179c565b604080519115158252519081900360200190f35b34801561052757600080fd5b506101cd6117c5565b34801561053c57600080fd5b506104306004803603604081101561055357600080fd5b506001600160a01b038135169060200135611b69565b34801561057557600080fd5b506101cd611c50565b34801561058a57600080fd5b50610202600480360360208110156105a157600080fd5b50356001600160a01b0316611e3d565b3480156105bd57600080fd5b506101cd600480360360408110156105d457600080fd5b506001600160a01b0381358116916020013516611e58565b3480156105f857600080fd5b506101cd6004803603602081101561060f57600080fd5b503561ffff16611ecd565b34801561062657600080fd5b506103d06004803603606081101561063d57600080fd5b506001600160a01b03813581169160208101359160409091013516611f90565b34801561066957600080fd5b506103d06004803603608081101561068057600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612644565b3480156106b257600080fd5b506102026129b9565b3480156106c757600080fd5b50610202600480360360208110156106de57600080fd5b50356001600160a01b03166129c8565b3480156106fa57600080fd5b506101cd6004803603608081101561071157600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356129e3565b34801561074357600080fd5b506101cd6004803603602081101561075a57600080fd5b50356001600160a01b0316613100565b34801561077657600080fd5b506101cd613169565b34801561078b57600080fd5b506101cd600480360360208110156107a257600080fd5b50356001600160a01b0316613349565b6004602052600090815260409020546001600160a01b031681565b6107d561179c565b610814576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b61083d61179c565b61087c576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b60008060606108b98585611b69565b905060606108c7868661143a565b90506000806108d6898561339c565b9150915081156108ef5760019550935061098192505050565b6108f9898461339c565b909250905081156109135760019550935061098192505050565b6001600160a01b0388167393054188d876f558f4a66b2ef1d97d16edf0895b148061095a57506001600160a01b038816737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b1561097057506001945084935061098192505050565b506000945084935061098192505050565b935093915050565b61099161179c565b6109d0576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b303160006109ed6109df611788565b6001600160a01b0316613414565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610a26573d6000803e3d6000fd5b505050565b610a3361179c565b610a72576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d6020811015610ae657600080fd5b505190506001600160a01b03821663a9059cbb610b01611788565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d6020811015610b7b57600080fd5b50505050565b600054600160b01b900461ffff1681565b610b9a61179c565b610bd9576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b60008054600160a81b900460ff1615610c5c576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03861673fcba3e75865d2d561be8d220616520c171f128511480610ca357506001600160a01b03861673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80610cca57506001600160a01b03861673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80610cf157506001600160a01b03861673a50ccc70b6a011cffddf45057e39679379187287145b80610d1857506001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b145b80610d3f57506001600160a01b038616737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b610d90576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b60008054610db690610dae908790600160b01b900461ffff16613417565b612710613470565b6001600160a01b0380891660009081526003602090815260408083205460015482516323b872dd60e01b81523360048201529086166024820152604481018790529151959650909316936323b872dd93606480820194918390030190829087803b158015610e2357600080fd5b505af1158015610e37573d6000803e3d6000fd5b505050506040513d6020811015610e4d57600080fd5b5051610ea0576040805162461bcd60e51b815260206004820152601b60248201527f4572726f72207472616e7366657272696e6720676f6f6477696c6c0000000000604482015290519081900360640190fd5b6001600160a01b03808816600090815260036020526040902054166323b872dd3330610ecc89866134b2565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d6020811015610f5e57600080fd5b5051610faa576040805162461bcd60e51b815260206004820152601660248201527522b93937b9103a3930b739b332b93934b7339021a92b60511b604482015290519081900360640190fd5b600080610fb8868a8a6108aa565b9150915081801561100b57506001600160a01b0389167393054188d876f558f4a66b2ef1d97d16edf0895b148061100b57506001600160a01b038916737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b1561109c5760006110268a836110218b886134b2565b6134f4565b905060008111611074576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b61109487732260fac5e5542a773aa44fbcfedf7c193bc2c5998d84613852565b94505061134d565b81156111825760006110b38a836110218b886134b2565b905060008111611101576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b611094878b6001600160a01b031663b739953e856040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561114f57600080fd5b505afa158015611163573d6000803e3d6000fd5b505050506040513d602081101561117957600080fd5b50518d84613852565b60006111a560026111998a8763ffffffff6134b216565b9063ffffffff61347016565b905060006111b58b6000846134f4565b905060008111611203576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b60408051635b9cca9f60e11b8152600060048201529051611283918a916001600160a01b038f169163b739953e916024808301926020929190829003018186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d602081101561127a57600080fd5b50518e84613852565b95506112ab8b60016110218561129f8e8b63ffffffff6134b216565b9063ffffffff6134b216565b9050600081116112f9576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b60408051635b9cca9f60e11b8152600160048201529051611346918a916001600160a01b038f169163b739953e916024808301926020929190829003018186803b15801561125057600080fd5b8601955050505b84841015611397576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b5050509695505050505050565b6113ac61179c565b6113eb576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60606001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b148061148357506001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156114ba57816040519080825280602002602001820160405280156114b2578160200160208202803883390190505b5090506115a4565b6060826040519080825280602002602001820160405280156114e6578160200160208202803883390190505b50905060005b838110156115a0576000856001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50518351909150819084908490811061157f57fe5b6001600160a01b0390921660209283029190910190910152506001016114ec565b5090505b92915050565b6002546001600160a01b031681565b6115c161179c565b611600576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60046020527f9fa92590da772b8c7fb9b5c455f569c1e3b3f19b63b83984b0ad8152649d53c480546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f179091557f47336cdcec23a27b85486918d6039b4af5f1421830ccd0a370172929a3ba591d8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481790557ffdcc55c9209b72836c1663792b9373b7fc794df515e1786c2bf1ccb392cc986c8054821673dac17f958d2ee523a2206206994597c13d831ec717905573c11b1268c1a384e55c48c2391d8d480264a3a7f46000527f95643f1b9a362cfa919fcd7641b664d3c6babcbcdd02d9be89fb7619d0513d918054909116732260fac5e5542a773aa44fbcfedf7c193bc2c599179055565b61172761179c565b611766576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b03166117b66138b4565b6001600160a01b031614905090565b6040805163095ea7b360e01b815273fcba3e75865d2d561be8d220616520c171f1285160048201526000196024820152905173c25a3a3b969415c80451098fa907ec722572917f9163095ea7b39160448083019260209291908290030181600087803b15801561183457600080fd5b505af1158015611848573d6000803e3d6000fd5b505050506040513d602081101561185e57600080fd5b50506040805163095ea7b360e01b815273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360048201526000196024820152905173df5e0e81dff6faf3a7e52ba697820c5e32d806a89163095ea7b39160448083019260209291908290030181600087803b1580156118cf57600080fd5b505af11580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50506040805163095ea7b360e01b815273b6c057591e073249f2d9d88ba59a46cfc9b59edb600482015260001960248201529051733b3ac5386837dc563660fb6a0937dfaa5924333b9163095ea7b39160448083019260209291908290030181600087803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b505050506040513d602081101561199457600080fd5b50506040805163095ea7b360e01b815273a50ccc70b6a011cffddf45057e3967937918728760048201526000196024820152905173d905e2eaebe188fc92179b6350807d8bd91db0d89163095ea7b39160448083019260209291908290030181600087803b158015611a0557600080fd5b505af1158015611a19573d6000803e3d6000fd5b505050506040513d6020811015611a2f57600080fd5b50506040805163095ea7b360e01b81527393054188d876f558f4a66b2ef1d97d16edf0895b6004820152600019602482015290517349849c98ae39fff122806c06791fa73784fb36759163095ea7b39160448083019260209291908290030181600087803b158015611aa057600080fd5b505af1158015611ab4573d6000803e3d6000fd5b505050506040513d6020811015611aca57600080fd5b50506040805163095ea7b360e01b8152737fc77b5c7614e1533320ea6ddc2eb61fa00a971460048201526000196024820152905173075b1bb99792c9e1041ba13afef80c91a1e70fb39163095ea7b39160448083019260209291908290030181600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b5050565b60608082604051908082528060200260200182016040528015611b96578160200160208202803883390190505b50905060005b838110156115a0576000856001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d6020811015611c1a57600080fd5b505183519091508190849084908110611c2f57fe5b6001600160a01b039092166020928302919091019091015250600101611b9c565b611c5861179c565b611c97576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60056020527fcd0c56b339b8c11f28550296fb02c601c0f0d2b0a871a232e7ede8f60930fe2080546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f9081179092557fc9dd26e10c6aa3f2d3c2d260c6883303719298610be0c765b3d1ed02cc678ebe8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489081179091557f25ef11bc9a17a2aaf6527ca0724babca28f15494b22af766e38359d1de9232de8054831673dac17f958d2ee523a2206206994597c13d831ec79081179091557f043aac9e3157b2b225737e481b907496d765f1618d45daa2575dfd9cb59a8fa580548416734fabb145d64652a948d72533023f6e7a623c7c531790557f89df9f238397ef183f1ca50f637969787c661d5f71f32cdc40feac933131774e805484169094179093557f0ea70601683ce558af2e75662d595f86f3aeabd5b34baf4537bc4b4a840bf518805483169091179055731be5d71f2da660bfdee8012ddc58d024448a0a596000527f29310642ac503b600420594813b025fb2b9f7ec1ee94e7bec0cf614d88ea411680549091169091179055565b6003602052600090815260409020546001600160a01b031681565b611e6061179c565b611e9f576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260036020526040902080546001600160a01b03191691909216179055565b611ed561179c565b611f14576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6127108161ffff1610611f6e576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60006001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156120685773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561201157600080fd5b505af1158015612025573d6000803e3d6000fd5b50506040516001600160a01b038516925085156108fc02915085906000818181858888f1935050505015801561205f573d6000803e3d6000fd5b5082905061263d565b6001600160a01b038416732260fac5e5542a773aa44fbcfedf7c193bc2c59914156122fd576040805163095ea7b360e01b815273294de1cde8b04bf6d25f98f1d547052f8080a1776004820152602481018590529051732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b39160448083019260209291908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505060408051638201aa3f60e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c59960048201526024810185905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604482015260006064820181905260001960848301528251909273294de1cde8b04bf6d25f98f1d547052f8080a17792638201aa3f9260a4808301939282900301818787803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506040513d60408110156121e757600080fd5b505160408051632e1a7d4d60e01b815260048101839052905191925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9160248082019260009290919082900301818387803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b5050604051600092506001600160a01b038616915083908381818185875af1925050503d80600081146122a3576040519150601f19603f3d011682016040523d82523d6000602084013e6122a8565b606091505b50509050806122f5576040805162461bcd60e51b815260206004820152601460248201527322aa24102a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b50905061263d565b60008061230a86866138b8565b6040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905290519294509092506001600160a01b0383169163095ea7b3916044808201926020929091908290030181600087803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b5050604080516002808252606080830184529260208301908038833901905050905086816000815181106123ce57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061241057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe5856001858a42603c016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156124d75781810151838201526020016124bf565b505050509050019650505050505050600060405180830381600087803b15801561250057600080fd5b505af1158015612514573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561253d57600080fd5b810190808051604051939291908464010000000082111561255d57600080fd5b90830190602082018581111561257257600080fd5b825186602082028301116401000000008211171561258f57600080fd5b82525081516020918201928201910280838360005b838110156125bc5781810151838201526020016125a4565b505050509050016040525050506001835103815181106125d857fe5b6020026020010151905060008111612637576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204574683a20310000000000000000604482015290519081900360640190fd5b93505050505b9392505050565b600080600061265387856138b8565b6040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905290519294509092506001600160a01b0383169163095ea7b3916044808201926020929091908290030181600087803b1580156126bd57600080fd5b505af11580156126d1573d6000803e3d6000fd5b505050506040513d60208110156126e757600080fd5b505060408051600380825260808201909252606091602082018380388339019050509050878160008151811061271957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061275b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061278957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed1739846001848b42603c016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561284e578181015183820152602001612836565b505050509050019650505050505050600060405180830381600087803b15801561287757600080fd5b505af115801561288b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128b457600080fd5b81019080805160405193929190846401000000008211156128d457600080fd5b9083019060208201858111156128e957600080fd5b825186602082028301116401000000008211171561290657600080fd5b82525081516020918201928201910280838360005b8381101561293357818101518382015260200161291b565b5050505090500160405250505060018251038151811061294f57fe5b60200260200101519350600084116129ae576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b505050949350505050565b6001546001600160a01b031681565b6005602052600090815260409020546001600160a01b031681565b600054600160a81b900460ff1615612a37576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03831673fcba3e75865d2d561be8d220616520c171f128511480612a7e57506001600160a01b03831673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80612aa557506001600160a01b03831673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80612acc57506001600160a01b03831673a50ccc70b6a011cffddf45057e39679379187287145b80612af357506001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b145b80612b1a57506001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b612b6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b60008054612b8990610dae908590600160b01b900461ffff16613417565b6001600160a01b0380861660009081526003602090815260408083205460015482516323b872dd60e01b81523360048201529086166024820152604481018790529151959650909316936323b872dd93606480820194918390030190829087803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b505050506040513d6020811015612c2057600080fd5b5051612c73576040805162461bcd60e51b815260206004820152601b60248201527f4572726f72207472616e7366657272696e6720676f6f6477696c6c0000000000604482015290519081900360640190fd5b6001600160a01b03808516600090815260036020526040902054166323b872dd3330612c9f87866134b2565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015612d0757600080fd5b505af1158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b5051612d7d576040805162461bcd60e51b815260206004820152601660248201527522b93937b9103a3930b739b332b93934b7339021a92b60511b604482015290519081900360640190fd5b6000612d8984836134b2565b11612dc4576040805162461bcd60e51b815260206004808301919091526024820152634865726560e01b604482015290519081900360640190fd5b60606001600160a01b0385167393054188d876f558f4a66b2ef1d97d16edf0895b1480612e0d57506001600160a01b038516737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b15612e2357612e1c8584611b69565b9050612e30565b612e2d858461143a565b90505b8260041415612ef657846001600160a01b0316637d49d875612e5286856134b2565b604051806080016040528060008152602001600081526020016000815260200160008152506040518363ffffffff1660e01b81526004018083815260200182600460200280838360005b83811015612eb4578181015183820152602001612e9c565b5050505090500192505050600060405180830381600087803b158015612ed957600080fd5b505af1158015612eed573d6000803e3d6000fd5b50505050613026565b8260031415612f7257846001600160a01b031663ecb586a5612f1886856134b2565b6040518060600160405280600081526020016000815260200160008152506040518363ffffffff1660e01b815260040180838152602001826003602002808383600083811015612eb4578181015183820152602001612e9c565b826002141561302657846001600160a01b0316635b36389c612f9486856134b2565b60405180604001604052806000815260200160008152506040518363ffffffff1660e01b81526004018083815260200182600260200280838360005b83811015612fe8578181015183820152602001612fd0565b5050505090500192505050600060405180830381600087803b15801561300d57600080fd5b505af1158015613021573d6000803e3d6000fd5b505050505b60005b838110156130f757600082828151811061303f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561309c57600080fd5b505afa1580156130b0573d6000803e3d6000fd5b505050506040513d60208110156130c657600080fd5b5051905080156130ee576130ee8383815181106130df57fe5b60200260200101518983613ad5565b50600101613029565b50505050505050565b61310861179c565b613147576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61317161179c565b6131b0576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60036020527f53391dedc3e81cef5e47e9093ef30d8238b4742df60b43c1c4aa3210cb31d23780546001600160a01b031990811673c25a3a3b969415c80451098fa907ec722572917f179091557fe383329dac8fc0739fd275ada4335c51b16c805d31097a1c2d46ecf4d64727be8054821673df5e0e81dff6faf3a7e52ba697820c5e32d806a81790557f7028020495fd0447d46caa182b14ce543fdf83cd9e6a49827a6ad7f45fd602cf80548216733b3ac5386837dc563660fb6a0937dfaa5924333b1790557f10c914fdad9b470b488d148ced5983be0348f39150f4e2ee9cd61071580716618054821673d905e2eaebe188fc92179b6350807d8bd91db0d81790557f6b952f6a36563f2ba577572e1f977783269346465b32a3eaaf6833e2a8ea9ae9805482167349849c98ae39fff122806c06791fa73784fb3675179055737fc77b5c7614e1533320ea6ddc2eb61fa00a97146000527f3d8122bacbd44602332daa2535661007f9ba01b86e4f0a84b8d5578ac34eb7ab805490911673075b1bb99792c9e1041ba13afef80c91a1e70fb3179055565b61335161179c565b613390576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b61339981613b27565b50565b6000806001600160a01b0384166133b85750600090508061340d565b60005b8351811015613404578381815181106133d057fe5b60200260200101516001600160a01b0316856001600160a01b031614156133fc5760019250905061340d565b6001016133bb565b50600091508190505b9250929050565b90565b600082613426575060006115a4565b8282028284828161343357fe5b041461263d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613ee66021913960400191505060405180910390fd5b600061263d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bd2565b600061263d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c74565b60006001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b148061353d57506001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156136a45760408051630d2680e960e11b815260048101849052600f85810b900b602482015260006044820181905291516001600160a01b03871692631a4d01d2926064808201939182900301818387803b15801561359b57600080fd5b505af11580156135af573d6000803e3d6000fd5b50505050836001600160a01b03166323746eb8846040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156135fd57600080fd5b505afa158015613611573d6000803e3d6000fd5b505050506040513d602081101561362757600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561367157600080fd5b505afa158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50519050613809565b6040805163517a55a360e01b815260048101849052600f85810b900b60248201526000604482018190526064820181905291516001600160a01b0387169263517a55a3926084808201939182900301818387803b15801561370457600080fd5b505af1158015613718573d6000803e3d6000fd5b50505050836001600160a01b031663b739953e846040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561376657600080fd5b505afa15801561377a573d6000803e3d6000fd5b505050506040513d602081101561379057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156137da57600080fd5b505afa1580156137ee573d6000803e3d6000fd5b505050506040513d602081101561380457600080fd5b505190505b6000811161263d576040805162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b881c9958d95a5d9959607a1b604482015290519081900360640190fd5b6000836001600160a01b0316856001600160a01b0316141561388057613879848484613ad5565b50806138ac565b6001600160a01b0385166138a057613899848385611f90565b90506138ac565b61389984848785612644565b949350505050565b3390565b6001600160a01b038281166000908152600460205260408120549091829116156139b757836001600160a01b031663db006a75846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561392257600080fd5b505af1158015613936573d6000803e3d6000fd5b505050506040513d602081101561394c57600080fd5b505115613996576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b506001600160a01b0380841660009081526004602052604090205416613a5a565b6001600160a01b038481166000908152600560205260409020541615613a5757836001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613a1d57600080fd5b505af1158015613a31573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260056020526040902054169050613a5a565b50825b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613aa057600080fd5b505afa158015613ab4573d6000803e3d6000fd5b505050506040513d6020811015613aca57600080fd5b505194909350915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a26908490613cce565b6001600160a01b038116613b6c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ec06026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008183613c5e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c23578181015183820152602001613c0b565b50505050905090810190601f168015613c505780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c6a57fe5b0495945050505050565b60008184841115613cc65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c23578181015183820152602001613c0b565b505050900390565b613ce0826001600160a01b0316613e86565b613d31576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613d6f5780518252601f199092019160209182019101613d50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915081613e2d576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610b7b57808060200190516020811015613e4957600080fd5b5051610b7b5760405162461bcd60e51b815260040180806020018281038252602a815260200180613f27602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906138ac57505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820095887631bc0e070aa1fee69b74f7285c934955f88cdd9fb52593e2497edee2e64736f6c634300050c00324f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80638f32d59b116100f7578063be29491111610095578063e471d14511610064578063e471d145146106ee578063ee9d084a14610737578063efc119811461076a578063f2fde38b1461077f576101cd565b8063be2949111461061a578063c2b030641461065d578063c3a8fcb0146106a6578063dcf48ca9146106bb576101cd565b8063a872775b116100d1578063a872775b14610569578063a8dd3d641461057e578063aac9e8f2146105b1578063b10e1dbc146105ec576101cd565b80638f32d59b146104f257806399b71d5c1461051b578063a70bba6714610530576101cd565b806366f45ba61161016f5780637efeb4ad1161013e5780637efeb4ad1461048057806380996f9914610495578063849e25f4146104aa5780638da5cb5b146104dd576101cd565b806366f45ba6146103405780636c6a0f8a1461037b578063715018a6146103e257806376f7eb1e146103f7576101cd565b806333eeac10116101ab57806333eeac101461026e5780633ccfd60b146102cc578063551196d5146102e15780635de0398e14610314576101cd565b8063108d79fb146101cf5780631385d24c1461021e578063146b9f7014610233575b005b3480156101db57600080fd5b50610202600480360360208110156101f257600080fd5b50356001600160a01b03166107b2565b604080516001600160a01b039092168252519081900360200190f35b34801561022a57600080fd5b506101cd6107cd565b34801561023f57600080fd5b506101cd6004803603604081101561025657600080fd5b506001600160a01b0381358116916020013516610835565b34801561027a57600080fd5b506102b16004803603606081101561029157600080fd5b506001600160a01b038135811691602081013590911690604001356108aa565b60408051921515835260208301919091528051918290030190f35b3480156102d857600080fd5b506101cd610989565b3480156102ed57600080fd5b506101cd6004803603602081101561030457600080fd5b50356001600160a01b0316610a2b565b34801561032057600080fd5b50610329610b81565b6040805161ffff9092168252519081900360200190f35b34801561034c57600080fd5b506101cd6004803603604081101561036357600080fd5b506001600160a01b0381358116916020013516610b92565b34801561038757600080fd5b506103d0600480360360c081101561039e57600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135916080820135169060a00135610c07565b60408051918252519081900360200190f35b3480156103ee57600080fd5b506101cd6113a4565b34801561040357600080fd5b506104306004803603604081101561041a57600080fd5b506001600160a01b03813516906020013561143a565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046c578181015183820152602001610454565b505050509050019250505060405180910390f35b34801561048c57600080fd5b506102026115aa565b3480156104a157600080fd5b506101cd6115b9565b3480156104b657600080fd5b506101cd600480360360208110156104cd57600080fd5b50356001600160a01b031661171f565b3480156104e957600080fd5b50610202611788565b3480156104fe57600080fd5b5061050761179c565b604080519115158252519081900360200190f35b34801561052757600080fd5b506101cd6117c5565b34801561053c57600080fd5b506104306004803603604081101561055357600080fd5b506001600160a01b038135169060200135611b69565b34801561057557600080fd5b506101cd611c50565b34801561058a57600080fd5b50610202600480360360208110156105a157600080fd5b50356001600160a01b0316611e3d565b3480156105bd57600080fd5b506101cd600480360360408110156105d457600080fd5b506001600160a01b0381358116916020013516611e58565b3480156105f857600080fd5b506101cd6004803603602081101561060f57600080fd5b503561ffff16611ecd565b34801561062657600080fd5b506103d06004803603606081101561063d57600080fd5b506001600160a01b03813581169160208101359160409091013516611f90565b34801561066957600080fd5b506103d06004803603608081101561068057600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612644565b3480156106b257600080fd5b506102026129b9565b3480156106c757600080fd5b50610202600480360360208110156106de57600080fd5b50356001600160a01b03166129c8565b3480156106fa57600080fd5b506101cd6004803603608081101561071157600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356129e3565b34801561074357600080fd5b506101cd6004803603602081101561075a57600080fd5b50356001600160a01b0316613100565b34801561077657600080fd5b506101cd613169565b34801561078b57600080fd5b506101cd600480360360208110156107a257600080fd5b50356001600160a01b0316613349565b6004602052600090815260409020546001600160a01b031681565b6107d561179c565b610814576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b61083d61179c565b61087c576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b60008060606108b98585611b69565b905060606108c7868661143a565b90506000806108d6898561339c565b9150915081156108ef5760019550935061098192505050565b6108f9898461339c565b909250905081156109135760019550935061098192505050565b6001600160a01b0388167393054188d876f558f4a66b2ef1d97d16edf0895b148061095a57506001600160a01b038816737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b1561097057506001945084935061098192505050565b506000945084935061098192505050565b935093915050565b61099161179c565b6109d0576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b303160006109ed6109df611788565b6001600160a01b0316613414565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610a26573d6000803e3d6000fd5b505050565b610a3361179c565b610a72576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d6020811015610ae657600080fd5b505190506001600160a01b03821663a9059cbb610b01611788565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610b5157600080fd5b505af1158015610b65573d6000803e3d6000fd5b505050506040513d6020811015610b7b57600080fd5b50505050565b600054600160b01b900461ffff1681565b610b9a61179c565b610bd9576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b60008054600160a81b900460ff1615610c5c576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03861673fcba3e75865d2d561be8d220616520c171f128511480610ca357506001600160a01b03861673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80610cca57506001600160a01b03861673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80610cf157506001600160a01b03861673a50ccc70b6a011cffddf45057e39679379187287145b80610d1857506001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b145b80610d3f57506001600160a01b038616737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b610d90576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b60008054610db690610dae908790600160b01b900461ffff16613417565b612710613470565b6001600160a01b0380891660009081526003602090815260408083205460015482516323b872dd60e01b81523360048201529086166024820152604481018790529151959650909316936323b872dd93606480820194918390030190829087803b158015610e2357600080fd5b505af1158015610e37573d6000803e3d6000fd5b505050506040513d6020811015610e4d57600080fd5b5051610ea0576040805162461bcd60e51b815260206004820152601b60248201527f4572726f72207472616e7366657272696e6720676f6f6477696c6c0000000000604482015290519081900360640190fd5b6001600160a01b03808816600090815260036020526040902054166323b872dd3330610ecc89866134b2565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d6020811015610f5e57600080fd5b5051610faa576040805162461bcd60e51b815260206004820152601660248201527522b93937b9103a3930b739b332b93934b7339021a92b60511b604482015290519081900360640190fd5b600080610fb8868a8a6108aa565b9150915081801561100b57506001600160a01b0389167393054188d876f558f4a66b2ef1d97d16edf0895b148061100b57506001600160a01b038916737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b1561109c5760006110268a836110218b886134b2565b6134f4565b905060008111611074576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b61109487732260fac5e5542a773aa44fbcfedf7c193bc2c5998d84613852565b94505061134d565b81156111825760006110b38a836110218b886134b2565b905060008111611101576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b611094878b6001600160a01b031663b739953e856040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561114f57600080fd5b505afa158015611163573d6000803e3d6000fd5b505050506040513d602081101561117957600080fd5b50518d84613852565b60006111a560026111998a8763ffffffff6134b216565b9063ffffffff61347016565b905060006111b58b6000846134f4565b905060008111611203576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b60408051635b9cca9f60e11b8152600060048201529051611283918a916001600160a01b038f169163b739953e916024808301926020929190829003018186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d602081101561127a57600080fd5b50518e84613852565b95506112ab8b60016110218561129f8e8b63ffffffff6134b216565b9063ffffffff6134b216565b9050600081116112f9576040805162461bcd60e51b8152602060048201526014602482015273139bc81b1a5c5d5a591a5d1e481c995b5bdd995960621b604482015290519081900360640190fd5b60408051635b9cca9f60e11b8152600160048201529051611346918a916001600160a01b038f169163b739953e916024808301926020929190829003018186803b15801561125057600080fd5b8601955050505b84841015611397576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b5050509695505050505050565b6113ac61179c565b6113eb576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b60606001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b148061148357506001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156114ba57816040519080825280602002602001820160405280156114b2578160200160208202803883390190505b5090506115a4565b6060826040519080825280602002602001820160405280156114e6578160200160208202803883390190505b50905060005b838110156115a0576000856001600160a01b031663b739953e836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50518351909150819084908490811061157f57fe5b6001600160a01b0390921660209283029190910190910152506001016114ec565b5090505b92915050565b6002546001600160a01b031681565b6115c161179c565b611600576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60046020527f9fa92590da772b8c7fb9b5c455f569c1e3b3f19b63b83984b0ad8152649d53c480546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f179091557f47336cdcec23a27b85486918d6039b4af5f1421830ccd0a370172929a3ba591d8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481790557ffdcc55c9209b72836c1663792b9373b7fc794df515e1786c2bf1ccb392cc986c8054821673dac17f958d2ee523a2206206994597c13d831ec717905573c11b1268c1a384e55c48c2391d8d480264a3a7f46000527f95643f1b9a362cfa919fcd7641b664d3c6babcbcdd02d9be89fb7619d0513d918054909116732260fac5e5542a773aa44fbcfedf7c193bc2c599179055565b61172761179c565b611766576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b03166117b66138b4565b6001600160a01b031614905090565b6040805163095ea7b360e01b815273fcba3e75865d2d561be8d220616520c171f1285160048201526000196024820152905173c25a3a3b969415c80451098fa907ec722572917f9163095ea7b39160448083019260209291908290030181600087803b15801561183457600080fd5b505af1158015611848573d6000803e3d6000fd5b505050506040513d602081101561185e57600080fd5b50506040805163095ea7b360e01b815273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360048201526000196024820152905173df5e0e81dff6faf3a7e52ba697820c5e32d806a89163095ea7b39160448083019260209291908290030181600087803b1580156118cf57600080fd5b505af11580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50506040805163095ea7b360e01b815273b6c057591e073249f2d9d88ba59a46cfc9b59edb600482015260001960248201529051733b3ac5386837dc563660fb6a0937dfaa5924333b9163095ea7b39160448083019260209291908290030181600087803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b505050506040513d602081101561199457600080fd5b50506040805163095ea7b360e01b815273a50ccc70b6a011cffddf45057e3967937918728760048201526000196024820152905173d905e2eaebe188fc92179b6350807d8bd91db0d89163095ea7b39160448083019260209291908290030181600087803b158015611a0557600080fd5b505af1158015611a19573d6000803e3d6000fd5b505050506040513d6020811015611a2f57600080fd5b50506040805163095ea7b360e01b81527393054188d876f558f4a66b2ef1d97d16edf0895b6004820152600019602482015290517349849c98ae39fff122806c06791fa73784fb36759163095ea7b39160448083019260209291908290030181600087803b158015611aa057600080fd5b505af1158015611ab4573d6000803e3d6000fd5b505050506040513d6020811015611aca57600080fd5b50506040805163095ea7b360e01b8152737fc77b5c7614e1533320ea6ddc2eb61fa00a971460048201526000196024820152905173075b1bb99792c9e1041ba13afef80c91a1e70fb39163095ea7b39160448083019260209291908290030181600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b5050565b60608082604051908082528060200260200182016040528015611b96578160200160208202803883390190505b50905060005b838110156115a0576000856001600160a01b03166323746eb8836040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d6020811015611c1a57600080fd5b505183519091508190849084908110611c2f57fe5b6001600160a01b039092166020928302919091019091015250600101611b9c565b611c5861179c565b611c97576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60056020527fcd0c56b339b8c11f28550296fb02c601c0f0d2b0a871a232e7ede8f60930fe2080546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f9081179092557fc9dd26e10c6aa3f2d3c2d260c6883303719298610be0c765b3d1ed02cc678ebe8054821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489081179091557f25ef11bc9a17a2aaf6527ca0724babca28f15494b22af766e38359d1de9232de8054831673dac17f958d2ee523a2206206994597c13d831ec79081179091557f043aac9e3157b2b225737e481b907496d765f1618d45daa2575dfd9cb59a8fa580548416734fabb145d64652a948d72533023f6e7a623c7c531790557f89df9f238397ef183f1ca50f637969787c661d5f71f32cdc40feac933131774e805484169094179093557f0ea70601683ce558af2e75662d595f86f3aeabd5b34baf4537bc4b4a840bf518805483169091179055731be5d71f2da660bfdee8012ddc58d024448a0a596000527f29310642ac503b600420594813b025fb2b9f7ec1ee94e7bec0cf614d88ea411680549091169091179055565b6003602052600090815260409020546001600160a01b031681565b611e6061179c565b611e9f576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260036020526040902080546001600160a01b03191691909216179055565b611ed561179c565b611f14576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b6127108161ffff1610611f6e576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60006001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156120685773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561201157600080fd5b505af1158015612025573d6000803e3d6000fd5b50506040516001600160a01b038516925085156108fc02915085906000818181858888f1935050505015801561205f573d6000803e3d6000fd5b5082905061263d565b6001600160a01b038416732260fac5e5542a773aa44fbcfedf7c193bc2c59914156122fd576040805163095ea7b360e01b815273294de1cde8b04bf6d25f98f1d547052f8080a1776004820152602481018590529051732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b39160448083019260209291908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505060408051638201aa3f60e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c59960048201526024810185905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604482015260006064820181905260001960848301528251909273294de1cde8b04bf6d25f98f1d547052f8080a17792638201aa3f9260a4808301939282900301818787803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506040513d60408110156121e757600080fd5b505160408051632e1a7d4d60e01b815260048101839052905191925073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9160248082019260009290919082900301818387803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b5050604051600092506001600160a01b038616915083908381818185875af1925050503d80600081146122a3576040519150601f19603f3d011682016040523d82523d6000602084013e6122a8565b606091505b50509050806122f5576040805162461bcd60e51b815260206004820152601460248201527322aa24102a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b50905061263d565b60008061230a86866138b8565b6040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905290519294509092506001600160a01b0383169163095ea7b3916044808201926020929091908290030181600087803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b5050604080516002808252606080830184529260208301908038833901905050905086816000815181106123ce57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061241057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166318cbafe5856001858a42603c016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156124d75781810151838201526020016124bf565b505050509050019650505050505050600060405180830381600087803b15801561250057600080fd5b505af1158015612514573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561253d57600080fd5b810190808051604051939291908464010000000082111561255d57600080fd5b90830190602082018581111561257257600080fd5b825186602082028301116401000000008211171561258f57600080fd5b82525081516020918201928201910280838360005b838110156125bc5781810151838201526020016125a4565b505050509050016040525050506001835103815181106125d857fe5b6020026020010151905060008111612637576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204574683a20310000000000000000604482015290519081900360640190fd5b93505050505b9392505050565b600080600061265387856138b8565b6040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810184905290519294509092506001600160a01b0383169163095ea7b3916044808201926020929091908290030181600087803b1580156126bd57600080fd5b505af11580156126d1573d6000803e3d6000fd5b505050506040513d60208110156126e757600080fd5b505060408051600380825260808201909252606091602082018380388339019050509050878160008151811061271957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061275b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061278957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed1739846001848b42603c016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561284e578181015183820152602001612836565b505050509050019650505050505050600060405180830381600087803b15801561287757600080fd5b505af115801561288b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128b457600080fd5b81019080805160405193929190846401000000008211156128d457600080fd5b9083019060208201858111156128e957600080fd5b825186602082028301116401000000008211171561290657600080fd5b82525081516020918201928201910280838360005b8381101561293357818101518382015260200161291b565b5050505090500160405250505060018251038151811061294f57fe5b60200260200101519350600084116129ae576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b505050949350505050565b6001546001600160a01b031681565b6005602052600090815260409020546001600160a01b031681565b600054600160a81b900460ff1615612a37576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03831673fcba3e75865d2d561be8d220616520c171f128511480612a7e57506001600160a01b03831673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80612aa557506001600160a01b03831673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80612acc57506001600160a01b03831673a50ccc70b6a011cffddf45057e39679379187287145b80612af357506001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b145b80612b1a57506001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b612b6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b60008054612b8990610dae908590600160b01b900461ffff16613417565b6001600160a01b0380861660009081526003602090815260408083205460015482516323b872dd60e01b81523360048201529086166024820152604481018790529151959650909316936323b872dd93606480820194918390030190829087803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b505050506040513d6020811015612c2057600080fd5b5051612c73576040805162461bcd60e51b815260206004820152601b60248201527f4572726f72207472616e7366657272696e6720676f6f6477696c6c0000000000604482015290519081900360640190fd5b6001600160a01b03808516600090815260036020526040902054166323b872dd3330612c9f87866134b2565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015612d0757600080fd5b505af1158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b5051612d7d576040805162461bcd60e51b815260206004820152601660248201527522b93937b9103a3930b739b332b93934b7339021a92b60511b604482015290519081900360640190fd5b6000612d8984836134b2565b11612dc4576040805162461bcd60e51b815260206004808301919091526024820152634865726560e01b604482015290519081900360640190fd5b60606001600160a01b0385167393054188d876f558f4a66b2ef1d97d16edf0895b1480612e0d57506001600160a01b038516737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b15612e2357612e1c8584611b69565b9050612e30565b612e2d858461143a565b90505b8260041415612ef657846001600160a01b0316637d49d875612e5286856134b2565b604051806080016040528060008152602001600081526020016000815260200160008152506040518363ffffffff1660e01b81526004018083815260200182600460200280838360005b83811015612eb4578181015183820152602001612e9c565b5050505090500192505050600060405180830381600087803b158015612ed957600080fd5b505af1158015612eed573d6000803e3d6000fd5b50505050613026565b8260031415612f7257846001600160a01b031663ecb586a5612f1886856134b2565b6040518060600160405280600081526020016000815260200160008152506040518363ffffffff1660e01b815260040180838152602001826003602002808383600083811015612eb4578181015183820152602001612e9c565b826002141561302657846001600160a01b0316635b36389c612f9486856134b2565b60405180604001604052806000815260200160008152506040518363ffffffff1660e01b81526004018083815260200182600260200280838360005b83811015612fe8578181015183820152602001612fd0565b5050505090500192505050600060405180830381600087803b15801561300d57600080fd5b505af1158015613021573d6000803e3d6000fd5b505050505b60005b838110156130f757600082828151811061303f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561309c57600080fd5b505afa1580156130b0573d6000803e3d6000fd5b505050506040513d60208110156130c657600080fd5b5051905080156130ee576130ee8383815181106130df57fe5b60200260200101518983613ad5565b50600101613029565b50505050505050565b61310861179c565b613147576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61317161179c565b6131b0576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b60036020527f53391dedc3e81cef5e47e9093ef30d8238b4742df60b43c1c4aa3210cb31d23780546001600160a01b031990811673c25a3a3b969415c80451098fa907ec722572917f179091557fe383329dac8fc0739fd275ada4335c51b16c805d31097a1c2d46ecf4d64727be8054821673df5e0e81dff6faf3a7e52ba697820c5e32d806a81790557f7028020495fd0447d46caa182b14ce543fdf83cd9e6a49827a6ad7f45fd602cf80548216733b3ac5386837dc563660fb6a0937dfaa5924333b1790557f10c914fdad9b470b488d148ced5983be0348f39150f4e2ee9cd61071580716618054821673d905e2eaebe188fc92179b6350807d8bd91db0d81790557f6b952f6a36563f2ba577572e1f977783269346465b32a3eaaf6833e2a8ea9ae9805482167349849c98ae39fff122806c06791fa73784fb3675179055737fc77b5c7614e1533320ea6ddc2eb61fa00a97146000527f3d8122bacbd44602332daa2535661007f9ba01b86e4f0a84b8d5578ac34eb7ab805490911673075b1bb99792c9e1041ba13afef80c91a1e70fb3179055565b61335161179c565b613390576040805162461bcd60e51b81526020600482018190526024820152600080516020613f07833981519152604482015290519081900360640190fd5b61339981613b27565b50565b6000806001600160a01b0384166133b85750600090508061340d565b60005b8351811015613404578381815181106133d057fe5b60200260200101516001600160a01b0316856001600160a01b031614156133fc5760019250905061340d565b6001016133bb565b50600091508190505b9250929050565b90565b600082613426575060006115a4565b8282028284828161343357fe5b041461263d5760405162461bcd60e51b8152600401808060200182810382526021815260200180613ee66021913960400191505060405180910390fd5b600061263d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bd2565b600061263d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c74565b60006001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b148061353d57506001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b156136a45760408051630d2680e960e11b815260048101849052600f85810b900b602482015260006044820181905291516001600160a01b03871692631a4d01d2926064808201939182900301818387803b15801561359b57600080fd5b505af11580156135af573d6000803e3d6000fd5b50505050836001600160a01b03166323746eb8846040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b1580156135fd57600080fd5b505afa158015613611573d6000803e3d6000fd5b505050506040513d602081101561362757600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561367157600080fd5b505afa158015613685573d6000803e3d6000fd5b505050506040513d602081101561369b57600080fd5b50519050613809565b6040805163517a55a360e01b815260048101849052600f85810b900b60248201526000604482018190526064820181905291516001600160a01b0387169263517a55a3926084808201939182900301818387803b15801561370457600080fd5b505af1158015613718573d6000803e3d6000fd5b50505050836001600160a01b031663b739953e846040518263ffffffff1660e01b81526004018082600f0b600f0b815260200191505060206040518083038186803b15801561376657600080fd5b505afa15801561377a573d6000803e3d6000fd5b505050506040513d602081101561379057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156137da57600080fd5b505afa1580156137ee573d6000803e3d6000fd5b505050506040513d602081101561380457600080fd5b505190505b6000811161263d576040805162461bcd60e51b8152602060048201526011602482015270139bc81d1bdad95b881c9958d95a5d9959607a1b604482015290519081900360640190fd5b6000836001600160a01b0316856001600160a01b0316141561388057613879848484613ad5565b50806138ac565b6001600160a01b0385166138a057613899848385611f90565b90506138ac565b61389984848785612644565b949350505050565b3390565b6001600160a01b038281166000908152600460205260408120549091829116156139b757836001600160a01b031663db006a75846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561392257600080fd5b505af1158015613936573d6000803e3d6000fd5b505050506040513d602081101561394c57600080fd5b505115613996576040805162461bcd60e51b81526020600482015260136024820152724572726f7220696e20756e7772617070696e6760681b604482015290519081900360640190fd5b506001600160a01b0380841660009081526004602052604090205416613a5a565b6001600160a01b038481166000908152600560205260409020541615613a5757836001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613a1d57600080fd5b505af1158015613a31573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260056020526040902054169050613a5a565b50825b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613aa057600080fd5b505afa158015613ab4573d6000803e3d6000fd5b505050506040513d6020811015613aca57600080fd5b505194909350915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a26908490613cce565b6001600160a01b038116613b6c5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ec06026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008183613c5e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c23578181015183820152602001613c0b565b50505050905090810190601f168015613c505780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c6a57fe5b0495945050505050565b60008184841115613cc65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c23578181015183820152602001613c0b565b505050900390565b613ce0826001600160a01b0316613e86565b613d31576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613d6f5780518252601f199092019160209182019101613d50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613dd1576040519150601f19603f3d011682016040523d82523d6000602084013e613dd6565b606091505b509150915081613e2d576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610b7b57808060200190516020811015613e4957600080fd5b5051610b7b5760405162461bcd60e51b815260040180806020018281038252602a815260200180613f27602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906138ac57505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820095887631bc0e070aa1fee69b74f7285c934955f88cdd9fb52593e2497edee2e64736f6c634300050c0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f
-----Decoded View---------------
Arg [0] : _goodwill (uint16): 0
Arg [1] : _dzgoodwillAddress (address): 0xE737b6AfEC2320f616297e59445b60a11e3eF75F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f
Deployed Bytecode Sourcemap
29311:24041:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33085:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33085:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33085:41:0;-1:-1:-1;;;;;33085:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;33085:41:0;;;;;;;;;;;;;;52960:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52960:86:0;;;:::i;35902:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35902:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35902:155:0;;;;;;;;;;:::i;45510:1019::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45510:1019:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45510:1019:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;53116:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53116:195:0;;;:::i;52733:187::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52733:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52733:187:0;-1:-1:-1;;;;;52733:187:0;;:::i;29512:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29512:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36065:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36065:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36065:155:0;;;;;;;;;;:::i;39485:4088::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39485:4088:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39485:4088:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8976:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8976:140:0;;;:::i;46916:658::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46916:658:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46916:658:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46916:658:0;;;;;;;;;;;;;;;;;30552:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30552:101:0;;;:::i;34278:498::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34278:498:0;;;:::i;52557:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52557:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52557:168:0;-1:-1:-1;;;;;52557:168:0;;:::i;8165:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8165:79:0;;;:::i;8531:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8531:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;33473:797;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33473:797:0;;;:::i;47582:444::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47582:444:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;47582:444:0;;;;;;;;:::i;34784:390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34784:390:0;;;:::i;33029:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33029:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33029:49:0;-1:-1:-1;;;;;33029:49:0;;:::i;35711:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35711:183:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35711:183:0;;;;;;;;;;:::i;52311:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52311:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52311:238:0;;;;:::i;48034:2031::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48034:2031:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;48034:2031:0;;;;;;;;;;;;;;;;;:::i;50447:1058::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50447:1058:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;50447:1058:0;;;;;;;;;;;;;;;;;;;;;;:::i;29541:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29541:32:0;;;:::i;33133:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33133:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33133:41:0;-1:-1:-1;;;;;33133:41:0;;:::i;36587:2890::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36587:2890:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36587:2890:0;;;;;;;;;;;;;;;;;;;;;;:::i;36228:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36228:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36228:164:0;-1:-1:-1;;;;;36228:164:0;;:::i;35182:521::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35182:521:0;;;:::i;9271:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9271:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9271:109:0;-1:-1:-1;;;;;9271:109:0;;:::i;33085:41::-;;;;;;;;;;;;-1:-1:-1;;;;;33085:41:0;;:::o;52960:86::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;53031:7;;;-1:-1:-1;;;;53020:18:0;;-1:-1:-1;;;53031:7:0;;;;;;53030:8;53020:18;;;;;;52960:86::o;35902:155::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36015:15:0;;;;;;;:6;:15;;;;;:34;;-1:-1:-1;;;;;;36015:34:0;;;;;;;;35902:155::o;45510:1019::-;45673:4;45679:7;45699:22;45724:44;45733:21;45756:11;45724:8;:44::i;:::-;45699:69;;45779:32;45814:91;45847:21;45883:11;45814:18;:91::i;:::-;45779:126;;45955:17;45974:13;45991:31;45999:15;46016:5;45991:7;:31::i;:::-;45954:68;;;;46037:12;46033:38;;;46059:4;;-1:-1:-1;46065:5:0;-1:-1:-1;46051:20:0;;-1:-1:-1;;;46051:20:0;46033:38;46157:41;46165:15;46182;46157:7;:41::i;:::-;46133:65;;-1:-1:-1;46133:65:0;-1:-1:-1;46209:38:0;;;;46235:4;;-1:-1:-1;46241:5:0;-1:-1:-1;46227:20:0;;-1:-1:-1;;;46227:20:0;46209:38;-1:-1:-1;;;;;46278:48:0;;32110:42;46278:48;;:114;;-1:-1:-1;;;;;;46343:49:0;;32238:42;46343:49;46278:114;46260:261;;;-1:-1:-1;46478:4:0;;-1:-1:-1;46478:4:0;;-1:-1:-1;46470:16:0;;-1:-1:-1;;;46470:16:0;46260:261;-1:-1:-1;46512:5:0;;-1:-1:-1;46512:5:0;;-1:-1:-1;46504:17:0;;-1:-1:-1;;;46504:17:0;45510:1019;;;;;;;:::o;53116:195::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;53198:4;53190:21;53164:23;53244:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;53244:17:0;;:19::i;:::-;53274:29;;53222:41;;-1:-1:-1;;;;;;53274:12:0;;;:29;;;;;53287:15;;53274:29;;;;53287:15;53274:12;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53274:29:0;8434:1;;53116:195::o;52733:187::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;52827:38;;;-1:-1:-1;;;52827:38:0;;52859:4;52827:38;;;;;;52813:11;;-1:-1:-1;;;;;52827:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;52827:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52827:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52827:38:0;;-1:-1:-1;;;;;;52876:22:0;;;52899:7;:5;:7::i;:::-;52908:3;52876:36;;;;;;;;;;;;;-1:-1:-1;;;;;52876:36:0;-1:-1:-1;;;;;52876:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52876:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52876:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;52733:187:0:o;29512:22::-;;;-1:-1:-1;;;29512:22:0;;;;;:::o;36065:155::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36178:15:0;;;;;;;:6;:15;;;;;:34;;-1:-1:-1;;;;;;36178:34:0;;;;;;;;36065:155::o;39485:4088::-;39747:22;36474:7;;-1:-1:-1;;;36474:7:0;;;;36470:102;;;36498:28;;;-1:-1:-1;;;36498:28:0;;;;;;;;;;;;-1:-1:-1;;;36498:28:0;;;;;;;;;;;;;;36470:102;-1:-1:-1;;;;;39804:49:0;;30852:42;39804:49;;:116;;-1:-1:-1;;;;;;39874:46:0;;31102:42;39874:46;39804:116;:186;;;-1:-1:-1;;;;;;39941:49:0;;31352:42;39941:49;39804:186;:255;;;-1:-1:-1;;;;;;40011:48:0;;31604:42;40011:48;39804:255;:324;;;-1:-1:-1;;;;;;40080:48:0;;32110:42;40080:48;39804:324;:394;;;-1:-1:-1;;;;;;40149:49:0;;32238:42;40149:49;39804:394;39782:470;;;;;-1:-1:-1;;;39782:470:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40265:23;40345:8;;40291:94;;40318:36;;40331:12;;-1:-1:-1;;;40345:8:0;;;;40318:12;:36::i;:::-;40369:5;40291:12;:94::i;:::-;-1:-1:-1;;;;;40427:37:0;;;;;;;:14;:37;;;;;;;;;;40526:17;40420:172;;-1:-1:-1;;;40420:172:0;;40497:10;40420:172;;;;40526:17;;;40420:172;;;;;;;;;;;;40265:120;;-1:-1:-1;40427:37:0;;;;40420:58;;:172;;;;;;;;;;;;;40427:37;40420:172;;;5:2:-1;;;;30:1;27;20:12;5:2;40420:172:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40420:172:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40420:172:0;40398:249;;;;;-1:-1:-1;;;40398:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40689:37:0;;;;;;;:14;:37;;;;;;;40682:58;40759:10;40796:4;40820:43;40833:12;40847:15;40820:12;:43::i;:::-;40682:196;;;;;;;;;;;;;-1:-1:-1;;;;;40682:196:0;-1:-1:-1;;;;;40682:196:0;;;;;;-1:-1:-1;;;;;40682:196:0;-1:-1:-1;;;;;40682:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40682:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40682:196:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40682:196:0;40660:268;;;;;-1:-1:-1;;;40660:268:0;;;;;;;;;;;;-1:-1:-1;;;40660:268:0;;;;;;;;;;;;;;;40942:9;40953;40966:124;41002:15;41032:21;41068:11;40966:21;:124::i;:::-;40941:149;;;;41121:4;:141;;;;-1:-1:-1;;;;;;41143:48:0;;32110:42;41143:48;;:118;;-1:-1:-1;;;;;;41212:49:0;;32238:42;41212:49;41143:118;41103:2389;;;41289:19;41311:147;41340:21;41380:1;41400:43;41413:12;41427:15;41400:12;:43::i;:::-;41311:10;:147::i;:::-;41289:169;;41495:1;41481:11;:15;41473:48;;;;;-1:-1:-1;;;41473:48:0;;;;;;;;;;;;-1:-1:-1;;;41473:48:0;;;;;;;;;;;;;;;41553:152;41577:15;30143:42;41646:14;41679:11;41553:5;:152::i;:::-;41536:169;;41103:2389;;;;41727:4;41723:1769;;;41748:19;41770:147;41799:21;41839:1;41859:43;41872:12;41886:15;41859:12;:43::i;41770:147::-;41748:169;;41954:1;41940:11;:15;41932:48;;;;;-1:-1:-1;;;41932:48:0;;;;;;;;;;;;-1:-1:-1;;;41932:48:0;;;;;;;;;;;;;;;42063:241;42087:15;42136:21;-1:-1:-1;;;;;42121:54:0;;42205:1;42121:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42121:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42121:105:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42121:105:0;42245:14;42278:11;42063:5;:241::i;41723:1769::-;42378:12;42393:42;42433:1;42394:33;:12;42411:15;42394:33;:16;:33;:::i;:::-;42393:39;:42;:39;:42;:::i;:::-;42378:57;;42450:19;42472:108;42501:21;42541:1;42561:4;42472:10;:108::i;:::-;42450:130;;42617:1;42603:11;:15;42595:48;;;;;-1:-1:-1;;;42595:48:0;;;;;;;;;;;;-1:-1:-1;;;42595:48:0;;;;;;;;;;;;;;;42757:105;;;-1:-1:-1;;;42757:105:0;;42841:1;42757:105;;;;;;42699:241;;42723:15;;-1:-1:-1;;;;;42757:54:0;;;;;:105;;;;;;;;;;;;;;:54;:105;;;5:2:-1;;;;30:1;27;20:12;5:2;42757:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42757:105:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42757:105:0;42881:14;42914:11;42699:5;:241::i;:::-;42682:258;-1:-1:-1;42969:149:0;42998:21;43038:1;43058:45;43098:4;43059:33;:12;43076:15;43059:33;:16;:33;:::i;:::-;43058:39;:45;:39;:45;:::i;42969:149::-;42955:163;;43155:1;43141:11;:15;43133:48;;;;;-1:-1:-1;;;43133:48:0;;;;;;;;;;;;-1:-1:-1;;;43133:48:0;;;;;;;;;;;;;;;43297:105;;;-1:-1:-1;;;43297:105:0;;43381:1;43297:105;;;;;;43239:241;;43263:15;;-1:-1:-1;;;;;43297:54:0;;;;;:105;;;;;;;;;;;;;;:54;:105;;;5:2:-1;;;;30:1;27;20:12;43239:241:0;43221:259;;;;41723:1769;;;43530:12;43512:14;:30;;43504:61;;;;;-1:-1:-1;;;43504:61:0;;;;;;;;;;;;-1:-1:-1;;;43504:61:0;;;;;;;;;;;;;;;36559:1;;;39485:4088;;;;;;;;:::o;8976:140::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;9075:1;9059:6;;9038:40;;9059:6;;;;-1:-1:-1;;;;;9059:6:0;;9038:40;;9075:1;;9038:40;9106:1;9089:19;;-1:-1:-1;;;;;;9089:19:0;;;8976:140::o;46916:658::-;47042:16;-1:-1:-1;;;;;47089:48:0;;32110:42;47089:48;;:114;;-1:-1:-1;;;;;;47154:49:0;;32238:42;47154:49;47089:114;47071:204;;;47251:11;47237:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47237:26:0;;47230:33;;;;47071:204;47285:22;47324:11;47310:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47310:26:0;-1:-1:-1;47285:51:0;-1:-1:-1;47352:9:0;47347:197;47371:11;47367:1;:15;47347:197;;;47404:12;47434:21;-1:-1:-1;;;;;47419:72:0;;47499:1;47419:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47419:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47419:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47419:83:0;47517:8;;47419:83;;-1:-1:-1;47419:83:0;;47517:5;;47523:1;;47517:8;;;;;;-1:-1:-1;;;;;47517:15:0;;;:8;;;;;;;;;;;:15;-1:-1:-1;47384:3:0;;47347:197;;;-1:-1:-1;47561:5:0;-1:-1:-1;46916:658:0;;;;;:::o;30552:101::-;;;-1:-1:-1;;;;;30552:101:0;;:::o;34278:498::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;34328:6;:83;;;:101;;-1:-1:-1;;;;;;34328:101:0;;;30260:42;34328:101;;;;34440:83;:102;;;;30378:42;34440:102;;;34553:83;:102;;;;30496:42;34553:102;;;34695:42;34328:83;34666;;:102;;;;;30143:42;34666:102;;;34278:498::o;52557:168::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;52675:17;:42;;-1:-1:-1;;;;;;52675:42:0;-1:-1:-1;;;;;52675:42:0;;;;;;;;;;52557:168::o;8165:79::-;8203:7;8230:6;;;;-1:-1:-1;;;;;8230:6:0;;8165:79::o;8531:94::-;8571:4;8611:6;;;;;-1:-1:-1;;;;;8611:6:0;8595:12;:10;:12::i;:::-;-1:-1:-1;;;;;8595:22:0;;8588:29;;8531:94;:::o;33473:797::-;33515:117;;;-1:-1:-1;;;33515:117:0;;30852:42;33515:117;;;;-1:-1:-1;;33515:117:0;;;;;;30979:42;;33515:41;;:117;;;;;;;;;;;;;;-1:-1:-1;30979:42:0;33515:117;;;5:2:-1;;;;30:1;27;20:12;5:2;33515:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33515:117:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;33643:111:0;;;-1:-1:-1;;;33643:111:0;;31102:42;33643:111;;;;-1:-1:-1;;33643:111:0;;;;;;31226:42;;33643:38;;:111;;;;;33515:117;;33643:111;;;;;;;-1:-1:-1;31226:42:0;33643:111;;;5:2:-1;;;;30:1;27;20:12;5:2;33643:111:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33643:111:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;33765:117:0;;;-1:-1:-1;;;33765:117:0;;31352:42;33765:117;;;;-1:-1:-1;;33765:117:0;;;;;;31479:42;;33765:41;;:117;;;;;33643:111;;33765:117;;;;;;;-1:-1:-1;31479:42:0;33765:117;;;5:2:-1;;;;30:1;27;20:12;5:2;33765:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33765:117:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;33893:115:0;;;-1:-1:-1;;;33893:115:0;;31604:42;33893:115;;;;-1:-1:-1;;33893:115:0;;;;;;31730:42;;33893:40;;:115;;;;;33765:117;;33893:115;;;;;;;-1:-1:-1;31730:42:0;33893:115;;;5:2:-1;;;;30:1;27;20:12;5:2;33893:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33893:115:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;34019:115:0;;;-1:-1:-1;;;34019:115:0;;32110:42;34019:115;;;;-1:-1:-1;;34019:115:0;;;;;;31856:42;;34019:40;;:115;;;;;33893;;34019;;;;;;;-1:-1:-1;31856:42:0;34019:115;;;5:2:-1;;;;30:1;27;20:12;5:2;34019:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34019:115:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;34145:117:0;;;-1:-1:-1;;;34145:117:0;;32238:42;34145:117;;;;-1:-1:-1;;34145:117:0;;;;;;31983:42;;34145:41;;:117;;;;;34019:115;;34145:117;;;;;;;-1:-1:-1;31983:42:0;34145:117;;;5:2:-1;;;;30:1;27;20:12;5:2;34145:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34145:117:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;33473:797:0:o;47582:444::-;47700:16;47734:22;47773:11;47759:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47759:26:0;-1:-1:-1;47734:51:0;-1:-1:-1;47801:9:0;47796:200;47820:11;47816:1;:15;47796:200;;;47853:12;47883:21;-1:-1:-1;;;;;47868:43:0;;47937:1;47868:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47868:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47868:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47868:86:0;47969:8;;47868:86;;-1:-1:-1;47868:86:0;;47969:5;;47975:1;;47969:8;;;;;;-1:-1:-1;;;;;47969:15:0;;;:8;;;;;;;;;;;:15;-1:-1:-1;47833:3:0;;47796:200;;34784:390;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;34854:6;:12;;;:30;;-1:-1:-1;;;;;;34854:30:0;;;30260:42;34854:30;;;;;;34895:13;:32;;;;30378:42;34895:32;;;;;;34938:13;:32;;;;30496:42;34938:32;;;;;;34981:13;:32;;;;30724:42;34981:32;;;35047:13;:31;;;;;;;;;;35089:14;:33;;;;;;;;;32977:42;34854:12;35133:14;;:33;;;;;;;;;;34784:390::o;33029:49::-;;;;;;;;;;;;-1:-1:-1;;;;;33029:49:0;;:::o;35711:183::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35835:32:0;;;;;;;:14;:32;;;;;:51;;-1:-1:-1;;;;;;35835:51:0;;;;;;;;35711:183::o;52311:238::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;52447:5;52431:13;:21;;;52387:119;;;;;-1:-1:-1;;;52387:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52517:8;:24;;;;;;-1:-1:-1;;;52517:24:0;-1:-1:-1;;;;52517:24:0;;;;;;;;;52311:238::o;48034:2031::-;48193:7;-1:-1:-1;;;;;48217:45:0;;30025:42;48217:45;48213:210;;;30025:42;-1:-1:-1;;;;;48279:32:0;;48312:12;48279:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48279:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;48340:37:0;;-1:-1:-1;;;;;48340:23:0;;;-1:-1:-1;48340:37:0;;;;;-1:-1:-1;48364:12:0;;48340:37;;;;48364:12;48340:23;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48340:37:0;48399:12;48392:19;;;;48213:210;-1:-1:-1;;;;;48436:45:0;;30143:42;48436:45;48433:805;;;48498:117;;;-1:-1:-1;;;48498:117:0;;29637:42;48498:117;;;;;;;;;;;;30143:42;;48498:32;;:117;;;;;;;;;;;;;;-1:-1:-1;30143:42:0;48498:117;;;5:2:-1;;;;30:1;27;20:12;5:2;48498:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48498:117:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;48655:336:0;;;-1:-1:-1;;;48655:336:0;;30143:42;48655:336;;;;;;;;;;30025:42;48655:336;;;;48631:18;48655:336;;;;;;-1:-1:-1;;48655:336:0;;;;;;48631:18;;29637:42;;48655:29;;:336;;;;;;;;;;;48631:18;29637:42;48655:336;;;5:2:-1;;;;30:1;27;20:12;5:2;48655:336:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48655:336:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48655:336:0;;49006:44;;-1:-1:-1;;;49006:44:0;;;;;;;;;;48655:336;;-1:-1:-1;30025:42:0;;49006:32;;:44;;;;;-1:-1:-1;;49006:44:0;;;;;;;;-1:-1:-1;30025:42:0;49006:44;;;5:2:-1;;;;30:1;27;20:12;5:2;49006:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;49084:41:0;;49066:12;;-1:-1:-1;;;;;;49084:19:0;;;-1:-1:-1;49110:10:0;;49066:12;49084:41;49066:12;49084:41;49110:10;49084:19;:41;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;49065:60:0;;;49148:7;49140:40;;;;;-1:-1:-1;;;49140:40:0;;;;;;;;;;;;-1:-1:-1;;;49140:40:0;;;;;;;;;;;;;;;-1:-1:-1;49216:10:0;-1:-1:-1;49209:17:0;;48433:805;49269:23;49294:17;49315:85;49337:25;49377:12;49315:7;:85::i;:::-;49413:103;;;-1:-1:-1;;;49413:103:0;;29905:42;49413:103;;;;;;;;;;;;49268:132;;-1:-1:-1;49268:132:0;;-1:-1:-1;;;;;;49413:25:0;;;;;:103;;;;;;;;;;;;;;;-1:-1:-1;49413:25:0;:103;;;5:2:-1;;;;30:1;27;20:12;5:2;49413:103:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49413:103:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;49553:16:0;;;49567:1;49553:16;;;49529:21;49553:16;;;;;49529:21;49553:16;;;;;105:10:-1;49553:16:0;88:34:-1;136:17;;-1:-1;49553:16:0;49529:40;;49590:25;49580:4;49585:1;49580:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;49580:35:0;;;-1:-1:-1;;;;;49580:35:0;;;;;30025:42;49626:4;49631:1;49626:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;49626:26:0;;;-1:-1:-1;;;;;49626:26:0;;;;;49663:17;29905:42;-1:-1:-1;;;;;49683:35:0;;49749:15;49795:1;49827:4;49862:14;49907:3;49913:2;49907:8;49683:259;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49683:259:0;-1:-1:-1;;;;;49683:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;49683:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49683:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49683:259:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;49683:259:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;49683:259:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;49683:259:0;;421:4:-1;412:14;;;;49683:259:0;;;;;412:14:-1;49683:259:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;49683:259:0;;;;;;;;;;;49957:1;49943:4;:11;:15;49683:276;;;;;;;;;;;;;;49663:296;;50000:1;49988:9;:13;49980:50;;;;;-1:-1:-1;;;49980:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50048:9;-1:-1:-1;;;;48034:2031:0;;;;;;:::o;50447:1058::-;50642:19;50693:23;50718:17;50739:85;50761:25;50801:12;50739:7;:85::i;:::-;50837:103;;;-1:-1:-1;;;50837:103:0;;29905:42;50837:103;;;;;;;;;;;;50692:132;;-1:-1:-1;50692:132:0;;-1:-1:-1;;;;;;50837:25:0;;;;;:103;;;;;;;;;;;;;;;-1:-1:-1;50837:25:0;:103;;;5:2:-1;;;;30:1;27;20:12;5:2;50837:103:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50837:103:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;50977:16:0;;;50991:1;50977:16;;;;;;;;;50953:21;;50977:16;;;50953:21;;105:10:-1;50977:16:0;88:34:-1;136:17;;-1:-1;50977:16:0;50953:40;;51014:25;51004:4;51009:1;51004:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;51004:35:0;;;-1:-1:-1;;;;;51004:35:0;;;;;30025:42;51050:4;51055:1;51050:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;51050:26:0;;;-1:-1:-1;;;;;51050:26:0;;;;;51097:23;51087:4;51092:1;51087:7;;;;;;;;;;;;;:33;-1:-1:-1;;;;;51087:33:0;;;-1:-1:-1;;;;;51087:33:0;;;;;29905:42;-1:-1:-1;;;;;51145:38:0;;51214:15;51260:1;51292:4;51327:14;51372:3;51378:2;51372:8;51145:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51145:262:0;-1:-1:-1;;;;;51145:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51145:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51145:262:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51145:262:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;51145:262:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;51145:262:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;51145:262:0;;421:4:-1;412:14;;;;51145:262:0;;;;;412:14:-1;51145:262:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51145:262:0;;;;;;;;;;;51422:1;51408:4;:11;:15;51145:279;;;;;;;;;;;;;;51131:293;;51467:1;51453:11;:15;51445:52;;;;;-1:-1:-1;;;51445:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50447:1058;;;;;;;;;:::o;29541:32::-;;;-1:-1:-1;;;;;29541:32:0;;:::o;33133:41::-;;;;;;;;;;;;-1:-1:-1;;;;;33133:41:0;;:::o;36587:2890::-;36474:7;;-1:-1:-1;;;36474:7:0;;;;36470:102;;;36498:28;;;-1:-1:-1;;;36498:28:0;;;;;;;;;;;;-1:-1:-1;;;36498:28:0;;;;;;;;;;;;;;36470:102;-1:-1:-1;;;;;36812:49:0;;30852:42;36812:49;;:116;;-1:-1:-1;;;;;;36882:46:0;;31102:42;36882:46;36812:116;:186;;;-1:-1:-1;;;;;;36949:49:0;;31352:42;36949:49;36812:186;:255;;;-1:-1:-1;;;;;;37019:48:0;;31604:42;37019:48;36812:255;:324;;;-1:-1:-1;;;;;;37088:48:0;;32110:42;37088:48;36812:324;:394;;;-1:-1:-1;;;;;;37157:49:0;;32238:42;37157:49;36812:394;36790:470;;;;;-1:-1:-1;;;36790:470:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37273:23;37353:8;;37299:94;;37326:36;;37339:12;;-1:-1:-1;;;37353:8:0;;;;37326:12;:36::i;37299:94::-;-1:-1:-1;;;;;37435:37:0;;;;;;;:14;:37;;;;;;;;;;37534:17;37428:172;;-1:-1:-1;;;37428:172:0;;37505:10;37428:172;;;;37534:17;;;37428:172;;;;;;;;;;;;37273:120;;-1:-1:-1;37435:37:0;;;;37428:58;;:172;;;;;;;;;;;;;37435:37;37428:172;;;5:2:-1;;;;30:1;27;20:12;5:2;37428:172:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37428:172:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37428:172:0;37406:249;;;;;-1:-1:-1;;;37406:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37697:37:0;;;;;;;:14;:37;;;;;;;37690:58;37767:10;37804:4;37828:43;37841:12;37855:15;37828:12;:43::i;:::-;37690:196;;;;;;;;;;;;;-1:-1:-1;;;;;37690:196:0;-1:-1:-1;;;;;37690:196:0;;;;;;-1:-1:-1;;;;;37690:196:0;-1:-1:-1;;;;;37690:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37690:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37690:196:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37690:196:0;37668:268;;;;;-1:-1:-1;;;37668:268:0;;;;;;;;;;;;-1:-1:-1;;;37668:268:0;;;;;;;;;;;;;;;38001:1;37955:43;37968:12;37982:15;37955:12;:43::i;:::-;:47;37947:64;;;;;-1:-1:-1;;;37947:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;37947:64:0;;;;;;;;;;;;;;;38022:22;-1:-1:-1;;;;;38074:48:0;;32110:42;38074:48;;:118;;-1:-1:-1;;;;;;38143:49:0;;32238:42;38143:49;38074:118;38055:324;;;38228:44;38237:21;38260:11;38228:8;:44::i;:::-;38220:52;;38055:324;;;38313:54;38332:21;38355:11;38313:18;:54::i;:::-;38305:62;;38055:324;38395:11;38410:1;38395:16;38391:673;;;38443:21;-1:-1:-1;;;;;38428:54:0;;38501:43;38514:12;38528:15;38501:12;:43::i;:::-;38428:171;;;;;;;;38572:1;38428:171;;;;38576:1;38428:171;;;;38579:1;38428:171;;;;38582:1;38428:171;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38428:171:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38428:171:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38428:171:0;;;;38391:673;;;38621:11;38636:1;38621:16;38617:447;;;38673:21;-1:-1:-1;;;;;38654:58:0;;38731:43;38744:12;38758:15;38731:12;:43::i;:::-;38654:172;;;;;;;;38802:1;38654:172;;;;38806:1;38654:172;;;;38809:1;38654:172;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;38617:447:0;38848:11;38863:1;38848:16;38844:220;;;38902:21;-1:-1:-1;;;;;38881:60:0;;38960:43;38973:12;38987:15;38960:12;:43::i;:::-;38881:171;;;;;;;;39031:1;38881:171;;;;39035:1;38881:171;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38881:171:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38881:171:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38881:171:0;;;;38844:220;39081:13;39076:394;39108:11;39100:5;:19;39076:394;;;39145:21;39176:5;39182;39176:12;;;;;;;;;;;;;;-1:-1:-1;;;;;39169:30:0;;39226:4;39169:77;;;;;;;;;;;;;-1:-1:-1;;;;;39169:77:0;-1:-1:-1;;;;;39169:77:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39169:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39169:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39169:77:0;;-1:-1:-1;39265:17:0;;39261:197;;39301:157;39353:5;39359;39353:12;;;;;;;;;;;;;;39389:14;39426:13;39301:22;:157::i;:::-;-1:-1:-1;39121:7:0;;39076:394;;;;36559:1;;36587:2890;;;;:::o;36228:164::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;36344:16;:40;;-1:-1:-1;;;;;;36344:40:0;-1:-1:-1;;;;;36344:40:0;;;;;;;;;;36228:164::o;35182:521::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;35242:14;:40;;;:68;;-1:-1:-1;;;;;;35242:68:0;;;30979:42;35242:68;;;;35321:37;:62;;;;31226:42;35321:62;;;35394:40;:68;;;;31479:42;35394:68;;;35473:39;:66;;;;31730:42;35473:66;;;35550:39;:66;;;;31856:42;35550:66;;;32238:42;35242:40;35627;;:68;;;;;31983:42;35627:68;;;35182:521::o;9271:109::-;8377:9;:7;:9::i;:::-;8369:54;;;;;-1:-1:-1;;;8369:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8369:54:0;;;;;;;;;;;;;;;9344:28;9363:8;9344:18;:28::i;:::-;9271:109;:::o;46537:371::-;46644:4;;-1:-1:-1;;;;;46679:20:0;;46675:43;;-1:-1:-1;46709:5:0;;-1:-1:-1;46709:5:0;46701:17;;46675:43;46734:9;46729:144;46753:5;:12;46749:1;:16;46729:144;;;46801:5;46807:1;46801:8;;;;;;;;;;;;;;-1:-1:-1;;;;;46791:18:0;:6;-1:-1:-1;;;;;46791:18:0;;46787:75;;;46838:4;;-1:-1:-1;46844:1:0;-1:-1:-1;46830:16:0;;46787:75;46767:3;;46729:144;;;-1:-1:-1;46891:5:0;;-1:-1:-1;46891:5:0;;-1:-1:-1;46537:371:0;;;;;;:::o;1612:127::-;1722:7;1612:127::o;14410:471::-;14468:7;14713:6;14709:47;;-1:-1:-1;14743:1:0;14736:8;;14709:47;14780:5;;;14784:1;14780;:5;:1;14804:5;;;;;:10;14796:56;;;;-1:-1:-1;;;14796:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15349:132;15407:7;15434:39;15438:1;15441;15434:39;;;;;;;;;;;;;;;;;:3;:39::i;13494:136::-;13552:7;13579:43;13583:1;13586;13579:43;;;;;;;;;;;;;;;;;:3;:43::i;43581:1221::-;43717:21;-1:-1:-1;;;;;43823:48:0;;32110:42;43823:48;;:114;;-1:-1:-1;;;;;;43888:49:0;;32238:42;43888:49;43823:114;43805:932;;;43964:160;;;-1:-1:-1;;;43964:160:0;;;;;;;;;;;;;;;;;;44108:1;43964:160;;;;;;;;-1:-1:-1;;;;;43964:66:0;;;;;:160;;;;;;;;;;;44108:1;43964:66;:160;;;5:2:-1;;;;30:1;27;20:12;5:2;43964:160:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43964:160:0;;;;44195:21;-1:-1:-1;;;;;44180:43:0;;44231:1;44180:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44180:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44180:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44180:54:0;44155:137;;;-1:-1:-1;;;44155:137:0;;44286:4;44155:137;;;;;;-1:-1:-1;;;;;44155:122:0;;;;;;:137;;;;;44180:54;;44155:137;;;;;;;;:122;:137;;;5:2:-1;;;;30:1;27;20:12;5:2;44155:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44155:137:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44155:137:0;;-1:-1:-1;43805:932:0;;;44325:181;;;-1:-1:-1;;;44325:181:0;;;;;;;;;;;;;;;;;;44466:1;44325:181;;;;;;;;;;;;;;-1:-1:-1;;;;;44325:63:0;;;;;:181;;;;;;;;;;;44466:1;44325:63;:181;;;5:2:-1;;;;30:1;27;20:12;5:2;44325:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44325:181:0;;;;44577:21;-1:-1:-1;;;;;44562:54:0;;44646:1;44562:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44562:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44562:105:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44562:105:0;44537:188;;;-1:-1:-1;;;44537:188:0;;44719:4;44537:188;;;;;;-1:-1:-1;;;;;44537:173:0;;;;;;:188;;;;;44562:105;;44537:188;;;;;;;;:173;:188;;;5:2:-1;;;;30:1;27;20:12;5:2;44537:188:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44537:188:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44537:188:0;;-1:-1:-1;43805:932:0;44771:1;44755:13;:17;44747:47;;;;;-1:-1:-1;;;44747:47:0;;;;;;;;;;;;-1:-1:-1;;;44747:47:0;;;;;;;;;;;;;;44810:692;44973:7;45009:10;-1:-1:-1;;;;;44997:22:0;:8;-1:-1:-1;;;;;44997:22:0;;44993:502;;;45036:67;45066:10;45079:14;45095:7;45036:22;:67::i;:::-;-1:-1:-1;45125:7:0;45118:14;;44993:502;-1:-1:-1;;;;;45154:22:0;;45150:345;;45217:47;45228:10;45240:7;45249:14;45217:10;:47::i;:::-;45193:71;;;;45150:345;45321:162;45356:10;45389:14;45426:8;45457:7;45321:12;:162::i;45150:345::-;44810:692;;;;;;:::o;6858:98::-;6938:10;6858:98;:::o;51513:790::-;-1:-1:-1;;;;;51685:33:0;;;51623:23;51685:33;;;:6;:33;;;;;;51623:23;;;;51685:33;:47;51681:546;;51782:25;-1:-1:-1;;;;;51775:40:0;;51816:12;51775:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51775:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51775:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51775:54:0;:59;51749:140;;;;;-1:-1:-1;;;51749:140:0;;;;;;;;;;;;-1:-1:-1;;;51749:140:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51914:33:0;;;;;;;:6;:33;;;;;;;51681:546;;;-1:-1:-1;;;;;51969:33:0;;;52014:1;51969:33;;;:6;:33;;;;;;;:47;51965:262;;52040:25;-1:-1:-1;;;;;52033:42:0;;52076:12;52033:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52033:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;52114:33:0;;;;;;;:6;:33;;;;;;;;-1:-1:-1;51965:262:0;;;-1:-1:-1;52190:25:0;51965:262;52255:40;;;-1:-1:-1;;;52255:40:0;;52289:4;52255:40;;;;;;-1:-1:-1;;;;;52255:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;52255:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52255:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52255:40:0;;51513:790;;-1:-1:-1;51513:790:0;-1:-1:-1;;51513:790:0:o;20231:247::-;20401:58;;;-1:-1:-1;;;;;20401:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20401:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20348:122:0;;20381:5;;20348:18;:122::i;9486:229::-;-1:-1:-1;;;;;9560:22:0;;9552:73;;;;-1:-1:-1;;;9552:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9662:6;;;9641:38;;-1:-1:-1;;;;;9641:38:0;;;;9662:6;;;;;;9641:38;;;9690:6;:17;;-1:-1:-1;;;;;9690:17:0;;;;;-1:-1:-1;;;;;;9690:17:0;;;;;;;;;9486:229::o;16011:345::-;16097:7;16199:12;16192:5;16184:28;;;;-1:-1:-1;;;16184:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16184:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16223:9;16239:1;16235;:5;;;;;;;16011:345;-1:-1:-1;;;;;16011:345:0:o;13967:192::-;14053:7;14089:12;14081:6;;;;14073:29;;;;-1:-1:-1;;;14073:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;14073:29:0;-1:-1:-1;;;14125:5:0;;;13967:192::o;22841:1176::-;23445:27;23453:5;-1:-1:-1;;;;;23445:25:0;;:27::i;:::-;23437:71;;;;;-1:-1:-1;;;23437:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23582:12;23596:23;23631:5;-1:-1:-1;;;;;23623:19:0;23643:4;23623:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23623:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23581:67:0;;;;23667:7;23659:52;;;;;-1:-1:-1;;;23659:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23728:17;;:21;23724:286;;23901:10;23890:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23890:30:0;23864:134;;;;-1:-1:-1;;;23864:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;776:619;836:4;1304:20;;1147:66;1344:23;;;;;;:42;;-1:-1:-1;;1371:15:0;;;1336:51;-1:-1:-1;;776:619:0:o
Swarm Source
bzzr://095887631bc0e070aa1fee69b74f7285c934955f88cdd9fb52593e2497edee2e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $632.3 | 0.00104967 | $0.663713 |
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.