Contract Address Details

0x8684edd3014CEE0Fed4F1608b4B9bdaA96dFDad5

Token
MilkShiba (MSHIB)
Creator
0x526f01–c0e148 at 0x61d89d–0eb780
Balance
0 mADA
Tokens
Fetching tokens...
Transactions
1,160 Transactions
Transfers
7,631 Transfers
Gas Used
100,321,074
Last Balance Update
25860789
Contract name:
MilkShiba




Optimization enabled
true
Compiler version
v0.8.12+commit.f00d7308




Optimization runs
50
EVM Version
default




Verified at
2022-03-30T23:56:55.166869Z

Contract source code

// SPDX-License-Identifier: MIT


/*
    
    MilkShiba - the one true Shib on Milkomeda

    www.MilkShiba.com

    t.me/MilkShiba

*/

pragma solidity ^0.8.12;

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

     

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);
    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);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IDEXPair {
		function factory() external view returns (address);
		function token0() external view returns (address);
		function token1() external view returns (address);
		function sync() external;
}

interface IDEXRouter{
		function factory() external pure returns (address);
		function WETH() external pure returns (address);
        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);
		function addLiquidityETH(
				address token,
				uint amountTokenDesired,
				uint amountTokenMin,
				uint amountETHMin,
				address to,
				uint deadline
		) external payable returns (uint amountToken, uint amountETH, uint liquidity);
		function swapExactTokensForTokens(
				uint amountIn,
				uint amountOutMin,
				address[] calldata path,
				address to,
				uint deadline
		) external returns (uint[] memory amounts);
		function swapTokensForExactTokens(
				uint amountOut,
				uint amountInMax,
				address[] calldata path,
				address to,
				uint deadline
		) external returns (uint[] memory amounts);  
		function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
				external
				returns (uint[] memory amounts); 
		function swapExactTokensForTokensSupportingFeeOnTransferTokens(
			uint amountIn,
			uint amountOutMin,
			address[] calldata path,
			address to,
			uint deadline
		) external;
		function swapExactTokensForETHSupportingFeeOnTransferTokens(
			uint amountIn,
			uint amountOutMin,
			address[] calldata path,
			address to,
			uint deadline
		) external;
}

interface IDEXFactory {
		function getPair(address tokenA, address tokenB) external view returns (address pair);
		function createPair(address tokenA, address tokenB) external returns (address pair);
}

