ETH Price: $3,449.14 (-1.92%)
Gas: 3 Gwei

Contract

0x0308ACc5Edf725Dc6ba65EaDF24cbC8353a3b37B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x6080604097296562020-03-23 19:44:491582 days ago1584992689IN
 Create: MCDSaverFlashLoan
0 ETH0.042710198.1

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
99917522020-05-03 7:15:111541 days ago1588490111
0x0308ACc5...353a3b37B
0.0015 ETH
99914292020-05-03 5:59:591541 days ago1588485599
0x0308ACc5...353a3b37B
6.0179599 ETH
99914292020-05-03 5:59:591541 days ago1588485599
0x0308ACc5...353a3b37B
6.0179599 ETH
99903052020-05-03 1:30:521542 days ago1588469452
0x0308ACc5...353a3b37B
4.5989359 ETH
99903052020-05-03 1:30:521542 days ago1588469452
0x0308ACc5...353a3b37B
4.5989359 ETH
99901542020-05-03 0:56:431542 days ago1588467403
0x0308ACc5...353a3b37B
9.23140993 ETH
99901542020-05-03 0:56:431542 days ago1588467403
0x0308ACc5...353a3b37B
9.23140993 ETH
99901442020-05-03 0:54:261542 days ago1588467266
0x0308ACc5...353a3b37B
55.30783928 ETH
99901442020-05-03 0:54:261542 days ago1588467266
0x0308ACc5...353a3b37B
55.30783928 ETH
99901412020-05-03 0:53:421542 days ago1588467222
0x0308ACc5...353a3b37B
5.12201045 ETH
99901412020-05-03 0:53:421542 days ago1588467222
0x0308ACc5...353a3b37B
5.12201045 ETH
99900922020-05-03 0:43:581542 days ago1588466638
0x0308ACc5...353a3b37B
9.23296738 ETH
99900922020-05-03 0:43:581542 days ago1588466638
0x0308ACc5...353a3b37B
9.23296738 ETH
99891792020-05-02 21:22:321542 days ago1588454552
0x0308ACc5...353a3b37B
28.19216838 ETH
99891792020-05-02 21:22:321542 days ago1588454552
0x0308ACc5...353a3b37B
28.19216838 ETH
99890652020-05-02 20:56:071542 days ago1588452967
0x0308ACc5...353a3b37B
77.38717131 ETH
99890652020-05-02 20:56:071542 days ago1588452967
0x0308ACc5...353a3b37B
77.38717131 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.0015 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.21855901 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.21855901 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.36079427 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.14243178 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.21836248 ETH
99859492020-05-02 9:34:321542 days ago1588412072
0x0308ACc5...353a3b37B
0.0015 ETH
99816062020-05-01 17:12:111543 days ago1588353131
0x0308ACc5...353a3b37B
48.14730096 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MCDSaverFlashLoan

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-03-23
*/

pragma solidity ^0.5.0;


interface ERC20 {
    function totalSupply() external view returns (uint256 supply);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(address _from, address _to, uint256 _value)
        external
        returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function decimals() external view returns (uint256 digits);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

interface ExchangeInterface {
    function swapEtherToToken(uint256 _ethAmount, address _tokenAddress, uint256 _maxAmount)
        external
        payable
        returns (uint256, uint256);

    function swapTokenToEther(address _tokenAddress, uint256 _amount, uint256 _maxAmount)
        external
        returns (uint256);

    function swapTokenToToken(address _src, address _dest, uint256 _amount)
        external
        payable
        returns (uint256);

    function getExpectedRate(address src, address dest, uint256 srcQty)
        external
        view
        returns (uint256 expectedRate);
}

contract SaverLogger {
    event Repay(
        uint256 indexed cdpId,
        address indexed owner,
        uint256 collateralAmount,
        uint256 daiAmount
    );
    event Boost(
        uint256 indexed cdpId,
        address indexed owner,
        uint256 daiAmount,
        uint256 collateralAmount
    );

    
    function LogRepay(uint256 _cdpId, address _owner, uint256 _collateralAmount, uint256 _daiAmount)
        public
    {
        emit Repay(_cdpId, _owner, _collateralAmount, _daiAmount);
    }

    
    function LogBoost(uint256 _cdpId, address _owner, uint256 _daiAmount, uint256 _collateralAmount)
        public
    {
        emit Boost(_cdpId, _owner, _daiAmount, _collateralAmount);
    }
}

contract Discount {
    address public owner;
    mapping(address => CustomServiceFee) public serviceFees;

    uint256 constant MAX_SERVICE_FEE = 400;

    struct CustomServiceFee {
        bool active;
        uint256 amount;
    }

    constructor() public {
        owner = msg.sender;
    }

    function isCustomFeeSet(address _user) public view returns (bool) {
        return serviceFees[_user].active;
    }

    function getCustomServiceFee(address _user) public view returns (uint256) {
        return serviceFees[_user].amount;
    }

    function setServiceFee(address _user, uint256 _fee) public {
        require(msg.sender == owner, "Only owner");
        require(_fee >= MAX_SERVICE_FEE || _fee == 0);

        serviceFees[_user] = CustomServiceFee({active: true, amount: _fee});
    }

    function disableServiceFee(address _user) public {
        require(msg.sender == owner, "Only owner");

        serviceFees[_user] = CustomServiceFee({active: false, amount: 0});
    }
}

contract PipInterface {
    function read() public returns (bytes32);
}

contract Spotter {
    struct Ilk {
        PipInterface pip;
        uint256 mat;
    }

    mapping (bytes32 => Ilk) public ilks;

    uint256 public par;

}

contract Jug {
    struct Ilk {
        uint256 duty;
        uint256  rho;
    }

    mapping (bytes32 => Ilk) public ilks;

    function drip(bytes32) public returns (uint);
}

contract Vat {

    struct Urn {
        uint256 ink;   
        uint256 art;   
    }

    struct Ilk {
        uint256 Art;   
        uint256 rate;  
        uint256 spot;  
        uint256 line;  
        uint256 dust;  
    }

    mapping (bytes32 => mapping (address => Urn )) public urns;
    mapping (bytes32 => Ilk)                       public ilks;
    mapping (bytes32 => mapping (address => uint)) public gem;  

    function can(address, address) public view returns (uint);
    function dai(address) public view returns (uint);
    function frob(bytes32, address, address, address, int, int) public;
    function hope(address) public;
    function move(address, address, uint) public;
}

contract Gem {
    function dec() public returns (uint);
    function gem() public returns (Gem);
    function join(address, uint) public payable;
    function exit(address, uint) public;

    function approve(address, uint) public;
    function transfer(address, uint) public returns (bool);
    function transferFrom(address, address, uint) public returns (bool);
    function deposit() public payable;
    function withdraw(uint) public;
    function allowance(address, address) public returns (uint);
}

contract DaiJoin {
    function vat() public returns (Vat);
    function dai() public returns (Gem);
    function join(address, uint) public payable;
    function exit(address, uint) public;
}

contract TokenInterface {
    function allowance(address, address) public returns (uint256);

    function balanceOf(address) public returns (uint256);

    function approve(address, uint256) public;

    function transfer(address, uint256) public returns (bool);

    function transferFrom(address, address, uint256) public returns (bool);

    function deposit() public payable;

    function withdraw(uint256) public;
}

contract SaverExchangeInterface {
    function getBestPrice(
        uint256 _amount,
        address _srcToken,
        address _destToken,
        uint256 _exchangeType
    ) public view returns (address, uint256);
}

contract ConstantAddressesExchangeMainnet {
    address public constant MAKER_DAI_ADDRESS = 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359;
    address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2;
    address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08;
    address public constant LOGGER_ADDRESS = 0xeCf88e1ceC2D2894A0295DB3D86Fe7CE4991E6dF;
    address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F;

    address public constant GAS_TOKEN_INTERFACE_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;
    address public constant SAVER_EXCHANGE_ADDRESS = 0x862F3dcF1104b8a9468fBb8B843C37C31B41eF09;

    
    address public constant MANAGER_ADDRESS = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39;
    address public constant VAT_ADDRESS = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B;
    address public constant SPOTTER_ADDRESS = 0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3;
    address public constant PROXY_ACTIONS = 0x82ecD135Dce65Fbc6DbdD0e4237E0AF93FFD5038;

    address public constant JUG_ADDRESS = 0x19c0976f590D67707E62397C87829d896Dc0f1F1;
    address public constant DAI_JOIN_ADDRESS = 0x9759A6Ac90977b93B58547b4A71c78317f391A28;
    address public constant ETH_JOIN_ADDRESS = 0x2F0b23f53734252Bda2277357e97e1517d6B042A;
    address public constant MIGRATION_ACTIONS_PROXY = 0xe4B22D484958E582098A98229A24e8A43801b674;

    address public constant SAI_ADDRESS = 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359;
    address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

    address payable public constant SCD_MCD_MIGRATION = 0xc73e0383F3Aff3215E6f04B0331D58CeCf0Ab849;

    
    address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF;
    address public constant NEW_IDAI_ADDRESS = 0x6c1E2B0f67e00c06c8e2BE7Dc681Ab785163fF4D;
}

contract ConstantAddressesExchangeKovan {
    address public constant MAKER_DAI_ADDRESS = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
    address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public constant MKR_ADDRESS = 0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD;
    address public constant WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;
    address payable public constant WALLET_ID = 0x54b44C6B18fc0b4A1010B21d524c338D1f8065F6;
    address public constant LOGGER_ADDRESS = 0x32d0e18f988F952Eb3524aCE762042381a2c39E5;
    address public constant DISCOUNT_ADDRESS = 0x1297c1105FEDf45E0CF6C102934f32C4EB780929;

    address public constant GAS_TOKEN_INTERFACE_ADDRESS = 0x0000000000170CcC93903185bE5A2094C870Df62;
    address public constant SAVER_EXCHANGE_ADDRESS = 0xACA7d11e3f482418C324aAC8e90AaD0431f692A6;

    
    address public constant MANAGER_ADDRESS = 0x1476483dD8C35F25e568113C5f70249D3976ba21;
    address public constant VAT_ADDRESS = 0xbA987bDB501d131f766fEe8180Da5d81b34b69d9;
    address public constant SPOTTER_ADDRESS = 0x3a042de6413eDB15F2784f2f97cC68C7E9750b2D;
    address public constant PROXY_ACTIONS = 0xd1D24637b9109B7f61459176EdcfF9Be56283a7B;

    address public constant JUG_ADDRESS = 0xcbB7718c9F39d05aEEDE1c472ca8Bf804b2f1EaD;
    address public constant DAI_JOIN_ADDRESS = 0x5AA71a3ae1C0bd6ac27A1f28e1415fFFB6F15B8c;
    address public constant ETH_JOIN_ADDRESS = 0x775787933e92b709f2a3C70aa87999696e74A9F8;
    address public constant MIGRATION_ACTIONS_PROXY = 0x433870076aBd08865f0e038dcC4Ac6450e313Bd8;

    address public constant SAI_ADDRESS = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
    address public constant DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;

    address payable public constant SCD_MCD_MIGRATION = 0x411B2Faa662C8e3E5cF8f01dFdae0aeE482ca7b0;

    
    address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF;
    address public constant NEW_IDAI_ADDRESS = 0x6c1E2B0f67e00c06c8e2BE7Dc681Ab785163fF4D;
}

contract ConstantAddressesExchange is ConstantAddressesExchangeMainnet {}

contract ExchangeHelper is ConstantAddressesExchange {

    
    
    
    
    
    
    
    function swap(uint[4] memory _data, address _src, address _dest, address _exchangeAddress, bytes memory _callData) internal returns (uint) {
        address wrapper;
        uint price;
        
        uint[2] memory tokens;
        bool success;

        
        tokens[1] = _data[0];

        _src = wethToKyberEth(_src);
        _dest = wethToKyberEth(_dest);

        
        address[3] memory orderAddresses = [_exchangeAddress, _src, _dest];

        
        if (_data[2] == 4) {
            if (orderAddresses[1] != KYBER_ETH_ADDRESS) {
                ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _data[0]);
            }

            (success, tokens[0], ) = takeOrder(orderAddresses, _callData, address(this).balance, _data[0]);

            
            require(success && tokens[0] > 0, "0x transaction failed");
        }

        
        
        

        

        
        
        
        
        
        

        
        
        
        
        
        

        
        

        if (tokens[0] == 0) {
            (wrapper, price) = SaverExchangeInterface(SAVER_EXCHANGE_ADDRESS).getBestPrice(_data[0], orderAddresses[1], orderAddresses[2], _data[2]);

            require(price > _data[1] || _data[3] > _data[1], "Slippage hit");

            
            if (_data[3] >= price) {
                if (orderAddresses[1] != KYBER_ETH_ADDRESS) {
                    ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _data[0]);
                }

                
                (success, tokens[0], tokens[1]) = takeOrder(orderAddresses, _callData, address(this).balance, _data[0]);
            }

            
            if (tokens[1] > 0) {
                
                if (tokens[1] != _data[0]) {
                    (wrapper, price) = SaverExchangeInterface(SAVER_EXCHANGE_ADDRESS).getBestPrice(tokens[1], orderAddresses[1], orderAddresses[2], _data[2]);
                }

                require(price > _data[1], "Slippage hit onchain price");

                if (orderAddresses[1] == KYBER_ETH_ADDRESS) {
                    uint tRet;
                    (tRet,) = ExchangeInterface(wrapper).swapEtherToToken.value(tokens[1])(tokens[1], orderAddresses[2], uint(-1));
                    tokens[0] += tRet;
                } else {
                    ERC20(orderAddresses[1]).transfer(wrapper, tokens[1]);

                    if (orderAddresses[2] == KYBER_ETH_ADDRESS) {
                        tokens[0] += ExchangeInterface(wrapper).swapTokenToEther(orderAddresses[1], tokens[1], uint(-1));
                    } else {
                        tokens[0] += ExchangeInterface(wrapper).swapTokenToToken(orderAddresses[1], orderAddresses[2], tokens[1]);
                    }
                }
            }
        }

