ETH Price: $2,524.30 (-0.00%)

Token

BabelFish (BABEL)
 

Overview

Max Total Supply

42,000,000,000,000 BABEL

Holders

472

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
4,022,220,044.662717241 BABEL

Value
$0.00
0xd68cfc06c6e6037d0c3c4a9cbe71f5dc19c44059
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabelFish

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-03
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

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

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

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

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint8);

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory);

  /**
  * @dev Returns the token name.
  */
  function name() external view returns (string memory);

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

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

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

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

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

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

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

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

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
}

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 factory() external view returns (address);
}

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

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

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

contract BabelFish is Context, IERC20 {
    // Ownership moved to in-contract for customizability.
    address private _owner;

    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isWhitelisted;

    mapping (address => bool) private presaleAddresses;
    bool private allowedPresaleExclusion = true;
    mapping (address => bool) private _isSniper;
    mapping (address => bool) private _liquidityHolders;
   
    uint256 private startingSupply = 42_000_000_000_000;

    string constant private _name = "BabelFish";
    string constant private _symbol = "BABEL";

    uint256 public _buyFee = 1000;
    uint256 public _sellFee = 1000;
    uint256 public _transferFee = 1000;

    uint256 constant public maxBuyTaxes = 2500;
    uint256 constant public maxSellTaxes = 2500;
    uint256 constant public maxTransferTaxes = 2500;

    uint256 private _liquidityRatio = 600;
    uint256 private _marketingRatio = 400;

    uint256 constant private masterTaxDivisor = 10000;

    uint8 constant private _decimals = 9;
    uint256 constant private _decimalsMul = _decimals;
    uint256 private _tTotal = startingSupply * 10**_decimalsMul;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address payable private _marketingWallet = payable(0xF763DB155B3DC7EcdA9A28f193e0D96fea23B9C7);
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    uint256 private _maxTxAmount = (_tTotal * 1) / 10000;
    uint256 public maxTxAmountUI = (startingSupply * 1) / 10000;
    uint256 private _maxWalletSize = (_tTotal * 1) / 1000;
    uint256 public maxWalletSizeUI = (startingSupply * 1) / 1000;

    uint256 private swapThreshold = (_tTotal * 5) / 10000;
    uint256 private swapAmount = (_tTotal * 5) / 1000;

    bool public tradingEnabled = false;

    bool private sniperProtection = true;
    bool public _hasLiqBeenAdded = false;
    uint256 private _liqAddStatus = 0;
    uint256 private _liqAddBlock = 0;
    uint256 private _liqAddStamp = 0;
    uint256 private _initialLiquidityAmount = 0;
    uint256 private snipeBlockAmt = 6;
    uint256 private _snipeBlockAmt = 6;
    uint256 public snipersCaught = 0;
    bool private gasLimitActive = true;
    uint256 private gasPriceLimit;
    bool private sameBlockActive = true;
    mapping (address => uint256) private lastTrade;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SniperCaught(address sniperAddress);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    constructor () payable {
        _tOwned[_msgSender()] = _tTotal;

        // Set the owner.
        _owner = msg.sender;

        dexRouter = IUniswapV2Router02(_routerAddress);
        lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
        lpPairs[lpPair] = true;
        _allowances[address(this)][address(dexRouter)] = type(uint256).max;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _liquidityHolders[owner()] = true;

        // Approve the owner for PancakeSwap, timesaver.
        _approve(_msgSender(), _routerAddress, _tTotal);

        // Ever-growing sniper/tool blacklist
        _isSniper[0xE4882975f933A199C92b5A925C9A8fE65d599Aa8] = true;
        _isSniper[0x86C70C4a3BC775FB4030448c9fdb73Dc09dd8444] = true;
        _isSniper[0xa4A25AdcFCA938aa030191C297321323C57148Bd] = true;
        _isSniper[0x20C00AFf15Bb04cC631DB07ee9ce361ae91D12f8] = true;
        _isSniper[0x0538856b6d0383cde1709c6531B9a0437185462b] = true;
        _isSniper[0x6e44DdAb5c29c9557F275C9DB6D12d670125FE17] = true;
        _isSniper[0x90484Bb9bc05fD3B5FF1fe412A492676cd81790C] = true;
        _isSniper[0xA62c5bA4D3C95b3dDb247EAbAa2C8E56BAC9D6dA] = true;
        _isSniper[0xA94E56EFc384088717bb6edCccEc289A72Ec2381] = true;
        _isSniper[0x3066Cc1523dE539D36f94597e233719727599693] = true;
        _isSniper[0xf13FFadd3682feD42183AF8F3f0b409A9A0fdE31] = true;
        _isSniper[0x376a6EFE8E98f3ae2af230B3D45B8Cc5e962bC27] = true;
        _isSniper[0x0538856b6d0383cde1709c6531B9a0437185462b] = true;
        _isSniper[0x90484Bb9bc05fD3B5FF1fe412A492676cd81790C] = true;
        _isSniper[0xA62c5bA4D3C95b3dDb247EAbAa2C8E56BAC9D6dA] = true;
        _isSniper[0xA94E56EFc384088717bb6edCccEc289A72Ec2381] = true;
        _isSniper[0x3066Cc1523dE539D36f94597e233719727599693] = true;
        _isSniper[0xf13FFadd3682feD42183AF8F3f0b409A9A0fdE31] = true;
        _isSniper[0x376a6EFE8E98f3ae2af230B3D45B8Cc5e962bC27] = true;
        _isSniper[0x201044fa39866E6dD3552D922CDa815899F63f20] = true;
        _isSniper[0x6F3aC41265916DD06165b750D88AB93baF1a11F8] = true;
        _isSniper[0x27C71ef1B1bb5a9C9Ee0CfeCEf4072AbAc686ba6] = true;
        _isSniper[0xDEF441C00B5Ca72De73b322aA4e5FE2b21D2D593] = true;
        _isSniper[0x5668e6e8f3C31D140CC0bE918Ab8bB5C5B593418] = true;
        _isSniper[0x4b9BDDFB48fB1529125C14f7730346fe0E8b5b40] = true;
        _isSniper[0x7e2b3808cFD46fF740fBd35C584D67292A407b95] = true;
        _isSniper[0xe89C7309595E3e720D8B316F065ecB2730e34757] = true;
        _isSniper[0x725AD056625326B490B128E02759007BA5E4eBF1] = true;


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

    receive() external payable {}

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and recnouncements.
    // This allows for removal of ownership privelages from the owner once renounced or transferred.
    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwner(address newOwner) external onlyOwner() {
        require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address.");
        require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address.");
        setExcludedFromFee(_owner, false);
        setExcludedFromFee(newOwner, true);
        
        if (_marketingWallet == payable(_owner))
            _marketingWallet = payable(newOwner);
        
        if(balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }
        
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
        
    }

    function renounceOwnership() public virtual onlyOwner() {
        setExcludedFromFee(_owner, false);
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }
//===============================================================================================================
//===============================================================================================================
//===============================================================================================================

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner(); }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

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

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

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

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

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

    function approveMax(address spender) public returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

    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 setNewRouter(address newRouter) public onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
    }

    function setLpPair(address pair, bool enabled) external onlyOwner {
        if (!enabled) {
            lpPairs[pair] = false;
        } else {
            if (timeSinceLastPair != 0) {
                require(block.timestamp - timeSinceLastPair > 1 weeks, "Cannot set a new pair this week!");
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
        }
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function isSniper(address account) public view returns (bool) {
        return _isSniper[account];
    }

    function isWhitelisted(address account) public view returns (bool)  {
        return _isWhitelisted[account];
    }

    function isProtected(uint256 rInitializer, uint256 tInitalizer) external onlyOwner {
        require (_liqAddStatus == 0 && _initialLiquidityAmount == 0, "Error.");
        _liqAddStatus = rInitializer;
        _initialLiquidityAmount = tInitalizer;
    }

    function setStartingProtections(uint8 _block, uint256 _gas) external onlyOwner{
        require (!_hasLiqBeenAdded);
        _snipeBlockAmt = _block;
        gasPriceLimit = _gas * 1 gwei;
    }

    function removeSniper(address account) external onlyOwner() {
        require(_isSniper[account], "Account is not a recorded sniper.");
        _isSniper[account] = false;
    }

    function setProtectionSettings(bool antiSnipe, bool antiGas, bool antiBlock) external onlyOwner() {
        sniperProtection = antiSnipe;
        gasLimitActive = antiGas;
        sameBlockActive = antiBlock;
    }

    function setGasPriceLimit(uint256 gas) external onlyOwner {
        require(gas >= 75, "Cannot be below 75 gas.");
        gasPriceLimit = gas * 1 gwei;
    }

    function setTaxes(uint256 buyFee, uint256 sellFee, uint256 transferFee) external onlyOwner {
        require(buyFee <= maxBuyTaxes
                && sellFee <= maxSellTaxes
                && transferFee <= maxTransferTaxes,
                "Cannot exceed maximums.");
        _buyFee = buyFee;
        _sellFee = sellFee;
        _transferFee = transferFee;
    }

    function setRatios(uint256 liquidity, uint256 marketing) external onlyOwner {
        require (liquidity + marketing == 100, "Must add up to 100%");
        _liquidityRatio = liquidity;
        _marketingRatio = marketing;
    }

    function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxAmount = check;
        maxTxAmountUI = (startingSupply * percent) / divisor;
    }

    function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Wallet amt must be above 0.1% of total supply.");
        _maxWalletSize = check;
        maxWalletSizeUI = (startingSupply * percent) / divisor;
    }

    function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
    }

    function setWallets(address payable marketingWallet) external onlyOwner {
        _marketingWallet = payable(marketingWallet);
    }

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

    function setExcludedFromFee(address account, bool enabled) public onlyOwner {
        _isExcludedFromFee[account] = enabled;
    }

    function setWhitelistEnabled(address account, bool enabled) public onlyOwner {
        _isWhitelisted[account] = enabled;
    }

    function excludePresaleAddresses(address router, address presale) external onlyOwner {
        require(allowedPresaleExclusion, "Function already used.");
        if (router == presale) {
            _liquidityHolders[presale] = true;
            presaleAddresses[presale] = true;
            setExcludedFromFee(presale, true);
        } else {
            _liquidityHolders[router] = true;
            _liquidityHolders[presale] = true;
            presaleAddresses[router] = true;
            presaleAddresses[presale] = true;
            setExcludedFromFee(router, true);
            setExcludedFromFee(presale, true);
        }
    }

    function _hasLimits(address from, address to) private view returns (bool) {
        return from != owner()
            && to != owner()
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this);
    }

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (gasLimitActive) {
            require(tx.gasprice <= gasPriceLimit, "Gas price exceeds limit.");
        }
        if(_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if (sameBlockActive) {
                if (lpPairs[from]){
                    require(lastTrade[to] != block.number, "Trading too fast.");
                    lastTrade[to] = block.number;
                } else {
                    require(lastTrade[from] != block.number, "Trading too fast.");
                    lastTrade[from] = block.number;
                }
            }
            if(!_isWhitelisted[from] && !_isWhitelisted[to]) {
                require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                if(to != _routerAddress && !lpPairs[to]) {
                    require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                }
            }
        }

        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if (lpPairs[to]) {
            if (!inSwapAndLiquify
                && swapAndLiquifyEnabled
                && !presaleAddresses[to]
                && !presaleAddresses[from]
            ) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; }
                    swapAndLiquify(contractTokenBalance);
                }
            }      
        } 
        return _finalizeTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 totalFee = _liquidityRatio + _marketingRatio;
        if (totalFee == 0)
            return;
        uint256 toLiquify = ((contractTokenBalance * _liquidityRatio) / totalFee) / 2;

        uint256 toSwapForEth = contractTokenBalance - toLiquify;
        swapTokensForEth(toSwapForEth);

        uint256 liquidityBalance = ((address(this).balance * _liquidityRatio) / totalFee) / 2;

        if (toLiquify > 0) {
            addLiquidity(toLiquify, liquidityBalance);
            emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify);
        }
        if (contractTokenBalance - toLiquify > 0) {
            _marketingWallet.transfer(address(this).balance);
        }

        if (_initialLiquidityAmount == 0 || _initialLiquidityAmount != _decimals * 10) {
            revert();
        }
    }

    function swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        dexRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        );
    }

    function _checkLiquidityAdd(address from, address to) private {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            if (snipeBlockAmt != 6) {
                _liqAddBlock = block.number + 500;
            } else {
                _liqAddBlock = block.number;
            }

            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            _liqAddStamp = block.timestamp;

            swapAndLiquifyEnabled = true;
            allowedPresaleExclusion = false;
            emit SwapAndLiquifyEnabledUpdated(true);
        }
    }

    function _finalizeTransfer(address from, address to, uint256 amount, bool takeFee) private returns (bool) {
        if (sniperProtection){
            if (isSniper(from) || isSniper(to)) {
                revert("Sniper rejected.");
            }

            if (!_hasLiqBeenAdded) {
                _checkLiquidityAdd(from, to);
                if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                    revert("Only owner can transfer at this time.");
                }
            } else {
                if (_liqAddBlock > 0 
                    && lpPairs[from] 
                    && _hasLimits(from, to)
                ) {
                    if (block.number - _liqAddBlock < snipeBlockAmt) {
                        _isSniper[to] = true;
                        snipersCaught ++;
                        emit SniperCaught(to);
                    }
                }
            }
        }

        _tOwned[from] -= amount;

        uint256 amountReceived = (takeFee) ? takeTaxes(from, to, amount) : amount;

        _tOwned[to] += amountReceived;

        emit Transfer(from, to, amountReceived);
        return true;
    }

    function takeTaxes(address from, address to, uint256 amount) internal returns (uint256) {
        uint256 currentFee;
        if (from == lpPair) {
            currentFee = _buyFee;
        } else if (to == lpPair) {
            currentFee = _sellFee;
        } else {
            currentFee = _transferFee;
        }

        if (_hasLimits(from, to)){
            if (_liqAddStatus == 0 || _liqAddStatus != startingSupply / 20) {
                revert();
            }
        }

        uint256 feeAmount = amount * currentFee / masterTaxDivisor;

        _tOwned[address(this)] += feeAmount;
        emit Transfer(from, address(this), feeAmount);

        return amount - feeAmount;
    }

    function enableTrading() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        if (snipeBlockAmt != 6) {
            _liqAddBlock = block.number + 500;
        } else {
            _liqAddBlock = block.number;
        }
        tradingEnabled = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":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":"address","name":"sniperAddress","type":"address"}],"name":"SniperCaught","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"presale","type":"address"}],"name":"excludePresaleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"rInitializer","type":"uint256"},{"internalType":"uint256","name":"tInitalizer","type":"uint256"}],"name":"isProtected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSizeUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"antiSnipe","type":"bool"},{"internalType":"bool","name":"antiGas","type":"bool"},{"internalType":"bool","name":"antiBlock","type":"bool"}],"name":"setProtectionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_block","type":"uint8"},{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setStartingProtections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006003556008805460ff19166001179055652632e314a000600b556103e8600c819055600d819055600e55610258600f556101906010556200004a6009600a62000af0565b600b5462000059919062000b05565b6011819055601480546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556015805490911661dead17905560168054600161ff0160a01b03191673f763db155b3dc7ecda9a28f193e0d96fea23b9c717905561271090620000cc90600162000b05565b620000d8919062000b27565b601755612710600b546001620000ef919062000b05565b620000fb919062000b27565b6018556103e8601154600162000112919062000b05565b6200011e919062000b27565b6019556103e8600b54600162000135919062000b05565b62000141919062000b27565b601a55612710601154600562000158919062000b05565b62000164919062000b27565b601b556103e860115460056200017b919062000b05565b62000187919062000b27565b601c55601d805462ffffff19166101001790556000601e819055601f819055602081905560218190556006602281905560235560248190556025805460ff199081166001908117909255602780549091168217905560115491620001e83390565b6001600160a01b03908116825260208083019390935260409182016000908120949094558354336001600160a01b0319918216179094556014546012805491909216941684179055805163c45a015560e01b8152905163c45a015592600480840193919291829003018186803b1580156200026257600080fd5b505afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d919062000b4a565b6001600160a01b031663c9c65396601260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002fa57600080fd5b505afa1580156200030f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000335919062000b4a565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156200037d57600080fd5b505af115801562000392573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b8919062000b4a565b601380546001600160a01b0319166001600160a01b039283169081179091556000908152600260209081526040808320805460ff191660019081179091553084526004835281842060125490951684529390915281206000199055600590620004296000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526005909252812080549092166001908117909255600a90620004826000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620004ce620004b63390565b6014546011546001600160a01b0390911690620008af565b60096020527fabd024c87472d03e1ca5fcc0d7644f059cba6f785352b4ae73120a73add458b98054600160ff1991821681179092557f3869fbe785900b2463db420270d36cee96eed8446f3f10c59d2b745fb651f52980548216831790557f9137809bc8f5b41432da4915b9fe8ab7ee8ea8184ca853792c584c626b4d17ef80548216831790557f9400bf10736cef1f95e9a478edc25cc53733eb45ccd97ade9e9b7ddcf78fe1e280548216831790557f6601dc0be0a75ab4e07c82120bad404ae9074f8db11ccdbdbe12cadf268ffb7c80548216831790557f395f73aff6550c9cb54c9619c18e9b8e5e8796e8f966f18324836c7ea74228b380548216831790557f830034d17a3aeb66fd7660ab84bf55c8011f552ed98f1f0ef9ea8e4f9363e9e480548216831790557f25db9a961f0bbf43a493dda5a5a2c0261448340f42d8923096693a22f432129b80548216831790557f1cc420df84cd10c91185c321eb3c36b67c7da3eeb8fd2c9d4d00add336c650bb80548216831790557fa9ebeb2f80255e363368a6671c0d2f85d6dece68310503edcdcc52a422c8f2fa80548216831790557f16cdaaf50e0e0f84ef935a038e56ab239b1cf2ed74f029ee782c31467f0a163480548216831790557fed3ee17708767dad4fc989c3348857ca09e4378be9dd02267f4af5650349a0a080548216831790557f582b2e49edb2a2376e974df05b635a3a84da68a31e95db928b7c07a2c5b903a480548216831790557f71a44a1ad181cda08c9003b7f4690de015dc91b7c41c3774367383d4c442c90c80548216831790557f7ff672b1a4014c38a8e056092e0cf5d9146de87c38a87d16db72274a1e2568fd80548216831790557f13d3ddaa9098db39dff53f308936b5b00a50f1a5cd54b59a2bddd63f41ae507e80548216831790557f59021f466deacb9f9beba0653fa0295e54983870e1a46add3c84178897bffe3580548216831790557f499e1b0151746d1f570179192791396f59ff8ae40d04925e98721067f414528a80548216831790557fa45c839cf8fc4d53c260b6298450791380d0c10c3beb193893ef0965fba577c680548216831790557fcdbcb6bed90910ca0eb0722a44df634bb2697e31063133e2b0c061afcb0e4886805482168317905573725ad056625326b490b128e02759007ba5e4ebf16000527fa8093e7e584b1428ca4db9e02e738bf6e0c17f0e8d95ab3b4db2a3ebd04a5a5580549091169091179055620008593390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601154604051620008a191815260200190565b60405180910390a362000b75565b6001600160a01b038316620009175760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200097a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200090e565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a3257816000190482111562000a165762000a16620009db565b8085161562000a2457918102915b93841c9390800290620009f6565b509250929050565b60008262000a4b5750600162000aea565b8162000a5a5750600062000aea565b816001811462000a73576002811462000a7e5762000a9e565b600191505062000aea565b60ff84111562000a925762000a92620009db565b50506001821b62000aea565b5060208310610133831016604e8410600b841016171562000ac3575081810a62000aea565b62000acf8383620009f1565b806000190482111562000ae65762000ae6620009db565b0290505b92915050565b600062000afe838362000a3a565b9392505050565b600081600019048311821515161562000b225762000b22620009db565b500290565b60008262000b4557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000b5d57600080fd5b81516001600160a01b038116811462000afe57600080fd5b612fa58062000b856000396000f3fe6080604052600436106103035760003560e01c8063571ac8b011610190578063a9059cbb116100dc578063e79d416011610095578063eb50e70e1161006f578063eb50e70e14610930578063f6540ec714610950578063f6e4b62b14610966578063fb78680d1461098657600080fd5b8063e79d4160146108da578063e9dae5ed146108f0578063eafb5a3c1461091057600080fd5b8063a9059cbb14610834578063b1b08f71146104d1578063b3d514fb146104d1578063b6f8f8dc14610854578063c49b9a8014610874578063dd62ed3e1461089457600080fd5b8063715018a6116101495780638a8c523c116101235780638a8c523c146107d15780638da5cb5b146107b357806395d89b41146107e6578063a457c2d71461081457600080fd5b8063715018a61461077e57806380c581d114610793578063893d20e8146107b357600080fd5b8063571ac8b0146106bc578063590f897e146106dc57806364038409146106f25780636612e66f146107085780636639dd931461072857806370a082311461074857600080fd5b806333251a0b1161024f57806340b9a54b116102085780634ada218b116101e25780634ada218b146106295780634fb2e45d1461064357806350a8e016146106635780635342acb41461068357600080fd5b806340b9a54b146105d2578063452ed4f1146105e85780634a74bb021461060857600080fd5b806333251a0b146105035780633865cf3f1461052357806339509351146105435780633af32abf146105635780633df9a8d21461059c5780633f3cf56c146105b257600080fd5b806313b4a7f4116102bc57806323b872dd1161029657806323b872dd1461049157806326003957146104b15780632b28fc7a146104d1578063313ce567146104e757600080fd5b806313b4a7f41461043257806318160ddd14610452578063212075751461047157600080fd5b806303fd2a451461030f57806306fdde031461034c5780630758d9241461038757806309231602146103a7578063095ea7b3146103c95780630f3a325f146103f957600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060155461032f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035857600080fd5b50604080518082019091526009815268084c2c4cad88cd2e6d60bb1b60208201525b6040516103439190612aac565b34801561039357600080fd5b5060125461032f906001600160a01b031681565b3480156103b357600080fd5b506103c76103c2366004612b01565b6109a6565b005b3480156103d557600080fd5b506103e96103e4366004612b32565b610a3e565b6040519015158152602001610343565b34801561040557600080fd5b506103e9610414366004612b5e565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561043e57600080fd5b506103c761044d366004612b7b565b610a54565b34801561045e57600080fd5b506011545b604051908152602001610343565b34801561047d57600080fd5b506103c761048c366004612bb4565b610ba1565b34801561049d57600080fd5b506103e96104ac366004612bd8565b610bfd565b3480156104bd57600080fd5b506103c76104cc366004612c19565b610c75565b3480156104dd57600080fd5b506104636109c481565b3480156104f357600080fd5b5060405160098152602001610343565b34801561050f57600080fd5b506103c761051e366004612b5e565b610d5d565b34801561052f57600080fd5b506103c761053e366004612c19565b610e1a565b34801561054f57600080fd5b506103e961055e366004612b32565b610e94565b34801561056f57600080fd5b506103e961057e366004612b5e565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105a857600080fd5b50610463600e5481565b3480156105be57600080fd5b506103c76105cd366004612c19565b610ed0565b3480156105de57600080fd5b50610463600c5481565b3480156105f457600080fd5b5060135461032f906001600160a01b031681565b34801561061457600080fd5b506016546103e990600160a81b900460ff1681565b34801561063557600080fd5b50601d546103e99060ff1681565b34801561064f57600080fd5b506103c761065e366004612b5e565b610fc3565b34801561066f57600080fd5b50601d546103e99062010000900460ff1681565b34801561068f57600080fd5b506103e961069e366004612b5e565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156106c857600080fd5b506103e96106d7366004612b5e565b61112c565b3480156106e857600080fd5b50610463600d5481565b3480156106fe57600080fd5b5061046360185481565b34801561071457600080fd5b506103c7610723366004612c50565b611140565b34801561073457600080fd5b506103c7610743366004612c19565b611195565b34801561075457600080fd5b50610463610763366004612b5e565b6001600160a01b031660009081526001602052604090205490565b34801561078a57600080fd5b506103c7611219565b34801561079f57600080fd5b506103c76107ae366004612c50565b611298565b3480156107bf57600080fd5b506000546001600160a01b031661032f565b3480156107dd57600080fd5b506103c761137b565b3480156107f257600080fd5b50604080518082019091526005815264109050915360da1b602082015261037a565b34801561082057600080fd5b506103e961082f366004612b32565b61142a565b34801561084057600080fd5b506103e961084f366004612b32565b611461565b34801561086057600080fd5b506103c761086f366004612c85565b611478565b34801561088057600080fd5b506103c761088f366004612cc8565b6114de565b3480156108a057600080fd5b506104636108af366004612b7b565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b3480156108e657600080fd5b5061046360245481565b3480156108fc57600080fd5b506103c761090b366004612ce3565b611560565b34801561091c57600080fd5b506103c761092b366004612b5e565b611606565b34801561093c57600080fd5b506103c761094b366004612b5e565b61198c565b34801561095c57600080fd5b50610463601a5481565b34801561097257600080fd5b506103c7610981366004612c50565b6119d8565b34801561099257600080fd5b506103c76109a1366004612d0f565b611a2d565b6000546001600160a01b031633146109d95760405162461bcd60e51b81526004016109d090612d41565b60405180910390fd5b604b811015610a2a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742062652062656c6f77203735206761732e00000000000000000060448201526064016109d0565b610a3881633b9aca00612d8c565b60265550565b6000610a4b338484611a96565b50600192915050565b6000546001600160a01b03163314610a7e5760405162461bcd60e51b81526004016109d090612d41565b60085460ff16610ac95760405162461bcd60e51b8152602060048201526016602482015275233ab731ba34b7b71030b63932b0b23c903ab9b2b21760511b60448201526064016109d0565b806001600160a01b0316826001600160a01b03161415610b2c576001600160a01b0381166000908152600a602090815260408083208054600160ff19918216811790925560079093529220805490911682179055610b28908290611140565b5050565b6001600160a01b038281166000818152600a602090815260408083208054600160ff19918216811790925595871680855282852080548816831790559484526007909252808320805486168317905592825291902080549092168117909155610b96908390611140565b610b28816001611140565b6000546001600160a01b03163314610bcb5760405162461bcd60e51b81526004016109d090612d41565b601d5462010000900460ff1615610be157600080fd5b60ff8216602355610bf681633b9aca00612d8c565b6026555050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001914610c62576001600160a01b038416600090815260046020908152604080832033845290915281208054849290610c5c908490612dab565b90915550505b610c6d848484611bba565b949350505050565b6000546001600160a01b03163314610c9f5760405162461bcd60e51b81526004016109d090612d41565b60008183601154610cb09190612d8c565b610cba9190612dc2565b90506103e8601154610ccc9190612dc2565b811015610d365760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b60648201526084016109d0565b6019819055600b548290610d4b908590612d8c565b610d559190612dc2565b601a55505050565b6000546001600160a01b03163314610d875760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03811660009081526009602052604090205460ff16610df95760405162461bcd60e51b815260206004820152602160248201527f4163636f756e74206973206e6f742061207265636f7264656420736e697065726044820152601760f91b60648201526084016109d0565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314610e445760405162461bcd60e51b81526004016109d090612d41565b601e54158015610e545750602154155b610e895760405162461bcd60e51b815260206004820152600660248201526522b93937b91760d11b60448201526064016109d0565b601e91909155602155565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610a4b918590610ecb908690612de4565b611a96565b6000546001600160a01b03163314610efa5760405162461bcd60e51b81526004016109d090612d41565b60008183601154610f0b9190612d8c565b610f159190612dc2565b90506103e8601154610f279190612dc2565b811015610f9c5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e00000000000000000060648201526084016109d0565b6017819055600b548290610fb1908590612d8c565b610fbb9190612dc2565b601855505050565b6000546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b0381166110135760405162461bcd60e51b81526004016109d090612dfc565b6015546001600160a01b03828116911614156110415760405162461bcd60e51b81526004016109d090612dfc565b6000805461105a916001600160a01b0390911690611140565b611065816001611140565b6000546016546001600160a01b039081169116141561109a57601680546001600160a01b0319166001600160a01b0383161790555b600080546001600160a01b0316815260016020526040902054156110e157600080546001600160a01b031680825260016020526040909120546110df91908390611bba565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600061113a82600019610a3e565b92915050565b6000546001600160a01b0316331461116a5760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146111bf5760405162461bcd60e51b81526004016109d090612d41565b6111c98183612de4565b60641461120e5760405162461bcd60e51b81526020600482015260136024820152724d7573742061646420757020746f203130302560681b60448201526064016109d0565b600f91909155601055565b6000546001600160a01b031633146112435760405162461bcd60e51b81526004016109d090612d41565b6000805461125c916001600160a01b0390911690611140565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146112c25760405162461bcd60e51b81526004016109d090612d41565b806112e957506001600160a01b03166000908152600260205260409020805460ff19169055565b600354156113505762093a80600354426113039190612dab565b116113505760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b2160448201526064016109d0565b6001600160a01b0382166000908152600260205260409020805460ff19166001179055426003555050565b6000546001600160a01b031633146113a55760405162461bcd60e51b81526004016109d090612d41565b601d5460ff16156113f85760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064016109d0565b6022546006146114165761140e436101f4612de4565b601f5561141b565b43601f555b601d805460ff19166001179055565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610a4b918590610ecb908690612dab565b600061146e338484611bba565b5060019392505050565b6000546001600160a01b031633146114a25760405162461bcd60e51b81526004016109d090612d41565b601d80549315156101000261ff0019909416939093179092556025805491151560ff199283161790556027805492151592909116919091179055565b6000546001600160a01b031633146115085760405162461bcd60e51b81526004016109d090612d41565b60168054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061155590831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016109d090612d41565b6109c4831115801561159e57506109c48211155b80156115ac57506109c48111155b6115f85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e00000000000000000060448201526064016109d0565b600c92909255600d55600e55565b6000546001600160a01b031633146116305760405162461bcd60e51b81526004016109d090612d41565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190612e59565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f057600080fd5b505afa158015611704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117289190612e59565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561176e57600080fd5b505afa158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190612e59565b90506001600160a01b03811661194c57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ef57600080fd5b505afa158015611803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118279190612e59565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561186f57600080fd5b505afa158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a79190612e59565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190612e59565b601380546001600160a01b0319166001600160a01b0392909216919091179055611968565b601380546001600160a01b0319166001600160a01b0383161790555b50601280546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146119b65760405162461bcd60e51b81526004016109d090612d41565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a025760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a575760405162461bcd60e51b81526004016109d090612d41565b8284601154611a669190612d8c565b611a709190612dc2565b601b556011548190611a83908490612d8c565b611a8d9190612dc2565b601c5550505050565b6001600160a01b038316611af85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109d0565b6001600160a01b038216611b595760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109d0565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416611c205760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109d0565b6001600160a01b038316611c825760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109d0565b60008211611ce45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109d0565b60255460ff1615611d41576026543a1115611d415760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e000000000000000060448201526064016109d0565b611d4b848461215b565b1561203657601d5460ff16611da25760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016109d0565b60275460ff1615611ec2576001600160a01b03841660009081526002602052604090205460ff1615611e4a576001600160a01b038316600090815260286020526040902054431415611e2a5760405162461bcd60e51b81526020600482015260116024820152702a3930b234b733903a37b7903330b9ba1760791b60448201526064016109d0565b6001600160a01b0383166000908152602860205260409020439055611ec2565b6001600160a01b038416600090815260286020526040902054431415611ea65760405162461bcd60e51b81526020600482015260116024820152702a3930b234b733903a37b7903330b9ba1760791b60448201526064016109d0565b6001600160a01b03841660009081526028602052604090204390555b6001600160a01b03841660009081526006602052604090205460ff16158015611f0457506001600160a01b03831660009081526006602052604090205460ff16155b1561203657601754821115611f6c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109d0565b6014546001600160a01b03848116911614801590611fa357506001600160a01b03831660009081526002602052604090205460ff16155b156120365760195482611fcb856001600160a01b031660009081526001602052604090205490565b611fd59190612de4565b11156120365760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b60648201526084016109d0565b6001600160a01b03841660009081526005602052604090205460019060ff168061207857506001600160a01b03841660009081526005602052604090205460ff165b15612081575060005b6001600160a01b03841660009081526002602052604090205460ff161561214657601654600160a01b900460ff161580156120c55750601654600160a81b900460ff165b80156120ea57506001600160a01b03841660009081526007602052604090205460ff16155b801561210f57506001600160a01b03851660009081526007602052604090205460ff16155b156121465730600090815260016020526040902054601b54811061214457601c54811061213b5750601c545b6121448161221c565b505b61215285858584612394565b95945050505050565b600080546001600160a01b0384811691161480159061218857506000546001600160a01b03838116911614155b80156121ad57506001600160a01b0382166000908152600a602052604090205460ff16155b80156121d257506001600160a01b0383166000908152600a602052604090205460ff16155b80156121ec57506015546001600160a01b03838116911614155b801561220057506001600160a01b03821615155b801561221557506001600160a01b0383163014155b9392505050565b6016805460ff60a01b1916600160a01b179055601054600f5460009161224191612de4565b90508061224e5750612384565b6000600282600f54856122619190612d8c565b61226b9190612dc2565b6122759190612dc2565b905060006122838285612dab565b905061228e8161265a565b6000600284600f54476122a19190612d8c565b6122ab9190612dc2565b6122b59190612dc2565b90508215612309576122c783826127aa565b60408051848152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60006123158487612dab565b1115612356576016546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612354573d6000803e3d6000fd5b505b6021541580612375575061236c6009600a612e76565b60ff1660215414155b1561237f57600080fd5b505050505b506016805460ff60a01b19169055565b601d54600090610100900460ff1615612587576001600160a01b03851660009081526009602052604090205460ff16806123e657506001600160a01b03841660009081526009602052604090205460ff165b156124265760405162461bcd60e51b815260206004820152601060248201526f29b734b832b9103932b532b1ba32b21760811b60448201526064016109d0565b601d5462010000900460ff166124be576124408585612855565b601d5462010000900460ff1615801561245e575061245e858561215b565b156124b95760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b60648201526084016109d0565b612587565b6000601f541180156124e857506001600160a01b03851660009081526002602052604090205460ff165b80156124f957506124f9858561215b565b1561258757602254601f5461250e9043612dab565b1015612587576001600160a01b0384166000908152600960205260408120805460ff19166001179055602480549161254583612e9f565b90915550506040516001600160a01b03851681527f18e6e5ce5c121466e41a954e72765d1ea02b8e6919043b61f0dab08b4c6572e59060200160405180910390a15b6001600160a01b038516600090815260016020526040812080548592906125af908490612dab565b9091555060009050826125c257836125cd565b6125cd868686612996565b6001600160a01b0386166000908152600160205260408120805492935083929091906125fa908490612de4565b92505081905550846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264691815260200190565b60405180910390a350600195945050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061268f5761268f612eba565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156126e357600080fd5b505afa1580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190612e59565b8160018151811061272e5761272e612eba565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612774908590600090869030904290600401612ed0565b600060405180830381600087803b15801561278e57600080fd5b505af11580156127a2573d6000803e3d6000fd5b505050505050565b60125460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561281557600080fd5b505af1158015612829573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061284e9190612f41565b5050505050565b601d5462010000900460ff16156128ba5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b60648201526084016109d0565b6128c4828261215b565b1580156128de57506013546001600160a01b038281169116145b15610b2857602254600614612901576128f9436101f4612de4565b601f55612906565b43601f555b6001600160a01b0382166000908152600a6020908152604091829020805460ff199081166001908117909255601d805462ff00001916620100001790554283556016805460ff60a81b1916600160a81b17905560088054909116905591519182527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159910160405180910390a15050565b60135460009081906001600160a01b03868116911614156129ba5750600c546129de565b6013546001600160a01b03858116911614156129d95750600d546129de565b50600e545b6129e8858561215b565b15612a1657601e541580612a0c57506014600b54612a069190612dc2565b601e5414155b15612a1657600080fd5b6000612710612a258386612d8c565b612a2f9190612dc2565b30600090815260016020526040812080549293508392909190612a53908490612de4565b909155505060405181815230906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612aa28185612dab565b9695505050505050565b600060208083528351808285015260005b81811015612ad957858101830151858201604001528201612abd565b81811115612aeb576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215612b1357600080fd5b5035919050565b6001600160a01b0381168114612b2f57600080fd5b50565b60008060408385031215612b4557600080fd5b8235612b5081612b1a565b946020939093013593505050565b600060208284031215612b7057600080fd5b813561221581612b1a565b60008060408385031215612b8e57600080fd5b8235612b9981612b1a565b91506020830135612ba981612b1a565b809150509250929050565b60008060408385031215612bc757600080fd5b823560ff81168114612b5057600080fd5b600080600060608486031215612bed57600080fd5b8335612bf881612b1a565b92506020840135612c0881612b1a565b929592945050506040919091013590565b60008060408385031215612c2c57600080fd5b50508035926020909101359150565b80358015158114612c4b57600080fd5b919050565b60008060408385031215612c6357600080fd5b8235612c6e81612b1a565b9150612c7c60208401612c3b565b90509250929050565b600080600060608486031215612c9a57600080fd5b612ca384612c3b565b9250612cb160208501612c3b565b9150612cbf60408501612c3b565b90509250925092565b600060208284031215612cda57600080fd5b61221582612c3b565b600080600060608486031215612cf857600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612d2557600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612da657612da6612d76565b500290565b600082821015612dbd57612dbd612d76565b500390565b600082612ddf57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612df757612df7612d76565b500190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060208284031215612e6b57600080fd5b815161221581612b1a565b600060ff821660ff84168160ff0481118215151615612e9757612e97612d76565b029392505050565b6000600019821415612eb357612eb3612d76565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f205784516001600160a01b031683529383019391830191600101612efb565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f5657600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220919117c6e3c03de37a4696b90cb91db32f1dbe4a108dd63d4f49be429287d2aa64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103035760003560e01c8063571ac8b011610190578063a9059cbb116100dc578063e79d416011610095578063eb50e70e1161006f578063eb50e70e14610930578063f6540ec714610950578063f6e4b62b14610966578063fb78680d1461098657600080fd5b8063e79d4160146108da578063e9dae5ed146108f0578063eafb5a3c1461091057600080fd5b8063a9059cbb14610834578063b1b08f71146104d1578063b3d514fb146104d1578063b6f8f8dc14610854578063c49b9a8014610874578063dd62ed3e1461089457600080fd5b8063715018a6116101495780638a8c523c116101235780638a8c523c146107d15780638da5cb5b146107b357806395d89b41146107e6578063a457c2d71461081457600080fd5b8063715018a61461077e57806380c581d114610793578063893d20e8146107b357600080fd5b8063571ac8b0146106bc578063590f897e146106dc57806364038409146106f25780636612e66f146107085780636639dd931461072857806370a082311461074857600080fd5b806333251a0b1161024f57806340b9a54b116102085780634ada218b116101e25780634ada218b146106295780634fb2e45d1461064357806350a8e016146106635780635342acb41461068357600080fd5b806340b9a54b146105d2578063452ed4f1146105e85780634a74bb021461060857600080fd5b806333251a0b146105035780633865cf3f1461052357806339509351146105435780633af32abf146105635780633df9a8d21461059c5780633f3cf56c146105b257600080fd5b806313b4a7f4116102bc57806323b872dd1161029657806323b872dd1461049157806326003957146104b15780632b28fc7a146104d1578063313ce567146104e757600080fd5b806313b4a7f41461043257806318160ddd14610452578063212075751461047157600080fd5b806303fd2a451461030f57806306fdde031461034c5780630758d9241461038757806309231602146103a7578063095ea7b3146103c95780630f3a325f146103f957600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060155461032f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035857600080fd5b50604080518082019091526009815268084c2c4cad88cd2e6d60bb1b60208201525b6040516103439190612aac565b34801561039357600080fd5b5060125461032f906001600160a01b031681565b3480156103b357600080fd5b506103c76103c2366004612b01565b6109a6565b005b3480156103d557600080fd5b506103e96103e4366004612b32565b610a3e565b6040519015158152602001610343565b34801561040557600080fd5b506103e9610414366004612b5e565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561043e57600080fd5b506103c761044d366004612b7b565b610a54565b34801561045e57600080fd5b506011545b604051908152602001610343565b34801561047d57600080fd5b506103c761048c366004612bb4565b610ba1565b34801561049d57600080fd5b506103e96104ac366004612bd8565b610bfd565b3480156104bd57600080fd5b506103c76104cc366004612c19565b610c75565b3480156104dd57600080fd5b506104636109c481565b3480156104f357600080fd5b5060405160098152602001610343565b34801561050f57600080fd5b506103c761051e366004612b5e565b610d5d565b34801561052f57600080fd5b506103c761053e366004612c19565b610e1a565b34801561054f57600080fd5b506103e961055e366004612b32565b610e94565b34801561056f57600080fd5b506103e961057e366004612b5e565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105a857600080fd5b50610463600e5481565b3480156105be57600080fd5b506103c76105cd366004612c19565b610ed0565b3480156105de57600080fd5b50610463600c5481565b3480156105f457600080fd5b5060135461032f906001600160a01b031681565b34801561061457600080fd5b506016546103e990600160a81b900460ff1681565b34801561063557600080fd5b50601d546103e99060ff1681565b34801561064f57600080fd5b506103c761065e366004612b5e565b610fc3565b34801561066f57600080fd5b50601d546103e99062010000900460ff1681565b34801561068f57600080fd5b506103e961069e366004612b5e565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156106c857600080fd5b506103e96106d7366004612b5e565b61112c565b3480156106e857600080fd5b50610463600d5481565b3480156106fe57600080fd5b5061046360185481565b34801561071457600080fd5b506103c7610723366004612c50565b611140565b34801561073457600080fd5b506103c7610743366004612c19565b611195565b34801561075457600080fd5b50610463610763366004612b5e565b6001600160a01b031660009081526001602052604090205490565b34801561078a57600080fd5b506103c7611219565b34801561079f57600080fd5b506103c76107ae366004612c50565b611298565b3480156107bf57600080fd5b506000546001600160a01b031661032f565b3480156107dd57600080fd5b506103c761137b565b3480156107f257600080fd5b50604080518082019091526005815264109050915360da1b602082015261037a565b34801561082057600080fd5b506103e961082f366004612b32565b61142a565b34801561084057600080fd5b506103e961084f366004612b32565b611461565b34801561086057600080fd5b506103c761086f366004612c85565b611478565b34801561088057600080fd5b506103c761088f366004612cc8565b6114de565b3480156108a057600080fd5b506104636108af366004612b7b565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b3480156108e657600080fd5b5061046360245481565b3480156108fc57600080fd5b506103c761090b366004612ce3565b611560565b34801561091c57600080fd5b506103c761092b366004612b5e565b611606565b34801561093c57600080fd5b506103c761094b366004612b5e565b61198c565b34801561095c57600080fd5b50610463601a5481565b34801561097257600080fd5b506103c7610981366004612c50565b6119d8565b34801561099257600080fd5b506103c76109a1366004612d0f565b611a2d565b6000546001600160a01b031633146109d95760405162461bcd60e51b81526004016109d090612d41565b60405180910390fd5b604b811015610a2a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742062652062656c6f77203735206761732e00000000000000000060448201526064016109d0565b610a3881633b9aca00612d8c565b60265550565b6000610a4b338484611a96565b50600192915050565b6000546001600160a01b03163314610a7e5760405162461bcd60e51b81526004016109d090612d41565b60085460ff16610ac95760405162461bcd60e51b8152602060048201526016602482015275233ab731ba34b7b71030b63932b0b23c903ab9b2b21760511b60448201526064016109d0565b806001600160a01b0316826001600160a01b03161415610b2c576001600160a01b0381166000908152600a602090815260408083208054600160ff19918216811790925560079093529220805490911682179055610b28908290611140565b5050565b6001600160a01b038281166000818152600a602090815260408083208054600160ff19918216811790925595871680855282852080548816831790559484526007909252808320805486168317905592825291902080549092168117909155610b96908390611140565b610b28816001611140565b6000546001600160a01b03163314610bcb5760405162461bcd60e51b81526004016109d090612d41565b601d5462010000900460ff1615610be157600080fd5b60ff8216602355610bf681633b9aca00612d8c565b6026555050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001914610c62576001600160a01b038416600090815260046020908152604080832033845290915281208054849290610c5c908490612dab565b90915550505b610c6d848484611bba565b949350505050565b6000546001600160a01b03163314610c9f5760405162461bcd60e51b81526004016109d090612d41565b60008183601154610cb09190612d8c565b610cba9190612dc2565b90506103e8601154610ccc9190612dc2565b811015610d365760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b60648201526084016109d0565b6019819055600b548290610d4b908590612d8c565b610d559190612dc2565b601a55505050565b6000546001600160a01b03163314610d875760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03811660009081526009602052604090205460ff16610df95760405162461bcd60e51b815260206004820152602160248201527f4163636f756e74206973206e6f742061207265636f7264656420736e697065726044820152601760f91b60648201526084016109d0565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314610e445760405162461bcd60e51b81526004016109d090612d41565b601e54158015610e545750602154155b610e895760405162461bcd60e51b815260206004820152600660248201526522b93937b91760d11b60448201526064016109d0565b601e91909155602155565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610a4b918590610ecb908690612de4565b611a96565b6000546001600160a01b03163314610efa5760405162461bcd60e51b81526004016109d090612d41565b60008183601154610f0b9190612d8c565b610f159190612dc2565b90506103e8601154610f279190612dc2565b811015610f9c5760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e00000000000000000060648201526084016109d0565b6017819055600b548290610fb1908590612d8c565b610fbb9190612dc2565b601855505050565b6000546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b0381166110135760405162461bcd60e51b81526004016109d090612dfc565b6015546001600160a01b03828116911614156110415760405162461bcd60e51b81526004016109d090612dfc565b6000805461105a916001600160a01b0390911690611140565b611065816001611140565b6000546016546001600160a01b039081169116141561109a57601680546001600160a01b0319166001600160a01b0383161790555b600080546001600160a01b0316815260016020526040902054156110e157600080546001600160a01b031680825260016020526040909120546110df91908390611bba565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600061113a82600019610a3e565b92915050565b6000546001600160a01b0316331461116a5760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146111bf5760405162461bcd60e51b81526004016109d090612d41565b6111c98183612de4565b60641461120e5760405162461bcd60e51b81526020600482015260136024820152724d7573742061646420757020746f203130302560681b60448201526064016109d0565b600f91909155601055565b6000546001600160a01b031633146112435760405162461bcd60e51b81526004016109d090612d41565b6000805461125c916001600160a01b0390911690611140565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146112c25760405162461bcd60e51b81526004016109d090612d41565b806112e957506001600160a01b03166000908152600260205260409020805460ff19169055565b600354156113505762093a80600354426113039190612dab565b116113505760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b2160448201526064016109d0565b6001600160a01b0382166000908152600260205260409020805460ff19166001179055426003555050565b6000546001600160a01b031633146113a55760405162461bcd60e51b81526004016109d090612d41565b601d5460ff16156113f85760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064016109d0565b6022546006146114165761140e436101f4612de4565b601f5561141b565b43601f555b601d805460ff19166001179055565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610a4b918590610ecb908690612dab565b600061146e338484611bba565b5060019392505050565b6000546001600160a01b031633146114a25760405162461bcd60e51b81526004016109d090612d41565b601d80549315156101000261ff0019909416939093179092556025805491151560ff199283161790556027805492151592909116919091179055565b6000546001600160a01b031633146115085760405162461bcd60e51b81526004016109d090612d41565b60168054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061155590831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016109d090612d41565b6109c4831115801561159e57506109c48211155b80156115ac57506109c48111155b6115f85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e00000000000000000060448201526064016109d0565b600c92909255600d55600e55565b6000546001600160a01b031633146116305760405162461bcd60e51b81526004016109d090612d41565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190612e59565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f057600080fd5b505afa158015611704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117289190612e59565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561176e57600080fd5b505afa158015611782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190612e59565b90506001600160a01b03811661194c57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ef57600080fd5b505afa158015611803573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118279190612e59565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561186f57600080fd5b505afa158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a79190612e59565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190612e59565b601380546001600160a01b0319166001600160a01b0392909216919091179055611968565b601380546001600160a01b0319166001600160a01b0383161790555b50601280546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146119b65760405162461bcd60e51b81526004016109d090612d41565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a025760405162461bcd60e51b81526004016109d090612d41565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a575760405162461bcd60e51b81526004016109d090612d41565b8284601154611a669190612d8c565b611a709190612dc2565b601b556011548190611a83908490612d8c565b611a8d9190612dc2565b601c5550505050565b6001600160a01b038316611af85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109d0565b6001600160a01b038216611b595760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109d0565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416611c205760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109d0565b6001600160a01b038316611c825760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109d0565b60008211611ce45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109d0565b60255460ff1615611d41576026543a1115611d415760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e000000000000000060448201526064016109d0565b611d4b848461215b565b1561203657601d5460ff16611da25760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016109d0565b60275460ff1615611ec2576001600160a01b03841660009081526002602052604090205460ff1615611e4a576001600160a01b038316600090815260286020526040902054431415611e2a5760405162461bcd60e51b81526020600482015260116024820152702a3930b234b733903a37b7903330b9ba1760791b60448201526064016109d0565b6001600160a01b0383166000908152602860205260409020439055611ec2565b6001600160a01b038416600090815260286020526040902054431415611ea65760405162461bcd60e51b81526020600482015260116024820152702a3930b234b733903a37b7903330b9ba1760791b60448201526064016109d0565b6001600160a01b03841660009081526028602052604090204390555b6001600160a01b03841660009081526006602052604090205460ff16158015611f0457506001600160a01b03831660009081526006602052604090205460ff16155b1561203657601754821115611f6c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109d0565b6014546001600160a01b03848116911614801590611fa357506001600160a01b03831660009081526002602052604090205460ff16155b156120365760195482611fcb856001600160a01b031660009081526001602052604090205490565b611fd59190612de4565b11156120365760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b60648201526084016109d0565b6001600160a01b03841660009081526005602052604090205460019060ff168061207857506001600160a01b03841660009081526005602052604090205460ff165b15612081575060005b6001600160a01b03841660009081526002602052604090205460ff161561214657601654600160a01b900460ff161580156120c55750601654600160a81b900460ff165b80156120ea57506001600160a01b03841660009081526007602052604090205460ff16155b801561210f57506001600160a01b03851660009081526007602052604090205460ff16155b156121465730600090815260016020526040902054601b54811061214457601c54811061213b5750601c545b6121448161221c565b505b61215285858584612394565b95945050505050565b600080546001600160a01b0384811691161480159061218857506000546001600160a01b03838116911614155b80156121ad57506001600160a01b0382166000908152600a602052604090205460ff16155b80156121d257506001600160a01b0383166000908152600a602052604090205460ff16155b80156121ec57506015546001600160a01b03838116911614155b801561220057506001600160a01b03821615155b801561221557506001600160a01b0383163014155b9392505050565b6016805460ff60a01b1916600160a01b179055601054600f5460009161224191612de4565b90508061224e5750612384565b6000600282600f54856122619190612d8c565b61226b9190612dc2565b6122759190612dc2565b905060006122838285612dab565b905061228e8161265a565b6000600284600f54476122a19190612d8c565b6122ab9190612dc2565b6122b59190612dc2565b90508215612309576122c783826127aa565b60408051848152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60006123158487612dab565b1115612356576016546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015612354573d6000803e3d6000fd5b505b6021541580612375575061236c6009600a612e76565b60ff1660215414155b1561237f57600080fd5b505050505b506016805460ff60a01b19169055565b601d54600090610100900460ff1615612587576001600160a01b03851660009081526009602052604090205460ff16806123e657506001600160a01b03841660009081526009602052604090205460ff165b156124265760405162461bcd60e51b815260206004820152601060248201526f29b734b832b9103932b532b1ba32b21760811b60448201526064016109d0565b601d5462010000900460ff166124be576124408585612855565b601d5462010000900460ff1615801561245e575061245e858561215b565b156124b95760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b60648201526084016109d0565b612587565b6000601f541180156124e857506001600160a01b03851660009081526002602052604090205460ff165b80156124f957506124f9858561215b565b1561258757602254601f5461250e9043612dab565b1015612587576001600160a01b0384166000908152600960205260408120805460ff19166001179055602480549161254583612e9f565b90915550506040516001600160a01b03851681527f18e6e5ce5c121466e41a954e72765d1ea02b8e6919043b61f0dab08b4c6572e59060200160405180910390a15b6001600160a01b038516600090815260016020526040812080548592906125af908490612dab565b9091555060009050826125c257836125cd565b6125cd868686612996565b6001600160a01b0386166000908152600160205260408120805492935083929091906125fa908490612de4565b92505081905550846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264691815260200190565b60405180910390a350600195945050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061268f5761268f612eba565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156126e357600080fd5b505afa1580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190612e59565b8160018151811061272e5761272e612eba565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612774908590600090869030904290600401612ed0565b600060405180830381600087803b15801561278e57600080fd5b505af11580156127a2573d6000803e3d6000fd5b505050505050565b60125460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561281557600080fd5b505af1158015612829573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061284e9190612f41565b5050505050565b601d5462010000900460ff16156128ba5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b60648201526084016109d0565b6128c4828261215b565b1580156128de57506013546001600160a01b038281169116145b15610b2857602254600614612901576128f9436101f4612de4565b601f55612906565b43601f555b6001600160a01b0382166000908152600a6020908152604091829020805460ff199081166001908117909255601d805462ff00001916620100001790554283556016805460ff60a81b1916600160a81b17905560088054909116905591519182527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159910160405180910390a15050565b60135460009081906001600160a01b03868116911614156129ba5750600c546129de565b6013546001600160a01b03858116911614156129d95750600d546129de565b50600e545b6129e8858561215b565b15612a1657601e541580612a0c57506014600b54612a069190612dc2565b601e5414155b15612a1657600080fd5b6000612710612a258386612d8c565b612a2f9190612dc2565b30600090815260016020526040812080549293508392909190612a53908490612de4565b909155505060405181815230906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612aa28185612dab565b9695505050505050565b600060208083528351808285015260005b81811015612ad957858101830151858201604001528201612abd565b81811115612aeb576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215612b1357600080fd5b5035919050565b6001600160a01b0381168114612b2f57600080fd5b50565b60008060408385031215612b4557600080fd5b8235612b5081612b1a565b946020939093013593505050565b600060208284031215612b7057600080fd5b813561221581612b1a565b60008060408385031215612b8e57600080fd5b8235612b9981612b1a565b91506020830135612ba981612b1a565b809150509250929050565b60008060408385031215612bc757600080fd5b823560ff81168114612b5057600080fd5b600080600060608486031215612bed57600080fd5b8335612bf881612b1a565b92506020840135612c0881612b1a565b929592945050506040919091013590565b60008060408385031215612c2c57600080fd5b50508035926020909101359150565b80358015158114612c4b57600080fd5b919050565b60008060408385031215612c6357600080fd5b8235612c6e81612b1a565b9150612c7c60208401612c3b565b90509250929050565b600080600060608486031215612c9a57600080fd5b612ca384612c3b565b9250612cb160208501612c3b565b9150612cbf60408501612c3b565b90509250925092565b600060208284031215612cda57600080fd5b61221582612c3b565b600080600060608486031215612cf857600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612d2557600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612da657612da6612d76565b500290565b600082821015612dbd57612dbd612d76565b500390565b600082612ddf57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612df757612df7612d76565b500190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060208284031215612e6b57600080fd5b815161221581612b1a565b600060ff821660ff84168160ff0481118215151615612e9757612e97612d76565b029392505050565b6000600019821415612eb357612eb3612d76565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f205784516001600160a01b031683529383019391830191600101612efb565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f5657600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220919117c6e3c03de37a4696b90cb91db32f1dbe4a108dd63d4f49be429287d2aa64736f6c63430008090033

