ETH Price: $3,031.22 (-2.94%)
 

Overview

Max Total Supply

9,999,999,999 Share

Holders

9,608 (0.00%)

Transfers

-
130 ( 4.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Based Sharon is a Memecoin with a Charity Twist. She is Brett's Girlfriend on the Base Chain and intends to promote spreading kindness. We are partnered with Steven Schapiro, a major TikTok influencer who gives out our charity wallet on his socuials promoting transparency

Contract Source Code Verified (Exact Match)

Contract Name:
BasedSharon

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-07-12
*/

// SPDX-License-Identifier: MIT


pragma solidity 0.8.11;

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

abstract contract Ownable is Context {
    address private _owner;

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

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

library 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 returns(bool){
        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 }("");
        return success;
    }

    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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

////BasedSharon.sol

contract BasedSharon is Context, IERC20, Ownable {
    using Address for address;
    using Address for address payable;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    string private _name     = "Based Sharon";
    string private _symbol   = "Share";
    uint8  private _decimals = 9;
   
    uint256 private constant MAX = type(uint256).max;
    uint256 private _tTotal = 9999999999 * (10 ** _decimals);  ///10 billion supply
    uint256 private _tTotalSupply = 9999999999 * (10 ** _decimals);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

     
      mapping(address => bool) public bots;



    uint256 public taxFeeonBuy;
    uint256 public taxFeeonSell;

    uint256 public liquidityFeeonBuy;
    uint256 public liquidityFeeonSell;

    uint256 public marketingFeeonBuy;
    uint256 public marketingFeeonSell;


    uint256 private _taxFee;
    uint256 private _liquidityFee;
    uint256 private _marketingFee;

    uint256 private totalBuyFees;
    uint256 private totalSellFees;

    address public marketingWallet;
    address public teamwallet;

    bool public walletToWalletTransferWithoutFee;
    
    address private DEAD = 0x000000000000000000000000000000000000dEaD;

    IUniswapV2Router02 public  uniswapV2Router;
    address public  uniswapV2Pair;

    bool private inSwapAndLiquify;
    bool public swapEnabled;
    uint256 public swapTokensAtAmount;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event MarketingWalletChanged(address marketingWallet);
    event SwapEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiqudity);
    event SwapAndSendMarketing(uint256 tokensSwapped, uint256 bnbSend);
    event SwapTokensAtAmountUpdated(uint256 amount);
    event BuyFeesChanged(uint256 taxFee, uint256 liquidityFee, uint256 marketingFee);
    event SellFeesChanged(uint256 taxFee, uint256 liquidityFee, uint256 marketingFee);
    event WalletToWalletTransferWithoutFeeEnabled(bool enabled);
    
    constructor() 
    {        
        address router = 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24;


        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;

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

        taxFeeonBuy = 1; ///1%
        taxFeeonSell = 1; ///1%

        liquidityFeeonBuy = 0;
        liquidityFeeonSell = 0;

        marketingFeeonBuy = 1;  ///1%
        marketingFeeonSell = 2;  ///2%

       

        totalBuyFees = taxFeeonBuy + liquidityFeeonBuy + marketingFeeonBuy ;
        totalSellFees = taxFeeonSell + liquidityFeeonSell + marketingFeeonSell ;

        marketingWallet = 0x1189AeA60b9bd004876718C60C42466F27318071;
        teamwallet = 0xa8B90DE3560C7C0E34e4Adb9F25738b83625A17d;
        
        swapEnabled = true;
        swapTokensAtAmount = _tTotal / 5000;
 
        walletToWalletTransferWithoutFee = true;
        
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(0xdead)] = true;
        _isExcludedFromFees[address(this)] = true;

        _isExcluded[address(this)] = true;
      
        _isExcluded[address(0xdead)] = true;
        _isExcluded[address(uniswapV2Pair)] = true;

        _rOwned[owner()] = _rTotal;
        _tOwned[owner()] = _tTotal;

        emit Transfer(address(0), owner(), _tTotal);
    }

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalReflectionDistributed() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rTotal = _rTotal - rAmount;
        _tFeeTotal = _tFeeTotal + tAmount;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

    function excludeFromReward(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    receive() external payable {}

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim native tokens");
        if (token == address(0x0)) {
            payable(msg.sender).sendValue(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tMarketing, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tMarketing);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTransferAmount = tAmount - tFee - tLiquidity - tMarketing;
        return (tTransferAmount, tFee, tLiquidity, tMarketing);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rLiquidity = tLiquidity * currentRate;
        uint256 rMarketing = tMarketing * currentRate;
        uint256 rTransferAmount = rAmount - rFee - rLiquidity - rMarketing;
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 liquidityAmount;


        if (liquidityFeeonBuy + liquidityFeeonSell  > 0){
            liquidityAmount = tLiquidity * (liquidityFeeonBuy + liquidityFeeonSell) / (liquidityFeeonBuy + liquidityFeeonSell );
          
        }

        if(liquidityAmount > 0){
            uint256 currentRate =  _getRate();
            uint256 rLiquidity = liquidityAmount * currentRate;
            _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
            if(_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)] + liquidityAmount;
        }
    }

    function _takeMarketing(uint256 tMarketing) private {
        if (tMarketing > 0) {
            uint256 currentRate =  _getRate();
            uint256 rMarketing = tMarketing * currentRate;
            _rOwned[address(this)] = _rOwned[address(this)] + rMarketing;
            if(_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)] + tMarketing;
        }
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount * _taxFee / 100;
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount * _liquidityFee / 100;
    }
    
    function calculateMarketingFee(uint256 _amount) private view returns (uint256) {
        return _amount * _marketingFee / 100;
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0 && _marketingFee == 0) return;
        
        _taxFee = 0;
        _marketingFee = 0;
        _liquidityFee = 0;
    }
    
    function setBuyFee() private{
        if(_taxFee == taxFeeonBuy && _liquidityFee == (liquidityFeeonBuy ) && _marketingFee == marketingFeeonBuy ) return;

        _taxFee = taxFeeonBuy;
        _marketingFee = marketingFeeonBuy;
        _liquidityFee = liquidityFeeonBuy ;
    }

    function setSellFee() private{
        if(_taxFee == taxFeeonSell && _liquidityFee == (liquidityFeeonSell ) && _marketingFee == marketingFeeonSell ) return;

        _taxFee = taxFeeonSell;
        _marketingFee = marketingFeeonSell;
        _liquidityFee = liquidityFeeonSell ;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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 _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

     

        
        if (from != owner() && to != owner()){
             require(!bots[from] && !bots[to], "Your account is blacklisted!");
        

        }

        uint256 contractTokenBalance = balanceOf(address(this));        
        bool overMinTokenBalance = contractTokenBalance >= swapTokensAtAmount;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            to == uniswapV2Pair &&
            swapEnabled
        ) {
            inSwapAndLiquify = true;
            
            uint256 marketingShare = marketingFeeonBuy + marketingFeeonSell;
            uint256 liquidityShare = liquidityFeeonBuy + liquidityFeeonSell;

            uint256 totalShare = marketingShare + liquidityShare;

            if(totalShare > 0) {
                if(liquidityShare > 0) {
                    uint256 liquidityTokens = (contractTokenBalance * liquidityShare) / totalShare;
                    swapAndLiquify(liquidityTokens);
                }
                
                if(marketingShare > 0) {
                    uint256 marketingTokens = (contractTokenBalance * marketingShare) / totalShare;
                    swapAndSendMarketing(marketingTokens);
                } 
            }

            inSwapAndLiquify = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount);

    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp);
        
        uint256 newBalance = address(this).balance - initialBalance;

        uniswapV2Router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        );

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapAndSendMarketing(uint256 tokenAmount) private {
        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp);

        uint256 newBalance = address(this).balance - initialBalance;

        payable(marketingWallet).sendValue(newBalance * 50/100);
        
        payable(teamwallet).sendValue(newBalance * 50/100);

        emit SwapAndSendMarketing(tokenAmount, newBalance);
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner() {
        require(newAmount > totalSupply() / 1e5, "SwapTokensAtAmount must be greater than 0.001% of total supply");
        swapTokensAtAmount = newAmount;
        emit SwapTokensAtAmountUpdated(newAmount);
    }
    
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabledUpdated(_enabled);
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount) private {
         if (_isExcludedFromFees[sender] || 
            _isExcludedFromFees[recipient] 
            ) {
            removeAllFee();
        }else if(recipient == uniswapV2Pair){
            setSellFee();
        }else if(sender == uniswapV2Pair){
            setBuyFee();
        }else if(walletToWalletTransferWithoutFee){
            removeAllFee();
        }else{
            setSellFee();
        }

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
        _takeMarketing(tMarketing);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
        _takeMarketing(tMarketing);           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender] - tAmount;
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount; 
        _takeMarketing(tMarketing);  
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender] - tAmount;
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
        _takeMarketing(tMarketing);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }
    
    function changeMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != marketingWallet, "Marketing wallet is already that address");
        require(_marketingWallet!=address(0), "Marketing wallet is the zero address");
        marketingWallet = _marketingWallet;
        emit MarketingWalletChanged(marketingWallet);
    }

    function setBuyFeePercentages(uint256 _taxFeeonBuy, uint256 _liquidityFeeonBuy, uint256 _marketingFeeonBuy) external onlyOwner {
        taxFeeonBuy = _taxFeeonBuy;
        liquidityFeeonBuy = _liquidityFeeonBuy;
        marketingFeeonBuy = _marketingFeeonBuy;
       

        totalBuyFees = taxFeeonBuy + liquidityFeeonBuy + marketingFeeonBuy;

        require(totalBuyFees <= 10, "Buy fees cannot be greater than 10%");

        emit BuyFeesChanged(taxFeeonBuy, liquidityFeeonBuy, marketingFeeonBuy);
    }

    function setSellFeePercentages(uint256 _taxFeeonSell, uint256 _liquidityFeeonSell, uint256 _marketingFeeonSell) external onlyOwner {
        taxFeeonSell = _taxFeeonSell;
        liquidityFeeonSell = _liquidityFeeonSell;
        marketingFeeonSell = _marketingFeeonSell;
   

        totalSellFees = taxFeeonSell + liquidityFeeonSell + marketingFeeonSell ;

        require(totalSellFees <= 10, "Sell fees cannot be greater than 10%");

        emit SellFeesChanged(taxFeeonSell, liquidityFeeonSell, marketingFeeonSell);
    }

    function enableWalletToWalletTransferWithoutFee(bool enable) external onlyOwner {
        require(walletToWalletTransferWithoutFee != enable, "Wallet to wallet transfer without fee is already set to that value");
        walletToWalletTransferWithoutFee = enable;
        emit WalletToWalletTransferWithoutFeeEnabled(enable);
    }


  
      function blackListAddress(address[] memory bots_) public onlyOwner {
        for (uint256 i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }
     function unblockBlackList(address notbot) public onlyOwner {
        bots[notbot] = false;
    }
   function withdrawETH(uint256 _amount) external onlyOwner {
        require(address(this).balance >= _amount, "Invalid Amount");
        payable(msg.sender).transfer(_amount);
    }

    function withdrawToken(IERC20 _token, uint256 _amount) external onlyOwner {
        require(_token.balanceOf(address(this)) >= _amount, "Invalid Amount");
        _token.transfer(msg.sender, _amount);
    }
  
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint256","name":"taxFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"BuyFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","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":"taxFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"SellFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbSend","type":"uint256"}],"name":"SwapAndSendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"WalletToWalletTransferWithoutFeeEnabled","type":"event"},{"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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"blackListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","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":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableWalletToWalletTransferWithoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeonBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeonSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeonBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeonSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxFeeonBuy","type":"uint256"},{"internalType":"uint256","name":"_liquidityFeeonBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeonBuy","type":"uint256"}],"name":"setBuyFeePercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxFeeonSell","type":"uint256"},{"internalType":"uint256","name":"_liquidityFeeonSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeonSell","type":"uint256"}],"name":"setSellFeePercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFeeonBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFeeonSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamwallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflectionDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[{"internalType":"address","name":"notbot","type":"address"}],"name":"unblockBlackList","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":"walletToWalletTransferWithoutFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600c60808190526b2130b9b2b21029b430b937b760a11b60a09081526200002f9160079190620006ae565b5060408051808201909152600580825264536861726560d81b60209092019182526200005e91600891620006ae565b506009805460ff1916811781556200007890600a62000869565b62000089906402540be3ff62000881565b600a908155600954620000a29160ff9091169062000869565b620000b3906402540be3ff62000881565b600b55600a54620000c790600019620008b9565b620000d590600019620008d0565b600c55601c80546001600160a01b03191661dead179055348015620000f957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000734752ba5dbc23f44d87826276bf6fd6b1c372ad2490506000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000198573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001be9190620008ea565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002329190620008ea565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000280573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a69190620008ea565b601e80546001600160a01b039283166001600160a01b031991821617909155601d80549284169290911682179055620002e490309060001962000573565b6001600f81905560108190556000601181905560128190556013829055600260145562000312908262000915565b6200031e919062000915565b60185560145460125460105462000336919062000915565b62000342919062000915565b601955601a80546001600160a01b0319908116731189aea60b9bd004876718c60c42466f2731807117909155601b805490911673a8b90de3560c7c0e34e4adb9f25738b83625a17d179055601e805460ff60a81b1916600160a81b179055600a54620003b2906113889062000930565b601f55601b805460ff60a01b1916600160a01b179055600160046000620003e16000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600484527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd8054861660019081179091553082528382208054871682179055600590945282812080548616851790557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba8054861685179055601e54909116815290812080549093168217909255600c5491620004b36000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600a5460026000620004ee6200069f60201b60201c565b6001600160a01b031681526020810191909152604001600020556200051b6000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040516200056391815260200190565b60405180910390a3505062000984565b6001600160a01b038316620005db5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200063e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620005d2565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031690565b828054620006bc9062000947565b90600052602060002090601f016020900481019282620006e057600085556200072b565b82601f10620006fb57805160ff19168380011785556200072b565b828001600101855582156200072b579182015b828111156200072b5782518255916020019190600101906200070e565b50620007399291506200073d565b5090565b5b808211156200073957600081556001016200073e565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007ab5781600019048211156200078f576200078f62000754565b808516156200079d57918102915b93841c93908002906200076f565b509250929050565b600082620007c45750600162000863565b81620007d35750600062000863565b8160018114620007ec5760028114620007f75762000817565b600191505062000863565b60ff8411156200080b576200080b62000754565b50506001821b62000863565b5060208310610133831016604e8410600b84101617156200083c575081810a62000863565b6200084883836200076a565b80600019048211156200085f576200085f62000754565b0290505b92915050565b60006200087a60ff841683620007b3565b9392505050565b60008160001904831182151516156200089e576200089e62000754565b500290565b634e487b7160e01b600052601260045260246000fd5b600082620008cb57620008cb620008a3565b500690565b600082821015620008e557620008e562000754565b500390565b600060208284031215620008fd57600080fd5b81516001600160a01b03811681146200087a57600080fd5b600082198211156200092b576200092b62000754565b500190565b600082620009425762000942620008a3565b500490565b600181811c908216806200095c57607f821691505b602082108114156200097e57634e487b7160e01b600052602260045260246000fd5b50919050565b61344e80620009946000396000f3fe6080604052600436106102975760003560e01c806370a082311161015a578063afa4f3b2116100c1578063dd62ed3e1161007a578063dd62ed3e14610802578063e01af92c14610848578063e2f4560514610868578063f14210a61461087e578063f2fde38b1461089e578063f9d0831a146108be57600080fd5b8063afa4f3b21461073d578063b577554a1461075d578063bb85c6d114610772578063bfd7928414610792578063c0246668146107c2578063d6a694f5146107e257600080fd5b806390a3dd9b1161011357806390a3dd9b1461069257806393a7781f146106b257806395d89b41146106c85780639e281a98146106dd578063a457c2d7146106fd578063a9059cbb1461071d57600080fd5b806370a08231146105c6578063715018a6146105e657806375f0a874146105fb578063788753f81461061b57806388f820201461063b5780638da5cb5b1461067457600080fd5b80634549b039116101fe578063583a71b6116101b7578063583a71b6146105235780635a04e035146105435780635f35bc5c1461055957806365a8ee4f1461056f5780636a01e33b146105855780636ddd1713146105a557600080fd5b80634549b0391461045457806349bd5a5e146104745780634b93d0591461049457806352390c02146104aa5780635342acb4146104ca5780635654d0b31461050357600080fd5b806323b872dd1161025057806323b872dd146103905780632d838119146103b0578063313ce567146103d05780633685d419146103f257806339509351146104145780633bd5d1731461043457600080fd5b806306fdde03146102a3578063095ea7b3146102ce578063142725fc146102fe5780631529fbbf146103225780631694505e1461034357806318160ddd1461037b57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108de565b6040516102c59190612f0e565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612f88565b610970565b60405190151581526020016102c5565b34801561030a57600080fd5b5061031460125481565b6040519081526020016102c5565b34801561032e57600080fd5b50601b546102ee90600160a01b900460ff1681565b34801561034f57600080fd5b50601d54610363906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561038757600080fd5b50600b54610314565b34801561039c57600080fd5b506102ee6103ab366004612fb4565b610987565b3480156103bc57600080fd5b506103146103cb366004612ff5565b6109d9565b3480156103dc57600080fd5b5060095460405160ff90911681526020016102c5565b3480156103fe57600080fd5b5061041261040d36600461300e565b610a62565b005b34801561042057600080fd5b506102ee61042f366004612f88565b610c19565b34801561044057600080fd5b5061041261044f366004612ff5565b610c50565b34801561046057600080fd5b5061031461046f366004613039565b610d3e565b34801561048057600080fd5b50601e54610363906001600160a01b031681565b3480156104a057600080fd5b5061031460115481565b3480156104b657600080fd5b506104126104c536600461300e565b610dcd565b3480156104d657600080fd5b506102ee6104e536600461300e565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561050f57600080fd5b5061041261051e366004613069565b610f20565b34801561052f57600080fd5b5061041261053e36600461309c565b611034565b34801561054f57600080fd5b5061031460135481565b34801561056557600080fd5b5061031460105481565b34801561057b57600080fd5b5061031460145481565b34801561059157600080fd5b506104126105a036600461300e565b6110c6565b3480156105b157600080fd5b50601e546102ee90600160a81b900460ff1681565b3480156105d257600080fd5b506103146105e136600461300e565b611111565b3480156105f257600080fd5b50610412611170565b34801561060757600080fd5b50601a54610363906001600160a01b031681565b34801561062757600080fd5b50601b54610363906001600160a01b031681565b34801561064757600080fd5b506102ee61065636600461300e565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561068057600080fd5b506000546001600160a01b0316610363565b34801561069e57600080fd5b506104126106ad366004613161565b6111e4565b3480156106be57600080fd5b50610314600f5481565b3480156106d457600080fd5b506102b86112e2565b3480156106e957600080fd5b506104126106f8366004612f88565b6112f1565b34801561070957600080fd5b506102ee610718366004612f88565b61143a565b34801561072957600080fd5b506102ee610738366004612f88565b611471565b34801561074957600080fd5b50610412610758366004612ff5565b61147e565b34801561076957600080fd5b50600d54610314565b34801561077e57600080fd5b5061041261078d36600461300e565b611568565b34801561079e57600080fd5b506102ee6107ad36600461300e565b600e6020526000908152604090205460ff1681565b3480156107ce57600080fd5b506104126107dd36600461318d565b6116b1565b3480156107ee57600080fd5b506104126107fd366004613161565b6117bc565b34801561080e57600080fd5b5061031461081d3660046131bb565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561085457600080fd5b50610412610863366004613069565b6118b1565b34801561087457600080fd5b50610314601f5481565b34801561088a57600080fd5b50610412610899366004612ff5565b611928565b3480156108aa57600080fd5b506104126108b936600461300e565b6119c0565b3480156108ca57600080fd5b506104126108d936600461300e565b611aaa565b6060600780546108ed906131e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610919906131e9565b80156109665780601f1061093b57610100808354040283529160200191610966565b820191906000526020600020905b81548152906001019060200180831161094957829003601f168201915b5050505050905090565b600061097d338484611c2d565b5060015b92915050565b6000610994848484611d51565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546109cf9186916109ca90869061323a565b611c2d565b5060019392505050565b6000600c54821115610a455760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a4f611ffb565b9050610a5b8184613251565b9392505050565b6000546001600160a01b03163314610a8c5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03811660009081526005602052604090205460ff16610af45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a3c565b60005b600654811015610c1557816001600160a01b031660068281548110610b1e57610b1e6132a8565b6000918252602090912001546001600160a01b03161415610c035760068054610b499060019061323a565b81548110610b5957610b596132a8565b600091825260209091200154600680546001600160a01b039092169183908110610b8557610b856132a8565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610bdd57610bdd6132be565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610c0d816132d4565b915050610af7565b5050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161097d9185906109ca9086906132ef565b3360008181526005602052604090205460ff1615610cc55760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a3c565b6000610cd08361201e565b505050506001600160a01b038516600090815260016020526040902054929350610cfe92849250905061323a565b6001600160a01b038316600090815260016020526040902055600c54610d2590829061323a565b600c55600d54610d369084906132ef565b600d55505050565b6000600a54831115610d925760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a3c565b81610db2576000610da28461201e565b5094965061098195505050505050565b6000610dbd8461201e565b5093965061098195505050505050565b6000546001600160a01b03163314610df75760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03811660009081526005602052604090205460ff1615610e605760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a3c565b6001600160a01b03811660009081526001602052604090205415610eba576001600160a01b038116600090815260016020526040902054610ea0906109d9565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b6000546001600160a01b03163314610f4a5760405162461bcd60e51b8152600401610a3c90613273565b601b5460ff600160a01b9091041615158115151415610fdc5760405162461bcd60e51b815260206004820152604260248201527f57616c6c657420746f2077616c6c6574207472616e7366657220776974686f7560448201527f742066656520697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610a3c565b601b8054821515600160a01b0260ff60a01b199091161790556040517f77c1f4015c54df9478a364bf8fc1b76b03f0eda36c594de58b4023771cebb9e79061102990831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461105e5760405162461bcd60e51b8152600401610a3c90613273565b60005b8151811015610c15576001600e6000848481518110611082576110826132a8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806110be816132d4565b915050611061565b6000546001600160a01b031633146110f05760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6001600160a01b03811660009081526005602052604081205460ff161561114e57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610981906109d9565b6000546001600160a01b0316331461119a5760405162461bcd60e51b8152600401610a3c90613273565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610a3c90613273565b600f839055601182905560138190558061122883856132ef565b61123291906132ef565b6018819055600a10156112935760405162461bcd60e51b815260206004820152602360248201527f42757920666565732063616e6e6f742062652067726561746572207468616e2060448201526231302560e81b6064820152608401610a3c565b600f54601154601354604080519384526020840192909252908201527ff12a090a464a491e1614a62b7d86a6f8d3fae25361d5af0911f39bd4fd7ea64d906060015b60405180910390a1505050565b6060600880546108ed906131e9565b6000546001600160a01b0316331461131b5760405162461bcd60e51b8152600401610a3c90613273565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113859190613307565b10156113c45760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610a3c565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114359190613320565b505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161097d9185906109ca90869061323a565b600061097d338484611d51565b6000546001600160a01b031633146114a85760405162461bcd60e51b8152600401610a3c90613273565b620186a06114b5600b5490565b6114bf9190613251565b81116115335760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610a3c565b601f8190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001611029565b6000546001600160a01b031633146115925760405162461bcd60e51b8152600401610a3c90613273565b601a546001600160a01b03828116911614156116015760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610a3c565b6001600160a01b0381166116635760405162461bcd60e51b8152602060048201526024808201527f4d61726b6574696e672077616c6c657420697320746865207a65726f206164646044820152637265737360e01b6064820152608401610a3c565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001611029565b6000546001600160a01b031633146116db5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03821660009081526004602052604090205460ff161515811515141561175d5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610a3c565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146117e65760405162461bcd60e51b8152600401610a3c90613273565b6010839055601282905560148190558061180083856132ef565b61180a91906132ef565b6019819055600a101561186b5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20666565732063616e6e6f742062652067726561746572207468616e6044820152632031302560e01b6064820152608401610a3c565b601054601254601454604080519384526020840192909252908201527f969e8ecd326f5fe41e2a3cd9798553fbecef5705da23954426a09c9360c7aa57906060016112d5565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610a3c90613273565b601e8054821515600160a81b0260ff60a81b199091161790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129061102990831515815260200190565b6000546001600160a01b031633146119525760405162461bcd60e51b8152600401610a3c90613273565b804710156119935760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610a3c565b604051339082156108fc029083906000818181858888f19350505050158015610c15573d6000803e3d6000fd5b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b038116611a4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ad45760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b038116301415611b2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610a3c565b6001600160a01b038116611b4557610c153347612079565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb29190613307565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190613320565b5050505b50565b6001600160a01b038316611c8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3c565b6001600160a01b038216611cf05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3c565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611db55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3c565b60008111611e175760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a3c565b6000546001600160a01b03848116911614801590611e4357506000546001600160a01b03838116911614155b15611ed6576001600160a01b0383166000908152600e602052604090205460ff16158015611e8a57506001600160a01b0382166000908152600e602052604090205460ff16155b611ed65760405162461bcd60e51b815260206004820152601c60248201527f596f7572206163636f756e7420697320626c61636b6c697374656421000000006044820152606401610a3c565b6000611ee130611111565b601f5490915081108015908190611f025750601e54600160a01b900460ff16155b8015611f1b5750601e546001600160a01b038581169116145b8015611f305750601e54600160a81b900460ff165b15611fe957601e805460ff60a01b1916600160a01b179055601454601354600091611f5a916132ef565b90506000601254601154611f6e91906132ef565b90506000611f7c82846132ef565b90508015611fd8578115611fae57600081611f97848861333d565b611fa19190613251565b9050611fac81612128565b505b8215611fd857600081611fc1858861333d565b611fcb9190613251565b9050611fd681612376565b505b5050601e805460ff60a01b19169055505b611ff4858585612560565b5050505050565b600080600061200861275e565b90925090506120178183613251565b9250505090565b60008060008060008060008060008060006120388c6128e1565b935093509350935060008060006120598f878787612054611ffb565b612940565b919f509d509b509599509397509195509350505050919395979092949650565b6000814710156120cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a3c565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612118576040519150601f19603f3d011682016040523d82523d6000602084013e61211d565b606091505b509095945050505050565b6000612135600283613251565b90506000612143828461323a565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061217d5761217d6132a8565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156121d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fa919061335c565b8160018151811061220d5761220d6132a8565b6001600160a01b039283166020918202929092010152601d5460405163791ac94760e01b815291169063791ac94790612253908790600090869030904290600401613379565b600060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b5050505060008247612293919061323a565b601d54601c5460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c40160606040518083038185885af1158015612305573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061232a91906133ea565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b6040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106123af576123af6132a8565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242c919061335c565b8160018151811061243f5761243f6132a8565b6001600160a01b039283166020918202929092010152601d5460405163791ac94760e01b815291169063791ac94790612485908690600090869030904290600401613379565b600060405180830381600087803b15801561249f57600080fd5b505af11580156124b3573d6000803e3d6000fd5b50505050600082476124c5919061323a565b90506124f360646124d783603261333d565b6124e19190613251565b601a546001600160a01b031690612079565b50612520606461250483603261333d565b61250e9190613251565b601b546001600160a01b031690612079565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b6001600160a01b03831660009081526004602052604090205460ff168061259f57506001600160a01b03821660009081526004602052604090205460ff165b156125b1576125ac6129b2565b61260f565b601e546001600160a01b03838116911614156125cf576125ac6129e6565b601e546001600160a01b03848116911614156125ed576125ac612a26565b601b54600160a01b900460ff1615612607576125ac6129b2565b61260f6129e6565b6001600160a01b03831660009081526005602052604090205460ff16801561265057506001600160a01b03821660009081526005602052604090205460ff16155b1561266057611435838383612a66565b6001600160a01b03831660009081526005602052604090205460ff161580156126a157506001600160a01b03821660009081526005602052604090205460ff165b156126b157611435838383612ba7565b6001600160a01b03831660009081526005602052604090205460ff161580156126f357506001600160a01b03821660009081526005602052604090205460ff16155b1561270357611435838383612c61565b6001600160a01b03831660009081526005602052604090205460ff16801561274357506001600160a01b03821660009081526005602052604090205460ff165b1561275357611435838383612cb4565b611435838383612c61565b600c54600a546000918291825b6006548110156128b05782600160006006848154811061278d5761278d6132a8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127f857508160026000600684815481106127d1576127d16132a8565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561280e57600c54600a54945094505050509091565b6001600060068381548110612825576128256132a8565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612854908461323a565b9250600260006006838154811061286d5761286d6132a8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461289c908361323a565b9150806128a8816132d4565b91505061276b565b50600a54600c546128c19190613251565b8210156128d857600c54600a549350935050509091565b90939092509050565b60008060008060006128f286612d37565b905060006128ff87612d53565b9050600061290c88612d65565b90506000818361291c868c61323a565b612926919061323a565b612930919061323a565b9993985091965094509092505050565b600080808061294f858a61333d565b9050600061295d868a61333d565b9050600061296b878a61333d565b90506000612979888a61333d565b905060008183612989868861323a565b612993919061323a565b61299d919061323a565b949d949c50929a509298505050505050505050565b6015541580156129c25750601654155b80156129ce5750601754155b156129d557565b600060158190556017819055601655565b6010546015541480156129fc5750601254601654145b8015612a0b5750601454601754145b15612a1257565b601054601555601454601755601254601655565b600f54601554148015612a3c5750601154601654145b8015612a4b5750601354601754145b15612a5257565b600f54601555601354601755601154601655565b6000806000806000806000612a7a8861201e565b965096509650965096509650965087600260008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612ab9919061323a565b6001600160a01b038b16600090815260026020908152604080832093909355600190522054612ae990889061323a565b6001600160a01b03808c1660009081526001602052604080822093909355908b1681522054612b199087906132ef565b6001600160a01b038a16600090815260016020526040902055612b3b81612d77565b612b4482612e07565b612b4e8584612ee8565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b9391815260200190565b60405180910390a350505050505050505050565b6000806000806000806000612bbb8861201e565b965096509650965096509650965086600160008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612bfa919061323a565b6001600160a01b03808c16600090815260016020908152604080832094909455918c16815260029091522054612c319085906132ef565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612b199087906132ef565b6000806000806000806000612c758861201e565b965096509650965096509650965086600160008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612ae9919061323a565b6000806000806000806000612cc88861201e565b965096509650965096509650965087600260008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612d07919061323a565b6001600160a01b038b16600090815260026020908152604080832093909355600190522054612bfa90889061323a565b6000606460155483612d49919061333d565b6109819190613251565b6000606460165483612d49919061333d565b6000606460175483612d49919061333d565b8015611c2a576000612d87611ffb565b90506000612d95828461333d565b30600090815260016020526040902054909150612db39082906132ef565b3060009081526001602090815260408083209390935560059052205460ff16156114355730600090815260026020526040902054612df29084906132ef565b30600090815260026020526040902055505050565b600080601254601154612e1a91906132ef565b1115612e5757601254601154612e3091906132ef565b601254601154612e4091906132ef565b612e4a908461333d565b612e549190613251565b90505b8015610c15576000612e67611ffb565b90506000612e75828461333d565b30600090815260016020526040902054909150612e939082906132ef565b3060009081526001602090815260408083209390935560059052205460ff1615611c265730600090815260026020526040902054612ed29084906132ef565b3060009081526002602052604090205550505050565b81600c54612ef6919061323a565b600c55600d54612f079082906132ef565b600d555050565b600060208083528351808285015260005b81811015612f3b57858101830151858201604001528201612f1f565b81811115612f4d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611c2a57600080fd5b8035612f8381612f63565b919050565b60008060408385031215612f9b57600080fd5b8235612fa681612f63565b946020939093013593505050565b600080600060608486031215612fc957600080fd5b8335612fd481612f63565b92506020840135612fe481612f63565b929592945050506040919091013590565b60006020828403121561300757600080fd5b5035919050565b60006020828403121561302057600080fd5b8135610a5b81612f63565b8015158114611c2a57600080fd5b6000806040838503121561304c57600080fd5b82359150602083013561305e8161302b565b809150509250929050565b60006020828403121561307b57600080fd5b8135610a5b8161302b565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156130af57600080fd5b823567ffffffffffffffff808211156130c757600080fd5b818501915085601f8301126130db57600080fd5b8135818111156130ed576130ed613086565b8060051b604051601f19603f8301168101818110858211171561311257613112613086565b60405291825284820192508381018501918883111561313057600080fd5b938501935b828510156131555761314685612f78565b84529385019392850192613135565b98975050505050505050565b60008060006060848603121561317657600080fd5b505081359360208301359350604090920135919050565b600080604083850312156131a057600080fd5b82356131ab81612f63565b9150602083013561305e8161302b565b600080604083850312156131ce57600080fd5b82356131d981612f63565b9150602083013561305e81612f63565b600181811c908216806131fd57607f821691505b6020821081141561321e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561324c5761324c613224565b500390565b60008261326e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006000198214156132e8576132e8613224565b5060010190565b6000821982111561330257613302613224565b500190565b60006020828403121561331957600080fd5b5051919050565b60006020828403121561333257600080fd5b8151610a5b8161302b565b600081600019048311821515161561335757613357613224565b500290565b60006020828403121561336e57600080fd5b8151610a5b81612f63565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133c95784516001600160a01b0316835293830193918301916001016133a4565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133ff57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ae2538bd9cad965b31dacfd04bf2cfed4e780d2c41bf293fc8fd360256b9ba9064736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102975760003560e01c806370a082311161015a578063afa4f3b2116100c1578063dd62ed3e1161007a578063dd62ed3e14610802578063e01af92c14610848578063e2f4560514610868578063f14210a61461087e578063f2fde38b1461089e578063f9d0831a146108be57600080fd5b8063afa4f3b21461073d578063b577554a1461075d578063bb85c6d114610772578063bfd7928414610792578063c0246668146107c2578063d6a694f5146107e257600080fd5b806390a3dd9b1161011357806390a3dd9b1461069257806393a7781f146106b257806395d89b41146106c85780639e281a98146106dd578063a457c2d7146106fd578063a9059cbb1461071d57600080fd5b806370a08231146105c6578063715018a6146105e657806375f0a874146105fb578063788753f81461061b57806388f820201461063b5780638da5cb5b1461067457600080fd5b80634549b039116101fe578063583a71b6116101b7578063583a71b6146105235780635a04e035146105435780635f35bc5c1461055957806365a8ee4f1461056f5780636a01e33b146105855780636ddd1713146105a557600080fd5b80634549b0391461045457806349bd5a5e146104745780634b93d0591461049457806352390c02146104aa5780635342acb4146104ca5780635654d0b31461050357600080fd5b806323b872dd1161025057806323b872dd146103905780632d838119146103b0578063313ce567146103d05780633685d419146103f257806339509351146104145780633bd5d1731461043457600080fd5b806306fdde03146102a3578063095ea7b3146102ce578063142725fc146102fe5780631529fbbf146103225780631694505e1461034357806318160ddd1461037b57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108de565b6040516102c59190612f0e565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612f88565b610970565b60405190151581526020016102c5565b34801561030a57600080fd5b5061031460125481565b6040519081526020016102c5565b34801561032e57600080fd5b50601b546102ee90600160a01b900460ff1681565b34801561034f57600080fd5b50601d54610363906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561038757600080fd5b50600b54610314565b34801561039c57600080fd5b506102ee6103ab366004612fb4565b610987565b3480156103bc57600080fd5b506103146103cb366004612ff5565b6109d9565b3480156103dc57600080fd5b5060095460405160ff90911681526020016102c5565b3480156103fe57600080fd5b5061041261040d36600461300e565b610a62565b005b34801561042057600080fd5b506102ee61042f366004612f88565b610c19565b34801561044057600080fd5b5061041261044f366004612ff5565b610c50565b34801561046057600080fd5b5061031461046f366004613039565b610d3e565b34801561048057600080fd5b50601e54610363906001600160a01b031681565b3480156104a057600080fd5b5061031460115481565b3480156104b657600080fd5b506104126104c536600461300e565b610dcd565b3480156104d657600080fd5b506102ee6104e536600461300e565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561050f57600080fd5b5061041261051e366004613069565b610f20565b34801561052f57600080fd5b5061041261053e36600461309c565b611034565b34801561054f57600080fd5b5061031460135481565b34801561056557600080fd5b5061031460105481565b34801561057b57600080fd5b5061031460145481565b34801561059157600080fd5b506104126105a036600461300e565b6110c6565b3480156105b157600080fd5b50601e546102ee90600160a81b900460ff1681565b3480156105d257600080fd5b506103146105e136600461300e565b611111565b3480156105f257600080fd5b50610412611170565b34801561060757600080fd5b50601a54610363906001600160a01b031681565b34801561062757600080fd5b50601b54610363906001600160a01b031681565b34801561064757600080fd5b506102ee61065636600461300e565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561068057600080fd5b506000546001600160a01b0316610363565b34801561069e57600080fd5b506104126106ad366004613161565b6111e4565b3480156106be57600080fd5b50610314600f5481565b3480156106d457600080fd5b506102b86112e2565b3480156106e957600080fd5b506104126106f8366004612f88565b6112f1565b34801561070957600080fd5b506102ee610718366004612f88565b61143a565b34801561072957600080fd5b506102ee610738366004612f88565b611471565b34801561074957600080fd5b50610412610758366004612ff5565b61147e565b34801561076957600080fd5b50600d54610314565b34801561077e57600080fd5b5061041261078d36600461300e565b611568565b34801561079e57600080fd5b506102ee6107ad36600461300e565b600e6020526000908152604090205460ff1681565b3480156107ce57600080fd5b506104126107dd36600461318d565b6116b1565b3480156107ee57600080fd5b506104126107fd366004613161565b6117bc565b34801561080e57600080fd5b5061031461081d3660046131bb565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561085457600080fd5b50610412610863366004613069565b6118b1565b34801561087457600080fd5b50610314601f5481565b34801561088a57600080fd5b50610412610899366004612ff5565b611928565b3480156108aa57600080fd5b506104126108b936600461300e565b6119c0565b3480156108ca57600080fd5b506104126108d936600461300e565b611aaa565b6060600780546108ed906131e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610919906131e9565b80156109665780601f1061093b57610100808354040283529160200191610966565b820191906000526020600020905b81548152906001019060200180831161094957829003601f168201915b5050505050905090565b600061097d338484611c2d565b5060015b92915050565b6000610994848484611d51565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546109cf9186916109ca90869061323a565b611c2d565b5060019392505050565b6000600c54821115610a455760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a4f611ffb565b9050610a5b8184613251565b9392505050565b6000546001600160a01b03163314610a8c5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03811660009081526005602052604090205460ff16610af45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a3c565b60005b600654811015610c1557816001600160a01b031660068281548110610b1e57610b1e6132a8565b6000918252602090912001546001600160a01b03161415610c035760068054610b499060019061323a565b81548110610b5957610b596132a8565b600091825260209091200154600680546001600160a01b039092169183908110610b8557610b856132a8565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610bdd57610bdd6132be565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610c0d816132d4565b915050610af7565b5050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161097d9185906109ca9086906132ef565b3360008181526005602052604090205460ff1615610cc55760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a3c565b6000610cd08361201e565b505050506001600160a01b038516600090815260016020526040902054929350610cfe92849250905061323a565b6001600160a01b038316600090815260016020526040902055600c54610d2590829061323a565b600c55600d54610d369084906132ef565b600d55505050565b6000600a54831115610d925760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a3c565b81610db2576000610da28461201e565b5094965061098195505050505050565b6000610dbd8461201e565b5093965061098195505050505050565b6000546001600160a01b03163314610df75760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03811660009081526005602052604090205460ff1615610e605760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a3c565b6001600160a01b03811660009081526001602052604090205415610eba576001600160a01b038116600090815260016020526040902054610ea0906109d9565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b6000546001600160a01b03163314610f4a5760405162461bcd60e51b8152600401610a3c90613273565b601b5460ff600160a01b9091041615158115151415610fdc5760405162461bcd60e51b815260206004820152604260248201527f57616c6c657420746f2077616c6c6574207472616e7366657220776974686f7560448201527f742066656520697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610a3c565b601b8054821515600160a01b0260ff60a01b199091161790556040517f77c1f4015c54df9478a364bf8fc1b76b03f0eda36c594de58b4023771cebb9e79061102990831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461105e5760405162461bcd60e51b8152600401610a3c90613273565b60005b8151811015610c15576001600e6000848481518110611082576110826132a8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806110be816132d4565b915050611061565b6000546001600160a01b031633146110f05760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6001600160a01b03811660009081526005602052604081205460ff161561114e57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610981906109d9565b6000546001600160a01b0316331461119a5760405162461bcd60e51b8152600401610a3c90613273565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461120e5760405162461bcd60e51b8152600401610a3c90613273565b600f839055601182905560138190558061122883856132ef565b61123291906132ef565b6018819055600a10156112935760405162461bcd60e51b815260206004820152602360248201527f42757920666565732063616e6e6f742062652067726561746572207468616e2060448201526231302560e81b6064820152608401610a3c565b600f54601154601354604080519384526020840192909252908201527ff12a090a464a491e1614a62b7d86a6f8d3fae25361d5af0911f39bd4fd7ea64d906060015b60405180910390a1505050565b6060600880546108ed906131e9565b6000546001600160a01b0316331461131b5760405162461bcd60e51b8152600401610a3c90613273565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113859190613307565b10156113c45760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610a3c565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114359190613320565b505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161097d9185906109ca90869061323a565b600061097d338484611d51565b6000546001600160a01b031633146114a85760405162461bcd60e51b8152600401610a3c90613273565b620186a06114b5600b5490565b6114bf9190613251565b81116115335760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610a3c565b601f8190556040518181527f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b14590602001611029565b6000546001600160a01b031633146115925760405162461bcd60e51b8152600401610a3c90613273565b601a546001600160a01b03828116911614156116015760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610a3c565b6001600160a01b0381166116635760405162461bcd60e51b8152602060048201526024808201527f4d61726b6574696e672077616c6c657420697320746865207a65726f206164646044820152637265737360e01b6064820152608401610a3c565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001611029565b6000546001600160a01b031633146116db5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b03821660009081526004602052604090205460ff161515811515141561175d5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610a3c565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146117e65760405162461bcd60e51b8152600401610a3c90613273565b6010839055601282905560148190558061180083856132ef565b61180a91906132ef565b6019819055600a101561186b5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20666565732063616e6e6f742062652067726561746572207468616e6044820152632031302560e01b6064820152608401610a3c565b601054601254601454604080519384526020840192909252908201527f969e8ecd326f5fe41e2a3cd9798553fbecef5705da23954426a09c9360c7aa57906060016112d5565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610a3c90613273565b601e8054821515600160a81b0260ff60a81b199091161790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129061102990831515815260200190565b6000546001600160a01b031633146119525760405162461bcd60e51b8152600401610a3c90613273565b804710156119935760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610a3c565b604051339082156108fc029083906000818181858888f19350505050158015610c15573d6000803e3d6000fd5b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b038116611a4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ad45760405162461bcd60e51b8152600401610a3c90613273565b6001600160a01b038116301415611b2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610a3c565b6001600160a01b038116611b4557610c153347612079565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb29190613307565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190613320565b5050505b50565b6001600160a01b038316611c8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3c565b6001600160a01b038216611cf05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3c565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611db55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3c565b60008111611e175760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a3c565b6000546001600160a01b03848116911614801590611e4357506000546001600160a01b03838116911614155b15611ed6576001600160a01b0383166000908152600e602052604090205460ff16158015611e8a57506001600160a01b0382166000908152600e602052604090205460ff16155b611ed65760405162461bcd60e51b815260206004820152601c60248201527f596f7572206163636f756e7420697320626c61636b6c697374656421000000006044820152606401610a3c565b6000611ee130611111565b601f5490915081108015908190611f025750601e54600160a01b900460ff16155b8015611f1b5750601e546001600160a01b038581169116145b8015611f305750601e54600160a81b900460ff165b15611fe957601e805460ff60a01b1916600160a01b179055601454601354600091611f5a916132ef565b90506000601254601154611f6e91906132ef565b90506000611f7c82846132ef565b90508015611fd8578115611fae57600081611f97848861333d565b611fa19190613251565b9050611fac81612128565b505b8215611fd857600081611fc1858861333d565b611fcb9190613251565b9050611fd681612376565b505b5050601e805460ff60a01b19169055505b611ff4858585612560565b5050505050565b600080600061200861275e565b90925090506120178183613251565b9250505090565b60008060008060008060008060008060006120388c6128e1565b935093509350935060008060006120598f878787612054611ffb565b612940565b919f509d509b509599509397509195509350505050919395979092949650565b6000814710156120cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a3c565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612118576040519150601f19603f3d011682016040523d82523d6000602084013e61211d565b606091505b509095945050505050565b6000612135600283613251565b90506000612143828461323a565b6040805160028082526060820183529293504792600092602083019080368337019050509050308160008151811061217d5761217d6132a8565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156121d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fa919061335c565b8160018151811061220d5761220d6132a8565b6001600160a01b039283166020918202929092010152601d5460405163791ac94760e01b815291169063791ac94790612253908790600090869030904290600401613379565b600060405180830381600087803b15801561226d57600080fd5b505af1158015612281573d6000803e3d6000fd5b5050505060008247612293919061323a565b601d54601c5460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c40160606040518083038185885af1158015612305573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061232a91906133ea565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b6040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106123af576123af6132a8565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242c919061335c565b8160018151811061243f5761243f6132a8565b6001600160a01b039283166020918202929092010152601d5460405163791ac94760e01b815291169063791ac94790612485908690600090869030904290600401613379565b600060405180830381600087803b15801561249f57600080fd5b505af11580156124b3573d6000803e3d6000fd5b50505050600082476124c5919061323a565b90506124f360646124d783603261333d565b6124e19190613251565b601a546001600160a01b031690612079565b50612520606461250483603261333d565b61250e9190613251565b601b546001600160a01b031690612079565b5060408051858152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a150505050565b6001600160a01b03831660009081526004602052604090205460ff168061259f57506001600160a01b03821660009081526004602052604090205460ff165b156125b1576125ac6129b2565b61260f565b601e546001600160a01b03838116911614156125cf576125ac6129e6565b601e546001600160a01b03848116911614156125ed576125ac612a26565b601b54600160a01b900460ff1615612607576125ac6129b2565b61260f6129e6565b6001600160a01b03831660009081526005602052604090205460ff16801561265057506001600160a01b03821660009081526005602052604090205460ff16155b1561266057611435838383612a66565b6001600160a01b03831660009081526005602052604090205460ff161580156126a157506001600160a01b03821660009081526005602052604090205460ff165b156126b157611435838383612ba7565b6001600160a01b03831660009081526005602052604090205460ff161580156126f357506001600160a01b03821660009081526005602052604090205460ff16155b1561270357611435838383612c61565b6001600160a01b03831660009081526005602052604090205460ff16801561274357506001600160a01b03821660009081526005602052604090205460ff165b1561275357611435838383612cb4565b611435838383612c61565b600c54600a546000918291825b6006548110156128b05782600160006006848154811061278d5761278d6132a8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127f857508160026000600684815481106127d1576127d16132a8565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561280e57600c54600a54945094505050509091565b6001600060068381548110612825576128256132a8565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612854908461323a565b9250600260006006838154811061286d5761286d6132a8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461289c908361323a565b9150806128a8816132d4565b91505061276b565b50600a54600c546128c19190613251565b8210156128d857600c54600a549350935050509091565b90939092509050565b60008060008060006128f286612d37565b905060006128ff87612d53565b9050600061290c88612d65565b90506000818361291c868c61323a565b612926919061323a565b612930919061323a565b9993985091965094509092505050565b600080808061294f858a61333d565b9050600061295d868a61333d565b9050600061296b878a61333d565b90506000612979888a61333d565b905060008183612989868861323a565b612993919061323a565b61299d919061323a565b949d949c50929a509298505050505050505050565b6015541580156129c25750601654155b80156129ce5750601754155b156129d557565b600060158190556017819055601655565b6010546015541480156129fc5750601254601654145b8015612a0b5750601454601754145b15612a1257565b601054601555601454601755601254601655565b600f54601554148015612a3c5750601154601654145b8015612a4b5750601354601754145b15612a5257565b600f54601555601354601755601154601655565b6000806000806000806000612a7a8861201e565b965096509650965096509650965087600260008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612ab9919061323a565b6001600160a01b038b16600090815260026020908152604080832093909355600190522054612ae990889061323a565b6001600160a01b03808c1660009081526001602052604080822093909355908b1681522054612b199087906132ef565b6001600160a01b038a16600090815260016020526040902055612b3b81612d77565b612b4482612e07565b612b4e8584612ee8565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612b9391815260200190565b60405180910390a350505050505050505050565b6000806000806000806000612bbb8861201e565b965096509650965096509650965086600160008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612bfa919061323a565b6001600160a01b03808c16600090815260016020908152604080832094909455918c16815260029091522054612c319085906132ef565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612b199087906132ef565b6000806000806000806000612c758861201e565b965096509650965096509650965086600160008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612ae9919061323a565b6000806000806000806000612cc88861201e565b965096509650965096509650965087600260008c6001600160a01b03166001600160a01b0316815260200190815260200160002054612d07919061323a565b6001600160a01b038b16600090815260026020908152604080832093909355600190522054612bfa90889061323a565b6000606460155483612d49919061333d565b6109819190613251565b6000606460165483612d49919061333d565b6000606460175483612d49919061333d565b8015611c2a576000612d87611ffb565b90506000612d95828461333d565b30600090815260016020526040902054909150612db39082906132ef565b3060009081526001602090815260408083209390935560059052205460ff16156114355730600090815260026020526040902054612df29084906132ef565b30600090815260026020526040902055505050565b600080601254601154612e1a91906132ef565b1115612e5757601254601154612e3091906132ef565b601254601154612e4091906132ef565b612e4a908461333d565b612e549190613251565b90505b8015610c15576000612e67611ffb565b90506000612e75828461333d565b30600090815260016020526040902054909150612e939082906132ef565b3060009081526001602090815260408083209390935560059052205460ff1615611c265730600090815260026020526040902054612ed29084906132ef565b3060009081526002602052604090205550505050565b81600c54612ef6919061323a565b600c55600d54612f079082906132ef565b600d555050565b600060208083528351808285015260005b81811015612f3b57858101830151858201604001528201612f1f565b81811115612f4d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611c2a57600080fd5b8035612f8381612f63565b919050565b60008060408385031215612f9b57600080fd5b8235612fa681612f63565b946020939093013593505050565b600080600060608486031215612fc957600080fd5b8335612fd481612f63565b92506020840135612fe481612f63565b929592945050506040919091013590565b60006020828403121561300757600080fd5b5035919050565b60006020828403121561302057600080fd5b8135610a5b81612f63565b8015158114611c2a57600080fd5b6000806040838503121561304c57600080fd5b82359150602083013561305e8161302b565b809150509250929050565b60006020828403121561307b57600080fd5b8135610a5b8161302b565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156130af57600080fd5b823567ffffffffffffffff808211156130c757600080fd5b818501915085601f8301126130db57600080fd5b8135818111156130ed576130ed613086565b8060051b604051601f19603f8301168101818110858211171561311257613112613086565b60405291825284820192508381018501918883111561313057600080fd5b938501935b828510156131555761314685612f78565b84529385019392850192613135565b98975050505050505050565b60008060006060848603121561317657600080fd5b505081359360208301359350604090920135919050565b600080604083850312156131a057600080fd5b82356131ab81612f63565b9150602083013561305e8161302b565b600080604083850312156131ce57600080fd5b82356131d981612f63565b9150602083013561305e81612f63565b600181811c908216806131fd57607f821691505b6020821081141561321e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561324c5761324c613224565b500390565b60008261326e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006000198214156132e8576132e8613224565b5060010190565b6000821982111561330257613302613224565b500190565b60006020828403121561331957600080fd5b5051919050565b60006020828403121561333257600080fd5b8151610a5b8161302b565b600081600019048311821515161561335757613357613224565b500290565b60006020828403121561336e57600080fd5b8151610a5b81612f63565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133c95784516001600160a01b0316835293830193918301916001016133a4565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133ff57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ae2538bd9cad965b31dacfd04bf2cfed4e780d2c41bf293fc8fd360256b9ba9064736f6c634300080b0033