        return tokens[0];
    }

    
    
    
    
    
    function takeOrder(address[3] memory _addresses, bytes memory _data, uint _value, uint _amount) private returns(bool, uint, uint) {
        bool success;

        (success, ) = _addresses[0].call.value(_value)(_data);

        uint tokensLeft = _amount;
        uint tokensReturned = 0;
        if (success){
            
            if (_addresses[1] == KYBER_ETH_ADDRESS) {
                tokensLeft = address(this).balance;
            } else {
                tokensLeft = ERC20(_addresses[1]).balanceOf(address(this));
            }

            
            if (_addresses[2] == KYBER_ETH_ADDRESS) {
                TokenInterface(WETH_ADDRESS).withdraw(TokenInterface(WETH_ADDRESS).balanceOf(address(this)));
                tokensReturned = address(this).balance;
            } else {
                tokensReturned = ERC20(_addresses[2]).balanceOf(address(this));
            }
        }

        return (success, tokensReturned, tokensLeft);
    }

    
    
    function wethToKyberEth(address _src) internal pure returns (address) {
        return _src == WETH_ADDRESS ? KYBER_ETH_ADDRESS : _src;
    }
}

contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

contract DSAuthority {
    function canCall(address src, address dst, bytes4 sig) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority(address indexed authority);
    event LogSetOwner(address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority public authority;
    address public owner;

    constructor() public {
        owner = msg.sender;
        emit LogSetOwner(msg.sender);
    }

    function setOwner(address owner_) public auth {
        owner = owner_;
        emit LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_) public auth {
        authority = authority_;
        emit LogSetAuthority(address(authority));
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, address(this), sig);
        }
    }
}

