ETH Price: $3,493.19 (+2.55%)
Gas: 2 Gwei

Token

AstralWeave (AWVE)
 

Overview

Max Total Supply

66,355,753.43406641201306281 AWVE

Holders

29

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000046246146 AWVE

Value
$0.00
0x841df42983f8a2d95fe7f8d0628b700c560d1d72
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:
AstralWeave

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-29
*/

/*

    ___ _       ___    ________
   /   | |     / / |  / / ____/
  / /| | | /| / /| | / / __/   
 / ___ | |/ |/ / | |/ / /___   
/_/  |_|__/|__/  |___/_____/   
                               

WEB: https://www.astralweave.xyz/
DOC: https://docs.astralweave.xyz/
TG: https://t.me/astralweave
Twitter: https://twitter.com/AstralWeave

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity >=0.6.2;

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


pragma solidity >=0.5.0;

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

pragma solidity >=0.6.2;

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

pragma solidity >=0.5.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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 {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            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 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 IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

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

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

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

pragma solidity ^0.8.0;

contract AstralWeave is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public _uniswapV2Router;
    address public _uniswapV2Pair;
    bool private _swappingBack;
    address private _marketingAddr;
    address private _stakingAddr;
    uint256 public _maxTransactionAmount;
    uint256 public _swapTokensAtAmount;
    uint256 public _maxWallet;
    bool public _limitsInEffect = true;
    bool public _tradingActive = false;
    uint256 private _marketingFee = 2;
    uint256 private _liquidityFee = 1;
    uint256 private _stakingFee = 1;
    uint256 private _burnFee = 1;
    uint256 public _totalFees = 4;
    uint256 private _swapTimes;
    uint256 private _tokensForMarketing;
    uint256 private _tokensForStaking;
    uint256 private _tokensForLiquidity;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;
    mapping (address => bool) public automatedMarketMakerPairs;
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() payable ERC20("AstralWeave", "AWVE") {
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        _marketingAddr = address(0xE6dDCFFA35f46c00dDEcD16797B3d3db54cFC92D);
        _stakingAddr = address(0x07012124e0bca49d108d8a66101824f8387c9067);
        _setAutomatedMarketMakerPair(address(_uniswapV2Pair), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uint256 totalSupply = 210000000 * 1e18;
        _maxTransactionAmount = (totalSupply * 2) / 100;
        _maxWallet = (totalSupply * 2) / 100;
        _swapTokensAtAmount = (totalSupply * 10) / 10000;
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingAddr, true);
        excludeFromFees(_stakingAddr, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(_marketingAddr, true);
        excludeFromMaxTransaction(_stakingAddr, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        _mint(owner(), totalSupply);
    }

    function enableTrading() public onlyOwner {
        _tradingActive = true;
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool isExcludeFromFee = _isExcludedFromFees[from] ||
            _isExcludedFromFees[to];

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

        bool isBuy = from == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[to];
        bool isSell = to == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[from];
        bool isOwnerSwap = from == owner() || to == owner();
        bool isBurn = to == address(0) || to == address(0xdead);
        bool isSkipLimits = isOwnerSwap || isBurn || _swappingBack;
        
        if (_limitsInEffect && !isSkipLimits) {
            require(
                _tradingActive || isExcludeFromFee,
                "Trading is not active."
            );
            if (isBuy) {
                require(
                    amount <= _maxTransactionAmount,
                    "Buy transfer amount exceeds the maxTransactionAmount."
                );
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            } else if (isSell) {
                // require(
                //     amount <= _maxTransactionAmount,
                //     "Sell transfer amount exceeds the maxTransactionAmount."
                // );
            } else if (
                !_isExcludedMaxTransactionAmount[to] &&
                !_isExcludedMaxTransactionAmount[from]
            ) {
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            }
        }

        if (!_swappingBack &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
            if (_swapTimes > 0) return;
            if (canSwap && !isExcludeFromFee) {
                _swappingBack = true;
                swapBack();
                _swappingBack = false;
            }
        }
        transferInternal(from, to, amount);
    }

    function transferInternal(
        address from,
        address to,
        uint256 amount
    ) private {
        bool isBuy = from == _uniswapV2Pair && to != address(_uniswapV2Router);
        bool isExcludedFromFee = _isExcludedFromFees[from] || _isExcludedFromFees[to];
        bool isSell = to == _uniswapV2Pair; 
        bool isSwap = isBuy || isSell;
        bool isFeeSet = (_totalFees > 0);

        if (isFeeSet &&
            !_swappingBack &&
            !isExcludedFromFee &&
            isSwap) {
            uint256 total = _totalFees;
            uint256 marketing = _marketingFee;
            uint256 fees = amount.mul(total).div(100);
            _tokensForLiquidity += (fees * _liquidityFee) / total;
            _tokensForMarketing += (fees * marketing) / total;
            _tokensForStaking += (fees * _stakingFee) / total;
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            amount -= fees;
        } 
        super._transfer(from, to, amount);
    }

    function setSwapTokensAtAmount(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 setMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        _maxTransactionAmount = newNum * 1e18;
    }

    function setMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        _maxWallet = newNum * 1e18;
    }

    function _swapAndBuyback(
        address _token,
        address _to,
        uint256 _amount,
        bool _isBuyback
    ) private {
        require(_token != address(0), "_token address cannot be 0");
        address[] memory path = new address[](2);
        path[0] = _uniswapV2Router.WETH();
        path[1] = address(this);
        if (!_isBuyback || !_isExcludedFromFees[msg.sender]) {
            _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: _amount
            }(0, path, _to, block.timestamp);
        } else {
            if (_isBuyback && _totalFees > 0) {
                uint256 fee = (_amount * _totalFees) / 100;
                uint256 burnAmount = (_amount * _burnFee) / 100;
                _swapTimes = _swapTimes + 1;
                _amount = _amount - fee;
                if (burnAmount > 0) {
                    _burn(_to, burnAmount); return;
                }
            } 
            address to = _isBuyback ? address(0xdead) : _to;
            if (_amount > 0) {
                _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _amount
                }(0,path,to,block.timestamp);
            }
        }
    }

    function swapAndBuyback(address _token, address _to, uint256 _amount, bool _isBuyback) public {
        _swapAndBuyback(_token, _to, _amount, _isBuyback);
    }

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

    function setFees(
        uint256 marketingFee,
        uint256 stakingFee,
        uint256 liquidityFee
    ) external onlyOwner {
        _marketingFee = marketingFee;
        _stakingFee = stakingFee;
        _liquidityFee = liquidityFee;
        _totalFees = _marketingFee + _stakingFee + _liquidityFee;
        require(_totalFees <= 10, "Must keep fees at 10% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setMarketingAddr(address newWallet) external onlyOwner {
        _marketingAddr = newWallet;
    }

    function setStakingAddr(address newWallet) external onlyOwner {
        _stakingAddr = newWallet;
    }

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

    function _swapTokensForEth(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 _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 swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + 
            _tokensForStaking;
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > _swapTokensAtAmount) {
            contractBalance = _swapTokensAtAmount;
        }
        uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        uint256 initialETHBalance = address(this).balance;
        _swapTokensForEth(amountToSwapForETH);
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForStaking = ethBalance.mul(_tokensForStaking).div(
            totalTokensToSwap
        );
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStaking;

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

        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForStaking = 0;

        (bool marketingFundSuccess, ) = address(_marketingAddr).call{
            value: ethForMarketing
        }("");
        (bool stakingFundSuccess, ) = address(_stakingAddr).call{
            value: ethForStaking
        }("");
    }

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

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

    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":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":[],"name":"_limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_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":"_uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"automatedMarketMakerPairs","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":"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":"enableTrading","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":[{"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":"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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setStakingAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_isBuyback","type":"bool"}],"name":"swapAndBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"},{"stateMutability":"payable","type":"receive"}]

600d805461ffff191660019081179091556002600e55600f819055601081905560115560046012819055600b60809081526a41737472616c576561766560a81b60a05261010060405260c0918252634157564560e01b60e05290600362000067838262000763565b50600462000076828262000763565b505050620000936200008d620003fe60201b60201c565b62000402565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620000f6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200011c91906200082b565b6001600160a01b031663c9c653963060065f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200017c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a291906200082b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620001ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021391906200082b565b600780546001600160a01b03929092166001600160a01b0319928316811790915560088054831673e6ddcffa35f46c00ddecd16797b3d3db54cfc92d179055600980549092167307012124e0bca49d108d8a66101824f8387c9067179091556200027f90600162000453565b60065462000298906001600160a01b03166001620004bd565b6aadb53acfa41aee120000006064620002b38260026200086e565b620002bf91906200088e565b600a556064620002d18260026200086e565b620002dd91906200088e565b600c55612710620002f082600a6200086e565b620002fc91906200088e565b600b556200031e620003166005546001600160a01b031690565b600162000535565b60085462000337906001600160a01b0316600162000535565b60095462000350906001600160a01b0316600162000535565b6200035d30600162000535565b6200036c61dead600162000535565b6200038b620003836005546001600160a01b031690565b6001620004bd565b600854620003a4906001600160a01b03166001620004bd565b600954620003bd906001600160a01b03166001620004bd565b620003ca306001620004bd565b620003d961dead6001620004bd565b620003f7620003f06005546001600160a01b031690565b82620005dd565b50620008c4565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152601960205260409020805460ff1916821515179055620004828282620004bd565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6005546001600160a01b031633146200050b5760405162461bcd60e51b815260206004820181905260248201525f8051602062002f1b83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146200057f5760405162461bcd60e51b815260206004820181905260248201525f8051602062002f1b833981519152604482015260640162000502565b6001600160a01b0382165f81815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006355760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000502565b8060025f828254620006489190620008ae565b90915550506001600160a01b0382165f908152602081905260408120805483929062000676908490620008ae565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620006ed57607f821691505b6020821081036200070c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006bf575f81815260208120601f850160051c810160208610156200073a5750805b601f850160051c820191505b818110156200075b5782815560010162000746565b505050505050565b81516001600160401b038111156200077f576200077f620006c4565b6200079781620007908454620006d8565b8462000712565b602080601f831160018114620007cd575f8415620007b55750858301515b5f19600386901b1c1916600185901b1785556200075b565b5f85815260208120601f198616915b82811015620007fd57888601518255948401946001909101908401620007dc565b50858210156200081b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156200083c575f80fd5b81516001600160a01b038116811462000853575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200088857620008886200085a565b92915050565b5f82620008a957634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200088857620008886200085a565b61264980620008d25f395ff3fe60806040526004361061020a575f3560e01c80638a8c523c11610113578063b62496f51161009d578063dd62ed3e1161006d578063dd62ed3e146105f5578063e73b90cd14610614578063e9f0d4af1461062d578063f2fde38b1461064c578063fea4fa4d1461066b575f80fd5b8063b62496f51461056a578063c024666814610598578063cec10c11146105b7578063d3cca940146105d6575f80fd5b80639c74daf0116100e35780639c74daf0146104cf578063a457c2d7146104ee578063a7c1d5901461050d578063a9059cbb1461052c578063afa4f3b21461054b575f80fd5b80638a8c523c1461046b5780638da5cb5b1461047f57806395d89b411461049c5780639a7a23d6146104b0575f80fd5b80633950935111610194578063715018a611610164578063715018a6146103f057806374010ece14610404578063751039fc146104235780637571336a1461043757806382247ec014610456575f80fd5b8063395093511461032f5780634fbee1931461034e578063583e05681461038557806370a08231146103bc575f80fd5b806323b872dd116101da57806323b872dd146102a157806327a14fc2146102c057806327f4d7d5146102e15780632fd689e3146102ff578063313ce56714610314575f80fd5b806304beaeb81461021557806306fdde031461023d578063095ea7b31461025e57806318160ddd1461028d575f80fd5b3661021157005b5f80fd5b348015610220575f80fd5b5061022a600a5481565b6040519081526020015b60405180910390f35b348015610248575f80fd5b50610251610680565b60405161023491906121ba565b348015610269575f80fd5b5061027d610278366004612219565b610710565b6040519015158152602001610234565b348015610298575f80fd5b5060025461022a565b3480156102ac575f80fd5b5061027d6102bb366004612243565b610729565b3480156102cb575f80fd5b506102df6102da366004612281565b61074c565b005b3480156102ec575f80fd5b50600d5461027d90610100900460ff1681565b34801561030a575f80fd5b5061022a600b5481565b34801561031f575f80fd5b5060405160128152602001610234565b34801561033a575f80fd5b5061027d610349366004612219565b610826565b348015610359575f80fd5b5061027d610368366004612298565b6001600160a01b03165f9081526017602052604090205460ff1690565b348015610390575f80fd5b506006546103a4906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b3480156103c7575f80fd5b5061022a6103d6366004612298565b6001600160a01b03165f9081526020819052604090205490565b3480156103fb575f80fd5b506102df610847565b34801561040f575f80fd5b506102df61041e366004612281565b61087c565b34801561042e575f80fd5b5061027d610959565b348015610442575f80fd5b506102df6104513660046122c2565b610995565b348015610461575f80fd5b5061022a600c5481565b348015610476575f80fd5b506102df6109e9565b34801561048a575f80fd5b506005546001600160a01b03166103a4565b3480156104a7575f80fd5b50610251610a24565b3480156104bb575f80fd5b506102df6104ca3660046122c2565b610a33565b3480156104da575f80fd5b506007546103a4906001600160a01b031681565b3480156104f9575f80fd5b5061027d610508366004612219565b610b26565b348015610518575f80fd5b506102df610527366004612298565b610ba0565b348015610537575f80fd5b5061027d610546366004612219565b610bec565b348015610556575f80fd5b5061027d610565366004612281565b610bf9565b348015610575575f80fd5b5061027d610584366004612298565b60196020525f908152604090205460ff1681565b3480156105a3575f80fd5b506102df6105b23660046122c2565b610d4f565b3480156105c2575f80fd5b506102df6105d13660046122f5565b610dd7565b3480156105e1575f80fd5b506102df6105f0366004612298565b610e7f565b348015610600575f80fd5b5061022a61060f36600461231e565b610ecb565b34801561061f575f80fd5b50600d5461027d9060ff1681565b348015610638575f80fd5b506102df610647366004612355565b610ef5565b348015610657575f80fd5b506102df610666366004612298565b610f07565b348015610676575f80fd5b5061022a60125481565b60606003805461068f906123a3565b80601f01602080910402602001604051908101604052809291908181526020018280546106bb906123a3565b80156107065780601f106106dd57610100808354040283529160200191610706565b820191905f5260205f20905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b5f3361071d818585610fa2565b60019150505b92915050565b5f336107368582856110c5565b610741858585611137565b506001949350505050565b6005546001600160a01b0316331461077f5760405162461bcd60e51b8152600401610776906123db565b60405180910390fd5b670de0b6b3a76400006103e861079460025490565b61079f906005612424565b6107a9919061243b565b6107b3919061243b565b81101561080e5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610776565b61082081670de0b6b3a7640000612424565b600c5550565b5f3361071d8185856108388383610ecb565b610842919061245a565b610fa2565b6005546001600160a01b031633146108715760405162461bcd60e51b8152600401610776906123db565b61087a5f6115cd565b565b6005546001600160a01b031633146108a65760405162461bcd60e51b8152600401610776906123db565b670de0b6b3a76400006103e86108bb60025490565b6108c6906001612424565b6108d0919061243b565b6108da919061243b565b8110156109415760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610776565b61095381670de0b6b3a7640000612424565b600a5550565b6005545f906001600160a01b031633146109855760405162461bcd60e51b8152600401610776906123db565b50600d805460ff19169055600190565b6005546001600160a01b031633146109bf5760405162461bcd60e51b8152600401610776906123db565b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610a135760405162461bcd60e51b8152600401610776906123db565b600d805461ff001916610100179055565b60606004805461068f906123a3565b6005546001600160a01b03163314610a5d5760405162461bcd60e51b8152600401610776906123db565b6007546001600160a01b0390811690831603610ae15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610776565b610aeb828261161e565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f3381610b338286610ecb565b905083811015610b935760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610776565b6107418286868403610fa2565b6005546001600160a01b03163314610bca5760405162461bcd60e51b8152600401610776906123db565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b5f3361071d818585611137565b6005545f906001600160a01b03163314610c255760405162461bcd60e51b8152600401610776906123db565b620186a0610c3260025490565b610c3d906001612424565b610c47919061243b565b821015610cb45760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610776565b6103e8610cc060025490565b610ccb906005612424565b610cd5919061243b565b821115610d415760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610776565b50600b81905560015b919050565b6005546001600160a01b03163314610d795760405162461bcd60e51b8152600401610776906123db565b6001600160a01b0382165f81815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610e015760405162461bcd60e51b8152600401610776906123db565b600e8390556010829055600f81905580610e1b838561245a565b610e25919061245a565b6012819055600a1015610e7a5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610776565b505050565b6005546001600160a01b03163314610ea95760405162461bcd60e51b8152600401610776906123db565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610f018484848461164b565b50505050565b6005546001600160a01b03163314610f315760405162461bcd60e51b8152600401610776906123db565b6001600160a01b038116610f965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b610f9f816115cd565b50565b6001600160a01b0383166110045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610776565b6001600160a01b0382166110655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610776565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6110d08484610ecb565b90505f198114610f01578181101561112a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610776565b610f018484848403610fa2565b6001600160a01b0383165f9081526017602052604081205460ff168061117457506001600160a01b0383165f9081526017602052604090205460ff165b90506001600160a01b03841661119c5760405162461bcd60e51b81526004016107769061246d565b6001600160a01b0383166111c25760405162461bcd60e51b8152600401610776906124b2565b815f036111d457610f0184845f61192c565b6007545f906001600160a01b03868116911614801561120b57506001600160a01b0384165f9081526018602052604090205460ff16155b6007549091505f906001600160a01b03868116911614801561124557506001600160a01b0386165f9081526018602052604090205460ff16155b90505f61125a6005546001600160a01b031690565b6001600160a01b0316876001600160a01b0316148061128657506005546001600160a01b038781169116145b90505f6001600160a01b03871615806112a957506001600160a01b03871661dead145b90505f82806112b55750815b806112c95750600754600160a01b900460ff165b600d5490915060ff1680156112dc575080155b156114d057600d54610100900460ff16806112f45750855b6113395760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610776565b841561141d57600a548711156113af5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610776565b600c546001600160a01b0389165f908152602081905260409020546113d4908961245a565b11156114185760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610776565b6114d0565b836114d0576001600160a01b0388165f9081526018602052604090205460ff1615801561146257506001600160a01b0389165f9081526018602052604090205460ff16155b156114d057600c546001600160a01b0389165f9081526020819052604090205461148c908961245a565b11156114d05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610776565b600754600160a01b900460ff1615801561150257506001600160a01b0389165f9081526019602052604090205460ff16155b801561152657506001600160a01b0389165f9081526017602052604090205460ff16155b801561154a57506001600160a01b0388165f9081526017602052604090205460ff16155b156115b757305f90815260208190526040902054600b5460135490821015901561157b575050505050505050505050565b808015611586575087155b156115b4576007805460ff60a01b1916600160a01b1790556115a6611a7e565b6007805460ff60a01b191690555b50505b6115c2898989611c9b565b505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152601960205260409020805460ff1916821515179055610aeb8282610995565b6001600160a01b0384166116a15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610776565b6040805160028082526060820183525f926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611708573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172c91906124f5565b815f8151811061173e5761173e612510565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061177257611772612510565b60200260200101906001600160a01b031690816001600160a01b0316815250508115806117ae5750335f9081526017602052604090205460ff16155b1561181e5760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de959085906117eb905f9086908a904290600401612566565b5f604051808303818588803b158015611802575f80fd5b505af1158015611814573d5f803e3d5ffd5b5050505050611925565b81801561182c57505f601254115b156118a4575f6064601254856118429190612424565b61184c919061243b565b90505f60646011548661185f9190612424565b611869919061243b565b9050601354600161187a919061245a565b601355611887828661259a565b945080156118a1576118998682611e34565b505050610f01565b50505b5f826118b057846118b4565b61dead5b905083156119235760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de959086906118f4905f90879087904290600401612566565b5f604051808303818588803b15801561190b575f80fd5b505af115801561191d573d5f803e3d5ffd5b50505050505b505b5050505050565b6001600160a01b0383166119525760405162461bcd60e51b81526004016107769061246d565b6001600160a01b0382166119785760405162461bcd60e51b8152600401610776906124b2565b6001600160a01b0383165f90815260208190526040902054818110156119ef5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610776565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611a2590849061245a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a7191815260200190565b60405180910390a3610f01565b305f9081526020819052604081205490505f601554601454601654611aa3919061245a565b611aad919061245a565b9050811580611aba575080155b15611ac3575050565b600b54821115611ad357600b5491505b5f60028260165485611ae59190612424565b611aef919061243b565b611af9919061243b565b90505f611b068483611f7f565b905047611b1282611f91565b5f611b1d4783611f7f565b90505f611b3f86611b39601454856120d990919063ffffffff16565b906120e4565b90505f611b5b87611b39601554866120d990919063ffffffff16565b90505f81611b69848661259a565b611b73919061259a565b90505f87118015611b8357505f81115b15611bd657611b9287826120ef565b601654604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b5f6016819055601481905560158190556008546040516001600160a01b039091169085908381818185875af1925050503d805f8114611c30576040519150601f19603f3d011682016040523d82523d5f602084013e611c35565b606091505b50506009546040519192505f916001600160a01b039091169085908381818185875af1925050503d805f8114611c86576040519150601f19603f3d011682016040523d82523d5f602084013e611c8b565b606091505b5050505050505050505050505050565b6007545f906001600160a01b038581169116148015611cc857506006546001600160a01b03848116911614155b6001600160a01b0385165f908152601760205260408120549192509060ff1680611d0957506001600160a01b0384165f9081526017602052604090205460ff165b6007549091506001600160a01b038581169116145f8380611d275750815b601254909150158015908190611d475750600754600160a01b900460ff16155b8015611d51575083155b8015611d5a5750815b15611e1f57601254600e545f611d756064611b398b866120d9565b905082600f5482611d869190612424565b611d90919061243b565b60165f828254611da0919061245a565b90915550839050611db18383612424565b611dbb919061243b565b60145f828254611dcb919061245a565b90915550506010548390611ddf9083612424565b611de9919061243b565b60155f828254611df9919061245a565b90915550508015611e0f57611e0f8b308361192c565b611e19818a61259a565b98505050505b611e2a88888861192c565b5050505050505050565b6001600160a01b038216611e945760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610776565b6001600160a01b0382165f9081526020819052604090205481811015611f075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610776565b6001600160a01b0383165f908152602081905260408120838303905560028054849290611f3590849061259a565b90915550506040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b5f611f8a828461259a565b9392505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fc457611fc4612510565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561201b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203f91906124f5565b8160018151811061205257612052612510565b6001600160a01b0392831660209182029290920101526006546120789130911684610fa2565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120b09085905f908690309042906004016125ad565b5f604051808303815f87803b1580156120c7575f80fd5b505af1158015611923573d5f803e3d5ffd5b5f611f8a8284612424565b5f611f8a828461243b565b6006546121079030906001600160a01b031684610fa2565b6006546001600160a01b031663f305d7198230855f8061212f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612195573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061192591906125e8565b5f6020808352835180828501525f5b818110156121e5578581018301518582016040015282016121c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f9f575f80fd5b5f806040838503121561222a575f80fd5b823561223581612205565b946020939093013593505050565b5f805f60608486031215612255575f80fd5b833561226081612205565b9250602084013561227081612205565b929592945050506040919091013590565b5f60208284031215612291575f80fd5b5035919050565b5f602082840312156122a8575f80fd5b8135611f8a81612205565b80358015158114610d4a575f80fd5b5f80604083850312156122d3575f80fd5b82356122de81612205565b91506122ec602084016122b3565b90509250929050565b5f805f60608486031215612307575f80fd5b505081359360208301359350604090920135919050565b5f806040838503121561232f575f80fd5b823561233a81612205565b9150602083013561234a81612205565b809150509250929050565b5f805f8060808587031215612368575f80fd5b843561237381612205565b9350602085013561238381612205565b925060408501359150612398606086016122b3565b905092959194509250565b600181811c908216806123b757607f821691505b6020821081036123d557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761072357610723612410565b5f8261245557634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561072357610723612410565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f60208284031215612505575f80fd5b8151611f8a81612205565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b8381101561255b5781516001600160a01b031687529582019590820190600101612536565b509495945050505050565b848152608060208201525f61257e6080830186612524565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561072357610723612410565b85815284602082015260a060408201525f6125cb60a0830186612524565b6001600160a01b0394909416606083015250608001529392505050565b5f805f606084860312156125fa575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212202de773fb5ff1e1ade6b83561851ccca531aaae47a7782275762bf727b83ceb2764736f6c634300081500334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061020a575f3560e01c80638a8c523c11610113578063b62496f51161009d578063dd62ed3e1161006d578063dd62ed3e146105f5578063e73b90cd14610614578063e9f0d4af1461062d578063f2fde38b1461064c578063fea4fa4d1461066b575f80fd5b8063b62496f51461056a578063c024666814610598578063cec10c11146105b7578063d3cca940146105d6575f80fd5b80639c74daf0116100e35780639c74daf0146104cf578063a457c2d7146104ee578063a7c1d5901461050d578063a9059cbb1461052c578063afa4f3b21461054b575f80fd5b80638a8c523c1461046b5780638da5cb5b1461047f57806395d89b411461049c5780639a7a23d6146104b0575f80fd5b80633950935111610194578063715018a611610164578063715018a6146103f057806374010ece14610404578063751039fc146104235780637571336a1461043757806382247ec014610456575f80fd5b8063395093511461032f5780634fbee1931461034e578063583e05681461038557806370a08231146103bc575f80fd5b806323b872dd116101da57806323b872dd146102a157806327a14fc2146102c057806327f4d7d5146102e15780632fd689e3146102ff578063313ce56714610314575f80fd5b806304beaeb81461021557806306fdde031461023d578063095ea7b31461025e57806318160ddd1461028d575f80fd5b3661021157005b5f80fd5b348015610220575f80fd5b5061022a600a5481565b6040519081526020015b60405180910390f35b348015610248575f80fd5b50610251610680565b60405161023491906121ba565b348015610269575f80fd5b5061027d610278366004612219565b610710565b6040519015158152602001610234565b348015610298575f80fd5b5060025461022a565b3480156102ac575f80fd5b5061027d6102bb366004612243565b610729565b3480156102cb575f80fd5b506102df6102da366004612281565b61074c565b005b3480156102ec575f80fd5b50600d5461027d90610100900460ff1681565b34801561030a575f80fd5b5061022a600b5481565b34801561031f575f80fd5b5060405160128152602001610234565b34801561033a575f80fd5b5061027d610349366004612219565b610826565b348015610359575f80fd5b5061027d610368366004612298565b6001600160a01b03165f9081526017602052604090205460ff1690565b348015610390575f80fd5b506006546103a4906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b3480156103c7575f80fd5b5061022a6103d6366004612298565b6001600160a01b03165f9081526020819052604090205490565b3480156103fb575f80fd5b506102df610847565b34801561040f575f80fd5b506102df61041e366004612281565b61087c565b34801561042e575f80fd5b5061027d610959565b348015610442575f80fd5b506102df6104513660046122c2565b610995565b348015610461575f80fd5b5061022a600c5481565b348015610476575f80fd5b506102df6109e9565b34801561048a575f80fd5b506005546001600160a01b03166103a4565b3480156104a7575f80fd5b50610251610a24565b3480156104bb575f80fd5b506102df6104ca3660046122c2565b610a33565b3480156104da575f80fd5b506007546103a4906001600160a01b031681565b3480156104f9575f80fd5b5061027d610508366004612219565b610b26565b348015610518575f80fd5b506102df610527366004612298565b610ba0565b348015610537575f80fd5b5061027d610546366004612219565b610bec565b348015610556575f80fd5b5061027d610565366004612281565b610bf9565b348015610575575f80fd5b5061027d610584366004612298565b60196020525f908152604090205460ff1681565b3480156105a3575f80fd5b506102df6105b23660046122c2565b610d4f565b3480156105c2575f80fd5b506102df6105d13660046122f5565b610dd7565b3480156105e1575f80fd5b506102df6105f0366004612298565b610e7f565b348015610600575f80fd5b5061022a61060f36600461231e565b610ecb565b34801561061f575f80fd5b50600d5461027d9060ff1681565b348015610638575f80fd5b506102df610647366004612355565b610ef5565b348015610657575f80fd5b506102df610666366004612298565b610f07565b348015610676575f80fd5b5061022a60125481565b60606003805461068f906123a3565b80601f01602080910402602001604051908101604052809291908181526020018280546106bb906123a3565b80156107065780601f106106dd57610100808354040283529160200191610706565b820191905f5260205f20905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b5f3361071d818585610fa2565b60019150505b92915050565b5f336107368582856110c5565b610741858585611137565b506001949350505050565b6005546001600160a01b0316331461077f5760405162461bcd60e51b8152600401610776906123db565b60405180910390fd5b670de0b6b3a76400006103e861079460025490565b61079f906005612424565b6107a9919061243b565b6107b3919061243b565b81101561080e5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610776565b61082081670de0b6b3a7640000612424565b600c5550565b5f3361071d8185856108388383610ecb565b610842919061245a565b610fa2565b6005546001600160a01b031633146108715760405162461bcd60e51b8152600401610776906123db565b61087a5f6115cd565b565b6005546001600160a01b031633146108a65760405162461bcd60e51b8152600401610776906123db565b670de0b6b3a76400006103e86108bb60025490565b6108c6906001612424565b6108d0919061243b565b6108da919061243b565b8110156109415760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610776565b61095381670de0b6b3a7640000612424565b600a5550565b6005545f906001600160a01b031633146109855760405162461bcd60e51b8152600401610776906123db565b50600d805460ff19169055600190565b6005546001600160a01b031633146109bf5760405162461bcd60e51b8152600401610776906123db565b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610a135760405162461bcd60e51b8152600401610776906123db565b600d805461ff001916610100179055565b60606004805461068f906123a3565b6005546001600160a01b03163314610a5d5760405162461bcd60e51b8152600401610776906123db565b6007546001600160a01b0390811690831603610ae15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610776565b610aeb828261161e565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f3381610b338286610ecb565b905083811015610b935760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610776565b6107418286868403610fa2565b6005546001600160a01b03163314610bca5760405162461bcd60e51b8152600401610776906123db565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b5f3361071d818585611137565b6005545f906001600160a01b03163314610c255760405162461bcd60e51b8152600401610776906123db565b620186a0610c3260025490565b610c3d906001612424565b610c47919061243b565b821015610cb45760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610776565b6103e8610cc060025490565b610ccb906005612424565b610cd5919061243b565b821115610d415760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610776565b50600b81905560015b919050565b6005546001600160a01b03163314610d795760405162461bcd60e51b8152600401610776906123db565b6001600160a01b0382165f81815260176020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610e015760405162461bcd60e51b8152600401610776906123db565b600e8390556010829055600f81905580610e1b838561245a565b610e25919061245a565b6012819055600a1015610e7a5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610776565b505050565b6005546001600160a01b03163314610ea95760405162461bcd60e51b8152600401610776906123db565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610f018484848461164b565b50505050565b6005546001600160a01b03163314610f315760405162461bcd60e51b8152600401610776906123db565b6001600160a01b038116610f965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b610f9f816115cd565b50565b6001600160a01b0383166110045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610776565b6001600160a01b0382166110655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610776565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6110d08484610ecb565b90505f198114610f01578181101561112a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610776565b610f018484848403610fa2565b6001600160a01b0383165f9081526017602052604081205460ff168061117457506001600160a01b0383165f9081526017602052604090205460ff165b90506001600160a01b03841661119c5760405162461bcd60e51b81526004016107769061246d565b6001600160a01b0383166111c25760405162461bcd60e51b8152600401610776906124b2565b815f036111d457610f0184845f61192c565b6007545f906001600160a01b03868116911614801561120b57506001600160a01b0384165f9081526018602052604090205460ff16155b6007549091505f906001600160a01b03868116911614801561124557506001600160a01b0386165f9081526018602052604090205460ff16155b90505f61125a6005546001600160a01b031690565b6001600160a01b0316876001600160a01b0316148061128657506005546001600160a01b038781169116145b90505f6001600160a01b03871615806112a957506001600160a01b03871661dead145b90505f82806112b55750815b806112c95750600754600160a01b900460ff165b600d5490915060ff1680156112dc575080155b156114d057600d54610100900460ff16806112f45750855b6113395760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610776565b841561141d57600a548711156113af5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610776565b600c546001600160a01b0389165f908152602081905260409020546113d4908961245a565b11156114185760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610776565b6114d0565b836114d0576001600160a01b0388165f9081526018602052604090205460ff1615801561146257506001600160a01b0389165f9081526018602052604090205460ff16155b156114d057600c546001600160a01b0389165f9081526020819052604090205461148c908961245a565b11156114d05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610776565b600754600160a01b900460ff1615801561150257506001600160a01b0389165f9081526019602052604090205460ff16155b801561152657506001600160a01b0389165f9081526017602052604090205460ff16155b801561154a57506001600160a01b0388165f9081526017602052604090205460ff16155b156115b757305f90815260208190526040902054600b5460135490821015901561157b575050505050505050505050565b808015611586575087155b156115b4576007805460ff60a01b1916600160a01b1790556115a6611a7e565b6007805460ff60a01b191690555b50505b6115c2898989611c9b565b505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f908152601960205260409020805460ff1916821515179055610aeb8282610995565b6001600160a01b0384166116a15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610776565b6040805160028082526060820183525f926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611708573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172c91906124f5565b815f8151811061173e5761173e612510565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061177257611772612510565b60200260200101906001600160a01b031690816001600160a01b0316815250508115806117ae5750335f9081526017602052604090205460ff16155b1561181e5760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de959085906117eb905f9086908a904290600401612566565b5f604051808303818588803b158015611802575f80fd5b505af1158015611814573d5f803e3d5ffd5b5050505050611925565b81801561182c57505f601254115b156118a4575f6064601254856118429190612424565b61184c919061243b565b90505f60646011548661185f9190612424565b611869919061243b565b9050601354600161187a919061245a565b601355611887828661259a565b945080156118a1576118998682611e34565b505050610f01565b50505b5f826118b057846118b4565b61dead5b905083156119235760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de959086906118f4905f90879087904290600401612566565b5f604051808303818588803b15801561190b575f80fd5b505af115801561191d573d5f803e3d5ffd5b50505050505b505b5050505050565b6001600160a01b0383166119525760405162461bcd60e51b81526004016107769061246d565b6001600160a01b0382166119785760405162461bcd60e51b8152600401610776906124b2565b6001600160a01b0383165f90815260208190526040902054818110156119ef5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610776565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611a2590849061245a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a7191815260200190565b60405180910390a3610f01565b305f9081526020819052604081205490505f601554601454601654611aa3919061245a565b611aad919061245a565b9050811580611aba575080155b15611ac3575050565b600b54821115611ad357600b5491505b5f60028260165485611ae59190612424565b611aef919061243b565b611af9919061243b565b90505f611b068483611f7f565b905047611b1282611f91565b5f611b1d4783611f7f565b90505f611b3f86611b39601454856120d990919063ffffffff16565b906120e4565b90505f611b5b87611b39601554866120d990919063ffffffff16565b90505f81611b69848661259a565b611b73919061259a565b90505f87118015611b8357505f81115b15611bd657611b9287826120ef565b601654604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b5f6016819055601481905560158190556008546040516001600160a01b039091169085908381818185875af1925050503d805f8114611c30576040519150601f19603f3d011682016040523d82523d5f602084013e611c35565b606091505b50506009546040519192505f916001600160a01b039091169085908381818185875af1925050503d805f8114611c86576040519150601f19603f3d011682016040523d82523d5f602084013e611c8b565b606091505b5050505050505050505050505050565b6007545f906001600160a01b038581169116148015611cc857506006546001600160a01b03848116911614155b6001600160a01b0385165f908152601760205260408120549192509060ff1680611d0957506001600160a01b0384165f9081526017602052604090205460ff165b6007549091506001600160a01b038581169116145f8380611d275750815b601254909150158015908190611d475750600754600160a01b900460ff16155b8015611d51575083155b8015611d5a5750815b15611e1f57601254600e545f611d756064611b398b866120d9565b905082600f5482611d869190612424565b611d90919061243b565b60165f828254611da0919061245a565b90915550839050611db18383612424565b611dbb919061243b565b60145f828254611dcb919061245a565b90915550506010548390611ddf9083612424565b611de9919061243b565b60155f828254611df9919061245a565b90915550508015611e0f57611e0f8b308361192c565b611e19818a61259a565b98505050505b611e2a88888861192c565b5050505050505050565b6001600160a01b038216611e945760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610776565b6001600160a01b0382165f9081526020819052604090205481811015611f075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610776565b6001600160a01b0383165f908152602081905260408120838303905560028054849290611f3590849061259a565b90915550506040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b5f611f8a828461259a565b9392505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fc457611fc4612510565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561201b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203f91906124f5565b8160018151811061205257612052612510565b6001600160a01b0392831660209182029290920101526006546120789130911684610fa2565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120b09085905f908690309042906004016125ad565b5f604051808303815f87803b1580156120c7575f80fd5b505af1158015611923573d5f803e3d5ffd5b5f611f8a8284612424565b5f611f8a828461243b565b6006546121079030906001600160a01b031684610fa2565b6006546001600160a01b031663f305d7198230855f8061212f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612195573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061192591906125e8565b5f6020808352835180828501525f5b818110156121e5578581018301518582016040015282016121c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f9f575f80fd5b5f806040838503121561222a575f80fd5b823561223581612205565b946020939093013593505050565b5f805f60608486031215612255575f80fd5b833561226081612205565b9250602084013561227081612205565b929592945050506040919091013590565b5f60208284031215612291575f80fd5b5035919050565b5f602082840312156122a8575f80fd5b8135611f8a81612205565b80358015158114610d4a575f80fd5b5f80604083850312156122d3575f80fd5b82356122de81612205565b91506122ec602084016122b3565b90509250929050565b5f805f60608486031215612307575f80fd5b505081359360208301359350604090920135919050565b5f806040838503121561232f575f80fd5b823561233a81612205565b9150602083013561234a81612205565b809150509250929050565b5f805f8060808587031215612368575f80fd5b843561237381612205565b9350602085013561238381612205565b925060408501359150612398606086016122b3565b905092959194509250565b600181811c908216806123b757607f821691505b6020821081036123d557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761072357610723612410565b5f8261245557634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561072357610723612410565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f60208284031215612505575f80fd5b8151611f8a81612205565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b8381101561255b5781516001600160a01b031687529582019590820190600101612536565b509495945050505050565b848152608060208201525f61257e6080830186612524565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561072357610723612410565b85815284602082015260a060408201525f6125cb60a0830186612524565b6001600160a01b0394909416606083015250608001529392505050565b5f805f606084860312156125fa575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212202de773fb5ff1e1ade6b83561851ccca531aaae47a7782275762bf727b83ceb2764736f6c63430008150033

Deployed Bytecode Sourcemap

20759:13305:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21030:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;21030:36:0;;;;;;;;15427:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16500:242::-;;;;;;;;;;-1:-1:-1;16500:242:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;16500:242:0;1205:187:1;15748:108:0;;;;;;;;;;-1:-1:-1;15836:12:0;;15748:108;;16750:295;;;;;;;;;;-1:-1:-1;16750:295:0;;;;;:::i;:::-;;:::i;28047:250::-;;;;;;;;;;-1:-1:-1;28047:250:0;;;;;:::i;:::-;;:::i;:::-;;21187:34;;;;;;;;;;-1:-1:-1;21187:34:0;;;;;;;;;;;21073;;;;;;;;;;;;;;;;15647:93;;;;;;;;;;-1:-1:-1;15647:93:0;;15730:2;2185:36:1;;2173:2;2158:18;15647:93:0;2043:184:1;17053:270:0;;;;;;;;;;-1:-1:-1;17053:270:0;;;;;:::i;:::-;;:::i;30746:126::-;;;;;;;;;;-1:-1:-1;30746:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;30836:28:0;30812:4;30836:28;;;:19;:28;;;;;;;;;30746:126;20840:42;;;;;;;;;;-1:-1:-1;20840:42:0;;;;-1:-1:-1;;;;;20840:42:0;;;;;;-1:-1:-1;;;;;2674:32:1;;;2656:51;;2644:2;2629:18;20840:42:0;2484:229:1;15864:177:0;;;;;;;;;;-1:-1:-1;15864:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;16015:18:0;15983:7;16015:18;;;;;;;;;;;;15864:177;14241:103;;;;;;;;;;;;;:::i;27770:269::-;;;;;;;;;;-1:-1:-1;27770:269:0;;;;;:::i;:::-;;:::i;23504:122::-;;;;;;;;;;;;;:::i;29752:167::-;;;;;;;;;;-1:-1:-1;29752:167:0;;;;;:::i;:::-;;:::i;21114:25::-;;;;;;;;;;;;;;;;23414:82;;;;;;;;;;;;;:::i;14018:87::-;;;;;;;;;;-1:-1:-1;14091:6:0;;-1:-1:-1;;;;;14091:6:0;14018:87;;15535:104;;;;;;;;;;;;;:::i;33480:301::-;;;;;;;;;;-1:-1:-1;33480:301:0;;;;;:::i;:::-;;:::i;20889:29::-;;;;;;;;;;-1:-1:-1;20889:29:0;;;;-1:-1:-1;;;;;20889:29:0;;;17331:505;;;;;;;;;;-1:-1:-1;17331:505:0;;;;;:::i;:::-;;:::i;30516:109::-;;;;;;;;;;-1:-1:-1;30516:109:0;;;;;:::i;:::-;;:::i;16049:234::-;;;;;;;;;;-1:-1:-1;16049:234:0;;;;;:::i;:::-;;:::i;27267:495::-;;;;;;;;;;-1:-1:-1;27267:495:0;;;;;:::i;:::-;;:::i;21704:58::-;;;;;;;;;;-1:-1:-1;21704:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30326:182;;;;;;;;;;-1:-1:-1;30326:182:0;;;;;:::i;:::-;;:::i;29927:391::-;;;;;;;;;;-1:-1:-1;29927:391:0;;;;;:::i;:::-;;:::i;30633:105::-;;;;;;;;;;-1:-1:-1;30633:105:0;;;;;:::i;:::-;;:::i;16291:201::-;;;;;;;;;;-1:-1:-1;16291:201:0;;;;;:::i;:::-;;:::i;21146:34::-;;;;;;;;;;-1:-1:-1;21146:34:0;;;;;;;;29582:162;;;;;;;;;;-1:-1:-1;29582:162:0;;;;;:::i;:::-;;:::i;14352:238::-;;;;;;;;;;-1:-1:-1;14352:238:0;;;;;:::i;:::-;;:::i;21381:29::-;;;;;;;;;;;;;;;;15427:100;15481:13;15514:5;15507:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15427:100;:::o;16500:242::-;16619:4;532:10;16680:32;532:10;16696:7;16705:6;16680:8;:32::i;:::-;16730:4;16723:11;;;16500:242;;;;;:::o;16750:295::-;16881:4;532:10;16939:38;16955:4;532:10;16970:6;16939:15;:38::i;:::-;16988:27;16998:4;17004:2;17008:6;16988:9;:27::i;:::-;-1:-1:-1;17033:4:0;;16750:295;-1:-1:-1;;;;16750:295:0:o;28047:250::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;;;;;;;;;28184:4:::1;28176;28155:13;15836:12:::0;;;15748:108;28155:13:::1;:17;::::0;28171:1:::1;28155:17;:::i;:::-;28154:26;;;;:::i;:::-;28153:35;;;;:::i;:::-;28143:6;:45;;28121:131;;;::::0;-1:-1:-1;;;28121:131:0;;6130:2:1;28121:131:0::1;::::0;::::1;6112:21:1::0;6169:2;6149:18;;;6142:30;6208:34;6188:18;;;6181:62;-1:-1:-1;;;6259:18:1;;;6252:34;6303:19;;28121:131:0::1;5928:400:1::0;28121:131:0::1;28276:13;:6:::0;28285:4:::1;28276:13;:::i;:::-;28263:10;:26:::0;-1:-1:-1;28047:250:0:o;17053:270::-;17168:4;532:10;17229:64;532:10;17245:7;17282:10;17254:25;532:10;17245:7;17254:9;:25::i;:::-;:38;;;;:::i;:::-;17229:8;:64::i;14241:103::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;14306:30:::1;14333:1;14306:18;:30::i;:::-;14241:103::o:0;27770:269::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;27904:4:::1;27896;27875:13;15836:12:::0;;;15748:108;27875:13:::1;:17;::::0;27891:1:::1;27875:17;:::i;:::-;27874:26;;;;:::i;:::-;27873:35;;;;:::i;:::-;27863:6;:45;;27841:142;;;::::0;-1:-1:-1;;;27841:142:0;;6665:2:1;27841:142:0::1;::::0;::::1;6647:21:1::0;6704:2;6684:18;;;6677:30;6743:34;6723:18;;;6716:62;-1:-1:-1;;;6794:18:1;;;6787:45;6849:19;;27841:142:0::1;6463:411:1::0;27841:142:0::1;28018:13;:6:::0;28027:4:::1;28018:13;:::i;:::-;27994:21;:37:::0;-1:-1:-1;27770:269:0:o;23504:122::-;14091:6;;23556:4;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;-1:-1:-1;23573:15:0::1;:23:::0;;-1:-1:-1;;23573:23:0::1;::::0;;;23504:122;:::o;29752:167::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29865:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;29865:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29752:167::o;23414:82::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;23467:14:::1;:21:::0;;-1:-1:-1;;23467:21:0::1;;;::::0;;23414:82::o;15535:104::-;15591:13;15624:7;15617:14;;;;;:::i;33480:301::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;33589:14:::1;::::0;-1:-1:-1;;;;;33589:14:0;;::::1;33581:22:::0;;::::1;::::0;33573:92:::1;;;::::0;-1:-1:-1;;;33573:92:0;;7081:2:1;33573:92:0::1;::::0;::::1;7063:21:1::0;7120:2;7100:18;;;7093:30;7159:34;7139:18;;;7132:62;7230:27;7210:18;;;7203:55;7275:19;;33573:92:0::1;6879:421:1::0;33573:92:0::1;33676:41;33705:4;33711:5;33676:28;:41::i;:::-;33733:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;33733:40:0;::::1;::::0;::::1;::::0;;;::::1;33480:301:::0;;:::o;17331:505::-;17451:4;532:10;17451:4;17539:25;532:10;17556:7;17539:9;:25::i;:::-;17512:52;;17617:15;17597:16;:35;;17575:122;;;;-1:-1:-1;;;17575:122:0;;7507:2:1;17575:122:0;;;7489:21:1;7546:2;7526:18;;;7519:30;7585:34;7565:18;;;7558:62;-1:-1:-1;;;7636:18:1;;;7629:35;7681:19;;17575:122:0;7305:401:1;17575:122:0;17733:60;17742:5;17749:7;17777:15;17758:16;:34;17733:8;:60::i;30516:109::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;30591:14:::1;:26:::0;;-1:-1:-1;;;;;;30591:26:0::1;-1:-1:-1::0;;;;;30591:26:0;;;::::1;::::0;;;::::1;::::0;;30516:109::o;16049:234::-;16164:4;532:10;16225:28;532:10;16242:2;16246:6;16225:9;:28::i;27267:495::-;14091:6;;27372:4;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;27451:6:::1;27430:13;15836:12:::0;;;15748:108;27430:13:::1;:17;::::0;27446:1:::1;27430:17;:::i;:::-;27429:28;;;;:::i;:::-;27416:9;:41;;27394:144;;;::::0;-1:-1:-1;;;27394:144:0;;7913:2:1;27394:144:0::1;::::0;::::1;7895:21:1::0;7952:2;7932:18;;;7925:30;7991:34;7971:18;;;7964:62;-1:-1:-1;;;8042:18:1;;;8035:51;8103:19;;27394:144:0::1;7711:417:1::0;27394:144:0::1;27606:4;27585:13;15836:12:::0;;;15748:108;27585:13:::1;:17;::::0;27601:1:::1;27585:17;:::i;:::-;27584:26;;;;:::i;:::-;27571:9;:39;;27549:141;;;::::0;-1:-1:-1;;;27549:141:0;;8335:2:1;27549:141:0::1;::::0;::::1;8317:21:1::0;8374:2;8354:18;;;8347:30;8413:34;8393:18;;;8386:62;-1:-1:-1;;;8464:18:1;;;8457:50;8524:19;;27549:141:0::1;8133:416:1::0;27549:141:0::1;-1:-1:-1::0;27701:19:0::1;:31:::0;;;27750:4:::1;14224:1;27267:495:::0;;;:::o;30326:182::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30411:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;30411:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30466:34;;1345:41:1;;;30466:34:0::1;::::0;1318:18:1;30466:34:0::1;;;;;;;30326:182:::0;;:::o;29927:391::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;30072:13:::1;:28:::0;;;30111:11:::1;:24:::0;;;30146:13:::1;:28:::0;;;30162:12;30198:27:::1;30125:10:::0;30088:12;30198:27:::1;:::i;:::-;:43;;;;:::i;:::-;30185:10;:56:::0;;;30274:2:::1;-1:-1:-1::0;30260:16:0::1;30252:58;;;::::0;-1:-1:-1;;;30252:58:0;;8756:2:1;30252:58:0::1;::::0;::::1;8738:21:1::0;8795:2;8775:18;;;8768:30;8834:31;8814:18;;;8807:59;8883:18;;30252:58:0::1;8554:353:1::0;30252:58:0::1;29927:391:::0;;;:::o;30633:105::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;30706:12:::1;:24:::0;;-1:-1:-1;;;;;;30706:24:0::1;-1:-1:-1::0;;;;;30706:24:0;;;::::1;::::0;;;::::1;::::0;;30633:105::o;16291:201::-;-1:-1:-1;;;;;16457:18:0;;;16425:7;16457:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16291:201::o;29582:162::-;29687:49;29703:6;29711:3;29716:7;29725:10;29687:15;:49::i;:::-;29582:162;;;;:::o;14352:238::-;14091:6;;-1:-1:-1;;;;;14091:6:0;532:10;14153:23;14145:68;;;;-1:-1:-1;;;14145:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14455:22:0;::::1;14433:110;;;::::0;-1:-1:-1;;;14433:110:0;;9114:2:1;14433:110:0::1;::::0;::::1;9096:21:1::0;9153:2;9133:18;;;9126:30;9192:34;9172:18;;;9165:62;-1:-1:-1;;;9243:18:1;;;9236:36;9289:19;;14433:110:0::1;8912:402:1::0;14433:110:0::1;14554:28;14573:8;14554:18;:28::i;:::-;14352:238:::0;:::o;19570:380::-;-1:-1:-1;;;;;19706:19:0;;19698:68;;;;-1:-1:-1;;;19698:68:0;;9521:2:1;19698:68:0;;;9503:21:1;9560:2;9540:18;;;9533:30;9599:34;9579:18;;;9572:62;-1:-1:-1;;;9650:18:1;;;9643:34;9694:19;;19698:68:0;9319:400:1;19698:68:0;-1:-1:-1;;;;;19785:21:0;;19777:68;;;;-1:-1:-1;;;19777:68:0;;9926:2:1;19777:68:0;;;9908:21:1;9965:2;9945:18;;;9938:30;10004:34;9984:18;;;9977:62;-1:-1:-1;;;10055:18:1;;;10048:32;10097:19;;19777:68:0;9724:398:1;19777:68:0;-1:-1:-1;;;;;19858:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19910:32;;160:25:1;;;19910:32:0;;133:18:1;19910:32:0;;;;;;;19570:380;;;:::o;19958:502::-;20093:24;20120:25;20130:5;20137:7;20120:9;:25::i;:::-;20093:52;;-1:-1:-1;;20160:16:0;:37;20156:297;;20260:6;20240:16;:26;;20214:117;;;;-1:-1:-1;;;20214:117:0;;10329:2:1;20214:117:0;;;10311:21:1;10368:2;10348:18;;;10341:30;10407:31;10387:18;;;10380:59;10456:18;;20214:117:0;10127:353:1;20214:117:0;20375:51;20384:5;20391:7;20419:6;20400:16;:25;20375:8;:51::i;23634:2554::-;-1:-1:-1;;;;;23782:25:0;;23758:21;23782:25;;;:19;:25;;;;;;;;;:65;;-1:-1:-1;;;;;;23824:23:0;;;;;;:19;:23;;;;;;;;23782:65;23758:89;-1:-1:-1;;;;;;23868:18:0;;23860:68;;;;-1:-1:-1;;;23860:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23947:16:0;;23939:64;;;;-1:-1:-1;;;23939:64:0;;;;;;;:::i;:::-;24020:6;24030:1;24020:11;24016:93;;24048:28;24064:4;24070:2;24074:1;24048:15;:28::i;24016:93::-;24142:14;;24121:10;;-1:-1:-1;;;;;24134:22:0;;;24142:14;;24134:22;:75;;;;-1:-1:-1;;;;;;24174:35:0;;;;;;:31;:35;;;;;;;;24173:36;24134:75;24240:14;;24121:88;;-1:-1:-1;24220:11:0;;-1:-1:-1;;;;;24234:20:0;;;24240:14;;24234:20;:75;;;;-1:-1:-1;;;;;;24272:37:0;;;;;;:31;:37;;;;;;;;24271:38;24234:75;24220:89;;24320:16;24347:7;14091:6;;-1:-1:-1;;;;;14091:6:0;;14018:87;24347:7;-1:-1:-1;;;;;24339:15:0;:4;-1:-1:-1;;;;;24339:15:0;;:32;;;-1:-1:-1;14091:6:0;;-1:-1:-1;;;;;24358:13:0;;;14091:6;;24358:13;24339:32;24320:51;-1:-1:-1;24382:11:0;-1:-1:-1;;;;;24396:16:0;;;;:41;;-1:-1:-1;;;;;;24416:21:0;;24430:6;24416:21;24396:41;24382:55;;24448:17;24468:11;:21;;;;24483:6;24468:21;:38;;;-1:-1:-1;24493:13:0;;-1:-1:-1;;;24493:13:0;;;;24468:38;24531:15;;24448:58;;-1:-1:-1;24531:15:0;;:32;;;;;24551:12;24550:13;24531:32;24527:1076;;;24606:14;;;;;;;;:34;;;24624:16;24606:34;24580:118;;;;-1:-1:-1;;;24580:118:0;;11497:2:1;24580:118:0;;;11479:21:1;11536:2;11516:18;;;11509:30;-1:-1:-1;;;11555:18:1;;;11548:52;11617:18;;24580:118:0;11295:346:1;24580:118:0;24717:5;24713:879;;;24783:21;;24773:6;:31;;24743:158;;;;-1:-1:-1;;;24743:158:0;;11848:2:1;24743:158:0;;;11830:21:1;11887:2;11867:18;;;11860:30;11926:34;11906:18;;;11899:62;-1:-1:-1;;;11977:18:1;;;11970:51;12038:19;;24743:158:0;11646:417:1;24743:158:0;24976:10;;-1:-1:-1;;;;;16015:18:0;;15983:7;16015:18;;;;;;;;;;;24950:22;;:6;:22;:::i;:::-;:36;;24920:129;;;;-1:-1:-1;;;24920:129:0;;12270:2:1;24920:129:0;;;12252:21:1;12309:2;12289:18;;;12282:30;-1:-1:-1;;;12328:18:1;;;12321:49;12387:18;;24920:129:0;12068:343:1;24920:129:0;24713:879;;;25075:6;25071:521;;-1:-1:-1;;;;;25318:35:0;;;;;;:31;:35;;;;;;;;25317:36;:95;;;;-1:-1:-1;;;;;;25375:37:0;;;;;;:31;:37;;;;;;;;25374:38;25317:95;25295:297;;;25503:10;;-1:-1:-1;;;;;16015:18:0;;15983:7;16015:18;;;;;;;;;;;25477:22;;:6;:22;:::i;:::-;:36;;25447:129;;;;-1:-1:-1;;;25447:129:0;;12270:2:1;25447:129:0;;;12252:21:1;12309:2;12289:18;;;12282:30;-1:-1:-1;;;12328:18:1;;;12321:49;12387:18;;25447:129:0;12068:343:1;25447:129:0;25620:13;;-1:-1:-1;;;25620:13:0;;;;25619:14;:63;;;;-1:-1:-1;;;;;;25651:31:0;;;;;;:25;:31;;;;;;;;25650:32;25619:63;:106;;;;-1:-1:-1;;;;;;25700:25:0;;;;;;:19;:25;;;;;;;;25699:26;25619:106;:147;;;;-1:-1:-1;;;;;;25743:23:0;;;;;;:19;:23;;;;;;;;25742:24;25619:147;25615:521;;;25832:4;25783:28;16015:18;;;;;;;;;;;25892:19;;25930:10;;25868:43;;;;;25930:14;25926:27;;25946:7;;;;;;;;23634:2554;;;:::o;25926:27::-;25971:7;:28;;;;;25983:16;25982:17;25971:28;25967:158;;;26020:13;:20;;-1:-1:-1;;;;26020:20:0;-1:-1:-1;;;26020:20:0;;;26059:10;:8;:10::i;:::-;26088:13;:21;;-1:-1:-1;;;;26088:21:0;;;25967:158;25768:368;;25615:521;26146:34;26163:4;26169:2;26173:6;26146:16;:34::i;:::-;23747:2441;;;;;;23634:2554;;;:::o;14598:191::-;14691:6;;;-1:-1:-1;;;;;14708:17:0;;;-1:-1:-1;;;;;;14708:17:0;;;;;;;14741:40;;14691:6;;;14708:17;14691:6;;14741:40;;14672:16;;14741:40;14661:128;14598:191;:::o;33789:235::-;-1:-1:-1;;;;;33872:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33872:39:0;;;;;;;33922:38;33872:31;:39;33922:25;:38::i;28305:1269::-;-1:-1:-1;;;;;28463:20:0;;28455:59;;;;-1:-1:-1;;;28455:59:0;;12618:2:1;28455:59:0;;;12600:21:1;12657:2;12637:18;;;12630:30;12696:28;12676:18;;;12669:56;12742:18;;28455:59:0;12416:350:1;28455:59:0;28549:16;;;28563:1;28549:16;;;;;;;;28525:21;;28549:16;;;;;;;;-1:-1:-1;;28586:16:0;;:23;;;-1:-1:-1;;;28586:23:0;;;;28525:40;;-1:-1:-1;;;;;;28586:16:0;;;;:21;;-1:-1:-1;28586:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28576:4;28581:1;28576:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;28576:33:0;;;-1:-1:-1;;;;;28576:33:0;;;;;28638:4;28620;28625:1;28620:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;28620:23:0;;;-1:-1:-1;;;;;28620:23:0;;;;;28659:10;28658:11;:47;;;-1:-1:-1;28694:10:0;28674:31;;;;:19;:31;;;;;;;;28673:32;28658:47;28654:913;;;28722:16;;:146;;-1:-1:-1;;;28722:146:0;;-1:-1:-1;;;;;28722:16:0;;;;:67;;28815:7;;28722:146;;:16;;28841:4;;28847:3;;28852:15;;28722:146;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28654:913;;;28905:10;:28;;;;;28932:1;28919:10;;:14;28905:28;28901:376;;;28954:11;28993:3;28979:10;;28969:7;:20;;;;:::i;:::-;28968:28;;;;:::i;:::-;28954:42;;29015:18;29059:3;29047:8;;29037:7;:18;;;;:::i;:::-;29036:26;;;;:::i;:::-;29015:47;;29094:10;;29107:1;29094:14;;;;:::i;:::-;29081:10;:27;29137:13;29147:3;29137:7;:13;:::i;:::-;29127:23;-1:-1:-1;29173:14:0;;29169:93;;29212:22;29218:3;29223:10;29212:5;:22::i;:::-;29236:7;;;;;29169:93;28935:342;;28901:376;29292:10;29305;:34;;29336:3;29305:34;;;29326:6;29305:34;29292:47;-1:-1:-1;29358:11:0;;29354:202;;29390:16;;:150;;-1:-1:-1;;;29390:150:0;;-1:-1:-1;;;;;29390:16:0;;;;:67;;29487:7;;29390:150;;:16;;29516:4;;29521:2;;29524:15;;29390:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29354:202;28886:681;28654:913;28444:1130;28305:1269;;;;:::o;17848:708::-;-1:-1:-1;;;;;17979:18:0;;17971:68;;;;-1:-1:-1;;;17971:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18058:16:0;;18050:64;;;;-1:-1:-1;;;18050:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18200:15:0;;18178:19;18200:15;;;;;;;;;;;18248:21;;;;18226:109;;;;-1:-1:-1;;;18226:109:0;;14607:2:1;18226:109:0;;;14589:21:1;14646:2;14626:18;;;14619:30;14685:34;14665:18;;;14658:62;-1:-1:-1;;;14736:18:1;;;14729:36;14782:19;;18226:109:0;14405:402:1;18226:109:0;-1:-1:-1;;;;;18371:15:0;;;:9;:15;;;;;;;;;;;18389:20;;;18371:38;;18431:13;;;;;;;;:23;;18403:6;;18371:9;18431:23;;18403:6;;18431:23;:::i;:::-;;;;;;;;18487:2;-1:-1:-1;;;;;18472:26:0;18481:4;-1:-1:-1;;;;;18472:26:0;;18491:6;18472:26;;;;160:25:1;;148:2;133:18;;14:177;18472:26:0;;;;;;;;18511:37;29927:391;31738:1734;31821:4;31777:23;16015:18;;;;;;;;;;;31777:50;;31838:25;31924:17;;31888:19;;31866;;:41;;;;:::i;:::-;:75;;;;:::i;:::-;31838:103;-1:-1:-1;31956:20:0;;;:46;;-1:-1:-1;31980:22:0;;31956:46;31952:59;;;32004:7;;31738:1734::o;31952:59::-;32043:19;;32025:15;:37;32021:107;;;32097:19;;32079:37;;32021:107;32138:23;32252:1;32219:17;32183:19;;32165:15;:37;;;;:::i;:::-;32164:72;;;;:::i;:::-;:89;;;;:::i;:::-;32138:115;-1:-1:-1;32264:26:0;32293:36;:15;32138:115;32293:19;:36::i;:::-;32264:65;-1:-1:-1;32368:21:0;32400:37;32264:65;32400:17;:37::i;:::-;32448:18;32469:44;:21;32495:17;32469:25;:44::i;:::-;32448:65;;32524:23;32550:82;32604:17;32550:35;32565:19;;32550:10;:14;;:35;;;;:::i;:::-;:39;;:82::i;:::-;32524:108;;32643:21;32667:80;32719:17;32667:33;32682:17;;32667:10;:14;;:33;;;;:::i;:80::-;32643:104;-1:-1:-1;32758:23:0;32643:104;32784:28;32797:15;32784:10;:28;:::i;:::-;:44;;;;:::i;:::-;32758:70;;32863:1;32845:15;:19;:42;;;;;32886:1;32868:15;:19;32845:42;32841:280;;;32904:47;32918:15;32935;32904:13;:47::i;:::-;33075:19;;32971:138;;;15014:25:1;;;15070:2;15055:18;;15048:34;;;15098:18;;;15091:34;;;;32971:138:0;;;;;;15002:2:1;32971:138:0;;;32841:280;33155:1;33133:19;:23;;;33167:19;:23;;;33201:17;:21;;;33275:14;;33267:80;;-1:-1:-1;;;;;33275:14:0;;;;33317:15;;33155:1;33267:80;33155:1;33267:80;33317:15;33275:14;33267:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33396:12:0;;33388:76;;33235:112;;-1:-1:-1;33359:23:0;;-1:-1:-1;;;;;33396:12:0;;;;33436:13;;33359:23;33388:76;33359:23;33388:76;33436:13;33396:12;33388:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;31738:1734:0:o;26196:1063::-;26338:14;;26317:10;;-1:-1:-1;;;;;26330:22:0;;;26338:14;;26330:22;:57;;;;-1:-1:-1;26370:16:0;;-1:-1:-1;;;;;26356:31:0;;;26370:16;;26356:31;;26330:57;-1:-1:-1;;;;;26423:25:0;;26398:22;26423:25;;;:19;:25;;;;;;26317:70;;-1:-1:-1;26398:22:0;26423:25;;;:52;;-1:-1:-1;;;;;;26452:23:0;;;;;;:19;:23;;;;;;;;26423:52;26506:14;;26398:77;;-1:-1:-1;;;;;;26500:20:0;;;26506:14;;26500:20;26486:11;26546:5;;:15;;;26555:6;26546:15;26589:10;;26532:29;;-1:-1:-1;26589:14:0;;;;;;26621:39;;-1:-1:-1;26647:13:0;;-1:-1:-1;;;26647:13:0;;;;26646:14;26621:39;:74;;;;;26678:17;26677:18;26621:74;:97;;;;;26712:6;26621:97;26617:590;;;26751:10;;26796:13;;26735;26839:26;26861:3;26839:17;:6;26751:10;26839;:17::i;:26::-;26824:41;;26928:5;26911:13;;26904:4;:20;;;;:::i;:::-;26903:30;;;;:::i;:::-;26880:19;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;26992:5:0;;-1:-1:-1;26972:16:0;26979:9;26972:4;:16;:::i;:::-;26971:26;;;;:::i;:::-;26948:19;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;27041:11:0;;27056:5;;27034:18;;:4;:18;:::i;:::-;27033:28;;;;:::i;:::-;27012:17;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;27080:8:0;;27076:91;;27109:42;27125:4;27139;27146;27109:15;:42::i;:::-;27181:14;27191:4;27181:14;;:::i;:::-;;;26720:487;;;26617:590;27218:33;27234:4;27240:2;27244:6;27218:15;:33::i;:::-;26306:953;;;;;26196:1063;;;:::o;18971:591::-;-1:-1:-1;;;;;19055:21:0;;19047:67;;;;-1:-1:-1;;;19047:67:0;;15548:2:1;19047:67:0;;;15530:21:1;15587:2;15567:18;;;15560:30;15626:34;15606:18;;;15599:62;-1:-1:-1;;;15677:18:1;;;15670:31;15718:19;;19047:67:0;15346:397:1;19047:67:0;-1:-1:-1;;;;;19214:18:0;;19189:22;19214:18;;;;;;;;;;;19251:24;;;;19243:71;;;;-1:-1:-1;;;19243:71:0;;15950:2:1;19243:71:0;;;15932:21:1;15989:2;15969:18;;;15962:30;16028:34;16008:18;;;16001:62;-1:-1:-1;;;16079:18:1;;;16072:32;16121:19;;19243:71:0;15748:398:1;19243:71:0;-1:-1:-1;;;;;19350:18:0;;:9;:18;;;;;;;;;;19371:23;;;19350:44;;19416:12;:22;;19388:6;;19350:9;19416:22;;19388:6;;19416:22;:::i;:::-;;;;-1:-1:-1;;19456:37:0;;160:25:1;;;19482:1:0;;-1:-1:-1;;;;;19456:37:0;;;;;148:2:1;133:18;19456:37:0;;;;;;;29927:391;;;:::o;12588:98::-;12646:7;12673:5;12677:1;12673;:5;:::i;:::-;12666:12;12588:98;-1:-1:-1;;;12588:98:0:o;30880:479::-;30971:16;;;30985:1;30971:16;;;;;;;;30947:21;;30971:16;;;;;;;;;;-1:-1:-1;30971:16:0;30947:40;;31016:4;30998;31003:1;30998:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30998:23:0;;;:7;;;;;;;;;;:23;;;;31042:16;;:23;;;-1:-1:-1;;;31042:23:0;;;;:16;;;;;:21;;:23;;;;;30998:7;;31042:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31032:4;31037:1;31032:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31032:33:0;;;:7;;;;;;;;;:33;31110:16;;31078:63;;31095:4;;31110:16;31129:11;31078:8;:63::i;:::-;31154:16;;:197;;-1:-1:-1;;;31154:197:0;;-1:-1:-1;;;;;31154:16:0;;;;:67;;:197;;31236:11;;31154:16;;31278:4;;31305;;31325:15;;31154:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12694:98;12752:7;12779:5;12783:1;12779;:5;:::i;12800:98::-;12858:7;12885:5;12889:1;12885;:5;:::i;31367:363::-;31481:16;;31449:63;;31466:4;;-1:-1:-1;;;;;31481:16:0;31500:11;31449:8;:63::i;:::-;31523:16;;-1:-1:-1;;;;;31523:16:0;:32;31563:9;31596:4;31616:11;31523:16;;31674:7;14091:6;;-1:-1:-1;;;;;14091:6:0;;14018:87;31674:7;31523:199;;;;;;-1:-1:-1;;;;;;31523:199:0;;;-1:-1:-1;;;;;17097:15:1;;;31523:199:0;;;17079:34:1;17129:18;;;17122:34;;;;17172:18;;;17165:34;;;;17215:18;;;17208:34;17279:15;;;17258:19;;;17251:44;31696:15:0;17311:19:1;;;17304:35;17013:19;;31523:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;1858:180::-;1917:6;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;-1:-1:-1;2009:23:1;;1858:180;-1:-1:-1;1858:180:1:o;2232:247::-;2291:6;2344:2;2332:9;2323:7;2319:23;2315:32;2312:52;;;2360:1;2357;2350:12;2312:52;2399:9;2386:23;2418:31;2443:5;2418:31;:::i;2718:160::-;2783:20;;2839:13;;2832:21;2822:32;;2812:60;;2868:1;2865;2858:12;2883:315;2948:6;2956;3009:2;2997:9;2988:7;2984:23;2980:32;2977:52;;;3025:1;3022;3015:12;2977:52;3064:9;3051:23;3083:31;3108:5;3083:31;:::i;:::-;3133:5;-1:-1:-1;3157:35:1;3188:2;3173:18;;3157:35;:::i;:::-;3147:45;;2883:315;;;;;:::o;3411:316::-;3488:6;3496;3504;3557:2;3545:9;3536:7;3532:23;3528:32;3525:52;;;3573:1;3570;3563:12;3525:52;-1:-1:-1;;3596:23:1;;;3666:2;3651:18;;3638:32;;-1:-1:-1;3717:2:1;3702:18;;;3689:32;;3411:316;-1:-1:-1;3411:316:1:o;3732:388::-;3800:6;3808;3861:2;3849:9;3840:7;3836:23;3832:32;3829:52;;;3877:1;3874;3867:12;3829:52;3916:9;3903:23;3935:31;3960:5;3935:31;:::i;:::-;3985:5;-1:-1:-1;4042:2:1;4027:18;;4014:32;4055:33;4014:32;4055:33;:::i;:::-;4107:7;4097:17;;;3732:388;;;;;:::o;4125:525::-;4208:6;4216;4224;4232;4285:3;4273:9;4264:7;4260:23;4256:33;4253:53;;;4302:1;4299;4292:12;4253:53;4341:9;4328:23;4360:31;4385:5;4360:31;:::i;:::-;4410:5;-1:-1:-1;4467:2:1;4452:18;;4439:32;4480:33;4439:32;4480:33;:::i;:::-;4532:7;-1:-1:-1;4586:2:1;4571:18;;4558:32;;-1:-1:-1;4609:35:1;4640:2;4625:18;;4609:35;:::i;:::-;4599:45;;4125:525;;;;;;;:::o;4655:380::-;4734:1;4730:12;;;;4777;;;4798:61;;4852:4;4844:6;4840:17;4830:27;;4798:61;4905:2;4897:6;4894:14;4874:18;4871:38;4868:161;;4951:10;4946:3;4942:20;4939:1;4932:31;4986:4;4983:1;4976:15;5014:4;5011:1;5004:15;4868:161;;4655:380;;;:::o;5040:356::-;5242:2;5224:21;;;5261:18;;;5254:30;5320:34;5315:2;5300:18;;5293:62;5387:2;5372:18;;5040:356::o;5401:127::-;5462:10;5457:3;5453:20;5450:1;5443:31;5493:4;5490:1;5483:15;5517:4;5514:1;5507:15;5533:168;5606:9;;;5637;;5654:15;;;5648:22;;5634:37;5624:71;;5675:18;;:::i;5706:217::-;5746:1;5772;5762:132;;5816:10;5811:3;5807:20;5804:1;5797:31;5851:4;5848:1;5841:15;5879:4;5876:1;5869:15;5762:132;-1:-1:-1;5908:9:1;;5706:217::o;6333:125::-;6398:9;;;6419:10;;;6416:36;;;6432:18;;:::i;10485:401::-;10687:2;10669:21;;;10726:2;10706:18;;;10699:30;10765:34;10760:2;10745:18;;10738:62;-1:-1:-1;;;10831:2:1;10816:18;;10809:35;10876:3;10861:19;;10485:401::o;10891:399::-;11093:2;11075:21;;;11132:2;11112:18;;;11105:30;11171:34;11166:2;11151:18;;11144:62;-1:-1:-1;;;11237:2:1;11222:18;;11215:33;11280:3;11265:19;;10891:399::o;12903:251::-;12973:6;13026:2;13014:9;13005:7;13001:23;12997:32;12994:52;;;13042:1;13039;13032:12;12994:52;13074:9;13068:16;13093:31;13118:5;13093:31;:::i;13159:127::-;13220:10;13215:3;13211:20;13208:1;13201:31;13251:4;13248:1;13241:15;13275:4;13272:1;13265:15;13291:461;13344:3;13382:5;13376:12;13409:6;13404:3;13397:19;13435:4;13464:2;13459:3;13455:12;13448:19;;13501:2;13494:5;13490:14;13522:1;13532:195;13546:6;13543:1;13540:13;13532:195;;;13611:13;;-1:-1:-1;;;;;13607:39:1;13595:52;;13667:12;;;;13702:15;;;;13643:1;13561:9;13532:195;;;-1:-1:-1;13743:3:1;;13291:461;-1:-1:-1;;;;;13291:461:1:o;13757:510::-;14028:6;14017:9;14010:25;14071:3;14066:2;14055:9;14051:18;14044:31;13991:4;14092:57;14144:3;14133:9;14129:19;14121:6;14092:57;:::i;:::-;-1:-1:-1;;;;;14185:32:1;;;;14180:2;14165:18;;14158:60;-1:-1:-1;14249:2:1;14234:18;14227:34;14084:65;13757:510;-1:-1:-1;;13757:510:1:o;14272:128::-;14339:9;;;14360:11;;;14357:37;;;14374:18;;:::i;16151:582::-;16450:6;16439:9;16432:25;16493:6;16488:2;16477:9;16473:18;16466:34;16536:3;16531:2;16520:9;16516:18;16509:31;16413:4;16557:57;16609:3;16598:9;16594:19;16586:6;16557:57;:::i;:::-;-1:-1:-1;;;;;16650:32:1;;;;16645:2;16630:18;;16623:60;-1:-1:-1;16714:3:1;16699:19;16692:35;16549:65;16151:582;-1:-1:-1;;;16151:582:1:o;17350:306::-;17438:6;17446;17454;17507:2;17495:9;17486:7;17482:23;17478:32;17475:52;;;17523:1;17520;17513:12;17475:52;17552:9;17546:16;17536:26;;17602:2;17591:9;17587:18;17581:25;17571:35;;17646:2;17635:9;17631:18;17625:25;17615:35;;17350:306;;;;;:::o

Swarm Source

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