Deployed Bytecode Sourcemap

12910:23855:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16864:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17782:161;;;;;;;;;;-1:-1:-1;17782:161:0;;;;;:::i;:::-;;:::i;:::-;;;1376:14:1;;1369:22;1351:41;;1339:2;1324:18;17782:161:0;1211:187:1;13963:33:0;;;;;;;;;;;;;;;;;;;1549:25:1;;;1537:2;1522:18;13963:33:0;1403:177:1;14336:44:0;;;;;;;;;;-1:-1:-1;14336:44:0;;;;-1:-1:-1;;;14336:44:0;;;;;;14467:42;;;;;;;;;;-1:-1:-1;14467:42:0;;;;-1:-1:-1;;;;;14467:42:0;;;;;;-1:-1:-1;;;;;1776:32:1;;;1758:51;;1746:2;1731:18;14467:42:0;1585:230:1;17141:101:0;;;;;;;;;;-1:-1:-1;17221:13:0;;17141:101;;17951:266;;;;;;;;;;-1:-1:-1;17951:266:0;;;;;:::i;:::-;;:::i;19744:250::-;;;;;;;;;;-1:-1:-1;19744:250:0;;;;;:::i;:::-;;:::i;17050:83::-;;;;;;;;;;-1:-1:-1;17116:9:0;;17050:83;;17116:9;;;;2608:36:1;;2596:2;2581:18;17050:83:0;2466:184:1;20343:479:0;;;;;;;;;;-1:-1:-1;20343:479:0;;;;;:::i;:::-;;:::i;:::-;;18225:215;;;;;;;;;;-1:-1:-1;18225:215:0;;;;;:::i;:::-;;:::i;18921:369::-;;;;;;;;;;-1:-1:-1;18921:369:0;;;;;:::i;:::-;;:::i;19298:438::-;;;;;;;;;;-1:-1:-1;19298:438:0;;;;;:::i;:::-;;:::i;14516:29::-;;;;;;;;;;-1:-1:-1;14516:29:0;;;;-1:-1:-1;;;;;14516:29:0;;;13924:32;;;;;;;;;;;;;;;;20002:333;;;;;;;;;;-1:-1:-1;20002:333:0;;;;;:::i;:::-;;:::i;25951:124::-;;;;;;;;;;-1:-1:-1;25951:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;26039:28:0;26015:4;26039:28;;;:19;:28;;;;;;;;;25951:124;35721:335;;;;;;;;;;-1:-1:-1;35721:335:0;;;;;:::i;:::-;;:::i;36072:176::-;;;;;;;;;;-1:-1:-1;36072:176:0;;;;;:::i;:::-;;:::i;14005:32::-;;;;;;;;;;;;;;;;13888:27;;;;;;;;;;;;;;;;14044:33;;;;;;;;;;;;;;;;36255:98;;;;;;;;;;-1:-1:-1;36255:98:0;;;;;:::i;:::-;;:::i;14590:23::-;;;;;;;;;;-1:-1:-1;14590:23:0;;;;-1:-1:-1;;;14590:23:0;;;;;;17250:198;;;;;;;;;;-1:-1:-1;17250:198:0;;;;;:::i;:::-;;:::i;1003:148::-;;;;;;;;;;;;;:::i;14265:30::-;;;;;;;;;;-1:-1:-1;14265:30:0;;;;-1:-1:-1;;;;;14265:30:0;;;14302:25;;;;;;;;;;-1:-1:-1;14302:25:0;;;;-1:-1:-1;;;;;14302:25:0;;;18681:120;;;;;;;;;;-1:-1:-1;18681:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;18773:20:0;18749:4;18773:20;;;:11;:20;;;;;;;;;18681:120;789:79;;;;;;;;;;-1:-1:-1;827:7:0;854:6;-1:-1:-1;;;;;854:6:0;789:79;;34648:520;;;;;;;;;;-1:-1:-1;34648:520:0;;;;;:::i;:::-;;:::i;13855:26::-;;;;;;;;;;;;;;;;16955:87;;;;;;;;;;;;;:::i;36549:209::-;;;;;;;;;;-1:-1:-1;36549:209:0;;;;;:::i;:::-;;:::i;18448:225::-;;;;;;;;;;-1:-1:-1;18448:225:0;;;;;:::i;:::-;;:::i;17456:167::-;;;;;;;;;;-1:-1:-1;17456:167:0;;;;;:::i;:::-;;:::i;29868:289::-;;;;;;;;;;-1:-1:-1;29868:289:0;;;;;:::i;:::-;;:::i;18809:104::-;;;;;;;;;;-1:-1:-1;18895:10:0;;18809:104;;34269:371;;;;;;;;;;-1:-1:-1;34269:371:0;;;;;:::i;:::-;;:::i;13806:36::-;;;;;;;;;;-1:-1:-1;13806:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33965:292;;;;;;;;;;-1:-1:-1;33965:292:0;;;;;:::i;:::-;;:::i;35176:537::-;;;;;;;;;;-1:-1:-1;35176:537:0;;;;;:::i;:::-;;:::i;17631:143::-;;;;;;;;;;-1:-1:-1;17631:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;17739:18:0;;;17712:7;17739:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17631:143;30169;;;;;;;;;;-1:-1:-1;30169:143:0;;;;;:::i;:::-;;:::i;14620:33::-;;;;;;;;;;;;;;;;36358:183;;;;;;;;;;-1:-1:-1;36358:183:0;;;;;:::i;:::-;;:::i;1159:244::-;;;;;;;;;;-1:-1:-1;1159:244:0;;;;;:::i;:::-;;:::i;20867:442::-;;;;;;;;;;-1:-1:-1;20867:442:0;;;;;:::i;:::-;;:::i;16864:83::-;16901:13;16934:5;16927:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16864:83;:::o;17782:161::-;17857:4;17874:39;193:10;17897:7;17906:6;17874:8;:39::i;:::-;-1:-1:-1;17931:4:0;17782:161;;;;;:::o;17951:266::-;18049:4;18066:36;18076:6;18084:9;18095:6;18066:9;:36::i;:::-;-1:-1:-1;;;;;18144:19:0;;;;;;:11;:19;;;;;;;;193:10;18144:33;;;;;;;;;18113:74;;18122:6;;18144:42;;18180:6;;18144:42;:::i;:::-;18113:8;:74::i;:::-;-1:-1:-1;18205:4:0;17951:266;;;;;:::o;19744:250::-;19810:7;19849;;19838;:18;;19830:73;;;;-1:-1:-1;;;19830:73:0;;7340:2:1;19830:73:0;;;7322:21:1;7379:2;7359:18;;;7352:30;7418:34;7398:18;;;7391:62;-1:-1:-1;;;7469:18:1;;;7462:40;7519:19;;19830:73:0;;;;;;;;;19914:19;19937:10;:8;:10::i;:::-;19914:33;-1:-1:-1;19965:21:0;19914:33;19965:7;:21;:::i;:::-;19958:28;19744:250;-1:-1:-1;;;19744:250:0:o;20343:479::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20425:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;20417:60;;;::::0;-1:-1:-1;;;20417:60:0;;8334:2:1;20417:60:0::1;::::0;::::1;8316:21:1::0;8373:2;8353:18;;;8346:30;8412:29;8392:18;;;8385:57;8459:18;;20417:60:0::1;8132:351:1::0;20417:60:0::1;20493:9;20488:327;20512:9;:16:::0;20508:20;::::1;20488:327;;;20570:7;-1:-1:-1::0;;;;;20554:23:0::1;:9;20564:1;20554:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;20554:12:0::1;:23;20550:254;;;20613:9;20623:16:::0;;:20:::1;::::0;20642:1:::1;::::0;20623:20:::1;:::i;:::-;20613:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;20598:9:::1;:12:::0;;-1:-1:-1;;;;;20613:31:0;;::::1;::::0;20608:1;;20598:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;20598:46:0::1;-1:-1:-1::0;;;;;20598:46:0;;::::1;;::::0;;20663:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;20702:11:::1;:20:::0;;;;:28;;-1:-1:-1;;20702:28:0::1;::::0;;20749:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;20749:15:0;;;;;-1:-1:-1;;;;;;20749:15:0::1;::::0;;;;;20488:327:::1;20343:479:::0;:::o;20550:254::-:1;20530:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20488:327;;;;20343:479:::0;:::o;18225:215::-;193:10;18313:4;18362:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18362:34:0;;;;;;;;;;18313:4;;18330:80;;18353:7;;18362:47;;18399:10;;18362:47;:::i;18921:369::-;193:10;18973:14;19022:19;;;:11;:19;;;;;;;;19021:20;19013:77;;;;-1:-1:-1;;;19013:77:0;;9227:2:1;19013:77:0;;;9209:21:1;9266:2;9246:18;;;9239:30;9305:34;9285:18;;;9278:62;-1:-1:-1;;;9356:18:1;;;9349:42;9408:19;;19013:77:0;9025:408:1;19013:77:0;19102:15;19127:19;19138:7;19127:10;:19::i;:::-;-1:-1:-1;;;;;;;;;19175:15:0;;;;;;:7;:15;;;;;;19101:45;;-1:-1:-1;19175:25:0;;19101:45;;-1:-1:-1;19175:15:0;-1:-1:-1;19175:25:0;:::i;:::-;-1:-1:-1;;;;;19157:15:0;;;;;;:7;:15;;;;;:43;19221:7;;:17;;19231:7;;19221:17;:::i;:::-;19211:7;:27;19262:10;;:20;;19275:7;;19262:20;:::i;:::-;19249:10;:33;-1:-1:-1;;;18921:369:0:o;19298:438::-;19388:7;19427;;19416;:18;;19408:62;;;;-1:-1:-1;;;19408:62:0;;9640:2:1;19408:62:0;;;9622:21:1;9679:2;9659:18;;;9652:30;9718:33;9698:18;;;9691:61;9769:18;;19408:62:0;9438:355:1;19408:62:0;19486:17;19481:248;;19521:15;19546:19;19557:7;19546:10;:19::i;:::-;-1:-1:-1;19520:45:0;;-1:-1:-1;19580:14:0;;-1:-1:-1;;;;;;19580:14:0;19481:248;19629:23;19661:19;19672:7;19661:10;:19::i;:::-;-1:-1:-1;19627:53:0;;-1:-1:-1;19695:22:0;;-1:-1:-1;;;;;;19695:22:0;20002:333;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20085:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;20084:21;20076:61;;;::::0;-1:-1:-1;;;20076:61:0;;10000:2:1;20076:61:0::1;::::0;::::1;9982:21:1::0;10039:2;10019:18;;;10012:30;10078:29;10058:18;;;10051:57;10125:18;;20076:61:0::1;9798:351:1::0;20076:61:0::1;-1:-1:-1::0;;;;;20151:16:0;::::1;20170:1;20151:16:::0;;;:7:::1;:16;::::0;;;;;:20;20148:108:::1;;-1:-1:-1::0;;;;;20227:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;20207:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;20188:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;20148:108:::1;-1:-1:-1::0;;;;;20266:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;20266:27:0::1;20289:4;20266:27:::0;;::::1;::::0;;;20304:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;20304:23:0::1;::::0;;::::1;::::0;;20002:333::o;35721:335::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;35820:32:::1;::::0;::::1;-1:-1:-1::0;;;35820:32:0;;::::1;;:42;;::::0;::::1;;;;35812:121;;;::::0;-1:-1:-1;;;35812:121:0;;10356:2:1;35812:121:0::1;::::0;::::1;10338:21:1::0;10395:2;10375:18;;;10368:30;10434:34;10414:18;;;10407:62;10505:34;10485:18;;;10478:62;-1:-1:-1;;;10556:19:1;;;10549:33;10599:19;;35812:121:0::1;10154:470:1::0;35812:121:0::1;35944:32;:41:::0;;;::::1;;-1:-1:-1::0;;;35944:41:0::1;-1:-1:-1::0;;;;35944:41:0;;::::1;;::::0;;36001:47:::1;::::0;::::1;::::0;::::1;::::0;35979:6;1376:14:1;1369:22;1351:41;;1339:2;1324:18;;1211:187;36001:47:0::1;;;;;;;;35721:335:::0;:::o;36072:176::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;36155:9:::1;36150:91;36174:5;:12;36170:1;:16;36150:91;;;36225:4;36208;:14;36213:5;36219:1;36213:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;36208:14:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;36208:14:0;:21;;-1:-1:-1;;36208:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36188:3;::::1;::::0;::::1;:::i;:::-;;;;36150:91;;36255:98:::0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36325:12:0::1;36340:5;36325:12:::0;;;:4:::1;:12;::::0;;;;:20;;-1:-1:-1;;36325:20:0::1;::::0;;36255:98::o;17250:198::-;-1:-1:-1;;;;;17340:20:0;;17316:7;17340:20;;;:11;:20;;;;;;;;17336:49;;;-1:-1:-1;;;;;;17369:16:0;;;;;:7;:16;;;;;;;17250:198::o;17336:49::-;-1:-1:-1;;;;;17423:16:0;;;;;;:7;:16;;;;;;17403:37;;:19;:37::i;1003:148::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;1110:1:::1;1094:6:::0;;1073:40:::1;::::0;-1:-1:-1;;;;;1094:6:0;;::::1;::::0;1073:40:::1;::::0;1110:1;;1073:40:::1;1141:1;1124:19:::0;;-1:-1:-1;;;;;;1124:19:0::1;::::0;;1003:148::o;34648:520::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;34786:11:::1;:26:::0;;;34823:17:::1;:38:::0;;;34872:17:::1;:38:::0;;;34892:18;34947:31:::1;34843:18:::0;34800:12;34947:31:::1;:::i;:::-;:51;;;;:::i;:::-;34932:12;:66:::0;;;35035:2:::1;-1:-1:-1::0;35019:18:0::1;35011:66;;;::::0;-1:-1:-1;;;35011:66:0;;10831:2:1;35011:66:0::1;::::0;::::1;10813:21:1::0;10870:2;10850:18;;;10843:30;10909:34;10889:18;;;10882:62;-1:-1:-1;;;10960:18:1;;;10953:33;11003:19;;35011:66:0::1;10629:399:1::0;35011:66:0::1;35110:11;::::0;35123:17:::1;::::0;35142::::1;::::0;35095:65:::1;::::0;;11235:25:1;;;11291:2;11276:18;;11269:34;;;;11319:18;;;11312:34;35095:65:0::1;::::0;11223:2:1;11208:18;35095:65:0::1;;;;;;;;34648:520:::0;;;:::o;16955:87::-;16994:13;17027:7;17020:14;;;;;:::i;36549:209::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;36642:31:::1;::::0;-1:-1:-1;;;36642:31:0;;36667:4:::1;36642:31;::::0;::::1;1758:51:1::0;36677:7:0;;-1:-1:-1;;;;;36642:16:0;::::1;::::0;::::1;::::0;1731:18:1;;36642:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;36634:69;;;::::0;-1:-1:-1;;;36634:69:0;;11748:2:1;36634:69:0::1;::::0;::::1;11730:21:1::0;11787:2;11767:18;;;11760:30;-1:-1:-1;;;11806:18:1;;;11799:44;11860:18;;36634:69:0::1;11546:338:1::0;36634:69:0::1;36714:36;::::0;-1:-1:-1;;;36714:36:0;;36730:10:::1;36714:36;::::0;::::1;12063:51:1::0;12130:18;;;12123:34;;;-1:-1:-1;;;;;36714:15:0;::::1;::::0;::::1;::::0;12036:18:1;;36714:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36549:209:::0;;:::o;18448:225::-;193:10;18541:4;18590:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18590:34:0;;;;;;;;;;18541:4;;18558:85;;18581:7;;18590:52;;18627:15;;18590:52;:::i;17456:167::-;17534:4;17551:42;193:10;17575:9;17586:6;17551:9;:42::i;29868:289::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;29986:3:::1;29970:13;17221::::0;;;17141:101;29970:13:::1;:19;;;;:::i;:::-;29958:9;:31;29950:106;;;::::0;-1:-1:-1;;;29950:106:0;;12620:2:1;29950:106:0::1;::::0;::::1;12602:21:1::0;12659:2;12639:18;;;12632:30;12698:34;12678:18;;;12671:62;12769:32;12749:18;;;12742:60;12819:19;;29950:106:0::1;12418:426:1::0;29950:106:0::1;30067:18;:30:::0;;;30113:36:::1;::::0;1549:25:1;;;30113:36:0::1;::::0;1537:2:1;1522:18;30113:36:0::1;1403:177:1::0;34269:371:0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;34384:15:::1;::::0;-1:-1:-1;;;;;34364:35:0;;::::1;34384:15:::0;::::1;34364:35;;34356:88;;;::::0;-1:-1:-1;;;34356:88:0;;13051:2:1;34356:88:0::1;::::0;::::1;13033:21:1::0;13090:2;13070:18;;;13063:30;13129:34;13109:18;;;13102:62;-1:-1:-1;;;13180:18:1;;;13173:38;13228:19;;34356:88:0::1;12849:404:1::0;34356:88:0::1;-1:-1:-1::0;;;;;34463:28:0;::::1;34455:77;;;::::0;-1:-1:-1;;;34455:77:0;;13460:2:1;34455:77:0::1;::::0;::::1;13442:21:1::0;13499:2;13479:18;;;13472:30;13538:34;13518:18;;;13511:62;-1:-1:-1;;;13589:18:1;;;13582:34;13633:19;;34455:77:0::1;13258:400:1::0;34455:77:0::1;34543:15;:34:::0;;-1:-1:-1;;;;;;34543:34:0::1;-1:-1:-1::0;;;;;34543:34:0;::::1;::::0;;::::1;::::0;;;34593:39:::1;::::0;1758:51:1;;;34593:39:0::1;::::0;1746:2:1;1731:18;34593:39:0::1;1585:230:1::0;33965:292:0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34060:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;34052:95;;;::::0;-1:-1:-1;;;34052:95:0;;13865:2:1;34052:95:0::1;::::0;::::1;13847:21:1::0;13904:2;13884:18;;;13877:30;13943:34;13923:18;;;13916:62;-1:-1:-1;;;13994:18:1;;;13987:40;14044:19;;34052:95:0::1;13663:406:1::0;34052:95:0::1;-1:-1:-1::0;;;;;34158:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;34158:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34215:34;;1351:41:1;;;34215:34:0::1;::::0;1324:18:1;34215:34:0::1;;;;;;;33965:292:::0;;:::o;35176:537::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;35318:12:::1;:28:::0;;;35357:18:::1;:40:::0;;;35408:18:::1;:40:::0;;;35429:19;35482:33:::1;35378:19:::0;35333:13;35482:33:::1;:::i;:::-;:54;;;;:::i;:::-;35466:13;:70:::0;;;35575:2:::1;-1:-1:-1::0;35558:19:0::1;35550:68;;;::::0;-1:-1:-1;;;35550:68:0;;14276:2:1;35550:68:0::1;::::0;::::1;14258:21:1::0;14315:2;14295:18;;;14288:30;14354:34;14334:18;;;14327:62;-1:-1:-1;;;14405:18:1;;;14398:34;14449:19;;35550:68:0::1;14074:400:1::0;35550:68:0::1;35652:12;::::0;35666:18:::1;::::0;35686::::1;::::0;35636:69:::1;::::0;;11235:25:1;;;11291:2;11276:18;;11269:34;;;;11319:18;;;11312:34;35636:69:0::1;::::0;11223:2:1;11208:18;35636:69:0::1;11033:319:1::0;30169:143:0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;30238:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;30238:22:0::1;-1:-1:-1::0;;;;30238:22:0;;::::1;;::::0;;30276:28:::1;::::0;::::1;::::0;::::1;::::0;30252:8;1376:14:1;1369:22;1351:41;;1339:2;1324:18;;1211:187;36358:183:0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;36459:7:::1;36434:21;:32;;36426:59;;;::::0;-1:-1:-1;;;36426:59:0;;11748:2:1;36426:59:0::1;::::0;::::1;11730:21:1::0;11787:2;11767:18;;;11760:30;-1:-1:-1;;;11806:18:1;;;11799:44;11860:18;;36426:59:0::1;11546:338:1::0;36426:59:0::1;36496:37;::::0;36504:10:::1;::::0;36496:37;::::1;;;::::0;36525:7;;36496:37:::1;::::0;;;36525:7;36504:10;36496:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;1159:244:::0;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1248:22:0;::::1;1240:73;;;::::0;-1:-1:-1;;;1240:73:0;;14681:2:1;1240:73:0::1;::::0;::::1;14663:21:1::0;14720:2;14700:18;;;14693:30;14759:34;14739:18;;;14732:62;-1:-1:-1;;;14810:18:1;;;14803:36;14856:19;;1240:73:0::1;14479:402:1::0;1240:73:0::1;1350:6;::::0;;1329:38:::1;::::0;-1:-1:-1;;;;;1329:38:0;;::::1;::::0;1350:6;::::1;::::0;1329:38:::1;::::0;::::1;1378:6;:17:::0;;-1:-1:-1;;;;;;1378:17:0::1;-1:-1:-1::0;;;;;1378:17:0;;;::::1;::::0;;;::::1;::::0;;1159:244::o;20867:442::-;916:6;;-1:-1:-1;;;;;916:6:0;193:10;916:22;908:67;;;;-1:-1:-1;;;908:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20946:22:0;::::1;20963:4;20946:22;;20938:67;;;::::0;-1:-1:-1;;;20938:67:0;;15088:2:1;20938:67:0::1;::::0;::::1;15070:21:1::0;;;15107:18;;;15100:30;15166:34;15146:18;;;15139:62;15218:18;;20938:67:0::1;14886:356:1::0;20938:67:0::1;-1:-1:-1::0;;;;;21020:21:0;::::1;21016:127;;21058:52;21066:10;21088:21;21058:29;:52::i;21016:127::-;21215:35;::::0;-1:-1:-1;;;21215:35:0;;21244:4:::1;21215:35;::::0;::::1;1758:51:1::0;21180:5:0;;21153:17:::1;::::0;-1:-1:-1;;;;;21215:20:0;::::1;::::0;::::1;::::0;1731:18:1;;21215:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21261:40;::::0;-1:-1:-1;;;21261:40:0;;21281:10:::1;21261:40;::::0;::::1;12063:51:1::0;12130:18;;;12123:34;;;21197:53:0;;-1:-1:-1;;;;;;21261:19:0;::::1;::::0;::::1;::::0;12036:18:1;;21261:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20927:382;;986:1;20867:442:::0;:::o;26083:337::-;-1:-1:-1;;;;;26176:19:0;;26168:68;;;;-1:-1:-1;;;26168:68:0;;15449:2:1;26168:68:0;;;15431:21:1;15488:2;15468:18;;;15461:30;15527:34;15507:18;;;15500:62;-1:-1:-1;;;15578:18:1;;;15571:34;15622:19;;26168:68:0;15247:400:1;26168:68:0;-1:-1:-1;;;;;26255:21:0;;26247:68;;;;-1:-1:-1;;;26247:68:0;;15854:2:1;26247:68:0;;;15836:21:1;15893:2;15873:18;;;15866:30;15932:34;15912:18;;;15905:62;-1:-1:-1;;;15983:18:1;;;15976:32;16025:19;;26247:68:0;15652:398:1;26247:68:0;-1:-1:-1;;;;;26328:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26380:32;;1549:25:1;;;26380:32:0;;1522:18:1;26380:32:0;;;;;;;26083:337;;;:::o;26434:1708::-;-1:-1:-1;;;;;26556:18:0;;26548:68;;;;-1:-1:-1;;;26548:68:0;;16257:2:1;26548:68:0;;;16239:21:1;16296:2;16276:18;;;16269:30;16335:34;16315:18;;;16308:62;-1:-1:-1;;;16386:18:1;;;16379:35;16431:19;;26548:68:0;16055:401:1;26548:68:0;26644:1;26635:6;:10;26627:64;;;;-1:-1:-1;;;26627:64:0;;16663:2:1;26627:64:0;;;16645:21:1;16702:2;16682:18;;;16675:30;16741:34;16721:18;;;16714:62;-1:-1:-1;;;16792:18:1;;;16785:39;16841:19;;26627:64:0;16461:405:1;26627:64:0;827:7;854:6;-1:-1:-1;;;;;26727:15:0;;;854:6;;26727:15;;;;:32;;-1:-1:-1;827:7:0;854:6;-1:-1:-1;;;;;26746:13:0;;;854:6;;26746:13;;26727:32;26723:142;;;-1:-1:-1;;;;;26785:10:0;;;;;;:4;:10;;;;;;;;26784:11;:24;;;;-1:-1:-1;;;;;;26800:8:0;;;;;;:4;:8;;;;;;;;26799:9;26784:24;26776:65;;;;-1:-1:-1;;;26776:65:0;;17073:2:1;26776:65:0;;;17055:21:1;17112:2;17092:18;;;17085:30;17151;17131:18;;;17124:58;17199:18;;26776:65:0;16871:352:1;26776:65:0;26877:28;26908:24;26926:4;26908:9;:24::i;:::-;27002:18;;26877:55;;-1:-1:-1;26978:42:0;;;;;;;27049:53;;-1:-1:-1;27086:16:0;;-1:-1:-1;;;27086:16:0;;;;27085:17;27049:53;:89;;;;-1:-1:-1;27125:13:0;;-1:-1:-1;;;;;27119:19:0;;;27125:13;;27119:19;27049:89;:117;;;;-1:-1:-1;27155:11:0;;-1:-1:-1;;;27155:11:0;;;;27049:117;27031:985;;;27193:16;:23;;-1:-1:-1;;;;27193:23:0;-1:-1:-1;;;27193:23:0;;;:16;27290:18;27270:17;;27193:23;;27270:38;;;:::i;:::-;27245:63;;27323:22;27368:18;;27348:17;;:38;;;;:::i;:::-;27323:63;-1:-1:-1;27403:18:0;27424:31;27323:63;27424:14;:31;:::i;:::-;27403:52;-1:-1:-1;27475:14:0;;27472:492;;27513:18;;27510:198;;27556:23;27624:10;27583:37;27606:14;27583:20;:37;:::i;:::-;27582:52;;;;:::i;:::-;27556:78;;27657:31;27672:15;27657:14;:31::i;:::-;27533:175;27510:198;27747:18;;27744:204;;27790:23;27858:10;27817:37;27840:14;27817:20;:37;:::i;:::-;27816:52;;;;:::i;:::-;27790:78;;27891:37;27912:15;27891:20;:37::i;:::-;27767:181;27744:204;-1:-1:-1;;27980:16:0;:24;;-1:-1:-1;;;;27980:24:0;;;-1:-1:-1;27031:985:0;28102:30;28117:4;28122:2;28125:6;28102:14;:30::i;:::-;26537:1605;;26434:1708;;;:::o;22885:160::-;22926:7;22947:15;22964;22983:19;:17;:19::i;:::-;22946:56;;-1:-1:-1;22946:56:0;-1:-1:-1;23020:17:0;22946:56;;23020:17;:::i;:::-;23013:24;;;;22885:160;:::o;21466:472::-;21525:7;21534;21543;21552;21561;21570;21579;21600:23;21625:12;21639:18;21659;21681:20;21693:7;21681:11;:20::i;:::-;21599:102;;;;;;;;21713:15;21730:23;21755:12;21771:62;21783:7;21792:4;21798:10;21810;21822;:8;:10::i;:::-;21771:11;:62::i;:::-;21712:121;;-1:-1:-1;21712:121:0;-1:-1:-1;21712:121:0;-1:-1:-1;21884:15:0;;-1:-1:-1;21901:4:0;;-1:-1:-1;21907:10:0;;-1:-1:-1;21919:10:0;-1:-1:-1;;;;21466:472:0;;;;;;;;;:::o;2776:346::-;2855:4;2904:6;2879:21;:31;;2871:73;;;;-1:-1:-1;;;2871:73:0;;17603:2:1;2871:73:0;;;17585:21:1;17642:2;17622:18;;;17615:30;17681:31;17661:18;;;17654:59;17730:18;;2871:73:0;17401:353:1;2871:73:0;3036:12;3054:9;-1:-1:-1;;;;;3054:14:0;3077:6;3054:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3035:54:0;;2776:346;-1:-1:-1;;;;;2776:346:0:o;28150:947::-;28209:12;28224:10;28233:1;28224:6;:10;:::i;:::-;28209:25;-1:-1:-1;28245:17:0;28265:13;28209:25;28265:6;:13;:::i;:::-;28374:16;;;28388:1;28374:16;;;;;;;;28245:33;;-1:-1:-1;28316:21:0;;28291:22;;28374:16;;;;;;;;;;-1:-1:-1;28374:16:0;28350:40;;28419:4;28401;28406:1;28401:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28401:23:0;;;:7;;;;;;;;;;:23;;;;28445:15;;:22;;;-1:-1:-1;;;28445:22:0;;;;:15;;;;;:20;;:22;;;;;28401:7;;28445:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28435:4;28440:1;28435:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28435:32:0;;;:7;;;;;;;;;:32;28480:15;;:207;;-1:-1:-1;;;28480:207:0;;:15;;;:66;;:207;;28561:4;;28480:15;;28624:4;;28651;;28671:15;;28480:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28708:18;28753:14;28729:21;:38;;;;:::i;:::-;28780:15;;28983:4;;28780:248;;-1:-1:-1;;;28780:248:0;;28853:4;28780:248;;;19551:34:1;19601:18;;;19594:34;;;28780:15:0;19644:18:1;;;19637:34;;;19687:18;;;19680:34;-1:-1:-1;;;;;28983:4:0;;;19730:19:1;;;19723:44;29002:15:0;19783:19:1;;;19776:35;28708:59:0;;-1:-1:-1;28780:15:0;;:31;;28708:59;;19485:19:1;;28780:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29046:43:0;;;11235:25:1;;;11291:2;11276:18;;11269:34;;;11319:18;;;11312:34;;;29046:43:0;;-1:-1:-1;11223:2:1;11208:18;29046:43:0;;;;;;;28198:899;;;;;28150:947;:::o;29105:755::-;29258:16;;;29272:1;29258:16;;;;;;;;29200:21;;29175:22;;29258:16;29272:1;29258:16;;;;;;;;;;-1:-1:-1;29258:16:0;29234:40;;29303:4;29285;29290:1;29285:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29285:23:0;;;:7;;;;;;;;;;:23;;;;29329:15;;:22;;;-1:-1:-1;;;29329:22:0;;;;:15;;;;;:20;;:22;;;;;29285:7;;29329:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29319:4;29324:1;29319:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29319:32:0;;;:7;;;;;;;;;:32;29364:15;;:214;;-1:-1:-1;;;29364:214:0;;:15;;;:66;;:214;;29445:11;;29364:15;;29515:4;;29542;;29562:15;;29364:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29591:18;29636:14;29612:21;:38;;;;:::i;:::-;29591:59;-1:-1:-1;29663:55:0;29714:3;29698:15;29591:59;29711:2;29698:15;:::i;:::-;:19;;;;:::i;:::-;29671:15;;-1:-1:-1;;;;;29671:15:0;;29663:34;:55::i;:::-;-1:-1:-1;29739:50:0;29785:3;29769:15;:10;29782:2;29769:15;:::i;:::-;:19;;;;:::i;:::-;29747:10;;-1:-1:-1;;;;;29747:10:0;;29739:29;:50::i;:::-;-1:-1:-1;29807:45:0;;;20307:25:1;;;20363:2;20348:18;;20341:34;;;29807:45:0;;20280:18:1;29807:45:0;;;;;;;29164:696;;;29105:755;:::o;30320:1117::-;-1:-1:-1;;;;;30419:27:0;;;;;;:19;:27;;;;;;;;;:75;;-1:-1:-1;;;;;;30464:30:0;;;;;;:19;:30;;;;;;;;30419:75;30415:406;;;30526:14;:12;:14::i;:::-;30415:406;;;30573:13;;-1:-1:-1;;;;;30560:26:0;;;30573:13;;30560:26;30557:264;;;30602:12;:10;:12::i;30557:264::-;30644:13;;-1:-1:-1;;;;;30634:23:0;;;30644:13;;30634:23;30631:190;;;30673:11;:9;:11::i;30631:190::-;30704:32;;-1:-1:-1;;;30704:32:0;;;;30701:120;;;30752:14;:12;:14::i;30701:120::-;30797:12;:10;:12::i;:::-;-1:-1:-1;;;;;30837:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;30861:22:0;;;;;;:11;:22;;;;;;;;30860:23;30837:46;30833:597;;;30900:48;30922:6;30930:9;30941:6;30900:21;:48::i;30833:597::-;-1:-1:-1;;;;;30971:19:0;;;;;;:11;:19;;;;;;;;30970:20;:46;;;;-1:-1:-1;;;;;;30994:22:0;;;;;;:11;:22;;;;;;;;30970:46;30966:464;;;31033:46;31053:6;31061:9;31072:6;31033:19;:46::i;30966:464::-;-1:-1:-1;;;;;31102:19:0;;;;;;:11;:19;;;;;;;;31101:20;:47;;;;-1:-1:-1;;;;;;31126:22:0;;;;;;:11;:22;;;;;;;;31125:23;31101:47;31097:333;;;31165:44;31183:6;31191:9;31202:6;31165:17;:44::i;31097:333::-;-1:-1:-1;;;;;31231:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;31254:22:0;;;;;;:11;:22;;;;;;;;31231:45;31227:203;;;31293:48;31315:6;31323:9;31334:6;31293:21;:48::i;31227:203::-;31374:44;31392:6;31400:9;31411:6;31374:17;:44::i;23053:552::-;23150:7;;23186;;23103;;;;;23210:283;23234:9;:16;23230:20;;23210:283;;;23300:7;23276;:21;23284:9;23294:1;23284:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23284:12:0;23276:21;;;;;;;;;;;;;:31;;:66;;;23335:7;23311;:21;23319:9;23329:1;23319:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23319:12:0;23311:21;;;;;;;;;;;;;:31;23276:66;23272:97;;;23352:7;;23361;;23344:25;;;;;;;23053:552;;:::o;23272:97::-;23404:7;:21;23412:9;23422:1;23412:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23412:12:0;23404:21;;;;;;;;;;;;;23394:31;;:7;:31;:::i;:::-;23384:41;;23460:7;:21;23468:9;23478:1;23468:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23468:12:0;23460:21;;;;;;;;;;;;;23450:31;;:7;:31;:::i;:::-;23440:41;-1:-1:-1;23252:3:0;;;;:::i;:::-;;;;23210:283;;;;23527:7;;23517;;:17;;;;:::i;:::-;23507:7;:27;23503:58;;;23544:7;;23553;;23536:25;;;;;;23053:552;;:::o;23503:58::-;23580:7;;23589;;-1:-1:-1;23053:552:0;-1:-1:-1;23053:552:0:o;21946:420::-;22006:7;22015;22024;22033;22053:12;22068:24;22084:7;22068:15;:24::i;:::-;22053:39;;22103:18;22124:30;22146:7;22124:21;:30::i;:::-;22103:51;;22165:18;22186:30;22208:7;22186:21;:30::i;:::-;22165:51;-1:-1:-1;22227:23:0;22165:51;22270:10;22253:14;22263:4;22253:7;:14;:::i;:::-;:27;;;;:::i;:::-;:40;;;;:::i;:::-;22227:66;22329:4;;-1:-1:-1;22335:10:0;;-1:-1:-1;22335:10:0;-1:-1:-1;21946:420:0;;-1:-1:-1;;;21946:420:0:o;22374:503::-;22509:7;;;;22565:21;22575:11;22565:7;:21;:::i;:::-;22547:39;-1:-1:-1;22597:12:0;22612:18;22619:11;22612:4;:18;:::i;:::-;22597:33;-1:-1:-1;22641:18:0;22662:24;22675:11;22662:10;:24;:::i;:::-;22641:45;-1:-1:-1;22697:18:0;22718:24;22731:11;22718:10;:24;:::i;:::-;22697:45;-1:-1:-1;22753:23:0;22697:45;22796:10;22779:14;22789:4;22779:7;:14;:::i;:::-;:27;;;;:::i;:::-;:40;;;;:::i;:::-;22838:7;;;;-1:-1:-1;22864:4:0;;-1:-1:-1;22374:503:0;;-1:-1:-1;;;;;;;;;22374:503:0:o;25140:206::-;25186:7;;:12;:34;;;;-1:-1:-1;25202:13:0;;:18;25186:34;:56;;;;-1:-1:-1;25224:13:0;;:18;25186:56;25183:68;;;25140:206::o;25183:68::-;25281:1;25271:7;:11;;;25293:13;:17;;;25321:13;:17;25140:206::o;25649:290::-;25703:12;;25692:7;;:23;:65;;;;;25737:18;;25719:13;;:38;25692:65;:104;;;;;25778:18;;25761:13;;:35;25692:104;25689:117;;;25649:290::o;25689:117::-;25828:12;;25818:7;:22;25867:18;;25851:13;:34;25912:18;;25896:13;:34;25649:290::o;25358:283::-;25411:11;;25400:7;;:22;:63;;;;;25444:17;;25426:13;;:37;25400:63;:101;;;;;25484:17;;25467:13;;:34;25400:101;25397:114;;;25358:283::o;25397:114::-;25533:11;;25523:7;:21;25571:17;;25555:13;:33;25615:17;;25599:13;:33;25358:283::o;32648:614::-;32751:15;32768:23;32793:12;32807:23;32832:12;32846:18;32866;32888:19;32899:7;32888:10;:19::i;:::-;32750:157;;;;;;;;;;;;;;32954:7;32936;:15;32944:6;-1:-1:-1;;;;;32936:15:0;-1:-1:-1;;;;;32936:15:0;;;;;;;;;;;;;:25;;;;:::i;:::-;-1:-1:-1;;;;;32918:15:0;;;;;;:7;:15;;;;;;;;:43;;;;32990:7;:15;;;;:25;;33008:7;;32990:25;:::i;:::-;-1:-1:-1;;;;;32972:15:0;;;;;;;:7;:15;;;;;;:43;;;;33047:18;;;;;;;:36;;33068:15;;33047:36;:::i;:::-;-1:-1:-1;;;;;33026:18:0;;;;;;:7;:18;;;;;:57;33095:26;33110:10;33095:14;:26::i;:::-;33134;33149:10;33134:14;:26::i;:::-;33171:23;33183:4;33189;33171:11;:23::i;:::-;33227:9;-1:-1:-1;;;;;33210:44:0;33219:6;-1:-1:-1;;;;;33210:44:0;;33238:15;33210:44;;;;1549:25:1;;1537:2;1522:18;;1403:177;33210:44:0;;;;;;;;32739:523;;;;;;;32648:614;;;:::o;32006:634::-;32107:15;32124:23;32149:12;32163:23;32188:12;32202:18;32222;32244:19;32255:7;32244:10;:19::i;:::-;32106:157;;;;;;;;;;;;;;32310:7;32292;:15;32300:6;-1:-1:-1;;;;;32292:15:0;-1:-1:-1;;;;;32292:15:0;;;;;;;;;;;;;:25;;;;:::i;:::-;-1:-1:-1;;;;;32274:15:0;;;;;;;:7;:15;;;;;;;;:43;;;;32349:18;;;;;:7;:18;;;;;:36;;32370:15;;32349:36;:::i;:::-;-1:-1:-1;;;;;32328:18:0;;;;;;:7;:18;;;;;;;;:57;;;;32417:7;:18;;;;:36;;32438:15;;32417:36;:::i;31445:553::-;31544:15;31561:23;31586:12;31600:23;31625:12;31639:18;31659;31681:19;31692:7;31681:10;:19::i;:::-;31543:157;;;;;;;;;;;;;;31747:7;31729;:15;31737:6;-1:-1:-1;;;;;31729:15:0;-1:-1:-1;;;;;31729:15:0;;;;;;;;;;;;;:25;;;;:::i;33270:687::-;33373:15;33390:23;33415:12;33429:23;33454:12;33468:18;33488;33510:19;33521:7;33510:10;:19::i;:::-;33372:157;;;;;;;;;;;;;;33576:7;33558;:15;33566:6;-1:-1:-1;;;;;33558:15:0;-1:-1:-1;;;;;33558:15:0;;;;;;;;;;;;;:25;;;;:::i;:::-;-1:-1:-1;;;;;33540:15:0;;;;;;:7;:15;;;;;;;;:43;;;;33612:7;:15;;;;:25;;33630:7;;33612:25;:::i;24718:122::-;24782:7;24829:3;24819:7;;24809;:17;;;;:::i;:::-;:23;;;;:::i;24848:134::-;24918:7;24971:3;24955:13;;24945:7;:23;;;;:::i;24994:134::-;25064:7;25117:3;25101:13;;25091:7;:23;;;;:::i;24298:408::-;24365:14;;24361:338;;24396:19;24419:10;:8;:10::i;:::-;24396:33;-1:-1:-1;24444:18:0;24465:24;24396:33;24465:10;:24;:::i;:::-;24545:4;24529:22;;;;:7;:22;;;;;;24444:45;;-1:-1:-1;24529:35:0;;24444:45;;24529:35;:::i;:::-;24520:4;24504:22;;;;:7;:22;;;;;;;;:60;;;;24582:11;:26;;;;;;24579:108;;;24668:4;24652:22;;;;:7;:22;;;;;;:35;;24677:10;;24652:35;:::i;:::-;24643:4;24627:22;;;;:7;:22;;;;;:60;24381:318;;24298:408;:::o;23617:673::-;23680:23;23764:1;23742:18;;23722:17;;:38;;;;:::i;:::-;:43;23718:202;;;23876:18;;23856:17;;:38;;;;:::i;:::-;23833:18;;23813:17;;:38;;;;:::i;:::-;23799:53;;:10;:53;:::i;:::-;:97;;;;:::i;:::-;23781:115;;23718:202;23935:19;;23932:351;;23970:19;23993:10;:8;:10::i;:::-;23970:33;-1:-1:-1;24018:18:0;24039:29;23970:33;24039:15;:29;:::i;:::-;24124:4;24108:22;;;;:7;:22;;;;;;24018:50;;-1:-1:-1;24108:35:0;;24018:50;;24108:35;:::i;:::-;24099:4;24083:22;;;;:7;:22;;;;;;;;:60;;;;24161:11;:26;;;;;;24158:113;;;24247:4;24231:22;;;;:7;:22;;;;;;:40;;24256:15;;24231:40;:::i;:::-;24222:4;24206:22;;;;:7;:22;;;;;:65;23955:328;;23669:621;23617:673;:::o;21317:141::-;21405:4;21395:7;;:14;;;;:::i;:::-;21385:7;:24;21433:10;;:17;;21446:4;;21433:17;:::i;:::-;21420:10;:30;-1:-1:-1;;21317:141:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:134;820:20;;849:31;820:20;849:31;:::i;:::-;752:134;;;:::o;891:315::-;959:6;967;1020:2;1008:9;999:7;995:23;991:32;988:52;;;1036:1;1033;1026:12;988:52;1075:9;1062:23;1094:31;1119:5;1094:31;:::i;:::-;1144:5;1196:2;1181:18;;;;1168:32;;-1:-1:-1;;;891:315:1:o;1820:456::-;1897:6;1905;1913;1966:2;1954:9;1945:7;1941:23;1937:32;1934:52;;;1982:1;1979;1972:12;1934:52;2021:9;2008:23;2040:31;2065:5;2040:31;:::i;:::-;2090:5;-1:-1:-1;2147:2:1;2132:18;;2119:32;2160:33;2119:32;2160:33;:::i;:::-;1820:456;;2212:7;;-1:-1:-1;;;2266:2:1;2251:18;;;;2238:32;;1820:456::o;2281:180::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;-1:-1:-1;2432:23:1;;2281:180;-1:-1:-1;2281:180:1:o;2655:247::-;2714:6;2767:2;2755:9;2746:7;2742:23;2738:32;2735:52;;;2783:1;2780;2773:12;2735:52;2822:9;2809:23;2841:31;2866:5;2841:31;:::i;2907:118::-;2993:5;2986:13;2979:21;2972:5;2969:32;2959:60;;3015:1;3012;3005:12;3030:309;3095:6;3103;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3208:9;3195:23;3185:33;;3268:2;3257:9;3253:18;3240:32;3281:28;3303:5;3281:28;:::i;:::-;3328:5;3318:15;;;3030:309;;;;;:::o;3552:241::-;3608:6;3661:2;3649:9;3640:7;3636:23;3632:32;3629:52;;;3677:1;3674;3667:12;3629:52;3716:9;3703:23;3735:28;3757:5;3735:28;:::i;3798:127::-;3859:10;3854:3;3850:20;3847:1;3840:31;3890:4;3887:1;3880:15;3914:4;3911:1;3904:15;3930:1121;4014:6;4045:2;4088;4076:9;4067:7;4063:23;4059:32;4056:52;;;4104:1;4101;4094:12;4056:52;4144:9;4131:23;4173:18;4214:2;4206:6;4203:14;4200:34;;;4230:1;4227;4220:12;4200:34;4268:6;4257:9;4253:22;4243:32;;4313:7;4306:4;4302:2;4298:13;4294:27;4284:55;;4335:1;4332;4325:12;4284:55;4371:2;4358:16;4393:2;4389;4386:10;4383:36;;;4399:18;;:::i;:::-;4445:2;4442:1;4438:10;4477:2;4471:9;4540:2;4536:7;4531:2;4527;4523:11;4519:25;4511:6;4507:38;4595:6;4583:10;4580:22;4575:2;4563:10;4560:18;4557:46;4554:72;;;4606:18;;:::i;:::-;4642:2;4635:22;4692:18;;;4726:15;;;;-1:-1:-1;4768:11:1;;;4764:20;;;4796:19;;;4793:39;;;4828:1;4825;4818:12;4793:39;4852:11;;;;4872:148;4888:6;4883:3;4880:15;4872:148;;;4954:23;4973:3;4954:23;:::i;:::-;4942:36;;4905:12;;;;4998;;;;4872:148;;;5039:6;3930:1121;-1:-1:-1;;;;;;;;3930:1121:1:o;5056:316::-;5133:6;5141;5149;5202:2;5190:9;5181:7;5177:23;5173:32;5170:52;;;5218:1;5215;5208:12;5170:52;-1:-1:-1;;5241:23:1;;;5311:2;5296:18;;5283:32;;-1:-1:-1;5362:2:1;5347:18;;;5334:32;;5056:316;-1:-1:-1;5056:316:1:o;5711:382::-;5776:6;5784;5837:2;5825:9;5816:7;5812:23;5808:32;5805:52;;;5853:1;5850;5843:12;5805:52;5892:9;5879:23;5911:31;5936:5;5911:31;:::i;:::-;5961:5;-1:-1:-1;6018:2:1;6003:18;;5990:32;6031:30;5990:32;6031:30;:::i;6098:388::-;6166:6;6174;6227:2;6215:9;6206:7;6202:23;6198:32;6195:52;;;6243:1;6240;6233:12;6195:52;6282:9;6269:23;6301:31;6326:5;6301:31;:::i;:::-;6351:5;-1:-1:-1;6408:2:1;6393:18;;6380:32;6421:33;6380:32;6421:33;:::i;6491:380::-;6570:1;6566:12;;;;6613;;;6634:61;;6688:4;6680:6;6676:17;6666:27;;6634:61;6741:2;6733:6;6730:14;6710:18;6707:38;6704:161;;;6787:10;6782:3;6778:20;6775:1;6768:31;6822:4;6819:1;6812:15;6850:4;6847:1;6840:15;6704:161;;6491:380;;;:::o;6876:127::-;6937:10;6932:3;6928:20;6925:1;6918:31;6968:4;6965:1;6958:15;6992:4;6989:1;6982:15;7008:125;7048:4;7076:1;7073;7070:8;7067:34;;;7081:18;;:::i;:::-;-1:-1:-1;7118:9:1;;7008:125::o;7549:217::-;7589:1;7615;7605:132;;7659:10;7654:3;7650:20;7647:1;7640:31;7694:4;7691:1;7684:15;7722:4;7719:1;7712:15;7605:132;-1:-1:-1;7751:9:1;;7549:217::o;7771:356::-;7973:2;7955:21;;;7992:18;;;7985:30;8051:34;8046:2;8031:18;;8024:62;8118:2;8103:18;;7771:356::o;8488:127::-;8549:10;8544:3;8540:20;8537:1;8530:31;8580:4;8577:1;8570:15;8604:4;8601:1;8594:15;8620:127;8681:10;8676:3;8672:20;8669:1;8662:31;8712:4;8709:1;8702:15;8736:4;8733:1;8726:15;8752:135;8791:3;-1:-1:-1;;8812:17:1;;8809:43;;;8832:18;;:::i;:::-;-1:-1:-1;8879:1:1;8868:13;;8752:135::o;8892:128::-;8932:3;8963:1;8959:6;8956:1;8953:13;8950:39;;;8969:18;;:::i;:::-;-1:-1:-1;9005:9:1;;8892:128::o;11357:184::-;11427:6;11480:2;11468:9;11459:7;11455:23;11451:32;11448:52;;;11496:1;11493;11486:12;11448:52;-1:-1:-1;11519:16:1;;11357:184;-1:-1:-1;11357:184:1:o;12168:245::-;12235:6;12288:2;12276:9;12267:7;12263:23;12259:32;12256:52;;;12304:1;12301;12294:12;12256:52;12336:9;12330:16;12355:28;12377:5;12355:28;:::i;17228:168::-;17268:7;17334:1;17330;17326:6;17322:14;17319:1;17316:21;17311:1;17304:9;17297:17;17293:45;17290:71;;;17341:18;;:::i;:::-;-1:-1:-1;17381:9:1;;17228:168::o;17969:251::-;18039:6;18092:2;18080:9;18071:7;18067:23;18063:32;18060:52;;;18108:1;18105;18098:12;18060:52;18140:9;18134:16;18159:31;18184:5;18159:31;:::i;18225:980::-;18487:4;18535:3;18524:9;18520:19;18566:6;18555:9;18548:25;18592:2;18630:6;18625:2;18614:9;18610:18;18603:34;18673:3;18668:2;18657:9;18653:18;18646:31;18697:6;18732;18726:13;18763:6;18755;18748:22;18801:3;18790:9;18786:19;18779:26;;18840:2;18832:6;18828:15;18814:29;;18861:1;18871:195;18885:6;18882:1;18879:13;18871:195;;;18950:13;;-1:-1:-1;;;;;18946:39:1;18934:52;;19041:15;;;;19006:12;;;;18982:1;18900:9;18871:195;;;-1:-1:-1;;;;;;;19122:32:1;;;;19117:2;19102:18;;19095:60;-1:-1:-1;;;19186:3:1;19171:19;19164:35;19083:3;18225:980;-1:-1:-1;;;18225:980:1:o;19822:306::-;19910:6;19918;19926;19979:2;19967:9;19958:7;19954:23;19950:32;19947:52;;;19995:1;19992;19985:12;19947:52;20024:9;20018:16;20008:26;;20074:2;20063:9;20059:18;20053:25;20043:35;;20118:2;20107:9;20103:18;20097:25;20087:35;;19822:306;;;;;:::o

Swarm Source

ipfs://ae2538bd9cad965b31dacfd04bf2cfed4e780d2c41bf293fc8fd360256b9ba90
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.