contract DSNote {
    event LogNote(
        bytes4 indexed sig,
        address indexed guy,
        bytes32 indexed foo,
        bytes32 indexed bar,
        uint256 wad,
        bytes fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}

contract DSProxy is DSAuth, DSNote {
    DSProxyCache public cache; 

    constructor(address _cacheAddr) public {
        require(setCache(_cacheAddr));
    }

    function() external payable {}

    
    function execute(bytes memory _code, bytes memory _data)
        public
        payable
        returns (address target, bytes32 response)
    {
        target = cache.read(_code);
        if (target == address(0)) {
            
            target = cache.write(_code);
        }

        response = execute(target, _data);
    }

    function execute(address _target, bytes memory _data)
        public
        payable
        auth
        note
        returns (bytes32 response)
    {
        require(_target != address(0));

        
        assembly {
            let succeeded := delegatecall(
                sub(gas, 5000),
                _target,
                add(_data, 0x20),
                mload(_data),
                0,
                32
            )
            response := mload(0) 
            switch iszero(succeeded)
                case 1 {
                    
                    revert(0, 0)
                }
        }
    }

    
    function setCache(address _cacheAddr) public payable auth note returns (bool) {
        require(_cacheAddr != address(0)); 
        cache = DSProxyCache(_cacheAddr); 
        return true;
    }
}

contract DSProxyCache {
    mapping(bytes32 => address) cache;

    function read(bytes memory _code) public view returns (address) {
        bytes32 hash = keccak256(_code);
        return cache[hash];
    }

    function write(bytes memory _code) public returns (address target) {
        assembly {
            target := create(0, add(_code, 0x20), mload(_code))
            switch iszero(extcodesize(target))
                case 1 {
                    
                    revert(0, 0)
                }
        }
        bytes32 hash = keccak256(_code);
        cache[hash] = target;
    }
}

contract Manager {
    function last(address) public returns (uint);
    function cdpCan(address, uint, address) public view returns (uint);
    function ilks(uint) public view returns (bytes32);
    function owns(uint) public view returns (address);
    function urns(uint) public view returns (address);
    function vat() public view returns (address);
    function open(bytes32, address) public returns (uint);
    function give(uint, address) public;
    function cdpAllow(uint, address, uint) public;
    function urnAllow(address, uint) public;
    function frob(uint, int, int) public;
    function flux(uint, address, uint) public;
    function move(uint, address, uint) public;
    function exit(address, uint, address, uint) public;
    function quit(uint, address) public;
    function enter(address, uint) public;
    function shift(uint, uint) public;
}

contract Join {
    bytes32 public ilk;

    function dec() public returns (uint);
    function gem() public returns (Gem);
    function join(address, uint) public payable;
    function exit(address, uint) public;
}

contract SaverProxyHelper is DSMath {

    
    
    
    
    function normalizeDrawAmount(uint _amount, uint _rate, uint _daiVatBalance) internal pure returns (int dart) {
        if (_daiVatBalance < mul(_amount, RAY)) {
            dart = toPositiveInt(sub(mul(_amount, RAY), _daiVatBalance) / _rate);
            dart = mul(uint(dart), _rate) < mul(_amount, RAY) ? dart + 1 : dart;
        }
    }

    
    
    function toRad(uint _wad) internal pure returns (uint) {
        return mul(_wad, 10 ** 27);
    }

    
    
    
    function convertTo18(address _joinAddr, uint256 _amount) internal returns (uint256) {
        return mul(_amount, 10 ** (18 - Join(_joinAddr).dec()));
    }

    
    
    function toPositiveInt(uint _x) internal pure returns (int y) {
        y = int(_x);
        require(y >= 0, "int-overflow");
    }

    
    
    
    
    function normalizePaybackAmount(address _vat, address _urn, bytes32 _ilk) internal view returns (int amount) {
        uint dai = Vat(_vat).dai(_urn);

        (, uint rate,,,) = Vat(_vat).ilks(_ilk);
        (, uint art) = Vat(_vat).urns(_ilk, _urn);

        amount = toPositiveInt(dai / rate);
        amount = uint(amount) <= art ? - amount : - toPositiveInt(art);
    }

    
    
    
    
    
    function getAllDebt(address _vat, address _usr, address _urn, bytes32 _ilk) internal view returns (uint daiAmount) {
        (, uint rate,,,) = Vat(_vat).ilks(_ilk);
        (, uint art) = Vat(_vat).urns(_ilk, _urn);
        uint dai = Vat(_vat).dai(_usr);

        uint rad = sub(mul(art, rate), dai);
        daiAmount = rad / RAY;

        daiAmount = mul(daiAmount, RAY) < rad ? daiAmount + 1 : daiAmount;
    }

    
    
    function getCollateralAddr(address _joinAddr) internal returns (address) {
        return address(Join(_joinAddr).gem());
    }

    
    
    
    
    function getCdpInfo(Manager _manager, uint _cdpId, bytes32 _ilk) public view returns (uint, uint) {
        address vat = _manager.vat();
        address urn = _manager.urns(_cdpId);

        (uint collateral, uint debt) = Vat(vat).urns(_ilk, urn);
        (,uint rate,,,) = Vat(vat).ilks(_ilk);

        return (collateral, rmul(debt, rate));
    }

    
    
    
    function getOwner(Manager _manager, uint _cdpId) public view returns (address) {
        DSProxy proxy = DSProxy(uint160(_manager.owns(_cdpId)));

        return proxy.owner();
    }
}

contract MCDSaverProxy is SaverProxyHelper, ExchangeHelper {

    uint public constant SERVICE_FEE = 400; 
    bytes32 public constant ETH_ILK = 0x4554482d41000000000000000000000000000000000000000000000000000000;
    bytes32 public constant USDC_ILK = 0x555344432d410000000000000000000000000000000000000000000000000000;

    Manager public constant manager = Manager(MANAGER_ADDRESS);
    Vat public constant vat = Vat(VAT_ADDRESS);
    DaiJoin public constant daiJoin = DaiJoin(DAI_JOIN_ADDRESS);
    Spotter public constant spotter = Spotter(SPOTTER_ADDRESS);

    
    
    modifier boostCheck(uint _cdpId) {
        bytes32 ilk = manager.ilks(_cdpId);
        address urn = manager.urns(_cdpId);

        (uint collateralBefore, ) = vat.urns(ilk, urn);

        _;

        (uint collateralAfter, ) = vat.urns(ilk, urn);

        require(collateralAfter > collateralBefore);
    }

    
    
    modifier repayCheck(uint _cdpId) {
        bytes32 ilk = manager.ilks(_cdpId);

        uint beforeRatio = getRatio(_cdpId, ilk);

        _;

        uint afterRatio = getRatio(_cdpId, ilk);

        require(afterRatio > beforeRatio || afterRatio == 0);
    }

    
    
    
    
    
    
    function repay(
        
        uint[6] memory _data,
        address _joinAddr,
        address _exchangeAddress,
        bytes memory _callData
    ) public payable repayCheck(_data[0]) {

        address owner = getOwner(manager, _data[0]);
        bytes32 ilk = manager.ilks(_data[0]);

        
        
        
        uint[3] memory temp;

        temp[0] = drawCollateral(_data[0], ilk, _joinAddr, _data[1]);

                                
        uint[4] memory swapData = [temp[0], _data[2], _data[3], _data[5]];
        temp[1] = swap(swapData, getCollateralAddr(_joinAddr), DAI_ADDRESS, _exchangeAddress, _callData);
        temp[2] = sub(temp[1], getFee(temp[1], _data[4], owner));

        paybackDebt(_data[0], ilk, temp[2], owner);

        
        if (address(this).balance > 0) {
            tx.origin.transfer(address(this).balance);
        }

        SaverLogger(LOGGER_ADDRESS).LogRepay(_data[0], owner, temp[0], temp[1]);
    }

    
    
    
    
    
    
    function boost(
        
        uint[6] memory _data,
        address _joinAddr,
        address _exchangeAddress,
        bytes memory _callData
    ) public payable boostCheck(_data[0]) {
        address owner = getOwner(manager, _data[0]);
        bytes32 ilk = manager.ilks(_data[0]);

        
        
        
        uint[3] memory temp;

        temp[0] = drawDai(_data[0], ilk, _data[1]);
        temp[1] = sub(temp[0], getFee(temp[0], _data[4], owner));
                                
        uint[4] memory swapData = [temp[1], _data[2], _data[3], _data[5]];
        temp[2] = swap(swapData, DAI_ADDRESS, getCollateralAddr(_joinAddr), _exchangeAddress, _callData);

        addCollateral(_data[0], _joinAddr, temp[2]);

        
        if (address(this).balance > 0) {
            tx.origin.transfer(address(this).balance);
        }

        SaverLogger(LOGGER_ADDRESS).LogBoost(_data[0], owner, temp[0], temp[2]);
    }

    
    
    
    
    
    function drawDai(uint _cdpId, bytes32 _ilk, uint _daiAmount) internal returns (uint) {
        uint rate = Jug(JUG_ADDRESS).drip(_ilk);
        uint daiVatBalance = vat.dai(manager.urns(_cdpId));

        uint maxAmount = getMaxDebt(_cdpId, _ilk);

        if (_daiAmount >= maxAmount) {
            _daiAmount = sub(maxAmount, 1);
        }

        manager.frob(_cdpId, int(0), normalizeDrawAmount(_daiAmount, rate, daiVatBalance));
        manager.move(_cdpId, address(this), toRad(_daiAmount));

        if (vat.can(address(this), address(DAI_JOIN_ADDRESS)) == 0) {
            vat.hope(DAI_JOIN_ADDRESS);
        }

        DaiJoin(DAI_JOIN_ADDRESS).exit(address(this), _daiAmount);

        return _daiAmount;
    }

    
    
    
    
    function addCollateral(uint _cdpId, address _joinAddr, uint _amount) internal {
        int convertAmount = 0;

        if (_joinAddr == ETH_JOIN_ADDRESS) {
            Join(_joinAddr).gem().deposit.value(_amount)();
            convertAmount = toPositiveInt(_amount);
        } else {
            convertAmount = toPositiveInt(convertTo18(_joinAddr, _amount));
        }

        Join(_joinAddr).gem().approve(_joinAddr, _amount);
        Join(_joinAddr).join(address(this), _amount);

        vat.frob(
            manager.ilks(_cdpId),
            manager.urns(_cdpId),
            address(this),
            address(this),
            convertAmount,
            0
        );

    }

    
    
    
    
    
    
    function drawCollateral(uint _cdpId, bytes32 _ilk, address _joinAddr, uint _amount) internal returns (uint) {
        uint maxCollateral = getMaxCollateral(_cdpId, _ilk);

        if (_amount >= maxCollateral) {
            _amount = sub(maxCollateral, 1);
        }

        uint frobAmount = _ilk == USDC_ILK ? _amount * (10 ** 12) : _amount;

        manager.frob(_cdpId, -toPositiveInt(frobAmount), 0);
        manager.flux(_cdpId, address(this), frobAmount);

        Join(_joinAddr).exit(address(this), _amount);

        if (_joinAddr == ETH_JOIN_ADDRESS) {
            Join(_joinAddr).gem().withdraw(_amount); 
        }

        return _amount;
    }

    
    
    
    
    
    
    function paybackDebt(uint _cdpId, bytes32 _ilk, uint _daiAmount, address _owner) internal {
        address urn = manager.urns(_cdpId);

        uint wholeDebt = getAllDebt(VAT_ADDRESS, urn, urn, _ilk);

        if (_daiAmount > wholeDebt) {
            ERC20(DAI_ADDRESS).transfer(_owner, sub(_daiAmount, wholeDebt));
            _daiAmount = wholeDebt;
        }

        daiJoin.dai().approve(DAI_JOIN_ADDRESS, _daiAmount);
        daiJoin.join(urn, _daiAmount);

        manager.frob(_cdpId, 0, normalizePaybackAmount(VAT_ADDRESS, urn, _ilk));
    }

    
    
    
    
    function getFee(uint _amount, uint _gasCost, address _owner) internal returns (uint feeAmount) {
        uint fee = SERVICE_FEE;

        if (Discount(DISCOUNT_ADDRESS).isCustomFeeSet(_owner)) {
            fee = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(_owner);
        }

        feeAmount = (fee == 0) ? 0 : (_amount / fee);

        if (_gasCost != 0) {
            uint ethDaiPrice = getPrice(ETH_ILK);
            _gasCost = rmul(_gasCost, ethDaiPrice);

            feeAmount = add(feeAmount, _gasCost);
        }

        
        if (feeAmount > (_amount / 5)) {
            feeAmount = _amount / 5;
        }

        ERC20(DAI_ADDRESS).transfer(WALLET_ID, feeAmount);
    }

    
    
    
    
    function getMaxCollateral(uint _cdpId, bytes32 _ilk) public view returns (uint) {
        uint price = getPrice(_ilk);

        (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk);

        (, uint mat) = Spotter(SPOTTER_ADDRESS).ilks(_ilk);

        uint maxCollateral = sub(sub(collateral, (div(mul(mat, debt), price))), 10);

        uint normalizeMaxCollateral = _ilk == USDC_ILK ? maxCollateral / (10 ** 12) : maxCollateral;

        return normalizeMaxCollateral;
    }

    
    
    
    
    function getMaxDebt(uint _cdpId, bytes32 _ilk) public view returns (uint) {
        uint price = getPrice(_ilk);

        (, uint mat) = spotter.ilks(_ilk);
        (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk);

        return sub(sub(div(mul(collateral, price), mat), debt), 10);
    }

    
    
    function getPrice(bytes32 _ilk) public view returns (uint) {
        (, uint mat) = spotter.ilks(_ilk);
        (,,uint spot,,) = vat.ilks(_ilk);

        return rmul(rmul(spot, spotter.par()), mat);
    }

    
    
    
    function getRatio(uint _cdpId, bytes32 _ilk) public view returns (uint) {
        uint price = getPrice( _ilk);

        (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk);

        if (debt == 0) return 0;

        return rdiv(wmul(collateral, price), debt);
    }

    
    
    function getCdpDetailedInfo(uint _cdpId) public view returns (uint collateral, uint debt, uint price, bytes32 ilk) {
        address urn = manager.urns(_cdpId);
        ilk = manager.ilks(_cdpId);

        (collateral, debt) = vat.urns(ilk, urn);
        (,uint rate,,,) = vat.ilks(ilk);

        debt = rmul(debt, rate);
        price = getPrice(ilk);
    }

}

library Address {
    
    function isContract(address account) internal view returns (bool) {
        
        
        
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

interface IERC20 {
    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address account) external view returns (uint256);

    
    function transfer(address recipient, uint256 amount) external returns (bool);

    
    function allowance(address owner, address spender) external view returns (uint256);

    
    function approve(address spender, uint256 amount) external returns (bool);

    
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    
    event Transfer(address indexed from, address indexed to, uint256 value);

    
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        
        
        
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        
        require(b > 0, errorMessage);
        uint256 c = a / b;
        

        return c;
    }

    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        
        
        
        
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

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

    
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        
        

        
        
        
        
        
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { 
            
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IFlashLoanReceiver {

    function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}

contract ILendingPoolAddressesProvider {

    function getLendingPool() public view returns (address);
    function setLendingPoolImpl(address _pool) public;

    function getLendingPoolCore() public view returns (address payable);
    function setLendingPoolCoreImpl(address _lendingPoolCore) public;

    function getLendingPoolConfigurator() public view returns (address);
    function setLendingPoolConfiguratorImpl(address _configurator) public;

    function getLendingPoolDataProvider() public view returns (address);
    function setLendingPoolDataProviderImpl(address _provider) public;

    function getLendingPoolParametersProvider() public view returns (address);
    function setLendingPoolParametersProviderImpl(address _parametersProvider) public;

    function getTokenDistributor() public view returns (address);
    function setTokenDistributor(address _tokenDistributor) public;


    function getFeeProvider() public view returns (address);
    function setFeeProviderImpl(address _feeProvider) public;

    function getLendingPoolLiquidationManager() public view returns (address);
    function setLendingPoolLiquidationManager(address _manager) public;

    function getLendingPoolManager() public view returns (address);
    function setLendingPoolManager(address _lendingPoolManager) public;

    function getPriceOracle() public view returns (address);
    function setPriceOracle(address _priceOracle) public;

    function getLendingRateOracle() public view returns (address);
    function setLendingRateOracle(address _lendingRateOracle) public;
}

library EthAddressLib {

    function ethAddress() internal pure returns(address) {
        return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    }
}

contract FlashLoanReceiverBase is IFlashLoanReceiver {

    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    ILendingPoolAddressesProvider public addressesProvider;

    constructor(ILendingPoolAddressesProvider _provider) public {
        addressesProvider = _provider;
    }

    function () external payable {
    }

    function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {

        address payable core = addressesProvider.getLendingPoolCore();

        transferInternal(core,_reserve, _amount);
    }

    function transferInternal(address payable _destination, address _reserve, uint256  _amount) internal {
        if(_reserve == EthAddressLib.ethAddress()) {
            
            _destination.call.value(_amount)("");
            return;
        }

        IERC20(_reserve).safeTransfer(_destination, _amount);


    }

    function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
        if(_reserve == EthAddressLib.ethAddress()) {

            return _target.balance;
        }

        return IERC20(_reserve).balanceOf(_target);

    }
}

contract MCDSaverFlashLoan is MCDSaverProxy, FlashLoanReceiverBase {
    Manager public constant MANAGER = Manager(MANAGER_ADDRESS);

    ILendingPoolAddressesProvider public LENDING_POOL_ADDRESS_PROVIDER = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);

    address payable public owner;

    constructor()
        FlashLoanReceiverBase(LENDING_POOL_ADDRESS_PROVIDER)
        public {
            owner = msg.sender;
        }

    function executeOperation(
        address _reserve,
        uint256 _amount,
        uint256 _fee,
        bytes calldata _params)
    external {

        
        require(_amount <= getBalanceInternal(address(this), _reserve),
            "Invalid balance for the contract");

        (
            uint[6] memory data,
            address joinAddr,
            address exchangeAddress,
            bytes memory callData,
            bool isRepay
        )
         = abi.decode(_params, (uint256[6],address,address,bytes,bool));

        if (isRepay) {
            repayWithLoan(data, _amount, joinAddr, exchangeAddress, callData, _fee);
        } else {
            boostWithLoan(data, _amount, joinAddr, exchangeAddress, callData, _fee);
        }

        transferFundsBackToPoolInternal(_reserve, _amount.add(_fee));

        
        if (address(this).balance > 0) {
            tx.origin.transfer(address(this).balance);
        }
    }

    function boostWithLoan(
        uint256[6] memory _data,
        uint256 _loanAmount,
        address _joinAddr,
        address _exchangeAddress,
        bytes memory _callData,
        uint _fee
    ) internal boostCheck(_data[0]) {

        
        
        uint[] memory amounts = new uint[](5);
        address owner = getOwner(MANAGER, _data[0]);

        
        amounts[0] = getMaxDebt(_data[0], manager.ilks(_data[0]));
        amounts[1] = drawDai(_data[0], MANAGER.ilks(_data[0]), amounts[0]);

        
        amounts[2] = getFee((amounts[1] + _loanAmount), 0, owner);
        amounts[3] = (amounts[1] + _loanAmount) - amounts[2];

        
        amounts[4] = swap(
            [amounts[3], _data[2], _data[3], _data[5]],
            DAI_ADDRESS,
            getCollateralAddr(_joinAddr),
            _exchangeAddress,
            _callData
        );

        
        addCollateral(_data[0], _joinAddr, amounts[4]);

        
        drawDai(_data[0],  manager.ilks(_data[0]), (_loanAmount + _fee));

        SaverLogger(LOGGER_ADDRESS).LogBoost(_data[0], owner, (amounts[1] + _loanAmount), amounts[4]);
    }

    function repayWithLoan(
        uint256[6] memory _data,
        uint256 _loanAmount,
        address _joinAddr,
        address _exchangeAddress,
        bytes memory _callData,
        uint _fee
    ) internal repayCheck(_data[0]) {

        
        
        uint[] memory amounts = new uint[](4);
        address owner = getOwner(MANAGER, _data[0]);

        
        amounts[0] = getMaxCollateral(_data[0], manager.ilks(_data[0]));
        amounts[1] = drawCollateral(_data[0], manager.ilks(_data[0]), _joinAddr, amounts[0]);

        
        amounts[2] = swap(
            [(amounts[1] + _loanAmount), _data[2], _data[3], _data[5]],
            getCollateralAddr(_joinAddr),
            DAI_ADDRESS,
            _exchangeAddress,
            _callData
        );

        
        amounts[3] = getFee(amounts[2], 0, owner);

        uint paybackAmount = (amounts[2] - amounts[3]);
        paybackAmount = limitLoanAmount(_data[0], manager.ilks(_data[0]), paybackAmount, owner);

        
        paybackDebt(_data[0], MANAGER.ilks(_data[0]), paybackAmount, owner);

        
        drawCollateral(_data[0], manager.ilks(_data[0]), _joinAddr, (_loanAmount + _fee));

        SaverLogger(LOGGER_ADDRESS).LogRepay(_data[0], owner, (amounts[1] + _loanAmount), amounts[2]);
    }

    function() external payable {}

    
    function limitLoanAmount(uint _cdpId, bytes32 _ilk, uint _paybackAmount, address _owner) internal returns (uint256) {
        uint debt = getAllDebt(address(vat), manager.urns(_cdpId), manager.urns(_cdpId), _ilk);

        if (_paybackAmount > debt) {
            ERC20(DAI_ADDRESS).transfer(_owner, (_paybackAmount - debt));
            return debt;
        }

        uint debtLeft = debt - _paybackAmount;

        
        if (debtLeft < 20 ether) {
            uint amountOverDust = ((20 ether) - debtLeft);

            ERC20(DAI_ADDRESS).transfer(_owner, amountOverDust);

            return (_paybackAmount - amountOverDust);
        }

        return _paybackAmount;
    }

    
    function withdrawStuckFunds(address _tokenAddr, uint _amount) public {
        require(msg.sender == owner, "Only owner");

        if (_tokenAddr == KYBER_ETH_ADDRESS) {
            owner.transfer(_amount);
        } else {
            ERC20(_tokenAddr).transfer(owner, _amount);
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"WETH_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ILK","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_data","type":"uint256[6]"},{"name":"_joinAddr","type":"address"},{"name":"_exchangeAddress","type":"address"},{"name":"_callData","type":"bytes"}],"name":"boost","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"MANAGER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getMaxCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"spotter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_manager","type":"address"},{"name":"_cdpId","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ilk","type":"bytes32"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GAS_TOKEN_INTERFACE_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vat","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MANAGER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_manager","type":"address"},{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getCdpInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SERVICE_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIGRATION_ACTIONS_PROXY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SPOTTER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDC_ILK","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PROXY_ACTIONS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MKR_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LOGGER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAVER_EXCHANGE_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LENDING_POOL_ADDRESS_PROVIDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAKER_DAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"JUG_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NEW_IDAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiJoin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"addressesProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VAT_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_JOIN_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC20_PROXY_0X","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WALLET_ID","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_data","type":"uint256[6]"},{"name":"_joinAddr","type":"address"},{"name":"_exchangeAddress","type":"address"},{"name":"_callData","type":"bytes"}],"name":"repay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"}],"name":"getCdpDetailedInfo","outputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"price","type":"uint256"},{"name":"ilk","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getMaxDebt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_params","type":"bytes"}],"name":"executeOperation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ETH_JOIN_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SCD_MCD_MIGRATION","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]