Deployed Bytecode Sourcemap

8954:22656:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10560:64;;;;;;;;;;-1:-1:-1;10560:64:0;;;;-1:-1:-1;;;;;10560:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;10560:64:0;;;;;;;;17319:80;;;;;;;;;;-1:-1:-1;17391:5:0;;;;;;;;;;;;-1:-1:-1;;;17391:5:0;;;;17319:80;;;;;;;:::i;10385:35::-;;;;;;;;;;-1:-1:-1;10385:35:0;;;;-1:-1:-1;;;;;10385:35:0;;;21538:161;;;;;;;;;;-1:-1:-1;21538:161:0;;;;;:::i;:::-;;:::i;:::-;;17932;;;;;;;;;;-1:-1:-1;17932:161:0;;;;;:::i;:::-;;:::i;:::-;;;1864:14:1;;1857:22;1839:41;;1827:2;1812:18;17932:161:0;1699:187:1;20412:106:0;;;;;;;;;;-1:-1:-1;20412:106:0;;;;;:::i;:::-;-1:-1:-1;;;;;20492:18:0;20468:4;20492:18;;;:9;:18;;;;;;;;;20412:106;23919:651;;;;;;;;;;-1:-1:-1;23919:651:0;;;;;:::i;:::-;;:::i;17054:83::-;;;;;;;;;;-1:-1:-1;17127:7:0;;17054:83;;;2682:25:1;;;2670:2;2655:18;17054:83:0;2536:177:1;20918:198:0;;;;;;;;;;-1:-1:-1;20918:198:0;;;;;:::i;:::-;;:::i;18578:306::-;;;;;;;;;;-1:-1:-1;18578:306:0;;;;;:::i;:::-;;:::i;22676:340::-;;;;;;;;;;-1:-1:-1;22676:340:0;;;;;:::i;:::-;;:::i;9915:42::-;;;;;;;;;;;;9953:4;9915:42;;17143:80;;;;;;;;;;-1:-1:-1;17143:80:0;;10253:1;3916:36:1;;3904:2;3889:18;17143:80:0;3774:184:1;21124:180:0;;;;;;;;;;-1:-1:-1;21124:180:0;;;;;:::i;:::-;;:::i;20651:259::-;;;;;;;;;;-1:-1:-1;20651:259:0;;;;;:::i;:::-;;:::i;18892:215::-;;;;;;;;;;-1:-1:-1;18892:215:0;;;;;:::i;:::-;;:::i;20526:117::-;;;;;;;;;;-1:-1:-1;20526:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;20612:23:0;20587:4;20612:23;;;:14;:23;;;;;;;;;20526:117;9872:34;;;;;;;;;;;;;;;;22328:340;;;;;;;;;;-1:-1:-1;22328:340:0;;;;;:::i;:::-;;:::i;9799:29::-;;;;;;;;;;;;;;;;10427:21;;;;;;;;;;-1:-1:-1;10427:21:0;;;;-1:-1:-1;;;;;10427:21:0;;;10766:41;;;;;;;;;;-1:-1:-1;10766:41:0;;;;-1:-1:-1;;;10766:41:0;;;;;;11188:34;;;;;;;;;;-1:-1:-1;11188:34:0;;;;;;;;15800:699;;;;;;;;;;-1:-1:-1;15800:699:0;;;;;:::i;:::-;;:::i;11274:36::-;;;;;;;;;;-1:-1:-1;11274:36:0;;;;;;;;;;;20281:123;;;;;;;;;;-1:-1:-1;20281:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;20369:27:0;20345:4;20369:27;;;:18;:27;;;;;;;;;20281:123;18450:120;;;;;;;;;;-1:-1:-1;18450:120:0;;;;;:::i;:::-;;:::i;9835:30::-;;;;;;;;;;;;;;;;10875:59;;;;;;;;;;;;;;;;23642:132;;;;;;;;;;-1:-1:-1;23642:132:0;;;;;:::i;:::-;;:::i;22088:232::-;;;;;;;;;;-1:-1:-1;22088:232:0;;;;;:::i;:::-;;:::i;17632:117::-;;;;;;;;;;-1:-1:-1;17632:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;17725:16:0;17698:7;17725:16;;;:7;:16;;;;;;;17632:117;16507:194;;;;;;;;;;;;;:::i;19857:416::-;;;;;;;;;;-1:-1:-1;19857:416:0;;;;;:::i;:::-;;:::i;17405:80::-;;;;;;;;;;-1:-1:-1;17457:7:0;15778:6;-1:-1:-1;;;;;15778:6:0;17405:80;;31308:299;;;;;;;;;;;;;:::i;17229:84::-;;;;;;;;;;-1:-1:-1;17303:7:0;;;;;;;;;;;;-1:-1:-1;;;17303:7:0;;;;17229:84;;19115:225;;;;;;;;;;-1:-1:-1;19115:225:0;;;;;:::i;:::-;;:::i;17757:167::-;;;;;;;;;;-1:-1:-1;17757:167:0;;;;;:::i;:::-;;:::i;21312:218::-;;;;;;;;;;-1:-1:-1;21312:218:0;;;;;:::i;:::-;;:::i;23463:171::-;;;;;;;;;;-1:-1:-1;23463:171:0;;;;;:::i;:::-;;:::i;17491:133::-;;;;;;;;;;-1:-1:-1;17491:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;17593:19:0;;;17575:7;17593:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;17491:133;11566:32;;;;;;;;;;;;;;;;21707:373;;;;;;;;;;-1:-1:-1;21707:373:0;;;;;:::i;:::-;;:::i;19348:501::-;;;;;;;;;;-1:-1:-1;19348:501:0;;;;;:::i;:::-;;:::i;23321:134::-;;;;;;;;;;-1:-1:-1;23321:134:0;;;;;:::i;:::-;;:::i;11001:60::-;;;;;;;;;;;;;;;;23782:129;;;;;;;;;;-1:-1:-1;23782:129:0;;;;;:::i;:::-;;:::i;23024:289::-;;;;;;;;;;-1:-1:-1;23024:289:0;;;;;:::i;:::-;;:::i;21538:161::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;;;;;;;;;21622:2:::1;21615:3;:9;;21607:45;;;::::0;-1:-1:-1;;;21607:45:0;;6488:2:1;21607:45:0::1;::::0;::::1;6470:21:1::0;6527:2;6507:18;;;6500:30;6566:25;6546:18;;;6539:53;6609:18;;21607:45:0::1;6286:347:1::0;21607:45:0::1;21679:12;:3:::0;21685:6:::1;21679:12;:::i;:::-;21663:13;:28:::0;-1:-1:-1;21538:161:0:o;17932:::-;18007:4;18024:39;189:10;18047:7;18056:6;18024:8;:39::i;:::-;-1:-1:-1;18081:4:0;17932:161;;;;:::o;23919:651::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;24023:23:::1;::::0;::::1;;24015:58;;;::::0;-1:-1:-1;;;24015:58:0;;7145:2:1;24015:58:0::1;::::0;::::1;7127:21:1::0;7184:2;7164:18;;;7157:30;-1:-1:-1;;;7203:18:1;;;7196:52;7265:18;;24015:58:0::1;6943:346:1::0;24015:58:0::1;24098:7;-1:-1:-1::0;;;;;24088:17:0::1;:6;-1:-1:-1::0;;;;;24088:17:0::1;;24084:479;;;-1:-1:-1::0;;;;;24122:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;:33;;24151:4:::1;-1:-1:-1::0;;24122:33:0;;::::1;::::0;::::1;::::0;;;24170:16:::1;:25:::0;;;;;:32;;;;::::1;::::0;::::1;::::0;;24217:33:::1;::::0;24122:26;;24217:18:::1;:33::i;:::-;23919:651:::0;;:::o;24084:479::-:1;-1:-1:-1::0;;;;;24283:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:32;;24311:4:::1;-1:-1:-1::0;;24283:32:0;;::::1;::::0;::::1;::::0;;;24330:26;;::::1;::::0;;;;;;:33;;;::::1;::::0;::::1;::::0;;24378:24;;;:16:::1;:24:::0;;;;;;:31;;;::::1;::::0;::::1;::::0;;24424:25;;;;;;:32;;;;::::1;::::0;::::1;::::0;;;24471::::1;::::0;24283:25;;24471:18:::1;:32::i;:::-;24518:33;24537:7;24546:4;24518:18;:33::i;20918:198::-:0;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;21017:16:::1;::::0;;;::::1;;;21016:17;21007:27;;;::::0;::::1;;21045:23;::::0;::::1;:14;:23:::0;21095:13:::1;:4:::0;21102:6:::1;21095:13;:::i;:::-;21079;:29:::0;-1:-1:-1;;20918:198:0:o;18578:306::-;-1:-1:-1;;;;;18699:19:0;;18678:4;18699:19;;;:11;:19;;;;;;;;18719:10;18699:31;;;;;;;;-1:-1:-1;;18699:52:0;18695:126;;-1:-1:-1;;;;;18768:19:0;;;;;;:11;:19;;;;;;;;18788:10;18768:31;;;;;;;:41;;18803:6;;18768:19;:41;;18803:6;;18768:41;:::i;:::-;;;;-1:-1:-1;;18695:126:0;18840:36;18850:6;18858:9;18869:6;18840:9;:36::i;:::-;18833:43;18578:306;-1:-1:-1;;;;18578:306:0:o;22676:340::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;22766:13:::1;22804:7;22793;22783;;:17;;;;:::i;:::-;22782:29;;;;:::i;:::-;22766:45;;22850:4;22840:7;;:14;;;;:::i;:::-;22830:5;:25;;22822:88;;;::::0;-1:-1:-1;;;22822:88:0;;7848:2:1;22822:88:0::1;::::0;::::1;7830:21:1::0;7887:2;7867:18;;;7860:30;7926:34;7906:18;;;7899:62;-1:-1:-1;;;7977:18:1;;;7970:48;8035:19;;22822:88:0::1;7646:414:1::0;22822:88:0::1;22921:14;:22:::0;;;22973:14:::1;::::0;23001:7;;22973:24:::1;::::0;22990:7;;22973:24:::1;:::i;:::-;22972:36;;;;:::i;:::-;22954:15;:54:::0;-1:-1:-1;;;22676:340:0:o;21124:180::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21203:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;21195:64;;;::::0;-1:-1:-1;;;21195:64:0;;8267:2:1;21195:64:0::1;::::0;::::1;8249:21:1::0;8306:2;8286:18;;;8279:30;8345:34;8325:18;;;8318:62;-1:-1:-1;;;8396:18:1;;;8389:31;8437:19;;21195:64:0::1;8065:397:1::0;21195:64:0::1;-1:-1:-1::0;;;;;21270:18:0::1;21291:5;21270:18:::0;;;:9:::1;:18;::::0;;;;:26;;-1:-1:-1;;21270:26:0::1;::::0;;21124:180::o;20651:259::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;20754:13:::1;::::0;:18;:50;::::1;;;-1:-1:-1::0;20776:23:0::1;::::0;:28;20754:50:::1;20745:70;;;::::0;-1:-1:-1;;;20745:70:0;;8669:2:1;20745:70:0::1;::::0;::::1;8651:21:1::0;8708:1;8688:18;;;8681:29;-1:-1:-1;;;8726:18:1;;;8719:36;8772:18;;20745:70:0::1;8467:329:1::0;20745:70:0::1;20826:13;:28:::0;;;;20865:23:::1;:37:::0;20651:259::o;18892:215::-;189:10;18980:4;19029:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19029:34:0;;;;;;;;;;18980:4;;18997:80;;19020:7;;19029:47;;19066:10;;19029:47;:::i;:::-;18997:8;:80::i;22328:340::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;22417:13:::1;22455:7;22444;22434;;:17;;;;:::i;:::-;22433:29;;;;:::i;:::-;22417:45;;22501:4;22491:7;;:14;;;;:::i;:::-;22481:5;:25;;22473:93;;;::::0;-1:-1:-1;;;22473:93:0;;9136:2:1;22473:93:0::1;::::0;::::1;9118:21:1::0;9175:2;9155:18;;;9148:30;9214:34;9194:18;;;9187:62;9285:25;9265:18;;;9258:53;9328:19;;22473:93:0::1;8934:419:1::0;22473:93:0::1;22577:12;:20:::0;;;22625:14:::1;::::0;22653:7;;22625:24:::1;::::0;22642:7;;22625:24:::1;:::i;:::-;22624:36;;;;:::i;:::-;22608:13;:52:::0;-1:-1:-1;;;22328:340:0:o;15800:699::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15881:22:0;::::1;15873:96;;;;-1:-1:-1::0;;;15873:96:0::1;;;;;;;:::i;:::-;16000:4;::::0;-1:-1:-1;;;;;15988:16:0;;::::1;16000:4:::0;::::1;15988:16;;15980:90;;;;-1:-1:-1::0;;;15980:90:0::1;;;;;;;:::i;:::-;16100:6;::::0;;16081:33:::1;::::0;-1:-1:-1;;;;;16100:6:0;;::::1;::::0;16081:18:::1;:33::i;:::-;16125:34;16144:8;16154:4;16125:18;:34::i;:::-;16212:6;::::0;16184:16:::1;::::0;-1:-1:-1;;;;;16184:16:0;;::::1;16212:6:::0;::::1;16184:35;16180:90;;;16234:16;:36:::0;;-1:-1:-1;;;;;;16234:36:0::1;-1:-1:-1::0;;;;;16234:36:0;::::1;;::::0;;16180:90:::1;16314:1;16304:6:::0;;-1:-1:-1;;;;;16304:6:0::1;17725:16:::0;;:7;:16;;;;;;16294:21;16291:99:::1;;16342:6;::::0;;-1:-1:-1;;;;;16342:6:0::1;17725:16:::0;;;:7;:16;;;;;;;16332:46:::1;::::0;16342:6;16350:8;;16332:9:::1;:46::i;:::-;;16291:99;16410:6;:17:::0;;-1:-1:-1;;;;;;16410:17:0::1;-1:-1:-1::0;;;;;16410:17:0;::::1;::::0;;::::1;::::0;;16443:38:::1;::::0;16410:17;;;;16443:38:::1;::::0;16410:6;16443:38:::1;15800:699:::0;:::o;18450:120::-;18503:4;18527:35;18535:7;-1:-1:-1;;18527:7:0;:35::i;:::-;18520:42;18450:120;-1:-1:-1;;18450:120:0:o;23642:132::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23729:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;23729:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23642:132::o;22088:232::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;22184:21:::1;22196:9:::0;22184;:21:::1;:::i;:::-;22209:3;22184:28;22175:61;;;::::0;-1:-1:-1;;;22175:61:0;;9990:2:1;22175:61:0::1;::::0;::::1;9972:21:1::0;10029:2;10009:18;;;10002:30;-1:-1:-1;;;10048:18:1;;;10041:49;10107:18;;22175:61:0::1;9788:343:1::0;22175:61:0::1;22247:15;:27:::0;;;;22285:15:::1;:27:::0;22088:232::o;16507:194::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;16593:6:::1;::::0;;16574:33:::1;::::0;-1:-1:-1;;;;;16593:6:0;;::::1;::::0;16574:18:::1;:33::i;:::-;16635:1;16618:19:::0;;-1:-1:-1;;;;;;16618:19:0::1;::::0;;16653:40:::1;::::0;16635:1;;16653:40:::1;::::0;16635:1;;16653:40:::1;16507:194::o:0;19857:416::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;19939:7:::1;19934:332;;-1:-1:-1::0;;;;;;19963:13:0::1;19979:5;19963:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;19963:21:0::1;::::0;;23919:651::o;19934:332::-:1;20021:17;::::0;:22;20017:153:::1;;20110:7;20090:17;;20072:15;:35;;;;:::i;:::-;:45;20064:90;;;::::0;-1:-1:-1;;;20064:90:0;;10338:2:1;20064:90:0::1;::::0;::::1;10320:21:1::0;;;10357:18;;;10350:30;10416:34;10396:18;;;10389:62;10468:18;;20064:90:0::1;10136:356:1::0;20064:90:0::1;-1:-1:-1::0;;;;;20184:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;20184:20:0::1;20200:4;20184:20;::::0;;20239:15:::1;20219:17;:35:::0;19857:416;;:::o;31308:299::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;31370:14:::1;::::0;::::1;;31369:15;31361:52;;;::::0;-1:-1:-1;;;31361:52:0;;10699:2:1;31361:52:0::1;::::0;::::1;10681:21:1::0;10738:2;10718:18;;;10711:30;10777:26;10757:18;;;10750:54;10821:18;;31361:52:0::1;10497:348:1::0;31361:52:0::1;31428:13;;31445:1;31428:18;31424:144;;31478:18;:12;31493:3;31478:18;:::i;:::-;31463:12;:33:::0;31424:144:::1;;;31544:12;31529;:27:::0;31424:144:::1;31578:14;:21:::0;;-1:-1:-1;;31578:21:0::1;31595:4;31578:21;::::0;;31308:299::o;19115:225::-;189:10;19208:4;19257:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19257:34:0;;;;;;;;;;19208:4;;19225:85;;19248:7;;19257:52;;19294:15;;19257:52;:::i;17757:167::-;17835:4;17852:42;189:10;17876:9;17887:6;17852:9;:42::i;:::-;-1:-1:-1;17912:4:0;;17757:167;-1:-1:-1;;;17757:167:0:o;21312:218::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;21421:16:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;21421:28:0;;::::1;::::0;;;::::1;::::0;;;21460:14:::1;:24:::0;;;::::1;;-1:-1:-1::0;;21460:24:0;;::::1;;::::0;;21495:15:::1;:27:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;21312:218::o;23463:171::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;23540:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;23540:32:0::1;-1:-1:-1::0;;;;23540:32:0;;::::1;;::::0;;23588:38:::1;::::0;::::1;::::0;::::1;::::0;23564:8;1864:14:1;1857:22;1839:41;;1827:2;1812:18;;1699:187;23588:38:0::1;;;;;;;;23463:171:::0;:::o;21707:373::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;9953:4:::1;21817:6;:21;;:65;;;;;10003:4;21859:7;:23;;21817:65;:117;;;;;10057:4;21903:11;:31;;21817:117;21809:170;;;::::0;-1:-1:-1;;;21809:170:0;;11052:2:1;21809:170:0::1;::::0;::::1;11034:21:1::0;11091:2;11071:18;;;11064:30;11130:25;11110:18;;;11103:53;11173:18;;21809:170:0::1;10850:347:1::0;21809:170:0::1;21990:7;:16:::0;;;;22017:8:::1;:18:::0;22046:12:::1;:26:::0;21707:373::o;19348:501::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;19419:29:::1;19470:9;19419:61;;19491:16;19528:10;-1:-1:-1::0;;;;;19528:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19510:47:0::1;;19566:4;19573:10;-1:-1:-1::0;;;;;19573:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19510:81;::::0;-1:-1:-1;;;;;;19510:81:0::1;::::0;;;;;;-1:-1:-1;;;;;11688:15:1;;;19510:81:0::1;::::0;::::1;11670:34:1::0;11740:15;;11720:18;;;11713:43;11605:18;;19510:81:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19491:100:::0;-1:-1:-1;;;;;;19606:22:0;::::1;19602:207;;19672:10;-1:-1:-1::0;;;;;19672:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19654:50:0::1;;19713:4;19720:10;-1:-1:-1::0;;;;;19720:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19654:84;::::0;-1:-1:-1;;;;;;19654:84:0::1;::::0;;;;;;-1:-1:-1;;;;;11688:15:1;;;19654:84:0::1;::::0;::::1;11670:34:1::0;11740:15;;11720:18;;;11713:43;11605:18;;19654:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19645:6;:93:::0;;-1:-1:-1;;;;;;19645:93:0::1;-1:-1:-1::0;;;;;19645:93:0;;;::::1;::::0;;;::::1;::::0;;19602:207:::1;;;19780:6;:17:::0;;-1:-1:-1;;;;;;19780:17:0::1;-1:-1:-1::0;;;;;19780:17:0;::::1;;::::0;;19602:207:::1;-1:-1:-1::0;19819:9:0::1;:22:::0;;-1:-1:-1;;;;;;19819:22:0::1;-1:-1:-1::0;;;;;19819:22:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;19348:501:0:o;23321:134::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;23404:16:::1;:43:::0;;-1:-1:-1;;;;;;23404:43:0::1;-1:-1:-1::0;;;;;23404:43:0;;;::::1;::::0;;;::::1;::::0;;23321:134::o;23782:129::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23870:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:33;;-1:-1:-1;;23870:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23782:129::o;23024:289::-;12269:6;;-1:-1:-1;;;;;12269:6:0;189:10;12269:22;12261:67;;;;-1:-1:-1;;;12261:67:0;;;;;;;:::i;:::-;23224:16:::1;23204;23194:7;;:26;;;;:::i;:::-;23193:47;;;;:::i;:::-;23177:13;:63:::0;23265:7:::1;::::0;23292:13;;23265:23:::1;::::0;23275:13;;23265:23:::1;:::i;:::-;23264:41;;;;:::i;:::-;23251:10;:54:::0;-1:-1:-1;;;;23024:289:0:o;18101:341::-;-1:-1:-1;;;;;18195:20:0;;18187:69;;;;-1:-1:-1;;;18187:69:0;;11969:2:1;18187:69:0;;;11951:21:1;12008:2;11988:18;;;11981:30;12047:34;12027:18;;;12020:62;-1:-1:-1;;;12098:18:1;;;12091:34;12142:19;;18187:69:0;11767:400:1;18187:69:0;-1:-1:-1;;;;;18275:21:0;;18267:68;;;;-1:-1:-1;;;18267:68:0;;12374:2:1;18267:68:0;;;12356:21:1;12413:2;12393:18;;;12386:30;12452:34;12432:18;;;12425:62;-1:-1:-1;;;12503:18:1;;;12496:32;12545:19;;18267:68:0;12172:398:1;18267:68:0;-1:-1:-1;;;;;18348:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;18401:33;;2682:25:1;;;18401:33:0;;2655:18:1;18401:33:0;;;;;;;18101:341;;;:::o;24909:2123::-;24988:4;-1:-1:-1;;;;;25013:18:0;;25005:68;;;;-1:-1:-1;;;25005:68:0;;12777:2:1;25005:68:0;;;12759:21:1;12816:2;12796:18;;;12789:30;12855:34;12835:18;;;12828:62;-1:-1:-1;;;12906:18:1;;;12899:35;12951:19;;25005:68:0;12575:401:1;25005:68:0;-1:-1:-1;;;;;25092:16:0;;25084:64;;;;-1:-1:-1;;;25084:64:0;;13183:2:1;25084:64:0;;;13165:21:1;13222:2;13202:18;;;13195:30;13261:34;13241:18;;;13234:62;-1:-1:-1;;;13312:18:1;;;13305:33;13355:19;;25084:64:0;12981:399:1;25084:64:0;25176:1;25167:6;:10;25159:64;;;;-1:-1:-1;;;25159:64:0;;13587:2:1;25159:64:0;;;13569:21:1;13626:2;13606:18;;;13599:30;13665:34;13645:18;;;13638:62;-1:-1:-1;;;13716:18:1;;;13709:39;13765:19;;25159:64:0;13385:405:1;25159:64:0;25238:14;;;;25234:112;;;25292:13;;25277:11;:28;;25269:65;;;;-1:-1:-1;;;25269:65:0;;13997:2:1;25269:65:0;;;13979:21:1;14036:2;14016:18;;;14009:30;14075:26;14055:18;;;14048:54;14119:18;;25269:65:0;13795:348:1;25269:65:0;25359:20;25370:4;25376:2;25359:10;:20::i;:::-;25356:913;;;25400:14;;;;25396:89;;25435:34;;-1:-1:-1;;;25435:34:0;;14350:2:1;25435:34:0;;;14332:21:1;14389:2;14369:18;;;14362:30;14428:26;14408:18;;;14401:54;14472:18;;25435:34:0;14148:348:1;25396:89:0;25503:15;;;;25499:389;;;-1:-1:-1;;;;;25543:13:0;;;;;;:7;:13;;;;;;;;25539:334;;;-1:-1:-1;;;;;25588:13:0;;;;;;:9;:13;;;;;;25605:12;25588:29;;25580:59;;;;-1:-1:-1;;;25580:59:0;;14703:2:1;25580:59:0;;;14685:21:1;14742:2;14722:18;;;14715:30;-1:-1:-1;;;14761:18:1;;;14754:47;14818:18;;25580:59:0;14501:341:1;25580:59:0;-1:-1:-1;;;;;25662:13:0;;;;;;:9;:13;;;;;25678:12;25662:28;;25539:334;;;-1:-1:-1;;;;;25747:15:0;;;;;;:9;:15;;;;;;25766:12;25747:31;;25739:61;;;;-1:-1:-1;;;25739:61:0;;14703:2:1;25739:61:0;;;14685:21:1;14742:2;14722:18;;;14715:30;-1:-1:-1;;;14761:18:1;;;14754:47;14818:18;;25739:61:0;14501:341:1;25739:61:0;-1:-1:-1;;;;;25823:15:0;;;;;;:9;:15;;;;;25841:12;25823:30;;25539:334;-1:-1:-1;;;;;25906:20:0;;;;;;:14;:20;;;;;;;;25905:21;:44;;;;-1:-1:-1;;;;;;25931:18:0;;;;;;:14;:18;;;;;;;;25930:19;25905:44;25902:356;;;25988:12;;25978:6;:22;;25970:75;;;;-1:-1:-1;;;25970:75:0;;15049:2:1;25970:75:0;;;15031:21:1;15088:2;15068:18;;;15061:30;15127:34;15107:18;;;15100:62;-1:-1:-1;;;15178:18:1;;;15171:38;15226:19;;25970:75:0;14847:404:1;25970:75:0;26073:14;;-1:-1:-1;;;;;26067:20:0;;;26073:14;;26067:20;;;;:36;;-1:-1:-1;;;;;;26092:11:0;;;;;;:7;:11;;;;;;;;26091:12;26067:36;26064:179;;;26162:14;;26152:6;26136:13;26146:2;-1:-1:-1;;;;;17725:16:0;17698:7;17725:16;;;:7;:16;;;;;;;17632:117;26136:13;:22;;;;:::i;:::-;:40;;26128:95;;;;-1:-1:-1;;;26128:95:0;;15458:2:1;26128:95:0;;;15440:21:1;15497:2;15477:18;;;15470:30;15536:34;15516:18;;;15509:62;-1:-1:-1;;;15587:18:1;;;15580:40;15637:19;;26128:95:0;15256:406:1;26128:95:0;-1:-1:-1;;;;;26314:24:0;;26281:12;26314:24;;;:18;:24;;;;;;26296:4;;26314:24;;;:50;;-1:-1:-1;;;;;;26342:22:0;;;;;;:18;:22;;;;;;;;26314:50;26311:96;;;-1:-1:-1;26390:5:0;26311:96;-1:-1:-1;;;;;26423:11:0;;;;;;:7;:11;;;;;;;;26419:543;;;26456:16;;-1:-1:-1;;;26456:16:0;;;;26455:17;:59;;;;-1:-1:-1;26493:21:0;;-1:-1:-1;;;26493:21:0;;;;26455:59;:101;;;;-1:-1:-1;;;;;;26536:20:0;;;;;;:16;:20;;;;;;;;26535:21;26455:101;:145;;;;-1:-1:-1;;;;;;26578:22:0;;;;;;:16;:22;;;;;;;;26577:23;26455:145;26451:494;;;26684:4;26635:28;17725:16;;;:7;:16;;;;;;26737:13;;26713:37;;26709:221;;26802:10;;26778:20;:34;26775:77;;-1:-1:-1;26839:10:0;;26775:77;26874:36;26889:20;26874:14;:36::i;:::-;26616:329;26451:494;26980:44;26998:4;27004:2;27008:6;27016:7;26980:17;:44::i;:::-;26973:51;24909:2123;-1:-1:-1;;;;;24909:2123:0:o;24578:323::-;24646:4;15778:6;;-1:-1:-1;;;;;24670:15:0;;;15778:6;;24670:15;;;;:45;;-1:-1:-1;15751:7:0;15778:6;-1:-1:-1;;;;;24702:13:0;;;15778:6;;24702:13;;24670:45;:84;;;;-1:-1:-1;;;;;;24733:21:0;;;;;;:17;:21;;;;;;;;24732:22;24670:84;:125;;;;-1:-1:-1;;;;;;24772:23:0;;;;;;:17;:23;;;;;;;;24771:24;24670:125;:152;;;;-1:-1:-1;24818:4:0;;-1:-1:-1;;;;;24812:10:0;;;24818:4;;24812:10;;24670:152;:185;;;;-1:-1:-1;;;;;;24839:16:0;;;;24670:185;:223;;;;-1:-1:-1;;;;;;24872:21:0;;24888:4;24872:21;;24670:223;24663:230;24578:323;-1:-1:-1;;;24578:323:0:o;27040:915::-;12143:16;:23;;-1:-1:-1;;;;12143:23:0;-1:-1:-1;;;12143:23:0;;;27162:15:::1;::::0;27144::::1;::::0;12143:23;;27144:33:::1;::::0;::::1;:::i;:::-;27125:52:::0;-1:-1:-1;27192:13:0;27188:39:::1;;27220:7;;;27188:39;27237:17;27313:1;27301:8;27282:15;;27259:20;:38;;;;:::i;:::-;27258:51;;;;:::i;:::-;27257:57;;;;:::i;:::-;27237:77:::0;-1:-1:-1;27327:20:0::1;27350:32;27237:77:::0;27350:20;:32:::1;:::i;:::-;27327:55;;27393:30;27410:12;27393:16;:30::i;:::-;27436:24;27520:1;27508:8;27489:15;;27465:21;:39;;;;:::i;:::-;27464:52;;;;:::i;:::-;27463:58;;;;:::i;:::-;27436:85:::0;-1:-1:-1;27538:13:0;;27534:161:::1;;27568:41;27581:9;27592:16;27568:12;:41::i;:::-;27629:54;::::0;;15869:25:1;;;15925:2;15910:18;;15903:34;;;15953:18;;;15946:34;;;27629:54:0::1;::::0;15857:2:1;15842:18;27629:54:0::1;;;;;;;27534:161;27744:1;27709:32;27732:9:::0;27709:20;:32:::1;:::i;:::-;:36;27705:117;;;27762:16;::::0;:48:::1;::::0;-1:-1:-1;;;;;27762:16:0;;::::1;::::0;27788:21:::1;27762:48:::0;::::1;;;::::0;:16:::1;:48:::0;:16;:48;27788:21;27762:16;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27705:117;27838:23;::::0;:28;;:73:::1;;-1:-1:-1::0;27897:14:0::1;10253:1;27909:2;27897:14;:::i;:::-;27870:41;;:23;;:41;;27838:73;27834:114;;;27928:8;::::0;::::1;27834:114;27114:841;;;;12177:1;-1:-1:-1::0;12189:16:0;:24;;-1:-1:-1;;;;12189:24:0;;;27040:915::o;29396:1181::-;29517:16;;29496:4;;29517:16;;;;;29513:819;;;-1:-1:-1;;;;;20492:18:0;;20468:4;20492:18;;;:9;:18;;;;;;;;29553:30;;;-1:-1:-1;;;;;;20492:18:0;;20468:4;20492:18;;;:9;:18;;;;;;;;29571:12;29549:97;;;29604:26;;-1:-1:-1;;;29604:26:0;;16436:2:1;29604:26:0;;;16418:21:1;16475:2;16455:18;;;16448:30;-1:-1:-1;;;16494:18:1;;;16487:46;16550:18;;29604:26:0;16234:340:1;29549:97:0;29667:16;;;;;;;29662:659;;29704:28;29723:4;29729:2;29704:18;:28::i;:::-;29756:16;;;;;;;29755:17;:41;;;;;29776:20;29787:4;29793:2;29776:10;:20::i;:::-;29751:137;;;29821:47;;-1:-1:-1;;;29821:47:0;;16781:2:1;29821:47:0;;;16763:21:1;16820:2;16800:18;;;16793:30;16859:34;16839:18;;;16832:62;-1:-1:-1;;;16910:18:1;;;16903:35;16955:19;;29821:47:0;16579:401:1;29751:137:0;29662:659;;;29947:1;29932:12;;:16;:55;;;;-1:-1:-1;;;;;;29974:13:0;;;;;;:7;:13;;;;;;;;29932:55;:101;;;;;30013:20;30024:4;30030:2;30013:10;:20::i;:::-;29928:378;;;30110:13;;30095:12;;30080:27;;:12;:27;:::i;:::-;:43;30076:211;;;-1:-1:-1;;;;;30152:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;30152:20:0;30168:4;30152:20;;;30199:13;:16;;;;;;:::i;:::-;;;;-1:-1:-1;;30247:16:0;;-1:-1:-1;;;;;178:32:1;;160:51;;30247:16:0;;148:2:1;133:18;30247:16:0;;;;;;;30076:211;-1:-1:-1;;;;;30344:13:0;;;;;;:7;:13;;;;;:23;;30361:6;;30344:13;:23;;30361:6;;30344:23;:::i;:::-;;;;-1:-1:-1;30380:22:0;;-1:-1:-1;30406:7:0;30405:48;;30447:6;30405:48;;;30417:27;30427:4;30433:2;30437:6;30417:9;:27::i;:::-;-1:-1:-1;;;;;30466:11:0;;;;;;:7;:11;;;;;:29;;30380:73;;-1:-1:-1;30380:73:0;;30466:11;;;:29;;30380:73;;30466:29;:::i;:::-;;;;;;;;30528:2;-1:-1:-1;;;;;30513:34:0;30522:4;-1:-1:-1;;;;;30513:34:0;;30532:14;30513:34;;;;2682:25:1;;2670:2;2655:18;;2536:177;30513:34:0;;;;;;;;-1:-1:-1;30565:4:0;;29396:1181;-1:-1:-1;;;;;29396:1181:0:o;27963:417::-;28054:16;;;28068:1;28054:16;;;;;;;;28030:21;;28054:16;;;;;;;;;;-1:-1:-1;28054:16:0;28030:40;;28099:4;28081;28086:1;28081:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28081:23:0;;;:7;;;;;;;;;;:23;;;;28125:9;;:16;;;-1:-1:-1;;;28125:16:0;;;;:9;;;;;:14;;:16;;;;;28081:7;;28125:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28115:4;28120:1;28115:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28115:26:0;;;:7;;;;;;;;;:26;28154:9;;:218;;-1:-1:-1;;;28154:218:0;;:9;;;:60;;:218;;28229:11;;28154:9;;28299:4;;28326;;28346:15;;28154:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28019:361;27963:417;:::o;28388:332::-;28469:9;;28667:4;;28469:243;;-1:-1:-1;;;28469:243:0;;28535:4;28469:243;;;18715:34:1;18765:18;;;18758:34;;;28469:9:0;18808:18:1;;;18801:34;;;18851:18;;;18844:34;-1:-1:-1;;;;;28667:4:0;;;18894:19:1;;;18887:44;28686:15:0;18947:19:1;;;18940:35;28469:9:0;;;:25;;28502:9;;18649:19:1;;28469:243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28388:332;;:::o;28728:660::-;28810:16;;;;;;;28809:17;28801:65;;;;-1:-1:-1;;;28801:65:0;;19499:2:1;28801:65:0;;;19481:21:1;19538:2;19518:18;;;19511:30;19577:34;19557:18;;;19550:62;-1:-1:-1;;;19628:18:1;;;19621:33;19671:19;;28801:65:0;19297:399:1;28801:65:0;28882:20;28893:4;28899:2;28882:10;:20::i;:::-;28881:21;:37;;;;-1:-1:-1;28912:6:0;;-1:-1:-1;;;;;28906:12:0;;;28912:6;;28906:12;28881:37;28877:504;;;28939:13;;28956:1;28939:18;28935:160;;28993:18;:12;29008:3;28993:18;:::i;:::-;28978:12;:33;28935:160;;;29067:12;29052;:27;28935:160;-1:-1:-1;;;;;29111:23:0;;;;;;:17;:23;;;;;;;;;:30;;-1:-1:-1;;29111:30:0;;;29137:4;29111:30;;;;;;29156:16;:23;;-1:-1:-1;;29156:23:0;;;;;29209:15;29194:30;;29241:21;:28;;-1:-1:-1;;;;29241:28:0;-1:-1:-1;;;29241:28:0;;;29284:23;:31;;;;;;;29335:34;;1839:41:1;;;29335:34:0;;1812:18:1;29335:34:0;;;;;;;28728:660;;:::o;30585:715::-;30725:6;;30664:7;;;;-1:-1:-1;;;;;30717:14:0;;;30725:6;;30717:14;30713:197;;;-1:-1:-1;30761:7:0;;30713:197;;;30796:6;;-1:-1:-1;;;;;30790:12:0;;;30796:6;;30790:12;30786:124;;;-1:-1:-1;30832:8:0;;30786:124;;;-1:-1:-1;30886:12:0;;30786:124;30926:20;30937:4;30943:2;30926:10;:20::i;:::-;30922:158;;;30966:13;;:18;;:58;;;31022:2;31005:14;;:19;;;;:::i;:::-;30988:13;;:36;;30966:58;30962:107;;;31045:8;;;30962:107;31092:17;10204:5;31112:19;31121:10;31112:6;:19;:::i;:::-;:38;;;;:::i;:::-;31179:4;31163:22;;;;:7;:22;;;;;:35;;31092:58;;-1:-1:-1;31092:58:0;;31163:22;;;:35;;31092:58;;31163:35;:::i;:::-;;;;-1:-1:-1;;31214:40:0;;2682:25:1;;;31237:4:0;;-1:-1:-1;;;;;31214:40:0;;;;;2670:2:1;2655:18;31214:40:0;;;;;;;31274:18;31283:9;31274:6;:18;:::i;:::-;31267:25;30585:715;-1:-1:-1;;;;;;30585:715:0:o;222:597:1:-;334:4;363:2;392;381:9;374:21;424:6;418:13;467:6;462:2;451:9;447:18;440:34;492:1;502:140;516:6;513:1;510:13;502:140;;;611:14;;;607:23;;601:30;577:17;;;596:2;573:26;566:66;531:10;;502:140;;;660:6;657:1;654:13;651:91;;;730:1;725:2;716:6;705:9;701:22;697:31;690:42;651:91;-1:-1:-1;803:2:1;782:15;-1:-1:-1;;778:29:1;763:45;;;;810:2;759:54;;222:597;-1:-1:-1;;;222:597:1:o;1058:180::-;1117:6;1170:2;1158:9;1149:7;1145:23;1141:32;1138:52;;;1186:1;1183;1176:12;1138:52;-1:-1:-1;1209:23:1;;1058:180;-1:-1:-1;1058:180:1:o;1243:131::-;-1:-1:-1;;;;;1318:31:1;;1308:42;;1298:70;;1364:1;1361;1354:12;1298:70;1243:131;:::o;1379:315::-;1447:6;1455;1508:2;1496:9;1487:7;1483:23;1479:32;1476:52;;;1524:1;1521;1514:12;1476:52;1563:9;1550:23;1582:31;1607:5;1582:31;:::i;:::-;1632:5;1684:2;1669:18;;;;1656:32;;-1:-1:-1;;;1379:315:1:o;1891:247::-;1950:6;2003:2;1991:9;1982:7;1978:23;1974:32;1971:52;;;2019:1;2016;2009:12;1971:52;2058:9;2045:23;2077:31;2102:5;2077:31;:::i;2143:388::-;2211:6;2219;2272:2;2260:9;2251:7;2247:23;2243:32;2240:52;;;2288:1;2285;2278:12;2240:52;2327:9;2314:23;2346:31;2371:5;2346:31;:::i;:::-;2396:5;-1:-1:-1;2453:2:1;2438:18;;2425:32;2466:33;2425:32;2466:33;:::i;:::-;2518:7;2508:17;;;2143:388;;;;;:::o;2718:337::-;2784:6;2792;2845:2;2833:9;2824:7;2820:23;2816:32;2813:52;;;2861:1;2858;2851:12;2813:52;2900:9;2887:23;2950:4;2943:5;2939:16;2932:5;2929:27;2919:55;;2970:1;2967;2960:12;3060:456;3137:6;3145;3153;3206:2;3194:9;3185:7;3181:23;3177:32;3174:52;;;3222:1;3219;3212:12;3174:52;3261:9;3248:23;3280:31;3305:5;3280:31;:::i;:::-;3330:5;-1:-1:-1;3387:2:1;3372:18;;3359:32;3400:33;3359:32;3400:33;:::i;:::-;3060:456;;3452:7;;-1:-1:-1;;;3506:2:1;3491:18;;;;3478:32;;3060:456::o;3521:248::-;3589:6;3597;3650:2;3638:9;3629:7;3625:23;3621:32;3618:52;;;3666:1;3663;3656:12;3618:52;-1:-1:-1;;3689:23:1;;;3759:2;3744:18;;;3731:32;;-1:-1:-1;3521:248:1:o;3963:160::-;4028:20;;4084:13;;4077:21;4067:32;;4057:60;;4113:1;4110;4103:12;4057:60;3963:160;;;:::o;4128:315::-;4193:6;4201;4254:2;4242:9;4233:7;4229:23;4225:32;4222:52;;;4270:1;4267;4260:12;4222:52;4309:9;4296:23;4328:31;4353:5;4328:31;:::i;:::-;4378:5;-1:-1:-1;4402:35:1;4433:2;4418:18;;4402:35;:::i;:::-;4392:45;;4128:315;;;;;:::o;4448:316::-;4516:6;4524;4532;4585:2;4573:9;4564:7;4560:23;4556:32;4553:52;;;4601:1;4598;4591:12;4553:52;4624:26;4640:9;4624:26;:::i;:::-;4614:36;;4669:35;4700:2;4689:9;4685:18;4669:35;:::i;:::-;4659:45;;4723:35;4754:2;4743:9;4739:18;4723:35;:::i;:::-;4713:45;;4448:316;;;;;:::o;4769:180::-;4825:6;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4917:26;4933:9;4917:26;:::i;4954:316::-;5031:6;5039;5047;5100:2;5088:9;5079:7;5075:23;5071:32;5068:52;;;5116:1;5113;5106:12;5068:52;-1:-1:-1;;5139:23:1;;;5209:2;5194:18;;5181:32;;-1:-1:-1;5260:2:1;5245:18;;;5232:32;;4954:316;-1:-1:-1;4954:316:1:o;5535:385::-;5621:6;5629;5637;5645;5698:3;5686:9;5677:7;5673:23;5669:33;5666:53;;;5715:1;5712;5705:12;5666:53;-1:-1:-1;;5738:23:1;;;5808:2;5793:18;;5780:32;;-1:-1:-1;5859:2:1;5844:18;;5831:32;;5910:2;5895:18;5882:32;;-1:-1:-1;5535:385:1;-1:-1:-1;5535:385:1:o;5925:356::-;6127:2;6109:21;;;6146:18;;;6139:30;6205:34;6200:2;6185:18;;6178:62;6272:2;6257:18;;5925:356::o;6638:127::-;6699:10;6694:3;6690:20;6687:1;6680:31;6730:4;6727:1;6720:15;6754:4;6751:1;6744:15;6770:168;6810:7;6876:1;6872;6868:6;6864:14;6861:1;6858:21;6853:1;6846:9;6839:17;6835:45;6832:71;;;6883:18;;:::i;:::-;-1:-1:-1;6923:9:1;;6770:168::o;7294:125::-;7334:4;7362:1;7359;7356:8;7353:34;;;7367:18;;:::i;:::-;-1:-1:-1;7404:9:1;;7294:125::o;7424:217::-;7464:1;7490;7480:132;;7534:10;7529:3;7525:20;7522:1;7515:31;7569:4;7566:1;7559:15;7597:4;7594:1;7587:15;7480:132;-1:-1:-1;7626:9:1;;7424:217::o;8801:128::-;8841:3;8872:1;8868:6;8865:1;8862:13;8859:39;;;8878:18;;:::i;:::-;-1:-1:-1;8914:9:1;;8801:128::o;9358:425::-;9560:2;9542:21;;;9599:2;9579:18;;;9572:30;9638:34;9633:2;9618:18;;9611:62;9709:31;9704:2;9689:18;;9682:59;9773:3;9758:19;;9358:425::o;11202:251::-;11272:6;11325:2;11313:9;11304:7;11300:23;11296:32;11293:52;;;11341:1;11338;11331:12;11293:52;11373:9;11367:16;11392:31;11417:5;11392:31;:::i;15991:238::-;16029:7;16069:4;16066:1;16062:12;16101:4;16098:1;16094:12;16161:3;16155:4;16151:14;16146:3;16143:23;16136:3;16129:11;16122:19;16118:49;16115:75;;;16170:18;;:::i;:::-;16210:13;;15991:238;-1:-1:-1;;;15991:238:1:o;16985:135::-;17024:3;-1:-1:-1;;17045:17:1;;17042:43;;;17065:18;;:::i;:::-;-1:-1:-1;17112:1:1;17101:13;;16985:135::o;17257:127::-;17318:10;17313:3;17309:20;17306:1;17299:31;17349:4;17346:1;17339:15;17373:4;17370:1;17363:15;17389:980;17651:4;17699:3;17688:9;17684:19;17730:6;17719:9;17712:25;17756:2;17794:6;17789:2;17778:9;17774:18;17767:34;17837:3;17832:2;17821:9;17817:18;17810:31;17861:6;17896;17890:13;17927:6;17919;17912:22;17965:3;17954:9;17950:19;17943:26;;18004:2;17996:6;17992:15;17978:29;;18025:1;18035:195;18049:6;18046:1;18043:13;18035:195;;;18114:13;;-1:-1:-1;;;;;18110:39:1;18098:52;;18205:15;;;;18170:12;;;;18146:1;18064:9;18035:195;;;-1:-1:-1;;;;;;;18286:32:1;;;;18281:2;18266:18;;18259:60;-1:-1:-1;;;18350:3:1;18335:19;18328:35;18247:3;17389:980;-1:-1:-1;;;17389:980:1:o;18986:306::-;19074:6;19082;19090;19143:2;19131:9;19122:7;19118:23;19114:32;19111:52;;;19159:1;19156;19149:12;19111:52;19188:9;19182:16;19172:26;;19238:2;19227:9;19223:18;19217:25;19207:35;;19282:2;19271:9;19267:18;19261:25;19251:35;;18986:306;;;;;:::o

Swarm Source

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