ETH Price: $2,535.26 (+5.47%)
 

Overview

Max Total Supply

420,690,000,000,000 M$ PEPE

Holders

41

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
931,432,785,035.300827933 M$ PEPE

Value
$0.00
0xa8e0e2363a19c92ef3cdccfd75833e2a10e97020
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MissPepe

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: MsPepe.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.7;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    

}

interface IERC20Permit {
    
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}


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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    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 swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(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 swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract MissPepe is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;
    
    address payable public rewardPoolAddress = payable(0xA26128752D065F281239f09D982e757f6727Ca10); // reward Pool Address
    address payable public devAddress = payable(0xA26128752D065F281239f09D982e757f6727Ca10); // Dev Address

    mapping(address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isBlacklisted;

    uint256 private _totalSupply = 420690 * 10**9 * 10**9;  // 10 Bn tokens


    mapping (address => bool) private _isExcludedFromFee;

    string private _name = "Miss Pepe";
    string private _symbol = "M$ PEPE";
    uint8 private _decimals = 9;
    
    uint256 public rewardPoolDivisor = 0;
    uint256 public devDivisor = 10;
    uint256 public autoLpDivisor = 0;

    uint256 public _totalFee = 10;  // rewardPoolDivisor + devDivisor + autoLpDivisor
    uint256 private _previousTotalFee = _totalFee;
    uint256 public sellFactor = 10; // divided by 10
    bool public isBuyTaxEnabled = true;

    uint256 public _maxTxAmount = 8414 * 10**9 * 10**9;
    uint256 public _maxWalletAmount = 8414 * 10**9 * 10**9;
    uint256 private minimumTokensBeforeSwap = 1 * 10**4 * 10**9; 

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    bool public tradingEnabled = false;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    mapping (address => bool) private automatedMarketMaker;

    event FeesUpdated(uint256 autoLpDivisor, uint256 devDivisor, uint256 rewardPoolDivisor);
    event SellFactorUpdated(uint256 previousSellFactor, uint256 newSellFactor);
    event BuyTaxEnabled(bool indexed enable, uint256 blockNumber);
    event AutomatedMarketMakerEnable(address indexed account, bool indexed enable);
    event AccountBlacklisted(address indexed account, bool indexed blacklist);

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );


    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        automatedMarketMaker[uniswapV2Pair] = true;

        _balances[owner()] = _totalSupply;
        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), owner(), _totalSupply);
    }

    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;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function isBlacklisted(address account) external view returns(bool) {
        return _isBlacklisted[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(!_isBlacklisted[from], "Not Allowed");
        require(!_isBlacklisted[to], "Not Allowed");

        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;

        } else {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            require(tradingEnabled, "Trading is not started");
            if (!automatedMarketMaker[to]) {
                require(_balances[to] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (overMinimumTokenBalance && !inSwapAndLiquify && swapAndLiquifyEnabled && from != uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);    
            }
        }
        
        bool isSell = automatedMarketMaker[to];

        if(!automatedMarketMaker[from] && !isSell) {
            takeFee = false;
        }

        if(!isBuyTaxEnabled && !isSell) {
            takeFee = false;
        }
        _tokenTransfer(from,to,amount,takeFee,isSell);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
       
        uint256 amountToLiquify = contractTokenBalance.mul(autoLpDivisor).div(_totalFee).div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForEth(amountToSwap);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = _totalFee.sub(autoLpDivisor.div(2));

        // adding liquidity
        if(amountToLiquify > 0) // enabling to set autoLP tax to zero
            addLiquidity(amountToLiquify, transferredBalance.mul(autoLpDivisor).div(totalETHFee).div(2));

        //Send to rewardPool and dev address
        transferToAddressETH(rewardPoolAddress, transferredBalance.mul(rewardPoolDivisor).div(totalETHFee));
        transferToAddressETH(devAddress, transferredBalance.mul(devDivisor).div(totalETHFee));
        
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee, bool isSell) private {
        if(!takeFee)
            removeAllFee();
        
        _beforeTokenTransfer(sender, recipient, amount);

        uint256 fromBalance = _balances[sender];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        uint256 fees = calculateTotalFee(amount, isSell);
        uint256 amountToTransfer = amount - fees;
        unchecked {
            _balances[sender] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[recipient] += amountToTransfer;
            _balances[address(this)] += fees;
        }

        if(!takeFee)
            restoreAllFee();

        emit Transfer(sender, recipient, amountToTransfer);
        if(fees > 0) {
            emit Transfer(sender, address(this), fees);
        }

        _afterTokenTransfer(sender, recipient, amount);
        
        
    }
    
    function calculateTotalFee(uint256 _amount, bool _isSell) private view returns (uint256) {
        uint256 fees = _amount.mul(_totalFee).div(10**3);
        return _isSell ? fees.mul(sellFactor).div(10) : fees;
    }
    
    function removeAllFee() private {
        if(_totalFee == 0) return;
        
        _previousTotalFee = _totalFee; 
        _totalFee = 0;
    }
    
    function restoreAllFee() private {
        _totalFee = _previousTotalFee;
    }

    function isAutomatedMarketMaker(address account) external view returns(bool) {
        return automatedMarketMaker[account];
    }

    function enableAutomatedMarketMaker(address account, bool enable) external onlyOwner {
        require (automatedMarketMaker[account] != enable, "Already set");
        automatedMarketMaker[account] = enable;

        emit AutomatedMarketMakerEnable(account, enable);
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function updateFeeDivisor(uint256 newAutoLpDivisor, uint256 newDevDivisor, uint256 newrewardPoolDivisor) external onlyOwner {
        uint256 newTotalFee = newAutoLpDivisor.add(newDevDivisor).add(newrewardPoolDivisor);
        require( newTotalFee <= 200, "cant set fees to more than 20%");

        autoLpDivisor = newAutoLpDivisor;
        devDivisor = newDevDivisor;
        rewardPoolDivisor = newrewardPoolDivisor;

        _previousTotalFee = _totalFee;
        _totalFee = newTotalFee;

        emit FeesUpdated(newAutoLpDivisor, newDevDivisor, newrewardPoolDivisor);
    }
    
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }
    
    function setMaxWalletLimit(uint256 maxWalletLimit) external onlyOwner() {
        _maxWalletAmount = maxWalletLimit;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }
    
    function setRewardPoolAddress(address _rewardPoolAddress) external onlyOwner() {
        rewardPoolAddress = payable(_rewardPoolAddress);
    }

    function setDevAddress(address _devAddress) external onlyOwner() {
        devAddress = payable(_devAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function updateSellFactor(uint256 _sellFactor) external onlyOwner {
        emit SellFactorUpdated(sellFactor, _sellFactor);

        sellFactor = _sellFactor;
    }

    function setBuyTaxEnabled(bool _enable) external onlyOwner {
        require(isBuyTaxEnabled != _enable, "Already set");
        isBuyTaxEnabled = _enable;

        emit BuyTaxEnabled(_enable, block.number);
    }

    function withdrawUnsupportedTokens(address token, address recipient) external onlyOwner {
        require(token != address(this), "Can not withdraw this token");
        uint256 contractBalance = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(recipient, contractBalance);
    }

    function enableTrading() external onlyOwner {
        require (!tradingEnabled, "Already enabled");
        tradingEnabled = true;
    }

    function blacklistAccount(address account, bool blacklist) external onlyOwner {
        require (_isBlacklisted[account] != blacklist, "Already set");
        require(account != uniswapV2Pair, "can not blacklist uniswap pair");
        _isBlacklisted[account] = blacklist;

        emit AccountBlacklisted(account, blacklist);
    }

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function withdrawETH(address recipient) external onlyOwner {
        (bool success, ) = recipient.call{ value: address(this).balance }("");
        require(success, "unable to send value, recipient may have reverted");
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}


    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

File 1 of 2: MsPepe - Copy.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.7;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    

}

interface IERC20Permit {
    
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}


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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    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 swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(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 swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract MissPepe is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;
    
    address payable public rewardPoolAddress = payable(0xA26128752D065F281239f09D982e757f6727Ca10); // reward Pool Address
    address payable public devAddress = payable(0xA26128752D065F281239f09D982e757f6727Ca10); // Dev Address

    mapping(address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isBlacklisted;

    uint256 private _totalSupply = 420690 * 10**9 * 10**9;  // 10 Bn tokens


    mapping (address => bool) private _isExcludedFromFee;

    string private _name = "Miss Pepe";
    string private _symbol = "M$ PEPE";
    uint8 private _decimals = 9;
    
    uint256 public rewardPoolDivisor = 0;
    uint256 public devDivisor = 10;
    uint256 public autoLpDivisor = 0;

    uint256 public _totalFee = 10;  // rewardPoolDivisor + devDivisor + autoLpDivisor
    uint256 private _previousTotalFee = _totalFee;
    uint256 public sellFactor = 10; // divided by 10
    bool public isBuyTaxEnabled = true;

    uint256 public _maxTxAmount = 8414 * 10**9 * 10**9;
    uint256 public _maxWalletAmount = 8414 * 10**9 * 10**9;
    uint256 private minimumTokensBeforeSwap = 1 * 10**4 * 10**9; 

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    bool public tradingEnabled = false;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    mapping (address => bool) private automatedMarketMaker;

    event FeesUpdated(uint256 autoLpDivisor, uint256 devDivisor, uint256 rewardPoolDivisor);
    event SellFactorUpdated(uint256 previousSellFactor, uint256 newSellFactor);
    event BuyTaxEnabled(bool indexed enable, uint256 blockNumber);
    event AutomatedMarketMakerEnable(address indexed account, bool indexed enable);
    event AccountBlacklisted(address indexed account, bool indexed blacklist);

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );


    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        automatedMarketMaker[uniswapV2Pair] = true;

        _balances[owner()] = _totalSupply;
        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), owner(), _totalSupply);
    }

    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;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function isBlacklisted(address account) external view returns(bool) {
        return _isBlacklisted[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(!_isBlacklisted[from], "Not Allowed");
        require(!_isBlacklisted[to], "Not Allowed");

        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;

        } else {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            require(tradingEnabled, "Trading is not started");
            if (!automatedMarketMaker[to]) {
                require(_balances[to] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (overMinimumTokenBalance && !inSwapAndLiquify && swapAndLiquifyEnabled && from != uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);    
            }
        }
        
        bool isSell = automatedMarketMaker[to];

        if(!automatedMarketMaker[from] && !isSell) {
            takeFee = false;
        }

        if(!isBuyTaxEnabled && !isSell) {
            takeFee = false;
        }
        _tokenTransfer(from,to,amount,takeFee,isSell);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
       
        uint256 amountToLiquify = contractTokenBalance.mul(autoLpDivisor).div(_totalFee).div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForEth(amountToSwap);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = _totalFee.sub(autoLpDivisor.div(2));

        // adding liquidity
        if(amountToLiquify > 0) // enabling to set autoLP tax to zero
            addLiquidity(amountToLiquify, transferredBalance.mul(autoLpDivisor).div(totalETHFee).div(2));

        //Send to rewardPool and dev address
        transferToAddressETH(rewardPoolAddress, transferredBalance.mul(rewardPoolDivisor).div(totalETHFee));
        transferToAddressETH(devAddress, transferredBalance.mul(devDivisor).div(totalETHFee));
        
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee, bool isSell) private {
        if(!takeFee)
            removeAllFee();
        
        _beforeTokenTransfer(sender, recipient, amount);

        uint256 fromBalance = _balances[sender];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        uint256 fees = calculateTotalFee(amount, isSell);
        uint256 amountToTransfer = amount - fees;
        unchecked {
            _balances[sender] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[recipient] += amountToTransfer;
            _balances[address(this)] += fees;
        }

        if(!takeFee)
            restoreAllFee();

        emit Transfer(sender, recipient, amountToTransfer);
        if(fees > 0) {
            emit Transfer(sender, address(this), fees);
        }

        _afterTokenTransfer(sender, recipient, amount);
        
        
    }
    
    function calculateTotalFee(uint256 _amount, bool _isSell) private view returns (uint256) {
        uint256 fees = _amount.mul(_totalFee).div(10**3);
        return _isSell ? fees.mul(sellFactor).div(10) : fees;
    }
    
    function removeAllFee() private {
        if(_totalFee == 0) return;
        
        _previousTotalFee = _totalFee; 
        _totalFee = 0;
    }
    
    function restoreAllFee() private {
        _totalFee = _previousTotalFee;
    }

    function isAutomatedMarketMaker(address account) external view returns(bool) {
        return automatedMarketMaker[account];
    }

    function enableAutomatedMarketMaker(address account, bool enable) external onlyOwner {
        require (automatedMarketMaker[account] != enable, "Already set");
        automatedMarketMaker[account] = enable;

        emit AutomatedMarketMakerEnable(account, enable);
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function updateFeeDivisor(uint256 newAutoLpDivisor, uint256 newDevDivisor, uint256 newrewardPoolDivisor) external onlyOwner {
        uint256 newTotalFee = newAutoLpDivisor.add(newDevDivisor).add(newrewardPoolDivisor);
        require( newTotalFee <= 200, "cant set fees to more than 20%");

        autoLpDivisor = newAutoLpDivisor;
        devDivisor = newDevDivisor;
        rewardPoolDivisor = newrewardPoolDivisor;

        _previousTotalFee = _totalFee;
        _totalFee = newTotalFee;

        emit FeesUpdated(newAutoLpDivisor, newDevDivisor, newrewardPoolDivisor);
    }
    
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }
    
    function setMaxWalletLimit(uint256 maxWalletLimit) external onlyOwner() {
        _maxWalletAmount = maxWalletLimit;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }
    
    function setRewardPoolAddress(address _rewardPoolAddress) external onlyOwner() {
        rewardPoolAddress = payable(_rewardPoolAddress);
    }

    function setDevAddress(address _devAddress) external onlyOwner() {
        devAddress = payable(_devAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function updateSellFactor(uint256 _sellFactor) external onlyOwner {
        emit SellFactorUpdated(sellFactor, _sellFactor);

        sellFactor = _sellFactor;
    }

    function setBuyTaxEnabled(bool _enable) external onlyOwner {
        require(isBuyTaxEnabled != _enable, "Already set");
        isBuyTaxEnabled = _enable;

        emit BuyTaxEnabled(_enable, block.number);
    }

    function withdrawUnsupportedTokens(address token, address recipient) external onlyOwner {
        require(token != address(this), "Can not withdraw this token");
        uint256 contractBalance = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(recipient, contractBalance);
    }

    function enableTrading() external onlyOwner {
        require (!tradingEnabled, "Already enabled");
        tradingEnabled = true;
    }

    function blacklistAccount(address account, bool blacklist) external onlyOwner {
        require (_isBlacklisted[account] != blacklist, "Already set");
        require(account != uniswapV2Pair, "can not blacklist uniswap pair");
        _isBlacklisted[account] = blacklist;

        emit AccountBlacklisted(account, blacklist);
    }

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function withdrawETH(address recipient) external onlyOwner {
        (bool success, ) = recipient.call{ value: address(this).balance }("");
        require(success, "unable to send value, recipient may have reverted");
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}


    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklist","type":"bool"}],"name":"AccountBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"enable","type":"bool"}],"name":"AutomatedMarketMakerEnable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enable","type":"bool"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"BuyTaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"autoLpDivisor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devDivisor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPoolDivisor","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousSellFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellFactor","type":"uint256"}],"name":"SellFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLpDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklist","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableAutomatedMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAutomatedMarketMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBuyTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPoolAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPoolDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setBuyTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletLimit","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPoolAddress","type":"address"}],"name":"setRewardPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAutoLpDivisor","type":"uint256"},{"internalType":"uint256","name":"newDevDivisor","type":"uint256"},{"internalType":"uint256","name":"newrewardPoolDivisor","type":"uint256"}],"name":"updateFeeDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFactor","type":"uint256"}],"name":"updateSellFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawUnsupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6003805473a26128752d065f281239f09d982e757f6727ca106001600160a01b03199182168117909255600480549091169091179055695915a68d88da6a08000060085560e0604052600960a0819052684d697373205065706560b81b60c09081526200007091600a919062000447565b50604080518082019091526007808252664d24205045504560c81b6020909201918252620000a191600b9162000447565b50600c805460ff199081166009179091556000600d819055600a600e819055600f91909155601081905560118190556012556013805490911660011790556901c81fb4e4b7a8b8000060148190556015556509184e72a0006016556017805462ff00ff60a01b191690553480156200011857600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001ad57600080fd5b505afa158015620001c2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e89190620004ed565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023157600080fd5b505afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c9190620004ed565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002b557600080fd5b505af1158015620002ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f09190620004ed565b601780546001600160a01b0319166001600160a01b03929092169182179055606082901b6001600160601b0319166080526000908152601860205260408120805460ff1916600117905560085490600590620003546000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600960006200038e6200043860201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526009909252902080549091166001179055620003e16000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6008546040516200042991815260200190565b60405180910390a3506200055c565b6000546001600160a01b031690565b82805462000455906200051f565b90600052602060002090601f016020900481019282620004795760008555620004c4565b82601f106200049457805160ff1916838001178555620004c4565b82800160010185558215620004c4579182015b82811115620004c4578251825591602001919060010190620004a7565b50620004d2929150620004d6565b5090565b5b80821115620004d25760008155600101620004d7565b6000602082840312156200050057600080fd5b81516001600160a01b03811681146200051857600080fd5b9392505050565b600181811c908216806200053457607f821691505b602082108114156200055657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c612adf6200059e6000396000818161037c0152818161216e01528181612236015281816122720152818161232501526123810152612adf6000f3fe6080604052600436106103035760003560e01c80637d1db4a511610190578063c5930482116100dc578063dee6a01611610095578063ef0658f21161006f578063ef0658f214610910578063f0f165af14610926578063f2fde38b14610946578063fe575a871461096657600080fd5b8063dee6a016146108b0578063ea2f0b37146108d0578063ec28438a146108f057600080fd5b8063c59304821461080a578063ca48dd7314610824578063cbff46171461083a578063d0d41fe114610850578063dd46706414610870578063dd62ed3e1461089057600080fd5b806395d89b4111610149578063a69df4b511610123578063a69df4b514610795578063a9059cbb146107aa578063b24cf5d7146107ca578063c49b9a80146107ea57600080fd5b806395d89b411461074b578063a073d37f14610760578063a457c2d71461077557600080fd5b80637d1db4a514610689578063842884171461069f578063845a51ec146106d85780638a8c523c146106f85780638da5cb5b1461070d578063929793911461072b57600080fd5b8063437823ec1161024f578063557ed1ba116102085780636c0a24eb116101e25780636c0a24eb1461060857806370a082311461061e578063715018a614610654578063728d41c91461066957600080fd5b8063557ed1ba146105c0578063602bc62b146105d3578063690d8320146105e857600080fd5b8063437823ec146104e557806349bd5a5e146105055780634a74bb02146105255780634ada218b146105465780634c14c0b3146105675780635342acb41461058757600080fd5b80632d5a5d34116102bc5780633950935111610296578063395093511461046f5780633a40799e1461048f5780633ad10ef6146104a55780634127bcc6146104c557600080fd5b80632d5a5d341461040b578063313ce5671461042d578063382e901d1461044f57600080fd5b806306fdde031461030f578063095ea7b31461033a5780631694505e1461036a57806318160ddd146103b657806323b872dd146103d5578063283f7820146103f557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032461099f565b604051610331919061287e565b60405180910390f35b34801561034657600080fd5b5061035a61035536600461272c565b610a31565b6040519015158152602001610331565b34801561037657600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610331565b3480156103c257600080fd5b506008545b604051908152602001610331565b3480156103e157600080fd5b5061035a6103f03660046126bd565b610a4b565b34801561040157600080fd5b506103c760105481565b34801561041757600080fd5b5061042b6104263660046126fe565b610a6f565b005b34801561043957600080fd5b50600c5460405160ff9091168152602001610331565b34801561045b57600080fd5b5061042b61046a366004612684565b610b93565b34801561047b57600080fd5b5061035a61048a36600461272c565b610cab565b34801561049b57600080fd5b506103c7600e5481565b3480156104b157600080fd5b5060045461039e906001600160a01b031681565b3480156104d157600080fd5b5061042b6104e03660046127c4565b610ccd565b3480156104f157600080fd5b5061042b61050036600461264a565b610dc0565b34801561051157600080fd5b5060175461039e906001600160a01b031681565b34801561053157600080fd5b5060175461035a90600160b01b900460ff1681565b34801561055257600080fd5b5060175461035a90600160a01b900460ff1681565b34801561057357600080fd5b5061042b6105823660046126fe565b610e0e565b34801561059357600080fd5b5061035a6105a236600461264a565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156105cc57600080fd5b50426103c7565b3480156105df57600080fd5b506002546103c7565b3480156105f457600080fd5b5061042b61060336600461264a565b610ecb565b34801561061457600080fd5b506103c760155481565b34801561062a57600080fd5b506103c761063936600461264a565b6001600160a01b031660009081526005602052604090205490565b34801561066057600080fd5b5061042b610fb6565b34801561067557600080fd5b5061042b610684366004612792565b611018565b34801561069557600080fd5b506103c760145481565b3480156106ab57600080fd5b5061035a6106ba36600461264a565b6001600160a01b031660009081526018602052604090205460ff1690565b3480156106e457600080fd5b5060035461039e906001600160a01b031681565b34801561070457600080fd5b5061042b611047565b34801561071957600080fd5b506000546001600160a01b031661039e565b34801561073757600080fd5b5061042b610746366004612792565b6110d2565b34801561075757600080fd5b5061032461113d565b34801561076c57600080fd5b506016546103c7565b34801561078157600080fd5b5061035a61079036600461272c565b61114c565b3480156107a157600080fd5b5061042b6111c7565b3480156107b657600080fd5b5061035a6107c536600461272c565b6112cd565b3480156107d657600080fd5b5061042b6107e536600461264a565b6112db565b3480156107f657600080fd5b5061042b610805366004612758565b611327565b34801561081657600080fd5b5060135461035a9060ff1681565b34801561083057600080fd5b506103c7600f5481565b34801561084657600080fd5b506103c760125481565b34801561085c57600080fd5b5061042b61086b36600461264a565b6113a9565b34801561087c57600080fd5b5061042b61088b366004612792565b6113f5565b34801561089c57600080fd5b506103c76108ab366004612684565b61147a565b3480156108bc57600080fd5b5061042b6108cb366004612758565b6114a5565b3480156108dc57600080fd5b5061042b6108eb36600461264a565b61153f565b3480156108fc57600080fd5b5061042b61090b366004612792565b61158a565b34801561091c57600080fd5b506103c7600d5481565b34801561093257600080fd5b5061042b610941366004612792565b6115b9565b34801561095257600080fd5b5061042b61096136600461264a565b6115e8565b34801561097257600080fd5b5061035a61098136600461264a565b6001600160a01b031660009081526007602052604090205460ff1690565b6060600a80546109ae906129fc565b80601f01602080910402602001604051908101604052809291908181526020018280546109da906129fc565b8015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b600033610a3f8185856116c0565b60019150505b92915050565b600033610a598582856117e4565b610a6485858561185e565b506001949350505050565b6000546001600160a01b03163314610aa25760405162461bcd60e51b8152600401610a99906128d6565b60405180910390fd5b6001600160a01b03821660009081526007602052604090205460ff1615158115151415610ae15760405162461bcd60e51b8152600401610a99906128b1565b6017546001600160a01b0383811691161415610b3f5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f7420626c61636b6c69737420756e6973776170207061697200006044820152606401610a99565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4491a35050565b6000546001600160a01b03163314610bbd5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b038216301415610c165760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f74207769746864726177207468697320746f6b656e00000000006044820152606401610a99565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610c5857600080fd5b505afa158015610c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9091906127ab565b9050610ca66001600160a01b0384168383611bef565b505050565b600033610a3f818585610cbe838361147a565b610cc89190612960565b6116c0565b6000546001600160a01b03163314610cf75760405162461bcd60e51b8152600401610a99906128d6565b6000610d0d82610d078686611c41565b90611c41565b905060c8811115610d605760405162461bcd60e51b815260206004820152601e60248201527f63616e7420736574206665657320746f206d6f7265207468616e2032302500006044820152606401610a99565b600f849055600e839055600d8290556010805460115581905560408051858152602081018590529081018390527fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd9060600160405180910390a150505050565b6000546001600160a01b03163314610dea5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b03163314610e385760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415610e775760405162461bcd60e51b8152600401610a99906128b1565b6001600160a01b038216600081815260186020526040808220805460ff191685151590811790915590519092917f8c55f11b6d19d56c8b1800eb4e8b56441df993e14634fe86cd24b1c9bff545d391a35050565b6000546001600160a01b03163314610ef55760405162461bcd60e51b8152600401610a99906128d6565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f42576040519150601f19603f3d011682016040523d82523d6000602084013e610f47565b606091505b5050905080610fb25760405162461bcd60e51b815260206004820152603160248201527f756e61626c6520746f2073656e642076616c75652c20726563697069656e74206044820152701b585e481a185d99481c995d995c9d1959607a1b6064820152608401610a99565b5050565b6000546001600160a01b03163314610fe05760405162461bcd60e51b8152600401610a99906128d6565b600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110425760405162461bcd60e51b8152600401610a99906128d6565b601555565b6000546001600160a01b031633146110715760405162461bcd60e51b8152600401610a99906128d6565b601754600160a01b900460ff16156110bd5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a99565b6017805460ff60a01b1916600160a01b179055565b6000546001600160a01b031633146110fc5760405162461bcd60e51b8152600401610a99906128d6565b60125460408051918252602082018390527fbd246d9b8c3d3843cdfe86c1eef754015151cca52383afcf47cfe2e30389233e910160405180910390a1601255565b6060600b80546109ae906129fc565b6000338161115a828661147a565b9050838110156111ba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a99565b610a6482868684036116c0565b6001546001600160a01b0316331461122d5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610a99565b600254421161127e5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a99565b600154600080546040516001600160a01b039384169390911691600080516020612a8a83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600033610a3f81858561185e565b6000546001600160a01b031633146113055760405162461bcd60e51b8152600401610a99906128d6565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113515760405162461bcd60e51b8152600401610a99906128d6565b60178054821515600160b01b0260ff60b01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061139e90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146113d35760405162461bcd60e51b8152600401610a99906128d6565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a99906128d6565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561144e8142612960565b600255600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a350565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146114cf5760405162461bcd60e51b8152600401610a99906128d6565b60135460ff16151581151514156114f85760405162461bcd60e51b8152600401610a99906128b1565b6013805460ff19168215159081179091556040514381527f0ca71f7802e05294b7e4e083e369742fd573c5868ff991712ae1ee8af26233159060200160405180910390a250565b6000546001600160a01b031633146115695760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b031633146115b45760405162461bcd60e51b8152600401610a99906128d6565b601455565b6000546001600160a01b031633146115e35760405162461bcd60e51b8152600401610a99906128d6565b601655565b6000546001600160a01b031633146116125760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b0381166116775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a99565b600080546040516001600160a01b0380851693921691600080516020612a8a83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117225760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a99565b6001600160a01b0382166117835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a99565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117f0848461147a565b90506000198114611858578181101561184b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a99565b61185884848484036116c0565b50505050565b6001600160a01b0383166118c25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a99565b6001600160a01b03831660009081526007602052604090205460ff16156119195760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03821660009081526007602052604090205460ff16156119705760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03831660009081526009602052604090205460019060ff16806119b257506001600160a01b03831660009081526009602052604090205460ff165b156119bf57506000611b09565b601454821115611a225760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a99565b601754600160a01b900460ff16611a745760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81a5cc81b9bdd081cdd185c9d195960521b6044820152606401610a99565b6001600160a01b03831660009081526018602052604090205460ff16611b09576015546001600160a01b038416600090815260056020526040902054611abb908490612960565b1115611b095760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d697400000000006044820152606401610a99565b3060009081526005602052604090205460165481108015908190611b375750601754600160a81b900460ff16155b8015611b4c5750601754600160b01b900460ff165b8015611b6657506017546001600160a01b03878116911614155b15611b7f578015611b7f576016549150611b7f82611ca7565b6001600160a01b0380861660009081526018602052604080822054928916825290205460ff9182169116158015611bb4575080155b15611bbe57600093505b60135460ff16158015611bcf575080155b15611bd957600093505b611be68787878785611dbc565b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ca6908490611f42565b600080611c4e8385612960565b905083811015611ca05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a99565b9392505050565b6017805460ff60a81b1916600160a81b179055601054600f54600091611cdd91600291611cd79182908790612014565b90612093565b90506000611ceb83836120d5565b905047611cf782612117565b6000611d0347836120d5565b90506000611d29611d206002600f5461209390919063ffffffff16565b601054906120d5565b90508415611d5857611d5885611d536002611cd785611cd7600f548961201490919063ffffffff16565b61231f565b600354600d54611d82916001600160a01b031690611d7d908490611cd7908790612014565b61240e565b600454600e54611da7916001600160a01b031690611d7d908490611cd7908790612014565b50506017805460ff60a81b1916905550505050565b81611dc957611dc9612444565b6001600160a01b03851660009081526005602052604090205483811015611e415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a99565b6000611e4d858461245a565b90506000611e5b82876129b9565b6001600160a01b03808a166000908152600560205260408082208a88039055918a16815281812080548401905530815220805484019055905084611ea457611ea4601154601055565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ee991815260200190565b60405180910390a38115611f385760405182815230906001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050505050505050565b6000611f97826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124a79092919063ffffffff16565b805190915015610ca65780806020019051810190611fb59190612775565b610ca65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a99565b60008261202357506000610a45565b600061202f838561299a565b90508261203c8583612978565b14611ca05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a99565b6000611ca083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506124b6565b6000611ca083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ed565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061214c5761214c612a4d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156121c557600080fd5b505afa1580156121d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fd9190612667565b8160018151811061221057612210612a4d565b60200260200101906001600160a01b031690816001600160a01b03168152505061225b307f0000000000000000000000000000000000000000000000000000000000000000846116c0565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906122b0908590600090869030904290600401612924565b600060405180830381600087803b1580156122ca57600080fd5b505af11580156122de573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161231392919061290b565b60405180910390a15050565b61234a307f0000000000000000000000000000000000000000000000000000000000000000846116c0565b60405163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c4016060604051808303818588803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061240791906127f0565b5050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610ca6573d6000803e3d6000fd5b60105461244d57565b6010805460115560009055565b6000806124786103e8611cd76010548761201490919063ffffffff16565b905082612485578061249f565b61249f600a611cd76012548461201490919063ffffffff16565b949350505050565b606061249f848460008561251e565b600081836124d75760405162461bcd60e51b8152600401610a99919061287e565b5060006124e48486612978565b95945050505050565b600081848411156125115760405162461bcd60e51b8152600401610a99919061287e565b5060006124e484866129b9565b606061252985612611565b6125755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a99565b600080866001600160a01b031685876040516125919190612862565b60006040518083038185875af1925050503d80600081146125ce576040519150601f19603f3d011682016040523d82523d6000602084013e6125d3565b606091505b509150915081156125e757915061249f9050565b8051156125f75780518082602001fd5b8360405162461bcd60e51b8152600401610a99919061287e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061249f575050151592915050565b60006020828403121561265c57600080fd5b8135611ca081612a63565b60006020828403121561267957600080fd5b8151611ca081612a63565b6000806040838503121561269757600080fd5b82356126a281612a63565b915060208301356126b281612a63565b809150509250929050565b6000806000606084860312156126d257600080fd5b83356126dd81612a63565b925060208401356126ed81612a63565b929592945050506040919091013590565b6000806040838503121561271157600080fd5b823561271c81612a63565b915060208301356126b281612a7b565b6000806040838503121561273f57600080fd5b823561274a81612a63565b946020939093013593505050565b60006020828403121561276a57600080fd5b8135611ca081612a7b565b60006020828403121561278757600080fd5b8151611ca081612a7b565b6000602082840312156127a457600080fd5b5035919050565b6000602082840312156127bd57600080fd5b5051919050565b6000806000606084860312156127d957600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561280557600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b838110156128575781516001600160a01b031687529582019590820190600101612832565b509495945050505050565b600082516128748184602087016129d0565b9190910192915050565b602081526000825180602084015261289d8160408501602087016129d0565b601f01601f19169190910160400192915050565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061249f604083018461281e565b85815284602082015260a06040820152600061294360a083018661281e565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561297357612973612a37565b500190565b60008261299557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129b4576129b4612a37565b500290565b6000828210156129cb576129cb612a37565b500390565b60005b838110156129eb5781810151838201526020016129d3565b838111156118585750506000910152565b600181811c90821680612a1057607f821691505b60208210811415612a3157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612a7857600080fd5b50565b8015158114612a7857600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212208c465f08d076247c19412695d9f2d30c0a6d261e001daa4a79a98200e619325464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103035760003560e01c80637d1db4a511610190578063c5930482116100dc578063dee6a01611610095578063ef0658f21161006f578063ef0658f214610910578063f0f165af14610926578063f2fde38b14610946578063fe575a871461096657600080fd5b8063dee6a016146108b0578063ea2f0b37146108d0578063ec28438a146108f057600080fd5b8063c59304821461080a578063ca48dd7314610824578063cbff46171461083a578063d0d41fe114610850578063dd46706414610870578063dd62ed3e1461089057600080fd5b806395d89b4111610149578063a69df4b511610123578063a69df4b514610795578063a9059cbb146107aa578063b24cf5d7146107ca578063c49b9a80146107ea57600080fd5b806395d89b411461074b578063a073d37f14610760578063a457c2d71461077557600080fd5b80637d1db4a514610689578063842884171461069f578063845a51ec146106d85780638a8c523c146106f85780638da5cb5b1461070d578063929793911461072b57600080fd5b8063437823ec1161024f578063557ed1ba116102085780636c0a24eb116101e25780636c0a24eb1461060857806370a082311461061e578063715018a614610654578063728d41c91461066957600080fd5b8063557ed1ba146105c0578063602bc62b146105d3578063690d8320146105e857600080fd5b8063437823ec146104e557806349bd5a5e146105055780634a74bb02146105255780634ada218b146105465780634c14c0b3146105675780635342acb41461058757600080fd5b80632d5a5d34116102bc5780633950935111610296578063395093511461046f5780633a40799e1461048f5780633ad10ef6146104a55780634127bcc6146104c557600080fd5b80632d5a5d341461040b578063313ce5671461042d578063382e901d1461044f57600080fd5b806306fdde031461030f578063095ea7b31461033a5780631694505e1461036a57806318160ddd146103b657806323b872dd146103d5578063283f7820146103f557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032461099f565b604051610331919061287e565b60405180910390f35b34801561034657600080fd5b5061035a61035536600461272c565b610a31565b6040519015158152602001610331565b34801561037657600080fd5b5061039e7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610331565b3480156103c257600080fd5b506008545b604051908152602001610331565b3480156103e157600080fd5b5061035a6103f03660046126bd565b610a4b565b34801561040157600080fd5b506103c760105481565b34801561041757600080fd5b5061042b6104263660046126fe565b610a6f565b005b34801561043957600080fd5b50600c5460405160ff9091168152602001610331565b34801561045b57600080fd5b5061042b61046a366004612684565b610b93565b34801561047b57600080fd5b5061035a61048a36600461272c565b610cab565b34801561049b57600080fd5b506103c7600e5481565b3480156104b157600080fd5b5060045461039e906001600160a01b031681565b3480156104d157600080fd5b5061042b6104e03660046127c4565b610ccd565b3480156104f157600080fd5b5061042b61050036600461264a565b610dc0565b34801561051157600080fd5b5060175461039e906001600160a01b031681565b34801561053157600080fd5b5060175461035a90600160b01b900460ff1681565b34801561055257600080fd5b5060175461035a90600160a01b900460ff1681565b34801561057357600080fd5b5061042b6105823660046126fe565b610e0e565b34801561059357600080fd5b5061035a6105a236600461264a565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156105cc57600080fd5b50426103c7565b3480156105df57600080fd5b506002546103c7565b3480156105f457600080fd5b5061042b61060336600461264a565b610ecb565b34801561061457600080fd5b506103c760155481565b34801561062a57600080fd5b506103c761063936600461264a565b6001600160a01b031660009081526005602052604090205490565b34801561066057600080fd5b5061042b610fb6565b34801561067557600080fd5b5061042b610684366004612792565b611018565b34801561069557600080fd5b506103c760145481565b3480156106ab57600080fd5b5061035a6106ba36600461264a565b6001600160a01b031660009081526018602052604090205460ff1690565b3480156106e457600080fd5b5060035461039e906001600160a01b031681565b34801561070457600080fd5b5061042b611047565b34801561071957600080fd5b506000546001600160a01b031661039e565b34801561073757600080fd5b5061042b610746366004612792565b6110d2565b34801561075757600080fd5b5061032461113d565b34801561076c57600080fd5b506016546103c7565b34801561078157600080fd5b5061035a61079036600461272c565b61114c565b3480156107a157600080fd5b5061042b6111c7565b3480156107b657600080fd5b5061035a6107c536600461272c565b6112cd565b3480156107d657600080fd5b5061042b6107e536600461264a565b6112db565b3480156107f657600080fd5b5061042b610805366004612758565b611327565b34801561081657600080fd5b5060135461035a9060ff1681565b34801561083057600080fd5b506103c7600f5481565b34801561084657600080fd5b506103c760125481565b34801561085c57600080fd5b5061042b61086b36600461264a565b6113a9565b34801561087c57600080fd5b5061042b61088b366004612792565b6113f5565b34801561089c57600080fd5b506103c76108ab366004612684565b61147a565b3480156108bc57600080fd5b5061042b6108cb366004612758565b6114a5565b3480156108dc57600080fd5b5061042b6108eb36600461264a565b61153f565b3480156108fc57600080fd5b5061042b61090b366004612792565b61158a565b34801561091c57600080fd5b506103c7600d5481565b34801561093257600080fd5b5061042b610941366004612792565b6115b9565b34801561095257600080fd5b5061042b61096136600461264a565b6115e8565b34801561097257600080fd5b5061035a61098136600461264a565b6001600160a01b031660009081526007602052604090205460ff1690565b6060600a80546109ae906129fc565b80601f01602080910402602001604051908101604052809291908181526020018280546109da906129fc565b8015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b600033610a3f8185856116c0565b60019150505b92915050565b600033610a598582856117e4565b610a6485858561185e565b506001949350505050565b6000546001600160a01b03163314610aa25760405162461bcd60e51b8152600401610a99906128d6565b60405180910390fd5b6001600160a01b03821660009081526007602052604090205460ff1615158115151415610ae15760405162461bcd60e51b8152600401610a99906128b1565b6017546001600160a01b0383811691161415610b3f5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f7420626c61636b6c69737420756e6973776170207061697200006044820152606401610a99565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4491a35050565b6000546001600160a01b03163314610bbd5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b038216301415610c165760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f74207769746864726177207468697320746f6b656e00000000006044820152606401610a99565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610c5857600080fd5b505afa158015610c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9091906127ab565b9050610ca66001600160a01b0384168383611bef565b505050565b600033610a3f818585610cbe838361147a565b610cc89190612960565b6116c0565b6000546001600160a01b03163314610cf75760405162461bcd60e51b8152600401610a99906128d6565b6000610d0d82610d078686611c41565b90611c41565b905060c8811115610d605760405162461bcd60e51b815260206004820152601e60248201527f63616e7420736574206665657320746f206d6f7265207468616e2032302500006044820152606401610a99565b600f849055600e839055600d8290556010805460115581905560408051858152602081018590529081018390527fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd9060600160405180910390a150505050565b6000546001600160a01b03163314610dea5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b03163314610e385760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415610e775760405162461bcd60e51b8152600401610a99906128b1565b6001600160a01b038216600081815260186020526040808220805460ff191685151590811790915590519092917f8c55f11b6d19d56c8b1800eb4e8b56441df993e14634fe86cd24b1c9bff545d391a35050565b6000546001600160a01b03163314610ef55760405162461bcd60e51b8152600401610a99906128d6565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f42576040519150601f19603f3d011682016040523d82523d6000602084013e610f47565b606091505b5050905080610fb25760405162461bcd60e51b815260206004820152603160248201527f756e61626c6520746f2073656e642076616c75652c20726563697069656e74206044820152701b585e481a185d99481c995d995c9d1959607a1b6064820152608401610a99565b5050565b6000546001600160a01b03163314610fe05760405162461bcd60e51b8152600401610a99906128d6565b600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110425760405162461bcd60e51b8152600401610a99906128d6565b601555565b6000546001600160a01b031633146110715760405162461bcd60e51b8152600401610a99906128d6565b601754600160a01b900460ff16156110bd5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a99565b6017805460ff60a01b1916600160a01b179055565b6000546001600160a01b031633146110fc5760405162461bcd60e51b8152600401610a99906128d6565b60125460408051918252602082018390527fbd246d9b8c3d3843cdfe86c1eef754015151cca52383afcf47cfe2e30389233e910160405180910390a1601255565b6060600b80546109ae906129fc565b6000338161115a828661147a565b9050838110156111ba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a99565b610a6482868684036116c0565b6001546001600160a01b0316331461122d5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610a99565b600254421161127e5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a99565b600154600080546040516001600160a01b039384169390911691600080516020612a8a83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600033610a3f81858561185e565b6000546001600160a01b031633146113055760405162461bcd60e51b8152600401610a99906128d6565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113515760405162461bcd60e51b8152600401610a99906128d6565b60178054821515600160b01b0260ff60b01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061139e90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146113d35760405162461bcd60e51b8152600401610a99906128d6565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a99906128d6565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561144e8142612960565b600255600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a350565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146114cf5760405162461bcd60e51b8152600401610a99906128d6565b60135460ff16151581151514156114f85760405162461bcd60e51b8152600401610a99906128b1565b6013805460ff19168215159081179091556040514381527f0ca71f7802e05294b7e4e083e369742fd573c5868ff991712ae1ee8af26233159060200160405180910390a250565b6000546001600160a01b031633146115695760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b031633146115b45760405162461bcd60e51b8152600401610a99906128d6565b601455565b6000546001600160a01b031633146115e35760405162461bcd60e51b8152600401610a99906128d6565b601655565b6000546001600160a01b031633146116125760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b0381166116775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a99565b600080546040516001600160a01b0380851693921691600080516020612a8a83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117225760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a99565b6001600160a01b0382166117835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a99565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117f0848461147a565b90506000198114611858578181101561184b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a99565b61185884848484036116c0565b50505050565b6001600160a01b0383166118c25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a99565b6001600160a01b03831660009081526007602052604090205460ff16156119195760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03821660009081526007602052604090205460ff16156119705760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03831660009081526009602052604090205460019060ff16806119b257506001600160a01b03831660009081526009602052604090205460ff165b156119bf57506000611b09565b601454821115611a225760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a99565b601754600160a01b900460ff16611a745760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81a5cc81b9bdd081cdd185c9d195960521b6044820152606401610a99565b6001600160a01b03831660009081526018602052604090205460ff16611b09576015546001600160a01b038416600090815260056020526040902054611abb908490612960565b1115611b095760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d697400000000006044820152606401610a99565b3060009081526005602052604090205460165481108015908190611b375750601754600160a81b900460ff16155b8015611b4c5750601754600160b01b900460ff165b8015611b6657506017546001600160a01b03878116911614155b15611b7f578015611b7f576016549150611b7f82611ca7565b6001600160a01b0380861660009081526018602052604080822054928916825290205460ff9182169116158015611bb4575080155b15611bbe57600093505b60135460ff16158015611bcf575080155b15611bd957600093505b611be68787878785611dbc565b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ca6908490611f42565b600080611c4e8385612960565b905083811015611ca05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a99565b9392505050565b6017805460ff60a81b1916600160a81b179055601054600f54600091611cdd91600291611cd79182908790612014565b90612093565b90506000611ceb83836120d5565b905047611cf782612117565b6000611d0347836120d5565b90506000611d29611d206002600f5461209390919063ffffffff16565b601054906120d5565b90508415611d5857611d5885611d536002611cd785611cd7600f548961201490919063ffffffff16565b61231f565b600354600d54611d82916001600160a01b031690611d7d908490611cd7908790612014565b61240e565b600454600e54611da7916001600160a01b031690611d7d908490611cd7908790612014565b50506017805460ff60a81b1916905550505050565b81611dc957611dc9612444565b6001600160a01b03851660009081526005602052604090205483811015611e415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a99565b6000611e4d858461245a565b90506000611e5b82876129b9565b6001600160a01b03808a166000908152600560205260408082208a88039055918a16815281812080548401905530815220805484019055905084611ea457611ea4601154601055565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ee991815260200190565b60405180910390a38115611f385760405182815230906001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050505050505050565b6000611f97826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124a79092919063ffffffff16565b805190915015610ca65780806020019051810190611fb59190612775565b610ca65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a99565b60008261202357506000610a45565b600061202f838561299a565b90508261203c8583612978565b14611ca05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a99565b6000611ca083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506124b6565b6000611ca083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ed565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061214c5761214c612a4d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156121c557600080fd5b505afa1580156121d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fd9190612667565b8160018151811061221057612210612a4d565b60200260200101906001600160a01b031690816001600160a01b03168152505061225b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116c0565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906122b0908590600090869030904290600401612924565b600060405180830381600087803b1580156122ca57600080fd5b505af11580156122de573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161231392919061290b565b60405180910390a15050565b61234a307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116c0565b60405163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c4016060604051808303818588803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061240791906127f0565b5050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610ca6573d6000803e3d6000fd5b60105461244d57565b6010805460115560009055565b6000806124786103e8611cd76010548761201490919063ffffffff16565b905082612485578061249f565b61249f600a611cd76012548461201490919063ffffffff16565b949350505050565b606061249f848460008561251e565b600081836124d75760405162461bcd60e51b8152600401610a99919061287e565b5060006124e48486612978565b95945050505050565b600081848411156125115760405162461bcd60e51b8152600401610a99919061287e565b5060006124e484866129b9565b606061252985612611565b6125755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a99565b600080866001600160a01b031685876040516125919190612862565b60006040518083038185875af1925050503d80600081146125ce576040519150601f19603f3d011682016040523d82523d6000602084013e6125d3565b606091505b509150915081156125e757915061249f9050565b8051156125f75780518082602001fd5b8360405162461bcd60e51b8152600401610a99919061287e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061249f575050151592915050565b60006020828403121561265c57600080fd5b8135611ca081612a63565b60006020828403121561267957600080fd5b8151611ca081612a63565b6000806040838503121561269757600080fd5b82356126a281612a63565b915060208301356126b281612a63565b809150509250929050565b6000806000606084860312156126d257600080fd5b83356126dd81612a63565b925060208401356126ed81612a63565b929592945050506040919091013590565b6000806040838503121561271157600080fd5b823561271c81612a63565b915060208301356126b281612a7b565b6000806040838503121561273f57600080fd5b823561274a81612a63565b946020939093013593505050565b60006020828403121561276a57600080fd5b8135611ca081612a7b565b60006020828403121561278757600080fd5b8151611ca081612a7b565b6000602082840312156127a457600080fd5b5035919050565b6000602082840312156127bd57600080fd5b5051919050565b6000806000606084860312156127d957600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561280557600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b838110156128575781516001600160a01b031687529582019590820190600101612832565b509495945050505050565b600082516128748184602087016129d0565b9190910192915050565b602081526000825180602084015261289d8160408501602087016129d0565b601f01601f19169190910160400192915050565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061249f604083018461281e565b85815284602082015260a06040820152600061294360a083018661281e565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561297357612973612a37565b500190565b60008261299557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129b4576129b4612a37565b500290565b6000828210156129cb576129cb612a37565b500390565b60005b838110156129eb5781810151838201526020016129d3565b838111156118585750506000910152565b600181811c90821680612a1057607f821691505b60208210811415612a3157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612a7857600080fd5b50565b8015158114612a7857600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212208c465f08d076247c19412695d9f2d30c0a6d261e001daa4a79a98200e619325464736f6c63430008070033

Deployed Bytecode Sourcemap

18615:15979:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21713:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22585:201;;;;;;;;;;-1:-1:-1;22585:201:1;;;;;:::i;:::-;;:::i;:::-;;;6028:14:2;;6021:22;6003:41;;5991:2;5976:18;22585:201:1;5863:187:2;20000:51:1;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4704:32:2;;;4686:51;;4674:2;4659:18;20000:51:1;4540:203:2;21990:100:1;;;;;;;;;;-1:-1:-1;22070:12:1;;21990:100;;;15900:25:2;;;15888:2;15873:18;21990:100:1;15754:177:2;22794:295:1;;;;;;;;;;-1:-1:-1;22794:295:1;;;;;:::i;:::-;;:::i;19577:29::-;;;;;;;;;;;;;;;;33519:338;;;;;;;;;;-1:-1:-1;33519:338:1;;;;;:::i;:::-;;:::i;:::-;;21899:83;;;;;;;;;;-1:-1:-1;21965:9:1;;21899:83;;21965:9;;;;17579:36:2;;17567:2;17552:18;21899:83:1;17437:184:2;33055:309:1;;;;;;;;;;-1:-1:-1;33055:309:1;;;;;:::i;:::-;;:::i;23097:238::-;;;;;;;;;;-1:-1:-1;23097:238:1;;;;;:::i;:::-;;:::i;19499:30::-;;;;;;;;;;;;;;;;18896:87;;;;;;;;;;-1:-1:-1;18896:87:1;;;;-1:-1:-1;;;;;18896:87:1;;;31152:592;;;;;;;;;;-1:-1:-1;31152:592:1;;;;;:::i;:::-;;:::i;30911:111::-;;;;;;;;;;-1:-1:-1;30911:111:1;;;;;:::i;:::-;;:::i;20058:28::-;;;;;;;;;;-1:-1:-1;20058:28:1;;;;-1:-1:-1;;;;;20058:28:1;;;20168:41;;;;;;;;;;-1:-1:-1;20168:41:1;;;;-1:-1:-1;;;20168:41:1;;;;;;20093:34;;;;;;;;;;-1:-1:-1;20093:34:1;;;;-1:-1:-1;;;20093:34:1;;;;;;30490:278;;;;;;;;;;-1:-1:-1;30490:278:1;;;;;:::i;:::-;;:::i;30776:123::-;;;;;;;;;;-1:-1:-1;30776:123:1;;;;;:::i;:::-;-1:-1:-1;;;;;30864:27:1;30840:4;30864:27;;;:18;:27;;;;;;;;;30776:123;10125:90;;;;;;;;;;-1:-1:-1;10192:15:1;10125:90;;10023;;;;;;;;;;-1:-1:-1;10096:9:1;;10023:90;;33999:227;;;;;;;;;;-1:-1:-1;33999:227:1;;;;;:::i;:::-;;:::i;19870:54::-;;;;;;;;;;;;;;;;22098:119;;;;;;;;;;-1:-1:-1;22098:119:1;;;;;:::i;:::-;-1:-1:-1;;;;;22191:18:1;22164:7;22191:18;;;:9;:18;;;;;;;22098:119;9615:148;;;;;;;;;;;;;:::i;31885:124::-;;;;;;;;;;-1:-1:-1;31885:124:1;;;;;:::i;:::-;;:::i;19813:50::-;;;;;;;;;;;;;;;;30350:132;;;;;;;;;;-1:-1:-1;30350:132:1;;;;;:::i;:::-;-1:-1:-1;;;;;30445:29:1;30421:4;30445:29;;;:20;:29;;;;;;;;;30350:132;18772:94;;;;;;;;;;-1:-1:-1;18772:94:1;;;;-1:-1:-1;;;;;18772:94:1;;;33372:139;;;;;;;;;;;;;:::i;9390:79::-;;;;;;;;;;-1:-1:-1;9428:7:1;9455:6;-1:-1:-1;;;;;9455:6:1;9390:79;;32652:169;;;;;;;;;;-1:-1:-1;32652:169:1;;;;;:::i;:::-;;:::i;21804:87::-;;;;;;;;;;;;;:::i;23787:120::-;;;;;;;;;;-1:-1:-1;23876:23:1;;23787:120;;23343:436;;;;;;;;;;-1:-1:-1;23343:436:1;;;;;:::i;:::-;;:::i;10461:305::-;;;;;;;;;;;;;:::i;22225:193::-;;;;;;;;;;-1:-1:-1;22225:193:1;;;;;:::i;:::-;;:::i;32195:145::-;;;;;;;;;;-1:-1:-1;32195:145:1;;;;;:::i;:::-;;:::i;32473:171::-;;;;;;;;;;-1:-1:-1;32473:171:1;;;;;:::i;:::-;;:::i;19770:34::-;;;;;;;;;;-1:-1:-1;19770:34:1;;;;;;;;19536:32;;;;;;;;;;;;;;;;19716:30;;;;;;;;;;;;;;;;32348:117;;;;;;;;;;-1:-1:-1;32348:117:1;;;;;:::i;:::-;;:::i;10223:226::-;;;;;;;;;;-1:-1:-1;10223:226:1;;;;;:::i;:::-;;:::i;22426:151::-;;;;;;;;;;-1:-1:-1;22426:151:1;;;;;:::i;:::-;;:::i;32829:218::-;;;;;;;;;;-1:-1:-1;32829:218:1;;;;;:::i;:::-;;:::i;31034:110::-;;;;;;;;;;-1:-1:-1;31034:110:1;;;;;:::i;:::-;;:::i;31762:111::-;;;;;;;;;;-1:-1:-1;31762:111:1;;;;;:::i;:::-;;:::i;19456:36::-;;;;;;;;;;;;;;;;32017:166;;;;;;;;;;-1:-1:-1;32017:166:1;;;;;:::i;:::-;;:::i;9771:244::-;;;;;;;;;;-1:-1:-1;9771:244:1;;;;;:::i;:::-;;:::i;23915:117::-;;;;;;;;;;-1:-1:-1;23915:117:1;;;;;:::i;:::-;-1:-1:-1;;;;;24001:23:1;23977:4;24001:23;;;:14;:23;;;;;;;;;23915:117;21713:83;21750:13;21783:5;21776:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21713:83;:::o;22585:201::-;22668:4;198:10;22724:32;198:10;22740:7;22749:6;22724:8;:32::i;:::-;22774:4;22767:11;;;22585:201;;;;;:::o;22794:295::-;22925:4;198:10;22983:38;22999:4;198:10;23014:6;22983:15;:38::i;:::-;23032:27;23042:4;23048:2;23052:6;23032:9;:27::i;:::-;-1:-1:-1;23077:4:1;;22794:295;-1:-1:-1;;;;22794:295:1:o;33519:338::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;33617:23:1;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;:36;;::::0;::::1;;;;33608:61;;;;-1:-1:-1::0;;;33608:61:1::1;;;;;;;:::i;:::-;33699:13;::::0;-1:-1:-1;;;;;33688:24:1;;::::1;33699:13:::0;::::1;33688:24;;33680:67;;;::::0;-1:-1:-1;;;33680:67:1;;8046:2:2;33680:67:1::1;::::0;::::1;8028:21:2::0;8085:2;8065:18;;;8058:30;8124:32;8104:18;;;8097:60;8174:18;;33680:67:1::1;7844:354:2::0;33680:67:1::1;-1:-1:-1::0;;;;;33758:23:1;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:35;;-1:-1:-1;;33758:35:1::1;::::0;::::1;;::::0;;::::1;::::0;;;33811:38;;33758:35;;:23;33811:38:::1;::::0;::::1;33519:338:::0;;:::o;33055:309::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;33162:22:1;::::1;33179:4;33162:22;;33154:62;;;::::0;-1:-1:-1;;;33154:62:1;;8763:2:2;33154:62:1::1;::::0;::::1;8745:21:2::0;8802:2;8782:18;;;8775:30;8841:29;8821:18;;;8814:57;8888:18;;33154:62:1::1;8561:351:2::0;33154:62:1::1;33253:38;::::0;-1:-1:-1;;;33253:38:1;;33285:4:::1;33253:38;::::0;::::1;4686:51:2::0;33227:23:1::1;::::0;-1:-1:-1;;;;;33253:23:1;::::1;::::0;::::1;::::0;4659:18:2;;33253:38:1::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33227:64:::0;-1:-1:-1;33302:54:1::1;-1:-1:-1::0;;;;;33302:26:1;::::1;33329:9:::0;33227:64;33302:26:::1;:54::i;:::-;33143:221;33055:309:::0;;:::o;23097:238::-;23185:4;198:10;23241:64;198:10;23257:7;23294:10;23266:25;198:10;23257:7;23266:9;:25::i;:::-;:38;;;;:::i;:::-;23241:8;:64::i;31152:592::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;31287:19:::1;31309:61;31349:20:::0;31309:35:::1;:16:::0;31330:13;31309:20:::1;:35::i;:::-;:39:::0;::::1;:61::i;:::-;31287:83;;31405:3;31390:11;:18;;31381:62;;;::::0;-1:-1:-1;;;31381:62:1;;11807:2:2;31381:62:1::1;::::0;::::1;11789:21:2::0;11846:2;11826:18;;;11819:30;11885:32;11865:18;;;11858:60;11935:18;;31381:62:1::1;11605:354:2::0;31381:62:1::1;31456:13;:32:::0;;;31499:10:::1;:26:::0;;;31536:17:::1;:40:::0;;;31609:9:::1;::::0;;31589:17:::1;:29:::0;31629:23;;;31670:66:::1;::::0;;17315:25:2;;;17371:2;17356:18;;17349:34;;;17399:18;;;17392:34;;;31670:66:1::1;::::0;17303:2:2;17288:18;31670:66:1::1;;;;;;;31276:468;31152:592:::0;;;:::o;30911:111::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;30980:27:1::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;30980:34:1::1;31010:4;30980:34;::::0;;30911:111::o;30490:278::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;30595:29:1;::::1;;::::0;;;:20:::1;:29;::::0;;;;;::::1;;:39;;::::0;::::1;;;;30586:64;;;;-1:-1:-1::0;;;30586:64:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30661:29:1;::::1;;::::0;;;:20:::1;:29;::::0;;;;;:38;;-1:-1:-1;;30661:38:1::1;::::0;::::1;;::::0;;::::1;::::0;;;30717:43;;30661:38;;:29;30717:43:::1;::::0;::::1;30490:278:::0;;:::o;33999:227::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;34070:12:::1;34088:9;-1:-1:-1::0;;;;;34088:14:1::1;34111:21;34088:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34069:69;;;34157:7;34149:69;;;::::0;-1:-1:-1;;;34149:69:1;;9526:2:2;34149:69:1::1;::::0;::::1;9508:21:2::0;9565:2;9545:18;;;9538:30;9604:34;9584:18;;;9577:62;-1:-1:-1;;;9655:18:2;;;9648:47;9712:19;;34149:69:1::1;9324:413:2::0;34149:69:1::1;34058:168;33999:227:::0;:::o;9615:148::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;9722:1:::1;9706:6:::0;;9685:40:::1;::::0;-1:-1:-1;;;;;9706:6:1;;::::1;::::0;-1:-1:-1;;;;;;;;;;;9685:40:1;9722:1;;9685:40:::1;9753:1;9736:19:::0;;-1:-1:-1;;;;;;9736:19:1::1;::::0;;9615:148::o;31885:124::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;31968:16:::1;:33:::0;31885:124::o;33372:139::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;33437:14:::1;::::0;-1:-1:-1;;;33437:14:1;::::1;;;33436:15;33427:44;;;::::0;-1:-1:-1;;;33427:44:1;;12166:2:2;33427:44:1::1;::::0;::::1;12148:21:2::0;12205:2;12185:18;;;12178:30;-1:-1:-1;;;12224:18:2;;;12217:45;12279:18;;33427:44:1::1;11964:339:2::0;33427:44:1::1;33482:14;:21:::0;;-1:-1:-1;;;;33482:21:1::1;-1:-1:-1::0;;;33482:21:1::1;::::0;;33372:139::o;32652:169::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32752:10:::1;::::0;32734:42:::1;::::0;;17034:25:2;;;17090:2;17075:18;;17068:34;;;32734:42:1::1;::::0;17007:18:2;32734:42:1::1;;;;;;;32789:10;:24:::0;32652:169::o;21804:87::-;21843:13;21876:7;21869:14;;;;;:::i;23343:436::-;23436:4;198:10;23436:4;23519:25;198:10;23536:7;23519:9;:25::i;:::-;23492:52;;23583:15;23563:16;:35;;23555:85;;;;-1:-1:-1;;;23555:85:1;;15550:2:2;23555:85:1;;;15532:21:2;15589:2;15569:18;;;15562:30;15628:34;15608:18;;;15601:62;-1:-1:-1;;;15679:18:2;;;15672:35;15724:19;;23555:85:1;15348:401:2;23555:85:1;23676:60;23685:5;23692:7;23720:15;23701:16;:34;23676:8;:60::i;10461:305::-;10513:14;;-1:-1:-1;;;;;10513:14:1;10531:10;10513:28;10505:76;;;;-1:-1:-1;;;10505:76:1;;15146:2:2;10505:76:1;;;15128:21:2;15185:2;15165:18;;;15158:30;15224:34;15204:18;;;15197:62;-1:-1:-1;;;15275:18:2;;;15268:33;15318:19;;10505:76:1;14944:399:2;10505:76:1;10618:9;;10600:15;:27;10592:72;;;;-1:-1:-1;;;10592:72:1;;14375:2:2;10592:72:1;;;14357:21:2;14414:2;14394:18;;;14387:30;14453:33;14433:18;;;14426:61;14504:18;;10592:72:1;14173:355:2;10592:72:1;10709:14;;;10701:6;;10680:44;;-1:-1:-1;;;;;10709:14:1;;;;10701:6;;;;-1:-1:-1;;;;;;;;;;;10680:44:1;;10744:14;;;10735:23;;-1:-1:-1;;;;;;10735:23:1;-1:-1:-1;;;;;10744:14:1;;;10735:23;;;;;;10461:305::o;22225:193::-;22304:4;198:10;22360:28;198:10;22377:2;22381:6;22360:9;:28::i;32195:145::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32285:17:::1;:47:::0;;-1:-1:-1;;;;;;32285:47:1::1;-1:-1:-1::0;;;;;32285:47:1;;;::::1;::::0;;;::::1;::::0;;32195:145::o;32473:171::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32550:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;32550:32:1::1;-1:-1:-1::0;;;;32550:32:1;;::::1;;::::0;;32598:38:::1;::::0;::::1;::::0;::::1;::::0;32574:8;6028:14:2;6021:22;6003:41;;5991:2;5976:18;;5863:187;32598:38:1::1;;;;;;;;32473:171:::0;:::o;32348:117::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32424:10:::1;:33:::0;;-1:-1:-1;;;;;;32424:33:1::1;-1:-1:-1::0;;;;;32424:33:1;;;::::1;::::0;;;::::1;::::0;;32348:117::o;10223:226::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;10304:6:::1;::::0;;;10287:23;;-1:-1:-1;;;;;;10287:23:1;;::::1;-1:-1:-1::0;;;;;10304:6:1;::::1;10287:23;::::0;;;10321:19:::1;::::0;;10363:22:::1;10381:4:::0;10363:15:::1;:22;:::i;:::-;10351:9;:34:::0;10438:1:::1;10422:6:::0;;10401:40:::1;::::0;-1:-1:-1;;;;;10422:6:1;;::::1;::::0;-1:-1:-1;;;;;;;;;;;10401:40:1;10438:1;;10401:40:::1;10223:226:::0;:::o;22426:151::-;-1:-1:-1;;;;;22542:18:1;;;22515:7;22542:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22426:151::o;32829:218::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32907:15:::1;::::0;::::1;;:26;;::::0;::::1;;;;32899:50;;;;-1:-1:-1::0;;;32899:50:1::1;;;;;;;:::i;:::-;32960:15;:25:::0;;-1:-1:-1;;32960:25:1::1;::::0;::::1;;::::0;;::::1;::::0;;;33003:36:::1;::::0;33026:12:::1;15900:25:2::0;;33003:36:1::1;::::0;15888:2:2;15873:18;33003:36:1::1;;;;;;;32829:218:::0;:::o;31034:110::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;31101:27:1::1;31131:5;31101:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;31101:35:1::1;::::0;;31034:110::o;31762:111::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;31839:12:::1;:26:::0;31762:111::o;32017:166::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;32125:23:::1;:50:::0;32017:166::o;9771:244::-;9524:6;;-1:-1:-1;;;;;9524:6:1;198:10;9524:22;9516:67;;;;-1:-1:-1;;;9516:67:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;9860:22:1;::::1;9852:73;;;::::0;-1:-1:-1;;;9852:73:1;;6880:2:2;9852:73:1::1;::::0;::::1;6862:21:2::0;6919:2;6899:18;;;6892:30;6958:34;6938:18;;;6931:62;-1:-1:-1;;;7009:18:2;;;7002:36;7055:19;;9852:73:1::1;6678:402:2::0;9852:73:1::1;9962:6;::::0;;9941:38:::1;::::0;-1:-1:-1;;;;;9941:38:1;;::::1;::::0;9962:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;9941:38:1;::::1;9990:6;:17:::0;;-1:-1:-1;;;;;;9990:17:1::1;-1:-1:-1::0;;;;;9990:17:1;;;::::1;::::0;;;::::1;::::0;;9771:244::o;24040:380::-;-1:-1:-1;;;;;24176:19:1;;24168:68;;;;-1:-1:-1;;;24168:68:1;;13272:2:2;24168:68:1;;;13254:21:2;13311:2;13291:18;;;13284:30;13350:34;13330:18;;;13323:62;-1:-1:-1;;;13401:18:2;;;13394:34;13445:19;;24168:68:1;13070:400:2;24168:68:1;-1:-1:-1;;;;;24255:21:1;;24247:68;;;;-1:-1:-1;;;24247:68:1;;7287:2:2;24247:68:1;;;7269:21:2;7326:2;7306:18;;;7299:30;7365:34;7345:18;;;7338:62;-1:-1:-1;;;7416:18:2;;;7409:32;7458:19;;24247:68:1;7085:398:2;24247:68:1;-1:-1:-1;;;;;24328:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24380:32;;15900:25:2;;;24380:32:1;;15873:18:2;24380:32:1;;;;;;;24040:380;;;:::o;24428:453::-;24563:24;24590:25;24600:5;24607:7;24590:9;:25::i;:::-;24563:52;;-1:-1:-1;;24630:16:1;:37;24626:248;;24712:6;24692:16;:26;;24684:68;;;;-1:-1:-1;;;24684:68:1;;8405:2:2;24684:68:1;;;8387:21:2;8444:2;8424:18;;;8417:30;8483:31;8463:18;;;8456:59;8532:18;;24684:68:1;8203:353:2;24684:68:1;24796:51;24805:5;24812:7;24840:6;24821:16;:25;24796:8;:51::i;:::-;24552:329;24428:453;;;:::o;24889:1636::-;-1:-1:-1;;;;;25011:18:1;;25003:68;;;;-1:-1:-1;;;25003:68:1;;12866:2:2;25003:68:1;;;12848:21:2;12905:2;12885:18;;;12878:30;12944:34;12924:18;;;12917:62;-1:-1:-1;;;12995:18:2;;;12988:35;13040:19;;25003:68:1;12664:401:2;25003:68:1;-1:-1:-1;;;;;25091:20:1;;;;;;:14;:20;;;;;;;;25090:21;25082:45;;;;-1:-1:-1;;;25082:45:1;;14035:2:2;25082:45:1;;;14017:21:2;14074:2;14054:18;;;14047:30;-1:-1:-1;;;14093:18:2;;;14086:41;14144:18;;25082:45:1;13833:335:2;25082:45:1;-1:-1:-1;;;;;25147:18:1;;;;;;:14;:18;;;;;;;;25146:19;25138:43;;;;-1:-1:-1;;;25138:43:1;;14035:2:2;25138:43:1;;;14017:21:2;14074:2;14054:18;;;14047:30;-1:-1:-1;;;14093:18:2;;;14086:41;14144:18;;25138:43:1;13833:335:2;25138:43:1;-1:-1:-1;;;;;25321:24:1;;25194:12;25321:24;;;:18;:24;;;;;;25209:4;;25321:24;;;:50;;-1:-1:-1;;;;;;25349:22:1;;;;;;:18;:22;;;;;;;;25321:50;25318:434;;;-1:-1:-1;25397:5:1;25318:434;;;25455:12;;25445:6;:22;;25437:75;;;;-1:-1:-1;;;25437:75:1;;9944:2:2;25437:75:1;;;9926:21:2;9983:2;9963:18;;;9956:30;10022:34;10002:18;;;9995:62;-1:-1:-1;;;10073:18:2;;;10066:38;10121:19;;25437:75:1;9742:404:2;25437:75:1;25535:14;;-1:-1:-1;;;25535:14:1;;;;25527:49;;;;-1:-1:-1;;;25527:49:1;;10353:2:2;25527:49:1;;;10335:21:2;10392:2;10372:18;;;10365:30;-1:-1:-1;;;10411:18:2;;;10404:52;10473:18;;25527:49:1;10151:346:2;25527:49:1;-1:-1:-1;;;;;25596:24:1;;;;;;:20;:24;;;;;;;;25591:148;;25675:16;;-1:-1:-1;;;;;25649:13:1;;;;;;:9;:13;;;;;;:22;;25665:6;;25649:22;:::i;:::-;:42;;25641:82;;;;-1:-1:-1;;;25641:82:1;;12510:2:2;25641:82:1;;;12492:21:2;12549:2;12529:18;;;12522:30;12588:29;12568:18;;;12561:57;12635:18;;25641:82:1;12308:351:2;25641:82:1;25813:4;25764:28;22191:18;;;:9;:18;;;;;;25885:23;;25861:47;;;;;;;25933:44;;-1:-1:-1;25961:16:1;;-1:-1:-1;;;25961:16:1;;;;25960:17;25933:44;:69;;;;-1:-1:-1;25981:21:1;;-1:-1:-1;;;25981:21:1;;;;25933:69;:94;;;;-1:-1:-1;26014:13:1;;-1:-1:-1;;;;;26006:21:1;;;26014:13;;26006:21;;25933:94;25929:291;;;26048:23;26044:165;;;26115:23;;26092:46;;26157:32;26168:20;26157:10;:32::i;:::-;-1:-1:-1;;;;;26254:24:1;;;26240:11;26254:24;;;:20;:24;;;;;;;26295:26;;;;;;;;26254:24;;;;;26295:26;26294:27;:38;;;;;26326:6;26325:7;26294:38;26291:85;;;26359:5;26349:15;;26291:85;26392:15;;;;26391:16;:27;;;;;26412:6;26411:7;26391:27;26388:74;;;26445:5;26435:15;;26388:74;26472:45;26487:4;26492:2;26495:6;26502:7;26510:6;26472:14;:45::i;:::-;24992:1533;;;;24889:1636;;;:::o;5855:211::-;5999:58;;;-1:-1:-1;;;;;5164:32:2;;5999:58:1;;;5146:51:2;5213:18;;;;5206:34;;;5999:58:1;;;;;;;;;;5119:18:2;;;;5999:58:1;;;;;;;;-1:-1:-1;;;;;5999:58:1;-1:-1:-1;;;5999:58:1;;;5972:86;;5992:5;;5972:19;:86::i;1551:181::-;1609:7;;1641:5;1645:1;1641;:5;:::i;:::-;1629:17;;1670:1;1665;:6;;1657:46;;;;-1:-1:-1;;;1657:46:1;;7690:2:2;1657:46:1;;;7672:21:2;7729:2;7709:18;;;7702:30;7768:29;7748:18;;;7741:57;7815:18;;1657:46:1;7488:351:2;1657:46:1;1723:1;1551:181;-1:-1:-1;;;1551:181:1:o;26533:982::-;21015:16;:23;;-1:-1:-1;;;;21015:23:1;-1:-1:-1;;;21015:23:1;;;26693:9:::1;::::0;26674:13:::1;::::0;21015:23;;26649:61:::1;::::0;26708:1:::1;::::0;26649:54:::1;::::0;;;:20;;:24:::1;:39::i;:::-;:43:::0;::::1;:54::i;:61::-;26623:87:::0;-1:-1:-1;26721:20:1::1;26744:41;:20:::0;26623:87;26744:24:::1;:41::i;:::-;26721:64:::0;-1:-1:-1;26823:21:1::1;26855:30;26721:64:::0;26855:16:::1;:30::i;:::-;26896:26;26925:41;:21;26951:14:::0;26925:25:::1;:41::i;:::-;26896:70;;26977:19;26999:35;27013:20;27031:1;27013:13;;:17;;:20;;;;:::i;:::-;26999:9;::::0;;:13:::1;:35::i;:::-;26977:57:::0;-1:-1:-1;27079:19:1;;27076:167:::1;;27151:92;27164:15;27181:61;27240:1;27181:54;27223:11;27181:37;27204:13;;27181:18;:22;;:37;;;;:::i;:61::-;27151:12;:92::i;:::-;27323:17;::::0;27365::::1;::::0;27302:99:::1;::::0;-1:-1:-1;;;;;27323:17:1::1;::::0;27342:58:::1;::::0;27388:11;;27342:41:::1;::::0;:18;;:22:::1;:41::i;:58::-;27302:20;:99::i;:::-;27433:10;::::0;27468::::1;::::0;27412:85:::1;::::0;-1:-1:-1;;;;;27433:10:1::1;::::0;27445:51:::1;::::0;27484:11;;27445:34:::1;::::0;:18;;:22:::1;:34::i;27412:85::-;-1:-1:-1::0;;21061:16:1;:24;;-1:-1:-1;;;;21061:24:1;;;-1:-1:-1;;;;26533:982:1:o;28732:1123::-;28856:7;28852:40;;28878:14;:12;:14::i;:::-;-1:-1:-1;;;;;28995:17:1;;28973:19;28995:17;;;:9;:17;;;;;;29031:21;;;;29023:72;;;;-1:-1:-1;;;29023:72:1;;9119:2:2;29023:72:1;;;9101:21:2;9158:2;9138:18;;;9131:30;9197:34;9177:18;;;9170:62;-1:-1:-1;;;9248:18:2;;;9241:36;9294:19;;29023:72:1;8917:402:2;29023:72:1;29106:12;29121:33;29139:6;29147;29121:17;:33::i;:::-;29106:48;-1:-1:-1;29165:24:1;29192:13;29106:48;29192:6;:13;:::i;:::-;-1:-1:-1;;;;;29241:17:1;;;;;;;:9;:17;;;;;;29261:20;;;29241:40;;29461:20;;;;;;;;:40;;;;;;29534:4;29516:24;;;:32;;;;;;29165:40;-1:-1:-1;29576:7:1;29572:41;;29598:15;30317:17;;30305:9;:29;30261:81;29598:15;29648:9;-1:-1:-1;;;;;29631:45:1;29640:6;-1:-1:-1;;;;;29631:45:1;;29659:16;29631:45;;;;15900:25:2;;15888:2;15873:18;;15754:177;29631:45:1;;;;;;;;29690:8;;29687:82;;29720:37;;15900:25:2;;;29745:4:1;;-1:-1:-1;;;;;29720:37:1;;;;;15888:2:2;15873:18;29720:37:1;;;;;;;29687:82;28841:1014;;;28732:1123;;;;;:::o;8278:716::-;8702:23;8728:69;8756:4;8728:69;;;;;;;;;;;;;;;;;8736:5;-1:-1:-1;;;;;8728:27:1;;;:69;;;;;:::i;:::-;8812:17;;8702:95;;-1:-1:-1;8812:21:1;8808:179;;8909:10;8898:30;;;;;;;;;;;;:::i;:::-;8890:85;;;;-1:-1:-1;;;8890:85:1;;14735:2:2;8890:85:1;;;14717:21:2;14774:2;14754:18;;;14747:30;14813:34;14793:18;;;14786:62;-1:-1:-1;;;14864:18:2;;;14857:40;14914:19;;8890:85:1;14533:406:2;2084:250:1;2142:7;2166:6;2162:47;;-1:-1:-1;2196:1:1;2189:8;;2162:47;2221:9;2233:5;2237:1;2233;:5;:::i;:::-;2221:17;-1:-1:-1;2266:1:1;2257:5;2261:1;2221:17;2257:5;:::i;:::-;:10;2249:56;;;;-1:-1:-1;;;2249:56:1;;11044:2:2;2249:56:1;;;11026:21:2;11083:2;11063:18;;;11056:30;11122:34;11102:18;;;11095:62;-1:-1:-1;;;11173:18:2;;;11166:31;11214:19;;2249:56:1;10842:397:2;2344:132:1;2402:7;2429:39;2433:1;2436;2429:39;;;;;;;;;;;;;;;;;:3;:39::i;1740:136::-;1798:7;1825:43;1829:1;1832;1825:43;;;;;;;;;;;;;;;;;:3;:43::i;27527:666::-;27677:16;;;27691:1;27677:16;;;;;;;;27653:21;;27677:16;;;;;;;;;;-1:-1:-1;27677:16:1;27653:40;;27722:4;27704;27709:1;27704:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;27704:23:1;;;-1:-1:-1;;;;;27704:23:1;;;;;27748:15;-1:-1:-1;;;;;27748:20:1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27738:4;27743:1;27738:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;27738:32:1;;;-1:-1:-1;;;;;27738:32:1;;;;;27783:62;27800:4;27815:15;27833:11;27783:8;:62::i;:::-;27884:240;;-1:-1:-1;;;27884:240:1;;-1:-1:-1;;;;;27884:15:1;:66;;;;:240;;27965:11;;27991:1;;28035:4;;28062;;28098:15;;27884:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28150:35;28167:11;28180:4;28150:35;;;;;;;:::i;:::-;;;;;;;;27582:611;27527:666;:::o;28205:519::-;28353:62;28370:4;28385:15;28403:11;28353:8;:62::i;:::-;28458:258;;-1:-1:-1;;;28458:258:1;;28530:4;28458:258;;;5592:34:2;;;5642:18;;;5635:34;;;28576:1:1;5685:18:2;;;5678:34;;;5728:18;;;5721:34;5771:19;;;5764:44;28690:15:1;5824:19:2;;;5817:35;28458:15:1;-1:-1:-1;;;;;28458:31:1;;;;28497:9;;5526:19:2;;28458:258:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28205:519;;:::o;33865:126::-;33957:26;;-1:-1:-1;;;;;33957:18:1;;;:26;;;;;33976:6;;33957:26;;;;33976:6;33957:18;:26;;;;;;;;;;;;;;;;;;;30098:151;30144:9;;30141:26;;30098:151::o;30141:26::-;30207:9;;;30187:17;:29;-1:-1:-1;30228:13:1;;30098:151::o;29867:219::-;29947:7;29967:12;29982:33;30009:5;29982:22;29994:9;;29982:7;:11;;:22;;;;:::i;:33::-;29967:48;;30033:7;:45;;30074:4;30033:45;;;30043:28;30068:2;30043:20;30052:10;;30043:4;:8;;:20;;;;:::i;:28::-;30026:52;29867:219;-1:-1:-1;;;;29867:219:1:o;4321:196::-;4424:12;4456:53;4479:6;4487:4;4493:1;4496:12;4456:22;:53::i;2484:278::-;2570:7;2605:12;2598:5;2590:28;;;;-1:-1:-1;;;2590:28:1;;;;;;;;:::i;:::-;-1:-1:-1;2629:9:1;2641:5;2645:1;2641;:5;:::i;:::-;2629:17;2484:278;-1:-1:-1;;;;;2484:278:1:o;1884:192::-;1970:7;2006:12;1998:6;;;;1990:29;;;;-1:-1:-1;;;1990:29:1;;;;;;;;:::i;:::-;-1:-1:-1;2030:9:1;2042:5;2046:1;2042;:5;:::i;5083:706::-;5213:12;5246:18;5257:6;5246:10;:18::i;:::-;5238:60;;;;-1:-1:-1;;;5238:60:1;;13677:2:2;5238:60:1;;;13659:21:2;13716:2;13696:18;;;13689:30;13755:31;13735:18;;;13728:59;13804:18;;5238:60:1;13475:353:2;5238:60:1;5312:12;5326:23;5353:6;-1:-1:-1;;;;;5353:11:1;5373:8;5384:4;5353:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5311:78;;;;5404:7;5400:382;;;5435:10;-1:-1:-1;5428:17:1;;-1:-1:-1;5428:17:1;5400:382;5496:17;;:21;5492:279;;5599:10;5593:17;5660:15;5647:10;5643:2;5639:19;5632:44;5492:279;5742:12;5735:20;;-1:-1:-1;;;5735:20:1;;;;;;;;:::i;3106:619::-;3166:4;3634:20;;3477:66;3674:23;;;;;;:42;;-1:-1:-1;;3701:15:1;;;3666:51;-1:-1:-1;;3106:619:1:o;14:247:2:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:2;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:2;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:2;1346:18;;;;1333:32;;915:456::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:52;;;1518:1;1515;1508:12;1470:52;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:2;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:315::-;1831:6;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;1947:9;1934:23;1966:31;1991:5;1966:31;:::i;:::-;2016:5;2068:2;2053:18;;;;2040:32;;-1:-1:-1;;;1763:315:2:o;2083:241::-;2139:6;2192:2;2180:9;2171:7;2167:23;2163:32;2160:52;;;2208:1;2205;2198:12;2160:52;2247:9;2234:23;2266:28;2288:5;2266:28;:::i;2329:245::-;2396:6;2449:2;2437:9;2428:7;2424:23;2420:32;2417:52;;;2465:1;2462;2455:12;2417:52;2497:9;2491:16;2516:28;2538:5;2516:28;:::i;2579:180::-;2638:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:52;;;2707:1;2704;2697:12;2659:52;-1:-1:-1;2730:23:2;;2579:180;-1:-1:-1;2579:180:2:o;2764:184::-;2834:6;2887:2;2875:9;2866:7;2862:23;2858:32;2855:52;;;2903:1;2900;2893:12;2855:52;-1:-1:-1;2926:16:2;;2764:184;-1:-1:-1;2764:184:2:o;2953:316::-;3030:6;3038;3046;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;-1:-1:-1;;3138:23:2;;;3208:2;3193:18;;3180:32;;-1:-1:-1;3259:2:2;3244:18;;;3231:32;;2953:316;-1:-1:-1;2953:316:2:o;3274:306::-;3362:6;3370;3378;3431:2;3419:9;3410:7;3406:23;3402:32;3399:52;;;3447:1;3444;3437:12;3399:52;3476:9;3470:16;3460:26;;3526:2;3515:9;3511:18;3505:25;3495:35;;3570:2;3559:9;3555:18;3549:25;3539:35;;3274:306;;;;;:::o;3585:461::-;3638:3;3676:5;3670:12;3703:6;3698:3;3691:19;3729:4;3758:2;3753:3;3749:12;3742:19;;3795:2;3788:5;3784:14;3816:1;3826:195;3840:6;3837:1;3834:13;3826:195;;;3905:13;;-1:-1:-1;;;;;3901:39:2;3889:52;;3961:12;;;;3996:15;;;;3937:1;3855:9;3826:195;;;-1:-1:-1;4037:3:2;;3585:461;-1:-1:-1;;;;;3585:461:2:o;4051:274::-;4180:3;4218:6;4212:13;4234:53;4280:6;4275:3;4268:4;4260:6;4256:17;4234:53;:::i;:::-;4303:16;;;;;4051:274;-1:-1:-1;;4051:274:2:o;6290:383::-;6439:2;6428:9;6421:21;6402:4;6471:6;6465:13;6514:6;6509:2;6498:9;6494:18;6487:34;6530:66;6589:6;6584:2;6573:9;6569:18;6564:2;6556:6;6552:15;6530:66;:::i;:::-;6657:2;6636:15;-1:-1:-1;;6632:29:2;6617:45;;;;6664:2;6613:54;;6290:383;-1:-1:-1;;6290:383:2:o;10502:335::-;10704:2;10686:21;;;10743:2;10723:18;;;10716:30;-1:-1:-1;;;10777:2:2;10762:18;;10755:41;10828:2;10813:18;;10502:335::o;11244:356::-;11446:2;11428:21;;;11465:18;;;11458:30;11524:34;11519:2;11504:18;;11497:62;11591:2;11576:18;;11244:356::o;15936:332::-;16143:6;16132:9;16125:25;16186:2;16181;16170:9;16166:18;16159:30;16106:4;16206:56;16258:2;16247:9;16243:18;16235:6;16206:56;:::i;16273:582::-;16572:6;16561:9;16554:25;16615:6;16610:2;16599:9;16595:18;16588:34;16658:3;16653:2;16642:9;16638:18;16631:31;16535:4;16679:57;16731:3;16720:9;16716:19;16708:6;16679:57;:::i;:::-;-1:-1:-1;;;;;16772:32:2;;;;16767:2;16752:18;;16745:60;-1:-1:-1;16836:3:2;16821:19;16814:35;16671:65;16273:582;-1:-1:-1;;;16273:582:2:o;17626:128::-;17666:3;17697:1;17693:6;17690:1;17687:13;17684:39;;;17703:18;;:::i;:::-;-1:-1:-1;17739:9:2;;17626:128::o;17759:217::-;17799:1;17825;17815:132;;17869:10;17864:3;17860:20;17857:1;17850:31;17904:4;17901:1;17894:15;17932:4;17929:1;17922:15;17815:132;-1:-1:-1;17961:9:2;;17759:217::o;17981:168::-;18021:7;18087:1;18083;18079:6;18075:14;18072:1;18069:21;18064:1;18057:9;18050:17;18046:45;18043:71;;;18094:18;;:::i;:::-;-1:-1:-1;18134:9:2;;17981:168::o;18154:125::-;18194:4;18222:1;18219;18216:8;18213:34;;;18227:18;;:::i;:::-;-1:-1:-1;18264:9:2;;18154:125::o;18284:258::-;18356:1;18366:113;18380:6;18377:1;18374:13;18366:113;;;18456:11;;;18450:18;18437:11;;;18430:39;18402:2;18395:10;18366:113;;;18497:6;18494:1;18491:13;18488:48;;;-1:-1:-1;;18532:1:2;18514:16;;18507:27;18284:258::o;18547:380::-;18626:1;18622:12;;;;18669;;;18690:61;;18744:4;18736:6;18732:17;18722:27;;18690:61;18797:2;18789:6;18786:14;18766:18;18763:38;18760:161;;;18843:10;18838:3;18834:20;18831:1;18824:31;18878:4;18875:1;18868:15;18906:4;18903:1;18896:15;18760:161;;18547:380;;;:::o;18932:127::-;18993:10;18988:3;18984:20;18981:1;18974:31;19024:4;19021:1;19014:15;19048:4;19045:1;19038:15;19064:127;19125:10;19120:3;19116:20;19113:1;19106:31;19156:4;19153:1;19146:15;19180:4;19177:1;19170:15;19328:131;-1:-1:-1;;;;;19403:31:2;;19393:42;;19383:70;;19449:1;19446;19439:12;19383:70;19328:131;:::o;19464:118::-;19550:5;19543:13;19536:21;19529:5;19526:32;19516:60;;19572:1;19569;19562:12

Swarm Source

ipfs://8c465f08d076247c19412695d9f2d30c0a6d261e001daa4a79a98200e6193254
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.