6080604052600180546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c817905534801561003657600080fd5b50600154600080546001600160a01b03199081166001600160a01b039093169290921790556002805490911633179055615dc680620000766000396000f3fe6080604052600436106102e75760003560e01c8063819854e711610184578063c72c4d10116100d6578063dcfc17051161008a578063ee87255811610064578063ee872558146108de578063f1d2539614610977578063f83524721461098c576102e7565b8063dcfc17051461076b578063e304c6081461085e578063ed202109146108ae576102e7565b8063cfac57c7116100bb578063cfac57c714610717578063d0cc728914610741578063d3661fa514610756576102e7565b8063c72c4d101461072c578063cf786f8f14610545576102e7565b806398ab3d4911610138578063acbeba6111610112578063acbeba61146106ed578063bf42d94714610702578063c11645bc14610717576102e7565b806398ab3d49146106c35780639da779e91461031a578063a46a66c9146106d8576102e7565b80638da5cb5b116101695780638da5cb5b1461068457806394bfbe741461069957806394f0eb3d146106ae576102e7565b8063819854e71461065a578063825ffd921461066f576102e7565b806332ac5cd21161023d578063481c6a75116101f157806362da5d90116101cb57806362da5d90146106305780636738929f146104b85780637e8a776f14610645576102e7565b8063481c6a751461044957806350c86de5146105eb57806351a885c014610600576102e7565b8063380d424411610222578063380d4244146104495780633a1283221461055a5780634115fe6b14610593576102e7565b806332ac5cd21461053057806336569e7714610545576102e7565b806329f7fc9e1161029f5780632e77468d116102795780632e77468d146104b85780632f634a90146104cd57806331d98b3f14610506576102e7565b806329f7fc9e1461045e5780632a4c0a1a146104735780632e67720c14610488576102e7565b8063186cab76116102d0578063186cab761461032f578063197e0ffe146103565780631b2df85014610449576102e7565b8063040141e5146102e95780630bd4a73e1461031a575b005b3480156102f557600080fd5b506102fe6109a1565b604080516001600160a01b039092168252519081900360200190f35b34801561032657600080fd5b506102fe6109b9565b34801561033b57600080fd5b506103446109d1565b60408051918252519081900360200190f35b6102e7600480360361012081101561036d57600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156103d457600080fd5b8201836020820111156103e657600080fd5b8035906020019184600183028401116401000000008311171561040857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109f5945050505050565b34801561045557600080fd5b506102fe610ee3565b34801561046a57600080fd5b506102fe610efb565b34801561047f57600080fd5b506102fe610f13565b34801561049457600080fd5b50610344600480360360408110156104ab57600080fd5b5080359060200135610f2b565b3480156104c457600080fd5b506102fe611055565b3480156104d957600080fd5b506102fe600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561106d565b34801561051257600080fd5b506103446004803603602081101561052957600080fd5b5035611171565b34801561053c57600080fd5b506102fe61134d565b34801561055157600080fd5b506102fe611360565b34801561056657600080fd5b506102e76004803603604081101561057d57600080fd5b506001600160a01b038135169060200135611378565b34801561059f57600080fd5b506105d2600480360360608110156105b657600080fd5b506001600160a01b0381351690602081013590604001356114f6565b6040805192835260208301919091528051918290030190f35b3480156105f757600080fd5b50610344611749565b34801561060c57600080fd5b506103446004803603604081101561062357600080fd5b508035906020013561174f565b34801561063c57600080fd5b506102fe6117b5565b34801561065157600080fd5b506103446117cd565b34801561066657600080fd5b506102fe6117f1565b34801561067b57600080fd5b506102fe611809565b34801561069057600080fd5b506102fe611821565b3480156106a557600080fd5b506102fe611830565b3480156106ba57600080fd5b506102fe611848565b3480156106cf57600080fd5b506102fe611860565b3480156106e457600080fd5b506102fe61186f565b3480156106f957600080fd5b506102fe611887565b34801561070e57600080fd5b506102fe61189f565b34801561072357600080fd5b506102fe6118b7565b34801561073857600080fd5b506102fe6118cf565b34801561074d57600080fd5b506102fe6118de565b34801561076257600080fd5b506102fe6118f6565b6102e7600480360361012081101561078257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156107e957600080fd5b8201836020820111156107fb57600080fd5b8035906020019184600183028401116401000000008311171561081d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061190e945050505050565b34801561086a57600080fd5b506108886004803603602081101561088157600080fd5b5035611c26565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108ba57600080fd5b50610344600480360360408110156108d157600080fd5b5080359060200135611ec0565b3480156108ea57600080fd5b506102e76004803603608081101561090157600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561093857600080fd5b82018360208201111561094a57600080fd5b8035906020019184600183028401116401000000008311171561096c57600080fd5b509092509050611fba565b34801561098357600080fd5b506102fe6121b8565b34801561099857600080fd5b506102fe6121d0565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7389d24a6b4ccb1b6faa2625fe562bdd9a2326035981565b7f4554482d4100000000000000000000000000000000000000000000000000000081565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d6020811015610a9057600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d6020811015610b2d57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d6040811015610bd557600080fd5b505190506000610c00735ef30b9986345249bc32d8928b7ee64de9435e398a835b602002015161106d565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8b8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d6020811015610c8357600080fd5b50519050610c8f615cf8565b8a5160208c0151610ca2919084906121e8565b80825260808c0151610cc09190610cbb908290876126bf565b612941565b6020820152610ccd615d16565b506040805160808101825260208381015182528d830151908201526060808e01519282019290925260a08d015191810191909152610d2a81736b175474e89094c44da98b954eedeac495271d0f610d238e612951565b8d8d6129c0565b604083018190528c51610d3e918d90613283565b303115610d74576040513290303180156108fc02916000818181858888f19350505050158015610d72573d6000803e3d6000fd5b505b8b51825160408085015181517f6877100500000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301919091525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df91636877100591608480830192600092919082900301818387803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018b90526001600160a01b038a1660248201528151600098507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9750632424be5c9650604480830196509294509250829003018186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d6040811015610ec857600080fd5b50519050818111610ed857600080fd5b505050505050505050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600080610f3783611171565b9050600080610f5b735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b9150915060007365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6040811015610fe257600080fd5b50602001519050600061100c61100585610cbb610fff86886136c9565b896136ed565b600a612941565b905060007f555344432d410000000000000000000000000000000000000000000000000000881461103d5781611046565b64e8d4a5100082045b96505050505050505b92915050565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b600080836001600160a01b0316638161b120846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d60208110156110de57600080fd5b5051604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290519192506001600160a01b03831691638da5cb5b91600480820192602092909190829003018186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b5051949350505050565b6000807365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60408110156111f557600080fd5b5060200151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d60a081101561129557600080fd5b5060409081015181517f495d32cb00000000000000000000000000000000000000000000000000000000815291519092506113439161133d9184917365c79fcb50ca1594b025960e539ed7a9a6d434a39163495d32cb91600480820192602092909190829003018186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051613700565b83613700565b925050505b919050565b6eb3f879cb30fe243b4dfee438691c0481565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b031633146113f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c79206f776e657200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611456576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611450573d6000803e3d6000fd5b506114f2565b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b50505b5050565b6000806000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000916001600160a01b03891691632726b073916024808301926020929190829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0380841660248301528251939450600093849391871692632424be5c926044808301939192829003018186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d604081101561168a57600080fd5b508051602090910151604080517fd9638d36000000000000000000000000000000000000000000000000000000008152600481018b905290519294509092506000916001600160a01b0387169163d9638d369160248083019260a0929190829003018186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d60a081101561172657600080fd5b50602001519050826117388383613700565b965096505050505050935093915050565b61019081565b60008061175b83611171565b905060008061177f735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b915091508060001415611798576000935050505061104f565b6117ab6117a58385613739565b82613761565b9695505050505050565b73e4b22d484958e582098a98229a24e8a43801b67481565b7f555344432d41000000000000000000000000000000000000000000000000000081565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b739f8f72aa9304c8b593d555f12ef6589cc3a579a281565b6002546001600160a01b031681565b73ecf88e1cec2d2894a0295db3d86fe7ce4991e6df81565b73862f3dcf1104b8a9468fbb8b843c37c31b41ef0981565b6001546001600160a01b031681565b731b14e8d511c9a4395425314f849bd737baf8208f81565b7319c0976f590d67707e62397c87829d896dc0f1f181565b736c1e2b0f67e00c06c8e2be7dc681ab785163ff4d81565b739759a6ac90977b93b58547b4a71c78317f391a2881565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561197f57600080fd5b505afa158015611993573d6000803e3d6000fd5b505050506040513d60208110156119a957600080fd5b5051905060006119b9838361174f565b905060006119dc735ef30b9986345249bc32d8928b7ee64de9435e398983610bf6565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8a8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b50519050611a6b615cf8565b895160208b0151611a80919084908c90613785565b8152611a8a615d16565b5060408051608081018252825181528b82015160208201526060808d01519282019290925260a08c015191810191909152611ae481611ac88c612951565b736b175474e89094c44da98b954eedeac495271d0f8c8c6129c0565b6020830181905260808c0151611b019190610cbb908290886126bf565b604083018190528b51611b1691859087613a8e565b303115611b4c576040513290303180156108fc02916000818181858888f19350505050158015611b4a573d6000803e3d6000fd5b505b8a5182516020840151604080517f406bb32a00000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df9163406bb32a91608480830192600092919082900301818387803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b50505050505050506000611c05848461174f565b905081811180611c13575080155b611c1c57600080fd5b5050505050505050565b6000806000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8657600080fd5b505afa158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b5051604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018990529051919250735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6020811015611d4b57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b038416602482015281519294507335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c92604480840193919291829003018186803b158015611dc857600080fd5b505afa158015611ddc573d6000803e3d6000fd5b505050506040513d6040811015611df257600080fd5b508051602090910151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519297509095506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d60a0811015611e9957600080fd5b50602001519050611eaa8582613700565b9450611eb583611171565b935050509193509193565b600080611ecc83611171565b604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905281519293506000927365c79fcb50ca1594b025960e539ed7a9a6d434a39263d9638d369260248082019391829003018186803b158015611f3957600080fd5b505afa158015611f4d573d6000803e3d6000fd5b505050506040513d6040811015611f6357600080fd5b50602001519050600080611f8c735ef30b9986345249bc32d8928b7ee64de9435e3988886114f6565b91509150611faf611005611fa9611fa385886136c9565b866136ed565b83612941565b979650505050505050565b611fc43086613e28565b84111561203257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604482015290519081900360640190fd5b61203a615d34565b60008060606000868661014081101561205257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156120b957600080fd5b8201836020820111156120cb57600080fd5b803590602001918460018302840111640100000000831117156120ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250989d50969b509499509750351580159650945061214f93505050505761214a858a8686868d613ee5565b61215d565b61215d858a8686868d614551565b6121768a6121718b8b63ffffffff614c7816565b614cec565b3031156121ac576040513290303180156108fc02916000818181858888f193505050501580156121aa573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b73c73e0383f3aff3215e6f04b0331d58cecf0ab84981565b6000807319c0976f590d67707e62397c87829d896dc0f1f16001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b34691735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50516040805163ffffffff841660e01b81526001600160a01b039092166004830152516024808301926020929190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b5051905060006123a48787611ec0565b90508085106123bb576123b8816001612941565b94505b735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd8860006123e3898888614d79565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db6883061246d89614dff565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156124c357600080fd5b505af11580156124d7573d6000803e3d6000fd5b5050604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9350634538c4eb92506044808301926020929190829003018186803b15801561255f57600080fd5b505afa158015612573573d6000803e3d6000fd5b505050506040513d602081101561258957600080fd5b505161262757604080517fa3b22fc4000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505b604080517fef693bed000000000000000000000000000000000000000000000000000000008152306004820152602481018790529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050508493505050505b9392505050565b604080517fb371deac0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152905160009161019091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50511561280c57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190505b80156128215780858161281b57fe5b04612824565b60005b915083156128735760006128577f4554482d41000000000000000000000000000000000000000000000000000000611171565b90506128638582613700565b945061286f8386614e17565b9250505b60058504821115612885576005850491505b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e086004820152602481018490529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b505050506040513d602081101561293657600080fd5b509195945050505050565b8082038281111561104f57600080fd5b6000816001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d60208110156129b857600080fd5b505192915050565b60008060006129cd615d52565b8851602082015260006129df89614e27565b98506129ea88614e27565b97506129f4615cf8565b50604080516060810182526001600160a01b0389811682528b811660208301528a1681830152908b015160041415612b8d5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612afb576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b505050506040513d6020811015612af857600080fd5b50505b612b10818830318e60005b6020020151614e6e565b5084529150818015612b225750825115155b612b8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8251613274578a516020820151604080840151818f015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6040811015612c5457600080fd5b508051602091820151918d0151909650909450841180612c7b575060208b015160608c0151115b612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b60608b01518411612ddf5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612dc6576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612d9957600080fd5b505af1158015612dad573d6000803e3d6000fd5b505050506040513d6020811015612dc357600080fd5b50505b612dd5818830318e6000612b06565b6020860152845291505b602083015115613274578a51602084015114612ec857602080840151908201516040808401518e82015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d6040811015612eb957600080fd5b50805160209091015190955093505b60208b01518411612f3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b60208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561303457602083015160408083015181517f43ac1dc6000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0391821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251600094928a16936343ac1dc693926064808201939182900301818588803b158015612ffc57600080fd5b505af1158015613010573d6000803e3d6000fd5b50505050506040513d604081101561302757600080fd5b5051845101845250613274565b60208082015184820151604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505050506040513d60208110156130d157600080fd5b505060408101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131c85760208082015184820151604080517f3bba21dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191881692633bba21dc926064808401938290030181600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b50518351018352613274565b6020808201516040808401518684015182517f13712c9f0000000000000000000000000000000000000000000000000000000081526001600160a01b039485166004820152918416602483015260448201529051918816926313712c9f926064808401938290030181600087803b15801561324257600080fd5b505af1158015613256573d6000803e3d6000fd5b505050506040513d602081101561326c57600080fd5b505183510183525b50505198975050505050505050565b60006001600160a01b038316732f0b23f53734252bda2277357e97e1517d6b042a141561339757826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b5051604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163d0e30db0918591600480830192600092919082900301818588803b15801561336e57600080fd5b505af1158015613382573d6000803e3d6000fd5b5050505050613390826151d0565b90506133ac565b6133a96133a48484615241565b6151d0565b90505b826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156133e757600080fd5b505af11580156133fb573d6000803e3d6000fd5b505050506040513d602081101561341157600080fd5b5051604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561347e57600080fd5b505af1158015613492573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081523060048201526024810186905290516001600160a01b0387169350633b4da69f9250604480830192600092919082900301818387803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050507335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b03166376088703735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561359057600080fd5b505afa1580156135a4573d6000803e3d6000fd5b505050506040513d60208110156135ba57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018990529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561362757600080fd5b505afa15801561363b573d6000803e3d6000fd5b505050506040513d602081101561365157600080fd5b50516040805163ffffffff851660e01b815260048101939093526001600160a01b0390911660248301523060448301819052606483015260848201859052600060a48301819052905160c48084019382900301818387803b1580156136b557600080fd5b505af1158015611c1c573d6000803e3d6000fd5b60008115806136e4575050808202828282816136e157fe5b04145b61104f57600080fd5b60008183816136f857fe5b049392505050565b60006b033b2e3c9fd0803ce800000061373261371c85856136c9565b60026b033b2e3c9fd0803ce80000005b04614e17565b816136f857fe5b6000670de0b6b3a764000061373261375185856136c9565b6002670de0b6b3a764000061372c565b60008161373261377d856b033b2e3c9fd0803ce80000006136c9565b60028561372c565b6000806137928686610f2b565b90508083106137a9576137a6816001612941565b92505b60007f555344432d41000000000000000000000000000000000000000000000000000086146137d857836137e1565b8364e8d4a51000025b9050735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd88613807846151d0565b60000360006040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b5050604080517f9bb8f838000000000000000000000000000000000000000000000000000000008152600481018b9052306024820152604481018590529051735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f8389250606480830192600092919082900301818387803b1580156138e157600080fd5b505af11580156138f5573d6000803e3d6000fd5b5050604080517fef693bed0000000000000000000000000000000000000000000000000000000081523060048201526024810188905290516001600160a01b038916935063ef693bed9250604480830192600092919082900301818387803b15801561396057600080fd5b505af1158015613974573d6000803e3d6000fd5b505050506001600160a01b038516732f0b23f53734252bda2277357e97e1517d6b042a1415613a8057846001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156139d857600080fd5b505af11580156139ec573d6000803e3d6000fd5b505050506040513d6020811015613a0257600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b505050505b83925050505b949350505050565b6000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae857600080fd5b505afa158015613afc573d6000803e3d6000fd5b505050506040513d6020811015613b1257600080fd5b505190506000613b387335d1b3f3d7966a1dfe207aa4514c12a259a0492b8380886152b9565b905080841115613be857736b175474e89094c44da98b954eedeac495271d0f63a9059cbb84613b678785612941565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d6020811015613be057600080fd5b509093508390505b739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b031663f4b9fa756040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3757600080fd5b505af1158015613c4b573d6000803e3d6000fd5b505050506040513d6020811015613c6157600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a2860048201526024810187905290516001600160a01b039092169163095ea7b39160448082019260009290919082900301818387803b158015613ce057600080fd5b505af1158015613cf4573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a289350633b4da69f9250604480830192600092919082900301818387803b158015613d7357600080fd5b505af1158015613d87573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd876000613dd07335d1b3f3d7966a1dfe207aa4514c12a259a0492b878b6154b5565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613e1457600080fd5b505af11580156121ac573d6000803e3d6000fd5b6000613e3261569f565b6001600160a01b0316826001600160a01b03161415613e5c57506001600160a01b0382163161104f565b816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d6020811015613edc57600080fd5b50519392505050565b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015613f5657600080fd5b505afa158015613f6a573d6000803e3d6000fd5b505050506040513d6020811015613f8057600080fd5b505190506000613f90838361174f565b60408051600480825260a0820190925291925060609190602082016080803883390190505090506000613fd8735ef30b9986345249bc32d8928b7ee64de9435e398c83610bf6565b8b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061407d92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b5051610f2b565b8260008151811061408a57fe5b6020908102919091018101919091528b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905161414e93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b15801561410657600080fd5b505afa15801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b505184518c90869060009061414157fe5b6020026020010151613785565b8260018151811061415b57fe5b6020026020010181815250506141f860405180608001604052808c8560018151811061418357fe5b60200260200101510181526020018d60026006811061419e57fe5b602002015181526020018d6003600681106141b557fe5b602002015181526020018d6005600681106141cc57fe5b602002015190526141dc8b612951565b736b175474e89094c44da98b954eedeac495271d0f8b8b6129c0565b8260028151811061420557fe5b6020026020010181815250506142318260028151811061422157fe5b60200260200101516000836126bf565b8260038151811061423e57fe5b60200260200101818152505060008260038151811061425957fe5b60200260200101518360028151811061426e57fe5b60200260200101510390506143178c60006006811061428957fe5b6020020151735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8f600060200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d602081101561430e57600080fd5b505183856156b7565b8c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290519293506143be92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561438b57600080fd5b505afa15801561439f573d6000803e3d6000fd5b505050506040513d60208110156143b557600080fd5b50518385613a8e565b8b51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516144669291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561443157600080fd5b505afa158015614445573d6000803e3d6000fd5b505050506040513d602081101561445b57600080fd5b50518c8e8b01613785565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63406bb32a8d60006020020151848e8760018151811061449857fe5b602002602001015101876002815181106144ae57fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b15801561451357600080fd5b505af1158015614527573d6000803e3d6000fd5b50505050505050600061453a848461174f565b905081811180614548575080155b6121ac57600080fd5b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b1580156145c257600080fd5b505afa1580156145d6573d6000803e3d6000fd5b505050506040513d60208110156145ec57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561465f57600080fd5b505afa158015614673573d6000803e3d6000fd5b505050506040513d602081101561468957600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b15801561470757600080fd5b505afa15801561471b573d6000803e3d6000fd5b505050506040513d604081101561473157600080fd5b505160408051600580825260c08201909252919250606091906020820160a080388339019050509050600061477b735ef30b9986345249bc32d8928b7ee64de9435e398d83610bf6565b8c51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061482092735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b1580156147ef57600080fd5b505afa158015614803573d6000803e3d6000fd5b505050506040513d602081101561481957600080fd5b5051611ec0565b8260008151811061482d57fe5b6020908102919091018101919091528c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516148ef93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b1580156148a957600080fd5b505afa1580156148bd573d6000803e3d6000fd5b505050506040513d60208110156148d357600080fd5b5051845185906000906148e257fe5b60200260200101516121e8565b826001815181106148fc57fe5b60200260200101818152505061492a8b8360018151811061491957fe5b6020026020010151016000836126bf565b8260028151811061493757fe5b6020026020010181815250508160028151811061495057fe5b60200260200101518b8360018151811061496657fe5b602002602001015101038260038151811061497d57fe5b602002602001018181525050614a186040518060800160405280846003815181106149a457fe5b602002602001015181526020018e6002600681106149be57fe5b602002015181526020018e6003600681106149d557fe5b602002015181526020018e6005600681106149ec57fe5b60200201519052736b175474e89094c44da98b954eedeac495271d0f614a118d612951565b8c8c6129c0565b82600481518110614a2557fe5b6020908102919091010152614a568c600060200201518b84600481518110614a4957fe5b6020026020010151613283565b8b51604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051614afd9291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015614ac957600080fd5b505afa158015614add573d6000803e3d6000fd5b505050506040513d6020811015614af357600080fd5b50518d8a016121e8565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63687710058d60006020020151838e86600181518110614b2f57fe5b60200260200101510186600481518110614b4557fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b158015614baa57600080fd5b505af1158015614bbe573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03881660248201528151600096507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9550632424be5c9450604480830194509091829003018186803b158015614c3e57600080fd5b505afa158015614c52573d6000803e3d6000fd5b505050506040513d6040811015614c6857600080fd5b505190508181116121aa57600080fd5b6000828201838110156126b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d3b57600080fd5b505afa158015614d4f573d6000803e3d6000fd5b505050506040513d6020811015614d6557600080fd5b50519050614d7481848461598f565b505050565b6000614d91846b033b2e3c9fd0803ce80000006136c9565b8210156126b857614dc883614dbb614db5876b033b2e3c9fd0803ce80000006136c9565b85612941565b81614dc257fe5b046151d0565b9050614de0846b033b2e3c9fd0803ce80000006136c9565b614dea82856136c9565b10614df55780613a86565b6001019392505050565b600061104f826b033b2e3c9fd0803ce80000006136c9565b8082018281101561104f57600080fd5b60006001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214614e53578161104f565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919050565b6000808080878160200201516001600160a01b031686886040518082805190602001908083835b60208310614ed257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614e95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f34576040519150601f19603f3d011682016040523d82523d6000602084013e614f39565b606091505b50909150859050600082156151c15760208a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415614f7a573031915061500a565b6020808b0151604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015614fdb57600080fd5b505afa158015614fef573d6000803e3d6000fd5b505050506040513d602081101561500557600080fd5b505191505b60408a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561512e57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b1580156150a757600080fd5b505af11580156150bb573d6000803e3d6000fd5b505050506040513d60208110156150d157600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b15801561510c57600080fd5b505af1158015615120573d6000803e3d6000fd5b5050303192506151c1915050565b6040808b015181517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291516001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561519257600080fd5b505afa1580156151a6573d6000803e3d6000fd5b505050506040513d60208110156151bc57600080fd5b505190505b91999198509650945050505050565b80600081121561134857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e742d6f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b60006126b882846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561528257600080fd5b505af1158015615296573d6000803e3d6000fd5b505050506040513d60208110156152ac57600080fd5b5051601203600a0a6136c9565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561530057600080fd5b505afa158015615314573d6000803e3d6000fd5b505050506040513d60a081101561532a57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561539a57600080fd5b505afa1580156153ae573d6000803e3d6000fd5b505050506040513d60408110156153c457600080fd5b50602090810151604080517f6c25b3460000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529151929450600093918b1692636c25b34692602480840193919291829003018186803b15801561543157600080fd5b505afa158015615445573d6000803e3d6000fd5b505050506040513d602081101561545b57600080fd5b50519050600061546e611fa984866136c9565b90506b033b2e3c9fd0803ce80000008104945080615498866b033b2e3c9fd0803ce80000006136c9565b106154a357846154a8565b846001015b9998505050505050505050565b600080846001600160a01b0316636c25b346856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561550e57600080fd5b505afa158015615522573d6000803e3d6000fd5b505050506040513d602081101561553857600080fd5b5051604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000916001600160a01b0388169163d9638d369160248083019260a0929190829003018186803b1580156155a057600080fd5b505afa1580156155b4573d6000803e3d6000fd5b505050506040513d60a08110156155ca57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0388811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561563a57600080fd5b505afa15801561564e573d6000803e3d6000fd5b505050506040513d604081101561566457600080fd5b50602001519050615677828481614dc257fe5b9350808411156156925761568a816151d0565b600003611faf565b5050506000039392505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6000806157f37335d1b3f3d7966a1dfe207aa4514c12a259a0492b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561572a57600080fd5b505afa15801561573e573d6000803e3d6000fd5b505050506040513d602081101561575457600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018b90529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156157c157600080fd5b505afa1580156157d5573d6000803e3d6000fd5b505050506040513d60208110156157eb57600080fd5b5051886152b9565b9050808411156158af57604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282860360248201529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561587a57600080fd5b505af115801561588e573d6000803e3d6000fd5b505050506040513d60208110156158a457600080fd5b50909150613a869050565b8381036801158e460913d0000081101561598457604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526801158e460913d00000839003602482018190529151736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561594c57600080fd5b505af1158015615960573d6000803e3d6000fd5b505050506040513d602081101561597657600080fd5b505085039250613a86915050565b509295945050505050565b61599761569f565b6001600160a01b0316826001600160a01b03161415615a06576040516001600160a01b038416908290600081818185875af1925050503d80600081146159f9576040519150601f19603f3d011682016040523d82523d6000602084013e6159fe565b606091505b505050614d74565b614d746001600160a01b038316848363ffffffff615a2016565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052614d74908490615aad826001600160a01b0316615cbf565b615b1857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615bd6576040519150601f19603f3d011682016040523d82523d6000602084013e615bdb565b606091505b509150915081615c4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ef57808060200190516020811015615c6857600080fd5b50516114ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d71602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611343575050151592915050565b60405180606001604052806003906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b6040518060c001604052806006906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820d32ab7212aed2f18088ed58bc89562a0438ff554653e4730ce7217e0ef1e46a80029

