Contract

0x9B2710F85ED4338E26A69481761F5fb8715A8715

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...20641912024-12-31 7:43:2847 hrs ago1735631008IN
0x9B2710F8...8715A8715
0 S0.000031811.1

Latest 1 internal transaction

Parent Transaction Hash Block From To
22150342025-01-02 1:35:095 hrs ago1735781709
0x9B2710F8...8715A8715
 Contract Creation0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FairPresaleDapp

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1 runs

Other Settings:
london EvmVersion, MIT license
File 1 of 1 : presaleDappFair.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
//pragma experimental ABIEncoderV2;
//import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol";



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {

    function decimals() external view returns(uint8);


    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns(uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns(uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns(bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns(uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns(bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns(bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface ERC20 {

    function name() external pure returns(string memory);

    function symbol() external pure returns(string memory);

    function transfer(address to, uint256 value) external returns(bool);

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

    function transferFrom(address from, address to, uint256 value) external returns(bool);

    function totalSupply() external view returns(uint256);

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

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

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

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



/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

    /**
     * @dev Multiplies two numbers, throws on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns(uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
     * @dev Integer division of two numbers, truncating the quotient.
     */
    function div(uint256 a, uint256 b) internal pure returns(uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /**
     * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns(uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
     * @dev Adds two numbers, throws on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns(uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;
    address public voter;

    event OwnershipRenounced(address indexed previousOwner);
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyVoter() {
        require(msg.sender == voter);
        _;
    }
    /**
     * @dev Allows the current owner to relinquish control of the contract.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address _newOwner) public onlyOwner {
        _transferOwnership(_newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address _newOwner) internal {
        require(_newOwner != address(0));
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}

interface LPToken {

    function sync() external;

}
// pragma solidity >=0.5.0;

interface UniswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);


    function getPair(address tokenA, address tokenB) external view returns(address pair);


    function createPair(address tokenA, address tokenB) external returns(address pair);


}


// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns(string memory);

    function symbol() external pure returns(string memory);

    function decimals() external pure returns(uint8);

    function totalSupply() external view returns(uint);

    function balanceOf(address owner) external view returns(uint);

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

    function approve(address spender, uint value) external returns(bool);

    function transfer(address to, uint value) external returns(bool);

    function transferFrom(address from, address to, uint value) external returns(bool);


}

// pragma solidity >=0.6.2;

interface UniswapRouter02 {
    function factory() external pure returns(address);

    function WETH() external pure returns(address);
    function WBNB() external pure returns(address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns(uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns(uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns(uint amountToken, uint amountETH, uint liquidity);



    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns(uint[] memory amounts);
    function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns(uint[] memory amounts);




   // function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns(uint amountOut);

   // function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns(uint amountIn);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns(uint[] memory amounts);

    function getAmountsIn(uint amountOut, address[] calldata path) external view returns(uint[] memory amounts);
}









interface lpLockDeployerInterface {

    function createLPLocker(address _lockingToken, uint256 _lockerEndTimeStamp, string memory _logo, uint256 _lockingAmount) external payable returns (address);


}
contract Consts {
    uint constant TOKEN_DECIMALS = 18;
    uint8 constant TOKEN_DECIMALS_UINT8 = 18;
    uint constant TOKEN_DECIMAL_MULTIPLIER = 10 ** TOKEN_DECIMALS;
    bool constant CONTINUE_MINTING = false;
    uint256 constant minPlatTokenReq = 1000 * TOKEN_DECIMAL_MULTIPLIER;
    uint256 constant airdropTokenPercentage = 2;
}

contract DefiFairCrowdsale is Consts, Ownable

    

{
    event TokenPurchase(
        address indexed purchaser,
        address indexed beneficiary,
        uint256 value,
        uint256 amount
    );
    event Closed();
    event RefundsEnabled();
    event Refunded(address indexed beneficiary, uint256 weiAmount);
    event claimedBack(address indexed beneficiary, uint256 weiAmount);
    event Finalized();
    string public presaleType = "FAIRLAUNCH";
    using SafeMath for uint256;
    mapping(address => uint256) public contributors;
    mapping(address => uint256) public contributorsTracker;
    mapping(address => uint256) public contributorsClaim;
    mapping(address => uint256) public contributorsRefundAnytime;
    mapping(address => uint256) public contributorsPayoutNumber;    
    mapping(uint256 => address) public contributorsAddressTracker;
    mapping(address => bool) public contributed;
    mapping(address => bool) public anytimeRefunded;
    mapping(address => bool) public whitelist;

    bool public whitelistEnabled;
    uint256 public contributorCount;
    uint256 public AddWhitelistNumber;
    uint256 public RemoveWhitelistNumber;
    mapping(uint256 => address) public AddWhitelistTracker;
    //mapping(uint256 => address) public RemoveWhitelistTracker;
    address[] public AddWhitelistTrackerArray;
    //address[] public RemoveWhitelistTrackerArray;
    uint256 public presaleGoalReachedTime = 0;
    //event Initialized();
    //event TimesChanged(uint startTime, uint endTime, uint oldStartTime, uint oldEndTime);
    //bool public initialized = false;
    //bool public Preaslefinalized = false;
    uint256 public buyRate;
    uint teamFeePer = 2; // team fees percentage
    uint256 public nativeMultiplier = 20;
    uint256[2] __min_max_eth;
    uint256 public soft_cap;
    //uint256 public hard_cap;
    uint256 public startTime;
    uint256 public endTime;
    uint256 public weiRaised;
    uint256 public whitelistCoolOff = 600;
    uint256 public finalizeTimeout = 600; //604800;  //time for presale owner to finalize
    address public token;
    uint256 public disabledWhitelistTime;
    bool public whitelistDisabledInitiated;
    bool public isFinalized;
    bool public finalizeValid;
    bool public vestingEnabled;
    bool public refundEnabled;
    bool public alternateFee;
    uint256 public MaxAllowedContribution;
    uint256 public numberOfVest;
    uint256 public finalizedTime;
    uint256 public vestingPeriod;
    uint256 public uniswapPercentage;
    uint256 public presaleAmount;
    uint256 public uniAmount;
    uint256 public totalTokenRequired;
    uint256 public extraAmountPerVal;
    address public presaleCreator;
    address public feeContract;
    address public referrerAddr;
   // address public uniswapDapAddress;
    // address[] teamAddresses;
    // uint256[] teamAmounts;
    // uint256[] teamFreezeTimes;
    //uint256 totalTeamTokensMinted;

    constructor(address _token, uint256[2] memory _presaleUniAmount, uint256[2] memory start_end_time, address[2] memory targetWallets, uint256[3] memory _soft_cap_min_max_eth, uint[2] memory _UniPercentage_teamFeePer, uint256[3] memory _extraAmountPer_lockTime_nativeMul, address[2] memory _lpLockDepAndRouter,address[3] memory _altAssets)



    //Crowdsale(_rate, targetWallets[0], ERC20(token), _min_max_eth[1])
    //TimedCrowdsale(start_end_time[0] > now ? start_end_time[0] : now, start_end_time[1])
    //CappedCrowdsale(soft_hard_cap[1] * TOKEN_DECIMAL_MULTIPLIER)

    //RefundableCrowdsale(soft_hard_cap[0] * TOKEN_DECIMAL_MULTIPLIER, teamFees, _UniPercentage, targetWallets[1])

    {
        //  require((_govUniPercentage[0] >= 0) && (_govUniPercentage[0] <= 100), "Governance amount is outside of governance limits");
        
        __min_max_eth = [_soft_cap_min_max_eth[1],_soft_cap_min_max_eth[2]];
        soft_cap = _soft_cap_min_max_eth[0];
       // hard_cap = soft_hard_cap[1] * TOKEN_DECIMAL_MULTIPLIER;
        startTime = start_end_time[0];
        endTime = start_end_time[1];
        token = _token;
        MaxAllowedContribution = _soft_cap_min_max_eth[2];
        presaleCreator = targetWallets[0];
        feeContract = targetWallets[1];
        teamFeePer = _UniPercentage_teamFeePer[1];
        uniswapPercentage = _UniPercentage_teamFeePer[0];
        presaleAmount = _presaleUniAmount[0];
        uniAmount = _presaleUniAmount[1];
        totalTokenRequired = (presaleAmount + uniAmount) * (teamFeePer + 100) /100;
        extraAmountPerVal = _extraAmountPer_lockTime_nativeMul[0] + 100;
        locktime = _extraAmountPer_lockTime_nativeMul[1];
        nativeMultiplier = _extraAmountPer_lockTime_nativeMul[2];
        lpLockDeployer = _lpLockDepAndRouter[0];
        ROUTER_ADDRESS = _lpLockDepAndRouter[1];
        altAssets = _altAssets;
        for(uint256 i=0;i<_altAssets.length;i++){

            validPairPartner[altAssets[i]] = true;

        }  
    }



/*
    function checkContributorValidity(address contributor_addr) public view returns(uint256) {

        return contributors[contributor_addr];

    }
*/

    function checkRate() public view returns(uint256) {

        return buyRate;

    }

    function minEthContribution() public view returns(uint256) {

        return __min_max_eth[0];

    }

    function maxEthContribution() public view returns(uint256) {

        return __min_max_eth[1];

    }



    function presaleStartTime() public view returns(uint256) {

        return startTime;

    }

    function presaleEndTime() public view returns(uint256) {

        return endTime;

    }
/*
    function mintForPlatform(address _platAddrs) public onlyOwner {
        require(_platAddrs != address(0), "platform addr cant be zero");
        uint256 platFee = (presaleAmount*teamFeePer)/100;
        ERC20(token).transfer(_platAddrs, platFee);
    }

    function mintForUniswap(address uniswapDep) public onlyOwner {

        require(uniswapDep != address(0x0),"uniswapDep addr cannot be zero");
        require(ERC20(token).transfer(uniswapDep, (uniAmount*extraAmountPerVal)/100),"unable to mint for uniDep from presale");
    }
*/


    //   function resetUserEthAmount(address contributor_addr) onlyOwner public {

    //    contributors[contributor_addr] = 0;


    //}




    /**
     * @dev override hasClosed to add minimal value logic
     * @return true if remained to achieve less than minimal
     */
    function hasClosed() public view returns(bool) {
        //bool remainValue = (hard_cap - weiRaised) < __min_max_eth[0];
        return (block.timestamp > endTime);// || remainValue;
    }



    function CheckSoftCap() public view returns(uint256) {

        return soft_cap;
    }
/*
    function CheckHardCap() public view returns(uint256) {

        return hard_cap;
    }
*/

    function CheckTotalEthRaised() public view returns(uint256) {

        return weiRaised;
    }




    /*
     * @dev override purchase validation to add extra value logic.
     * @return true if sended more than minimal value
     */
    function _preValidatePurchase(
        address _beneficiary,
        uint256 _weiAmount
    )
    internal {

        require(msg.value >= __min_max_eth[0]);
        // require(msg.value >= 0);

        require(msg.value <= (__min_max_eth[1])); // it should be 10% in mainnet launch ***********************
        // require(msg.value <= 1000000000000000000);
       // require((weiRaised + _weiAmount) <= hard_cap,"contribution reaching over hcap");
        require(_beneficiary != address(0));
        require(_weiAmount != 0);

    }



    function addToWhitelist(address WhitelistAddress) public onlyOwner {

    //    require(!whitelist[WhitelistAddress], "already whitelisted");
        whitelist[WhitelistAddress] = true;
        AddWhitelistTracker[AddWhitelistNumber] = WhitelistAddress;
        AddWhitelistNumber++;


    }


    function removeFromWhitelist(address WhitelistAddress) public onlyOwner {

        require(whitelist[WhitelistAddress], "not in whitelist!");
        whitelist[WhitelistAddress] = false;
        //RemoveWhitelistTracker[RemoveWhitelistNumber] = WhitelistAddress;
        RemoveWhitelistNumber++;

    }


    function enableWhitelist() public onlyOwner {

        require(!whitelistEnabled, "whitelist already enabled");
        whitelistEnabled = true;


    }


    function disableWhitelist() public onlyOwner {

        require(whitelistEnabled, "whitelist already disabled");
        whitelistEnabled = false;
        disabledWhitelistTime = block.timestamp + whitelistCoolOff;
        whitelistDisabledInitiated = true;
    }


    function getAddlist() public view returns(address[] memory){

        address[] memory AddList = new address[](AddWhitelistNumber);  
        for (uint256 i = 0; i < AddWhitelistNumber; i++) {

            if(whitelist[AddWhitelistTracker[i]]){
                AddList[i] = AddWhitelistTracker[i];
            }
            else {

                AddList[i] = address(0x0);                
            }


        }

    return AddList;

    }
/*
    function getRemovelist() public view returns(address[] memory) {

        address[] memory RemoveList = new address[](RemoveWhitelistNumber); 
        for (uint256 i = 0; i < RemoveWhitelistNumber; i++) {

            RemoveList[i] = RemoveWhitelistTracker[i];


        }

    return RemoveList;
    

    }
    */
/*
    function getPresaleDataAddr() view returns(address[] memory, uint256[7] memory) {

        address[] memory PresaleDataAddr = new address[](AddWhitelistNumber); 
        for (uint256 i = 0; i < AddWhitelistNumber; i++) {

            PresaleDataAddr[i] = AddWhitelistTracker[i];  //******************************************** NEED UPDATE TO ADD CORRECT ADDRESS DATA***************************************************


        }

    return (PresaleDataAddr,getPresaleDataUint());
    

    }
*/    
    function getPresaleData() public view returns(uint256[10] memory,bool[4] memory, string memory) {


            uint256[10] memory PresaleDataUint;
            bool[4] memory presaleDataBool;
           PresaleDataUint = [soft_cap,presaleAmount,__min_max_eth[0],__min_max_eth[1],startTime,endTime,weiRaised,buyRate,uniAmount,uniswapPercentage];
           presaleDataBool = [isFinalized,finalizeValid,vestingEnabled,refundEnabled];


    return (PresaleDataUint,presaleDataBool,presaleType);
    

    }

        function getContributorData() public view returns(address[] memory,uint256[] memory) {

           // address[] memory WalletList = new address[](KYCsverifiedNumber);  
            address[] memory contributorAddresses = new address[](contributorCount);
            uint256[] memory contributedValues = new uint256[](contributorCount);
            for (uint256 i = 0; i < contributorCount;i++){

                contributorAddresses[i] = contributorsAddressTracker[i];
                contributedValues[i] = contributors[contributorsAddressTracker[i]];

            }



    return (contributorAddresses,contributedValues);
    

    }

    /**
     * @dev fallback function ***DO NOT OVERRIDE***
     */
    receive() external payable {

        require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off");
        require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime

        if (whitelistEnabled) {

            require(whitelist[msg.sender], "user not whitelisted");

        }
        require(contributors[msg.sender] <= (MaxAllowedContribution - msg.value),"contribution over max allowed");
        buyTokens(msg.sender);
        contributors[msg.sender] += msg.value;
        contributorsTracker[msg.sender] += msg.value;
        if(!contributed[msg.sender]){
            contributorsAddressTracker[contributorCount] = msg.sender;
            contributed[msg.sender] = true;
            contributorCount++;
        }
    }


    /**
     * @dev low level token purchase ***DO NOT OVERRIDE***
     * @param _beneficiary Address performing the token purchase
     */
    function buyTokens(address _beneficiary) internal {
        require(msg.sender == tx.origin,"can't contribute via contracts");
        require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off");
        require (block.timestamp >= startTime && block.timestamp < endTime,"presale not active");
        require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime
        if (whitelistEnabled) {

            require(whitelist[msg.sender], "user not whitelisted");

        }
        uint256 weiAmount = msg.value;
        _preValidatePurchase(_beneficiary, weiAmount);

        // calculate token amount to be created
        uint256 tokens = _getTokenAmount(weiAmount);

        // update state
        weiRaised += weiAmount;

        //_processPurchase(_beneficiary, tokens);
        emit TokenPurchase(
            msg.sender,
            _beneficiary,
            weiAmount,
            tokens
        );

       // _updatePurchasingState(_beneficiary, weiAmount);

        //_forwardFunds();
        //_postValidatePurchase(_beneficiary, weiAmount);



    }

    function _getTokenAmount(uint256 _weiAmount)
    internal view returns(uint256) {
        return _weiAmount*buyRate/(1 ether);
        // return _weiAmount.mul(rate);
    }


    function claimTokens() public {
        require(!refundEnabled,"presale was refunded");
        require(!vestingEnabled,"please use vesting method to claim");
        require(isFinalized, "Not Finalized yet!");
        require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not
        require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!");
        uint256 tokenValue = (uint256(contributors[msg.sender]).mul(uint256(buyRate))).div(1 ether);
        // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether);
        contributors[msg.sender] = 0;
        ERC20(token).transfer(msg.sender, tokenValue);
        contributorsClaim[msg.sender] = tokenValue;

    }

    function vestToken() public {
        // require(!tokenDropFlag,"can't vest when token drop enabled!");
        require(!refundEnabled,"presale was refunded");       
        require(vestingEnabled,"vesting not enabled");
        require(isFinalized, "Not Finalized yet!");
        require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not
        require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!");       
        require(contributorsPayoutNumber[msg.sender] < numberOfVest,"all tokens vested");
        uint256 CurrentPayoutRounds = (((block.timestamp).sub(finalizedTime)).div(vestingPeriod)).add(1);  // need to add 1 to allow partial token vest right away after presale
         if (CurrentPayoutRounds >= numberOfVest){
            CurrentPayoutRounds = numberOfVest;
        }
      
        uint256 userPayoutRounds = CurrentPayoutRounds.sub(contributorsPayoutNumber[msg.sender]);
        require(userPayoutRounds > 0 && userPayoutRounds <= numberOfVest,"not in user claim window");

        contributorsPayoutNumber[msg.sender] = CurrentPayoutRounds;
        
        uint256 tokenValue = (((uint256(contributorsTracker[msg.sender]).mul(uint256(buyRate))).div(1 ether)).mul(userPayoutRounds)).div(numberOfVest);
        // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether);
        uint256 totalTokensLeftForUser = (uint256(contributors[msg.sender]).mul(uint256(buyRate))).div(1 ether);
        require(tokenValue <= totalTokensLeftForUser,"can't claim more than allowed");
        uint256 contributionsClaiming = contributorsTracker[msg.sender].mul(userPayoutRounds).div(numberOfVest);
        if(contributionsClaiming >= contributors[msg.sender]){
            contributors[msg.sender] = 0;
        }
        else{
            contributors[msg.sender] = contributors[msg.sender].sub(contributionsClaiming);
        }
        ERC20(token).transfer(msg.sender, tokenValue);
        contributorsClaim[msg.sender] = contributorsClaim[msg.sender].add(tokenValue);       

    }

    function enableVesting(uint256 _numOfVest, uint256 _vestingPeriod) public{
        require(_numOfVest > 1,"num of vest has to be grtr than 1");
        require(_vestingPeriod > 0,"vesting period invalid");   
        require(block.timestamp < startTime.sub(600),"can't enable vest after presale start");    
        require(!vestingEnabled,"vesting already enabled");
        //require(!tokenDropFlag, "can't enable vest when airdrop is on");    
        require(msg.sender == presaleCreator);  // checking for presale owner address

        vestingEnabled = true;
        numberOfVest = _numOfVest;
        vestingPeriod = _vestingPeriod;
    }
    function disableVesting() public {
        require(msg.sender == presaleCreator); 
        require(vestingEnabled,"vesting already disabled");
        require(!isFinalized,"presale already finalized");
        vestingEnabled = false;

    }      
    function claimRefund() public {
        require(isFinalized, "not finalized");
        require(!(goalReached()) || !finalizeValid, "goal reached or presale succeeded");

        refund(msg.sender);
    }



    function claimRefundAnytime() public {
        require(!anytimeRefunded[msg.sender], "already refunded!");
        uint256 userContributed = contributors[msg.sender];
        require(userContributed > 0, "nothing to claim");
        require(!isFinalized, "already finalized!");
        require(!finalizeValid, "already succesfully finalized");
        require(block.timestamp < endTime.sub(finalizeTimeout), "withdrawal window expired!");
        // require(!goalReached() || !finalizeValid,"goal reached");
        contributorsRefundAnytime[msg.sender] = userContributed; // added for V3 -- need to check
        weiRaised = weiRaised.sub(userContributed); // Subtract from total eth raised


        anytimeRefunded[msg.sender] = true;
        refundAnytime(msg.sender,userContributed);

    }
    function refund(address investor) internal { //have to see if onlyOwner works
        require(refundEnabled,"refund not enabled");
        uint256 depositedValue = contributors[investor];
        require(depositedValue > 0, "User has no investment to claim");
        contributors[investor] = 0;
        (bool refundSucess,) = payable(investor).call{value:depositedValue}("");
        require(refundSucess,"refund failed");
        emit Refunded(investor, depositedValue);
    }

    function refundAnytime(address investor, uint256 _contributed) internal { // have to see if onlyOwner works
        //require(state == State.Refunding);
        //uint256 depositedValue = contributors[investor];
        //require(depositedValue > 0, "User has no investment to claim");
        uint256 penalty = _contributed.mul(20).div(100);
        uint256 refundValue = _contributed.sub(penalty);

        contributors[investor] = 0; // added for V3 -- need to check
        contributorsTracker[investor] = 0; // added for V3 -- need to check
        (bool feeContractPay,) = payable(feeContract).call{value:penalty}("");
        (bool investorPay,) = payable(investor).call{value:refundValue}("");
        require(feeContractPay && investorPay,"anytime refund failed at payment");
        emit claimedBack(investor, _contributed);
    }

    function finalize(address[2] memory __finalizeInfo, uint256 refPer, bool validFinalize) onlyOwner public returns(uint256) {
        require(!isFinalized,"already finalized");
        require(hasClosed(),"not closed");
        referrerAddr = __finalizeInfo[0];
        presaleCreator = __finalizeInfo[1];
       // uniswapDapAddress = __finalizeInfo[2];
        finalizeValid = validFinalize;
        if (goalReached() && finalizeValid) {
            setRate();
            close(presaleCreator, referrerAddr, refPer);

        } else {
            enableRefunds();
        }

        finalizedTime = block.timestamp;

        emit Finalized();

        isFinalized = true;
        /*
        if(tokenDropFlag && finalizeValid){
            tokenDrop();
        }
        */
        return 1;


    }
    /*
    function mintForUniswap(address _uniswapDapp) onlyOwner public {

        IERC20(token).transfer(_uniswapDapp,uniAmount);


    }
    */
    function mintForPlatform(address _platform, address _referrer, uint256 _refPer, bool tokenFeeToRef) public onlyOwner returns(bool) {
        if(!alternateFee){
            require(_platform != address(0), "platform addr cant be zero");
            uint256 platFee = (presaleAmount*teamFeePer)/100;
            uint256 refFee;
            if(tokenFeeToRef){
                refFee = platFee*_refPer/100;
                ERC20(token).transfer(_platform, platFee - (refFee));
                ERC20(token).transfer(_referrer, refFee);
            }
            else{

                ERC20(token).transfer(_platform, platFee);

            }
        }
        return true;
    }
    /*
    function mintForPlatform(address _platform) onlyOwner public {

        uint256 platformFee = (presaleAmount*teamFeePer)/100;
        IERC20(token).transfer(_platform,platformFee);


    }
    */
    function finalizeAnytime(address[3] memory __finalizeInfo, bool validFinalize) onlyOwner public returns(uint256) {
        require(!isFinalized, "presale already finalized");
        //   require(hasClosed());
        referrerAddr = __finalizeInfo[0];
        presaleCreator = __finalizeInfo[1];
       // uniswapDapAddress = __finalizeInfo[2];
        finalizeValid = validFinalize;
        enableRefunds();
        emit Finalized();

        isFinalized = true;



        return 1;


    }

    function enableRefunds() internal {

        refundEnabled = true;
        emit RefundsEnabled();
    }

    function setRate() internal{

        buyRate = (presaleAmount*(1 ether))/CheckTotalEthRaised();


    }
    function getBackTokens() public {

       // require(block.timestamp > closingTime.add(burnDeltaTime), "cannot withdraw yet");
        require(msg.sender == presaleCreator, "initiator is not presale owner!");
       // require(hasClosed(), "presale not closed!");
        require(isFinalized, "presale not finalized!");
        require(!finalizeValid, "finalize was valid");

        require(IERC20(token).transfer(presaleCreator, IERC20(token).balanceOf(address(this))),"cannot transfer token back");

    }
    function selectNativeOnlyFee() public {

        require(msg.sender == presaleCreator, "initiator is not presale owner!");
        require(!isFinalized, "presale already finalized!");
        alternateFee = true;
        teamFeePer = (teamFeePer * nativeMultiplier)/10;

    }
    function close(address __Creator, address _referrerAddr, uint256 _refPer) internal {
        require(!isFinalized,"presale already finalized");
        emit Closed();

        uint256 feesAmount = address(this).balance.mul(teamFeePer).div(100);
        if(_refPer > 0){
            uint256 refAmount = feesAmount.mul(_refPer).div(100);
            (bool refPay,) = payable(_referrerAddr).call{value:refAmount}("");
            (bool feeContractClosePay,) = payable(feeContract).call{value:feesAmount.sub(refAmount)}("");
            require(refPay && feeContractClosePay,"unable to process ref or fee pay");
        }
        else{

           (bool feeContractOnlyPay,) = payable(feeContract).call{value:feesAmount}("");
           require(feeContractOnlyPay,"unable to process fee pay");

        }
        

        uint256 uniswapAmount = address(this).balance.mul(uniswapPercentage).div(100);
        // uint256 GoverningAmount = address(this).balance.mul(gov).div(100);

        require(address(this).balance >= uniswapAmount, "Not Enough Fund to Transfer");
        //  require(address(this).balance > GoverningAmount, "Not Enough Fund to Transfer");

       // payable(__uniswapDep).transfer(uniswapAmount);
        AddLiquidity(uniAmount,uniswapAmount);
        // __GovContract.transfer(GoverningAmount);
        if(address(this).balance != 0){
            (bool creatorPay,) = payable(__Creator).call{value:address(this).balance}("");
            require(creatorPay,"unable to pay creator");
        }

    }

    function goalReached() public view returns(bool) {

        return weiRaised >= soft_cap;

    }
    function presaleEnded() public view returns(bool) {

        return block.timestamp > endTime;

    }



    mapping(address => bool) public validPairPartner;


    uint256 public hundred = 100;

    uint256 public locktime;
    address public ROUTER_ADDRESS;

    //address public dead = 0x000000000000000000000000000000000000dEaD;
	
    address[3] public altAssets;

	address public storedLPAddress;
	address public lockerAddress;
    bool public addLiquidityComplete;
    address public alternativeCurrency;
    bool public useAlternativeCurrency;
    uint256 public returnVal;
    address public lpLockDeployer;
    string public logo = " ";

    function Approve(address _token) internal returns (bool) {
        uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000;
        ERC20(_token).approve(ROUTER_ADDRESS, amountIn);
        return true;
    }
    function ApproveLock(address _lp, address _lockDeployer) internal returns (bool) {
        uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000;
        ERC20(_lp).approve(_lockDeployer, amountIn);
        return true;
    }

    function getWrapAddr() public view returns (address){

            return UniswapRouter02(ROUTER_ADDRESS).WETH();

    }

    function getpair(address _token1, address _token2) internal returns (address) {
        if (UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2) != address(0)) {
            return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2);
        } else {
            return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).createPair(_token1, _token2);
        }
    }

    function setAlternateCurrency(address _newCurrency) public {
        require(_newCurrency != address(0),"currency cannot be Zero addr");
       // require(swapRouterMap[_swapRouter],"invalid router");
        require(validPairPartner[_newCurrency],"invalid asset selected");
        require(!addLiquidityComplete,"Liquidity is added already");
        require(msg.sender == presaleCreator,"not the presale creator");
       // swapRouter_Address = _swapRouter;
        alternativeCurrency = _newCurrency;
        useAlternativeCurrency = true;
    }

     function revertToNative() public{ 
        require(!addLiquidityComplete,"Liquidity is added already");
        require(msg.sender == presaleCreator,"not the presale creator");
        useAlternativeCurrency = false;
    }   
    function getAmountsMinToken(address _tokenAddress, uint256 _ethIN) public view returns(uint256) {

      //  UniswapRouter02 pancakeRouter = UniswapRouter02(_router);
        // generate the pair path of token -> weth
        uint256[] memory amountMinArr;
        uint256 AmountMin;
        address[] memory path = new address[](2);
        path[0] = getWrapAddr();
        path[1] = address(_tokenAddress);

        amountMinArr = UniswapRouter02(ROUTER_ADDRESS).getAmountsOut(_ethIN, path);
        AmountMin = uint256(amountMinArr[1]);

        return AmountMin;


    }


    function swapETHForTokens(uint256 _nativeForDex) private {
        require(useAlternativeCurrency,"alt currency not selected");
        address[] memory path = new address[](2);

        //path[0] = address(this);
        path[0] = getWrapAddr();
        path[1] = alternativeCurrency;

        Approve(alternativeCurrency);

        // make the swap
         UniswapRouter02(ROUTER_ADDRESS).swapExactETHForTokens{value:_nativeForDex}(
            getAmountsMinToken(alternativeCurrency,_nativeForDex),
            path,
            address(this),
            block.timestamp + (300)
            );
                
                returnVal = ERC20(alternativeCurrency).balanceOf(address(this));
                

            
            

    }

    function AddLiquidity(uint256 amountTokenDesired, uint256 nativeForDex) internal {
     //   require(validPairPartner[_pairAlternative], "This is not a valid pair partner");

        uint256 amountETH = nativeForDex;
        uint256 amountETHMin = amountETH - (amountETH * (10) / (100));
        //uint256 amountTokenToAddLiq = amountTokenDesired * (hundred) / (extraAmountPerVal);
        uint256 amountTokenToAddLiq = amountTokenDesired;
        uint256 amountTokenMin = amountTokenToAddLiq - (amountTokenToAddLiq * (10) / (100));
        uint256 LP_WBNB_exp_balance;
        uint256 LP_token_balance;
        uint256 tokenToSend;
        if (useAlternativeCurrency) {

            swapETHForTokens(nativeForDex);

			storedLPAddress = getpair(token, alternativeCurrency);
            LP_WBNB_exp_balance = ERC20(alternativeCurrency).balanceOf(storedLPAddress);
            LP_token_balance = ERC20(token).balanceOf(storedLPAddress);
        }

        else{

            storedLPAddress =  getpair(token, getWrapAddr());
            LP_WBNB_exp_balance = ERC20(getWrapAddr()).balanceOf(storedLPAddress);
            LP_token_balance = ERC20(token).balanceOf(storedLPAddress);
        }

            if (storedLPAddress != address(0x0) && (LP_WBNB_exp_balance > 0 && LP_token_balance <= 0)) {
                tokenToSend = amountTokenToAddLiq * (LP_WBNB_exp_balance) / (amountETH);

                ERC20(token).transfer(storedLPAddress, tokenToSend);

                LPToken(storedLPAddress).sync();
                // sync after adding token
            }
            Approve(token);

        if (useAlternativeCurrency) {
            UniswapRouter02(ROUTER_ADDRESS).addLiquidity(token, alternativeCurrency,amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),address(this), block.timestamp + (300));
        }
        else{
            
            UniswapRouter02(ROUTER_ADDRESS).addLiquidityETH{value:amountETH}(token, amountTokenToAddLiq, amountTokenMin, amountETHMin, address(this), block.timestamp + (300));
        

        }



        

        addLiquidityComplete = true;

        ApproveLock(storedLPAddress,lpLockDeployer);
        lockerAddress = lpLockDeployerInterface(lpLockDeployer).createLPLocker(storedLPAddress,locktime,logo,ERC20(storedLPAddress).balanceOf(address(this)));
    
    }

/*
    function getAltAssetData() public view returns(address[] memory, string[] memory){

        address[] memory altAssetData = new address[](altAssets.length);
       // string[] memory  altListName = new string[](altAssets.length);
        string[] memory  altListSym = new string[](altAssets.length);
        for(uint256 i=0;i<altAssets.length;i++){

            altAssetData[i] = altAssets[i];
           // altListName[i] = ERC20(altAssets[i]).name();
            altListSym[i] = ERC20(altAssets[i]).symbol();
        }    
        return(altAssetData,altListSym);
    }
    */
  
}




contract FairPresaleDapp is Consts, Ownable {


    using SafeMath for uint256;


    address public feeContract;
    address public lpLockDeployer;
    uint256 public teamFee = 2;
    
   // uint256 public extraAmountPer = 2;
    uint256 public nativeMultiplier = 20;
    address[3] public altAssets;
    constructor(address _feeContract, address _lpLockDeployer, address[3] memory _altAssets) {

        feeContract = _feeContract;
        lpLockDeployer = _lpLockDeployer;
        altAssets = _altAssets;
    }

    function CreatePresaleFair(address[4] memory presaleAddressInput_Router, uint256[2] memory start_end_time, uint256[5] memory softcap_preAmnt_uniAmnt_min_max_eth, uint256 uniPercentage, uint256[2] memory extraAmountPer_lockTime) public returns(address) {


        DefiFairCrowdsale PresaleContract = new DefiFairCrowdsale(presaleAddressInput_Router[2], [softcap_preAmnt_uniAmnt_min_max_eth[1],softcap_preAmnt_uniAmnt_min_max_eth[2]], start_end_time, [presaleAddressInput_Router[1],feeContract], [softcap_preAmnt_uniAmnt_min_max_eth[0],softcap_preAmnt_uniAmnt_min_max_eth[3], softcap_preAmnt_uniAmnt_min_max_eth[4]], [uniPercentage,teamFee],[extraAmountPer_lockTime[0],extraAmountPer_lockTime[1],nativeMultiplier],[lpLockDeployer,presaleAddressInput_Router[3]],altAssets);


        PresaleContract.transferOwnership(presaleAddressInput_Router[0]);



        return address(PresaleContract);
    }


    function CheckBlockTimestamp() public view returns(uint256) {


        return block.timestamp;


    }


    function updateNativeMultiplier(uint256 _newMultiplier) public onlyOwner {


        nativeMultiplier = _newMultiplier;




    }
    function updateTeamFee(uint256 _newTeamFee) public onlyOwner {


        teamFee = _newTeamFee;




    }




    function updateFeeContract(address _newFeeContract) public onlyOwner {


        feeContract = _newFeeContract;




    }

    function updateAltAssets(uint index, address _newAltAsset) public onlyOwner {

        altAssets[index] = _newAltAsset;

    }
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeContract","type":"address"},{"internalType":"address","name":"_lpLockDeployer","type":"address"},{"internalType":"address[3]","name":"_altAssets","type":"address[3]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CheckBlockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[4]","name":"presaleAddressInput_Router","type":"address[4]"},{"internalType":"uint256[2]","name":"start_end_time","type":"uint256[2]"},{"internalType":"uint256[5]","name":"softcap_preAmnt_uniAmnt_min_max_eth","type":"uint256[5]"},{"internalType":"uint256","name":"uniPercentage","type":"uint256"},{"internalType":"uint256[2]","name":"extraAmountPer_lockTime","type":"uint256[2]"}],"name":"CreatePresaleFair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"altAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpLockDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_newAltAsset","type":"address"}],"name":"updateAltAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"updateFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"updateNativeMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamFee","type":"uint256"}],"name":"updateTeamFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600260045560146005553480156200001b57600080fd5b50604051620061b4380380620061b48339810160408190526200003e9162000139565b60008054336001600160a01b0319918216179091556002805482166001600160a01b0386811691909117909155600380549092169084161781556200008890600690839062000092565b50505050620001ee565b8260038101928215620000dd579160200282015b82811115620000dd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620000a6565b50620000eb929150620000ef565b5090565b5b80821115620000eb5760008155600101620000f0565b80516001600160a01b03811681146200011e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060a084860312156200014f57600080fd5b6200015a8462000106565b925060206200016b81860162000106565b925085605f8601126200017d57600080fd5b604051606081016001600160401b0381118282101715620001a257620001a262000123565b6040528060a0870188811115620001b857600080fd5b604088015b81811015620001df57620001d18162000106565b8352918401918401620001bd565b50505080925050509250925092565b615fb680620001fe6000396000f3fe60806040523480156200001157600080fd5b5060043610620000d65760003560e01c806306e2971214620000db5780631ab8f86414620001075780631dfaced4146200012057806325cfdf5e1462000137578063417d4add146200015057806346c96aac1462000167578063715018a6146200017b5780638da5cb5b1462000185578063accef1fa1462000199578063acedf07c14620001a0578063c3abb76614620001b7578063d48f502914620001cb578063d7c94efd14620001e2578063f2fde38b14620001ec578063fc006a8a1462000203575b600080fd5b600254620000ef906001600160a01b031681565b604051620000fe9190620005ae565b60405180910390f35b6200011160055481565b604051908152602001620000fe565b620000ef62000131366004620005c2565b6200021a565b6200014e62000148366004620005c2565b6200023b565b005b6200014e62000161366004620005f9565b62000258565b600154620000ef906001600160a01b031681565b6200014e620002aa565b600054620000ef906001600160a01b031681565b4262000111565b6200014e620001b1366004620005c2565b6200030a565b600354620000ef906001600160a01b031681565b620000ef620001dc3660046200072c565b62000327565b6200011160045481565b6200014e620001fd366004620007e2565b620004d1565b6200014e62000214366004620007e2565b620004f7565b600681600381106200022b57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b031633146200025357600080fd5b600555565b6000546001600160a01b031633146200027057600080fd5b806006836003811062000287576200028762000807565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b03163314620002c257600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146200032257600080fd5b600455565b604085810151815180830183526020868101518252868401518183015283518085018552818a01516001600160a01b039081168252600254168183015284516060808201875289518252808a01518285015260808a0151828801528651808801885289815260045481860152875191820190975287518152600096879695948c9493929081018a6001602002015181526020016005548152506040518060400160405280600360009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020018f6003600481106200040e576200040e62000807565b60200201516001600160a01b031690526040516006906200042f90620005a0565b62000443999897969594939291906200089b565b604051809103906000f08015801562000460573d6000803e3d6000fd5b50875160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b916200049291600401620005ae565b600060405180830381600087803b158015620004ad57600080fd5b505af1158015620004c2573d6000803e3d6000fd5b50929998505050505050505050565b6000546001600160a01b03163314620004e957600080fd5b620004f48162000531565b50565b6000546001600160a01b031633146200050f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200054557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b615628806200095983390190565b6001600160a01b0391909116815260200190565b600060208284031215620005d557600080fd5b5035919050565b80356001600160a01b0381168114620005f457600080fd5b919050565b600080604083850312156200060d57600080fd5b823591506200061f60208401620005dc565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562000663576200066362000628565b60405290565b600082601f8301126200067b57600080fd5b604080519081016001600160401b0381118282101715620006a057620006a062000628565b8060405250806040840185811115620006b857600080fd5b845b81811015620006d4578035835260209283019201620006ba565b509195945050505050565b600082601f830112620006f157600080fd5b60405160a081016001600160401b038111828210171562000716576200071662000628565b6040528060a0840185811115620006b857600080fd5b60008060008060006101c086880312156200074657600080fd5b86601f8701126200075657600080fd5b620007606200063e565b8060808801898111156200077357600080fd5b885b8181101562000798576200078981620005dc565b84526020938401930162000775565b50819750620007a88a8262000669565b9650505050620007bc8760c08801620006df565b92506101608601359150620007d687610180880162000669565b90509295509295909350565b600060208284031215620007f557600080fd5b6200080082620005dc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b60028110156200084257815184526020938401939091019060010162000821565b50505050565b8060005b6002811015620008425781516001600160a01b03168452602093840193909101906001016200084c565b8060005b6003811015620008425781518452602093840193909101906001016200087a565b6001600160a01b038a811682526102808201906020620008be8185018d6200081d565b620008cd606085018c6200081d565b620008dc60a085018b62000848565b620008eb60e085018a62000876565b620008fb6101408501896200081d565b6200090b61018085018862000876565b6200091b6101e085018762000848565b61022084018560005b60038110156200094557815485168352918301916001918201910162000924565b50505050509a995050505050505050505056fe60c0604052600a60809081526908c8292a49882aa9c86960b31b60a0526002906200002b9082620003c1565b50600060125560026014556014601555610258601c55610258601d556064602e55604051806040016040528060018152602001600160fd1b81525060399081620000769190620003c1565b503480156200008457600080fd5b506040516200562838038062005628833981016040819052620000a791620005d3565b600080546001600160a01b03191633179055604080518082019091526020868101518252810186600260200201519052620000e790601690600262000277565b5084516018558651601955602087810151601a55601e80546001600160a01b038c81166001600160a01b03199283161790925560408801516021558851602a805491841691831691909117905588830151602b805491909316911617905584810151601481905585516025558951602655908901516027556064906200016e908262000713565b60275460265462000180919062000713565b6200018c91906200072f565b62000198919062000749565b6028558251620001aa90606462000713565b602955602083810151602f5560408401516015558251603880546001600160a01b03199081166001600160a01b039384161790915591840151603080549093169116179055620001fe6031826003620002ba565b5060005b600381101562000267576001602d600060318460038110620002285762000228620006e7565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806200025e816200076c565b91505062000202565b5050505050505050505062000788565b8260028101928215620002a8579160200282015b82811115620002a85782518255916020019190600101906200028b565b50620002b692915062000305565b5090565b8260038101928215620002a8579160200282015b82811115620002a857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002ce565b5b80821115620002b6576000815560010162000306565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd6200031c565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004a557600080fd5b919050565b604080519081016001600160401b0381118282101715620004cf57620004cf6200031c565b60405290565b604051606081016001600160401b0381118282101715620004cf57620004cf6200031c565b600082601f8301126200050c57600080fd5b62000516620004aa565b8060408401858111156200052957600080fd5b845b81811015620005455780518452602093840193016200052b565b509095945050505050565b600082601f8301126200056257600080fd5b6200056c620004aa565b8060408401858111156200057f57600080fd5b845b81811015620005455762000595816200048d565b84526020938401930162000581565b600082601f830112620005b657600080fd5b620005c0620004d5565b8060608401858111156200052957600080fd5b6000806000806000806000806000610280808b8d031215620005f457600080fd5b620005ff8b6200048d565b99506020620006118d828e01620004fa565b9950620006228d60608e01620004fa565b9850620006338d60a08e0162000550565b9750620006448d60e08e01620005a4565b9650620006568d6101408e01620004fa565b9550620006688d6101808e01620005a4565b94506200067a8d6101e08e0162000550565b93508c61023f8d01126200068d57600080fd5b62000697620004d5565b918c0191808e841115620006aa57600080fd5b6102208e015b84811015620006d257620006c4816200048d565b8352918301918301620006b0565b50809450505050509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115620007295762000729620006fd565b92915050565b8082028115828204841417620007295762000729620006fd565b6000826200076757634e487b7160e01b600052601260045260246000fd5b500490565b600060018201620007815762000781620006fd565b5060010190565b614e9080620007986000396000f3fe6080604052600436106104215760003560e01c806306e29712146105e45780630f98c9181461061a5780631096f46a1461063e57806310ef82c51461065e5780631265d6e7146106745780631515bc2b146106965780631ab8f864146106b95780631bd49653146106cf5780631dfaced4146106e55780631e12353e146107055780631edd40ae1461073b5780631f4ba804146107505780631f6d494214610766578063249b7c1914610793578063252a02eb146107a85780632698d707146107de5780632a592e9f146107f35780632fc9b686146108205780633197cbb6146108505780633675f29b1461086657806337ce1647146108865780633bff8ed7146108a75780633cb650d0146108d45780634042b66f146108e9578063422099b2146108ff57806346c96aac1461091457806348c54b9d146109345780634c4a386f146109495780634d2a90731461096a5780634de64b811461098a5780634e4153bb146109aa57806351229077146109c057806351fb012d146109e25780635a0e779b146109fc5780635bff9a2714610a1d5780635f9bae3214610a335780636008405914610a4957806361644ca814610a6957806361c533b414610a8d57806363c1805814610aa35780636ac8d0c214610ab85780636e27607a14610ad8578063715018a614610af957806371beb4e114610b0e5780637313ee5a14610b2457806378e2df0e14610b3a57806378e9792514610b505780637d3d652214610b665780637f87bbd614610b805780638190eefd14610ba157806382efbbec14610bbb578063844faace14610bd157806386c5ae2f14610bfe5780638ab1d68114610c1e5780638b6ea1cf14610c3e5780638d4e408314610c5e5780638da5cb5b14610c7d5780639774748014610c9d57806397993fd914610cb2578063995c5e9d14610cd25780639b19251a14610d025780639b33d9d114610d325780639fe4cb9414610d47578063a82524b214610d67578063b138d50014610d7c578063b444e16214610d92578063b5545a3c14610da8578063b7a871c914610dbd578063b89918e014610ded578063b94a6dfe14610e02578063bc2eae0c14610e22578063be11ce2f14610e38578063be5ef81a14610e4d578063bf3f15bf14610e6d578063c3abb76614610e83578063cdfb2b4e14610ea3578063ce7dadd014610eb8578063d6b0f48414610ece578063db37ceec14610ee3578063dc1df26414610ef8578063e132db4114610f1b578063e43252d714610f30578063e4c21cf214610f50578063e5658e1a14610f65578063e580b2b014610696578063ecfd892814610f92578063ef67a5e214610fa8578063f2fde38b14610fc8578063f6e99c0d14610fe8578063fb7f21eb14611008578063fc0c546a1461101d578063fc37987b1461103d578063fcb3747314611053578063fe67a1891461106957600080fd5b366105df57601f5442116104505760405162461bcd60e51b81526004016104479061449c565b60405180910390fd5b336000908152600a602052604090205460ff16156104805760405162461bcd60e51b8152600401610447906144d3565b600c5460ff16156104ba57336000908152600b602052604090205460ff166104ba5760405162461bcd60e51b815260040161044790614506565b346021546104c8919061454a565b3360009081526003602052604090205411156105265760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f7765640000006044820152606401610447565b61052f3361107f565b336000908152600360205260408120805434929061054e90849061455d565b9091555050336000908152600460205260408120805434929061057290849061455d565b90915550503360009081526009602052604090205460ff166105dd57600d8054600090815260086020908152604080832080546001600160a01b03191633908117909155835260099091528120805460ff19166001179055815491906105d783614570565b91905055505b005b600080fd5b3480156105f057600080fd5b50602b54610604906001600160a01b031681565b6040516106119190614589565b60405180910390f35b34801561062657600080fd5b5061063060255481565b604051908152602001610611565b34801561064a57600080fd5b50603654610604906001600160a01b031681565b34801561066a57600080fd5b5061063060285481565b34801561068057600080fd5b50610689611227565b60405161061191906145e3565b3480156106a257600080fd5b50601a5442115b6040519015158152602001610611565b3480156106c557600080fd5b5061063060155481565b3480156106db57600080fd5b5061063060375481565b3480156106f157600080fd5b506106046107003660046145f6565b6112b5565b34801561071157600080fd5b506106046107203660046145f6565b6010602052600090815260409020546001600160a01b031681565b34801561074757600080fd5b506105dd6112d5565b34801561075c57600080fd5b5061063060295481565b34801561077257600080fd5b50610630610781366004614624565b60036020526000908152604090205481565b34801561079f57600080fd5b50601a54610630565b3480156107b457600080fd5b506106046107c33660046145f6565b6008602052600090815260409020546001600160a01b031681565b3480156107ea57600080fd5b50601b54610630565b3480156107ff57600080fd5b5061063061080e366004614624565b60056020526000908152604090205481565b34801561082c57600080fd5b506106a961083b366004614624565b600a6020526000908152604090205460ff1681565b34801561085c57600080fd5b50610630601a5481565b34801561087257600080fd5b50603554610604906001600160a01b031681565b34801561089257600080fd5b506036546106a990600160a01b900460ff1681565b3480156108b357600080fd5b506106306108c2366004614624565b60066020526000908152604090205481565b3480156108e057600080fd5b506105dd6114c2565b3480156108f557600080fd5b50610630601b5481565b34801561090b57600080fd5b506105dd611564565b34801561092057600080fd5b50600154610604906001600160a01b031681565b34801561094057600080fd5b506105dd611617565b34801561095557600080fd5b506020546106a990600160201b900460ff1681565b34801561097657600080fd5b50610630610985366004614695565b6117f0565b34801561099657600080fd5b506106306109a5366004614736565b611962565b3480156109b657600080fd5b5061063060125481565b3480156109cc57600080fd5b506109d5611a89565b60405161061191906147a6565b3480156109ee57600080fd5b50600c546106a99060ff1681565b348015610a0857600080fd5b506035546106a990600160a01b900460ff1681565b348015610a2957600080fd5b50610630602e5481565b348015610a3f57600080fd5b50610630601f5481565b348015610a5557600080fd5b506105dd610a64366004614624565b611bae565b348015610a7557600080fd5b50610a7e611cdf565b604051610611939291906147b9565b348015610a9957600080fd5b50610630602f5481565b348015610aaf57600080fd5b506105dd611e58565b348015610ac457600080fd5b506020546106a99062010000900460ff1681565b348015610ae457600080fd5b506020546106a990600160281b900460ff1681565b348015610b0557600080fd5b506105dd612049565b348015610b1a57600080fd5b5061063060215481565b348015610b3057600080fd5b5061063060245481565b348015610b4657600080fd5b5061063060185481565b348015610b5c57600080fd5b5061063060195481565b348015610b7257600080fd5b50601854601b5410156106a9565b348015610b8c57600080fd5b506020546106a9906301000000900460ff1681565b348015610bad57600080fd5b506020546106a99060ff1681565b348015610bc757600080fd5b50610630600e5481565b348015610bdd57600080fd5b50610630610bec366004614624565b60076020526000908152604090205481565b348015610c0a57600080fd5b50610604610c193660046145f6565b6120a8565b348015610c2a57600080fd5b506105dd610c39366004614624565b6120d2565b348015610c4a57600080fd5b50602c54610604906001600160a01b031681565b348015610c6a57600080fd5b506020546106a990610100900460ff1681565b348015610c8957600080fd5b50600054610604906001600160a01b031681565b348015610ca957600080fd5b506105dd61217b565b348015610cbe57600080fd5b50610630610ccd36600461482e565b6121de565b348015610cde57600080fd5b506106a9610ced366004614624565b60096020526000908152604090205460ff1681565b348015610d0e57600080fd5b506106a9610d1d366004614624565b600b6020526000908152604090205460ff1681565b348015610d3e57600080fd5b5061060461229e565b348015610d5357600080fd5b50603454610604906001600160a01b031681565b348015610d7357600080fd5b50601954610630565b348015610d8857600080fd5b5061063060265481565b348015610d9e57600080fd5b50610630601d5481565b348015610db457600080fd5b506105dd612311565b348015610dc957600080fd5b506106a9610dd8366004614624565b602d6020526000908152604090205460ff1681565b348015610df957600080fd5b506105dd6123d2565b348015610e0e57600080fd5b50603054610604906001600160a01b031681565b348015610e2e57600080fd5b50610630600f5481565b348015610e4457600080fd5b506106306127b7565b348015610e5957600080fd5b506105dd610e683660046148c4565b6127c4565b348015610e7957600080fd5b5061063060225481565b348015610e8f57600080fd5b50603854610604906001600160a01b031681565b348015610eaf57600080fd5b506105dd61295b565b348015610ec457600080fd5b5061063060275481565b348015610eda57600080fd5b506105dd6129d0565b348015610eef57600080fd5b50610630612a5f565b348015610f0457600080fd5b50610f0d612a6a565b6040516106119291906148e6565b348015610f2757600080fd5b50601354610630565b348015610f3c57600080fd5b506105dd610f4b366004614624565b612ba9565b348015610f5c57600080fd5b50601854610630565b348015610f7157600080fd5b50610630610f80366004614624565b60046020526000908152604090205481565b348015610f9e57600080fd5b50610630600d5481565b348015610fb457600080fd5b50602a54610604906001600160a01b031681565b348015610fd457600080fd5b506105dd610fe3366004614624565b612c12565b348015610ff457600080fd5b506106a961100336600461493d565b612c32565b34801561101457600080fd5b50610689612e6c565b34801561102957600080fd5b50601e54610604906001600160a01b031681565b34801561104957600080fd5b5061063060135481565b34801561105f57600080fd5b50610630601c5481565b34801561107557600080fd5b5061063060235481565b3332146110ce5760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e74726163747300006044820152606401610447565b601f5442116110ef5760405162461bcd60e51b81526004016104479061449c565b60195442101580156111025750601a5442105b6111435760405162461bcd60e51b815260206004820152601260248201527170726573616c65206e6f742061637469766560701b6044820152606401610447565b336000908152600a602052604090205460ff16156111735760405162461bcd60e51b8152600401610447906144d3565b600c5460ff16156111ad57336000908152600b602052604090205460ff166111ad5760405162461bcd60e51b815260040161044790614506565b346111b88282612e79565b60006111c382612ebb565b905081601b60008282546111d7919061455d565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6002805461123490614990565b80601f016020809104026020016040519081016040528092919081815260200182805461126090614990565b80156112ad5780601f10611282576101008083540402835291602001916112ad565b820191906000526020600020905b81548152906001019060200180831161129057829003601f168201915b505050505081565b603181600381106112c557600080fd5b01546001600160a01b0316905081565b336000908152600a602052604090205460ff16156113295760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b6044820152606401610447565b33600090815260036020526040902054806113795760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b6044820152606401610447565b602054610100900460ff16156113c65760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b6044820152606401610447565b60205462010000900460ff161561141f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a65640000006044820152606401610447565b601d54601a5461142e91612ede565b42106114795760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b6044820152606401610447565b336000908152600660205260409020819055601b546114989082612ede565b601b55336000818152600a60205260409020805460ff191660011790556114bf9082612f01565b50565b602a546001600160a01b031633146114d957600080fd5b6020546301000000900460ff1661152d5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b6044820152606401610447565b602054610100900460ff16156115555760405162461bcd60e51b8152600401610447906149c4565b6020805463ff00000019169055565b602a546001600160a01b0316331461158e5760405162461bcd60e51b8152600401610447906149f7565b602054610100900460ff16156115e35760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b6044820152606401610447565b6020805460ff60281b1916600160281b179055601554601454600a9161160891614a2e565b6116129190614a45565b601455565b602054600160201b900460ff16156116415760405162461bcd60e51b815260040161044790614a67565b6020546301000000900460ff16156116a65760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b6064820152608401610447565b602054610100900460ff166116cd5760405162461bcd60e51b815260040161044790614a95565b60205462010000900460ff166116f55760405162461bcd60e51b815260040161044790614ac1565b3360009081526003602052604081205490036117235760405162461bcd60e51b815260040161044790614aea565b60135433600090815260036020526040812054909161175691670de0b6b3a7640000916117509190613092565b906130c8565b3360008181526003602052604080822091909155601e54905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb9161179a918590600401614b2b565b6020604051808303816000875af11580156117b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117dd9190614b44565b5033600090815260056020526040902055565b600080546001600160a01b0316331461180857600080fd5b602054610100900460ff16156118545760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b6044820152606401610447565b601a5442116118925760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b6044820152606401610447565b8351602c80546001600160a01b03199081166001600160a01b0393841617909155602080870151602a80549093169316929092179055805462ff000019166201000084151502179055601854601b54108015906118f7575060205462010000900460ff165b15611926576119046130d4565b602a54602c54611921916001600160a01b039081169116856130fb565b61192e565b61192e613459565b42602355604051600080516020614e3b83398151915290600090a1506020805461ff00191661010017905560019392505050565b6040805160028082526060808301845260009390928492839260208301908036833701905050905061199261229e565b816000815181106119a5576119a5614b61565b60200260200101906001600160a01b031690816001600160a01b03168152505085816001815181106119d9576119d9614b61565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611a189088908590600401614b77565b600060405180830381865afa158015611a35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5d9190810190614b98565b925082600181518110611a7257611a72614b61565b602002602001015191508193505050505b92915050565b60606000600e546001600160401b03811115611aa757611aa7614641565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50905060005b600e54811015611ba8576000818152601060209081526040808320546001600160a01b03168352600b90915290205460ff1615611b615760008181526010602052604090205482516001600160a01b0390911690839083908110611b3c57611b3c614b61565b60200260200101906001600160a01b031690816001600160a01b031681525050611b96565b6000828281518110611b7557611b75614b61565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ba081614570565b915050611ad6565b50919050565b6001600160a01b038116611c035760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b6044820152606401610447565b6001600160a01b0381166000908152602d602052604090205460ff16611c645760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b6044820152606401610447565b603554600160a01b900460ff1615611c8e5760405162461bcd60e51b815260040161044790614c3d565b602a546001600160a01b03163314611cb85760405162461bcd60e51b815260040161044790614c71565b603680546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611ce761445f565b611cef61447e565b6060611cf961445f565b611d0161447e565b50506040805161014081018252601854815260265460208083019190915260165482840152601754606080840191909152601954608080850191909152601a5460a0850152601b5460c085015260135460e08501526027546101008086019190915260255461012086015285519182018652835490810460ff908116151583526201000082048116151594830194909452630100000081048416151595820195909552600160201b90940490911615159083015260028054919291839183918190611dcb90614990565b80601f0160208091040260200160405190810160405280929190818152602001828054611df790614990565b8015611e445780601f10611e1957610100808354040283529160200191611e44565b820191906000526020600020905b815481529060010190602001808311611e2757829003601f168201915b505050505090509450945094505050909192565b602a546001600160a01b03163314611e825760405162461bcd60e51b8152600401610447906149f7565b602054610100900460ff16611ed25760405162461bcd60e51b815260206004820152601660248201527570726573616c65206e6f742066696e616c697a65642160501b6044820152606401610447565b60205462010000900460ff1615611f205760405162461bcd60e51b8152602060048201526012602482015271199a5b985b1a5e99481dd85cc81d985b1a5960721b6044820152606401610447565b601e54602a546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a0823190611f5d903090600401614589565b602060405180830381865afa158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e9190614ca2565b6040518363ffffffff1660e01b8152600401611fbb929190614b2b565b6020604051808303816000875af1158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190614b44565b6120475760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b6044820152606401610447565b565b6000546001600160a01b0316331461206057600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b601181815481106120b857600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146120e957600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166121455760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b6044820152606401610447565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600f80549161217383614570565b919050555050565b603554600160a01b900460ff16156121a55760405162461bcd60e51b815260040161044790614c3d565b602a546001600160a01b031633146121cf5760405162461bcd60e51b815260040161044790614c71565b6036805460ff60a01b19169055565b600080546001600160a01b031633146121f657600080fd5b602054610100900460ff161561221e5760405162461bcd60e51b8152600401610447906149c4565b8251602c80546001600160a01b03199081166001600160a01b0393841617909155602080860151602a80549093169316929092179055805462ff00001916620100008415150217905561226f613459565b604051600080516020614e3b83398151915290600090a1506020805461ff001916610100179055600192915050565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230c9190614cbb565b905090565b602054610100900460ff166123585760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b6044820152606401610447565b601854601b541080612373575060205462010000900460ff16155b6123c95760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b6064820152608401610447565b61204733613497565b602054600160201b900460ff16156123fc5760405162461bcd60e51b815260040161044790614a67565b6020546301000000900460ff1661244b5760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b6044820152606401610447565b602054610100900460ff166124725760405162461bcd60e51b815260040161044790614a95565b60205462010000900460ff1661249a5760405162461bcd60e51b815260040161044790614ac1565b3360009081526003602052604081205490036124c85760405162461bcd60e51b815260040161044790614aea565b602254336000908152600760205260409020541061251c5760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b6044820152606401610447565b6000612544600161253e60245461175060235442612ede90919063ffffffff16565b90613633565b9050602254811061255457506022545b3360009081526007602052604081205461256f908390612ede565b905060008111801561258357506022548111155b6125ca5760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b6044820152606401610447565b3360009081526007602090815260408083208590556022546013546004909352908320546126149261175091869161260e91670de0b6b3a764000091859190613092565b90613092565b601354336000908152600360205260408120549293509161264291670de0b6b3a76400009161175091613092565b9050808211156126945760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f7765640000006044820152606401610447565b6022543360009081526004602052604081205490916126b7916117509087613092565b3360009081526003602052604090205490915081106126e55733600090815260036020526040812055612710565b336000908152600360205260409020546126ff9082612ede565b336000908152600360205260409020555b601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906127429033908790600401614b2b565b6020604051808303816000875af1158015612761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127859190614b44565b50336000908152600560205260409020546127a09084613633565b336000908152600560205260409020555050505050565b60006016815b0154905090565b6001821161281e5760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b6064820152608401610447565b600081116128675760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b6044820152606401610447565b60195461287690610258612ede565b42106128d25760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b6064820152608401610447565b6020546301000000900460ff16156129265760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610447565b602a546001600160a01b0316331461293d57600080fd5b6020805463ff00000019166301000000179055602291909155602455565b6000546001600160a01b0316331461297257600080fd5b600c5460ff16156129c15760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b6044820152606401610447565b600c805460ff19166001179055565b6000546001600160a01b031633146129e757600080fd5b600c5460ff16612a365760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b6044820152606401610447565b600c805460ff19169055601c54612a4d904261455d565b601f556020805460ff19166001179055565b6000601660016127bd565b6060806000600d546001600160401b03811115612a8957612a89614641565b604051908082528060200260200182016040528015612ab2578160200160208202803683370190505b5090506000600d546001600160401b03811115612ad157612ad1614641565b604051908082528060200260200182016040528015612afa578160200160208202803683370190505b50905060005b600d54811015612b9f5760008181526008602052604090205483516001600160a01b0390911690849083908110612b3957612b39614b61565b6001600160a01b039283166020918202929092018101919091526000838152600882526040808220549093168152600390915220548251839083908110612b8257612b82614b61565b602090810291909101015280612b9781614570565b915050612b00565b5090939092509050565b6000546001600160a01b03163314612bc057600080fd5b6001600160a01b0381166000818152600b60209081526040808320805460ff19166001179055600e805484526010909252822080546001600160a01b0319169093179092558154919061217383614570565b6000546001600160a01b03163314612c2957600080fd5b6114bf81613651565b600080546001600160a01b03163314612c4a57600080fd5b602054600160281b900460ff16612e61576001600160a01b038516612cae5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b6044820152606401610447565b60006064601454602654612cc29190614a2e565b612ccc9190614a45565b905060008315612de7576064612ce28684614a2e565b612cec9190614a45565b601e549091506001600160a01b031663a9059cbb88612d0b848661454a565b6040518363ffffffff1660e01b8152600401612d28929190614b2b565b6020604051808303816000875af1158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b9190614b44565b50601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612d9e9089908590600401614b2b565b6020604051808303816000875af1158015612dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de19190614b44565b50612e5e565b601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612e19908a908690600401614b2b565b6020604051808303816000875af1158015612e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5c9190614b44565b505b50505b506001949350505050565b6039805461123490614990565b601654341015612e8857600080fd5b601754341115612e9757600080fd5b6001600160a01b038216612eaa57600080fd5b80600003612eb757600080fd5b5050565b6000670de0b6b3a764000060135483612ed49190614a2e565b611a839190614a45565b600082821115612ef057612ef0614cd8565b612efa828461454a565b9392505050565b6000612f136064611750846014613092565b90506000612f218383612ede565b6001600160a01b0385811660009081526003602090815260408083208390556004909152808220829055602b549051939450909291169084908381818185875af1925050503d8060008114612f92576040519150601f19603f3d011682016040523d82523d6000602084013e612f97565b606091505b505090506000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe8576040519150601f19603f3d011682016040523d82523d6000602084013e612fed565b606091505b50509050818015612ffb5750805b6130475760405162461bcd60e51b815260206004820181905260248201527f616e7974696d6520726566756e64206661696c6564206174207061796d656e746044820152606401610447565b856001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28660405161308291815260200190565b60405180910390a2505050505050565b6000826000036130a457506000611a83565b6130ae8284614a2e565b9050816130bb8483614a45565b14611a8357611a83614cd8565b6000612efa8284614a45565b601b546026546130ec90670de0b6b3a7640000614a2e565b6130f69190614a45565b601355565b602054610100900460ff16156131235760405162461bcd60e51b8152600401610447906149c4565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a1600061316860646117506014544761309290919063ffffffff16565b9050811561329657600061318160646117508486613092565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146131d0576040519150601f19603f3d011682016040523d82523d6000602084013e6131d5565b606091505b5050602b549091506000906001600160a01b03166131f38585612ede565b604051600081818185875af1925050503d806000811461322f576040519150601f19603f3d011682016040523d82523d6000602084013e613234565b606091505b505090508180156132425750805b61328e5760405162461bcd60e51b815260206004820181905260248201527f756e61626c6520746f2070726f6365737320726566206f7220666565207061796044820152606401610447565b505050613337565b602b546040516000916001600160a01b03169083908381818185875af1925050503d80600081146132e3576040519150601f19603f3d011682016040523d82523d6000602084013e6132e8565b606091505b50509050806133355760405162461bcd60e51b8152602060048201526019602482015278756e61626c6520746f2070726f63657373206665652070617960381b6044820152606401610447565b505b600061335360646117506025544761309290919063ffffffff16565b9050804710156133a35760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b6044820152606401610447565b6133af602754826136bf565b4715613452576000856001600160a01b03164760405160006040518083038185875af1925050503d8060008114613402576040519150601f19603f3d011682016040523d82523d6000602084013e613407565b606091505b50509050806134505760405162461bcd60e51b81526020600482015260156024820152743ab730b13632903a37903830bc9031b932b0ba37b960591b6044820152606401610447565b505b5050505050565b6020805460ff60201b1916600160201b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b602054600160201b900460ff166134e55760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b6044820152606401610447565b6001600160a01b0381166000908152600360205260409020548061354b5760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d006044820152606401610447565b6001600160a01b0382166000818152600360205260408082208290555190919083908381818185875af1925050503d80600081146135a5576040519150601f19603f3d011682016040523d82523d6000602084013e6135aa565b606091505b50509050806135eb5760405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b6044820152606401610447565b826001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518360405161362691815260200190565b60405180910390a2505050565b600061363f828461455d565b905082811015611a8357611a83614cd8565b6001600160a01b03811661366457600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b80600060646136cf83600a614a2e565b6136d99190614a45565b6136e3908361454a565b905083600060646136f583600a614a2e565b6136ff9190614a45565b613709908361454a565b90506000806000603660149054906101000a900460ff161561384d5761372e88613e89565b601e5460365461374a916001600160a01b039081169116614081565b603480546001600160a01b0319166001600160a01b039283169081179091556036546040516370a0823160e01b81529216916370a082319161378e91600401614589565b602060405180830381865afa1580156137ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cf9190614ca2565b601e546034546040516370a0823160e01b81529295506001600160a01b03918216926370a0823192613805921690600401614589565b602060405180830381865afa158015613822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138469190614ca2565b915061397e565b601e5461386a906001600160a01b031661386561229e565b614081565b603480546001600160a01b0319166001600160a01b039290921691909117905561389261229e565b6034546040516370a0823160e01b81526001600160a01b03928316926370a08231926138c392911690600401614589565b602060405180830381865afa1580156138e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139049190614ca2565b601e546034546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261393a921690600401614589565b602060405180830381865afa158015613957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397b9190614ca2565b91505b6034546001600160a01b0316158015906139a157506000831180156139a1575081155b15613aa057866139b18487614a2e565b6139bb9190614a45565b601e5460345460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926139f39216908590600401614b2b565b6020604051808303816000875af1158015613a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a369190614b44565b50603460009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a8757600080fd5b505af1158015613a9b573d6000803e3d6000fd5b505050505b601e54613ab5906001600160a01b031661432f565b50603654600160a01b900460ff1615613c8657603054601e546036546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b0d903090600401614589565b602060405180830381865afa158015613b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4e9190614ca2565b8e603660009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613b909190614589565b602060405180830381865afa158015613bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd19190614ca2565b30613bde4261012c61455d565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7e9190614cee565b505050613d47565b603054601e546001600160a01b039182169163f305d719918a911688888b30613cb14261012c61455d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d1e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d439190614cee565b5050505b6035805460ff60a01b1916600160a01b179055603454603854613d76916001600160a01b0390811691166143cf565b50603854603454602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060399083906370a0823190613dbb903090600401614589565b602060405180830381865afa158015613dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfc9190614ca2565b6040518563ffffffff1660e01b8152600401613e1b9493929190614d1c565b6020604051808303816000875af1158015613e3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e5e9190614cbb565b603580546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603654600160a01b900460ff16613ede5760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b6044820152606401610447565b604080516002808252606082018352600092602083019080368337019050509050613f0761229e565b81600081518110613f1a57613f1a614b61565b6001600160a01b039283166020918202929092010152603654825191169082906001908110613f4b57613f4b614b61565b6001600160a01b039283166020918202929092010152603654613f6e911661432f565b506030546036546001600160a01b0391821691637ff36ab5918591613f94911682611962565b8430613fa24261012c61455d565b6040518663ffffffff1660e01b8152600401613fc19493929190614deb565b60006040518083038185885af1158015613fdf573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526140089190810190614b98565b506036546040516370a0823160e01b81526001600160a01b03909116906370a0823190614039903090600401614589565b602060405180830381865afa158015614056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407a9190614ca2565b6037555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141049190614cbb565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614131929190614e20565b602060405180830381865afa15801561414e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141729190614cbb565b6001600160a01b03161461426c57603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f79190614cbb565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614224929190614e20565b602060405180830381865afa158015614241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142659190614cbb565b9050611a83565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e39190614cbb565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614310929190614e20565b6020604051808303816000875af1158015614241573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b39261438292909116908590600401614b2b565b6020604051808303816000875af11580156143a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c59190614b44565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b39061441c9086908590600401614b2b565b6020604051808303816000875af115801561443b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190614b44565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6020808252601e908201527f496e2077686974656c6973742064697361626c656420636f6f6c204f66660000604082015260600190565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115611a8357611a83614534565b80820180821115611a8357611a83614534565b60006001820161458257614582614534565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145c3576020818501810151868301820152016145a7565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612efa602083018461459d565b60006020828403121561460857600080fd5b5035919050565b6001600160a01b03811681146114bf57600080fd5b60006020828403121561463657600080fd5b8135612efa8161460f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561467f5761467f614641565b604052919050565b80151581146114bf57600080fd5b6000806000608084860312156146aa57600080fd5b84601f8501126146b957600080fd5b604080519081016001600160401b03811182821017156146db576146db614641565b80604052508060408601878111156146f257600080fd5b865b818110156147155780356147078161460f565b8352602092830192016146f4565b5091945050359150606084013561472b81614687565b809150509250925092565b6000806040838503121561474957600080fd5b82356147548161460f565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561479b5781516001600160a01b031687529582019590820190600101614776565b509495945050505050565b602081526000612efa6020830184614762565b60006101e08286835b600a8110156147e15781518352602092830192909101906001016147c2565b50505061014083018560005b600481101561480e57815115158352602092830192909101906001016147ed565b505050806101c08401526148248184018561459d565b9695505050505050565b6000806080838503121561484157600080fd5b83601f84011261485057600080fd5b604051606081016001600160401b038111828210171561487257614872614641565b60405280606085018681111561488757600080fd5b855b818110156148aa57803561489c8161460f565b835260209283019201614889565b5091935050356148b981614687565b809150509250929050565b600080604083850312156148d757600080fd5b50508035926020909101359150565b6040815260006148f96040830185614762565b82810360208481019190915284518083528582019282019060005b8181101561493057845183529383019391830191600101614914565b5090979650505050505050565b6000806000806080858703121561495357600080fd5b843561495e8161460f565b9350602085013561496e8161460f565b925060408501359150606085013561498581614687565b939692955090935050565b600181811c908216806149a457607f821691505b602082108103611ba857634e487b7160e01b600052602260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b8082028115828204841417611a8357611a83614534565b600082614a6257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614b5657600080fd5b8151612efa81614687565b634e487b7160e01b600052603260045260246000fd5b828152604060208201526000614b906040830184614762565b949350505050565b60006020808385031215614bab57600080fd5b82516001600160401b0380821115614bc257600080fd5b818501915085601f830112614bd657600080fd5b815181811115614be857614be8614641565b8060051b9150614bf9848301614657565b8181529183018401918481019088841115614c1357600080fd5b938501935b83851015614c3157845182529385019390850190614c18565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b600060208284031215614cb457600080fd5b5051919050565b600060208284031215614ccd57600080fd5b8151612efa8161460f565b634e487b7160e01b600052600160045260246000fd5b600080600060608486031215614d0357600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d5457607f831692505b8583108103614d7157634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d905760018114614da657614dd1565b60ff198616825284151560051b82019650614dd1565b60008c81526020902060005b86811015614dcb57815484820152908501908901614db2565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614e046080830186614762565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212207a8f82111da54d62d44b739c96232a35a95b62d7dffb748c060e859c3960488864736f6c63430008110033a26469706673582212206c51ac8ce2ad14960f65cc81caeeb948315c970a9abb233f6572aad73066792264736f6c634300081100330000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620000d65760003560e01c806306e2971214620000db5780631ab8f86414620001075780631dfaced4146200012057806325cfdf5e1462000137578063417d4add146200015057806346c96aac1462000167578063715018a6146200017b5780638da5cb5b1462000185578063accef1fa1462000199578063acedf07c14620001a0578063c3abb76614620001b7578063d48f502914620001cb578063d7c94efd14620001e2578063f2fde38b14620001ec578063fc006a8a1462000203575b600080fd5b600254620000ef906001600160a01b031681565b604051620000fe9190620005ae565b60405180910390f35b6200011160055481565b604051908152602001620000fe565b620000ef62000131366004620005c2565b6200021a565b6200014e62000148366004620005c2565b6200023b565b005b6200014e62000161366004620005f9565b62000258565b600154620000ef906001600160a01b031681565b6200014e620002aa565b600054620000ef906001600160a01b031681565b4262000111565b6200014e620001b1366004620005c2565b6200030a565b600354620000ef906001600160a01b031681565b620000ef620001dc3660046200072c565b62000327565b6200011160045481565b6200014e620001fd366004620007e2565b620004d1565b6200014e62000214366004620007e2565b620004f7565b600681600381106200022b57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b031633146200025357600080fd5b600555565b6000546001600160a01b031633146200027057600080fd5b806006836003811062000287576200028762000807565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b03163314620002c257600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146200032257600080fd5b600455565b604085810151815180830183526020868101518252868401518183015283518085018552818a01516001600160a01b039081168252600254168183015284516060808201875289518252808a01518285015260808a0151828801528651808801885289815260045481860152875191820190975287518152600096879695948c9493929081018a6001602002015181526020016005548152506040518060400160405280600360009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020018f6003600481106200040e576200040e62000807565b60200201516001600160a01b031690526040516006906200042f90620005a0565b62000443999897969594939291906200089b565b604051809103906000f08015801562000460573d6000803e3d6000fd5b50875160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b916200049291600401620005ae565b600060405180830381600087803b158015620004ad57600080fd5b505af1158015620004c2573d6000803e3d6000fd5b50929998505050505050505050565b6000546001600160a01b03163314620004e957600080fd5b620004f48162000531565b50565b6000546001600160a01b031633146200050f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200054557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b615628806200095983390190565b6001600160a01b0391909116815260200190565b600060208284031215620005d557600080fd5b5035919050565b80356001600160a01b0381168114620005f457600080fd5b919050565b600080604083850312156200060d57600080fd5b823591506200061f60208401620005dc565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562000663576200066362000628565b60405290565b600082601f8301126200067b57600080fd5b604080519081016001600160401b0381118282101715620006a057620006a062000628565b8060405250806040840185811115620006b857600080fd5b845b81811015620006d4578035835260209283019201620006ba565b509195945050505050565b600082601f830112620006f157600080fd5b60405160a081016001600160401b038111828210171562000716576200071662000628565b6040528060a0840185811115620006b857600080fd5b60008060008060006101c086880312156200074657600080fd5b86601f8701126200075657600080fd5b620007606200063e565b8060808801898111156200077357600080fd5b885b8181101562000798576200078981620005dc565b84526020938401930162000775565b50819750620007a88a8262000669565b9650505050620007bc8760c08801620006df565b92506101608601359150620007d687610180880162000669565b90509295509295909350565b600060208284031215620007f557600080fd5b6200080082620005dc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b60028110156200084257815184526020938401939091019060010162000821565b50505050565b8060005b6002811015620008425781516001600160a01b03168452602093840193909101906001016200084c565b8060005b6003811015620008425781518452602093840193909101906001016200087a565b6001600160a01b038a811682526102808201906020620008be8185018d6200081d565b620008cd606085018c6200081d565b620008dc60a085018b62000848565b620008eb60e085018a62000876565b620008fb6101408501896200081d565b6200090b61018085018862000876565b6200091b6101e085018762000848565b61022084018560005b60038110156200094557815485168352918301916001918201910162000924565b50505050509a995050505050505050505056fe60c0604052600a60809081526908c8292a49882aa9c86960b31b60a0526002906200002b9082620003c1565b50600060125560026014556014601555610258601c55610258601d556064602e55604051806040016040528060018152602001600160fd1b81525060399081620000769190620003c1565b503480156200008457600080fd5b506040516200562838038062005628833981016040819052620000a791620005d3565b600080546001600160a01b03191633179055604080518082019091526020868101518252810186600260200201519052620000e790601690600262000277565b5084516018558651601955602087810151601a55601e80546001600160a01b038c81166001600160a01b03199283161790925560408801516021558851602a805491841691831691909117905588830151602b805491909316911617905584810151601481905585516025558951602655908901516027556064906200016e908262000713565b60275460265462000180919062000713565b6200018c91906200072f565b62000198919062000749565b6028558251620001aa90606462000713565b602955602083810151602f5560408401516015558251603880546001600160a01b03199081166001600160a01b039384161790915591840151603080549093169116179055620001fe6031826003620002ba565b5060005b600381101562000267576001602d600060318460038110620002285762000228620006e7565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806200025e816200076c565b91505062000202565b5050505050505050505062000788565b8260028101928215620002a8579160200282015b82811115620002a85782518255916020019190600101906200028b565b50620002b692915062000305565b5090565b8260038101928215620002a8579160200282015b82811115620002a857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002ce565b5b80821115620002b6576000815560010162000306565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd6200031c565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004a557600080fd5b919050565b604080519081016001600160401b0381118282101715620004cf57620004cf6200031c565b60405290565b604051606081016001600160401b0381118282101715620004cf57620004cf6200031c565b600082601f8301126200050c57600080fd5b62000516620004aa565b8060408401858111156200052957600080fd5b845b81811015620005455780518452602093840193016200052b565b509095945050505050565b600082601f8301126200056257600080fd5b6200056c620004aa565b8060408401858111156200057f57600080fd5b845b81811015620005455762000595816200048d565b84526020938401930162000581565b600082601f830112620005b657600080fd5b620005c0620004d5565b8060608401858111156200052957600080fd5b6000806000806000806000806000610280808b8d031215620005f457600080fd5b620005ff8b6200048d565b99506020620006118d828e01620004fa565b9950620006228d60608e01620004fa565b9850620006338d60a08e0162000550565b9750620006448d60e08e01620005a4565b9650620006568d6101408e01620004fa565b9550620006688d6101808e01620005a4565b94506200067a8d6101e08e0162000550565b93508c61023f8d01126200068d57600080fd5b62000697620004d5565b918c0191808e841115620006aa57600080fd5b6102208e015b84811015620006d257620006c4816200048d565b8352918301918301620006b0565b50809450505050509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115620007295762000729620006fd565b92915050565b8082028115828204841417620007295762000729620006fd565b6000826200076757634e487b7160e01b600052601260045260246000fd5b500490565b600060018201620007815762000781620006fd565b5060010190565b614e9080620007986000396000f3fe6080604052600436106104215760003560e01c806306e29712146105e45780630f98c9181461061a5780631096f46a1461063e57806310ef82c51461065e5780631265d6e7146106745780631515bc2b146106965780631ab8f864146106b95780631bd49653146106cf5780631dfaced4146106e55780631e12353e146107055780631edd40ae1461073b5780631f4ba804146107505780631f6d494214610766578063249b7c1914610793578063252a02eb146107a85780632698d707146107de5780632a592e9f146107f35780632fc9b686146108205780633197cbb6146108505780633675f29b1461086657806337ce1647146108865780633bff8ed7146108a75780633cb650d0146108d45780634042b66f146108e9578063422099b2146108ff57806346c96aac1461091457806348c54b9d146109345780634c4a386f146109495780634d2a90731461096a5780634de64b811461098a5780634e4153bb146109aa57806351229077146109c057806351fb012d146109e25780635a0e779b146109fc5780635bff9a2714610a1d5780635f9bae3214610a335780636008405914610a4957806361644ca814610a6957806361c533b414610a8d57806363c1805814610aa35780636ac8d0c214610ab85780636e27607a14610ad8578063715018a614610af957806371beb4e114610b0e5780637313ee5a14610b2457806378e2df0e14610b3a57806378e9792514610b505780637d3d652214610b665780637f87bbd614610b805780638190eefd14610ba157806382efbbec14610bbb578063844faace14610bd157806386c5ae2f14610bfe5780638ab1d68114610c1e5780638b6ea1cf14610c3e5780638d4e408314610c5e5780638da5cb5b14610c7d5780639774748014610c9d57806397993fd914610cb2578063995c5e9d14610cd25780639b19251a14610d025780639b33d9d114610d325780639fe4cb9414610d47578063a82524b214610d67578063b138d50014610d7c578063b444e16214610d92578063b5545a3c14610da8578063b7a871c914610dbd578063b89918e014610ded578063b94a6dfe14610e02578063bc2eae0c14610e22578063be11ce2f14610e38578063be5ef81a14610e4d578063bf3f15bf14610e6d578063c3abb76614610e83578063cdfb2b4e14610ea3578063ce7dadd014610eb8578063d6b0f48414610ece578063db37ceec14610ee3578063dc1df26414610ef8578063e132db4114610f1b578063e43252d714610f30578063e4c21cf214610f50578063e5658e1a14610f65578063e580b2b014610696578063ecfd892814610f92578063ef67a5e214610fa8578063f2fde38b14610fc8578063f6e99c0d14610fe8578063fb7f21eb14611008578063fc0c546a1461101d578063fc37987b1461103d578063fcb3747314611053578063fe67a1891461106957600080fd5b366105df57601f5442116104505760405162461bcd60e51b81526004016104479061449c565b60405180910390fd5b336000908152600a602052604090205460ff16156104805760405162461bcd60e51b8152600401610447906144d3565b600c5460ff16156104ba57336000908152600b602052604090205460ff166104ba5760405162461bcd60e51b815260040161044790614506565b346021546104c8919061454a565b3360009081526003602052604090205411156105265760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f7765640000006044820152606401610447565b61052f3361107f565b336000908152600360205260408120805434929061054e90849061455d565b9091555050336000908152600460205260408120805434929061057290849061455d565b90915550503360009081526009602052604090205460ff166105dd57600d8054600090815260086020908152604080832080546001600160a01b03191633908117909155835260099091528120805460ff19166001179055815491906105d783614570565b91905055505b005b600080fd5b3480156105f057600080fd5b50602b54610604906001600160a01b031681565b6040516106119190614589565b60405180910390f35b34801561062657600080fd5b5061063060255481565b604051908152602001610611565b34801561064a57600080fd5b50603654610604906001600160a01b031681565b34801561066a57600080fd5b5061063060285481565b34801561068057600080fd5b50610689611227565b60405161061191906145e3565b3480156106a257600080fd5b50601a5442115b6040519015158152602001610611565b3480156106c557600080fd5b5061063060155481565b3480156106db57600080fd5b5061063060375481565b3480156106f157600080fd5b506106046107003660046145f6565b6112b5565b34801561071157600080fd5b506106046107203660046145f6565b6010602052600090815260409020546001600160a01b031681565b34801561074757600080fd5b506105dd6112d5565b34801561075c57600080fd5b5061063060295481565b34801561077257600080fd5b50610630610781366004614624565b60036020526000908152604090205481565b34801561079f57600080fd5b50601a54610630565b3480156107b457600080fd5b506106046107c33660046145f6565b6008602052600090815260409020546001600160a01b031681565b3480156107ea57600080fd5b50601b54610630565b3480156107ff57600080fd5b5061063061080e366004614624565b60056020526000908152604090205481565b34801561082c57600080fd5b506106a961083b366004614624565b600a6020526000908152604090205460ff1681565b34801561085c57600080fd5b50610630601a5481565b34801561087257600080fd5b50603554610604906001600160a01b031681565b34801561089257600080fd5b506036546106a990600160a01b900460ff1681565b3480156108b357600080fd5b506106306108c2366004614624565b60066020526000908152604090205481565b3480156108e057600080fd5b506105dd6114c2565b3480156108f557600080fd5b50610630601b5481565b34801561090b57600080fd5b506105dd611564565b34801561092057600080fd5b50600154610604906001600160a01b031681565b34801561094057600080fd5b506105dd611617565b34801561095557600080fd5b506020546106a990600160201b900460ff1681565b34801561097657600080fd5b50610630610985366004614695565b6117f0565b34801561099657600080fd5b506106306109a5366004614736565b611962565b3480156109b657600080fd5b5061063060125481565b3480156109cc57600080fd5b506109d5611a89565b60405161061191906147a6565b3480156109ee57600080fd5b50600c546106a99060ff1681565b348015610a0857600080fd5b506035546106a990600160a01b900460ff1681565b348015610a2957600080fd5b50610630602e5481565b348015610a3f57600080fd5b50610630601f5481565b348015610a5557600080fd5b506105dd610a64366004614624565b611bae565b348015610a7557600080fd5b50610a7e611cdf565b604051610611939291906147b9565b348015610a9957600080fd5b50610630602f5481565b348015610aaf57600080fd5b506105dd611e58565b348015610ac457600080fd5b506020546106a99062010000900460ff1681565b348015610ae457600080fd5b506020546106a990600160281b900460ff1681565b348015610b0557600080fd5b506105dd612049565b348015610b1a57600080fd5b5061063060215481565b348015610b3057600080fd5b5061063060245481565b348015610b4657600080fd5b5061063060185481565b348015610b5c57600080fd5b5061063060195481565b348015610b7257600080fd5b50601854601b5410156106a9565b348015610b8c57600080fd5b506020546106a9906301000000900460ff1681565b348015610bad57600080fd5b506020546106a99060ff1681565b348015610bc757600080fd5b50610630600e5481565b348015610bdd57600080fd5b50610630610bec366004614624565b60076020526000908152604090205481565b348015610c0a57600080fd5b50610604610c193660046145f6565b6120a8565b348015610c2a57600080fd5b506105dd610c39366004614624565b6120d2565b348015610c4a57600080fd5b50602c54610604906001600160a01b031681565b348015610c6a57600080fd5b506020546106a990610100900460ff1681565b348015610c8957600080fd5b50600054610604906001600160a01b031681565b348015610ca957600080fd5b506105dd61217b565b348015610cbe57600080fd5b50610630610ccd36600461482e565b6121de565b348015610cde57600080fd5b506106a9610ced366004614624565b60096020526000908152604090205460ff1681565b348015610d0e57600080fd5b506106a9610d1d366004614624565b600b6020526000908152604090205460ff1681565b348015610d3e57600080fd5b5061060461229e565b348015610d5357600080fd5b50603454610604906001600160a01b031681565b348015610d7357600080fd5b50601954610630565b348015610d8857600080fd5b5061063060265481565b348015610d9e57600080fd5b50610630601d5481565b348015610db457600080fd5b506105dd612311565b348015610dc957600080fd5b506106a9610dd8366004614624565b602d6020526000908152604090205460ff1681565b348015610df957600080fd5b506105dd6123d2565b348015610e0e57600080fd5b50603054610604906001600160a01b031681565b348015610e2e57600080fd5b50610630600f5481565b348015610e4457600080fd5b506106306127b7565b348015610e5957600080fd5b506105dd610e683660046148c4565b6127c4565b348015610e7957600080fd5b5061063060225481565b348015610e8f57600080fd5b50603854610604906001600160a01b031681565b348015610eaf57600080fd5b506105dd61295b565b348015610ec457600080fd5b5061063060275481565b348015610eda57600080fd5b506105dd6129d0565b348015610eef57600080fd5b50610630612a5f565b348015610f0457600080fd5b50610f0d612a6a565b6040516106119291906148e6565b348015610f2757600080fd5b50601354610630565b348015610f3c57600080fd5b506105dd610f4b366004614624565b612ba9565b348015610f5c57600080fd5b50601854610630565b348015610f7157600080fd5b50610630610f80366004614624565b60046020526000908152604090205481565b348015610f9e57600080fd5b50610630600d5481565b348015610fb457600080fd5b50602a54610604906001600160a01b031681565b348015610fd457600080fd5b506105dd610fe3366004614624565b612c12565b348015610ff457600080fd5b506106a961100336600461493d565b612c32565b34801561101457600080fd5b50610689612e6c565b34801561102957600080fd5b50601e54610604906001600160a01b031681565b34801561104957600080fd5b5061063060135481565b34801561105f57600080fd5b50610630601c5481565b34801561107557600080fd5b5061063060235481565b3332146110ce5760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e74726163747300006044820152606401610447565b601f5442116110ef5760405162461bcd60e51b81526004016104479061449c565b60195442101580156111025750601a5442105b6111435760405162461bcd60e51b815260206004820152601260248201527170726573616c65206e6f742061637469766560701b6044820152606401610447565b336000908152600a602052604090205460ff16156111735760405162461bcd60e51b8152600401610447906144d3565b600c5460ff16156111ad57336000908152600b602052604090205460ff166111ad5760405162461bcd60e51b815260040161044790614506565b346111b88282612e79565b60006111c382612ebb565b905081601b60008282546111d7919061455d565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6002805461123490614990565b80601f016020809104026020016040519081016040528092919081815260200182805461126090614990565b80156112ad5780601f10611282576101008083540402835291602001916112ad565b820191906000526020600020905b81548152906001019060200180831161129057829003601f168201915b505050505081565b603181600381106112c557600080fd5b01546001600160a01b0316905081565b336000908152600a602052604090205460ff16156113295760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b6044820152606401610447565b33600090815260036020526040902054806113795760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b6044820152606401610447565b602054610100900460ff16156113c65760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b6044820152606401610447565b60205462010000900460ff161561141f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a65640000006044820152606401610447565b601d54601a5461142e91612ede565b42106114795760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b6044820152606401610447565b336000908152600660205260409020819055601b546114989082612ede565b601b55336000818152600a60205260409020805460ff191660011790556114bf9082612f01565b50565b602a546001600160a01b031633146114d957600080fd5b6020546301000000900460ff1661152d5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b6044820152606401610447565b602054610100900460ff16156115555760405162461bcd60e51b8152600401610447906149c4565b6020805463ff00000019169055565b602a546001600160a01b0316331461158e5760405162461bcd60e51b8152600401610447906149f7565b602054610100900460ff16156115e35760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b6044820152606401610447565b6020805460ff60281b1916600160281b179055601554601454600a9161160891614a2e565b6116129190614a45565b601455565b602054600160201b900460ff16156116415760405162461bcd60e51b815260040161044790614a67565b6020546301000000900460ff16156116a65760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b6064820152608401610447565b602054610100900460ff166116cd5760405162461bcd60e51b815260040161044790614a95565b60205462010000900460ff166116f55760405162461bcd60e51b815260040161044790614ac1565b3360009081526003602052604081205490036117235760405162461bcd60e51b815260040161044790614aea565b60135433600090815260036020526040812054909161175691670de0b6b3a7640000916117509190613092565b906130c8565b3360008181526003602052604080822091909155601e54905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb9161179a918590600401614b2b565b6020604051808303816000875af11580156117b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117dd9190614b44565b5033600090815260056020526040902055565b600080546001600160a01b0316331461180857600080fd5b602054610100900460ff16156118545760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b6044820152606401610447565b601a5442116118925760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b6044820152606401610447565b8351602c80546001600160a01b03199081166001600160a01b0393841617909155602080870151602a80549093169316929092179055805462ff000019166201000084151502179055601854601b54108015906118f7575060205462010000900460ff165b15611926576119046130d4565b602a54602c54611921916001600160a01b039081169116856130fb565b61192e565b61192e613459565b42602355604051600080516020614e3b83398151915290600090a1506020805461ff00191661010017905560019392505050565b6040805160028082526060808301845260009390928492839260208301908036833701905050905061199261229e565b816000815181106119a5576119a5614b61565b60200260200101906001600160a01b031690816001600160a01b03168152505085816001815181106119d9576119d9614b61565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611a189088908590600401614b77565b600060405180830381865afa158015611a35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a5d9190810190614b98565b925082600181518110611a7257611a72614b61565b602002602001015191508193505050505b92915050565b60606000600e546001600160401b03811115611aa757611aa7614641565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50905060005b600e54811015611ba8576000818152601060209081526040808320546001600160a01b03168352600b90915290205460ff1615611b615760008181526010602052604090205482516001600160a01b0390911690839083908110611b3c57611b3c614b61565b60200260200101906001600160a01b031690816001600160a01b031681525050611b96565b6000828281518110611b7557611b75614b61565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ba081614570565b915050611ad6565b50919050565b6001600160a01b038116611c035760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b6044820152606401610447565b6001600160a01b0381166000908152602d602052604090205460ff16611c645760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b6044820152606401610447565b603554600160a01b900460ff1615611c8e5760405162461bcd60e51b815260040161044790614c3d565b602a546001600160a01b03163314611cb85760405162461bcd60e51b815260040161044790614c71565b603680546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611ce761445f565b611cef61447e565b6060611cf961445f565b611d0161447e565b50506040805161014081018252601854815260265460208083019190915260165482840152601754606080840191909152601954608080850191909152601a5460a0850152601b5460c085015260135460e08501526027546101008086019190915260255461012086015285519182018652835490810460ff908116151583526201000082048116151594830194909452630100000081048416151595820195909552600160201b90940490911615159083015260028054919291839183918190611dcb90614990565b80601f0160208091040260200160405190810160405280929190818152602001828054611df790614990565b8015611e445780601f10611e1957610100808354040283529160200191611e44565b820191906000526020600020905b815481529060010190602001808311611e2757829003601f168201915b505050505090509450945094505050909192565b602a546001600160a01b03163314611e825760405162461bcd60e51b8152600401610447906149f7565b602054610100900460ff16611ed25760405162461bcd60e51b815260206004820152601660248201527570726573616c65206e6f742066696e616c697a65642160501b6044820152606401610447565b60205462010000900460ff1615611f205760405162461bcd60e51b8152602060048201526012602482015271199a5b985b1a5e99481dd85cc81d985b1a5960721b6044820152606401610447565b601e54602a546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a0823190611f5d903090600401614589565b602060405180830381865afa158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e9190614ca2565b6040518363ffffffff1660e01b8152600401611fbb929190614b2b565b6020604051808303816000875af1158015611fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffe9190614b44565b6120475760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b6044820152606401610447565b565b6000546001600160a01b0316331461206057600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b601181815481106120b857600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146120e957600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166121455760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b6044820152606401610447565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600f80549161217383614570565b919050555050565b603554600160a01b900460ff16156121a55760405162461bcd60e51b815260040161044790614c3d565b602a546001600160a01b031633146121cf5760405162461bcd60e51b815260040161044790614c71565b6036805460ff60a01b19169055565b600080546001600160a01b031633146121f657600080fd5b602054610100900460ff161561221e5760405162461bcd60e51b8152600401610447906149c4565b8251602c80546001600160a01b03199081166001600160a01b0393841617909155602080860151602a80549093169316929092179055805462ff00001916620100008415150217905561226f613459565b604051600080516020614e3b83398151915290600090a1506020805461ff001916610100179055600192915050565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230c9190614cbb565b905090565b602054610100900460ff166123585760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b6044820152606401610447565b601854601b541080612373575060205462010000900460ff16155b6123c95760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b6064820152608401610447565b61204733613497565b602054600160201b900460ff16156123fc5760405162461bcd60e51b815260040161044790614a67565b6020546301000000900460ff1661244b5760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b6044820152606401610447565b602054610100900460ff166124725760405162461bcd60e51b815260040161044790614a95565b60205462010000900460ff1661249a5760405162461bcd60e51b815260040161044790614ac1565b3360009081526003602052604081205490036124c85760405162461bcd60e51b815260040161044790614aea565b602254336000908152600760205260409020541061251c5760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b6044820152606401610447565b6000612544600161253e60245461175060235442612ede90919063ffffffff16565b90613633565b9050602254811061255457506022545b3360009081526007602052604081205461256f908390612ede565b905060008111801561258357506022548111155b6125ca5760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b6044820152606401610447565b3360009081526007602090815260408083208590556022546013546004909352908320546126149261175091869161260e91670de0b6b3a764000091859190613092565b90613092565b601354336000908152600360205260408120549293509161264291670de0b6b3a76400009161175091613092565b9050808211156126945760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f7765640000006044820152606401610447565b6022543360009081526004602052604081205490916126b7916117509087613092565b3360009081526003602052604090205490915081106126e55733600090815260036020526040812055612710565b336000908152600360205260409020546126ff9082612ede565b336000908152600360205260409020555b601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906127429033908790600401614b2b565b6020604051808303816000875af1158015612761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127859190614b44565b50336000908152600560205260409020546127a09084613633565b336000908152600560205260409020555050505050565b60006016815b0154905090565b6001821161281e5760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b6064820152608401610447565b600081116128675760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b6044820152606401610447565b60195461287690610258612ede565b42106128d25760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b6064820152608401610447565b6020546301000000900460ff16156129265760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610447565b602a546001600160a01b0316331461293d57600080fd5b6020805463ff00000019166301000000179055602291909155602455565b6000546001600160a01b0316331461297257600080fd5b600c5460ff16156129c15760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b6044820152606401610447565b600c805460ff19166001179055565b6000546001600160a01b031633146129e757600080fd5b600c5460ff16612a365760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b6044820152606401610447565b600c805460ff19169055601c54612a4d904261455d565b601f556020805460ff19166001179055565b6000601660016127bd565b6060806000600d546001600160401b03811115612a8957612a89614641565b604051908082528060200260200182016040528015612ab2578160200160208202803683370190505b5090506000600d546001600160401b03811115612ad157612ad1614641565b604051908082528060200260200182016040528015612afa578160200160208202803683370190505b50905060005b600d54811015612b9f5760008181526008602052604090205483516001600160a01b0390911690849083908110612b3957612b39614b61565b6001600160a01b039283166020918202929092018101919091526000838152600882526040808220549093168152600390915220548251839083908110612b8257612b82614b61565b602090810291909101015280612b9781614570565b915050612b00565b5090939092509050565b6000546001600160a01b03163314612bc057600080fd5b6001600160a01b0381166000818152600b60209081526040808320805460ff19166001179055600e805484526010909252822080546001600160a01b0319169093179092558154919061217383614570565b6000546001600160a01b03163314612c2957600080fd5b6114bf81613651565b600080546001600160a01b03163314612c4a57600080fd5b602054600160281b900460ff16612e61576001600160a01b038516612cae5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b6044820152606401610447565b60006064601454602654612cc29190614a2e565b612ccc9190614a45565b905060008315612de7576064612ce28684614a2e565b612cec9190614a45565b601e549091506001600160a01b031663a9059cbb88612d0b848661454a565b6040518363ffffffff1660e01b8152600401612d28929190614b2b565b6020604051808303816000875af1158015612d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6b9190614b44565b50601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612d9e9089908590600401614b2b565b6020604051808303816000875af1158015612dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de19190614b44565b50612e5e565b601e5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612e19908a908690600401614b2b565b6020604051808303816000875af1158015612e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5c9190614b44565b505b50505b506001949350505050565b6039805461123490614990565b601654341015612e8857600080fd5b601754341115612e9757600080fd5b6001600160a01b038216612eaa57600080fd5b80600003612eb757600080fd5b5050565b6000670de0b6b3a764000060135483612ed49190614a2e565b611a839190614a45565b600082821115612ef057612ef0614cd8565b612efa828461454a565b9392505050565b6000612f136064611750846014613092565b90506000612f218383612ede565b6001600160a01b0385811660009081526003602090815260408083208390556004909152808220829055602b549051939450909291169084908381818185875af1925050503d8060008114612f92576040519150601f19603f3d011682016040523d82523d6000602084013e612f97565b606091505b505090506000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe8576040519150601f19603f3d011682016040523d82523d6000602084013e612fed565b606091505b50509050818015612ffb5750805b6130475760405162461bcd60e51b815260206004820181905260248201527f616e7974696d6520726566756e64206661696c6564206174207061796d656e746044820152606401610447565b856001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28660405161308291815260200190565b60405180910390a2505050505050565b6000826000036130a457506000611a83565b6130ae8284614a2e565b9050816130bb8483614a45565b14611a8357611a83614cd8565b6000612efa8284614a45565b601b546026546130ec90670de0b6b3a7640000614a2e565b6130f69190614a45565b601355565b602054610100900460ff16156131235760405162461bcd60e51b8152600401610447906149c4565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a1600061316860646117506014544761309290919063ffffffff16565b9050811561329657600061318160646117508486613092565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146131d0576040519150601f19603f3d011682016040523d82523d6000602084013e6131d5565b606091505b5050602b549091506000906001600160a01b03166131f38585612ede565b604051600081818185875af1925050503d806000811461322f576040519150601f19603f3d011682016040523d82523d6000602084013e613234565b606091505b505090508180156132425750805b61328e5760405162461bcd60e51b815260206004820181905260248201527f756e61626c6520746f2070726f6365737320726566206f7220666565207061796044820152606401610447565b505050613337565b602b546040516000916001600160a01b03169083908381818185875af1925050503d80600081146132e3576040519150601f19603f3d011682016040523d82523d6000602084013e6132e8565b606091505b50509050806133355760405162461bcd60e51b8152602060048201526019602482015278756e61626c6520746f2070726f63657373206665652070617960381b6044820152606401610447565b505b600061335360646117506025544761309290919063ffffffff16565b9050804710156133a35760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b6044820152606401610447565b6133af602754826136bf565b4715613452576000856001600160a01b03164760405160006040518083038185875af1925050503d8060008114613402576040519150601f19603f3d011682016040523d82523d6000602084013e613407565b606091505b50509050806134505760405162461bcd60e51b81526020600482015260156024820152743ab730b13632903a37903830bc9031b932b0ba37b960591b6044820152606401610447565b505b5050505050565b6020805460ff60201b1916600160201b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b602054600160201b900460ff166134e55760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b6044820152606401610447565b6001600160a01b0381166000908152600360205260409020548061354b5760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d006044820152606401610447565b6001600160a01b0382166000818152600360205260408082208290555190919083908381818185875af1925050503d80600081146135a5576040519150601f19603f3d011682016040523d82523d6000602084013e6135aa565b606091505b50509050806135eb5760405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b6044820152606401610447565b826001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518360405161362691815260200190565b60405180910390a2505050565b600061363f828461455d565b905082811015611a8357611a83614cd8565b6001600160a01b03811661366457600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b80600060646136cf83600a614a2e565b6136d99190614a45565b6136e3908361454a565b905083600060646136f583600a614a2e565b6136ff9190614a45565b613709908361454a565b90506000806000603660149054906101000a900460ff161561384d5761372e88613e89565b601e5460365461374a916001600160a01b039081169116614081565b603480546001600160a01b0319166001600160a01b039283169081179091556036546040516370a0823160e01b81529216916370a082319161378e91600401614589565b602060405180830381865afa1580156137ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cf9190614ca2565b601e546034546040516370a0823160e01b81529295506001600160a01b03918216926370a0823192613805921690600401614589565b602060405180830381865afa158015613822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138469190614ca2565b915061397e565b601e5461386a906001600160a01b031661386561229e565b614081565b603480546001600160a01b0319166001600160a01b039290921691909117905561389261229e565b6034546040516370a0823160e01b81526001600160a01b03928316926370a08231926138c392911690600401614589565b602060405180830381865afa1580156138e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139049190614ca2565b601e546034546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261393a921690600401614589565b602060405180830381865afa158015613957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397b9190614ca2565b91505b6034546001600160a01b0316158015906139a157506000831180156139a1575081155b15613aa057866139b18487614a2e565b6139bb9190614a45565b601e5460345460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926139f39216908590600401614b2b565b6020604051808303816000875af1158015613a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a369190614b44565b50603460009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a8757600080fd5b505af1158015613a9b573d6000803e3d6000fd5b505050505b601e54613ab5906001600160a01b031661432f565b50603654600160a01b900460ff1615613c8657603054601e546036546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b0d903090600401614589565b602060405180830381865afa158015613b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4e9190614ca2565b8e603660009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613b909190614589565b602060405180830381865afa158015613bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd19190614ca2565b30613bde4261012c61455d565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7e9190614cee565b505050613d47565b603054601e546001600160a01b039182169163f305d719918a911688888b30613cb14261012c61455d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d1e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d439190614cee565b5050505b6035805460ff60a01b1916600160a01b179055603454603854613d76916001600160a01b0390811691166143cf565b50603854603454602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060399083906370a0823190613dbb903090600401614589565b602060405180830381865afa158015613dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfc9190614ca2565b6040518563ffffffff1660e01b8152600401613e1b9493929190614d1c565b6020604051808303816000875af1158015613e3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e5e9190614cbb565b603580546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603654600160a01b900460ff16613ede5760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b6044820152606401610447565b604080516002808252606082018352600092602083019080368337019050509050613f0761229e565b81600081518110613f1a57613f1a614b61565b6001600160a01b039283166020918202929092010152603654825191169082906001908110613f4b57613f4b614b61565b6001600160a01b039283166020918202929092010152603654613f6e911661432f565b506030546036546001600160a01b0391821691637ff36ab5918591613f94911682611962565b8430613fa24261012c61455d565b6040518663ffffffff1660e01b8152600401613fc19493929190614deb565b60006040518083038185885af1158015613fdf573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526140089190810190614b98565b506036546040516370a0823160e01b81526001600160a01b03909116906370a0823190614039903090600401614589565b602060405180830381865afa158015614056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407a9190614ca2565b6037555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141049190614cbb565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614131929190614e20565b602060405180830381865afa15801561414e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141729190614cbb565b6001600160a01b03161461426c57603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f79190614cbb565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614224929190614e20565b602060405180830381865afa158015614241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142659190614cbb565b9050611a83565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e39190614cbb565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614310929190614e20565b6020604051808303816000875af1158015614241573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b39261438292909116908590600401614b2b565b6020604051808303816000875af11580156143a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c59190614b44565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b39061441c9086908590600401614b2b565b6020604051808303816000875af115801561443b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190614b44565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6020808252601e908201527f496e2077686974656c6973742064697361626c656420636f6f6c204f66660000604082015260600190565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115611a8357611a83614534565b80820180821115611a8357611a83614534565b60006001820161458257614582614534565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145c3576020818501810151868301820152016145a7565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612efa602083018461459d565b60006020828403121561460857600080fd5b5035919050565b6001600160a01b03811681146114bf57600080fd5b60006020828403121561463657600080fd5b8135612efa8161460f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561467f5761467f614641565b604052919050565b80151581146114bf57600080fd5b6000806000608084860312156146aa57600080fd5b84601f8501126146b957600080fd5b604080519081016001600160401b03811182821017156146db576146db614641565b80604052508060408601878111156146f257600080fd5b865b818110156147155780356147078161460f565b8352602092830192016146f4565b5091945050359150606084013561472b81614687565b809150509250925092565b6000806040838503121561474957600080fd5b82356147548161460f565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561479b5781516001600160a01b031687529582019590820190600101614776565b509495945050505050565b602081526000612efa6020830184614762565b60006101e08286835b600a8110156147e15781518352602092830192909101906001016147c2565b50505061014083018560005b600481101561480e57815115158352602092830192909101906001016147ed565b505050806101c08401526148248184018561459d565b9695505050505050565b6000806080838503121561484157600080fd5b83601f84011261485057600080fd5b604051606081016001600160401b038111828210171561487257614872614641565b60405280606085018681111561488757600080fd5b855b818110156148aa57803561489c8161460f565b835260209283019201614889565b5091935050356148b981614687565b809150509250929050565b600080604083850312156148d757600080fd5b50508035926020909101359150565b6040815260006148f96040830185614762565b82810360208481019190915284518083528582019282019060005b8181101561493057845183529383019391830191600101614914565b5090979650505050505050565b6000806000806080858703121561495357600080fd5b843561495e8161460f565b9350602085013561496e8161460f565b925060408501359150606085013561498581614687565b939692955090935050565b600181811c908216806149a457607f821691505b602082108103611ba857634e487b7160e01b600052602260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b8082028115828204841417611a8357611a83614534565b600082614a6257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614b5657600080fd5b8151612efa81614687565b634e487b7160e01b600052603260045260246000fd5b828152604060208201526000614b906040830184614762565b949350505050565b60006020808385031215614bab57600080fd5b82516001600160401b0380821115614bc257600080fd5b818501915085601f830112614bd657600080fd5b815181811115614be857614be8614641565b8060051b9150614bf9848301614657565b8181529183018401918481019088841115614c1357600080fd5b938501935b83851015614c3157845182529385019390850190614c18565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b600060208284031215614cb457600080fd5b5051919050565b600060208284031215614ccd57600080fd5b8151612efa8161460f565b634e487b7160e01b600052600160045260246000fd5b600080600060608486031215614d0357600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d5457607f831692505b8583108103614d7157634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d905760018114614da657614dd1565b60ff198616825284151560051b82019650614dd1565b60008c81526020902060005b86811015614dcb57815484820152908501908901614db2565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614e046080830186614762565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212207a8f82111da54d62d44b739c96232a35a95b62d7dffb748c060e859c3960488864736f6c63430008110033a26469706673582212206c51ac8ce2ad14960f65cc81caeeb948315c970a9abb233f6572aad73066792264736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894

-----Decoded View---------------
Arg [0] : _feeContract (address): 0x0FEbB541Ef3632925cD67DAf9e82CdC8Ec7a71ef
Arg [1] : _lpLockDeployer (address): 0xa27eA368c4198a288eb552D642B1E5aCc29912D4
Arg [2] : _altAssets (address[3]): 0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef
Arg [1] : 000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d4
Arg [2] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [3] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [4] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894


Block Transaction 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
[ 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.