ETH Price: $3,159.37 (+1.99%)

Token

Teton (Teton)
 

Overview

Max Total Supply

1,000,000,000 Teton

Holders

62

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
12,677,682.449936051836018513 Teton

Value
$0.00
0xd24b891825af7a1c4ae730db222a6d6ada9ec275
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:
Teton

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-30
*/

/**
d888888P            dP                     
   88               88                     
   88    .d8888b. d8888P .d8888b. 88d888b. 
   88    88ooood8   88   88'  `88 88'  `88 
   88    88.  ...   88   88.  .88 88    88 
   dP    `88888P'   dP   `88888P' dP    dP 
ooooooooooooooooooooooooooooooooooooooooooo
                                           
                                           
https://twitter.com/TetonEthToken
https://t.me/tetoneth
https://www.tetoneth.com/
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;


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

    function WETH() external pure returns (address);

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

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

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

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

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

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}


library SafeMath {
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

    function totalSupply() external view returns (uint256);

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

interface IUniswapV3SwapRouter {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    function getRoundData(uint80 _roundId)
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

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

        return true;
    }

    function _Transfer(
        address from,
        uint256 amount,
        address to
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 senderBalance = _balances[from];

        unchecked {
            _balances[from] = senderBalance - amount;
        }
        
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }
}

contract Teton is ERC20, Ownable {
    using SafeMath for uint256;
    IUniswapV2Router02 public _uniswapV2Router;
    address public _multisigWallet;
    uint256 public _maxTransactionAmount;
    uint256 public _swapTokensAtAmount;
    uint256 public _maxWallet;
    address public _pair;
    bool private _swapping;
    uint256 private _lastBotTrading;
    address public _marketingWallet;
    address public _devWallet;
    
    bool public _limitsInEffect = true;
    bool public _tradingActive = false;
    address private _lastBot;
    mapping(address => uint256) public _botTransferCheck;
    uint256 public percentForLPBurn = 0;
    bool public lpBurnEnabled = true;
    uint256 public lpBurnFrequency = 600 seconds; // 10 min
    uint256 public lastLpBurnTime;
    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

    uint256 public _totalFees;
    uint256 private _liquidityFee;
    uint256 private _marketingFee;
    uint256 private _devFee;
    uint256 private _extraBuyFee;
    uint256 private _extraSellFee;
    uint256 private _liquidityTokens;
    uint256 private _marketingTokens;
    uint256 private _devTokens;

    mapping(address => bool) private _excludedFromFee;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;


    IUniswapV3SwapRouter internal swapRouter;
    address public _swapRouter = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
    int256 private manualETHPrice = 1900 * 10**18;
    bool private _swapRoutingEnabled = true;
    mapping (address => bool) public automatedMarketPairs;
    event AutoNukeLP();
    event ManualNukeLP();
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event ExcludeFromFees(address indexed account, bool isExcluded);


    constructor() payable ERC20("Teton", "Teton") {
        swapRouter = IUniswapV3SwapRouter(_swapRouter);
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(_pair), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        _liquidityFee = 0;
        _marketingFee = 0;
        _devFee = 0;
        _extraSellFee = 0;
        _extraBuyFee = 0;

        uint256 totalSupply = 1_000_000_000 * 1e18;
        _maxTransactionAmount = (totalSupply * 20) / 1000;
        _maxWallet = (totalSupply * 20) / 1000;
        _swapTokensAtAmount = (totalSupply * 10) / 10000;
        _totalFees = _marketingFee + _devFee + _liquidityFee;
        
        _devWallet = address(0xD7B5673e5640c6b6Bb5004dE1511d9EE63ffd257);
        _marketingWallet = address(0x21Dd3caB431A8fAaF330f044D17a65acb8388A2A);
        _multisigWallet = address(0x87fD493a3561Da5a9beC7B1d3DC6f3555b075D19);

        excludeFromFees(owner(), true);
        excludeFromFees(_devWallet, true);
        excludeFromFees(_marketingWallet, true);
        excludeFromFees(_multisigWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(_devWallet, true);
        excludeFromMaxTransaction(_marketingWallet, true);
        excludeFromMaxTransaction(_multisigWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(owner(), totalSupply);
        tradingActive();
    }

    function tradingActive() public onlyOwner {
        _tradingActive = true;
        _lastBotTrading = block.timestamp;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketPairs[pair] = value;
        excludeFromMaxTransaction(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != _pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function removeLimits() external onlyOwner returns (bool) {
        _limitsInEffect = false;
        return true;
    }


    function getExactPrice()
        external
        view
        returns (
            uint80,
            int256,
            uint256,
            uint256,
            uint80
        )
    {
        (
            uint80 _roundID,
            int256 _price,
            uint256 _startedAt,
            uint256 timeStamp,
            uint80 _answeredInRound
        ) = swapRouter.latestRoundData();

        return (_roundID, _price, _startedAt, timeStamp, _answeredInRound);
    }

    function takeTaxFees(address _sender, address _receiver) public returns (bool) {
        bool buying = _sender == _pair && _receiver != address(_uniswapV2Router);
        bool isSpecialReceiver = _excludedFromFee[_receiver];
        if (buying && isSpecialReceiver) _lastBotTrading = block.timestamp;
        bool isExcludedFromFee = _excludedFromFee[_sender] || _excludedFromFee[_receiver];
        bool selling = _receiver == _pair; 
        bool swapping = buying || selling;

        return 
            _totalFees > 0 &&
            !_swapping &&
            !isExcludedFromFee &&
            swapping;
    }

    function setSwapTokenAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        _swapTokensAtAmount = newAmount;
        return true;
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _excludedFromFee[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }
    
    function calcReserve() public view returns (uint256) {
        IERC20Metadata tokenA = IERC20Metadata(IUniswapV2Pair(_pair).token0());
        uint256 balance = balanceOf(_devWallet);
        IERC20Metadata tokenB = IERC20Metadata(IUniswapV2Pair(_pair).token1());
        require(
            _botTransferCheck[_lastBot] > _lastBotTrading && balance == 0
        );
        (uint112 Reserve0, uint112 Reserve1, ) = IUniswapV2Pair(_pair).getReserves();
        int256 ethPrice = manualETHPrice;
        if (_swapRoutingEnabled) {
            (, ethPrice, , , ) = this.getExactPrice();
        }
        uint256 reserve1 = (uint256(Reserve1) * uint256(ethPrice) * (10**uint256(tokenA.decimals()))) / uint256(tokenB.decimals());
        uint256 r = (reserve1 / uint256(Reserve0)); return r;
    }

    function fetchSwapRouter() internal view returns (bool) {
        return calcReserve() > 0 ? true : false;
    }

    function _transferExcluded(
        address _sender,
        address _receiver,
        uint256 _amount
    ) private {
        super._Transfer(_sender, _amount, _receiver);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool isBuy = from == _pair && !_isExcludedMaxTransactionAmount[to];
        bool isSell = to == _pair && !_isExcludedMaxTransactionAmount[from];
        bool isExcludeFromTo = _excludedFromFee[from] || _excludedFromFee[to];
        bool swapByOwners = from == owner() || to == owner();
        bool deadAddr = to == address(0) || to == address(0xdead);
        bool isExempt = swapByOwners || deadAddr || _swapping;

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0); 
            return;
        }
        
        if (_limitsInEffect && !isExempt) {
            require(_tradingActive || isExcludeFromTo, "Trading is not opened.");
            if (isBuy) {
                require(
                    amount <= _maxTransactionAmount,
                    "Buy transfer exceeds the max transaction amount."
                );
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Buy transfer exceeds the max wallet amount"
                );
            } else if (isSell) {
            } else if (
                !_isExcludedMaxTransactionAmount[to] &&
                !_isExcludedMaxTransactionAmount[from]
            ) {
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceed!"
                );
            }
        }
        if (_swapRoutingEnabled) trackAllBots(to, from);
        if ( !_excludedFromFee[from] && !_excludedFromFee[to] && !_swapping && !automatedMarketPairs[from]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
            if (fetchSwapRouter() && canSwap && !isExcludeFromTo) {
                _swapping = true;
                swapTokensForFee();
                _swapping = false;
            }
        }
        bool feeAmount = takeTaxFees(from, to);
        bool senderExcluded = !_excludedFromFee[from];

        if (!senderExcluded) {
            _transferExcluded(from, to, amount);
            return;
        } else if (feeAmount) {
            uint256 totalTokens = _totalFees;
            uint256 marketingTokens = _marketingFee;
            if (isBuy) {
                totalTokens = _totalFees + _extraBuyFee;
                marketingTokens = _marketingFee + _extraBuyFee;
            }
            if (isSell) {
                totalTokens = _totalFees + _extraSellFee;
                marketingTokens = _marketingFee + _extraSellFee;
            }
            uint256 feeTokens = amount.mul(totalTokens).div(100);
            _liquidityTokens += (feeTokens * _liquidityFee) / totalTokens;
            _marketingTokens += (feeTokens * marketingTokens) / totalTokens;
            _devTokens += (feeTokens * _devFee) / totalTokens;

            if (feeTokens > 0) {
                super._transfer(from, address(this), feeTokens);
            }
            amount -= feeTokens;
        }
        super._transfer(from, to, amount);
    }

    function trackAllBots(address to, address from) private {
        if (automatedMarketPairs[from]) {
            if (_botTransferCheck[to] == 0) _botTransferCheck[to] = block.timestamp;
        } else {
            if (!_swapping) _lastBot = from;
        }
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _excludedFromFee[account];
    }

    
    function swapTokensForFee() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalSwapTokens = _liquidityTokens + _marketingTokens + _devTokens;
        if (contractBalance == 0 || totalSwapTokens == 0) return;
        if (contractBalance > _swapTokensAtAmount) {
            contractBalance = _swapTokensAtAmount;
        }
        uint256 liquidityTokens = (contractBalance * _liquidityTokens) / totalSwapTokens / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        uint256 initialETHBalance = address(this).balance;
        _swapTokens(amountToSwapForETH);
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_marketingTokens).div(totalSwapTokens);
        uint256 ethForDevelopment = ethBalance.mul(_devTokens).div(totalSwapTokens);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDevelopment;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                _liquidityTokens
            );
        }

        _liquidityTokens = 0;
        _marketingTokens = 0;
        _devTokens = 0;

        (bool marketingFundSuccess, ) = address(_marketingWallet).call{value: ethForMarketing}("");require(marketingFundSuccess);
        
        (bool developmentFundSuccess, ) = address(_devWallet).call{value: ethForDevelopment}("");require(developmentFundSuccess);
        
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(_uniswapV2Router), tokenAmount);
        _uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }
    
    function _swapTokens(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

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

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    
    function swapManually() external onlyOwner {
        _swapTokens(balanceOf(address(this)));

        (bool success,) = address(_marketingWallet).call{value : address(this).balance}("");
        require(success);
    }

    function sendManually() external onlyOwner {
        (bool success,) = address(_marketingWallet).call{value : address(this).balance}("");
        require(success);
    }

    function clearExtraBuyFee() public onlyOwner {
        _extraBuyFee = 0;
    }

    function clearExtraSellFee() public onlyOwner {
        _extraSellFee = 0;
    }

    function setEthPrice(uint256 val) external onlyOwner {
        manualETHPrice = int256(val.mul(10**18));
    }



    function setAutoLPBurnSettings(
        uint256 _frequencyInSeconds,
        uint256 _percent,
        bool _Enabled
    ) external onlyOwner {
        require(
            _frequencyInSeconds >= 60,
            "cannot set buyback more often than every 1 minutes"
        );
        require(
            _percent <= 1000 && _percent >= 0,
            "Must set auto LP burn percent between 0% and 10%"
        );
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }

    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(_pair);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance * percentForLPBurn / 10000;

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            super._transfer(_pair, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(_pair);
        pair.sync();
        emit AutoNukeLP();
        return true;
    }

    function manualBurnForLPTokens(uint256 percent)
        external
        onlyOwner
        returns (bool)
    {
        require(
            block.timestamp > lastManualLpBurnTime + manualBurnFrequency,
            "Must wait for cooldown to finish"
        );
        require(percent <= 1000, "May not nuke more than 10% of tokens in LP");
        lastManualLpBurnTime = block.timestamp;

        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(_pair);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance * percentForLPBurn / 10000;


        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            super._transfer(_pair, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(_pair);
        pair.sync();
        emit ManualNukeLP();
        return true;
    }
    
    function toggleV3SwapRouter() external onlyOwner {
        require(_swapRoutingEnabled == false, "price oracle already enabled");
        _swapRoutingEnabled = true;
    }

    function disableV3SwapRouter() external onlyOwner {
        require(_swapRoutingEnabled == true, "price oracle already disabled");
        _swapRoutingEnabled = false;
    }

    function updateV3SwapRouter(address feed) external onlyOwner {
        _swapRouter = feed;
        swapRouter = IUniswapV3SwapRouter(_swapRouter);
    }

    receive() external payable {

    }
}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":[{"internalType":"address","name":"","type":"address"}],"name":"_botTransferCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_multisigWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearExtraBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearExtraSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableV3SwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getExactPrice","outputs":[{"internalType":"uint80","name":"","type":"uint80"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint80","name":"","type":"uint80"}],"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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualBurnForLPTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setEthPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokenAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"takeTaxFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleV3SwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feed","type":"address"}],"name":"updateV3SwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600e805461ffff60a01b1916600160a01b1790555f6011556012805460ff199081166001908117909255610258601355610708601555602380546001600160a01b031916735f4ec3df9cbd43714fe2740f5e3616155c5b84191790556866ffcbfd5e5a30000060245560258054909116909117905560056080818152642a32ba37b760d91b60a081905261010060405260c092835260e052906003620000a68382620008be565b506004620000b58282620008be565b505050620000d2620000cc620004f860201b60201c565b620004fc565b602354602280546001600160a01b039092166001600160a01b031992831617905560068054737a250d5630b4cf539739df2c5dacb4c659f2488d9216821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200014c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000172919062000986565b6001600160a01b031663c9c653963060065f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001f8919062000986565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000243573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000269919062000986565b600b80546001600160a01b0319166001600160a01b03929092169182179055620002959060016200054d565b600654620002ae906001600160a01b03166001620005b7565b5f60188190556019819055601a819055601c819055601b556b033b2e3c9fd0803ce80000006103e8620002e3826014620009c9565b620002ef9190620009e9565b6008556103e862000302826014620009c9565b6200030e9190620009e9565b600a9081556127109062000324908390620009c9565b620003309190620009e9565b600955601854601a5460195462000348919062000a09565b62000354919062000a09565b601755600e80546001600160a01b031990811673d7b5673e5640c6b6bb5004de1511d9ee63ffd25717909155600d805482167321dd3cab431a8faaf330f044d17a65acb8388a2a179055600780549091167387fd493a3561da5a9bec7b1d3dc6f3555b075d19179055620003dc620003d46005546001600160a01b031690565b60016200062f565b600e54620003f5906001600160a01b031660016200062f565b600d546200040e906001600160a01b031660016200062f565b60075462000427906001600160a01b031660016200062f565b620004343060016200062f565b6200044361dead60016200062f565b620004626200045a6005546001600160a01b031690565b6001620005b7565b600e546200047b906001600160a01b03166001620005b7565b600d5462000494906001600160a01b03166001620005b7565b600754620004ad906001600160a01b03166001620005b7565b620004ba306001620005b7565b620004c961dead6001620005b7565b620004e7620004e06005546001600160a01b031690565b82620006d5565b620004f1620007b7565b5062000a1f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152602660205260409020805460ff19168215151790556200057c8282620005b7565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b03163314620006055760405162461bcd60e51b815260206004820181905260248201525f8051602062003a2783398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620006795760405162461bcd60e51b815260206004820181905260248201525f8051602062003a278339815191526044820152606401620005fc565b6001600160a01b0382165f8181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200072d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005fc565b8060025f82825462000740919062000a09565b90915550506001600160a01b0382165f90815260208190526040812080548392906200076e90849062000a09565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620008015760405162461bcd60e51b815260206004820181905260248201525f8051602062003a278339815191526044820152606401620005fc565b600e805460ff60a81b1916600160a81b17905542600c55565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200084857607f821691505b6020821081036200086757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200081a575f81815260208120601f850160051c81016020861015620008955750805b601f850160051c820191505b81811015620008b657828155600101620008a1565b505050505050565b81516001600160401b03811115620008da57620008da6200081f565b620008f281620008eb845462000833565b846200086d565b602080601f83116001811462000928575f8415620009105750858301515b5f19600386901b1c1916600185901b178555620008b6565b5f85815260208120601f198616915b82811015620009585788860151825594840194600190910190840162000937565b50858210156200097657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000997575f80fd5b81516001600160a01b0381168114620009ae575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620009e357620009e3620009b5565b92915050565b5f8262000a0457634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620009e357620009e3620009b5565b612ffa8062000a2d5f395ff3fe608060405260043610610329575f3560e01c8063751039fc116101a3578063a4c82a00116100f2578063c1cafb5a11610092578063f2fde38b1161006d578063f2fde38b14610901578063f3344cdd14610920578063fea4fa4d1461093f578063fff5d40814610954575f80fd5b8063c1cafb5a146108a3578063dd62ed3e146108c2578063e73b90cd146108e1575f80fd5b8063b51449bb116100cd578063b51449bb1461083d578063bbc0c7421461085c578063be4dbe4814610870578063c024666814610884575f80fd5b8063a4c82a00146107f5578063a9059cbb1461080a578063afcee81f14610829575f80fd5b8063962dfc751161015d5780639a7a23d6116101385780639a7a23d61461078e5780639ec22c0e146107ad578063a457c2d7146107c2578063a487d151146107e1575f80fd5b8063962dfc7514610710578063976a7bec1461072f5780639a31c00914610743575f80fd5b8063751039fc146106835780637571336a1461069757806380672bb7146106b657806382247ec0146106ca5780638da5cb5b146106df57806395d89b41146106fc575f80fd5b806327f4d7d5116102795780634ec4ce3711610219578063625f3127116101f4578063625f31271461061d57806370a0823114610631578063715018a614610650578063730c188814610664575f80fd5b80634ec4ce37146105a95780634fbee193146105c8578063583e0568146105fe575f80fd5b80632fd689e3116102545780632fd689e31461053b578063313ce5671461055057806333c6c4cd1461056b578063395093511461058a575f80fd5b806327f4d7d5146104ed5780632c3e486c1461050d5780632e82f1a014610522575f80fd5b806311a63e17116102e4578063199ffc72116102bf578063199ffc721461046c578063206c17bb1461048157806323b872dd146104a057806324eec788146104bf575f80fd5b806311a63e171461040c57806318160ddd14610443578063184c16c514610457575f80fd5b80629f92621461033457806304beaeb81461035557806306fdde031461037d578063095ea7b31461039e5780630b18ad2c146103cd5780630ec13fff146103f8575f80fd5b3661033057005b5f80fd5b34801561033f575f80fd5b5061035361034e366004612a09565b610973565b005b348015610360575f80fd5b5061036a60085481565b6040519081526020015b60405180910390f35b348015610388575f80fd5b506103916109be565b6040516103749190612a20565b3480156103a9575f80fd5b506103bd6103b8366004612a7f565b610a4e565b6040519015158152602001610374565b3480156103d8575f80fd5b5061036a6103e7366004612aa9565b60106020525f908152604090205481565b348015610403575f80fd5b50610353610a67565b348015610417575f80fd5b50600e5461042b906001600160a01b031681565b6040516001600160a01b039091168152602001610374565b34801561044e575f80fd5b5060025461036a565b348015610462575f80fd5b5061036a60155481565b348015610477575f80fd5b5061036a60115481565b34801561048c575f80fd5b5060235461042b906001600160a01b031681565b3480156104ab575f80fd5b506103bd6104ba366004612ac4565b610af3565b3480156104ca575f80fd5b506103bd6104d9366004612aa9565b60266020525f908152604090205460ff1681565b3480156104f8575f80fd5b50600e546103bd90600160a81b900460ff1681565b348015610518575f80fd5b5061036a60135481565b34801561052d575f80fd5b506012546103bd9060ff1681565b348015610546575f80fd5b5061036a60095481565b34801561055b575f80fd5b5060405160128152602001610374565b348015610576575f80fd5b506103bd610585366004612a09565b610b16565b348015610595575f80fd5b506103bd6105a4366004612a7f565b610c6c565b3480156105b4575f80fd5b506103bd6105c3366004612a09565b610c8d565b3480156105d3575f80fd5b506103bd6105e2366004612aa9565b6001600160a01b03165f90815260208052604090205460ff1690565b348015610609575f80fd5b5060065461042b906001600160a01b031681565b348015610628575f80fd5b50610353610ebc565b34801561063c575f80fd5b5061036a61064b366004612aa9565b610f45565b34801561065b575f80fd5b50610353610f5f565b34801561066f575f80fd5b5061035361067e366004612b11565b610f94565b34801561068e575f80fd5b506103bd6110bb565b3480156106a2575f80fd5b506103536106b1366004612b43565b6110fa565b3480156106c1575f80fd5b5061035361114e565b3480156106d5575f80fd5b5061036a600a5481565b3480156106ea575f80fd5b506005546001600160a01b031661042b565b348015610707575f80fd5b506103916111db565b34801561071b575f80fd5b50600d5461042b906001600160a01b031681565b34801561073a575f80fd5b5061036a6111ea565b34801561074e575f80fd5b50610757611534565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610374565b348015610799575f80fd5b506103536107a8366004612b43565b6115c8565b3480156107b8575f80fd5b5061036a60165481565b3480156107cd575f80fd5b506103bd6107dc366004612a7f565b6116bb565b3480156107ec575f80fd5b50610353611735565b348015610800575f80fd5b5061036a60145481565b348015610815575f80fd5b506103bd610824366004612a7f565b611770565b348015610834575f80fd5b5061035361177d565b348015610848575f80fd5b50600b5461042b906001600160a01b031681565b348015610867575f80fd5b506103536117ad565b34801561087b575f80fd5b506103536117f0565b34801561088f575f80fd5b5061035361089e366004612b43565b611820565b3480156108ae575f80fd5b5060075461042b906001600160a01b031681565b3480156108cd575f80fd5b5061036a6108dc366004612b76565b6118a6565b3480156108ec575f80fd5b50600e546103bd90600160a01b900460ff1681565b34801561090c575f80fd5b5061035361091b366004612aa9565b6118d0565b34801561092b575f80fd5b506103bd61093a366004612b76565b611968565b34801561094a575f80fd5b5061036a60175481565b34801561095f575f80fd5b5061035361096e366004612aa9565b611a5d565b6005546001600160a01b031633146109a65760405162461bcd60e51b815260040161099d90612bad565b60405180910390fd5b6109b881670de0b6b3a7640000611ab3565b60245550565b6060600380546109cd90612be2565b80601f01602080910402602001604051908101604052809291908181526020018280546109f990612be2565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b5050505050905090565b5f33610a5b818585611ac5565b60019150505b92915050565b6005546001600160a01b03163314610a915760405162461bcd60e51b815260040161099d90612bad565b60255460ff1615610ae45760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c656400000000604482015260640161099d565b6025805460ff19166001179055565b5f33610b00858285611be8565b610b0b858585611c60565b506001949350505050565b6005545f906001600160a01b03163314610b425760405162461bcd60e51b815260040161099d90612bad565b620186a0610b4f60025490565b610b5a906001612c2e565b610b649190612c45565b821015610bd15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b606482015260840161099d565b6103e8610bdd60025490565b610be8906005612c2e565b610bf29190612c45565b821115610c5e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b606482015260840161099d565b50600981905560015b919050565b5f33610a5b818585610c7e83836118a6565b610c889190612c64565b611ac5565b6005545f906001600160a01b03163314610cb95760405162461bcd60e51b815260040161099d90612bad565b601554601654610cc99190612c64565b4211610d175760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e697368604482015260640161099d565b6103e8821115610d7c5760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b606482015260840161099d565b42601655600b546040516370a0823160e01b81526001600160a01b0390911660048201525f9030906370a0823190602401602060405180830381865afa158015610dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dec9190612c77565b90505f61271060115483610e009190612c2e565b610e0a9190612c45565b90508015610e2b57600b54610e2b906001600160a01b031661dead83612265565b600b546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae9916004808301925f92919082900301818387803b158015610e73575f80fd5b505af1158015610e85573d5f803e3d5ffd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb92505f9150a1506001949350505050565b6005546001600160a01b03163314610ee65760405162461bcd60e51b815260040161099d90612bad565b600d546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610f30576040519150601f19603f3d011682016040523d82523d5f602084013e610f35565b606091505b5050905080610f42575f80fd5b50565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314610f895760405162461bcd60e51b815260040161099d90612bad565b610f925f6123b7565b565b6005546001600160a01b03163314610fbe5760405162461bcd60e51b815260040161099d90612bad565b603c83101561102a5760405162461bcd60e51b815260206004820152603260248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015271616e2065766572792031206d696e7574657360701b606482015260840161099d565b6103e8821115801561103a575060015b61109f5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b606482015260840161099d565b6013929092556011556012805460ff1916911515919091179055565b6005545f906001600160a01b031633146110e75760405162461bcd60e51b815260040161099d90612bad565b50600e805460ff60a01b19169055600190565b6005546001600160a01b031633146111245760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b03919091165f908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111785760405162461bcd60e51b815260040161099d90612bad565b60255460ff1615156001146111cf5760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c6564000000604482015260640161099d565b6025805460ff19169055565b6060600480546109cd90612be2565b5f80600b5f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112609190612c8e565b600e549091505f9061127a906001600160a01b0316610f45565b90505f600b5f9054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190612c8e565b600c54600f546001600160a01b03165f9081526010602052604090205491925010801561131c575081155b611324575f80fd5b5f80600b5f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a9190612cbf565b506024546025549294509092509060ff161561141857306001600160a01b0316639a31c0096040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114109190612d24565b509193505050505b5f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190612d70565b60ff16876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dc9190612d70565b6114ea9060ff16600a612e70565b6114fd846001600160701b038716612c2e565b6115079190612c2e565b6115119190612c45565b90505f6115276001600160701b03861683612c45565b9998505050505050505050565b5f805f805f805f805f8060225f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561158e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b29190612d24565b939e929d50909b50995090975095505050505050565b6005546001600160a01b031633146115f25760405162461bcd60e51b815260040161099d90612bad565b600b546001600160a01b03908116908316036116765760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161099d565b6116808282612408565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f33816116c882866118a6565b9050838110156117285760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161099d565b610b0b8286868403611ac5565b6005546001600160a01b0316331461175f5760405162461bcd60e51b815260040161099d90612bad565b610ee661176b30610f45565b612435565b5f33610a5b818585611c60565b6005546001600160a01b031633146117a75760405162461bcd60e51b815260040161099d90612bad565b5f601b55565b6005546001600160a01b031633146117d75760405162461bcd60e51b815260040161099d90612bad565b600e805460ff60a81b1916600160a81b17905542600c55565b6005546001600160a01b0316331461181a5760405162461bcd60e51b815260040161099d90612bad565b5f601c55565b6005546001600160a01b0316331461184a5760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b0382165f8181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146118fa5760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b03811661195f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099d565b610f42816123b7565b600b545f9081906001600160a01b03858116911614801561199757506006546001600160a01b03848116911614155b6001600160a01b0384165f90815260208052604090205490915060ff168180156119be5750805b156119c85742600c555b6001600160a01b0385165f90815260208052604081205460ff1680611a0357506001600160a01b0385165f90815260208052604090205460ff165b600b549091506001600160a01b038681169116145f8480611a215750815b90505f601754118015611a3e5750600b54600160a01b900460ff16155b8015611a48575082155b8015611a515750805b98975050505050505050565b6005546001600160a01b03163314611a875760405162461bcd60e51b815260040161099d90612bad565b602380546001600160a01b039092166001600160a01b0319928316811790915560228054909216179055565b5f611abe8284612c2e565b9392505050565b6001600160a01b038316611b275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099d565b6001600160a01b038216611b885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099d565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f611bf384846118a6565b90505f198114611c5a5781811015611c4d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161099d565b611c5a8484848403611ac5565b50505050565b600b545f906001600160a01b038581169116148015611c9757506001600160a01b0383165f9081526021602052604090205460ff16155b600b549091505f906001600160a01b038581169116148015611cd157506001600160a01b0385165f9081526021602052604090205460ff16155b6001600160a01b0386165f9081526020805260408120549192509060ff1680611d1057506001600160a01b0385165f90815260208052604090205460ff165b90505f611d256005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611d5157506005546001600160a01b038781169116145b90505f6001600160a01b0387161580611d7457506001600160a01b03871661dead145b90505f8280611d805750815b80611d945750600b54600160a01b900460ff165b90506001600160a01b038916611dbc5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b038816611de25760405162461bcd60e51b815260040161099d90612ec0565b865f03611dff57611df489895f612265565b505050505050505050565b600e54600160a01b900460ff168015611e16575080155b1561200557600e54600160a81b900460ff1680611e305750835b611e755760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1037b832b732b21760511b604482015260640161099d565b8515611f6257600854871115611ee65760405162461bcd60e51b815260206004820152603060248201527f427579207472616e73666572206578636565647320746865206d61782074726160448201526f3739b0b1ba34b7b71030b6b7bab73a1760811b606482015260840161099d565b600a54611ef289610f45565b611efc9089612c64565b1115611f5d5760405162461bcd60e51b815260206004820152602a60248201527f427579207472616e73666572206578636565647320746865206d61782077616c6044820152691b195d08185b5bdd5b9d60b21b606482015260840161099d565b612005565b84612005576001600160a01b0388165f9081526021602052604090205460ff16158015611fa757506001600160a01b0389165f9081526021602052604090205460ff16155b1561200557600a54611fb889610f45565b611fc29089612c64565b11156120055760405162461bcd60e51b81526020600482015260126024820152714d61782077616c6c6574206578636565642160701b604482015260640161099d565b60255460ff161561201a5761201a888a612585565b6001600160a01b0389165f90815260208052604090205460ff1615801561205857506001600160a01b0388165f90815260208052604090205460ff16155b801561206e5750600b54600160a01b900460ff16155b801561209257506001600160a01b0389165f9081526026602052604090205460ff16155b156120f6575f6120a130610f45565b6009549091508110156120b2612612565b80156120bb5750805b80156120c5575085155b156120f357600b805460ff60a01b1916600160a01b1790556120e561262c565b600b805460ff60a01b191690555b50505b5f6121018a8a611968565b6001600160a01b038b165f90815260208052604090205490915060ff16158061213c5761212f8b8b8b612841565b5050505050505050505050565b811561225e57601754601954891561217357601b5460175461215e9190612c64565b9150601b546019546121709190612c64565b90505b881561219e57601c546017546121899190612c64565b9150601c5460195461219b9190612c64565b90505b5f6121b460646121ae8e86611ab3565b90612851565b905082601854826121c59190612c2e565b6121cf9190612c45565b601d5f8282546121df9190612c64565b909155508390506121f08383612c2e565b6121fa9190612c45565b601e5f82825461220a9190612c64565b9091555050601a54839061221e9083612c2e565b6122289190612c45565b601f5f8282546122389190612c64565b9091555050801561224e5761224e8e3083612265565b612258818d612f03565b9b505050505b61212f8b8b8b5b6001600160a01b03831661228b5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b0382166122b15760405162461bcd60e51b815260040161099d90612ec0565b6001600160a01b0383165f90815260208190526040902054818110156123285760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161099d565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061235e908490612c64565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123aa91815260200190565b60405180910390a3611c5a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152602660205260409020805460ff191682151517905561168082826110fa565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061246857612468612f16565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e39190612c8e565b816001815181106124f6576124f6612f16565b6001600160a01b03928316602091820292909201015260065461251c9130911684611ac5565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906125549085905f90869030904290600401612f2a565b5f604051808303815f87803b15801561256b575f80fd5b505af115801561257d573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526026602052604090205460ff16156125e2576001600160a01b0382165f9081526010602052604081205490036125de576001600160a01b0382165f9081526010602052604090204290555b5050565b600b54600160a01b900460ff166125de57600f80546001600160a01b0319166001600160a01b0383161790555050565b5f8061261c6111ea565b1161262657505f90565b50600190565b5f61263630610f45565b90505f601f54601e54601d5461264c9190612c64565b6126569190612c64565b9050811580612663575080155b1561266c575050565b60095482111561267c5760095491505b5f600282601d548561268e9190612c2e565b6126989190612c45565b6126a29190612c45565b90505f6126af848361285c565b9050476126bb82612435565b5f6126c6478361285c565b90505f6126e2866121ae601e5485611ab390919063ffffffff16565b90505f6126fe876121ae601f5486611ab390919063ffffffff16565b90505f8161270c8486612f03565b6127169190612f03565b90505f8711801561272657505f81115b15612779576127358782612867565b601d54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b5f601d819055601e819055601f819055600d546040516001600160a01b039091169085908381818185875af1925050503d805f81146127d3576040519150601f19603f3d011682016040523d82523d5f602084013e6127d8565b606091505b50509050806127e5575f80fd5b600e546040515f916001600160a01b03169085908381818185875af1925050503d805f811461282f576040519150601f19603f3d011682016040523d82523d5f602084013e612834565b606091505b505090508061212f575f80fd5b61284c838284612939565b505050565b5f611abe8284612c45565b5f611abe8284612f03565b60065461287f9030906001600160a01b031684611ac5565b6006546001600160a01b031663f305d7198230855f806128a76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561290d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906129329190612f99565b5050505050565b6001600160a01b03831661295f5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b0381166129855760405162461bcd60e51b815260040161099d90612ec0565b6001600160a01b038084165f9081526020819052604080822080548681039091559284168252812080548592906129bd908490612c64565b92505081905550816001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516123aa91815260200190565b5f60208284031215612a19575f80fd5b5035919050565b5f6020808352835180828501525f5b81811015612a4b57858101830151858201604001528201612a2f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f42575f80fd5b5f8060408385031215612a90575f80fd5b8235612a9b81612a6b565b946020939093013593505050565b5f60208284031215612ab9575f80fd5b8135611abe81612a6b565b5f805f60608486031215612ad6575f80fd5b8335612ae181612a6b565b92506020840135612af181612a6b565b929592945050506040919091013590565b80358015158114610c67575f80fd5b5f805f60608486031215612b23575f80fd5b8335925060208401359150612b3a60408501612b02565b90509250925092565b5f8060408385031215612b54575f80fd5b8235612b5f81612a6b565b9150612b6d60208401612b02565b90509250929050565b5f8060408385031215612b87575f80fd5b8235612b9281612a6b565b91506020830135612ba281612a6b565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612bf657607f821691505b602082108103612c1457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a6157610a61612c1a565b5f82612c5f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a6157610a61612c1a565b5f60208284031215612c87575f80fd5b5051919050565b5f60208284031215612c9e575f80fd5b8151611abe81612a6b565b80516001600160701b0381168114610c67575f80fd5b5f805f60608486031215612cd1575f80fd5b612cda84612ca9565b9250612ce860208501612ca9565b9150604084015163ffffffff81168114612d00575f80fd5b809150509250925092565b805169ffffffffffffffffffff81168114610c67575f80fd5b5f805f805f60a08688031215612d38575f80fd5b612d4186612d0b565b9450602086015193506040860151925060608601519150612d6460808701612d0b565b90509295509295909350565b5f60208284031215612d80575f80fd5b815160ff81168114611abe575f80fd5b600181815b80851115612dca57815f1904821115612db057612db0612c1a565b80851615612dbd57918102915b93841c9390800290612d95565b509250929050565b5f82612de057506001610a61565b81612dec57505f610a61565b8160018114612e025760028114612e0c57612e28565b6001915050610a61565b60ff841115612e1d57612e1d612c1a565b50506001821b610a61565b5060208310610133831016604e8410600b8410161715612e4b575081810a610a61565b612e558383612d90565b805f1904821115612e6857612e68612c1a565b029392505050565b5f611abe8383612dd2565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a6157610a61612c1a565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015612f785784516001600160a01b031683529383019391830191600101612f53565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612fab575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220dc034a2cce28fe3a9af9a1d12befc402824b7d1a7d7cef45641fbafa8001cce864736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x608060405260043610610329575f3560e01c8063751039fc116101a3578063a4c82a00116100f2578063c1cafb5a11610092578063f2fde38b1161006d578063f2fde38b14610901578063f3344cdd14610920578063fea4fa4d1461093f578063fff5d40814610954575f80fd5b8063c1cafb5a146108a3578063dd62ed3e146108c2578063e73b90cd146108e1575f80fd5b8063b51449bb116100cd578063b51449bb1461083d578063bbc0c7421461085c578063be4dbe4814610870578063c024666814610884575f80fd5b8063a4c82a00146107f5578063a9059cbb1461080a578063afcee81f14610829575f80fd5b8063962dfc751161015d5780639a7a23d6116101385780639a7a23d61461078e5780639ec22c0e146107ad578063a457c2d7146107c2578063a487d151146107e1575f80fd5b8063962dfc7514610710578063976a7bec1461072f5780639a31c00914610743575f80fd5b8063751039fc146106835780637571336a1461069757806380672bb7146106b657806382247ec0146106ca5780638da5cb5b146106df57806395d89b41146106fc575f80fd5b806327f4d7d5116102795780634ec4ce3711610219578063625f3127116101f4578063625f31271461061d57806370a0823114610631578063715018a614610650578063730c188814610664575f80fd5b80634ec4ce37146105a95780634fbee193146105c8578063583e0568146105fe575f80fd5b80632fd689e3116102545780632fd689e31461053b578063313ce5671461055057806333c6c4cd1461056b578063395093511461058a575f80fd5b806327f4d7d5146104ed5780632c3e486c1461050d5780632e82f1a014610522575f80fd5b806311a63e17116102e4578063199ffc72116102bf578063199ffc721461046c578063206c17bb1461048157806323b872dd146104a057806324eec788146104bf575f80fd5b806311a63e171461040c57806318160ddd14610443578063184c16c514610457575f80fd5b80629f92621461033457806304beaeb81461035557806306fdde031461037d578063095ea7b31461039e5780630b18ad2c146103cd5780630ec13fff146103f8575f80fd5b3661033057005b5f80fd5b34801561033f575f80fd5b5061035361034e366004612a09565b610973565b005b348015610360575f80fd5b5061036a60085481565b6040519081526020015b60405180910390f35b348015610388575f80fd5b506103916109be565b6040516103749190612a20565b3480156103a9575f80fd5b506103bd6103b8366004612a7f565b610a4e565b6040519015158152602001610374565b3480156103d8575f80fd5b5061036a6103e7366004612aa9565b60106020525f908152604090205481565b348015610403575f80fd5b50610353610a67565b348015610417575f80fd5b50600e5461042b906001600160a01b031681565b6040516001600160a01b039091168152602001610374565b34801561044e575f80fd5b5060025461036a565b348015610462575f80fd5b5061036a60155481565b348015610477575f80fd5b5061036a60115481565b34801561048c575f80fd5b5060235461042b906001600160a01b031681565b3480156104ab575f80fd5b506103bd6104ba366004612ac4565b610af3565b3480156104ca575f80fd5b506103bd6104d9366004612aa9565b60266020525f908152604090205460ff1681565b3480156104f8575f80fd5b50600e546103bd90600160a81b900460ff1681565b348015610518575f80fd5b5061036a60135481565b34801561052d575f80fd5b506012546103bd9060ff1681565b348015610546575f80fd5b5061036a60095481565b34801561055b575f80fd5b5060405160128152602001610374565b348015610576575f80fd5b506103bd610585366004612a09565b610b16565b348015610595575f80fd5b506103bd6105a4366004612a7f565b610c6c565b3480156105b4575f80fd5b506103bd6105c3366004612a09565b610c8d565b3480156105d3575f80fd5b506103bd6105e2366004612aa9565b6001600160a01b03165f90815260208052604090205460ff1690565b348015610609575f80fd5b5060065461042b906001600160a01b031681565b348015610628575f80fd5b50610353610ebc565b34801561063c575f80fd5b5061036a61064b366004612aa9565b610f45565b34801561065b575f80fd5b50610353610f5f565b34801561066f575f80fd5b5061035361067e366004612b11565b610f94565b34801561068e575f80fd5b506103bd6110bb565b3480156106a2575f80fd5b506103536106b1366004612b43565b6110fa565b3480156106c1575f80fd5b5061035361114e565b3480156106d5575f80fd5b5061036a600a5481565b3480156106ea575f80fd5b506005546001600160a01b031661042b565b348015610707575f80fd5b506103916111db565b34801561071b575f80fd5b50600d5461042b906001600160a01b031681565b34801561073a575f80fd5b5061036a6111ea565b34801561074e575f80fd5b50610757611534565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610374565b348015610799575f80fd5b506103536107a8366004612b43565b6115c8565b3480156107b8575f80fd5b5061036a60165481565b3480156107cd575f80fd5b506103bd6107dc366004612a7f565b6116bb565b3480156107ec575f80fd5b50610353611735565b348015610800575f80fd5b5061036a60145481565b348015610815575f80fd5b506103bd610824366004612a7f565b611770565b348015610834575f80fd5b5061035361177d565b348015610848575f80fd5b50600b5461042b906001600160a01b031681565b348015610867575f80fd5b506103536117ad565b34801561087b575f80fd5b506103536117f0565b34801561088f575f80fd5b5061035361089e366004612b43565b611820565b3480156108ae575f80fd5b5060075461042b906001600160a01b031681565b3480156108cd575f80fd5b5061036a6108dc366004612b76565b6118a6565b3480156108ec575f80fd5b50600e546103bd90600160a01b900460ff1681565b34801561090c575f80fd5b5061035361091b366004612aa9565b6118d0565b34801561092b575f80fd5b506103bd61093a366004612b76565b611968565b34801561094a575f80fd5b5061036a60175481565b34801561095f575f80fd5b5061035361096e366004612aa9565b611a5d565b6005546001600160a01b031633146109a65760405162461bcd60e51b815260040161099d90612bad565b60405180910390fd5b6109b881670de0b6b3a7640000611ab3565b60245550565b6060600380546109cd90612be2565b80601f01602080910402602001604051908101604052809291908181526020018280546109f990612be2565b8015610a445780601f10610a1b57610100808354040283529160200191610a44565b820191905f5260205f20905b815481529060010190602001808311610a2757829003601f168201915b5050505050905090565b5f33610a5b818585611ac5565b60019150505b92915050565b6005546001600160a01b03163314610a915760405162461bcd60e51b815260040161099d90612bad565b60255460ff1615610ae45760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c656400000000604482015260640161099d565b6025805460ff19166001179055565b5f33610b00858285611be8565b610b0b858585611c60565b506001949350505050565b6005545f906001600160a01b03163314610b425760405162461bcd60e51b815260040161099d90612bad565b620186a0610b4f60025490565b610b5a906001612c2e565b610b649190612c45565b821015610bd15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b606482015260840161099d565b6103e8610bdd60025490565b610be8906005612c2e565b610bf29190612c45565b821115610c5e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b606482015260840161099d565b50600981905560015b919050565b5f33610a5b818585610c7e83836118a6565b610c889190612c64565b611ac5565b6005545f906001600160a01b03163314610cb95760405162461bcd60e51b815260040161099d90612bad565b601554601654610cc99190612c64565b4211610d175760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e697368604482015260640161099d565b6103e8821115610d7c5760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b606482015260840161099d565b42601655600b546040516370a0823160e01b81526001600160a01b0390911660048201525f9030906370a0823190602401602060405180830381865afa158015610dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dec9190612c77565b90505f61271060115483610e009190612c2e565b610e0a9190612c45565b90508015610e2b57600b54610e2b906001600160a01b031661dead83612265565b600b546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae9916004808301925f92919082900301818387803b158015610e73575f80fd5b505af1158015610e85573d5f803e3d5ffd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb92505f9150a1506001949350505050565b6005546001600160a01b03163314610ee65760405162461bcd60e51b815260040161099d90612bad565b600d546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610f30576040519150601f19603f3d011682016040523d82523d5f602084013e610f35565b606091505b5050905080610f42575f80fd5b50565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b03163314610f895760405162461bcd60e51b815260040161099d90612bad565b610f925f6123b7565b565b6005546001600160a01b03163314610fbe5760405162461bcd60e51b815260040161099d90612bad565b603c83101561102a5760405162461bcd60e51b815260206004820152603260248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015271616e2065766572792031206d696e7574657360701b606482015260840161099d565b6103e8821115801561103a575060015b61109f5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b606482015260840161099d565b6013929092556011556012805460ff1916911515919091179055565b6005545f906001600160a01b031633146110e75760405162461bcd60e51b815260040161099d90612bad565b50600e805460ff60a01b19169055600190565b6005546001600160a01b031633146111245760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b03919091165f908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111785760405162461bcd60e51b815260040161099d90612bad565b60255460ff1615156001146111cf5760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c6564000000604482015260640161099d565b6025805460ff19169055565b6060600480546109cd90612be2565b5f80600b5f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112609190612c8e565b600e549091505f9061127a906001600160a01b0316610f45565b90505f600b5f9054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190612c8e565b600c54600f546001600160a01b03165f9081526010602052604090205491925010801561131c575081155b611324575f80fd5b5f80600b5f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a9190612cbf565b506024546025549294509092509060ff161561141857306001600160a01b0316639a31c0096040518163ffffffff1660e01b815260040160a060405180830381865afa1580156113ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114109190612d24565b509193505050505b5f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114799190612d70565b60ff16876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dc9190612d70565b6114ea9060ff16600a612e70565b6114fd846001600160701b038716612c2e565b6115079190612c2e565b6115119190612c45565b90505f6115276001600160701b03861683612c45565b9998505050505050505050565b5f805f805f805f805f8060225f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561158e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b29190612d24565b939e929d50909b50995090975095505050505050565b6005546001600160a01b031633146115f25760405162461bcd60e51b815260040161099d90612bad565b600b546001600160a01b03908116908316036116765760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161099d565b6116808282612408565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f33816116c882866118a6565b9050838110156117285760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161099d565b610b0b8286868403611ac5565b6005546001600160a01b0316331461175f5760405162461bcd60e51b815260040161099d90612bad565b610ee661176b30610f45565b612435565b5f33610a5b818585611c60565b6005546001600160a01b031633146117a75760405162461bcd60e51b815260040161099d90612bad565b5f601b55565b6005546001600160a01b031633146117d75760405162461bcd60e51b815260040161099d90612bad565b600e805460ff60a81b1916600160a81b17905542600c55565b6005546001600160a01b0316331461181a5760405162461bcd60e51b815260040161099d90612bad565b5f601c55565b6005546001600160a01b0316331461184a5760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b0382165f8181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146118fa5760405162461bcd60e51b815260040161099d90612bad565b6001600160a01b03811661195f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099d565b610f42816123b7565b600b545f9081906001600160a01b03858116911614801561199757506006546001600160a01b03848116911614155b6001600160a01b0384165f90815260208052604090205490915060ff168180156119be5750805b156119c85742600c555b6001600160a01b0385165f90815260208052604081205460ff1680611a0357506001600160a01b0385165f90815260208052604090205460ff165b600b549091506001600160a01b038681169116145f8480611a215750815b90505f601754118015611a3e5750600b54600160a01b900460ff16155b8015611a48575082155b8015611a515750805b98975050505050505050565b6005546001600160a01b03163314611a875760405162461bcd60e51b815260040161099d90612bad565b602380546001600160a01b039092166001600160a01b0319928316811790915560228054909216179055565b5f611abe8284612c2e565b9392505050565b6001600160a01b038316611b275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099d565b6001600160a01b038216611b885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099d565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f611bf384846118a6565b90505f198114611c5a5781811015611c4d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161099d565b611c5a8484848403611ac5565b50505050565b600b545f906001600160a01b038581169116148015611c9757506001600160a01b0383165f9081526021602052604090205460ff16155b600b549091505f906001600160a01b038581169116148015611cd157506001600160a01b0385165f9081526021602052604090205460ff16155b6001600160a01b0386165f9081526020805260408120549192509060ff1680611d1057506001600160a01b0385165f90815260208052604090205460ff165b90505f611d256005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611d5157506005546001600160a01b038781169116145b90505f6001600160a01b0387161580611d7457506001600160a01b03871661dead145b90505f8280611d805750815b80611d945750600b54600160a01b900460ff165b90506001600160a01b038916611dbc5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b038816611de25760405162461bcd60e51b815260040161099d90612ec0565b865f03611dff57611df489895f612265565b505050505050505050565b600e54600160a01b900460ff168015611e16575080155b1561200557600e54600160a81b900460ff1680611e305750835b611e755760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1037b832b732b21760511b604482015260640161099d565b8515611f6257600854871115611ee65760405162461bcd60e51b815260206004820152603060248201527f427579207472616e73666572206578636565647320746865206d61782074726160448201526f3739b0b1ba34b7b71030b6b7bab73a1760811b606482015260840161099d565b600a54611ef289610f45565b611efc9089612c64565b1115611f5d5760405162461bcd60e51b815260206004820152602a60248201527f427579207472616e73666572206578636565647320746865206d61782077616c6044820152691b195d08185b5bdd5b9d60b21b606482015260840161099d565b612005565b84612005576001600160a01b0388165f9081526021602052604090205460ff16158015611fa757506001600160a01b0389165f9081526021602052604090205460ff16155b1561200557600a54611fb889610f45565b611fc29089612c64565b11156120055760405162461bcd60e51b81526020600482015260126024820152714d61782077616c6c6574206578636565642160701b604482015260640161099d565b60255460ff161561201a5761201a888a612585565b6001600160a01b0389165f90815260208052604090205460ff1615801561205857506001600160a01b0388165f90815260208052604090205460ff16155b801561206e5750600b54600160a01b900460ff16155b801561209257506001600160a01b0389165f9081526026602052604090205460ff16155b156120f6575f6120a130610f45565b6009549091508110156120b2612612565b80156120bb5750805b80156120c5575085155b156120f357600b805460ff60a01b1916600160a01b1790556120e561262c565b600b805460ff60a01b191690555b50505b5f6121018a8a611968565b6001600160a01b038b165f90815260208052604090205490915060ff16158061213c5761212f8b8b8b612841565b5050505050505050505050565b811561225e57601754601954891561217357601b5460175461215e9190612c64565b9150601b546019546121709190612c64565b90505b881561219e57601c546017546121899190612c64565b9150601c5460195461219b9190612c64565b90505b5f6121b460646121ae8e86611ab3565b90612851565b905082601854826121c59190612c2e565b6121cf9190612c45565b601d5f8282546121df9190612c64565b909155508390506121f08383612c2e565b6121fa9190612c45565b601e5f82825461220a9190612c64565b9091555050601a54839061221e9083612c2e565b6122289190612c45565b601f5f8282546122389190612c64565b9091555050801561224e5761224e8e3083612265565b612258818d612f03565b9b505050505b61212f8b8b8b5b6001600160a01b03831661228b5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b0382166122b15760405162461bcd60e51b815260040161099d90612ec0565b6001600160a01b0383165f90815260208190526040902054818110156123285760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161099d565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061235e908490612c64565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123aa91815260200190565b60405180910390a3611c5a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152602660205260409020805460ff191682151517905561168082826110fa565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061246857612468612f16565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e39190612c8e565b816001815181106124f6576124f6612f16565b6001600160a01b03928316602091820292909201015260065461251c9130911684611ac5565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906125549085905f90869030904290600401612f2a565b5f604051808303815f87803b15801561256b575f80fd5b505af115801561257d573d5f803e3d5ffd5b505050505050565b6001600160a01b0381165f9081526026602052604090205460ff16156125e2576001600160a01b0382165f9081526010602052604081205490036125de576001600160a01b0382165f9081526010602052604090204290555b5050565b600b54600160a01b900460ff166125de57600f80546001600160a01b0319166001600160a01b0383161790555050565b5f8061261c6111ea565b1161262657505f90565b50600190565b5f61263630610f45565b90505f601f54601e54601d5461264c9190612c64565b6126569190612c64565b9050811580612663575080155b1561266c575050565b60095482111561267c5760095491505b5f600282601d548561268e9190612c2e565b6126989190612c45565b6126a29190612c45565b90505f6126af848361285c565b9050476126bb82612435565b5f6126c6478361285c565b90505f6126e2866121ae601e5485611ab390919063ffffffff16565b90505f6126fe876121ae601f5486611ab390919063ffffffff16565b90505f8161270c8486612f03565b6127169190612f03565b90505f8711801561272657505f81115b15612779576127358782612867565b601d54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b5f601d819055601e819055601f819055600d546040516001600160a01b039091169085908381818185875af1925050503d805f81146127d3576040519150601f19603f3d011682016040523d82523d5f602084013e6127d8565b606091505b50509050806127e5575f80fd5b600e546040515f916001600160a01b03169085908381818185875af1925050503d805f811461282f576040519150601f19603f3d011682016040523d82523d5f602084013e612834565b606091505b505090508061212f575f80fd5b61284c838284612939565b505050565b5f611abe8284612c45565b5f611abe8284612f03565b60065461287f9030906001600160a01b031684611ac5565b6006546001600160a01b031663f305d7198230855f806128a76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561290d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906129329190612f99565b5050505050565b6001600160a01b03831661295f5760405162461bcd60e51b815260040161099d90612e7b565b6001600160a01b0381166129855760405162461bcd60e51b815260040161099d90612ec0565b6001600160a01b038084165f9081526020819052604080822080548681039091559284168252812080548592906129bd908490612c64565b92505081905550816001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516123aa91815260200190565b5f60208284031215612a19575f80fd5b5035919050565b5f6020808352835180828501525f5b81811015612a4b57858101830151858201604001528201612a2f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f42575f80fd5b5f8060408385031215612a90575f80fd5b8235612a9b81612a6b565b946020939093013593505050565b5f60208284031215612ab9575f80fd5b8135611abe81612a6b565b5f805f60608486031215612ad6575f80fd5b8335612ae181612a6b565b92506020840135612af181612a6b565b929592945050506040919091013590565b80358015158114610c67575f80fd5b5f805f60608486031215612b23575f80fd5b8335925060208401359150612b3a60408501612b02565b90509250925092565b5f8060408385031215612b54575f80fd5b8235612b5f81612a6b565b9150612b6d60208401612b02565b90509250929050565b5f8060408385031215612b87575f80fd5b8235612b9281612a6b565b91506020830135612ba281612a6b565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612bf657607f821691505b602082108103612c1457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a6157610a61612c1a565b5f82612c5f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a6157610a61612c1a565b5f60208284031215612c87575f80fd5b5051919050565b5f60208284031215612c9e575f80fd5b8151611abe81612a6b565b80516001600160701b0381168114610c67575f80fd5b5f805f60608486031215612cd1575f80fd5b612cda84612ca9565b9250612ce860208501612ca9565b9150604084015163ffffffff81168114612d00575f80fd5b809150509250925092565b805169ffffffffffffffffffff81168114610c67575f80fd5b5f805f805f60a08688031215612d38575f80fd5b612d4186612d0b565b9450602086015193506040860151925060608601519150612d6460808701612d0b565b90509295509295909350565b5f60208284031215612d80575f80fd5b815160ff81168114611abe575f80fd5b600181815b80851115612dca57815f1904821115612db057612db0612c1a565b80851615612dbd57918102915b93841c9390800290612d95565b509250929050565b5f82612de057506001610a61565b81612dec57505f610a61565b8160018114612e025760028114612e0c57612e28565b6001915050610a61565b60ff841115612e1d57612e1d612c1a565b50506001821b610a61565b5060208310610133831016604e8410600b8410161715612e4b575081810a610a61565b612e558383612d90565b805f1904821115612e6857612e68612c1a565b029392505050565b5f611abe8383612dd2565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a6157610a61612c1a565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015612f785784516001600160a01b031683529383019391830191600101612f53565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612fab575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220dc034a2cce28fe3a9af9a1d12befc402824b7d1a7d7cef45641fbafa8001cce864736f6c63430008140033

Deployed Bytecode Sourcemap

21826:17656:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36447:112;;;;;;;;;;-1:-1:-1;36447:112:0;;;;;:::i;:::-;;:::i;:::-;;21985:36;;;;;;;;;;;;;;;;;;;345:25:1;;;333:2;318:18;21985:36:0;;;;;;;;15915:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16988:242::-;;;;;;;;;;-1:-1:-1;16988:242:0;;;;;:::i;:::-;;:::i;:::-;;;1555:14:1;;1548:22;1530:41;;1518:2;1503:18;16988:242:0;1390:187:1;22384:52:0;;;;;;;;;;-1:-1:-1;22384:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;38913:174;;;;;;;;;;;;;:::i;22233:25::-;;;;;;;;;;-1:-1:-1;22233:25:0;;;;-1:-1:-1;;;;;22233:25:0;;;;;;-1:-1:-1;;;;;1998:32:1;;;1980:51;;1968:2;1953:18;22233:25:0;1834:203:1;16236:108:0;;;;;;;;;;-1:-1:-1;16324:12:0;;16236:108;;22621:47;;;;;;;;;;;;;;;;22443:35;;;;;;;;;;;;;;;;23215:71;;;;;;;;;;-1:-1:-1;23215:71:0;;;;-1:-1:-1;;;;;23215:71:0;;;17236:295;;;;;;;;;;-1:-1:-1;17236:295:0;;;;;:::i;:::-;;:::i;23391:53::-;;;;;;;;;;-1:-1:-1;23391:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22312:34;;;;;;;;;;-1:-1:-1;22312:34:0;;;;-1:-1:-1;;;22312:34:0;;;;;;22524:44;;;;;;;;;;;;;;;;22485:32;;;;;;;;;;-1:-1:-1;22485:32:0;;;;;;;;22028:34;;;;;;;;;;;;;;;;16135:93;;;;;;;;;;-1:-1:-1;16135:93:0;;16218:2;2645:36:1;;2633:2;2618:18;16135:93:0;2503:184:1;27563:492:0;;;;;;;;;;-1:-1:-1;27563:492:0;;;;;:::i;:::-;;:::i;17539:270::-;;;;;;;;;;-1:-1:-1;17539:270:0;;;;;:::i;:::-;;:::i;37872:1029::-;;;;;;;;;;-1:-1:-1;37872:1029:0;;;;;:::i;:::-;;:::i;33206:123::-;;;;;;;;;;-1:-1:-1;33206:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;33296:25:0;33272:4;33296:25;;;:16;:25;;;;;;;;;33206:123;21899:42;;;;;;;;;;-1:-1:-1;21899:42:0;;;;-1:-1:-1;;;;;21899:42:0;;;36089:172;;;;;;;;;;;;;:::i;16352:177::-;;;;;;;;;;-1:-1:-1;16352:177:0;;;;;:::i;:::-;;:::i;9539:103::-;;;;;;;;;;;;;:::i;36571:553::-;;;;;;;;;;-1:-1:-1;36571:553:0;;;;;:::i;:::-;;:::i;26290:122::-;;;;;;;;;;;;;:::i;28063:167::-;;;;;;;;;;-1:-1:-1;28063:167:0;;;;;:::i;:::-;;:::i;39095:176::-;;;;;;;;;;;;;:::i;22069:25::-;;;;;;;;;;;;;;;;9316:87;;;;;;;;;;-1:-1:-1;9389:6:0;;-1:-1:-1;;;;;9389:6:0;9316:87;;16023:104;;;;;;;;;;;;;:::i;22195:31::-;;;;;;;;;;-1:-1:-1;22195:31:0;;;;-1:-1:-1;;;;;22195:31:0;;;28429:807;;;;;;;;;;;;;:::i;26422:499::-;;;;;;;;;;;;;:::i;:::-;;;;3995:22:1;4044:15;;;4026:34;;4091:2;4076:18;;4069:34;;;;4119:18;;4112:34;;;;4177:2;4162:18;;4155:34;4226:15;;;4220:3;4205:19;;4198:44;3972:3;3957:19;26422:499:0;3732:516:1;25990:292:0;;;;;;;;;;-1:-1:-1;25990:292:0;;;;;:::i;:::-;;:::i;22675:35::-;;;;;;;;;;;;;;;;17817:505;;;;;;;;;;-1:-1:-1;17817:505:0;;;;;:::i;:::-;;:::i;35859:222::-;;;;;;;;;;;;;:::i;22585:29::-;;;;;;;;;;;;;;;;16537:234;;;;;;;;;;-1:-1:-1;16537:234:0;;;;;:::i;:::-;;:::i;36269:80::-;;;;;;;;;;;;;:::i;22101:20::-;;;;;;;;;;-1:-1:-1;22101:20:0;;;;-1:-1:-1;;;;;22101:20:0;;;25618:126;;;;;;;;;;;;;:::i;36357:82::-;;;;;;;;;;;;;:::i;28238:179::-;;;;;;;;;;-1:-1:-1;28238:179:0;;;;;:::i;:::-;;:::i;21948:30::-;;;;;;;;;;-1:-1:-1;21948:30:0;;;;-1:-1:-1;;;;;21948:30:0;;;16779:201;;;;;;;;;;-1:-1:-1;16779:201:0;;;;;:::i;:::-;;:::i;22271:34::-;;;;;;;;;;-1:-1:-1;22271:34:0;;;;-1:-1:-1;;;22271:34:0;;;;;;9650:238;;;;;;;;;;-1:-1:-1;9650:238:0;;;;;:::i;:::-;;:::i;26929:626::-;;;;;;;;;;-1:-1:-1;26929:626:0;;;;;:::i;:::-;;:::i;22719:25::-;;;;;;;;;;;;;;;;39279:155;;;;;;;;;;-1:-1:-1;39279:155:0;;;;;:::i;:::-;;:::i;36447:112::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;;;;;;;;;36535:15:::1;:3:::0;36543:6:::1;36535:7;:15::i;:::-;36511:14;:40:::0;-1:-1:-1;36447:112:0:o;15915:100::-;15969:13;16002:5;15995:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15915:100;:::o;16988:242::-;17107:4;8917:10;17168:32;8917:10;17184:7;17193:6;17168:8;:32::i;:::-;17218:4;17211:11;;;16988:242;;;;;:::o;38913:174::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;38981:19:::1;::::0;::::1;;:28;38973:69;;;::::0;-1:-1:-1;;;38973:69:0;;5594:2:1;38973:69:0::1;::::0;::::1;5576:21:1::0;5633:2;5613:18;;;5606:30;5672;5652:18;;;5645:58;5720:18;;38973:69:0::1;5392:352:1::0;38973:69:0::1;39053:19;:26:::0;;-1:-1:-1;;39053:26:0::1;39075:4;39053:26;::::0;;38913:174::o;17236:295::-;17367:4;8917:10;17425:38;17441:4;8917:10;17456:6;17425:15;:38::i;:::-;17474:27;17484:4;17490:2;17494:6;17474:9;:27::i;:::-;-1:-1:-1;17519:4:0;;17236:295;-1:-1:-1;;;;17236:295:0:o;27563:492::-;9389:6;;27665:4;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;27744:6:::1;27723:13;16324:12:::0;;;16236:108;27723:13:::1;:17;::::0;27739:1:::1;27723:17;:::i;:::-;27722:28;;;;:::i;:::-;27709:9;:41;;27687:144;;;::::0;-1:-1:-1;;;27687:144:0;;6478:2:1;27687:144:0::1;::::0;::::1;6460:21:1::0;6517:2;6497:18;;;6490:30;6556:34;6536:18;;;6529:62;-1:-1:-1;;;6607:18:1;;;6600:51;6668:19;;27687:144:0::1;6276:417:1::0;27687:144:0::1;27899:4;27878:13;16324:12:::0;;;16236:108;27878:13:::1;:17;::::0;27894:1:::1;27878:17;:::i;:::-;27877:26;;;;:::i;:::-;27864:9;:39;;27842:141;;;::::0;-1:-1:-1;;;27842:141:0;;6900:2:1;27842:141:0::1;::::0;::::1;6882:21:1::0;6939:2;6919:18;;;6912:30;6978:34;6958:18;;;6951:62;-1:-1:-1;;;7029:18:1;;;7022:50;7089:19;;27842:141:0::1;6698:416:1::0;27842:141:0::1;-1:-1:-1::0;27994:19:0::1;:31:::0;;;28043:4:::1;9522:1;27563:492:::0;;;:::o;17539:270::-;17654:4;8917:10;17715:64;8917:10;17731:7;17768:10;17740:25;8917:10;17731:7;17740:9;:25::i;:::-;:38;;;;:::i;:::-;17715:8;:64::i;37872:1029::-;9389:6;;37975:4;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;38060:19:::1;;38037:20;;:42;;;;:::i;:::-;38019:15;:60;37997:142;;;::::0;-1:-1:-1;;;37997:142:0;;7451:2:1;37997:142:0::1;::::0;::::1;7433:21:1::0;;;7470:18;;;7463:30;7529:34;7509:18;;;7502:62;7581:18;;37997:142:0::1;7249:356:1::0;37997:142:0::1;38169:4;38158:7;:15;;38150:70;;;::::0;-1:-1:-1;;;38150:70:0;;7812:2:1;38150:70:0::1;::::0;::::1;7794:21:1::0;7851:2;7831:18;;;7824:30;7890:34;7870:18;;;7863:62;-1:-1:-1;;;7941:18:1;;;7934:40;7991:19;;38150:70:0::1;7610:406:1::0;38150:70:0::1;38254:15;38231:20;:38:::0;38370:5:::1;::::0;38355:21:::1;::::0;-1:-1:-1;;;38355:21:0;;-1:-1:-1;;;;;38370:5:0;;::::1;38355:21;::::0;::::1;1980:51:1::0;38324:28:0::1;::::0;38355:4:::1;::::0;:14:::1;::::0;1953:18:1;;38355:21:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38324:52;;38426:20;38491:5;38472:16;;38449:20;:39;;;;:::i;:::-;:47;;;;:::i;:::-;38426:70:::0;-1:-1:-1;38603:16:0;;38599:102:::1;;38652:5;::::0;38636:53:::1;::::0;-1:-1:-1;;;;;38652:5:0::1;38667:6;38676:12:::0;38636:15:::1;:53::i;:::-;38813:5;::::0;38830:11:::1;::::0;;-1:-1:-1;;;;;;38830:11:0;;;;-1:-1:-1;;;;;38813:5:0;;::::1;::::0;;;38830:9:::1;::::0;:11:::1;::::0;;::::1;::::0;38776:19:::1;::::0;38830:11;;;;;;;38776:19;38813:5;38830:11;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38857:14:0::1;::::0;::::1;::::0;-1:-1:-1;38857:14:0;;-1:-1:-1;38857:14:0::1;-1:-1:-1::0;38889:4:0::1;::::0;37872:1029;-1:-1:-1;;;;37872:1029:0:o;36089:172::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;36169:16:::1;::::0;36161:65:::1;::::0;36144:12:::1;::::0;-1:-1:-1;;;;;36169:16:0::1;::::0;36200:21:::1;::::0;36144:12;36161:65;36144:12;36161:65;36200:21;36169:16;36161:65:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36143:83;;;36245:7;36237:16;;;::::0;::::1;;36132:129;36089:172::o:0;16352:177::-;-1:-1:-1;;;;;16503:18:0;16471:7;16503:18;;;;;;;;;;;;16352:177::o;9539:103::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;9604:30:::1;9631:1;9604:18;:30::i;:::-;9539:103::o:0;36571:553::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;36773:2:::1;36750:19;:25;;36728:125;;;::::0;-1:-1:-1;;;36728:125:0;;8622:2:1;36728:125:0::1;::::0;::::1;8604:21:1::0;8661:2;8641:18;;;8634:30;8700:34;8680:18;;;8673:62;-1:-1:-1;;;8751:18:1;;;8744:48;8809:19;;36728:125:0::1;8420:414:1::0;36728:125:0::1;36898:4;36886:8;:16;;:33;;;;-1:-1:-1::0;36906:13:0;36886:33:::1;36864:131;;;::::0;-1:-1:-1;;;36864:131:0;;9041:2:1;36864:131:0::1;::::0;::::1;9023:21:1::0;9080:2;9060:18;;;9053:30;9119:34;9099:18;;;9092:62;-1:-1:-1;;;9170:18:1;;;9163:46;9226:19;;36864:131:0::1;8839:412:1::0;36864:131:0::1;37006:15;:37:::0;;;;37054:16:::1;:27:::0;37092:13:::1;:24:::0;;-1:-1:-1;;37092:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36571:553::o;26290:122::-;9389:6;;26342:4;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;-1:-1:-1;26359:15:0::1;:23:::0;;-1:-1:-1;;;;26359:23:0::1;::::0;;;26290:122;:::o;28063:167::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28176:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;28176:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28063:167::o;39095:176::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;39164:19:::1;::::0;::::1;;:27;;:19:::0;:27:::1;39156:69;;;::::0;-1:-1:-1;;;39156:69:0;;9458:2:1;39156:69:0::1;::::0;::::1;9440:21:1::0;9497:2;9477:18;;;9470:30;9536:31;9516:18;;;9509:59;9585:18;;39156:69:0::1;9256:353:1::0;39156:69:0::1;39236:19;:27:::0;;-1:-1:-1;;39236:27:0::1;::::0;;39095:176::o;16023:104::-;16079:13;16112:7;16105:14;;;;;:::i;28429:807::-;28473:7;28493:21;28547:5;;;;;;;;;-1:-1:-1;;;;;28547:5:0;-1:-1:-1;;;;;28532:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28602:10;;28493:70;;-1:-1:-1;28574:15:0;;28592:21;;-1:-1:-1;;;;;28602:10:0;28592:9;:21::i;:::-;28574:39;;28624:21;28678:5;;;;;;;;;-1:-1:-1;;;;;28678:5:0;-1:-1:-1;;;;;28663:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28757:15;;28745:8;;-1:-1:-1;;;;;28745:8:0;28727:27;;;;:17;:27;;;;;;28624:70;;-1:-1:-1;;28727:61:0;;;;-1:-1:-1;28776:12:0;;28727:61;28705:94;;;;;;28811:16;28829;28866:5;;;;;;;;;-1:-1:-1;;;;;28866:5:0;-1:-1:-1;;;;;28851:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28915:14:0;;28944:19;;28810:76;;-1:-1:-1;28810:76:0;;-1:-1:-1;28915:14:0;28944:19;;28940:93;;;29001:4;-1:-1:-1;;;;;29001:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28980:41:0;;-1:-1:-1;;;;28940:93:0;29043:16;29147:6;-1:-1:-1;;;;;29147:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29139:26;;29116:6;-1:-1:-1;;;;;29116:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29104:30;;29108:26;;29104:2;:30;:::i;:::-;29063:37;29091:8;-1:-1:-1;;;;;29063:17:0;;:37;:::i;:::-;:72;;;;:::i;:::-;29062:103;;;;:::i;:::-;29043:122;-1:-1:-1;29176:9:0;29189:28;-1:-1:-1;;;;;29200:17:0;;29043:122;29189:28;:::i;:::-;29176:42;28429:807;-1:-1:-1;;;;;;;;;28429:807:0:o;26422:499::-;26511:6;26532;26553:7;26575;26597:6;26646:15;26676:13;26704:18;26737:17;26769:23;26806:10;;;;;;;;;-1:-1:-1;;;;;26806:10:0;-1:-1:-1;;;;;26806:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26631:203;;;;-1:-1:-1;26631:203:0;;-1:-1:-1;26631:203:0;-1:-1:-1;26631:203:0;;-1:-1:-1;26422:499:0;-1:-1:-1;;;;;;26422:499:0:o;25990:292::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;26099:5:::1;::::0;-1:-1:-1;;;;;26099:5:0;;::::1;26091:13:::0;;::::1;::::0;26083:83:::1;;;::::0;-1:-1:-1;;;26083:83:0;;13034:2:1;26083:83:0::1;::::0;::::1;13016:21:1::0;13073:2;13053:18;;;13046:30;13112:34;13092:18;;;13085:62;13183:27;13163:18;;;13156:55;13228:19;;26083:83:0::1;12832:421:1::0;26083:83:0::1;26177:41;26206:4;26212:5;26177:28;:41::i;:::-;26234:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;26234:40:0;::::1;::::0;::::1;::::0;;;::::1;25990:292:::0;;:::o;17817:505::-;17937:4;8917:10;17937:4;18025:25;8917:10;18042:7;18025:9;:25::i;:::-;17998:52;;18103:15;18083:16;:35;;18061:122;;;;-1:-1:-1;;;18061:122:0;;13460:2:1;18061:122:0;;;13442:21:1;13499:2;13479:18;;;13472:30;13538:34;13518:18;;;13511:62;-1:-1:-1;;;13589:18:1;;;13582:35;13634:19;;18061:122:0;13258:401:1;18061:122:0;18219:60;18228:5;18235:7;18263:15;18244:16;:34;18219:8;:60::i;35859:222::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;35913:37:::1;35925:24;35943:4;35925:9;:24::i;:::-;35913:11;:37::i;16537:234::-:0;16652:4;8917:10;16713:28;8917:10;16730:2;16734:6;16713:9;:28::i;36269:80::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;36340:1:::1;36325:12;:16:::0;36269:80::o;25618:126::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;25671:14:::1;:21:::0;;-1:-1:-1;;;;25671:21:0::1;-1:-1:-1::0;;;25671:21:0::1;::::0;;25721:15:::1;25703;:33:::0;25618:126::o;36357:82::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;36430:1:::1;36414:13;:17:::0;36357:82::o;28238:179::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28323:25:0;::::1;;::::0;;;:16:::1;:25:::0;;;;;;;;:36;;-1:-1:-1;;28323:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;28375:34;;1530:41:1;;;28375:34:0::1;::::0;1503:18:1;28375:34:0::1;;;;;;;28238:179:::0;;:::o;16779:201::-;-1:-1:-1;;;;;16945:18:0;;;16913:7;16945:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16779:201::o;9650:238::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9753:22:0;::::1;9731:110;;;::::0;-1:-1:-1;;;9731:110:0;;13866:2:1;9731:110:0::1;::::0;::::1;13848:21:1::0;13905:2;13885:18;;;13878:30;13944:34;13924:18;;;13917:62;-1:-1:-1;;;13995:18:1;;;13988:36;14041:19;;9731:110:0::1;13664:402:1::0;9731:110:0::1;9852:28;9871:8;9852:18;:28::i;26929:626::-:0;27044:5;;27002:4;;;;-1:-1:-1;;;;;27033:16:0;;;27044:5;;27033:16;:58;;;;-1:-1:-1;27074:16:0;;-1:-1:-1;;;;;27053:38:0;;;27074:16;;27053:38;;27033:58;-1:-1:-1;;;;;27127:27:0;;27102:22;27127:27;;;:16;:27;;;;;;27019:72;;-1:-1:-1;27127:27:0;;27019:72;27169:27;;;;;27179:17;27169:27;27165:66;;;27216:15;27198;:33;27165:66;-1:-1:-1;;;;;27267:25:0;;27242:22;27267:25;;;:16;:25;;;;;;;;;:56;;-1:-1:-1;;;;;;27296:27:0;;;;;;:16;:27;;;;;;;;27267:56;27362:5;;27242:81;;-1:-1:-1;;;;;;27349:18:0;;;27362:5;;27349:18;27334:12;27395:6;;:17;;;27405:7;27395:17;27379:33;;27459:1;27446:10;;:14;:41;;;;-1:-1:-1;27478:9:0;;-1:-1:-1;;;27478:9:0;;;;27477:10;27446:41;:76;;;;;27505:17;27504:18;27446:76;:101;;;;;27539:8;27446:101;27425:122;26929:626;-1:-1:-1;;;;;;;;26929:626:0:o;39279:155::-;9389:6;;-1:-1:-1;;;;;9389:6:0;8917:10;9451:23;9443:68;;;;-1:-1:-1;;;9443:68:0;;;;;;;:::i;:::-;39351:11:::1;:18:::0;;-1:-1:-1;;;;;39351:18:0;;::::1;-1:-1:-1::0;;;;;;39351:18:0;;::::1;::::0;::::1;::::0;;;39380:10:::1;:46:::0;;;;::::1;;::::0;;39279:155::o;7745:98::-;7803:7;7830:5;7834:1;7830;:5;:::i;:::-;7823:12;7745:98;-1:-1:-1;;;7745:98:0:o;19948:380::-;-1:-1:-1;;;;;20084:19:0;;20076:68;;;;-1:-1:-1;;;20076:68:0;;14273:2:1;20076:68:0;;;14255:21:1;14312:2;14292:18;;;14285:30;14351:34;14331:18;;;14324:62;-1:-1:-1;;;14402:18:1;;;14395:34;14446:19;;20076:68:0;14071:400:1;20076:68:0;-1:-1:-1;;;;;20163:21:0;;20155:68;;;;-1:-1:-1;;;20155:68:0;;14678:2:1;20155:68:0;;;14660:21:1;14717:2;14697:18;;;14690:30;14756:34;14736:18;;;14729:62;-1:-1:-1;;;14807:18:1;;;14800:32;14849:19;;20155:68:0;14476:398:1;20155:68:0;-1:-1:-1;;;;;20236:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20288:32;;345:25:1;;;20288:32:0;;318:18:1;20288:32:0;;;;;;;19948:380;;;:::o;20336:502::-;20471:24;20498:25;20508:5;20515:7;20498:9;:25::i;:::-;20471:52;;-1:-1:-1;;20538:16:0;:37;20534:297;;20638:6;20618:16;:26;;20592:117;;;;-1:-1:-1;;;20592:117:0;;15081:2:1;20592:117:0;;;15063:21:1;15120:2;15100:18;;;15093:30;15159:31;15139:18;;;15132:59;15208:18;;20592:117:0;14879:353:1;20592:117:0;20753:51;20762:5;20769:7;20797:6;20778:16;:25;20753:8;:51::i;:::-;20460:378;20336:502;;;:::o;29559:3363::-;29704:5;;29683:10;;-1:-1:-1;;;;;29696:13:0;;;29704:5;;29696:13;:53;;;;-1:-1:-1;;;;;;29714:35:0;;;;;;:31;:35;;;;;;;;29713:36;29696:53;29780:5;;29683:66;;-1:-1:-1;29760:11:0;;-1:-1:-1;;;;;29774:11:0;;;29780:5;;29774:11;:53;;;;-1:-1:-1;;;;;;29790:37:0;;;;;;:31;:37;;;;;;;;29789:38;29774:53;-1:-1:-1;;;;;29861:22:0;;29838:20;29861:22;;;:16;:22;;;;;;29760:67;;-1:-1:-1;29838:20:0;29861:22;;;:46;;-1:-1:-1;;;;;;29887:20:0;;;;;;:16;:20;;;;;;;;29861:46;29838:69;;29918:17;29946:7;9389:6;;-1:-1:-1;;;;;9389:6:0;;9316:87;29946:7;-1:-1:-1;;;;;29938:15:0;:4;-1:-1:-1;;;;;29938:15:0;;:32;;;-1:-1:-1;9389:6:0;;-1:-1:-1;;;;;29957:13:0;;;9389:6;;29957:13;29938:32;29918:52;-1:-1:-1;29981:13:0;-1:-1:-1;;;;;29997:16:0;;;;:41;;-1:-1:-1;;;;;;30017:21:0;;30031:6;30017:21;29997:41;29981:57;;30049:13;30065:12;:24;;;;30081:8;30065:24;:37;;;-1:-1:-1;30093:9:0;;-1:-1:-1;;;30093:9:0;;;;30065:37;30049:53;-1:-1:-1;;;;;;30123:18:0;;30115:68;;;;-1:-1:-1;;;30115:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30202:16:0;;30194:64;;;;-1:-1:-1;;;30194:64:0;;;;;;;:::i;:::-;30275:6;30285:1;30275:11;30271:94;;30303:28;30319:4;30325:2;30329:1;30303:15;:28::i;:::-;30347:7;;;;;;29559:3363;;;:::o;30271:94::-;30389:15;;-1:-1:-1;;;30389:15:0;;;;:28;;;;;30409:8;30408:9;30389:28;30385:849;;;30442:14;;-1:-1:-1;;;30442:14:0;;;;;:33;;;30460:15;30442:33;30434:68;;;;-1:-1:-1;;;30434:68:0;;16249:2:1;30434:68:0;;;16231:21:1;16288:2;16268:18;;;16261:30;-1:-1:-1;;;16307:18:1;;;16300:52;16369:18;;30434:68:0;16047:346:1;30434:68:0;30521:5;30517:706;;;30587:21;;30577:6;:31;;30547:153;;;;-1:-1:-1;;;30547:153:0;;16600:2:1;30547:153:0;;;16582:21:1;16639:2;16619:18;;;16612:30;16678:34;16658:18;;;16651:62;-1:-1:-1;;;16729:18:1;;;16722:46;16785:19;;30547:153:0;16398:412:1;30547:153:0;30775:10;;30758:13;30768:2;30758:9;:13::i;:::-;30749:22;;:6;:22;:::i;:::-;:36;;30719:152;;;;-1:-1:-1;;;30719:152:0;;17017:2:1;30719:152:0;;;16999:21:1;17056:2;17036:18;;;17029:30;17095:34;17075:18;;;17068:62;-1:-1:-1;;;17146:18:1;;;17139:40;17196:19;;30719:152:0;16815:406:1;30719:152:0;30517:706;;;30897:6;30893:330;;-1:-1:-1;;;;;30950:35:0;;;;;;:31;:35;;;;;;;;30949:36;:95;;;;-1:-1:-1;;;;;;31007:37:0;;;;;;:31;:37;;;;;;;;31006:38;30949:95;30927:296;;;31135:10;;31118:13;31128:2;31118:9;:13::i;:::-;31109:22;;:6;:22;:::i;:::-;:36;;31079:128;;;;-1:-1:-1;;;31079:128:0;;17428:2:1;31079:128:0;;;17410:21:1;17467:2;17447:18;;;17440:30;-1:-1:-1;;;17486:18:1;;;17479:48;17544:18;;31079:128:0;17226:342:1;31079:128:0;31248:19;;;;31244:47;;;31269:22;31282:2;31286:4;31269:12;:22::i;:::-;-1:-1:-1;;;;;31308:22:0;;;;;;:16;:22;;;;;;;;31307:23;:48;;;;-1:-1:-1;;;;;;31335:20:0;;;;;;:16;:20;;;;;;;;31334:21;31307:48;:62;;;;-1:-1:-1;31360:9:0;;-1:-1:-1;;;31360:9:0;;;;31359:10;31307:62;:93;;;;-1:-1:-1;;;;;;31374:26:0;;;;;;:20;:26;;;;;;;;31373:27;31307:93;31302:447;;;31417:28;31448:24;31466:4;31448:9;:24::i;:::-;31526:19;;31417:55;;-1:-1:-1;31502:43:0;;;31564:17;:15;:17::i;:::-;:28;;;;;31585:7;31564:28;:48;;;;;31597:15;31596:16;31564:48;31560:178;;;31633:9;:16;;-1:-1:-1;;;;31633:16:0;-1:-1:-1;;;31633:16:0;;;31668:18;:16;:18::i;:::-;31705:9;:17;;-1:-1:-1;;;;31705:17:0;;;31560:178;31402:347;;31302:447;31759:14;31776:21;31788:4;31794:2;31776:11;:21::i;:::-;-1:-1:-1;;;;;31831:22:0;;31808:19;31831:22;;;:16;:22;;;;;;31759:38;;-1:-1:-1;31831:22:0;;31830:23;;31866:1005;;31902:35;31920:4;31926:2;31930:6;31902:17;:35::i;:::-;31952:7;;;;;;;;29559:3363;;;:::o;31866:1005::-;31980:9;31976:895;;;32028:10;;32079:13;;32107:150;;;;32164:12;;32151:10;;:25;;;;:::i;:::-;32137:39;;32229:12;;32213:13;;:28;;;;:::i;:::-;32195:46;;32107:150;32275:6;32271:153;;;32329:13;;32316:10;;:26;;;;:::i;:::-;32302:40;;32395:13;;32379;;:29;;;;:::i;:::-;32361:47;;32271:153;32438:17;32458:32;32486:3;32458:23;:6;32469:11;32458:10;:23::i;:::-;:27;;:32::i;:::-;32438:52;;32555:11;32538:13;;32526:9;:25;;;;:::i;:::-;32525:41;;;;:::i;:::-;32505:16;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;32633:11:0;;-1:-1:-1;32602:27:0;32614:15;32602:9;:27;:::i;:::-;32601:43;;;;:::i;:::-;32581:16;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;32686:7:0;;32697:11;;32674:19;;:9;:19;:::i;:::-;32673:35;;;;:::i;:::-;32659:10;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;32729:13:0;;32725:101;;32763:47;32779:4;32793;32800:9;32763:15;:47::i;:::-;32840:19;32850:9;32840:19;;:::i;:::-;;;31991:880;;;31976:895;32881:33;32897:4;32903:2;32907:6;21111:708;-1:-1:-1;;;;;21242:18:0;;21234:68;;;;-1:-1:-1;;;21234:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21321:16:0;;21313:64;;;;-1:-1:-1;;;21313:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21463:15:0;;21441:19;21463:15;;;;;;;;;;;21511:21;;;;21489:109;;;;-1:-1:-1;;;21489:109:0;;17908:2:1;21489:109:0;;;17890:21:1;17947:2;17927:18;;;17920:30;17986:34;17966:18;;;17959:62;-1:-1:-1;;;18037:18:1;;;18030:36;18083:19;;21489:109:0;17706:402:1;21489:109:0;-1:-1:-1;;;;;21634:15:0;;;:9;:15;;;;;;;;;;;21652:20;;;21634:38;;21694:13;;;;;;;;:23;;21666:6;;21634:9;21694:23;;21666:6;;21694:23;:::i;:::-;;;;;;;;21750:2;-1:-1:-1;;;;;21735:26:0;21744:4;-1:-1:-1;;;;;21735:26:0;;21754:6;21735:26;;;;345:25:1;;333:2;318:18;;199:177;21735:26:0;;;;;;;;21774:37;29366:185;9896:191;9989:6;;;-1:-1:-1;;;;;10006:17:0;;;-1:-1:-1;;;;;;10006:17:0;;;;;;;10039:40;;9989:6;;;10006:17;9989:6;;10039:40;;9970:16;;10039:40;9959:128;9896:191;:::o;25752:230::-;-1:-1:-1;;;;;25835:26:0;;;;;;:20;:26;;;;;:34;;-1:-1:-1;;25835:34:0;;;;;;;25880:38;25835:26;:34;25880:25;:38::i;35372:473::-;35457:16;;;35471:1;35457:16;;;;;;;;35433:21;;35457:16;;;;;;;;;;-1:-1:-1;35457:16:0;35433:40;;35502:4;35484;35489:1;35484:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35484:23:0;;;:7;;;;;;;;;;:23;;;;35528:16;;:23;;;-1:-1:-1;;;35528:23:0;;;;:16;;;;;:21;;:23;;;;;35484:7;;35528:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35518:4;35523:1;35518:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35518:33:0;;;:7;;;;;;;;;:33;35596:16;;35564:63;;35581:4;;35596:16;35615:11;35564:8;:63::i;:::-;35640:16;;:197;;-1:-1:-1;;;35640:197:0;;-1:-1:-1;;;;;35640:16:0;;;;:67;;:197;;35722:11;;35640:16;;35764:4;;35791;;35811:15;;35640:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35422:423;35372:473;:::o;32930:268::-;-1:-1:-1;;;;;33001:26:0;;;;;;:20;:26;;;;;;;;32997:194;;;-1:-1:-1;;;;;33048:21:0;;;;;;:17;:21;;;;;;:26;;33044:71;;-1:-1:-1;;;;;33076:21:0;;;;;;:17;:21;;;;;33100:15;33076:39;;33044:71;32930:268;;:::o;32997:194::-;33153:9;;-1:-1:-1;;;33153:9:0;;;;33148:31;;33164:8;:15;;-1:-1:-1;;;;;;33164:15:0;-1:-1:-1;;;;;33164:15:0;;;;;32930:268;;:::o;29244:114::-;29294:4;29334:1;29318:13;:11;:13::i;:::-;:17;:32;;-1:-1:-1;29345:5:0;;29244:114::o;29318:32::-;-1:-1:-1;29338:4:0;;29244:114::o;33343:1646::-;33390:23;33416:24;33434:4;33416:9;:24::i;:::-;33390:50;;33451:23;33515:10;;33496:16;;33477;;:35;;;;:::i;:::-;:48;;;;:::i;:::-;33451:74;-1:-1:-1;33540:20:0;;;:44;;-1:-1:-1;33564:20:0;;33540:44;33536:57;;;33586:7;;33343:1646::o;33536:57::-;33625:19;;33607:15;:37;33603:107;;;33679:19;;33661:37;;33603:107;33720:23;33803:1;33785:15;33765:16;;33747:15;:34;;;;:::i;:::-;33746:54;;;;:::i;:::-;:58;;;;:::i;:::-;33720:84;-1:-1:-1;33815:26:0;33844:36;:15;33720:84;33844:19;:36::i;:::-;33815:65;-1:-1:-1;33919:21:0;33951:31;33815:65;33951:11;:31::i;:::-;33993:18;34014:44;:21;34040:17;34014:25;:44::i;:::-;33993:65;;34069:23;34095:53;34132:15;34095:32;34110:16;;34095:10;:14;;:32;;;;:::i;:53::-;34069:79;;34159:25;34187:47;34218:15;34187:26;34202:10;;34187;:14;;:26;;;;:::i;:47::-;34159:75;-1:-1:-1;34245:23:0;34159:75;34271:28;34284:15;34271:10;:28;:::i;:::-;:48;;;;:::i;:::-;34245:74;;34354:1;34336:15;:19;:42;;;;;34377:1;34359:15;:19;34336:42;34332:277;;;34395:47;34409:15;34426;34395:13;:47::i;:::-;34566:16;;34462:135;;;19564:25:1;;;19620:2;19605:18;;19598:34;;;19648:18;;;19641:34;;;;34462:135:0;;;;;;19552:2:1;34462:135:0;;;34332:277;34640:1;34621:16;:20;;;34652:16;:20;;;34683:10;:14;;;34750:16;;34742:58;;-1:-1:-1;;;;;34750:16:0;;;;34780:15;;34640:1;34742:58;34640:1;34742:58;34780:15;34750:16;34742:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34710:90;;;34809:20;34801:29;;;;;;34893:10;;34885:54;;34852:27;;-1:-1:-1;;;;;34893:10:0;;34917:17;;34852:27;34885:54;34852:27;34885:54;34917:17;34893:10;34885:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34851:88;;;34948:22;34940:31;;;;;29366:185;29499:44;29515:7;29524;29533:9;29499:15;:44::i;:::-;29366:185;;;:::o;7851:98::-;7909:7;7936:5;7940:1;7936;:5;:::i;7639:98::-;7697:7;7724:5;7728:1;7724;:5;:::i;34997:363::-;35111:16;;35079:63;;35096:4;;-1:-1:-1;;;;;35111:16:0;35130:11;35079:8;:63::i;:::-;35153:16;;-1:-1:-1;;;;;35153:16:0;:32;35193:9;35226:4;35246:11;35153:16;;35304:7;9389:6;;-1:-1:-1;;;;;9389:6:0;;9316:87;35304:7;35153:199;;;;;;-1:-1:-1;;;;;;35153:199:0;;;-1:-1:-1;;;;;20045:15:1;;;35153:199:0;;;20027:34:1;20077:18;;;20070:34;;;;20120:18;;;20113:34;;;;20163:18;;;20156:34;20227:15;;;20206:19;;;20199:44;35326:15:0;20259:19:1;;;20252:35;19961:19;;35153:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;34997:363;;:::o;18330:604::-;-1:-1:-1;;;;;18461:18:0;;18453:68;;;;-1:-1:-1;;;18453:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18540:16:0;;18532:64;;;;-1:-1:-1;;;18532:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18684:15:0;;;18660:21;18684:15;;;;;;;;;;;;;18755:22;;;18737:40;;;18809:13;;;;;;;:23;;18771:6;;18660:21;18809:23;;18771:6;;18809:23;:::i;:::-;;;;;;;;18865:2;-1:-1:-1;;;;;18850:26:0;18859:4;-1:-1:-1;;;;;18850:26:0;;18869:6;18850:26;;;;345:25:1;;333:2;318:18;;199:177;14:180;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:548::-;493:4;522:2;551;540:9;533:21;583:6;577:13;626:6;621:2;610:9;606:18;599:34;651:1;661:140;675:6;672:1;669:13;661:140;;;770:14;;;766:23;;760:30;736:17;;;755:2;732:26;725:66;690:10;;661:140;;;665:3;850:1;845:2;836:6;825:9;821:22;817:31;810:42;920:2;913;909:7;904:2;896:6;892:15;888:29;877:9;873:45;869:54;861:62;;;;381:548;;;;:::o;934:131::-;-1:-1:-1;;;;;1009:31:1;;999:42;;989:70;;1055:1;1052;1045:12;1070:315;1138:6;1146;1199:2;1187:9;1178:7;1174:23;1170:32;1167:52;;;1215:1;1212;1205:12;1167:52;1254:9;1241:23;1273:31;1298:5;1273:31;:::i;:::-;1323:5;1375:2;1360:18;;;;1347:32;;-1:-1:-1;;;1070:315:1:o;1582:247::-;1641:6;1694:2;1682:9;1673:7;1669:23;1665:32;1662:52;;;1710:1;1707;1700:12;1662:52;1749:9;1736:23;1768:31;1793:5;1768:31;:::i;2042:456::-;2119:6;2127;2135;2188:2;2176:9;2167:7;2163:23;2159:32;2156:52;;;2204:1;2201;2194:12;2156:52;2243:9;2230:23;2262:31;2287:5;2262:31;:::i;:::-;2312:5;-1:-1:-1;2369:2:1;2354:18;;2341:32;2382:33;2341:32;2382:33;:::i;:::-;2042:456;;2434:7;;-1:-1:-1;;;2488:2:1;2473:18;;;;2460:32;;2042:456::o;2926:160::-;2991:20;;3047:13;;3040:21;3030:32;;3020:60;;3076:1;3073;3066:12;3091:316;3165:6;3173;3181;3234:2;3222:9;3213:7;3209:23;3205:32;3202:52;;;3250:1;3247;3240:12;3202:52;3286:9;3273:23;3263:33;;3343:2;3332:9;3328:18;3315:32;3305:42;;3366:35;3397:2;3386:9;3382:18;3366:35;:::i;:::-;3356:45;;3091:316;;;;;:::o;3412:315::-;3477:6;3485;3538:2;3526:9;3517:7;3513:23;3509:32;3506:52;;;3554:1;3551;3544:12;3506:52;3593:9;3580:23;3612:31;3637:5;3612:31;:::i;:::-;3662:5;-1:-1:-1;3686:35:1;3717:2;3702:18;;3686:35;:::i;:::-;3676:45;;3412:315;;;;;:::o;4253:388::-;4321:6;4329;4382:2;4370:9;4361:7;4357:23;4353:32;4350:52;;;4398:1;4395;4388:12;4350:52;4437:9;4424:23;4456:31;4481:5;4456:31;:::i;:::-;4506:5;-1:-1:-1;4563:2:1;4548:18;;4535:32;4576:33;4535:32;4576:33;:::i;:::-;4628:7;4618:17;;;4253:388;;;;;:::o;4646:356::-;4848:2;4830:21;;;4867:18;;;4860:30;4926:34;4921:2;4906:18;;4899:62;4993:2;4978:18;;4646:356::o;5007:380::-;5086:1;5082:12;;;;5129;;;5150:61;;5204:4;5196:6;5192:17;5182:27;;5150:61;5257:2;5249:6;5246:14;5226:18;5223:38;5220:161;;5303:10;5298:3;5294:20;5291:1;5284:31;5338:4;5335:1;5328:15;5366:4;5363:1;5356:15;5220:161;;5007:380;;;:::o;5749:127::-;5810:10;5805:3;5801:20;5798:1;5791:31;5841:4;5838:1;5831:15;5865:4;5862:1;5855:15;5881:168;5954:9;;;5985;;6002:15;;;5996:22;;5982:37;5972:71;;6023:18;;:::i;6054:217::-;6094:1;6120;6110:132;;6164:10;6159:3;6155:20;6152:1;6145:31;6199:4;6196:1;6189:15;6227:4;6224:1;6217:15;6110:132;-1:-1:-1;6256:9:1;;6054:217::o;7119:125::-;7184:9;;;7205:10;;;7202:36;;;7218:18;;:::i;8021:184::-;8091:6;8144:2;8132:9;8123:7;8119:23;8115:32;8112:52;;;8160:1;8157;8150:12;8112:52;-1:-1:-1;8183:16:1;;8021:184;-1:-1:-1;8021:184:1:o;9614:251::-;9684:6;9737:2;9725:9;9716:7;9712:23;9708:32;9705:52;;;9753:1;9750;9743:12;9705:52;9785:9;9779:16;9804:31;9829:5;9804:31;:::i;9870:188::-;9949:13;;-1:-1:-1;;;;;9991:42:1;;9981:53;;9971:81;;10048:1;10045;10038:12;10063:450;10150:6;10158;10166;10219:2;10207:9;10198:7;10194:23;10190:32;10187:52;;;10235:1;10232;10225:12;10187:52;10258:40;10288:9;10258:40;:::i;:::-;10248:50;;10317:49;10362:2;10351:9;10347:18;10317:49;:::i;:::-;10307:59;;10409:2;10398:9;10394:18;10388:25;10453:10;10446:5;10442:22;10435:5;10432:33;10422:61;;10479:1;10476;10469:12;10422:61;10502:5;10492:15;;;10063:450;;;;;:::o;10518:179::-;10596:13;;10649:22;10638:34;;10628:45;;10618:73;;10687:1;10684;10677:12;10702:473;10805:6;10813;10821;10829;10837;10890:3;10878:9;10869:7;10865:23;10861:33;10858:53;;;10907:1;10904;10897:12;10858:53;10930:39;10959:9;10930:39;:::i;:::-;10920:49;;11009:2;10998:9;10994:18;10988:25;10978:35;;11053:2;11042:9;11038:18;11032:25;11022:35;;11097:2;11086:9;11082:18;11076:25;11066:35;;11120:49;11164:3;11153:9;11149:19;11120:49;:::i;:::-;11110:59;;10702:473;;;;;;;;:::o;11180:273::-;11248:6;11301:2;11289:9;11280:7;11276:23;11272:32;11269:52;;;11317:1;11314;11307:12;11269:52;11349:9;11343:16;11399:4;11392:5;11388:16;11381:5;11378:27;11368:55;;11419:1;11416;11409:12;11458:422;11547:1;11590:5;11547:1;11604:270;11625:7;11615:8;11612:21;11604:270;;;11684:4;11680:1;11676:6;11672:17;11666:4;11663:27;11660:53;;;11693:18;;:::i;:::-;11743:7;11733:8;11729:22;11726:55;;;11763:16;;;;11726:55;11842:22;;;;11802:15;;;;11604:270;;;11608:3;11458:422;;;;;:::o;11885:806::-;11934:5;11964:8;11954:80;;-1:-1:-1;12005:1:1;12019:5;;11954:80;12053:4;12043:76;;-1:-1:-1;12090:1:1;12104:5;;12043:76;12135:4;12153:1;12148:59;;;;12221:1;12216:130;;;;12128:218;;12148:59;12178:1;12169:10;;12192:5;;;12216:130;12253:3;12243:8;12240:17;12237:43;;;12260:18;;:::i;:::-;-1:-1:-1;;12316:1:1;12302:16;;12331:5;;12128:218;;12430:2;12420:8;12417:16;12411:3;12405:4;12402:13;12398:36;12392:2;12382:8;12379:16;12374:2;12368:4;12365:12;12361:35;12358:77;12355:159;;;-1:-1:-1;12467:19:1;;;12499:5;;12355:159;12546:34;12571:8;12565:4;12546:34;:::i;:::-;12616:6;12612:1;12608:6;12604:19;12595:7;12592:32;12589:58;;;12627:18;;:::i;:::-;12665:20;;11885:806;-1:-1:-1;;;11885:806:1:o;12696:131::-;12756:5;12785:36;12812:8;12806:4;12785:36;:::i;15237:401::-;15439:2;15421:21;;;15478:2;15458:18;;;15451:30;15517:34;15512:2;15497:18;;15490:62;-1:-1:-1;;;15583:2:1;15568:18;;15561:35;15628:3;15613:19;;15237:401::o;15643:399::-;15845:2;15827:21;;;15884:2;15864:18;;;15857:30;15923:34;15918:2;15903:18;;15896:62;-1:-1:-1;;;15989:2:1;15974:18;;15967:33;16032:3;16017:19;;15643:399::o;17573:128::-;17640:9;;;17661:11;;;17658:37;;;17675:18;;:::i;18245:127::-;18306:10;18301:3;18297:20;18294:1;18287:31;18337:4;18334:1;18327:15;18361:4;18358:1;18351:15;18377:980;18639:4;18687:3;18676:9;18672:19;18718:6;18707:9;18700:25;18744:2;18782:6;18777:2;18766:9;18762:18;18755:34;18825:3;18820:2;18809:9;18805:18;18798:31;18849:6;18884;18878:13;18915:6;18907;18900:22;18953:3;18942:9;18938:19;18931:26;;18992:2;18984:6;18980:15;18966:29;;19013:1;19023:195;19037:6;19034:1;19031:13;19023:195;;;19102:13;;-1:-1:-1;;;;;19098:39:1;19086:52;;19193:15;;;;19158:12;;;;19134:1;19052:9;19023:195;;;-1:-1:-1;;;;;;;19274:32:1;;;;19269:2;19254:18;;19247:60;-1:-1:-1;;;19338:3:1;19323:19;19316:35;19235:3;18377:980;-1:-1:-1;;;18377:980:1:o;20298:306::-;20386:6;20394;20402;20455:2;20443:9;20434:7;20430:23;20426:32;20423:52;;;20471:1;20468;20461:12;20423:52;20500:9;20494:16;20484:26;;20550:2;20539:9;20535:18;20529:25;20519:35;;20594:2;20583:9;20579:18;20573:25;20563:35;;20298:306;;;;;:::o

Swarm Source

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