contract Ownable {
    address private _owner;

    event OwnershipRenounced(address indexed previousOwner);

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

    constructor() {
        _owner = msg.sender;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract MilkShiba is ERC20Detailed, Ownable {

    using SafeMath for uint256;
    using SafeMathInt for int256;

    event LogRebase(uint256 indexed epoch, uint256 totalSupply);

    string public _name = "MilkShiba";
    string public _symbol = "MSHIB";
    uint8 public _decimals = 5;

    IDEXPair public pairContract;
    mapping(address => bool) _isFeeExempt;

    uint256 public constant DECIMALS = 5;
    uint256 public constant MAX_UINT256 = ~uint256(0);
    uint8 public constant RATE_DECIMALS = 7;

    uint256 private constant INITIAL_FRAGMENTS_SUPPLY =
        325 * 10**3 * 10**DECIMALS;

    uint256 public liquidityFeeBuy = 40;
    uint256 public spoiledMilkFeeBuy = 0;

    uint256 public liquidityFeeSell = 40;
    uint256 public spoiledMilkFeeSell = 20;

    uint256 public swapFeeBuy = 90;
    uint256 public swapFeeSell = 120;

    uint256 public milkTankShare = 30;    
    uint256 public milkWarShare = 30;    
    uint256 public milkBankShare = 40;
    uint256 public milkPupBountyPercent = 66;
    
    uint256 public totalFeeBuy =
        liquidityFeeBuy.add(swapFeeBuy).add(spoiledMilkFeeBuy);
        uint256 public totalFeeSell =
        liquidityFeeSell.add(swapFeeSell).add(spoiledMilkFeeSell);        
    uint256 public constant feeDenominator = 1000;
    IDEXRouter public router;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address public constant ZERO = 0x0000000000000000000000000000000000000000;
    
    //ADA Mainnet
    address public USDAddress = address(0xB44a9B6905aF7c801311e8F4E76932ee959c663C);
    address public _routerAddress = address(0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C); 

    // //ADA Testnet
    // address public USDAddress = address(0xC12F6Ee5c853393105f29EF0310e61e6B494a70F);
    // address public _routerAddress = address(0x347e2a75e99174d46D94B5D7b4BE8f294bc2F5Fc); 
    
    
    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet electedCouncil;
    EnumerableSet.AddressSet milkPups;

    address public milkShiba = ZERO;
    uint256 public milkShibaScore;
    address public milkPup = ZERO;
    uint256 public milkPupScore;

    uint256 public totalmilkPup;
    
    uint256 public timeLastMilkPup;
    uint256 public timeLastMilkShiba;
    uint256 public milkPupRoundDuration = 30 minutes;
    uint256 public milkShibaRoundDuration = 1 days;                  

    mapping(address => uint256) public timesAsmilkPup;
     
    mapping(address => uint256) public timesWinMilkBattle;  
    mapping(address => uint256) public timesWinBuy;  
    mapping(address => uint256) public maxWinBuy;  
    mapping(address => uint256) public winCouncilBuy; 
    mapping(address => uint256) public individualmilkShibaBounty;
    mapping(address => uint256) public individualmilkPupBounty;

    address public mostWinsmilkPup;
    uint256 public mostWinsAsmilkPup;    
 
    uint256 public totalmilkShibaBounty;
    uint256 public totalmilkPupBounty;

    mapping(address => bool) public fallenToGreed; 
    uint256 public totalFallenToGreed; 

    address public autoLiquidityFund;
    address public milkBank;
    address public milkTank;
    address public spoiledMilk;
    address public pairAddress;
    bool public swapEnabled = true;
    bool public useTradeLimits = true;
    
    address public pair;
    bool inSwap = false;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    uint256 private constant TOTAL_GONS =
        MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);

    uint256 private constant MAX_SUPPLY = 325 * 10**7 * 10**DECIMALS;

    uint256 public INDEX;

    bool public _autoRebase;
    bool public _autoAddLiquidity;
    uint256 public _initRebaseStartTime;
    uint256 public _lastRebasedTime;
    uint256 public _lastAddLiquidityTime;
    uint256 public _rebaseIncremenet = 0;
    uint256 public _rebaseCooldown;
    uint256 public _liquidityAddCooldown;
    
    uint256 public _totalSupply;
    uint256 public swapLimit;
    uint256 private _gonsPerFragment;

    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowedFragments;
    mapping(address => bool) public blacklist;

    constructor() ERC20Detailed(_name, _symbol, uint8(DECIMALS)) Ownable() {

        
        router = IDEXRouter(_routerAddress); 

        pair = IDEXFactory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );
        
        autoLiquidityFund = address(0x4548A20CAd4707Cbd38c205079bD9eD3c88aE103);
        milkBank =  msg.sender;
        milkTank =  address(0x47ca15f1E2bE671B0B26C2599A25F3e012a1A7ca);
        spoiledMilk = ZERO;

        _allowedFragments[address(this)][address(router)] = MAX_UINT256;
        pairAddress = pair;
        pairContract = IDEXPair(pair);

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        swapLimit = 2 * _totalSupply / 1000;
        _gonBalances[milkBank] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);
        _initRebaseStartTime = block.timestamp;
        _lastRebasedTime = block.timestamp;
        _autoRebase = true;
        _autoAddLiquidity = true;
        _isFeeExempt[milkBank] = true;
        _isFeeExempt[address(this)] = true;

        INDEX = gonsForBalance(100000);

        _rebaseCooldown = 15 minutes;
        _liquidityAddCooldown = 15 minutes;           
        timeLastMilkShiba = block.timestamp;
        timeLastMilkPup = block.timestamp;

        _transferOwnership(milkBank);
        emit Transfer(address(0x0), milkBank, _totalSupply);
    }

    function rebase() internal {
        if ( inSwap ) return;
        uint256 rebaseRate;
        uint256 deltaTimeFromInit = block.timestamp - _initRebaseStartTime;
        uint256 deltaTime = block.timestamp - _lastRebasedTime;
        uint256 times = deltaTime.div(_rebaseCooldown);
        uint256 epoch = times.mul(_rebaseCooldown / 60);

        if (deltaTimeFromInit >= (8 * 365 days)) {
            rebaseRate = 8 + _rebaseIncremenet / 320;
        } else if (deltaTimeFromInit >= (5 * 365 days)) {
            rebaseRate = 33 + _rebaseIncremenet / 80;
        } else if (deltaTimeFromInit >= (3 * 365 days)) {
            rebaseRate = 62 + _rebaseIncremenet / 40;
        } else if (deltaTimeFromInit >= (2 * 365 days)) {
            rebaseRate = 125 + _rebaseIncremenet / 20;
        } else if (deltaTimeFromInit >= (365 days)) {
            rebaseRate = 224 + _rebaseIncremenet / 10;
        } else {
            rebaseRate = 2362 + _rebaseIncremenet;
        } 
        
        for (uint256 i = 0; i < times; i++) {
            _totalSupply = _totalSupply
                .mul((10**RATE_DECIMALS).add(rebaseRate))
                .div(10**RATE_DECIMALS);
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);
        _lastRebasedTime = _lastRebasedTime.add(times.mul(_rebaseCooldown));

        pairContract.sync();

        emit LogRebase(epoch, _totalSupply);
    }

    function transfer(address to, uint256 value) external override returns (bool){
        _transferFrom(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint256 value) external override returns (bool) {
        if (_allowedFragments[from][msg.sender] != MAX_UINT256) {
            _allowedFragments[from][msg.sender] = _allowedFragments[from][
                msg.sender
            ].sub(value, "Insufficient Allowance");
        }
        _transferFrom(from, to, value);
        return true;
    }

    function _basicTransfer(address from, address to, uint256 amount) internal returns (bool) {
        uint256 gonAmount = amount.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonAmount);
        _gonBalances[to] = _gonBalances[to].add(gonAmount);
        return true;
    }

    function toggleTradeLimits(bool _useTradeLimits) external onlyOwner {
        useTradeLimits = _useTradeLimits;
    }

    function setSwapLimit(uint256 _swapLimit) external onlyOwner {
        swapLimit = _swapLimit;
    }
    
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        require(!blacklist[sender] && !blacklist[recipient], "in_blacklist");

        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (shouldRebase()) {
           rebase();
        }

        if (shouldAddLiquidity()) {
            addLiquidity();
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 gonAmount = amount.mul(_gonsPerFragment);
        if(useTradeLimits && sender != owner() && recipient != pair){
             require(_gonBalances[recipient].add(gonAmount) <= gonsForBalance(_totalSupply) / 50, "Initial 2% max wallet restriction");
        }

        _gonBalances[sender] = _gonBalances[sender].sub(gonAmount);
        uint256 gonAmountReceived;
        if(shouldTakeFee(sender, recipient)){
            gonAmountReceived = takeFee(sender, recipient, gonAmount);
            
            if(sender == pair){
                address[] memory path = new address[](2);
                path[0] = router.WETH();
                path[1] = address(this);
                uint256 buyAmountADA = router.getAmountsIn(amount, path)[0];

                if(block.timestamp > timeLastMilkPup + milkPupRoundDuration && milkPup != ZERO){
                    if(milkPups.contains(milkPup) == false){
                        milkPups.add(milkPup);                        
                    }
                    timesWinMilkBattle[milkPup] ++;
                    timesWinBuy[milkPup] += milkPupScore;
                    if(timesWinMilkBattle[milkPup] > mostWinsAsmilkPup){
                        mostWinsmilkPup = milkPup;
                        mostWinsAsmilkPup = timesWinMilkBattle[milkPup];
                    }
                    maxWinBuy[milkPup] = milkPupScore > maxWinBuy[milkPup] ? milkPupScore : maxWinBuy[milkPup];
                    milkPup = ZERO;
                    milkPupScore = 0;
                }
                if(block.timestamp > timeLastMilkShiba + milkShibaRoundDuration && milkShiba != ZERO){
                    if(electedCouncil.contains(milkShiba) == false){
                        electedCouncil.add(milkShiba);
                        winCouncilBuy[milkShiba] = milkShibaScore;
                    }                    
                    milkShiba = ZERO;
                    milkShibaScore = 0;
                }

                if(buyAmountADA > milkPupScore && !fallenToGreed[recipient]){                                    
                    if(timesAsmilkPup[recipient] == 0){
                        totalmilkPup++;                         
                    }                        
                    if(milkPup != recipient){
                        timesAsmilkPup[recipient]++;
                        milkPup = recipient;
                    }                    
                    milkPupScore = buyAmountADA;
                    timeLastMilkPup = block.timestamp;
                    if(buyAmountADA > milkShibaScore){ 
                        if(milkShiba != recipient){ 
                            milkShiba = recipient;
                        }
                        milkShibaScore = buyAmountADA;
                        timeLastMilkShiba = block.timestamp;
                    }
                }
            }
            else if(recipient == pair){
                if(sender == milkPup || sender == milkShiba){
                    fallenToGreed[sender] = true;
                    totalFallenToGreed++;                
                    if(sender == milkPup){                    
                        milkPup = ZERO;
                        milkPupScore = 0;
                        timeLastMilkPup = block.timestamp;                    
                    }    
                    if(sender == milkShiba){                    
                        milkShiba = ZERO;
                        milkShibaScore = 0;
                        timeLastMilkShiba = block.timestamp;
                    }  
                }
            }

        }
        else{             
            gonAmountReceived = gonAmount; 
        }
        _gonBalances[recipient] = _gonBalances[recipient].add(gonAmountReceived);


        emit Transfer(sender,recipient, gonAmountReceived.div(_gonsPerFragment));
        return true;
    }

    function takeFee(address sender, address recipient, uint256 gonAmount) internal  returns (uint256) {
        uint256 feeAmount;
        if (recipient == pair) {
            _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk].add(
            gonAmount.div(feeDenominator).mul(spoiledMilkFeeSell)
            );
            _gonBalances[address(this)] = _gonBalances[address(this)].add(
                gonAmount.div(feeDenominator).mul(swapFeeSell)
            );
            _gonBalances[autoLiquidityFund] = _gonBalances[autoLiquidityFund].add(
                gonAmount.div(feeDenominator).mul(liquidityFeeSell)
            );
            feeAmount = gonAmount.div(feeDenominator).mul(totalFeeSell);    
        }
        else{   
            _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk].add(
            gonAmount.div(feeDenominator).mul(spoiledMilkFeeBuy)
            );
            _gonBalances[address(this)] = _gonBalances[address(this)].add(
                gonAmount.div(feeDenominator).mul(swapFeeBuy)
            );
            _gonBalances[autoLiquidityFund] = _gonBalances[autoLiquidityFund].add(
                gonAmount.div(feeDenominator).mul(liquidityFeeBuy)
            );
            feeAmount = gonAmount.div(feeDenominator).mul(totalFeeBuy);
        }
       
        emit Transfer(sender, address(this), feeAmount.div(_gonsPerFragment));
        return gonAmount.sub(feeAmount);
    }

    function addLiquidity() internal swapping {        
        uint256 autoLiquidityAmount = _gonBalances[autoLiquidityFund].div(
            _gonsPerFragment
        );
        _gonBalances[address(this)] = _gonBalances[address(this)].add(
            _gonBalances[autoLiquidityFund]
        );
        _gonBalances[autoLiquidityFund] = 0;
        uint256 amountToLiquify = autoLiquidityAmount.div(2);
        uint256 amountToSwap = autoLiquidityAmount.sub(amountToLiquify);

        if( amountToSwap == 0 ) {
            return;
        }
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        uint256 balanceBefore = address(this).balance;
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amountETHLiquidity = address(this).balance.sub(balanceBefore);

        if (amountToLiquify > 0 && amountETHLiquidity > 0) {
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityFund,
                block.timestamp
            );
        }
        _lastAddLiquidityTime = block.timestamp;
    }

    function swapBack() internal swapping {     
        uint256 amountToSwap = _gonBalances[address(this)].div(_gonsPerFragment);
        amountToSwap = amountToSwap >= swapLimit ? swapLimit : amountToSwap;
        if( amountToSwap == 0) {
            return;
        }
 
        uint256 milkBankTokens = amountToSwap * milkBankShare / 100;
        uint256 milkWarTokens = amountToSwap * milkWarShare / 100;
        uint256 milkTankTokens = amountToSwap - milkBankTokens - milkWarTokens;
        
        uint256 spoiledMilkAmount = 0;
        if(milkPupScore == 0 || milkShibaScore == 0){
            if(milkPupScore == 0){
                spoiledMilkAmount += milkPupBountyPercent * milkWarTokens / 100;                                
            }
            if(milkShibaScore == 0){
                spoiledMilkAmount += (100 - milkPupBountyPercent) * milkWarTokens / 100;                                
            }
            milkWarTokens -= spoiledMilkAmount;
             
            _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk] + spoiledMilkAmount;
        }
        uint256 tokensToSwap = milkBankTokens + milkWarTokens + milkTankTokens;
        uint256 balanceBefore = address(this).balance;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amountETH = address(this).balance.sub(balanceBefore);

        if(milkPupScore != 0 || milkShibaScore != 0){
            uint256 bnbForBounty = amountETH * milkWarTokens / tokensToSwap; 
            if(milkPupScore != 0 && milkShibaScore != 0){
                uint256 bnbFormilkPup = milkPupBountyPercent * bnbForBounty / 100;
                uint256 bnbFormilkShiba = bnbForBounty - bnbFormilkPup;
                (bool temp,) = payable(milkShiba).call{value: bnbFormilkShiba, gas: 30000}("");                 
                (temp,) = payable(milkPup).call{value: bnbFormilkPup, gas: 30000}(""); 
                individualmilkShibaBounty[milkShiba] += bnbFormilkShiba;
                individualmilkPupBounty[milkPup] += bnbFormilkPup;
                totalmilkShibaBounty += bnbFormilkShiba;
                totalmilkPupBounty += bnbFormilkPup;                 
            }
            else if(milkPupScore != 0){
                (bool temp,) = payable(milkPup).call{value: bnbForBounty, gas: 30000}("");temp; //warning-suppresion                
                individualmilkPupBounty[milkPup] += bnbForBounty;
                totalmilkPupBounty += bnbForBounty;
            }
            else{
                (bool temp,) = payable(milkShiba).call{value: bnbForBounty, gas: 30000}("");temp;                
                individualmilkShibaBounty[milkShiba] += bnbForBounty;
                totalmilkShibaBounty += bnbForBounty;
            }
        }
        
        ( bool tempo,) = payable(milkBank).call{value: amountETH * milkBankTokens / tokensToSwap, gas: 30000}("");tempo; //warning-suppresion 
        (tempo, ) = payable(milkTank).call{value: address(this).balance, gas: 30000}("");
    }

    function withdrawAllTomilkBank() external swapping onlyOwner {
        uint256 amountToSwap = _gonBalances[address(this)].div(_gonsPerFragment);
        require( amountToSwap > 0,"There is no milkWar token deposited in token contract");
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            milkBank,
            block.timestamp
        );
    }

    function shouldTakeFee(address from, address to) internal view returns (bool){
        return (pair == from || pair == to) && !_isFeeExempt[to] && !_isFeeExempt[from];
    }

    function shouldRebase() internal view returns (bool) {
        return _autoRebase && (_totalSupply < MAX_SUPPLY) && msg.sender != pair &&
         !inSwap && block.timestamp >= (_lastRebasedTime + _rebaseCooldown);
    }

    function shouldAddLiquidity() internal view returns (bool) {
        return _autoAddLiquidity && !inSwap &&  msg.sender != pair &&
            block.timestamp >= (_lastAddLiquidityTime + _liquidityAddCooldown);
    }

    function shouldSwapBack() internal view returns (bool) {
        return !inSwap && msg.sender != pair; 
    }

    function setAutoRebase(bool _flag, uint256 rebaseCooldown, uint256 rebaseIncrement) external onlyOwner {
        if (_flag) {
            require(rebaseIncrement <= 268, "Upper APY cap at 1,003,975 %");
            require(rebaseCooldown >= 15 minutes && rebaseCooldown <= 18 minutes , "Lower APY cap at 98,853 %");
            _autoRebase = _flag;
            _lastRebasedTime = block.timestamp;
            _rebaseCooldown = rebaseCooldown;
            _rebaseIncremenet = rebaseIncrement;
        } else {
            _autoRebase = _flag;
        }
    }

    function setAutoAddLiquidity(bool _flag, uint256 liquidityAddCooldown) external onlyOwner {
        if(_flag) {
            require(liquidityAddCooldown >= 15 minutes && liquidityAddCooldown <= 2 days, "Liquidity injection cooldown restricted.");
            _autoAddLiquidity = _flag;
            _lastAddLiquidityTime = block.timestamp;
            _liquidityAddCooldown = liquidityAddCooldown;
        } else {
            _autoAddLiquidity = _flag;
        }
    }

    function allowance(address owner_, address spender) external view override returns (uint256) {
        return _allowedFragments[owner_][spender];
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowedFragments[msg.sender][spender] = 0;
        } else {
            _allowedFragments[msg.sender][spender] = oldValue.sub(
                subtractedValue
            );
        }
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][
            spender
        ].add(addedValue);
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    function approve(address spender, uint256 value) external override returns (bool) {
        _allowedFragments[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function checkFeeExempt(address _addr) external view returns (bool) {
        return _isFeeExempt[_addr];
    }

    function getCirculatingSupply() public view returns (uint256) {
        return (TOTAL_GONS.sub(_gonBalances[spoiledMilk].sub(_gonBalances[DEAD])).sub(_gonBalances[ZERO]))
        .div(_gonsPerFragment);
    }

    function isNotInSwap() external view returns (bool) {
        return !inSwap;
    }

    function manualSync() external {
        IDEXPair(pair).sync();
    }

    function setFeeReceivers(address _autoLiquidityFund, address _milkBank, address _milkTank) external onlyOwner {
        autoLiquidityFund = _autoLiquidityFund;
        milkBank = _milkBank;
        milkTank = _milkTank;
    }

    function setFees(uint256 _liquidityFeeBuy, uint256 _liquidityFeeSell,
        uint256 _spoiledMilkFeeBuy, uint256 _spoiledMilkFeeSell,
        uint256 _swapFeeBuy, uint256 _swapFeeSell,
        uint256 _milkTankShare, uint256 _milkWarShare, uint256 _milkBankShare,
        uint256 _milkPupBountyPercent) external onlyOwner {

        require(_liquidityFeeBuy > 0 && _liquidityFeeSell > 0 && 
        _liquidityFeeBuy + _spoiledMilkFeeBuy + _swapFeeBuy <= 300 &&
         _liquidityFeeSell + _spoiledMilkFeeSell + _swapFeeSell <= 300, "Fees too high, 30% max.");
                
        require(_milkWarShare >= 30 && _milkPupBountyPercent >= 50, "Fighters need be paid.");
        assert(_milkTankShare + _milkWarShare + _milkBankShare == 100);

        liquidityFeeBuy = _liquidityFeeBuy;
        liquidityFeeSell = _liquidityFeeSell;

        spoiledMilkFeeBuy = _spoiledMilkFeeBuy;
        spoiledMilkFeeSell = _spoiledMilkFeeSell;

        swapFeeBuy = _swapFeeBuy;
        swapFeeSell = _swapFeeSell;

        milkTankShare = _milkTankShare;    
        milkWarShare = _milkWarShare;    
        milkBankShare = _milkBankShare;
        
        milkPupBountyPercent = _milkPupBountyPercent;
        
        totalFeeBuy =
            liquidityFeeBuy.add(swapFeeBuy).add(spoiledMilkFeeBuy);
        totalFeeSell =
            liquidityFeeSell.add(swapFeeSell).add(spoiledMilkFeeSell); 

    }

    function setmilkPupRound(uint256 _milkPupRoundDuration) external onlyOwner {
        require(_milkPupRoundDuration >= 15 minutes && _milkPupRoundDuration <= 1 hours, "Duration of rounds in milkWar restricted.");
        milkPupRoundDuration = _milkPupRoundDuration;
    }

    function setWhitelist(address _addr) external onlyOwner {
        _isFeeExempt[_addr] = true;
    }

    function setBotBlacklist(address _botAddress, bool _flag) external onlyOwner {
        require(isContract(_botAddress), "Only contract address, not allowed externally owned account");
        blacklist[_botAddress] = _flag;    
    }
    
    function setPairAddress(address _pairAddress) external onlyOwner {
        pairAddress = _pairAddress;
    }

    function setLP(address _address) external onlyOwner {
        pairContract = IDEXPair(_address);
    }
    
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }
   
    function balanceOf(address who) external view override returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    function isContract(address addr) internal view returns (bool) {
        uint size;
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

    function gonsForBalance(uint256 amount) public view returns (uint256) {
        return amount.mul(_gonsPerFragment);
    }

    function balanceForGons(uint256 gons) public view returns (uint256) {
        return gons.div(_gonsPerFragment);
    }

    function index() public view returns (uint256) {
        return balanceForGons(INDEX);
    }


    struct MilkBattleOracleData{
        address  milkShiba;
        uint256  milkShibaScore;
        address  milkPup;
        uint256  milkPupScore;

        uint256  timeLastMilkPup;
        uint256  timeLastMilkShiba;
    
        address  mostWinsmilkPup;
        uint256  mostWinsAsmilkPup;
    
        uint256  totalFighters;
        uint256  totalmilkPup;
        uint256  totalmilkShiba;
        uint256  totalmilkShibaBounty;
        uint256  totalmilkPupBounty;
        uint256  totalFallenToGreed; 

        uint256 liquidity;
        uint256 milkBank;
        uint256 spoiledMilk;

        uint256 lastRebasedTime;

    }
function getMilkBattleOracleData() external view returns(MilkBattleOracleData memory){
        MilkBattleOracleData memory data = MilkBattleOracleData(
            milkShiba, milkShibaScore, milkPup, milkPupScore,
            timeLastMilkPup, timeLastMilkShiba, 
            mostWinsmilkPup, mostWinsAsmilkPup, totalmilkPup,
            milkPups.length(), electedCouncil.length(), totalmilkShibaBounty, totalmilkPupBounty,
            totalFallenToGreed, getPairValue(), milkBank.balance, getspoiledMilkValue(), _lastRebasedTime);
            return data;
    }
     

    struct MilkBattleOracleDataWallet{
        bool inCouncil;
        uint256 timesWinMilkBattle;
        uint256 timesWinBuy;
        
        bool fallenToGreed;      
        uint256 individualAresBounty;
        uint256 individualmilkPupBounty;

        uint256  maxWinBuy;
        uint256  winCouncilBuy;
    }  

    

     function getMilkBattleOracleDataWallet(address wallet) external view returns (MilkBattleOracleDataWallet memory){
        MilkBattleOracleDataWallet memory data = MilkBattleOracleDataWallet(
            electedCouncil.contains(wallet), timesWinMilkBattle[wallet],  timesWinBuy[wallet],
            fallenToGreed[wallet], individualmilkShibaBounty[wallet], individualmilkPupBounty[wallet],
            maxWinBuy[wallet], winCouncilBuy[wallet]);        
             return data;
    }

    function getEstimatedUSD(uint256 amount, bool fromToken) public view returns (uint256){        
        if(fromToken){
            address[] memory path = new address[](3);
            path[0] = USDAddress;        
            path[1] = router.WETH();
            path[2] = address(this);
            return router.getAmountsIn(amount, path)[0];
        }else{
            address[] memory path = new address[](2);
            path[0] = USDAddress;        
            path[1] = router.WETH();            
            return router.getAmountsIn(amount, path)[0];
        }                
    }

    function getspoiledMilkValue() public view returns (uint256){
        if(this.balanceOf(ZERO) == 0){
            return 0;
        }
        else{
            return getEstimatedUSD(this.balanceOf(ZERO), true);
        }       
    }

    function getPairValue() public view returns (uint256){               
        return getEstimatedUSD(IERC20(router.WETH()).balanceOf(pair), false);
    }

    function getMilkPupAt(uint256 _index) external view returns(address) {
        return milkPups.at(_index);
    }

    function getMilkShibaAt(uint256 _index) external view returns(address) {
        return electedCouncil.at(_index);
    }

    function getmilkPupCount() external view returns(uint256) {
        return milkPups.length();
    }

    function getMilkShibaCount() external view returns(uint256) {
        return electedCouncil.length();
    }

    receive() external payable {}
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogRebase","inputs":[{"type":"uint256","name":"epoch","internalType":"uint256","indexed":true},{"type":"uint256","name":"totalSupply","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipRenounced","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DECIMALS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"INDEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_UINT256","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"RATE_DECIMALS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"USDAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ZERO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_autoAddLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_autoRebase","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"_decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_initRebaseStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_lastAddLiquidityTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_lastRebasedTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityAddCooldown","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"_name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rebaseCooldown","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rebaseIncremenet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_routerAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"_symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner_","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"autoLiquidityFund","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceForGons","inputs":[{"type":"uint256","name":"gons","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"who","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"blacklist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkFeeExempt","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"fallenToGreed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEstimatedUSD","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bool","name":"fromToken","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MilkShiba.MilkBattleOracleData","components":[{"type":"address","name":"milkShiba","internalType":"address"},{"type":"uint256","name":"milkShibaScore","internalType":"uint256"},{"type":"address","name":"milkPup","internalType":"address"},{"type":"uint256","name":"milkPupScore","internalType":"uint256"},{"type":"uint256","name":"timeLastMilkPup","internalType":"uint256"},{"type":"uint256","name":"timeLastMilkShiba","internalType":"uint256"},{"type":"address","name":"mostWinsmilkPup","internalType":"address"},{"type":"uint256","name":"mostWinsAsmilkPup","internalType":"uint256"},{"type":"uint256","name":"totalFighters","internalType":"uint256"},{"type":"uint256","name":"totalmilkPup","internalType":"uint256"},{"type":"uint256","name":"totalmilkShiba","internalType":"uint256"},{"type":"uint256","name":"totalmilkShibaBounty","internalType":"uint256"},{"type":"uint256","name":"totalmilkPupBounty","internalType":"uint256"},{"type":"uint256","name":"totalFallenToGreed","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"milkBank","internalType":"uint256"},{"type":"uint256","name":"spoiledMilk","internalType":"uint256"},{"type":"uint256","name":"lastRebasedTime","internalType":"uint256"}]}],"name":"getMilkBattleOracleData","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MilkShiba.MilkBattleOracleDataWallet","components":[{"type":"bool","name":"inCouncil","internalType":"bool"},{"type":"uint256","name":"timesWinMilkBattle","internalType":"uint256"},{"type":"uint256","name":"timesWinBuy","internalType":"uint256"},{"type":"bool","name":"fallenToGreed","internalType":"bool"},{"type":"uint256","name":"individualAresBounty","internalType":"uint256"},{"type":"uint256","name":"individualmilkPupBounty","internalType":"uint256"},{"type":"uint256","name":"maxWinBuy","internalType":"uint256"},{"type":"uint256","name":"winCouncilBuy","internalType":"uint256"}]}],"name":"getMilkBattleOracleDataWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getMilkPupAt","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getMilkShibaAt","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMilkShibaCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPairValue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getmilkPupCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getspoiledMilkValue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gonsForBalance","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"index","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"individualmilkPupBounty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"individualmilkShibaBounty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isNotInSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeSell","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSync","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWinBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkBank","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkBankShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupBountyPercent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupRoundDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupScore","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkShiba","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkShibaRoundDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkShibaScore","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkTank","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkTankShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkWarShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mostWinsAsmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"mostWinsmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pairAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXPair"}],"name":"pairContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoAddLiquidity","inputs":[{"type":"bool","name":"_flag","internalType":"bool"},{"type":"uint256","name":"liquidityAddCooldown","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoRebase","inputs":[{"type":"bool","name":"_flag","internalType":"bool"},{"type":"uint256","name":"rebaseCooldown","internalType":"uint256"},{"type":"uint256","name":"rebaseIncrement","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBotBlacklist","inputs":[{"type":"address","name":"_botAddress","internalType":"address"},{"type":"bool","name":"_flag","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityFund","internalType":"address"},{"type":"address","name":"_milkBank","internalType":"address"},{"type":"address","name":"_milkTank","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_liquidityFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_liquidityFeeSell","internalType":"uint256"},{"type":"uint256","name":"_spoiledMilkFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_spoiledMilkFeeSell","internalType":"uint256"},{"type":"uint256","name":"_swapFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_swapFeeSell","internalType":"uint256"},{"type":"uint256","name":"_milkTankShare","internalType":"uint256"},{"type":"uint256","name":"_milkWarShare","internalType":"uint256"},{"type":"uint256","name":"_milkBankShare","internalType":"uint256"},{"type":"uint256","name":"_milkPupBountyPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLP","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPairAddress","inputs":[{"type":"address","name":"_pairAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapLimit","inputs":[{"type":"uint256","name":"_swapLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhitelist","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setmilkPupRound","inputs":[{"type":"uint256","name":"_milkPupRoundDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"spoiledMilk","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"spoiledMilkFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"spoiledMilkFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeLastMilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeLastMilkShiba","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesAsmilkPup","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesWinBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesWinMilkBattle","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleTradeLimits","inputs":[{"type":"bool","name":"_useTradeLimits","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFallenToGreed","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkPupBounty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkShibaBounty","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"useTradeLimits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"winCouncilBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAllTomilkBank","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106105415760003560e01c8063715018a6116102af578063afb9cf6d11610171578063dd62ed3e116100d2578063dd62ed3e14611017578063e4b2c6d41461105d578063e91fa7fb14611073578063e92433b314611093578063ea98b8da146110c0578063edf2618a146110d5578063f2fde38b146110eb578063f51e716d1461110b578063f6e785361461112b578063f887ea40146111b0578063f8d71dfc146111d0578063f9f92be4146111e6578063fa64a3c214611216578063fb5f27fb1461122c57600080fd5b8063afb9cf6d14610e7f578063b03e838a14610e99578063b09f126614610eb9578063c032e0a214610ece578063c1689c6414610ee4578063c9a9488214610f11578063c9c8577314610f27578063cd5fc1b514610f47578063cede0ff514610f5d578063d28d885214610f73578063d439979014610f88578063d500a6ea14610fc1578063d7c0103214610fd7578063d9e6646014610ff757600080fd5b80639669b6c01161021b5780639669b6c014610d045780639797c8cf14610d1a5780639b2912cc14610d3b5780639b87676c14610d51578063a12a27a114610d67578063a22d483214610d7d578063a457c2d714610d9d578063a583b5d414610dbd578063a8aa1b3114610dd3578063a8b0898214610df3578063a9059cbb14610e13578063a9bdccf814610e33578063abfb426c14610e49578063ad80114e14610e5f57600080fd5b8063715018a614610bad578063753d02a114610bc25780637965d56d14610bd757806382d2011614610bf757806383b4ac6814610c0d578063854cff2f14610c2d5780638775782814610c4d5780638cbb710c14610c635780638da5cb5b14610c905780638f32d59b14610ca557806393a6e27414610cba57806395d89b4114610cda57806395e8477c14610cef57600080fd5b80633950935111610403578063615abd4311610364578063615abd43146109f9578063655fcfd214610a1957806365a484e114610a2f57806368587dcf14610a455780636912652c14610a655780636974a51314610a845780636a01f09c14610ab15780636a28e3f914610ac75780636ae1270914610ae95780636b6570b414610b095780636c3409d314610b295780636ddd171314610b565780636e9d80dd14610b7757806370a0823114610b8d57600080fd5b806339509351146108715780633dad4a0d146108915780633eaaf86b146108b15780634771749d146108c757806349499c0d146108dc5780634b46e301146108fc5780634be7fe3c1461091c5780634d709adf146109325780634f0c9c4214610957578063530553d61461096c578063531484161461099957806358fa63ca146109af5780635a604c52146109c45780635ddb4ae2146109d957600080fd5b806321cfcd50116104ad57806321cfcd50146106ed5780632231f25c1461071a57806323b872dd146107305780632986c0e5146107505780632ac3495a146107655780632b112e49146107855780632df75cb11461079a5780632e0f2625146107b05780632f34d282146107c5578063313ce567146107e557806332424aa31461080b57806332b756831461082557806333a581d21461083b57806337c9be871461085157600080fd5b806303fd2a451461054d5780630614824a1461057957806306fdde031461059d5780630917377f146105bf578063095ea7b3146105df5780630c97da9e1461060f5780630e3d505d1461062f5780631107b3a51461065f578063180b0d7e1461067557806318160ddd1461068b5780631b2b4bcb146106a05780631bd39674146106b65780632051b87b146106d657600080fd5b3661054857005b600080fd5b34801561055957600080fd5b5061056361dead81565b604051610570919061436c565b60405180910390f35b34801561058557600080fd5b5061058f600a5481565b604051908152602001610570565b3480156105a957600080fd5b506105b2611242565b6040516105709190614380565b3480156105cb57600080fd5b50601454610563906001600160a01b031681565b3480156105eb57600080fd5b506105ff6105fa3660046143ea565b6112d4565b6040519015158152602001610570565b34801561061b57600080fd5b5061058f61062a36600461442b565b61132f565b34801561063b57600080fd5b506105ff61064a366004614457565b602e6020526000908152604090205460ff1681565b34801561066b57600080fd5b5061058f60095481565b34801561068157600080fd5b5061058f6103e881565b34801561069757600080fd5b50603e5461058f565b3480156106ac57600080fd5b5061058f603c5481565b3480156106c257600080fd5b5061058f6106d1366004614474565b6115b5565b3480156106e257600080fd5b506106eb6115cc565b005b3480156106f957600080fd5b5061058f610708366004614457565b60256020526000908152604090205481565b34801561072657600080fd5b5061058f600f5481565b34801561073c57600080fd5b506105ff61074b36600461448d565b6117d5565b34801561075c57600080fd5b5061058f61189a565b34801561077157600080fd5b506106eb6107803660046144ce565b6118ac565b34801561079157600080fd5b5061058f6119a4565b3480156107a657600080fd5b5061058f60365481565b3480156107bc57600080fd5b5061058f600581565b3480156107d157600080fd5b506106eb6107e0366004614457565b611a5c565b3480156107f157600080fd5b5060025460ff165b60405160ff9091168152602001610570565b34801561081757600080fd5b506005546107f99060ff1681565b34801561083157600080fd5b5061058f60395481565b34801561084757600080fd5b5061058f60001981565b34801561085d57600080fd5b506106eb61086c366004614501565b611a95565b34801561087d57600080fd5b506105ff61088c3660046143ea565b611b43565b34801561089d57600080fd5b50603254610563906001600160a01b031681565b3480156108bd57600080fd5b5061058f603e5481565b3480156108d357600080fd5b5061058f611bb6565b3480156108e857600080fd5b50603354610563906001600160a01b031681565b34801561090857600080fd5b506106eb610917366004614474565b611bc2565b34801561092857600080fd5b5061058f600b5481565b34801561093e57600080fd5b506005546105639061010090046001600160a01b031681565b34801561096357600080fd5b5061058f611bd8565b34801561097857600080fd5b5061058f610987366004614457565b60266020526000908152604090205481565b3480156109a557600080fd5b5061058f60125481565b3480156109bb57600080fd5b50610563600081565b3480156109d057600080fd5b506107f9600781565b3480156109e557600080fd5b50603054610563906001600160a01b031681565b348015610a0557600080fd5b50610563610a14366004614474565b611be4565b348015610a2557600080fd5b5061058f602d5481565b348015610a3b57600080fd5b5061058f60215481565b348015610a5157600080fd5b50602a54610563906001600160a01b031681565b348015610a7157600080fd5b506037546105ff90610100900460ff1681565b348015610a9057600080fd5b5061058f610a9f366004614457565b60276020526000908152604090205481565b348015610abd57600080fd5b5061058f603f5481565b348015610ad357600080fd5b50610adc611bf1565b604051610570919061452d565b348015610af557600080fd5b50601a54610563906001600160a01b031681565b348015610b1557600080fd5b50603154610563906001600160a01b031681565b348015610b3557600080fd5b5061058f610b44366004614457565b60246020526000908152604090205481565b348015610b6257600080fd5b506034546105ff90600160a01b900460ff1681565b348015610b8357600080fd5b5061058f60225481565b348015610b9957600080fd5b5061058f610ba8366004614457565b611d76565b348015610bb957600080fd5b506106eb611d9b565b348015610bce57600080fd5b506106eb611dfb565b348015610be357600080fd5b5061058f610bf2366004614474565b611e65565b348015610c0357600080fd5b5061058f60075481565b348015610c1957600080fd5b50603554600160a01b900460ff16156105ff565b348015610c3957600080fd5b506106eb610c48366004614457565b611e7c565b348015610c5957600080fd5b5061058f602b5481565b348015610c6f57600080fd5b5061058f610c7e366004614457565b60286020526000908152604090205481565b348015610c9c57600080fd5b50610563611eb1565b348015610cb157600080fd5b506105ff611ec5565b348015610cc657600080fd5b506106eb610cd536600461460e565b611edb565b348015610ce657600080fd5b506105b2611f9f565b348015610cfb57600080fd5b5061058f611fae565b348015610d1057600080fd5b5061058f603b5481565b348015610d2657600080fd5b506034546105ff90600160a81b900460ff1681565b348015610d4757600080fd5b5061058f603a5481565b348015610d5d57600080fd5b5061058f60385481565b348015610d7357600080fd5b5061058f60205481565b348015610d8957600080fd5b506106eb610d98366004614457565b6120a3565b348015610da957600080fd5b506105ff610db83660046143ea565b6120d6565b348015610dc957600080fd5b5061058f600c5481565b348015610ddf57600080fd5b50603554610563906001600160a01b031681565b348015610dff57600080fd5b50603454610563906001600160a01b031681565b348015610e1f57600080fd5b506105ff610e2e3660046143ea565b6121ab565b348015610e3f57600080fd5b5061058f601f5481565b348015610e5557600080fd5b5061058f601d5481565b348015610e6b57600080fd5b506106eb610e7a36600461462a565b6121c2565b348015610e8b57600080fd5b506037546105ff9060ff1681565b348015610ea557600080fd5b50601c54610563906001600160a01b031681565b348015610ec557600080fd5b506105b2612358565b348015610eda57600080fd5b5061058f603d5481565b348015610ef057600080fd5b5061058f610eff366004614457565b60296020526000908152604090205481565b348015610f1d57600080fd5b5061058f600d5481565b348015610f3357600080fd5b50610563610f42366004614474565b6123e6565b348015610f5357600080fd5b5061058f601e5481565b348015610f6957600080fd5b5061058f602f5481565b348015610f7f57600080fd5b506105b26123f3565b348015610f9457600080fd5b506105ff610fa3366004614457565b6001600160a01b031660009081526006602052604090205460ff1690565b348015610fcd57600080fd5b5061058f601b5481565b348015610fe357600080fd5b506106eb610ff2366004614692565b612400565b34801561100357600080fd5b50601554610563906001600160a01b031681565b34801561102357600080fd5b5061058f6110323660046146dd565b6001600160a01b03918216600090815260426020908152604080832093909416825291909152205490565b34801561106957600080fd5b5061058f600e5481565b34801561107f57600080fd5b506106eb61108e366004614474565b612450565b34801561109f57600080fd5b5061058f6110ae366004614457565b60236020526000908152604090205481565b3480156110cc57600080fd5b5061058f6124d8565b3480156110e157600080fd5b5061058f60105481565b3480156110f757600080fd5b506106eb611106366004614457565b6125b9565b34801561111757600080fd5b506106eb611126366004614716565b6125d6565b34801561113757600080fd5b5061114b611146366004614457565b612605565b604051610570919060006101008201905082511515825260208301516020830152604083015160408301526060830151151560608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b3480156111bc57600080fd5b50601354610563906001600160a01b031681565b3480156111dc57600080fd5b5061058f602c5481565b3480156111f257600080fd5b506105ff611201366004614457565b60436020526000908152604090205460ff1681565b34801561122257600080fd5b5061058f60085481565b34801561123857600080fd5b5061058f60115481565b60606000805461125190614731565b80601f016020809104026020016040519081016040528092919081815260200182805461127d90614731565b80156112ca5780601f1061129f576101008083540402835291602001916112ca565b820191906000526020600020905b8154815290600101906020018083116112ad57829003601f168201915b5050505050905090565b3360008181526042602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020614b2e8339815191529061131d9086815260200190565b60405180910390a35060015b92915050565b600081156114e4576040805160038082526080820190925260009160208201606080368337505060145482519293506001600160a01b03169183915060009061137a5761137a614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190614798565b8160018151811061140a5761140a614782565b60200260200101906001600160a01b031690816001600160a01b031681525050308160028151811061143e5761143e614782565b6001600160a01b0392831660209182029290920101526013546040516307c0329d60e21b8152911690631f00ca749061147d90879085906004016147f9565b600060405180830381865afa15801561149a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114c2919081019061481a565b6000815181106114d4576114d4614782565b6020026020010151915050611329565b604080516002808252606082018352600092602083019080368337505060145482519293506001600160a01b03169183915060009061152557611525614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561157e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a29190614798565b8160018151811061143e5761143e614782565b6000611329604054836127a190919063ffffffff16565b6035805460ff60a01b1916600160a01b1790556115e7611ec5565b6115f057600080fd5b6040805430600090815260416020529182205461160c91612762565b9050600081116116815760405162461bcd60e51b815260206004820152603560248201527f5468657265206973206e6f206d696c6b57617220746f6b656e206465706f73696044820152741d1959081a5b881d1bdad95b8818dbdb9d1c9858dd605a1b60648201526084015b60405180910390fd5b60408051600280825260608201835260009260208301908036833701905050905030816000815181106116b6576116b6614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190614798565b8160018151811061174657611746614782565b6001600160a01b03928316602091820292909201015260135460315460405163791ac94760e01b81529183169263791ac9479261179292879260009288929091169042906004016148d8565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b50506035805460ff60a01b1916905550505050565b6001600160a01b038316600090815260426020908152604080832033845290915281205460001914611882576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b038716600090815260428252838120338252909152919091205461185d918490612820565b6001600160a01b03851660009081526042602090815260408083203384529091529020555b61188d84848461285a565b50600190505b9392505050565b60006118a7603654611e65565b905090565b6118b4611ec5565b6118bd57600080fd5b821561198f5761010c8111156119155760405162461bcd60e51b815260206004820152601c60248201527f5570706572204150592063617020617420312c3030332c3937352025000000006044820152606401611678565b610384821015801561192957506104388211155b6119715760405162461bcd60e51b81526020600482015260196024820152784c6f77657220415059206361702061742039382c383533202560381b6044820152606401611678565b6037805460ff19169315159390931790925542603955603c55603b55565b6037805484151560ff19909116179055505050565b6040805460416020527f22157c206018468b45ae7922bc7a0b0cb8feed201dac3c6fb5e7876aa94e11e9547fa0677eb5bcd8fda08ec5a3787163ff937699a7cfa9c49b8c0d83e4d0cc4c9d00546033546001600160a01b03166000908152938420546118a79392611a56929091611a5091611a1f91906130cf565b611a2b6005600a614a0e565b611a38906204f588614a1a565b611a4490600019614a4f565b611a5090600019614a63565b906130cf565b90612762565b611a64611ec5565b611a6d57600080fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611a9d611ec5565b611aa657600080fd5b813b611b185760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c7920636f6e747261637420616464726573732c206e6f7420616c6c6f7760448201527a195908195e1d195c9b985b1b1e481bdddb9959081858d8dbdd5b9d602a1b6064820152608401611678565b6001600160a01b03919091166000908152604360205260409020805460ff1916911515919091179055565b3360009081526042602090815260408083206001600160a01b0386168452909152812054611b719083612705565b3360008181526042602090815260408083206001600160a01b03891680855290835292819020859055519384529092600080516020614b2e833981519152910161131d565b60006118a76016613111565b611bca611ec5565b611bd357600080fd5b603f55565b60006118a76018613111565b600061132960168361311b565b611c9a60405180610240016040528060006001600160a01b031681526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805161024081018252601a546001600160a01b039081168252601b54602080840191909152601c54821693830193909352601d546060830152601f546080830152915460a0820152602a5490911660c0820152602b5460e0820152601e546101008201526000906101208101611d126018613111565b8152602001611d216016613111565b8152602001602c548152602001602d548152602001602f548152602001611d46611fae565b81526031546001600160a01b0316316020820152604001611d656124d8565b815260395460209091015292915050565b604080546001600160a01b038316600090815260416020529182205461132991612762565b611da3611ec5565b611dac57600080fd5b6002546040516101009091046001600160a01b0316907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260028054610100600160a81b0319169055565b603560009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b50505050565b60006113296040548361276290919063ffffffff16565b611e84611ec5565b611e8d57600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60025461010090046001600160a01b031690565b60025461010090046001600160a01b0316331490565b611ee3611ec5565b611eec57600080fd5b8115611f86576103848110158015611f0757506202a3008111155b611f645760405162461bcd60e51b815260206004820152602860248201527f4c697175696469747920696e6a656374696f6e20636f6f6c646f776e207265736044820152673a3934b1ba32b21760c11b6064820152608401611678565b603780548315156101000261ff001990911617905542603a55603d8190555050565b603780548315156101000261ff00199091161790555050565b60606001805461125190614731565b60006118a7601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a9190614798565b6035546040516370a0823160e01b81526001600160a01b03928316926370a082319261205b9291169060040161436c565b602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614a7a565b600061132f565b6120ab611ec5565b6120b457600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526042602090815260408083206001600160a01b038616845290915281205480831061212a573360009081526042602090815260408083206001600160a01b0388168452909152812055612159565b61213481846130cf565b3360009081526042602090815260408083206001600160a01b03891684529091529020555b3360008181526042602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020614b2e833981519152910160405180910390a35060019392505050565b60006121b833848461285a565b5060019392505050565b6121ca611ec5565b6121d357600080fd5b60008a1180156121e35750600089115b8015612205575061012c866121f88a8d614a93565b6122029190614a93565b11155b8015612227575061012c8561221a898c614a93565b6122249190614a93565b11155b61226d5760405162461bcd60e51b81526020600482015260176024820152762332b2b9903a37b7903434b3b416101998129036b0bc1760491b6044820152606401611678565b601e831015801561227f575060328110155b6122c45760405162461bcd60e51b81526020600482015260166024820152752334b3b43a32b939903732b2b2103132903830b4b21760511b6044820152606401611678565b816122cf8486614a93565b6122d99190614a93565b6064146122e8576122e8614aab565b60078a905560098990556008889055600a879055600b869055600c859055600d849055600e839055600f829055601081905561232e886123288c89612705565b90612705565b601155600a54600c5460095461234992916123289190612705565b60125550505050505050505050565b6004805461236590614731565b80601f016020809104026020016040519081016040528092919081815260200182805461239190614731565b80156123de5780601f106123b3576101008083540402835291602001916123de565b820191906000526020600020905b8154815290600101906020018083116123c157829003601f168201915b505050505081565b600061132960188361311b565b6003805461236590614731565b612408611ec5565b61241157600080fd5b603080546001600160a01b039485166001600160a01b031991821617909155603180549385169382169390931790925560328054919093169116179055565b612458611ec5565b61246157600080fd5b61038481101580156124755750610e108111155b6124d35760405162461bcd60e51b815260206004820152602960248201527f4475726174696f6e206f6620726f756e647320696e206d696c6b57617220726560448201526839ba3934b1ba32b21760b91b6064820152608401611678565b602155565b6040516370a0823160e01b815260009030906370a08231906124fe90849060040161436c565b602060405180830381865afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614a7a565b6125495750600090565b6040516370a0823160e01b81526118a79030906370a08231906125719060009060040161436c565b602060405180830381865afa15801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b29190614a7a565b600161132f565b6125c1611ec5565b6125ca57600080fd5b6125d381613127565b50565b6125de611ec5565b6125e757600080fd5b60348054911515600160a81b0260ff60a81b19909216919091179055565b6126516040518061010001604052806000151581526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b60006040518061010001604052806126738560166131a190919063ffffffff16565b151581526001600160a01b0390941660008181526024602090815260408083205482890152838352602582528083205481890152838352602e82528083205460ff161515606089015283835260288252808320546080890152838352602982528083205460a0890152838352602682528083205460c089015292825260279052205460e0909401939093525090919050565b6000806127128385614a93565b9050838110156118935760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401611678565b600061189383836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506131c3565b6000826127b057506000611329565b60006127bc8385614a1a565b9050826127c98583614ac1565b146118935760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611678565b600081848411156128445760405162461bcd60e51b81526004016116789190614380565b5060006128518486614a63565b95945050505050565b6001600160a01b03831660009081526043602052604081205460ff1615801561289c57506001600160a01b03831660009081526043602052604090205460ff16155b6128d75760405162461bcd60e51b815260206004820152600c60248201526b1a5b97d89b1858dadb1a5cdd60a21b6044820152606401611678565b603554600160a01b900460ff16156128fb576128f48484846131f1565b9050611893565b612903613283565b15612910576129106132fe565b612918613592565b15612925576129256135e4565b61292d6138bd565b1561293a5761293a6138e8565b6000612951604054846127a190919063ffffffff16565b603454909150600160a81b900460ff1680156129865750612970611eb1565b6001600160a01b0316856001600160a01b031614155b80156129a057506035546001600160a01b03858116911614155b15612a375760326129b2603e546115b5565b6129bc9190614ac1565b6001600160a01b0385166000908152604160205260409020546129df9083612705565b1115612a375760405162461bcd60e51b815260206004820152602160248201527f496e697469616c203225206d61782077616c6c6574207265737472696374696f6044820152603760f91b6064820152608401611678565b6001600160a01b038516600090815260416020526040902054612a5a90826130cf565b6001600160a01b038616600090815260416020526040812091909155612a808686613fd8565b1561303a57612a90868684614051565b6035549091506001600160a01b0387811691161415612f5b576040805160028082526060820183526000926020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b379190614798565b81600081518110612b4a57612b4a614782565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612b7e57612b7e614782565b6001600160a01b0392831660209182029290920101526013546040516307c0329d60e21b81526000929190911690631f00ca7490612bc290899086906004016147f9565b600060405180830381865afa158015612bdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c07919081019061481a565b600081518110612c1957612c19614782565b60200260200101519050602154601f54612c339190614a93565b42118015612c4b5750601c546001600160a01b031615155b15612db357601c54612c68906018906001600160a01b03166131a1565b612c8657601c54612c84906018906001600160a01b0316614275565b505b601c546001600160a01b03166000908152602460205260408120805491612cac83614ad5565b9091555050601d54601c546001600160a01b031660009081526025602052604081208054909190612cde908490614a93565b9091555050602b54601c546001600160a01b03166000908152602460205260409020541115612d3b57601c54602a80546001600160a01b0319166001600160a01b039092169182179055600090815260246020526040902054602b555b601c546001600160a01b0316600090815260266020526040902054601d5411612d7e57601c546001600160a01b0316600090815260266020526040902054612d82565b601d545b601c80546001600160a01b031660009081526026602052604081209290925580546001600160a01b0319169055601d555b602254602054612dc39190614a93565b42118015612ddb5750601a546001600160a01b031615155b15612e4a57601a54612df8906016906001600160a01b03166131a1565b612e3457601a54612e14906016906001600160a01b0316614275565b50601b54601a546001600160a01b03166000908152602760205260409020555b601a80546001600160a01b03191690556000601b555b601d5481118015612e7457506001600160a01b0387166000908152602e602052604090205460ff16155b15612f54576001600160a01b038716600090815260236020526040902054612eac57601e8054906000612ea683614ad5565b91905055505b601c546001600160a01b03888116911614612f06576001600160a01b0387166000908152602360205260408120805491612ee583614ad5565b9091555050601c80546001600160a01b0319166001600160a01b0389161790555b601d81905542601f55601b54811115612f5457601a546001600160a01b03888116911614612f4a57601a80546001600160a01b0319166001600160a01b0389161790555b601b819055426020555b505061303d565b6035546001600160a01b038681169116141561303557601c546001600160a01b0387811691161480612f9a5750601a546001600160a01b038781169116145b15613035576001600160a01b0386166000908152602e60205260408120805460ff19166001179055602f805491612fd083614ad5565b9091555050601c546001600160a01b038781169116141561300557601c80546001600160a01b03191690556000601d5542601f555b601a546001600160a01b038781169116141561303557601a80546001600160a01b03191690556000601b55426020555b61303d565b50805b6001600160a01b0385166000908152604160205260409020546130609082612705565b6001600160a01b0380871660008181526041602052604090819020939093559154908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130b2908590612762565b60405190815260200160405180910390a350600195945050505050565b600061189383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612820565b6000611329825490565b6000611893838361428a565b6001600160a01b03811661313a57600080fd5b6002546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b03811660009081526001830160205260408120541515611893565b600081836131e45760405162461bcd60e51b81526004016116789190614380565b5060006128518486614ac1565b600080613209604054846127a190919063ffffffff16565b6001600160a01b03861660009081526041602052604090205490915061322f90826130cf565b6001600160a01b03808716600090815260416020526040808220939093559086168152205461325e9082612705565b6001600160a01b03851660009081526041602052604090205550600190509392505050565b60375460009060ff1680156132b2575061329f6005600a614a0e565b6132ad9063c1b71080614a1a565b603e54105b80156132c957506035546001600160a01b03163314155b80156132df5750603554600160a01b900460ff16155b80156118a75750603c546039546132f69190614a93565b421015905090565b603554600160a01b900460ff161561331257565b600080603854426133239190614a63565b90506000603954426133359190614a63565b9050600061334e603c548361276290919063ffffffff16565b9050600061336a603c80546133639190614ac1565b83906127a1565b9050630f099c00841061339957610140603b546133879190614ac1565b613392906008614a93565b945061343f565b630966018084106133be576050603b546133b39190614ac1565b613392906021614a93565b6305a39a8084106133e3576028603b546133d89190614ac1565b61339290603e614a93565b6303c267008410613408576014603b546133fd9190614ac1565b61339290607d614a93565b6301e13380841061342d57600a603b546134229190614ac1565b6133929060e0614a93565b603b5461343c9061093a614a93565b94505b60005b8281101561348a576134756134596007600a614af0565b611a5661346c896123286007600a614af0565b603e54906127a1565b603e558061348281614ad5565b915050613442565b50603e546134c39061349e6005600a614a0e565b6134ab906204f588614a1a565b6134b790600019614a4f565b611a5690600019614a63565b604055603c546134e1906134d89084906127a1565b60395490612705565b603981905550600560019054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561353757600080fd5b505af115801561354b573d6000803e3d6000fd5b50505050807f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2603e5460405161358391815260200190565b60405180910390a25050505050565b603754600090610100900460ff1680156135b65750603554600160a01b900460ff16155b80156135cd57506035546001600160a01b03163314155b80156118a75750603d54603a546132f69190614a93565b6035805460ff60a01b1916600160a01b179055604080546030546001600160a01b0316600090815260416020529182205461361e91612762565b6030546001600160a01b03166000908152604160205260408082205430835291205491925061364d9190612705565b30600090815260416020526040808220929092556030546001600160a01b03168152908120819055613680826002612762565b9050600061368e83836130cf565b90508061369d575050506138ae565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106136d2576136d2614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561372b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374f9190614798565b8160018151811061376257613762614782565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792919091169063791ac947906137ac9086906000908790309042906004016148d8565b600060405180830381600087803b1580156137c657600080fd5b505af11580156137da573d6000803e3d6000fd5b5050505060006137f382476130cf90919063ffffffff16565b90506000851180156138055750600081115b156138a35760135460305460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561387a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061389f9190614aff565b5050505b505042603a55505050505b6035805460ff60a01b19169055565b603554600090600160a01b900460ff161580156118a75750506035546001600160a01b031633141590565b6035805460ff60a01b1916600160a01b1790556040805430600090815260416020529182205461391791612762565b9050603f54811015613929578061392d565b603f545b90508061393a57506138ae565b60006064600f548361394c9190614a1a565b6139569190614ac1565b905060006064600e548461396a9190614a1a565b6139749190614ac1565b90506000816139838486614a63565b61398d9190614a63565b90506000601d54600014806139a25750601b54155b15613a5e57601d546139d5576064836010546139be9190614a1a565b6139c89190614ac1565b6139d29082614a93565b90505b601b54613a0f5760648360105460646139ee9190614a63565b6139f89190614a1a565b613a029190614ac1565b613a0c9082614a93565b90505b613a198184614a63565b6033546001600160a01b0316600090815260416020526040902054909350613a42908290614a93565b6033546001600160a01b03166000908152604160205260409020555b600082613a6b8587614a93565b613a759190614a93565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110613aaf57613aaf614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2c9190614798565b81600181518110613b3f57613b3f614782565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac94790613b859086906000908690309042906004016148d8565b600060405180830381600087803b158015613b9f57600080fd5b505af1158015613bb3573d6000803e3d6000fd5b505050506000613bcc83476130cf90919063ffffffff16565b9050601d546000141580613be15750601b5415155b15613ef757600084613bf38984614a1a565b613bfd9190614ac1565b9050601d54600014158015613c135750601b5415155b15613d98576000606482601054613c2a9190614a1a565b613c349190614ac1565b90506000613c428284614a63565b601a546040519192506000916001600160a01b039091169061753090849084818181858888f193505050503d8060008114613c99576040519150601f19603f3d011682016040523d82523d6000602084013e613c9e565b606091505b5050601c546040519192506001600160a01b0316906175309085906000818181858888f193505050503d8060008114613cf3576040519150601f19603f3d011682016040523d82523d6000602084013e613cf8565b606091505b5050601a546001600160a01b0316600090815260286020526040812080549293508492909190613d29908490614a93565b9091555050601c546001600160a01b031660009081526029602052604081208054859290613d58908490614a93565b9250508190555081602c6000828254613d719190614a93565b9250508190555082602d6000828254613d8a9190614a93565b90915550613ef59350505050565b601d5415613e4d57601c546040516000916001600160a01b03169061753090849084818181858888f193505050503d8060008114613df2576040519150601f19603f3d011682016040523d82523d6000602084013e613df7565b606091505b5050601c546001600160a01b0316600090815260296020526040812080549293508492909190613e28908490614a93565b9250508190555081602d6000828254613e419190614a93565b90915550613ef5915050565b601a546040516000916001600160a01b03169061753090849084818181858888f193505050503d8060008114613e9f576040519150601f19603f3d011682016040523d82523d6000602084013e613ea4565b606091505b5050601a546001600160a01b0316600090815260286020526040812080549293508492909190613ed5908490614a93565b9250508190555081602c6000828254613eee9190614a93565b9091555050505b505b6031546000906001600160a01b031685613f118b85614a1a565b613f1b9190614ac1565b60405161753091906000818181858888f193505050503d8060008114613f5d576040519150601f19603f3d011682016040523d82523d6000602084013e613f62565b606091505b50506032546040519192506001600160a01b0316906175309047906000818181858888f193505050503d8060008114613fb7576040519150601f19603f3d011682016040523d82523d6000602084013e613fbc565b606091505b505050505050505050505050506035805460ff60a01b19169055565b6035546000906001600160a01b038481169116148061400457506035546001600160a01b038381169116145b801561402957506001600160a01b03821660009081526006602052604090205460ff16155b8015611893575050506001600160a01b031660009081526006602052604090205460ff161590565b60355460009081906001600160a01b038581169116141561416f57600a546140aa9061408990614083866103e8612762565b906127a1565b6033546001600160a01b031660009081526041602052604090205490612705565b6033546001600160a01b0316600090815260416020526040902055600c546140f2906140dc90614083866103e8612762565b3060009081526041602052604090205490612705565b3060009081526041602052604090205560095461413a9061411990614083866103e8612762565b6030546001600160a01b031660009081526041602052604090205490612705565b6030546001600160a01b031660009081526041602052604090205560125461416890614083856103e8612762565b9050614210565b6008546141869061408990614083866103e8612762565b6033546001600160a01b0316600090815260416020526040902055600b546141b8906140dc90614083866103e8612762565b306000908152604160205260409020556007546141df9061411990614083866103e8612762565b6030546001600160a01b031660009081526041602052604090205560115461420d90614083856103e8612762565b90505b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61425a6040548561276290919063ffffffff16565b60405190815260200160405180910390a361285183826130cf565b6000611893836001600160a01b038416614310565b815460009082106142e85760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401611678565b8260000182815481106142fd576142fd614782565b9060005260206000200154905092915050565b600081815260018301602052604081205461435757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611329565b506000611329565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b600060208083528351808285015260005b818110156143ad57858101830151858201604001528201614391565b818111156143bf576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146125d357600080fd5b600080604083850312156143fd57600080fd5b8235614408816143d5565b946020939093013593505050565b8035801515811461442657600080fd5b919050565b6000806040838503121561443e57600080fd5b8235915061444e60208401614416565b90509250929050565b60006020828403121561446957600080fd5b8135611893816143d5565b60006020828403121561448657600080fd5b5035919050565b6000806000606084860312156144a257600080fd5b83356144ad816143d5565b925060208401356144bd816143d5565b929592945050506040919091013590565b6000806000606084860312156144e357600080fd5b6144ec84614416565b95602085013595506040909401359392505050565b6000806040838503121561451457600080fd5b823561451f816143d5565b915061444e60208401614416565b60006102408201905061454182845161435f565b60208301516020830152604083015161455d604084018261435f565b50606083015160608301526080830151608083015260a083015160a083015260c083015161458e60c084018261435f565b5060e08381015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e08084015190830152610200808401519083015261022092830151929091019190915290565b6000806040838503121561462157600080fd5b61440883614416565b6000806000806000806000806000806101408b8d03121561464a57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806000606084860312156146a757600080fd5b83356146b2816143d5565b925060208401356146c2816143d5565b915060408401356146d2816143d5565b809150509250925092565b600080604083850312156146f057600080fd5b82356146fb816143d5565b9150602083013561470b816143d5565b809150509250929050565b60006020828403121561472857600080fd5b61189382614416565b600181811c9082168061474557607f821691505b6020821081141561476657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156147aa57600080fd5b8151611893816143d5565b600081518084526020808501945080840160005b838110156147ee5781516001600160a01b0316875295820195908201906001016147c9565b509495945050505050565b82815260406020820152600061481260408301846147b5565b949350505050565b6000602080838503121561482d57600080fd5b825167ffffffffffffffff8082111561484557600080fd5b818501915085601f83011261485957600080fd5b81518181111561486b5761486b61476c565b8060051b604051601f19603f830116810181811085821117156148905761489061476c565b6040529182528482019250838101850191888311156148ae57600080fd5b938501935b828510156148cc578451845293850193928501926148b3565b98975050505050505050565b85815284602082015260a0604082015260006148f760a08301866147b5565b6001600160a01b0394909416606083015250608001529392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561496557816000190482111561494b5761494b614914565b8085161561495857918102915b93841c939080029061492f565b509250929050565b60008261497c57506001611329565b8161498957506000611329565b816001811461499f57600281146149a9576149c5565b6001915050611329565b60ff8411156149ba576149ba614914565b50506001821b611329565b5060208310610133831016604e8410600b84101617156149e8575081810a611329565b6149f2838361492a565b8060001904821115614a0657614a06614914565b029392505050565b6000611893838361496d565b6000816000190483118215151615614a3457614a34614914565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a5e57614a5e614a39565b500690565b600082821015614a7557614a75614914565b500390565b600060208284031215614a8c57600080fd5b5051919050565b60008219821115614aa657614aa6614914565b500190565b634e487b7160e01b600052600160045260246000fd5b600082614ad057614ad0614a39565b500490565b6000600019821415614ae957614ae9614914565b5060010190565b600061189360ff84168361496d565b600080600060608486031215614b1457600080fd5b835192506020840151915060408401519050925092509256fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220290c12c610ca2c0d83ee8e59102d7dda7e949765dc3f60e926769ee3d3935e3764736f6c634300080c0033