Deployed Bytecode

0x6080604052600436106102e75760003560e01c8063819854e711610184578063c72c4d10116100d6578063dcfc17051161008a578063ee87255811610064578063ee872558146108de578063f1d2539614610977578063f83524721461098c576102e7565b8063dcfc17051461076b578063e304c6081461085e578063ed202109146108ae576102e7565b8063cfac57c7116100bb578063cfac57c714610717578063d0cc728914610741578063d3661fa514610756576102e7565b8063c72c4d101461072c578063cf786f8f14610545576102e7565b806398ab3d4911610138578063acbeba6111610112578063acbeba61146106ed578063bf42d94714610702578063c11645bc14610717576102e7565b806398ab3d49146106c35780639da779e91461031a578063a46a66c9146106d8576102e7565b80638da5cb5b116101695780638da5cb5b1461068457806394bfbe741461069957806394f0eb3d146106ae576102e7565b8063819854e71461065a578063825ffd921461066f576102e7565b806332ac5cd21161023d578063481c6a75116101f157806362da5d90116101cb57806362da5d90146106305780636738929f146104b85780637e8a776f14610645576102e7565b8063481c6a751461044957806350c86de5146105eb57806351a885c014610600576102e7565b8063380d424411610222578063380d4244146104495780633a1283221461055a5780634115fe6b14610593576102e7565b806332ac5cd21461053057806336569e7714610545576102e7565b806329f7fc9e1161029f5780632e77468d116102795780632e77468d146104b85780632f634a90146104cd57806331d98b3f14610506576102e7565b806329f7fc9e1461045e5780632a4c0a1a146104735780632e67720c14610488576102e7565b8063186cab76116102d0578063186cab761461032f578063197e0ffe146103565780631b2df85014610449576102e7565b8063040141e5146102e95780630bd4a73e1461031a575b005b3480156102f557600080fd5b506102fe6109a1565b604080516001600160a01b039092168252519081900360200190f35b34801561032657600080fd5b506102fe6109b9565b34801561033b57600080fd5b506103446109d1565b60408051918252519081900360200190f35b6102e7600480360361012081101561036d57600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156103d457600080fd5b8201836020820111156103e657600080fd5b8035906020019184600183028401116401000000008311171561040857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109f5945050505050565b34801561045557600080fd5b506102fe610ee3565b34801561046a57600080fd5b506102fe610efb565b34801561047f57600080fd5b506102fe610f13565b34801561049457600080fd5b50610344600480360360408110156104ab57600080fd5b5080359060200135610f2b565b3480156104c457600080fd5b506102fe611055565b3480156104d957600080fd5b506102fe600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561106d565b34801561051257600080fd5b506103446004803603602081101561052957600080fd5b5035611171565b34801561053c57600080fd5b506102fe61134d565b34801561055157600080fd5b506102fe611360565b34801561056657600080fd5b506102e76004803603604081101561057d57600080fd5b506001600160a01b038135169060200135611378565b34801561059f57600080fd5b506105d2600480360360608110156105b657600080fd5b506001600160a01b0381351690602081013590604001356114f6565b6040805192835260208301919091528051918290030190f35b3480156105f757600080fd5b50610344611749565b34801561060c57600080fd5b506103446004803603604081101561062357600080fd5b508035906020013561174f565b34801561063c57600080fd5b506102fe6117b5565b34801561065157600080fd5b506103446117cd565b34801561066657600080fd5b506102fe6117f1565b34801561067b57600080fd5b506102fe611809565b34801561069057600080fd5b506102fe611821565b3480156106a557600080fd5b506102fe611830565b3480156106ba57600080fd5b506102fe611848565b3480156106cf57600080fd5b506102fe611860565b3480156106e457600080fd5b506102fe61186f565b3480156106f957600080fd5b506102fe611887565b34801561070e57600080fd5b506102fe61189f565b34801561072357600080fd5b506102fe6118b7565b34801561073857600080fd5b506102fe6118cf565b34801561074d57600080fd5b506102fe6118de565b34801561076257600080fd5b506102fe6118f6565b6102e7600480360361012081101561078257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156107e957600080fd5b8201836020820111156107fb57600080fd5b8035906020019184600183028401116401000000008311171561081d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061190e945050505050565b34801561086a57600080fd5b506108886004803603602081101561088157600080fd5b5035611c26565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108ba57600080fd5b50610344600480360360408110156108d157600080fd5b5080359060200135611ec0565b3480156108ea57600080fd5b506102e76004803603608081101561090157600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561093857600080fd5b82018360208201111561094a57600080fd5b8035906020019184600183028401116401000000008311171561096c57600080fd5b509092509050611fba565b34801561098357600080fd5b506102fe6121b8565b34801561099857600080fd5b506102fe6121d0565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7389d24a6b4ccb1b6faa2625fe562bdd9a2326035981565b7f4554482d4100000000000000000000000000000000000000000000000000000081565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d6020811015610a9057600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d6020811015610b2d57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d6040811015610bd557600080fd5b505190506000610c00735ef30b9986345249bc32d8928b7ee64de9435e398a835b602002015161106d565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8b8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d6020811015610c8357600080fd5b50519050610c8f615cf8565b8a5160208c0151610ca2919084906121e8565b80825260808c0151610cc09190610cbb908290876126bf565b612941565b6020820152610ccd615d16565b506040805160808101825260208381015182528d830151908201526060808e01519282019290925260a08d015191810191909152610d2a81736b175474e89094c44da98b954eedeac495271d0f610d238e612951565b8d8d6129c0565b604083018190528c51610d3e918d90613283565b303115610d74576040513290303180156108fc02916000818181858888f19350505050158015610d72573d6000803e3d6000fd5b505b8b51825160408085015181517f6877100500000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301919091525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df91636877100591608480830192600092919082900301818387803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018b90526001600160a01b038a1660248201528151600098507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9750632424be5c9650604480830196509294509250829003018186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d6040811015610ec857600080fd5b50519050818111610ed857600080fd5b505050505050505050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600080610f3783611171565b9050600080610f5b735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b9150915060007365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6040811015610fe257600080fd5b50602001519050600061100c61100585610cbb610fff86886136c9565b896136ed565b600a612941565b905060007f555344432d410000000000000000000000000000000000000000000000000000881461103d5781611046565b64e8d4a5100082045b96505050505050505b92915050565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b600080836001600160a01b0316638161b120846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d60208110156110de57600080fd5b5051604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290519192506001600160a01b03831691638da5cb5b91600480820192602092909190829003018186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b5051949350505050565b6000807365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60408110156111f557600080fd5b5060200151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d60a081101561129557600080fd5b5060409081015181517f495d32cb00000000000000000000000000000000000000000000000000000000815291519092506113439161133d9184917365c79fcb50ca1594b025960e539ed7a9a6d434a39163495d32cb91600480820192602092909190829003018186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051613700565b83613700565b925050505b919050565b6eb3f879cb30fe243b4dfee438691c0481565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b031633146113f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c79206f776e657200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611456576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611450573d6000803e3d6000fd5b506114f2565b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b50505b5050565b6000806000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000916001600160a01b03891691632726b073916024808301926020929190829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0380841660248301528251939450600093849391871692632424be5c926044808301939192829003018186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d604081101561168a57600080fd5b508051602090910151604080517fd9638d36000000000000000000000000000000000000000000000000000000008152600481018b905290519294509092506000916001600160a01b0387169163d9638d369160248083019260a0929190829003018186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d60a081101561172657600080fd5b50602001519050826117388383613700565b965096505050505050935093915050565b61019081565b60008061175b83611171565b905060008061177f735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b915091508060001415611798576000935050505061104f565b6117ab6117a58385613739565b82613761565b9695505050505050565b73e4b22d484958e582098a98229a24e8a43801b67481565b7f555344432d41000000000000000000000000000000000000000000000000000081565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b739f8f72aa9304c8b593d555f12ef6589cc3a579a281565b6002546001600160a01b031681565b73ecf88e1cec2d2894a0295db3d86fe7ce4991e6df81565b73862f3dcf1104b8a9468fbb8b843c37c31b41ef0981565b6001546001600160a01b031681565b731b14e8d511c9a4395425314f849bd737baf8208f81565b7319c0976f590d67707e62397c87829d896dc0f1f181565b736c1e2b0f67e00c06c8e2be7dc681ab785163ff4d81565b739759a6ac90977b93b58547b4a71c78317f391a2881565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561197f57600080fd5b505afa158015611993573d6000803e3d6000fd5b505050506040513d60208110156119a957600080fd5b5051905060006119b9838361174f565b905060006119dc735ef30b9986345249bc32d8928b7ee64de9435e398983610bf6565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8a8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b50519050611a6b615cf8565b895160208b0151611a80919084908c90613785565b8152611a8a615d16565b5060408051608081018252825181528b82015160208201526060808d01519282019290925260a08c015191810191909152611ae481611ac88c612951565b736b175474e89094c44da98b954eedeac495271d0f8c8c6129c0565b6020830181905260808c0151611b019190610cbb908290886126bf565b604083018190528b51611b1691859087613a8e565b303115611b4c576040513290303180156108fc02916000818181858888f19350505050158015611b4a573d6000803e3d6000fd5b505b8a5182516020840151604080517f406bb32a00000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df9163406bb32a91608480830192600092919082900301818387803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b50505050505050506000611c05848461174f565b905081811180611c13575080155b611c1c57600080fd5b5050505050505050565b6000806000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8657600080fd5b505afa158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b5051604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018990529051919250735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6020811015611d4b57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b038416602482015281519294507335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c92604480840193919291829003018186803b158015611dc857600080fd5b505afa158015611ddc573d6000803e3d6000fd5b505050506040513d6040811015611df257600080fd5b508051602090910151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519297509095506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d60a0811015611e9957600080fd5b50602001519050611eaa8582613700565b9450611eb583611171565b935050509193509193565b600080611ecc83611171565b604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905281519293506000927365c79fcb50ca1594b025960e539ed7a9a6d434a39263d9638d369260248082019391829003018186803b158015611f3957600080fd5b505afa158015611f4d573d6000803e3d6000fd5b505050506040513d6040811015611f6357600080fd5b50602001519050600080611f8c735ef30b9986345249bc32d8928b7ee64de9435e3988886114f6565b91509150611faf611005611fa9611fa385886136c9565b866136ed565b83612941565b979650505050505050565b611fc43086613e28565b84111561203257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604482015290519081900360640190fd5b61203a615d34565b60008060606000868661014081101561205257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156120b957600080fd5b8201836020820111156120cb57600080fd5b803590602001918460018302840111640100000000831117156120ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250989d50969b509499509750351580159650945061214f93505050505761214a858a8686868d613ee5565b61215d565b61215d858a8686868d614551565b6121768a6121718b8b63ffffffff614c7816565b614cec565b3031156121ac576040513290303180156108fc02916000818181858888f193505050501580156121aa573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b73c73e0383f3aff3215e6f04b0331d58cecf0ab84981565b6000807319c0976f590d67707e62397c87829d896dc0f1f16001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b34691735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50516040805163ffffffff841660e01b81526001600160a01b039092166004830152516024808301926020929190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b5051905060006123a48787611ec0565b90508085106123bb576123b8816001612941565b94505b735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd8860006123e3898888614d79565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db6883061246d89614dff565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156124c357600080fd5b505af11580156124d7573d6000803e3d6000fd5b5050604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9350634538c4eb92506044808301926020929190829003018186803b15801561255f57600080fd5b505afa158015612573573d6000803e3d6000fd5b505050506040513d602081101561258957600080fd5b505161262757604080517fa3b22fc4000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505b604080517fef693bed000000000000000000000000000000000000000000000000000000008152306004820152602481018790529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050508493505050505b9392505050565b604080517fb371deac0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152905160009161019091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50511561280c57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190505b80156128215780858161281b57fe5b04612824565b60005b915083156128735760006128577f4554482d41000000000000000000000000000000000000000000000000000000611171565b90506128638582613700565b945061286f8386614e17565b9250505b60058504821115612885576005850491505b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e086004820152602481018490529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b505050506040513d602081101561293657600080fd5b509195945050505050565b8082038281111561104f57600080fd5b6000816001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d60208110156129b857600080fd5b505192915050565b60008060006129cd615d52565b8851602082015260006129df89614e27565b98506129ea88614e27565b97506129f4615cf8565b50604080516060810182526001600160a01b0389811682528b811660208301528a1681830152908b015160041415612b8d5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612afb576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b505050506040513d6020811015612af857600080fd5b50505b612b10818830318e60005b6020020151614e6e565b5084529150818015612b225750825115155b612b8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8251613274578a516020820151604080840151818f015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6040811015612c5457600080fd5b508051602091820151918d0151909650909450841180612c7b575060208b015160608c0151115b612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b60608b01518411612ddf5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612dc6576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612d9957600080fd5b505af1158015612dad573d6000803e3d6000fd5b505050506040513d6020811015612dc357600080fd5b50505b612dd5818830318e6000612b06565b6020860152845291505b602083015115613274578a51602084015114612ec857602080840151908201516040808401518e82015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d6040811015612eb957600080fd5b50805160209091015190955093505b60208b01518411612f3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b60208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561303457602083015160408083015181517f43ac1dc6000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0391821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251600094928a16936343ac1dc693926064808201939182900301818588803b158015612ffc57600080fd5b505af1158015613010573d6000803e3d6000fd5b50505050506040513d604081101561302757600080fd5b5051845101845250613274565b60208082015184820151604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505050506040513d60208110156130d157600080fd5b505060408101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131c85760208082015184820151604080517f3bba21dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191881692633bba21dc926064808401938290030181600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b50518351018352613274565b6020808201516040808401518684015182517f13712c9f0000000000000000000000000000000000000000000000000000000081526001600160a01b039485166004820152918416602483015260448201529051918816926313712c9f926064808401938290030181600087803b15801561324257600080fd5b505af1158015613256573d6000803e3d6000fd5b505050506040513d602081101561326c57600080fd5b505183510183525b50505198975050505050505050565b60006001600160a01b038316732f0b23f53734252bda2277357e97e1517d6b042a141561339757826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b5051604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163d0e30db0918591600480830192600092919082900301818588803b15801561336e57600080fd5b505af1158015613382573d6000803e3d6000fd5b5050505050613390826151d0565b90506133ac565b6133a96133a48484615241565b6151d0565b90505b826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156133e757600080fd5b505af11580156133fb573d6000803e3d6000fd5b505050506040513d602081101561341157600080fd5b5051604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561347e57600080fd5b505af1158015613492573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081523060048201526024810186905290516001600160a01b0387169350633b4da69f9250604480830192600092919082900301818387803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050507335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b03166376088703735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561359057600080fd5b505afa1580156135a4573d6000803e3d6000fd5b505050506040513d60208110156135ba57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018990529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561362757600080fd5b505afa15801561363b573d6000803e3d6000fd5b505050506040513d602081101561365157600080fd5b50516040805163ffffffff851660e01b815260048101939093526001600160a01b0390911660248301523060448301819052606483015260848201859052600060a48301819052905160c48084019382900301818387803b1580156136b557600080fd5b505af1158015611c1c573d6000803e3d6000fd5b60008115806136e4575050808202828282816136e157fe5b04145b61104f57600080fd5b60008183816136f857fe5b049392505050565b60006b033b2e3c9fd0803ce800000061373261371c85856136c9565b60026b033b2e3c9fd0803ce80000005b04614e17565b816136f857fe5b6000670de0b6b3a764000061373261375185856136c9565b6002670de0b6b3a764000061372c565b60008161373261377d856b033b2e3c9fd0803ce80000006136c9565b60028561372c565b6000806137928686610f2b565b90508083106137a9576137a6816001612941565b92505b60007f555344432d41000000000000000000000000000000000000000000000000000086146137d857836137e1565b8364e8d4a51000025b9050735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd88613807846151d0565b60000360006040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b5050604080517f9bb8f838000000000000000000000000000000000000000000000000000000008152600481018b9052306024820152604481018590529051735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f8389250606480830192600092919082900301818387803b1580156138e157600080fd5b505af11580156138f5573d6000803e3d6000fd5b5050604080517fef693bed0000000000000000000000000000000000000000000000000000000081523060048201526024810188905290516001600160a01b038916935063ef693bed9250604480830192600092919082900301818387803b15801561396057600080fd5b505af1158015613974573d6000803e3d6000fd5b505050506001600160a01b038516732f0b23f53734252bda2277357e97e1517d6b042a1415613a8057846001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156139d857600080fd5b505af11580156139ec573d6000803e3d6000fd5b505050506040513d6020811015613a0257600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b505050505b83925050505b949350505050565b6000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae857600080fd5b505afa158015613afc573d6000803e3d6000fd5b505050506040513d6020811015613b1257600080fd5b505190506000613b387335d1b3f3d7966a1dfe207aa4514c12a259a0492b8380886152b9565b905080841115613be857736b175474e89094c44da98b954eedeac495271d0f63a9059cbb84613b678785612941565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d6020811015613be057600080fd5b509093508390505b739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b031663f4b9fa756040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3757600080fd5b505af1158015613c4b573d6000803e3d6000fd5b505050506040513d6020811015613c6157600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a2860048201526024810187905290516001600160a01b039092169163095ea7b39160448082019260009290919082900301818387803b158015613ce057600080fd5b505af1158015613cf4573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a289350633b4da69f9250604480830192600092919082900301818387803b158015613d7357600080fd5b505af1158015613d87573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd876000613dd07335d1b3f3d7966a1dfe207aa4514c12a259a0492b878b6154b5565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613e1457600080fd5b505af11580156121ac573d6000803e3d6000fd5b6000613e3261569f565b6001600160a01b0316826001600160a01b03161415613e5c57506001600160a01b0382163161104f565b816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d6020811015613edc57600080fd5b50519392505050565b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015613f5657600080fd5b505afa158015613f6a573d6000803e3d6000fd5b505050506040513d6020811015613f8057600080fd5b505190506000613f90838361174f565b60408051600480825260a0820190925291925060609190602082016080803883390190505090506000613fd8735ef30b9986345249bc32d8928b7ee64de9435e398c83610bf6565b8b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061407d92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b5051610f2b565b8260008151811061408a57fe5b6020908102919091018101919091528b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905161414e93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b15801561410657600080fd5b505afa15801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b505184518c90869060009061414157fe5b6020026020010151613785565b8260018151811061415b57fe5b6020026020010181815250506141f860405180608001604052808c8560018151811061418357fe5b60200260200101510181526020018d60026006811061419e57fe5b602002015181526020018d6003600681106141b557fe5b602002015181526020018d6005600681106141cc57fe5b602002015190526141dc8b612951565b736b175474e89094c44da98b954eedeac495271d0f8b8b6129c0565b8260028151811061420557fe5b6020026020010181815250506142318260028151811061422157fe5b60200260200101516000836126bf565b8260038151811061423e57fe5b60200260200101818152505060008260038151811061425957fe5b60200260200101518360028151811061426e57fe5b60200260200101510390506143178c60006006811061428957fe5b6020020151735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8f600060200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d602081101561430e57600080fd5b505183856156b7565b8c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290519293506143be92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561438b57600080fd5b505afa15801561439f573d6000803e3d6000fd5b505050506040513d60208110156143b557600080fd5b50518385613a8e565b8b51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516144669291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561443157600080fd5b505afa158015614445573d6000803e3d6000fd5b505050506040513d602081101561445b57600080fd5b50518c8e8b01613785565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63406bb32a8d60006020020151848e8760018151811061449857fe5b602002602001015101876002815181106144ae57fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b15801561451357600080fd5b505af1158015614527573d6000803e3d6000fd5b50505050505050600061453a848461174f565b905081811180614548575080155b6121ac57600080fd5b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b1580156145c257600080fd5b505afa1580156145d6573d6000803e3d6000fd5b505050506040513d60208110156145ec57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561465f57600080fd5b505afa158015614673573d6000803e3d6000fd5b505050506040513d602081101561468957600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b15801561470757600080fd5b505afa15801561471b573d6000803e3d6000fd5b505050506040513d604081101561473157600080fd5b505160408051600580825260c08201909252919250606091906020820160a080388339019050509050600061477b735ef30b9986345249bc32d8928b7ee64de9435e398d83610bf6565b8c51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061482092735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b1580156147ef57600080fd5b505afa158015614803573d6000803e3d6000fd5b505050506040513d602081101561481957600080fd5b5051611ec0565b8260008151811061482d57fe5b6020908102919091018101919091528c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516148ef93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b1580156148a957600080fd5b505afa1580156148bd573d6000803e3d6000fd5b505050506040513d60208110156148d357600080fd5b5051845185906000906148e257fe5b60200260200101516121e8565b826001815181106148fc57fe5b60200260200101818152505061492a8b8360018151811061491957fe5b6020026020010151016000836126bf565b8260028151811061493757fe5b6020026020010181815250508160028151811061495057fe5b60200260200101518b8360018151811061496657fe5b602002602001015101038260038151811061497d57fe5b602002602001018181525050614a186040518060800160405280846003815181106149a457fe5b602002602001015181526020018e6002600681106149be57fe5b602002015181526020018e6003600681106149d557fe5b602002015181526020018e6005600681106149ec57fe5b60200201519052736b175474e89094c44da98b954eedeac495271d0f614a118d612951565b8c8c6129c0565b82600481518110614a2557fe5b6020908102919091010152614a568c600060200201518b84600481518110614a4957fe5b6020026020010151613283565b8b51604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051614afd9291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015614ac957600080fd5b505afa158015614add573d6000803e3d6000fd5b505050506040513d6020811015614af357600080fd5b50518d8a016121e8565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63687710058d60006020020151838e86600181518110614b2f57fe5b60200260200101510186600481518110614b4557fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b158015614baa57600080fd5b505af1158015614bbe573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03881660248201528151600096507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9550632424be5c9450604480830194509091829003018186803b158015614c3e57600080fd5b505afa158015614c52573d6000803e3d6000fd5b505050506040513d6040811015614c6857600080fd5b505190508181116121aa57600080fd5b6000828201838110156126b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d3b57600080fd5b505afa158015614d4f573d6000803e3d6000fd5b505050506040513d6020811015614d6557600080fd5b50519050614d7481848461598f565b505050565b6000614d91846b033b2e3c9fd0803ce80000006136c9565b8210156126b857614dc883614dbb614db5876b033b2e3c9fd0803ce80000006136c9565b85612941565b81614dc257fe5b046151d0565b9050614de0846b033b2e3c9fd0803ce80000006136c9565b614dea82856136c9565b10614df55780613a86565b6001019392505050565b600061104f826b033b2e3c9fd0803ce80000006136c9565b8082018281101561104f57600080fd5b60006001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214614e53578161104f565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919050565b6000808080878160200201516001600160a01b031686886040518082805190602001908083835b60208310614ed257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614e95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f34576040519150601f19603f3d011682016040523d82523d6000602084013e614f39565b606091505b50909150859050600082156151c15760208a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415614f7a573031915061500a565b6020808b0151604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015614fdb57600080fd5b505afa158015614fef573d6000803e3d6000fd5b505050506040513d602081101561500557600080fd5b505191505b60408a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561512e57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b1580156150a757600080fd5b505af11580156150bb573d6000803e3d6000fd5b505050506040513d60208110156150d157600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b15801561510c57600080fd5b505af1158015615120573d6000803e3d6000fd5b5050303192506151c1915050565b6040808b015181517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291516001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561519257600080fd5b505afa1580156151a6573d6000803e3d6000fd5b505050506040513d60208110156151bc57600080fd5b505190505b91999198509650945050505050565b80600081121561134857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e742d6f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b60006126b882846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561528257600080fd5b505af1158015615296573d6000803e3d6000fd5b505050506040513d60208110156152ac57600080fd5b5051601203600a0a6136c9565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561530057600080fd5b505afa158015615314573d6000803e3d6000fd5b505050506040513d60a081101561532a57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561539a57600080fd5b505afa1580156153ae573d6000803e3d6000fd5b505050506040513d60408110156153c457600080fd5b50602090810151604080517f6c25b3460000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529151929450600093918b1692636c25b34692602480840193919291829003018186803b15801561543157600080fd5b505afa158015615445573d6000803e3d6000fd5b505050506040513d602081101561545b57600080fd5b50519050600061546e611fa984866136c9565b90506b033b2e3c9fd0803ce80000008104945080615498866b033b2e3c9fd0803ce80000006136c9565b106154a357846154a8565b846001015b9998505050505050505050565b600080846001600160a01b0316636c25b346856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561550e57600080fd5b505afa158015615522573d6000803e3d6000fd5b505050506040513d602081101561553857600080fd5b5051604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000916001600160a01b0388169163d9638d369160248083019260a0929190829003018186803b1580156155a057600080fd5b505afa1580156155b4573d6000803e3d6000fd5b505050506040513d60a08110156155ca57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0388811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561563a57600080fd5b505afa15801561564e573d6000803e3d6000fd5b505050506040513d604081101561566457600080fd5b50602001519050615677828481614dc257fe5b9350808411156156925761568a816151d0565b600003611faf565b5050506000039392505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6000806157f37335d1b3f3d7966a1dfe207aa4514c12a259a0492b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561572a57600080fd5b505afa15801561573e573d6000803e3d6000fd5b505050506040513d602081101561575457600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018b90529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156157c157600080fd5b505afa1580156157d5573d6000803e3d6000fd5b505050506040513d60208110156157eb57600080fd5b5051886152b9565b9050808411156158af57604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282860360248201529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561587a57600080fd5b505af115801561588e573d6000803e3d6000fd5b505050506040513d60208110156158a457600080fd5b50909150613a869050565b8381036801158e460913d0000081101561598457604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526801158e460913d00000839003602482018190529151736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561594c57600080fd5b505af1158015615960573d6000803e3d6000fd5b505050506040513d602081101561597657600080fd5b505085039250613a86915050565b509295945050505050565b61599761569f565b6001600160a01b0316826001600160a01b03161415615a06576040516001600160a01b038416908290600081818185875af1925050503d80600081146159f9576040519150601f19603f3d011682016040523d82523d6000602084013e6159fe565b606091505b505050614d74565b614d746001600160a01b038316848363ffffffff615a2016565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052614d74908490615aad826001600160a01b0316615cbf565b615b1857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615bd6576040519150601f19603f3d011682016040523d82523d6000602084013e615bdb565b606091505b509150915081615c4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ef57808060200190516020811015615c6857600080fd5b50516114ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d71602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611343575050151592915050565b60405180606001604052806003906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b6040518060c001604052806006906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820d32ab7212aed2f18088ed58bc89562a0438ff554653e4730ce7217e0ef1e46a80029

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.