More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 9464674 | 1897 days ago | 0.34685715 ETH | ||||
- | 9464580 | 1897 days ago | 0.3464661 ETH | ||||
- | 9458255 | 1898 days ago | 0.02323552 ETH | ||||
- | 9458255 | 1898 days ago | 0.01157821 ETH | ||||
- | 9458255 | 1898 days ago | 0.01165731 ETH | ||||
- | 9456098 | 1898 days ago | 0.11812958 ETH | ||||
- | 9456098 | 1898 days ago | 0.05893697 ETH | ||||
- | 9456098 | 1898 days ago | 0.05919265 ETH | ||||
- | 9455613 | 1898 days ago | 0.09433966 ETH | ||||
- | 9455613 | 1898 days ago | 0.04717916 ETH | ||||
- | 9455613 | 1898 days ago | 0.04716052 ETH | ||||
- | 9454473 | 1898 days ago | 1.52548027 ETH | ||||
- | 9454473 | 1898 days ago | 0.76167018 ETH | ||||
- | 9454473 | 1898 days ago | 0.76381016 ETH | ||||
- | 9451490 | 1899 days ago | 0.7326 ETH | ||||
- | 9451490 | 1899 days ago | 0.7474 ETH | ||||
- | 9451490 | 1899 days ago | 1.48 ETH | ||||
- | 9450456 | 1899 days ago | 0.05748282 ETH | ||||
- | 9450456 | 1899 days ago | 0.05864409 ETH | ||||
- | 9450456 | 1899 days ago | 0.11612692 ETH | ||||
- | 9449140 | 1899 days ago | 0.12375 ETH | ||||
- | 9449140 | 1899 days ago | 0.12625 ETH | ||||
- | 9449140 | 1899 days ago | 0.25 ETH | ||||
- | 9448620 | 1899 days ago | 0.48015 ETH | ||||
- | 9448620 | 1899 days ago | 0.48985 ETH |
Loading...
Loading
Contract Name:
UniSwap_ETH_CDAIZap
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-01-24 */ // File: @openzeppelin\upgrades\contracts\Initializable.sol pragma solidity >=0.4.24 <0.6.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. uint256 cs; assembly { cs := extcodesize(address) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\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: @openzeppelin\contracts-ethereum-package\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: contracts\UniSwap_ETH_cDAI.sol // Copyright (C) 2019, 2020 dipeshsukhani, nodarjonashi, toshsharma, suhailg // 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 /** * WARNING: This is an upgradable contract. Be careful not to disrupt * the existing storage layout when making upgrades to the contract. In particular, * existing fields should not be removed and should not have their types changed. * The order of field declarations must not be changed, and new fields must be added * below all existing declarations. * * The base contracts and the order in which they are declared must not be changed. * New fields must not be added to base contracts (unless the base contract has * reserved placeholder fields for this purpose). * * See https://docs.zeppelinos.org/docs/writing_contracts.html for more info. */ pragma solidity ^0.5.0; ///@author DeFiZap ///@notice this contract implements one click conversion from ETH to unipool liquidity tokens (cDAI) interface IuniswapFactory { function getExchange(address token) external view returns (address exchange); } interface IuniswapExchange { // Address of ERC20 token sold on this exchange function tokenAddress() external view returns (address token); // Address of Uniswap Factory function factoryAddress() external view returns (address factory); // Provide Liquidity function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256); function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256); // Get Prices 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); // Trade ETH to ERC20 function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256 eth_sold); function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); // Trade ERC20 to ETH function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256 eth_bought); function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256 eth_bought); function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256 tokens_sold); function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); // Trade ERC20 to ERC20 function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256 tokens_bought); 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 tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256 tokens_sold); function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_sold); // Trade ERC20 to Custom Pool function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256 tokens_sold); function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_sold); function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); function allowance(address _owner, address _spender) external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function totalSupply() external view returns (uint256); } interface Compound { function approve ( address spender, uint256 amount ) external returns ( bool ); function mint ( uint256 mintAmount ) external returns ( uint256 ); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint _value) external returns (bool success); } interface IOneSplitInterface { function getExpectedReturn( address fromToken, address toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) external view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ); function swap( address fromToken, address toToken, uint256 amount, uint256 minReturn, uint256[] calldata distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) external payable; function goodSwap( address fromToken, address toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) external payable; } contract UniSwap_ETH_CDAIZap is Initializable { using SafeMath for uint; // state variables // - THESE MUST ALWAYS STAY IN THE SAME LAYOUT bool private stopped; address payable public owner; IuniswapFactory public UniSwapFactoryAddress; IOneSplitInterface public OneSplitInterfaceAddress; IERC20 public NEWDAI_TOKEN_ADDRESS; Compound public COMPOUND_TOKEN_ADDRESS; address public DAI_TOKEN_ADDRESS; address public ETH_TOKEN_ADDRESS; address public ONESPLIT_ADDRESS; // events event ERC20TokenHoldingsOnConversionDaiChai(uint); event ERC20TokenHoldingsOnConversionEthDai(uint); event LiquidityTokens(uint); // circuit breaker modifiers modifier stopInEmergency {if (!stopped) _;} modifier onlyInEmergency {if (stopped) _;} modifier onlyOwner() { require(isOwner(), "you are not authorised to call this function"); _; } function initialize() initializer public { stopped = false; owner = msg.sender; UniSwapFactoryAddress = IuniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95); NEWDAI_TOKEN_ADDRESS = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); COMPOUND_TOKEN_ADDRESS = Compound(0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643); OneSplitInterfaceAddress = IOneSplitInterface(0xD010B65120E027419586216D25bF86C2c24FCC4a); ONESPLIT_ADDRESS = address(0xD010B65120E027419586216D25bF86C2c24FCC4a); DAI_TOKEN_ADDRESS = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); ETH_TOKEN_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); } function set_new_UniSwapFactoryAddress(address _new_UniSwapFactoryAddress) public onlyOwner { UniSwapFactoryAddress = IuniswapFactory(_new_UniSwapFactoryAddress); } function set_new_DAI_TOKEN_ADDRESS(address _new_DAI_TOKEN_ADDRESS) public onlyOwner { NEWDAI_TOKEN_ADDRESS = IERC20(_new_DAI_TOKEN_ADDRESS); DAI_TOKEN_ADDRESS = _new_DAI_TOKEN_ADDRESS; } function set_new_cDAI_TokenContractAddress(address _new_cDAI_TokenContractAddress) public onlyOwner { COMPOUND_TOKEN_ADDRESS = Compound(_new_cDAI_TokenContractAddress); } function set_OneSplitInterfaceAddress(address _new_OneSplitInterfaceAddress) public onlyOwner { OneSplitInterfaceAddress = IOneSplitInterface(_new_OneSplitInterfaceAddress); ONESPLIT_ADDRESS = _new_OneSplitInterfaceAddress; } function getExpectedReturn(uint256 eth) public view returns (uint256) { uint256 _minReturn = 0; (_minReturn, ) = OneSplitInterfaceAddress.getExpectedReturn(ETH_TOKEN_ADDRESS, DAI_TOKEN_ADDRESS, eth, 1, 0); return _minReturn; } function LetsInvest(address _towhomtoissue, uint256 _minReturn) public payable stopInEmergency returns (uint) { IERC20 ERC20TokenAddress = IERC20(address(COMPOUND_TOKEN_ADDRESS)); IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); // determining the portion of the incoming ETH to be converted to the ERC20 Token uint conversionPortion = SafeMath.div(SafeMath.mul(msg.value, 505), 1000); uint non_conversionPortion = SafeMath.sub(msg.value,conversionPortion); if (_minReturn == 0) { //(_minReturn, ) = OneSplitInterfaceAddress.getExpectedReturn(ETH_TOKEN_ADDRESS, DAI_TOKEN_ADDRESS, conversionPortion, 1, 0); // Default to 1 for now to save gas costs, run getExpectedReturn first as a call instead _minReturn = 1; } OneSplitInterfaceAddress.goodSwap.value(conversionPortion)(ETH_TOKEN_ADDRESS, DAI_TOKEN_ADDRESS, conversionPortion, _minReturn, 1, 0); uint tokenBalance = NEWDAI_TOKEN_ADDRESS.balanceOf(address(this)); require(tokenBalance > 0, "the conversion did not happen as planned"); // conversion of DAI to cDAI uint qty2approve = SafeMath.mul(tokenBalance, 3); require(NEWDAI_TOKEN_ADDRESS.approve(address(ERC20TokenAddress), qty2approve)); COMPOUND_TOKEN_ADDRESS.mint(tokenBalance); uint ERC20TokenHoldings = ERC20TokenAddress.balanceOf(address(this)); require (ERC20TokenHoldings > 0, "the conversion did not happen as planned"); emit ERC20TokenHoldingsOnConversionDaiChai(ERC20TokenHoldings); NEWDAI_TOKEN_ADDRESS.approve(address(ERC20TokenAddress), 0); ERC20TokenAddress.approve(address(UniSwapExchangeContractAddress),ERC20TokenHoldings); // adding Liquidity uint max_tokens_ans = getMaxTokens(address(UniSwapExchangeContractAddress), ERC20TokenAddress, non_conversionPortion); UniSwapExchangeContractAddress.addLiquidity.value(non_conversionPortion)(1,max_tokens_ans,SafeMath.add(now,1800)); ERC20TokenAddress.approve(address(UniSwapExchangeContractAddress),0); // transferring Liquidity uint LiquityTokenHoldings = UniSwapExchangeContractAddress.balanceOf(address(this)); emit LiquidityTokens(LiquityTokenHoldings); UniSwapExchangeContractAddress.transfer(_towhomtoissue, LiquityTokenHoldings); ERC20TokenHoldings = ERC20TokenAddress.balanceOf(address(this)); ERC20TokenAddress.transfer(_towhomtoissue, ERC20TokenHoldings); return LiquityTokenHoldings; } function getUniswapExchangeContractAddress() public view returns (address) { return address(IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS)))); } function Redeem(address payable _towhomtosend, uint256 _amount) public stopInEmergency returns (uint) { // Compound contract address IERC20 ERC20TokenAddress = IERC20(address(COMPOUND_TOKEN_ADDRESS)); // Compound uniswap exchange IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); uint256 balance = UniSwapExchangeContractAddress.balanceOf(msg.sender); require(balance >= _amount, "insufficient balance"); uint256 allowance = UniSwapExchangeContractAddress.allowance(msg.sender, address(this)); require(allowance >= _amount, "insufficient allowance"); // Send users uni-v1 to contract address (will fail if not approved) uint mybalance = UniSwapExchangeContractAddress.balanceOf(address(this)); bool result = UniSwapExchangeContractAddress.transferFrom(msg.sender, address(this), _amount); uint newbalance = UniSwapExchangeContractAddress.balanceOf(address(this)); require(result, "transfer of uni failed"); require(newbalance > mybalance, "insufficient uni balance"); // Get min_eth and min_token for removeLiquidity call //(, uint256 ownerSharesEth, uint256 ownerSharesToken) = getReturn(address(UniSwapExchangeContractAddress), ERC20TokenAddress, _amount); // Swap uni-v1 for eth and tokens (uint256 eth, uint256 tokens) = UniSwapExchangeContractAddress.removeLiquidity(_amount, uint(1), uint(1), SafeMath.add(now,1800)); // Approve onesplit to take the compound tokens ERC20TokenAddress.approve(ONESPLIT_ADDRESS, tokens); // Get the expected return in ETH (uint256 _minReturn, ) = OneSplitInterfaceAddress.getExpectedReturn(address(COMPOUND_TOKEN_ADDRESS), ETH_TOKEN_ADDRESS, tokens, 1, 0); // Swap for the expected ETH OneSplitInterfaceAddress.goodSwap.value(0)(address(COMPOUND_TOKEN_ADDRESS), ETH_TOKEN_ADDRESS, tokens, _minReturn, 1, 0); ERC20TokenAddress.approve(ONESPLIT_ADDRESS, 0); uint256 ethReturn = SafeMath.add(eth, _minReturn); (result, ) = _towhomtosend.call.value(ethReturn)(""); require(result, "transfer of ETH failed"); return ethReturn; } function getMaxTokens(address _UniSwapExchangeContractAddress, IERC20 _ERC20TokenAddress, uint _value) public view returns (uint) { uint contractBalance = _UniSwapExchangeContractAddress.balance; uint eth_reserve = SafeMath.sub(contractBalance, _value); uint token_reserve = _ERC20TokenAddress.balanceOf(_UniSwapExchangeContractAddress); uint token_amount = SafeMath.div(SafeMath.mul(_value,token_reserve),eth_reserve) + 1; return token_amount; } function getEthBalance(address _UniSwapExchangeContractAddress) public view returns (uint) { uint ethBalance = _UniSwapExchangeContractAddress.balance; return ethBalance; } function getTokenReserves(address _UniSwapExchangeContractAddress, IERC20 _ERC20TokenAddress) public view returns (uint) { uint token_reserve = _ERC20TokenAddress.balanceOf(_UniSwapExchangeContractAddress); return token_reserve; } function getTotalShares(address _UniSwapExchangeContractAddress) public view returns (uint) { uint totalShares = IuniswapExchange(_UniSwapExchangeContractAddress).totalSupply(); return totalShares; } function getReturn(address _UniSwapExchangeContractAddress, IERC20 _ERC20TokenAddress, uint _value) public view returns (uint, uint, uint) { // Token balance in uniswap contract uint token_reserve = _ERC20TokenAddress.balanceOf(_UniSwapExchangeContractAddress); // ETH balance in uniswap contract uint ethBalance = _UniSwapExchangeContractAddress.balance; // Get total pool shares uint totalShares = IuniswapExchange(_UniSwapExchangeContractAddress).totalSupply(); // Calculate owner share pool uint ownerSharesEth = SafeMath.div(SafeMath.mul(_value, ethBalance), totalShares); uint ownerSharesToken = SafeMath.div(SafeMath.mul(_value, token_reserve), totalShares); // Calculate eth value uint ethBought = IuniswapExchange(_UniSwapExchangeContractAddress).getTokenToEthInputPrice(ownerSharesToken); uint ethValue = SafeMath.add(ethBought, ownerSharesEth); return (ethValue, ownerSharesEth, ownerSharesToken); } function calcReturnETHFromShares(uint _value) public view returns (uint, uint, uint) { IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); IERC20 ERC20TokenAddress = IERC20(address(COMPOUND_TOKEN_ADDRESS)); return getReturn(address(UniSwapExchangeContractAddress), ERC20TokenAddress, _value); } function uniBalanceOf(address _owner) public view returns (uint) { IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); return UniSwapExchangeContractAddress.balanceOf(_owner); } function cBalanceOf(address _owner) public view returns (uint) { IERC20 ERC20TokenAddress = IERC20(address(COMPOUND_TOKEN_ADDRESS)); return ERC20TokenAddress.balanceOf(_owner); } function calcReturnSharesFromETH(uint _value) public view returns (uint) { IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); IERC20 ERC20TokenAddress = IERC20(address(COMPOUND_TOKEN_ADDRESS)); return getSharesReturn(address(UniSwapExchangeContractAddress), ERC20TokenAddress, _value); } function getTokenToEthOutputPrice(uint _tokens) public view returns (uint) { IuniswapExchange UniSwapExchangeContractAddress = IuniswapExchange(UniSwapFactoryAddress.getExchange(address(COMPOUND_TOKEN_ADDRESS))); return UniSwapExchangeContractAddress.getTokenToEthInputPrice(_tokens); } function getSharesReturn(address _UniSwapExchangeContractAddress, IERC20 _ERC20TokenAddress, uint _ethValue) public view returns (uint) { uint tokens_sold = IuniswapExchange(_UniSwapExchangeContractAddress).getTokenToEthOutputPrice(_ethValue); // Token balance in uniswap contract uint token_reserve = _ERC20TokenAddress.balanceOf(_UniSwapExchangeContractAddress); // Get total pool shares uint totalShares = IuniswapExchange(_UniSwapExchangeContractAddress).totalSupply(); uint shares = SafeMath.div(SafeMath.mul(tokens_sold, totalShares), token_reserve); return (shares); } // incase of half-way error function inCaseTokengetsStuck(IERC20 _TokenAddress) onlyOwner public { uint qty = _TokenAddress.balanceOf(address(this)); _TokenAddress.transfer(owner, qty); } // - fallback function let you / anyone send ETH to this wallet without the need to call any function function() external payable { } // - to Pause the contract function toggleContractActive() onlyOwner public { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() onlyOwner public{ owner.transfer(address(this).balance); } // - to kill the contract function destruct() public onlyOwner { selfdestruct(owner); } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == owner; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address payable newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address payable newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); owner = newOwner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"ERC20TokenHoldingsOnConversionDaiChai","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"ERC20TokenHoldingsOnConversionEthDai","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"LiquidityTokens","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"COMPOUND_TOKEN_ADDRESS","outputs":[{"internalType":"contract Compound","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_towhomtoissue","type":"address"},{"internalType":"uint256","name":"_minReturn","type":"uint256"}],"name":"LetsInvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"NEWDAI_TOKEN_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONESPLIT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OneSplitInterfaceAddress","outputs":[{"internalType":"contract IOneSplitInterface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_towhomtosend","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"UniSwapFactoryAddress","outputs":[{"internalType":"contract IuniswapFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"cBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"calcReturnETHFromShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"calcReturnSharesFromETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destruct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"}],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"eth","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"},{"internalType":"contract IERC20","name":"_ERC20TokenAddress","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"},{"internalType":"contract IERC20","name":"_ERC20TokenAddress","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"},{"internalType":"contract IERC20","name":"_ERC20TokenAddress","type":"address"},{"internalType":"uint256","name":"_ethValue","type":"uint256"}],"name":"getSharesReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"},{"internalType":"contract IERC20","name":"_ERC20TokenAddress","type":"address"}],"name":"getTokenReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"getTokenToEthOutputPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_UniSwapExchangeContractAddress","type":"address"}],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getUniswapExchangeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":false,"inputs":[],"name":"initialize","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 payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_OneSplitInterfaceAddress","type":"address"}],"name":"set_OneSplitInterfaceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_DAI_TOKEN_ADDRESS","type":"address"}],"name":"set_new_DAI_TOKEN_ADDRESS","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_UniSwapFactoryAddress","type":"address"}],"name":"set_new_UniSwapFactoryAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_cDAI_TokenContractAddress","type":"address"}],"name":"set_new_cDAI_TokenContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"uniBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614b4c806100206000396000f3fe6080604052600436106101f95760003560e01c8063525d509e1161010d578063a6bb5035116100a0578063d95b28bd1161006f578063d95b28bd14610b76578063e8c949c314610bfb578063ea181d1d14610c5d578063f20d863414610cb4578063f2fde38b14610d19576101f9565b8063a6bb5035146109e2578063ae4de7fa14610a31578063b135707914610a82578063b1adb19014610ae7576101f9565b80638129fc1c116100dc5780638129fc1c146108f65780638da5cb5b1461090d5780638f32d59b14610964578063965c0f2814610993576101f9565b8063525d509e146107a6578063551196d5146107fd578063588f08c41461084e57806380ad30081461089f576101f9565b80632640f62c116101905780632c8158dc1161015f5780632c8158dc1461062557806330139f7f1461067c5780633bd1db77146106d35780633ccfd60b1461072a5780634d2301cc14610741576101f9565b80632640f62c1461050357806328b228ab14610552578063299fbfab146105a95780632b68b9c61461060e576101f9565b80631878d1f1116101cc5780631878d1f1146103435780631e1401f81461039a5780631ec9becf14610437578063222838db14610494576101f9565b80630c25e0e0146101fb5780630d30e9291461024c578063125ceb8e1461029d5780631385d24c1461032c575b005b34801561020757600080fd5b5061024a6004803603602081101561021e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d6a565b005b34801561025857600080fd5b5061029b6004803603602081101561026f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4c565b005b3480156102a957600080fd5b50610316600480360360608110156102c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b34801561033857600080fd5b50610341611125565b005b34801561034f57600080fd5b506103586111ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103a657600080fd5b50610413600480360360608110156103bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d4565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561044357600080fd5b506104706004803603602081101561045a57600080fd5b810190808035906020019092919050505061141a565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156104a057600080fd5b506104ed600480360360408110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155f565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b5061053c6004803603602081101561052657600080fd5b8101908080359060200190929190505050612384565b6040518082815260200191505060405180910390f35b34801561055e57600080fd5b50610567612519565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b557600080fd5b506105f8600480360360208110156105cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061261c565b6040518082815260200191505060405180910390f35b34801561061a57600080fd5b506106236127dd565b005b34801561063157600080fd5b5061063a612875565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561068857600080fd5b5061069161289b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106df57600080fd5b506106e86128c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561073657600080fd5b5061073f6128e7565b005b34801561074d57600080fd5b506107906004803603602081101561076457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129c6565b6040518082815260200191505060405180910390f35b3480156107b257600080fd5b506107bb6129ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561080957600080fd5b5061084c6004803603602081101561082057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a12565b005b34801561085a57600080fd5b5061089d6004803603602081101561087157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c14565b005b3480156108ab57600080fd5b506108b4612cb5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090257600080fd5b5061090b612cdb565b005b34801561091957600080fd5b50610922613089565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561097057600080fd5b506109796130af565b604051808215151515815260200191505060405180910390f35b34801561099f57600080fd5b506109cc600480360360208110156109b657600080fd5b8101908080359060200190929190505050613107565b6040518082815260200191505060405180910390f35b3480156109ee57600080fd5b50610a1b60048036036020811015610a0557600080fd5b810190808035906020019092919050505061332c565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610a8060048036036020811015610a5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613468565b005b348015610a8e57600080fd5b50610ad160048036036020811015610aa557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613509565b6040518082815260200191505060405180910390f35b348015610af357600080fd5b50610b6060048036036060811015610b0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506135f1565b6040518082815260200191505060405180910390f35b348015610b8257600080fd5b50610be560048036036040811015610b9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613700565b6040518082815260200191505060405180910390f35b610c4760048036036040811015610c1157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137c7565b6040518082815260200191505060405180910390f35b348015610c6957600080fd5b50610c7261452d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc057600080fd5b50610d0360048036036020811015610cd757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614553565b6040518082815260200191505060405180910390f35b348015610d2557600080fd5b50610d6860048036036020811015610d3c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506145e2565b005b610d726130af565b610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e546130af565b610ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808473ffffffffffffffffffffffffffffffffffffffff16632640f62c846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f8257600080fd5b505afa158015610f96573d6000803e3d6000fd5b505050506040513d6020811015610fac57600080fd5b8101908080519060200190929190505050905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561103e57600080fd5b505afa158015611052573d6000803e3d6000fd5b505050506040513d602081101561106857600080fd5b8101908080519060200190929190505050905060008673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d60208110156110ed57600080fd5b81019080805190602001909291905050509050600061111561110f858461464b565b846146d1565b9050809450505050509392505050565b61112d6130af565b611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360009054906101000a900460ff1615603360006101000a81548160ff021916908315150217905550565b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808573ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561125757600080fd5b505afa15801561126b573d6000803e3d6000fd5b505050506040513d602081101561128157600080fd5b8101908080519060200190929190505050905060008773ffffffffffffffffffffffffffffffffffffffff1631905060008873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b81019080805190602001909291905050509050600061134a611344898561464b565b836146d1565b9050600061136161135b8a8761464b565b846146d1565b905060008b73ffffffffffffffffffffffffffffffffffffffff166395b68fe7836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d60208110156113e057600080fd5b8101908080519060200190929190505050905060006113ff828561471b565b90508084849950995099505050505050505093509350939050565b600080600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156114e157600080fd5b505afa1580156114f5573d6000803e3d6000fd5b505050506040513d602081101561150b57600080fd5b810190808051906020019092919050505090506000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115508282886111d4565b94509450945050509193909250565b6000603360009054906101000a900460ff1661237e576000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171b57600080fd5b505afa15801561172f573d6000803e3d6000fd5b505050506040513d602081101561174557600080fd5b81019080805190602001909291905050509050848110156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561188157600080fd5b505afa158015611895573d6000803e3d6000fd5b505050506040513d60208110156118ab57600080fd5b8101908080519060200190929190505050905085811015611934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f696e73756666696369656e7420616c6c6f77616e63650000000000000000000081525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119b357600080fd5b505afa1580156119c7573d6000803e3d6000fd5b505050506040513d60208110156119dd57600080fd5b8101908080519060200190929190505050905060008473ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611aad57600080fd5b505af1158015611ac1573d6000803e3d6000fd5b505050506040513d6020811015611ad757600080fd5b8101908080519060200190929190505050905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6957600080fd5b505afa158015611b7d573d6000803e3d6000fd5b505050506040513d6020811015611b9357600080fd5b8101908080519060200190929190505050905081611c19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7472616e73666572206f6620756e69206661696c65640000000000000000000081525060200191505060405180910390fd5b828111611c8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e73756666696369656e7420756e692062616c616e6365000000000000000081525060200191505060405180910390fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1663f88bf15a8c600180611cbd4261070861471b565b6040518563ffffffff1660e01b8152600401808581526020018481526020018381526020018281526020019450505050506040805180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d6040811015611d3157600080fd5b810190808051906020019092919080519060200190929190505050915091508873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b8101908080519060200190929190505050506000603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663085e2c5b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600160006040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060006040518083038186803b158015611f6857600080fd5b505afa158015611f7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015611fa657600080fd5b810190808051906020019092919080516040519392919084640100000000821115611fd057600080fd5b83820191506020820185811115611fe657600080fd5b825186602082028301116401000000008211171561200357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561203a57808201518184015260208101905061201f565b50505050905001604052505050509050603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636b9589aa6000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168686600160006040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200196505050505050506000604051808303818588803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b50505050508973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b505050506040513d602081101561227357600080fd5b8101908080519060200190929190505050506000612291848361471b565b90508d73ffffffffffffffffffffffffffffffffffffffff168160405180600001905060006040518083038185875af1925050503d80600081146122f1576040519150601f19603f3d011682016040523d82523d6000602084013e6122f6565b606091505b5050809650508561236f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7472616e73666572206f6620455448206661696c65640000000000000000000081525060200191505060405180910390fd5b809b5050505050505050505050505b92915050565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561244857600080fd5b505afa15801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166395b68fe7846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d602081101561250057600080fd5b8101908080519060200190929190505050915050919050565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125dc57600080fd5b505afa1580156125f0573d6000803e3d6000fd5b505050506040513d602081101561260657600080fd5b8101908080519060200190929190505050905090565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126e057600080fd5b505afa1580156126f4573d6000803e3d6000fd5b505050506040513d602081101561270a57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561279a57600080fd5b505afa1580156127ae573d6000803e3d6000fd5b505050506040513d60208110156127c457600080fd5b8101908080519060200190929190505050915050919050565b6127e56130af565b61283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128ef6130af565b612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156129c3573d6000803e3d6000fd5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1631905080915050919050565b603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612a1a6130af565b612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612aee57600080fd5b505afa158015612b02573d6000803e3d6000fd5b505050506040513d6020811015612b1857600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612bd457600080fd5b505af1158015612be8573d6000803e3d6000fd5b505050506040513d6020811015612bfe57600080fd5b8101908080519060200190929190505050505050565b612c1c6130af565b612c71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900460ff1680612cfa5750612cf96147a3565b5b80612d1157506000809054906101000a900460ff16155b612d66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614aea602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612db6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000603360006101000a81548160ff02191690831515021790555033603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c0a47dfe034b400b47bdad5fecda2621de6c4d95603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736b175474e89094c44da98b954eedeac495271d0f603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735d3a536e4d6dbd6114cc1ead35777bab948e3643603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d010b65120e027419586216d25bf86c2c24fcc4a603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d010b65120e027419586216d25bf86c2c24fcc4a603a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736b175474e89094c44da98b954eedeac495271d0f603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee603960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156130865760008060016101000a81548160ff0219169083151502179055505b50565b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60008060009050603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663085e2c5b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600160006040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060006040518083038186803b15801561323f57600080fd5b505afa158015613253573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250604081101561327d57600080fd5b8101908080519060200190929190805160405193929190846401000000008211156132a757600080fd5b838201915060208201858111156132bd57600080fd5b82518660208202830111640100000000821117156132da57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156133115780820151818401526020810190506132f6565b50505050905001604052505050508091505080915050919050565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133f057600080fd5b505afa158015613404573d6000803e3d6000fd5b505050506040513d602081101561341a57600080fd5b810190808051906020019092919050505090506000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061345f828286610f2e565b92505050919050565b6134706130af565b6134c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d60208110156135d857600080fd5b8101908080519060200190929190505050915050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff16319050600061361a82856147b4565b905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561369b57600080fd5b505afa1580156136af573d6000803e3d6000fd5b505050506040513d60208110156136c557600080fd5b81019080805190602001909291905050509050600060016136ef6136e9888561464b565b856146d1565b019050809450505050509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561378057600080fd5b505afa158015613794573d6000803e3d6000fd5b505050506040513d60208110156137aa57600080fd5b810190808051906020019092919050505090508091505092915050565b6000603360009054906101000a900460ff16614527576000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138c757600080fd5b505afa1580156138db573d6000803e3d6000fd5b505050506040513d60208110156138f157600080fd5b81019080805190602001909291905050509050600061391d613915346101f961464b565b6103e86146d1565b9050600061392b34836147b4565b9050600086141561393b57600195505b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636b9589aa83603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868b600160006040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200196505050505050506000604051808303818588803b158015613a7657600080fd5b505af1158015613a8a573d6000803e3d6000fd5b50505050506000603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b3057600080fd5b505afa158015613b44573d6000803e3d6000fd5b505050506040513d6020811015613b5a57600080fd5b8101908080519060200190929190505050905060008111613bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ac26028913960400191505060405180910390fd5b6000613bd382600361464b565b9050603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b387836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c7e57600080fd5b505af1158015613c92573d6000803e3d6000fd5b505050506040513d6020811015613ca857600080fd5b8101908080519060200190929190505050613cc257600080fd5b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613d3757600080fd5b505af1158015613d4b573d6000803e3d6000fd5b505050506040513d6020811015613d6157600080fd5b81019080805190602001909291905050505060008673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613df257600080fd5b505afa158015613e06573d6000803e3d6000fd5b505050506040513d6020811015613e1c57600080fd5b8101908080519060200190929190505050905060008111613e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ac26028913960400191505060405180910390fd5b7f609cec8b329c246fab8023c5080416eac37627fd87b831e229ad54919bb42edb816040518082815260200191505060405180910390a1603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b38860006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f6957600080fd5b505af1158015613f7d573d6000803e3d6000fd5b505050506040513d6020811015613f9357600080fd5b8101908080519060200190929190505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b387836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561402c57600080fd5b505af1158015614040573d6000803e3d6000fd5b505050506040513d602081101561405657600080fd5b81019080805190602001909291905050505060006140758789876135f1565b90508673ffffffffffffffffffffffffffffffffffffffff1663422f1043866001846140a34261070861471b565b6040518563ffffffff1660e01b81526004018084815260200183815260200182815260200193505050506020604051808303818588803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b50505050506040513d602081101561411157600080fd5b8101908080519060200190929190505050508773ffffffffffffffffffffffffffffffffffffffff1663095ea7b38860006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156141ab57600080fd5b505af11580156141bf573d6000803e3d6000fd5b505050506040513d60208110156141d557600080fd5b81019080805190602001909291905050505060008773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561426657600080fd5b505afa15801561427a573d6000803e3d6000fd5b505050506040513d602081101561429057600080fd5b810190808051906020019092919050505090507ff5c05964d6de51616cafa30b23fd7dde709b1dead4389f0e4dc6ae103ef97dff816040518082815260200191505060405180910390a18773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561436157600080fd5b505af1158015614375573d6000803e3d6000fd5b505050506040513d602081101561438b57600080fd5b8101908080519060200190929190505050508873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561441a57600080fd5b505afa15801561442e573d6000803e3d6000fd5b505050506040513d602081101561444457600080fd5b810190808051906020019092919050505092508873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156144de57600080fd5b505af11580156144f2573d6000803e3d6000fd5b505050506040513d602081101561450857600080fd5b8101908080519060200190929190505050508099505050505050505050505b92915050565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561459c57600080fd5b505afa1580156145b0573d6000803e3d6000fd5b505050506040513d60208110156145c657600080fd5b8101908080519060200190929190505050905080915050919050565b6145ea6130af565b61463f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b614648816147fe565b50565b60008083141561465e57600090506146cb565b600082840290508284828161466f57fe5b04146146c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614aa16021913960400191505060405180910390fd5b809150505b92915050565b600061471383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148c8565b905092915050565b600080828401905083811015614799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080303b90506000811491505090565b60006147f683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061498e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a4f6026913960400191505060405180910390fd5b80603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290614974576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561493957808201518184015260208101905061491e565b50505050905090810190601f1680156149665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161498057fe5b049050809150509392505050565b6000838311158290614a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a005780820151818401526020810190506149e5565b50505050905090810190601f168015614a2d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838503905080915050939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373796f7520617265206e6f7420617574686f726973656420746f2063616c6c20746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7774686520636f6e76657273696f6e20646964206e6f742068617070656e20617320706c616e6e6564436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a265627a7a723158204807599782e3ed3e35bd572f2f234f10fc35245b440333a95953f01db2ef18cd64736f6c634300050c0032
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063525d509e1161010d578063a6bb5035116100a0578063d95b28bd1161006f578063d95b28bd14610b76578063e8c949c314610bfb578063ea181d1d14610c5d578063f20d863414610cb4578063f2fde38b14610d19576101f9565b8063a6bb5035146109e2578063ae4de7fa14610a31578063b135707914610a82578063b1adb19014610ae7576101f9565b80638129fc1c116100dc5780638129fc1c146108f65780638da5cb5b1461090d5780638f32d59b14610964578063965c0f2814610993576101f9565b8063525d509e146107a6578063551196d5146107fd578063588f08c41461084e57806380ad30081461089f576101f9565b80632640f62c116101905780632c8158dc1161015f5780632c8158dc1461062557806330139f7f1461067c5780633bd1db77146106d35780633ccfd60b1461072a5780634d2301cc14610741576101f9565b80632640f62c1461050357806328b228ab14610552578063299fbfab146105a95780632b68b9c61461060e576101f9565b80631878d1f1116101cc5780631878d1f1146103435780631e1401f81461039a5780631ec9becf14610437578063222838db14610494576101f9565b80630c25e0e0146101fb5780630d30e9291461024c578063125ceb8e1461029d5780631385d24c1461032c575b005b34801561020757600080fd5b5061024a6004803603602081101561021e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d6a565b005b34801561025857600080fd5b5061029b6004803603602081101561026f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4c565b005b3480156102a957600080fd5b50610316600480360360608110156102c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f2e565b6040518082815260200191505060405180910390f35b34801561033857600080fd5b50610341611125565b005b34801561034f57600080fd5b506103586111ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103a657600080fd5b50610413600480360360608110156103bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d4565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561044357600080fd5b506104706004803603602081101561045a57600080fd5b810190808035906020019092919050505061141a565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156104a057600080fd5b506104ed600480360360408110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155f565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b5061053c6004803603602081101561052657600080fd5b8101908080359060200190929190505050612384565b6040518082815260200191505060405180910390f35b34801561055e57600080fd5b50610567612519565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b557600080fd5b506105f8600480360360208110156105cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061261c565b6040518082815260200191505060405180910390f35b34801561061a57600080fd5b506106236127dd565b005b34801561063157600080fd5b5061063a612875565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561068857600080fd5b5061069161289b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106df57600080fd5b506106e86128c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561073657600080fd5b5061073f6128e7565b005b34801561074d57600080fd5b506107906004803603602081101561076457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129c6565b6040518082815260200191505060405180910390f35b3480156107b257600080fd5b506107bb6129ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561080957600080fd5b5061084c6004803603602081101561082057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a12565b005b34801561085a57600080fd5b5061089d6004803603602081101561087157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c14565b005b3480156108ab57600080fd5b506108b4612cb5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090257600080fd5b5061090b612cdb565b005b34801561091957600080fd5b50610922613089565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561097057600080fd5b506109796130af565b604051808215151515815260200191505060405180910390f35b34801561099f57600080fd5b506109cc600480360360208110156109b657600080fd5b8101908080359060200190929190505050613107565b6040518082815260200191505060405180910390f35b3480156109ee57600080fd5b50610a1b60048036036020811015610a0557600080fd5b810190808035906020019092919050505061332c565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610a8060048036036020811015610a5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613468565b005b348015610a8e57600080fd5b50610ad160048036036020811015610aa557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613509565b6040518082815260200191505060405180910390f35b348015610af357600080fd5b50610b6060048036036060811015610b0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506135f1565b6040518082815260200191505060405180910390f35b348015610b8257600080fd5b50610be560048036036040811015610b9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613700565b6040518082815260200191505060405180910390f35b610c4760048036036040811015610c1157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137c7565b6040518082815260200191505060405180910390f35b348015610c6957600080fd5b50610c7261452d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc057600080fd5b50610d0360048036036020811015610cd757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614553565b6040518082815260200191505060405180910390f35b348015610d2557600080fd5b50610d6860048036036020811015610d3c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506145e2565b005b610d726130af565b610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e546130af565b610ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808473ffffffffffffffffffffffffffffffffffffffff16632640f62c846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f8257600080fd5b505afa158015610f96573d6000803e3d6000fd5b505050506040513d6020811015610fac57600080fd5b8101908080519060200190929190505050905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561103e57600080fd5b505afa158015611052573d6000803e3d6000fd5b505050506040513d602081101561106857600080fd5b8101908080519060200190929190505050905060008673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c357600080fd5b505afa1580156110d7573d6000803e3d6000fd5b505050506040513d60208110156110ed57600080fd5b81019080805190602001909291905050509050600061111561110f858461464b565b846146d1565b9050809450505050509392505050565b61112d6130af565b611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360009054906101000a900460ff1615603360006101000a81548160ff021916908315150217905550565b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808573ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561125757600080fd5b505afa15801561126b573d6000803e3d6000fd5b505050506040513d602081101561128157600080fd5b8101908080519060200190929190505050905060008773ffffffffffffffffffffffffffffffffffffffff1631905060008873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b81019080805190602001909291905050509050600061134a611344898561464b565b836146d1565b9050600061136161135b8a8761464b565b846146d1565b905060008b73ffffffffffffffffffffffffffffffffffffffff166395b68fe7836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d60208110156113e057600080fd5b8101908080519060200190929190505050905060006113ff828561471b565b90508084849950995099505050505050505093509350939050565b600080600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156114e157600080fd5b505afa1580156114f5573d6000803e3d6000fd5b505050506040513d602081101561150b57600080fd5b810190808051906020019092919050505090506000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115508282886111d4565b94509450945050509193909250565b6000603360009054906101000a900460ff1661237e576000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d602081101561168957600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171b57600080fd5b505afa15801561172f573d6000803e3d6000fd5b505050506040513d602081101561174557600080fd5b81019080805190602001909291905050509050848110156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561188157600080fd5b505afa158015611895573d6000803e3d6000fd5b505050506040513d60208110156118ab57600080fd5b8101908080519060200190929190505050905085811015611934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f696e73756666696369656e7420616c6c6f77616e63650000000000000000000081525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119b357600080fd5b505afa1580156119c7573d6000803e3d6000fd5b505050506040513d60208110156119dd57600080fd5b8101908080519060200190929190505050905060008473ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611aad57600080fd5b505af1158015611ac1573d6000803e3d6000fd5b505050506040513d6020811015611ad757600080fd5b8101908080519060200190929190505050905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6957600080fd5b505afa158015611b7d573d6000803e3d6000fd5b505050506040513d6020811015611b9357600080fd5b8101908080519060200190929190505050905081611c19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7472616e73666572206f6620756e69206661696c65640000000000000000000081525060200191505060405180910390fd5b828111611c8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e73756666696369656e7420756e692062616c616e6365000000000000000081525060200191505060405180910390fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1663f88bf15a8c600180611cbd4261070861471b565b6040518563ffffffff1660e01b8152600401808581526020018481526020018381526020018281526020019450505050506040805180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d6040811015611d3157600080fd5b810190808051906020019092919080519060200190929190505050915091508873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b8101908080519060200190929190505050506000603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663085e2c5b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600160006040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060006040518083038186803b158015611f6857600080fd5b505afa158015611f7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015611fa657600080fd5b810190808051906020019092919080516040519392919084640100000000821115611fd057600080fd5b83820191506020820185811115611fe657600080fd5b825186602082028301116401000000008211171561200357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561203a57808201518184015260208101905061201f565b50505050905001604052505050509050603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636b9589aa6000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168686600160006040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200196505050505050506000604051808303818588803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b50505050508973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b505050506040513d602081101561227357600080fd5b8101908080519060200190929190505050506000612291848361471b565b90508d73ffffffffffffffffffffffffffffffffffffffff168160405180600001905060006040518083038185875af1925050503d80600081146122f1576040519150601f19603f3d011682016040523d82523d6000602084013e6122f6565b606091505b5050809650508561236f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7472616e73666572206f6620455448206661696c65640000000000000000000081525060200191505060405180910390fd5b809b5050505050505050505050505b92915050565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561244857600080fd5b505afa15801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166395b68fe7846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d602081101561250057600080fd5b8101908080519060200190929190505050915050919050565b6000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156125dc57600080fd5b505afa1580156125f0573d6000803e3d6000fd5b505050506040513d602081101561260657600080fd5b8101908080519060200190929190505050905090565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126e057600080fd5b505afa1580156126f4573d6000803e3d6000fd5b505050506040513d602081101561270a57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561279a57600080fd5b505afa1580156127ae573d6000803e3d6000fd5b505050506040513d60208110156127c457600080fd5b8101908080519060200190929190505050915050919050565b6127e56130af565b61283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128ef6130af565b612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156129c3573d6000803e3d6000fd5b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1631905080915050919050565b603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612a1a6130af565b612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612aee57600080fd5b505afa158015612b02573d6000803e3d6000fd5b505050506040513d6020811015612b1857600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612bd457600080fd5b505af1158015612be8573d6000803e3d6000fd5b505050506040513d6020811015612bfe57600080fd5b8101908080519060200190929190505050505050565b612c1c6130af565b612c71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900460ff1680612cfa5750612cf96147a3565b5b80612d1157506000809054906101000a900460ff16155b612d66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614aea602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612db6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000603360006101000a81548160ff02191690831515021790555033603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c0a47dfe034b400b47bdad5fecda2621de6c4d95603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736b175474e89094c44da98b954eedeac495271d0f603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735d3a536e4d6dbd6114cc1ead35777bab948e3643603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d010b65120e027419586216d25bf86c2c24fcc4a603560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d010b65120e027419586216d25bf86c2c24fcc4a603a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736b175474e89094c44da98b954eedeac495271d0f603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee603960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156130865760008060016101000a81548160ff0219169083151502179055505b50565b603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60008060009050603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663085e2c5b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600160006040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060006040518083038186803b15801561323f57600080fd5b505afa158015613253573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250604081101561327d57600080fd5b8101908080519060200190929190805160405193929190846401000000008211156132a757600080fd5b838201915060208201858111156132bd57600080fd5b82518660208202830111640100000000821117156132da57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156133115780820151818401526020810190506132f6565b50505050905001604052505050508091505080915050919050565b600080603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133f057600080fd5b505afa158015613404573d6000803e3d6000fd5b505050506040513d602081101561341a57600080fd5b810190808051906020019092919050505090506000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061345f828286610f2e565b92505050919050565b6134706130af565b6134c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b80603460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d60208110156135d857600080fd5b8101908080519060200190929190505050915050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff16319050600061361a82856147b4565b905060008573ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561369b57600080fd5b505afa1580156136af573d6000803e3d6000fd5b505050506040513d60208110156136c557600080fd5b81019080805190602001909291905050509050600060016136ef6136e9888561464b565b856146d1565b019050809450505050509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561378057600080fd5b505afa158015613794573d6000803e3d6000fd5b505050506040513d60208110156137aa57600080fd5b810190808051906020019092919050505090508091505092915050565b6000603360009054906101000a900460ff16614527576000603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000603460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138c757600080fd5b505afa1580156138db573d6000803e3d6000fd5b505050506040513d60208110156138f157600080fd5b81019080805190602001909291905050509050600061391d613915346101f961464b565b6103e86146d1565b9050600061392b34836147b4565b9050600086141561393b57600195505b603560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636b9589aa83603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868b600160006040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200182815260200196505050505050506000604051808303818588803b158015613a7657600080fd5b505af1158015613a8a573d6000803e3d6000fd5b50505050506000603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613b3057600080fd5b505afa158015613b44573d6000803e3d6000fd5b505050506040513d6020811015613b5a57600080fd5b8101908080519060200190929190505050905060008111613bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ac26028913960400191505060405180910390fd5b6000613bd382600361464b565b9050603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b387836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c7e57600080fd5b505af1158015613c92573d6000803e3d6000fd5b505050506040513d6020811015613ca857600080fd5b8101908080519060200190929190505050613cc257600080fd5b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613d3757600080fd5b505af1158015613d4b573d6000803e3d6000fd5b505050506040513d6020811015613d6157600080fd5b81019080805190602001909291905050505060008673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613df257600080fd5b505afa158015613e06573d6000803e3d6000fd5b505050506040513d6020811015613e1c57600080fd5b8101908080519060200190929190505050905060008111613e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ac26028913960400191505060405180910390fd5b7f609cec8b329c246fab8023c5080416eac37627fd87b831e229ad54919bb42edb816040518082815260200191505060405180910390a1603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b38860006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f6957600080fd5b505af1158015613f7d573d6000803e3d6000fd5b505050506040513d6020811015613f9357600080fd5b8101908080519060200190929190505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b387836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561402c57600080fd5b505af1158015614040573d6000803e3d6000fd5b505050506040513d602081101561405657600080fd5b81019080805190602001909291905050505060006140758789876135f1565b90508673ffffffffffffffffffffffffffffffffffffffff1663422f1043866001846140a34261070861471b565b6040518563ffffffff1660e01b81526004018084815260200183815260200182815260200193505050506020604051808303818588803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b50505050506040513d602081101561411157600080fd5b8101908080519060200190929190505050508773ffffffffffffffffffffffffffffffffffffffff1663095ea7b38860006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156141ab57600080fd5b505af11580156141bf573d6000803e3d6000fd5b505050506040513d60208110156141d557600080fd5b81019080805190602001909291905050505060008773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561426657600080fd5b505afa15801561427a573d6000803e3d6000fd5b505050506040513d602081101561429057600080fd5b810190808051906020019092919050505090507ff5c05964d6de51616cafa30b23fd7dde709b1dead4389f0e4dc6ae103ef97dff816040518082815260200191505060405180910390a18773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561436157600080fd5b505af1158015614375573d6000803e3d6000fd5b505050506040513d602081101561438b57600080fd5b8101908080519060200190929190505050508873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561441a57600080fd5b505afa15801561442e573d6000803e3d6000fd5b505050506040513d602081101561444457600080fd5b810190808051906020019092919050505092508873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8d856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156144de57600080fd5b505af11580156144f2573d6000803e3d6000fd5b505050506040513d602081101561450857600080fd5b8101908080519060200190929190505050508099505050505050505050505b92915050565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561459c57600080fd5b505afa1580156145b0573d6000803e3d6000fd5b505050506040513d60208110156145c657600080fd5b8101908080519060200190929190505050905080915050919050565b6145ea6130af565b61463f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614a75602c913960400191505060405180910390fd5b614648816147fe565b50565b60008083141561465e57600090506146cb565b600082840290508284828161466f57fe5b04146146c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614aa16021913960400191505060405180910390fd5b809150505b92915050565b600061471383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148c8565b905092915050565b600080828401905083811015614799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080303b90506000811491505090565b60006147f683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061498e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a4f6026913960400191505060405180910390fd5b80603360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290614974576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561493957808201518184015260208101905061491e565b50505050905090810190601f1680156149665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161498057fe5b049050809150509392505050565b6000838311158290614a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a005780820151818401526020810190506149e5565b50505050905090810190601f168015614a2d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838503905080915050939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373796f7520617265206e6f7420617574686f726973656420746f2063616c6c20746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7774686520636f6e76657273696f6e20646964206e6f742068617070656e20617320706c616e6e6564436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a265627a7a723158204807599782e3ed3e35bd572f2f234f10fc35245b440333a95953f01db2ef18cd64736f6c634300050c0032
Deployed Bytecode Sourcemap
18030:14071:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20308:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20308:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20308:248:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;19899:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19899:209:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19899:209:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29931:649;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29931:649:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29931:649:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30996:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30996:86:0;;;:::i;:::-;;18486:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18486:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27233:1040;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27233:1040:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27233:1040:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28281:412;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28281:412:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28281:412:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23707:2330;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23707:2330:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23707:2330:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29618:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29618:305:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29618:305:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23507:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23507:192:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28701:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28701:284:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28701:284:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31279:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31279:75:0;;;:::i;:::-;;18304:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18304:50:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18402:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18402:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18525:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18525:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31150:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31150:92:0;;;:::i;:::-;;26549:191;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26549:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26549:191:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18253:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18253:44:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30621:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30621:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30621:182:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;20116:184;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20116:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20116:184:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18447:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18447:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18988:715;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18988:715:0;;;:::i;:::-;;18218:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18218:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31445:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31445:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20564:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20564:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20564:252:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29204:406;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29204:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29204:406:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19713:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19713:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19713:178:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;28993:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28993:201:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28993:201:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26045:496;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26045:496:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26045:496:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26748:249;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26748:249:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26748:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20824:2675;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20824:2675:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18361:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18361:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27007:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27007:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27007:218:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31691:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31691:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31691:117:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;20308:248;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20459:29;20413:24;;:76;;;;;;;;;;;;;;;;;;20519:29;20500:16;;:48;;;;;;;;;;;;;;;;;;20308:248;:::o;19899:209::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20024:22;19994:20;;:53;;;;;;;;;;;;;;;;;;20078:22;20058:17;;:42;;;;;;;;;;;;;;;;;;19899:209;:::o;29931:649::-;30061:4;30078:16;30114:31;30097:74;;;30172:9;30097:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30097:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30097:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30097:85:0;;;;;;;;;;;;;;;;30078:104;;30241:18;30262;:28;;;30291:31;30262:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30262:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30262:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30262:61:0;;;;;;;;;;;;;;;;30241:82;;30368:16;30404:31;30387:61;;;:63;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30387:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30387:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30387:63:0;;;;;;;;;;;;;;;;30368:82;;30463:11;30477:67;30490:38;30503:11;30516;30490:12;:38::i;:::-;30530:13;30477:12;:67::i;:::-;30463:81;;30565:6;30557:15;;;;;;29931:649;;;;;:::o;30996:86::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31067:7;;;;;;;;;;;31066:8;31056:7;;:18;;;;;;;;;;;;;;;;;;30996:86::o;18486:32::-;;;;;;;;;;;;;:::o;27233:1040::-;27354:4;27360;27366;27429:18;27450;:28;;;27479:31;27450:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27450:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27450:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27450:61:0;;;;;;;;;;;;;;;;27429:82;;27566:15;27584:31;:39;;;27566:57;;27670:16;27706:31;27689:61;;;:63;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27689:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27689:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27689:63:0;;;;;;;;;;;;;;;;27670:82;;27804:19;27826:59;27839:32;27852:6;27860:10;27839:12;:32::i;:::-;27873:11;27826:12;:59::i;:::-;27804:81;;27896:21;27920:62;27933:35;27946:6;27954:13;27933:12;:35::i;:::-;27970:11;27920:12;:62::i;:::-;27896:86;;28027:14;28061:31;28044:73;;;28118:16;28044:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28044:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28044:91:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28044:91:0;;;;;;;;;;;;;;;;28027:108;;28146:13;28162:39;28175:9;28186:14;28162:12;:39::i;:::-;28146:55;;28222:8;28232:14;28248:16;28214:51;;;;;;;;;;;;;27233:1040;;;;;;;:::o;28281:412::-;28348:4;28354;28360;28377:47;28444:21;;;;;;;;;;;:33;;;28486:22;;;;;;;;;;;28444:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28444:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28444:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28444:66:0;;;;;;;;;;;;;;;;28377:134;;28522:24;28564:22;;;;;;;;;;;28522:66;;28608:77;28626:30;28659:17;28678:6;28608:9;:77::i;:::-;28601:84;;;;;;;;28281:412;;;;;:::o;23707:2330::-;23803:4;18794:7;;;;;;;;;;;18789:15;;23858:24;23900:22;;;;;;;;;;;23858:66;;23975:47;24042:21;;;;;;;;;;;:33;;;24084:22;;;;;;;;;;;24042:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24042:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24042:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24042:66:0;;;;;;;;;;;;;;;;23975:134;;24122:15;24140:30;:40;;;24181:10;24140:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24140:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24140:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24140:52:0;;;;;;;;;;;;;;;;24122:70;;24222:7;24211;:18;;24203:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24265:17;24285:30;:40;;;24326:10;24346:4;24285:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24285:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24285:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24285:67:0;;;;;;;;;;;;;;;;24265:87;;24384:7;24371:9;:20;;24363:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24509:14;24526:30;:40;;;24575:4;24526:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24526:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24526:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24526:55:0;;;;;;;;;;;;;;;;24509:72;;24592:11;24606:30;:43;;;24650:10;24670:4;24677:7;24606:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24606:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24606:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24606:79:0;;;;;;;;;;;;;;;;24592:93;;24696:15;24714:30;:40;;;24763:4;24714:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24714:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24714:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24714:55:0;;;;;;;;;;;;;;;;24696:73;;24788:6;24780:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24853:9;24840:10;:22;24832:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25157:11;25170:14;25188:30;:46;;;25235:7;25249:1;25258;25262:22;25275:3;25279:4;25262:12;:22::i;:::-;25188:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25188:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25188:97:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25188:97:0;;;;;;;;;;;;;;;;;;;;;;;;;25156:129;;;;25355:17;:25;;;25381:16;;;;;;;;;;;25399:6;25355:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25355:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25355:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25355:51:0;;;;;;;;;;;;;;;;;25461:18;25485:24;;;;;;;;;;;:42;;;25536:22;;;;;;;;;;;25561:17;;;;;;;;;;;25580:6;25588:1;25591;25485:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25485:108:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25485:108:0;;;;;;39:16:-1;36:1;17:17;2:54;25485:108:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25485:108:0;;;;;;;;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;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;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;25485:108:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25485:108:0;;;;;;;;;;;25460:133;;;25642:24;;;;;;;;;;;:33;;;25682:1;25693:22;;;;;;;;;;;25718:17;;;;;;;;;;;25737:6;25745:10;25757:1;25760;25642:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25642:120:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25642:120:0;;;;;25777:17;:25;;;25803:16;;;;;;;;;;;25821:1;25777:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25777:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25777:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25777:46:0;;;;;;;;;;;;;;;;;25836:17;25856:29;25869:3;25874:10;25856:12;:29::i;:::-;25836:49;;25911:13;:18;;25936:9;25911:39;;;;;;;;;;;;;;;;;;;;;;;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;;25898:52:0;;;;;25969:6;25961:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26020:9;26013:16;;;;;;;;;;;;;18789:15;23707:2330;;;;:::o;29618:305::-;29687:4;29702:47;29769:21;;;;;;;;;;;:33;;;29811:22;;;;;;;;;;;29769:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29769:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29769:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29769:66:0;;;;;;;;;;;;;;;;29702:134;;29852:30;:54;;;29907:7;29852:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29852:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29852:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29852:63:0;;;;;;;;;;;;;;;;29845:70;;;29618:305;;;:::o;23507:192::-;23573:7;23623:21;;;;;;;;;;;:33;;;23665:22;;;;;;;;;;;23623:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23623:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23623:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23623:66:0;;;;;;;;;;;;;;;;23591:100;;23507:192;:::o;28701:284::-;28760:4;28777:47;28844:21;;;;;;;;;;;:33;;;28886:22;;;;;;;;;;;28844:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28844:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28844:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28844:66:0;;;;;;;;;;;;;;;;28777:134;;28929:30;:40;;;28970:6;28929:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28929:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28929:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28929:48:0;;;;;;;;;;;;;;;;28922:55;;;28701:284;;;:::o;31279:75::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31340:5;;;;;;;;;;;31327:19;;;18304:50;;;;;;;;;;;;;:::o;18402:38::-;;;;;;;;;;;;;:::o;18525:31::-;;;;;;;;;;;;;:::o;31150:92::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31197:5;;;;;;;;;;;:14;;:37;31220:4;31212:21;;;31197:37;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31197:37:0;31150:92::o;26549:191::-;26634:4;26649:15;26667:31;:39;;;26649:57;;26722:10;26715:17;;;26549:191;;;:::o;18253:44::-;;;;;;;;;;;;;:::o;30621:182::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30701:8;30712:13;:23;;;30744:4;30712:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30712:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30712:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30712:38:0;;;;;;;;;;;;;;;;30701:49;;30761:13;:22;;;30784:5;;;;;;;;;;;30791:3;30761:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30761:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30761:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30761:34:0;;;;;;;;;;;;;;;;;18969:1;30621:182;:::o;20116:184::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20261:30;20227:22;;:65;;;;;;;;;;;;;;;;;;20116:184;:::o;18447:32::-;;;;;;;;;;;;;:::o;18988:715::-;1118:12;;;;;;;;;;;:31;;;;1134:15;:13;:15::i;:::-;1118:31;:47;;;;1154:11;;;;;;;;;;;1153:12;1118:47;1110:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;;;;;;1247:13;1225:35;;1271:14;1267:83;;;1311:4;1296:12;;:19;;;;;;;;;;;;;;;;;;1338:4;1324:11;;:18;;;;;;;;;;;;;;;;;;1267:83;19050:5;19040:7;;:15;;;;;;;;;;;;;;;;;;19074:10;19066:5;;:18;;;;;;;;;;;;;;;;;;19135:42;19095:21;;:83;;;;;;;;;;;;;;;;;;19219:42;19189:20;;:73;;;;;;;;;;;;;;;;;;19307:42;19273:22;;:77;;;;;;;;;;;;;;;;;;19407:42;19361:24;;:89;;;;;;;;;;;;;;;;;;19488:42;19461:16;;:70;;;;;;;;;;;;;;;;;;19570:42;19542:17;;:71;;;;;;;;;;;;;;;;;;19652:42;19624:17;;:71;;;;;;;;;;;;;;;;;;1372:14;1368:57;;;1412:5;1397:12;;:20;;;;;;;;;;;;;;;;;;1368:57;18988:715;:::o;18218:28::-;;;;;;;;;;;;;:::o;31445:91::-;31485:4;31523:5;;;;;;;;;;;31509:19;;:10;:19;;;31502:26;;31445:91;:::o;20564:252::-;20625:7;20643:18;20664:1;20643:22;;20691:24;;;;;;;;;;;:42;;;20734:17;;;;;;;;;;;20753;;;;;;;;;;;20772:3;20777:1;20780;20691:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20691:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20691:91:0;;;;;;39:16:-1;36:1;17:17;2:54;20691:91:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20691:91:0;;;;;;;;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;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;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;20691:91:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20691:91:0;;;;;;;;;;;20674:108;;;;;20798:10;20791:17;;;20564:252;;;:::o;29204:406::-;29271:4;29288:47;29355:21;;;;;;;;;;;:33;;;29397:22;;;;;;;;;;;29355:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29355:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29355:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29355:66:0;;;;;;;;;;;;;;;;29288:134;;29433:24;29475:22;;;;;;;;;;;29433:66;;29519:83;29543:30;29576:17;29595:6;29519:15;:83::i;:::-;29512:90;;;;29204:406;;;:::o;19713:178::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19856:26;19816:21;;:67;;;;;;;;;;;;;;;;;;19713:178;:::o;28993:201::-;29050:4;29067:24;29109:22;;;;;;;;;;;29067:66;;29151:17;:27;;;29179:6;29151:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29151:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29151:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29151:35:0;;;;;;;;;;;;;;;;29144:42;;;28993:201;;;:::o;26045:496::-;26169:4;26186:20;26209:31;:39;;;26186:62;;26259:16;26278:37;26291:15;26308:6;26278:12;:37::i;:::-;26259:56;;26326:18;26347;:28;;;26376:31;26347:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26347:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26347:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26347:61:0;;;;;;;;;;;;;;;;26326:82;;26419:17;26502:1;26439:60;26452:34;26465:6;26472:13;26452:12;:34::i;:::-;26487:11;26439:12;:60::i;:::-;:64;26419:84;;26521:12;26514:19;;;;;;26045:496;;;;;:::o;26748:249::-;26863:4;26878:18;26899;:28;;;26928:31;26899:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26899:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26899:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26899:61:0;;;;;;;;;;;;;;;;26878:82;;26976:13;26969:20;;;26748:249;;;;:::o;20824:2675::-;20928:4;18794:7;;;;;;;;;;;18789:15;;20945:24;20987:22;;;;;;;;;;;20945:66;;21022:47;21089:21;;;;;;;;;;;:33;;;21131:22;;;;;;;;;;;21089:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21089:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21089:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21089:66:0;;;;;;;;;;;;;;;;21022:134;;21260:22;21285:48;21298:28;21311:9;21322:3;21298:12;:28::i;:::-;21328:4;21285:12;:48::i;:::-;21260:73;;21344:26;21373:41;21386:9;21396:17;21373:12;:41::i;:::-;21344:70;;21445:1;21431:10;:15;21427:297;;;21711:1;21698:14;;21427:297;21736:24;;;;;;;;;;;:33;;;21776:17;21795;;;;;;;;;;;21814;;;;;;;;;;;21833;21852:10;21864:1;21867;21736:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21736:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21736:133:0;;;;;21880:17;21900:20;;;;;;;;;;;:30;;;21939:4;21900:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21900:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21900:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21900:45:0;;;;;;;;;;;;;;;;21880:65;;21981:1;21966:12;:16;21958:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22078:16;22097:29;22110:12;22124:1;22097:12;:29::i;:::-;22078:48;;22145:20;;;;;;;;;;;:28;;;22182:17;22202:11;22145:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22145:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22145:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22145:69:0;;;;;;;;;;;;;;;;22137:78;;;;;;22226:22;;;;;;;;;;;:27;;;22254:12;22226:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22226:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22226:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22226:41:0;;;;;;;;;;;;;;;;;22278:23;22304:17;:27;;;22340:4;22304:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22304:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22304:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22304:42:0;;;;;;;;;;;;;;;;22278:68;;22387:1;22366:18;:22;22357:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22449:57;22487:18;22449:57;;;;;;;;;;;;;;;;;;22517:20;;;;;;;;;;;:28;;;22554:17;22574:1;22517:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22517:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22517:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22517:59:0;;;;;;;;;;;;;;;;;22587:17;:25;;;22621:30;22653:18;22587:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22587:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22587:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22587:85:0;;;;;;;;;;;;;;;;;22714:19;22736:95;22757:30;22790:17;22809:21;22736:12;:95::i;:::-;22714:117;;22842:30;:43;;;22892:21;22915:1;22917:14;22932:22;22945:3;22949:4;22932:12;:22::i;:::-;22842:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22842:113:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22842:113:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22842:113:0;;;;;;;;;;;;;;;;;22966:17;:25;;;23000:30;23032:1;22966:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22966:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22966:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22966:68:0;;;;;;;;;;;;;;;;;23082:25;23110:30;:40;;;23159:4;23110:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23110:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23110:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23110:55:0;;;;;;;;;;;;;;;;23082:83;;23181:37;23197:20;23181:37;;;;;;;;;;;;;;;;;;23229:30;:39;;;23269:14;23285:20;23229:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23229:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23229:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23229:77:0;;;;;;;;;;;;;;;;;23338:17;:27;;;23374:4;23338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23338:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23338:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23338:42:0;;;;;;;;;;;;;;;;23317:63;;23391:17;:26;;;23418:14;23434:18;23391:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23391:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23391:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23391:62:0;;;;;;;;;;;;;;;;;23471:20;23464:27;;;;;;;;;;;18789:15;20824:2675;;;;:::o;18361:34::-;;;;;;;;;;;;;:::o;27007:218::-;27093:4;27108:16;27144:31;27127:61;;;:63;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27127:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27127:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27127:63:0;;;;;;;;;;;;;;;;27108:82;;27206:11;27199:18;;;27007:218;;;:::o;31691:117::-;18900:9;:7;:9::i;:::-;18892:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31772:28;31791:8;31772:18;:28::i;:::-;31691:117;:::o;4422:471::-;4480:7;4730:1;4725;:6;4721:47;;;4755:1;4748:8;;;;4721:47;4780:9;4796:1;4792;:5;4780:17;;4825:1;4820;4816;:5;;;;;;:10;4808:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4884:1;4877:8;;;4422:471;;;;;:::o;5361:132::-;5419:7;5446:39;5450:1;5453;5446:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5439:46;;5361:132;;;;:::o;3050:181::-;3108:7;3128:9;3144:1;3140;:5;3128:17;;3169:1;3164;:6;;3156:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3222:1;3215:8;;;3050:181;;;;:::o;1519:476::-;1566:4;1913:10;1959:7;1947:20;1941:26;;1988:1;1982:2;:7;1975:14;;;1519:476;:::o;3506:136::-;3564:7;3591:43;3595:1;3598;3591:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3584:50;;3506:136;;;;:::o;31914:182::-;32016:1;31996:22;;:8;:22;;;;31988:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32080:8;32072:5;;:16;;;;;;;;;;;;;;;;;;31914:182;:::o;6023:345::-;6109:7;6208:1;6204;:5;6211:12;6196:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6196:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6235:9;6251:1;6247;:5;;;;;;6235:17;;6359:1;6352:8;;;6023:345;;;;;:::o;3979:192::-;4065:7;4098:1;4093;:6;;4101:12;4085:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4085:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:9;4141:1;4137;:5;4125:17;;4162:1;4155:8;;;3979:192;;;;;:::o
Swarm Source
bzzr://4807599782e3ed3e35bd572f2f234f10fc35245b440333a95953f01db2ef18cd
Loading...
Loading
Loading...
Loading
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.