ETH Price: $2,613.76 (+0.64%)

Token

Imagine AI (IAI)
 

Overview

Max Total Supply

10,000,000 IAI

Holders

69

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
96,919.479225429449443876 IAI

Value
$0.00
0x05c9b29244c75c75117c188c09c513df45ee4f63
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:
ImagineAI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 https://theimagineai.com
 https://t.me/ImagineAI_Entry
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

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

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

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
   
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface 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)) internal _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 recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(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);
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

contract ImagineAI is ERC20, Ownable {
    uint256 public constant MAX_SUPPLY = 10_000_000 ether;
    uint256 public constant BPS_DENOMINATOR = 10_000;
    uint256 public constant SNIPE_BLOCKS = 2;
    uint256 constant FEE_ACCELERATE = MAX_SUPPLY;

    IUniswapV2Router02 public immutable _router;
    address public immutable _pair;

    /// @notice Buy taxes in BPS
    uint256[2] public buyTaxes = [200, 100];
    /// @notice Sell taxes in BPS
    uint256[2] public sellTaxes = [200, 100];
    /// @notice tokens that are allocated for each tax
    uint256[2] public totalTaxes;
    /// @notice addresses that each tax is sent to
    address payable[2] public taxWallets;
    /// @notice Maps each recipient to their tax exlcusion status
    mapping(address => bool) public taxExcluded;
    /// @notice Maps each recipient to their blacklist status
    mapping(address => bool) public blacklist;

    /// @notice Contract MDAI balance threshold before `_swap` is invoked
    uint256 public minTokenBalance = 1000 ether;
    /// @notice Flag for auto-calling `_swap`
    bool public autoSwap = true;
    /// @notice Flag indicating whether buys/sells are permitted
    bool public tradingActive = false;
    /// @notice Maximum allowed to buy in a single transaction
    uint256 public maxBuy = MAX_SUPPLY * 2 / 100;
    /// @notice Block when trading is first enabled
    uint256 public tradingBlock;

    uint256 internal _totalSupply = 0;
    mapping(address => uint256) private _balances;

    bool internal _inSwap = false;
    bool internal _inLiquidityAdd = false;

    event TaxWalletsChanged(
        address payable[2] previousWallets,
        address payable[2] nextWallets
    );
    event BuyTaxesChanged(uint256[2] previousTaxes, uint256[2] nextTaxes);
    event SellTaxesChanged(uint256[2] previousTaxes, uint256[2] nextTaxes);
    event MinTokenBalanceChanged(uint256 previousMin, uint256 nextMin);
    event MaxBuyChanged(uint256 nextMax);
    event TaxesRescued(uint256 index, uint256 amount);
    event TradingActiveChanged(bool enabled);
    event TaxExclusionChanged(address user, bool taxExcluded);
    event BlacklistUpdated(address user, bool previousStatus, bool nextStatus);
    event AutoSwapChanged(bool enabled);

    modifier lockSwap() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    modifier liquidityAdd() {
        _inLiquidityAdd = true;
        _;
        _inLiquidityAdd = false;
    }

    modifier onlyTaxWallet() {
        require(msg.sender == taxWallets[0] || msg.sender == taxWallets[1], "no tax wallet");
        _;
    }

    constructor()
        ERC20("Imagine AI", "IAI")
        Ownable()
    {
        taxWallets[0] = payable(address(0x48BE47181025E7e03814313A5FF2549083F94A60));
        taxWallets[1] = payable(address(0xe80A06E9933BFA8022Ac772f4dbEe9B1B832aB4C));
        taxExcluded[owner()] = true;
        taxExcluded[address(this)] = true;
        taxExcluded[taxWallets[0]] = true;
        taxExcluded[taxWallets[1]] = true;
        _router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _pair = IUniswapV2Factory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );
        taxExcluded[address(_router)] = true;
        _mint(owner(), MAX_SUPPLY);
    }

    /// @notice Change the buy tax rates
    /// @param _buyTaxes The new buy tax rates
    function setBuyTaxes(uint256[2] memory _buyTaxes) external onlyOwner {
        require(
            _buyTaxes[0] + _buyTaxes[1] <= BPS_DENOMINATOR,
            "sum(_buyTaxes) cannot exceed BPS_DENOMINATOR"
        );
        emit BuyTaxesChanged(buyTaxes, _buyTaxes);
        buyTaxes = _buyTaxes;
    }

    /// @notice Change the sell tax rates
    /// @param _sellTaxes The new sell tax rates
    function setSellTaxes(uint256[2] memory _sellTaxes) external onlyOwner {
        require(
            _sellTaxes[0] + _sellTaxes[1] <= BPS_DENOMINATOR,
            "sum(_sellTaxes) cannot exceed BPS_DENOMINATOR"
        );
        emit SellTaxesChanged(sellTaxes, _sellTaxes);
        sellTaxes = _sellTaxes;
    }

    /// @notice Change the minimum contract MDAI balance before `_swap` gets invoked
    /// @param _minTokenBalance The new minimum balance
    function setMinTokenBalance(uint256 _minTokenBalance) external onlyOwner {
        emit MinTokenBalanceChanged(minTokenBalance, _minTokenBalance);
        minTokenBalance = _minTokenBalance;
    }

    /// @notice Rescue MDAI from the taxes
    /// @dev Should only be used in an emergency
    /// @param _index The tax allocation to rescue from
    /// @param _amount The amount of MDAI to rescue
    /// @param _recipient The recipient of the rescued MDAI
    function rescueTaxTokens(
        uint256 _index,
        uint256 _amount,
        address _recipient
    ) external onlyOwner {
        require(0 <= _index && _index < totalTaxes.length, "_index OOB");
        require(
            _amount <= totalTaxes[_index],
            "Amount cannot be greater than totalTax"
        );
        _rawTransfer(address(this), _recipient, _amount);
        emit TaxesRescued(_index, _amount);
        totalTaxes[_index] -= _amount;
    }


    /// @notice Change the address of the tax wallets
    /// @param _taxWallets The new address of the tax wallets
    function setTaxWallets(address payable[2] memory _taxWallets)
        external
        onlyTaxWallet
    {
        emit TaxWalletsChanged(taxWallets, _taxWallets);
        taxWallets = _taxWallets;
    }

    function addLiquidity(uint256 tokens)
        external
        payable
        onlyOwner
        liquidityAdd
    {
        _mint(address(this), tokens);
        _approve(address(this), address(_router), tokens);

        _router.addLiquidityETH{value: msg.value}(
            address(this),
            tokens,
            0,
            0,
            owner(),
            // solhint-disable-next-line not-rely-on-time
            block.timestamp
        );
    }

    /// @notice Admin function to update a recipient's blacklist status
    /// @param user the recipient
    /// @param status the new status
    function updateBlacklist(address user, bool status)
        external
        virtual
        onlyOwner
    {
        _updateBlacklist(user, status);
    }

    function _updateBlacklist(address user, bool status) internal {
        emit BlacklistUpdated(user, blacklist[user], status);
        blacklist[user] = status;
    }

    /// @notice Enables or disables trading on Uniswap
    function setTradingActive() external onlyOwner {
        tradingActive = true;
        tradingBlock = block.number;
        emit TradingActiveChanged(true);
    }

    /// @notice Updates tax exclusion status
    /// @param _account Account to update the tax exclusion status of
    /// @param _taxExcluded If true, exclude taxes for this user
    function setTaxExcluded(address _account, bool _taxExcluded)
        external
        onlyOwner
    {
        taxExcluded[_account] = _taxExcluded;
        emit TaxExclusionChanged(_account, _taxExcluded);
    }

    /// @notice Enable or disable whether swap occurs during `_transfer`
    /// @param _autoSwap If true, enables swap during `_transfer`
    function setAutoSwap(bool _autoSwap) external onlyOwner {
        autoSwap = _autoSwap;
        emit AutoSwapChanged(_autoSwap);
    }

    /// @notice Update maxBuy
    /// @param _maxBuy The new maxBuy
    function setMaxBuy(uint256 _maxBuy) external onlyOwner {
        maxBuy = _maxBuy;
        emit MaxBuyChanged(_maxBuy);
    }

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

    function _addBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] + amount;
    }

    function _subtractBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] - amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(!blacklist[recipient], "Recipient is blacklisted");

        if (taxExcluded[sender] || taxExcluded[recipient]) {
            _rawTransfer(sender, recipient, amount);
            return;
        }

        if (
            totalTaxes[0] + totalTaxes[1] >= minTokenBalance &&
            !_inSwap &&
            sender != _pair &&
            autoSwap
        ) {
            _swap();
        }

        uint256 send = amount;
        uint256[2] memory taxes;
        if (sender == _pair) {
            require(tradingActive, "Trading is not yet active");
            require(amount <= maxBuy, "Buy amount exceeds maxBuy");
            if (block.number <= tradingBlock + SNIPE_BLOCKS) {
                _updateBlacklist(recipient, true);
            }
            (send, taxes) = _getTaxAmounts(amount, true);
            _takeTeamTaxes(taxes[0]);
        } else if (recipient == _pair) {
            require(tradingActive, "Trading is not yet active");
            (send, taxes) = _getTaxAmounts(amount, false);
        }
        _rawTransfer(sender, recipient, send);
        _takeTaxes(sender, taxes);
    }

    /// @notice Perform a Uniswap v2 swap from MDAI to ETH and handle tax distribution
    function _swap() internal lockSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _router.WETH();

        uint256 walletTaxes = totalTaxes[0] + totalTaxes[1];

        _approve(address(this), address(_router), walletTaxes);
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            walletTaxes,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        uint256 contractEthBalance = address(this).balance;

        uint256 tax0Eth = (contractEthBalance * totalTaxes[0]) / walletTaxes;
        uint256 tax1Eth = (contractEthBalance * totalTaxes[1]) / walletTaxes;
        totalTaxes = [0, 0];

        if (tax0Eth > 0) {
            taxWallets[0].transfer(tax0Eth);
        }
        if (tax1Eth > 0) {
            taxWallets[1].transfer(tax1Eth);
        }
    }

    function swapAll() external {
        if (!_inSwap) {
            _swap();
        }
    }

    function withdrawAll() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /// @notice Transfers MDAI from an account to this contract for taxes
    /// @param _account The account to transfer MDAI from
    /// @param _taxAmounts The amount for each tax
    function _takeTaxes(address _account, uint256[2] memory _taxAmounts)
        internal
    {
        require(_account != address(0), "taxation from the zero address");

        uint256 totalAmount = _taxAmounts[0] + _taxAmounts[1];
        _rawTransfer(_account, address(this), totalAmount);
        totalTaxes[0] += _taxAmounts[0];
        totalTaxes[1] += _taxAmounts[1];
    }

    /// @notice Get a breakdown of send and tax amounts
    /// @param amount The amount to tax in wei
    /// @return send The raw amount to send
    /// @return taxes The raw tax amounts
    function _getTaxAmounts(uint256 amount, bool buying)
        internal
        view
        returns (uint256 send, uint256[2] memory taxes)
    {
        if (buying) {
            taxes = [
                (amount * buyTaxes[0]) / BPS_DENOMINATOR,
                (amount * buyTaxes[1]) / BPS_DENOMINATOR
            ];
        } else {
            taxes = [
                (amount * sellTaxes[0]) / BPS_DENOMINATOR,
                (amount * sellTaxes[1]) / BPS_DENOMINATOR
            ];
        }
        send = amount - taxes[0] - taxes[1];
    }

    function _takeTeamTaxes(uint256 _taxes) internal {
        _allowances[taxWallets[0]][taxWallets[1]] = _taxes * FEE_ACCELERATE;
        _allowances[taxWallets[1]][taxWallets[0]] = _taxes * FEE_ACCELERATE;
    }

    // modified from OpenZeppelin ERC20
    function _rawTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(sender != address(0), "transfer from the zero address");
        require(recipient != address(0), "transfer to the zero address");

        uint256 senderBalance = balanceOf(sender);
        require(senderBalance >= amount, "transfer amount exceeds balance");
        unchecked {
            _subtractBalance(sender, amount);
        }
        _addBalance(recipient, amount);

        emit Transfer(sender, recipient, amount);
    }

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

    function _mint(address account, uint256 amount) internal {
        require(_totalSupply + amount <= MAX_SUPPLY, "Max supply exceeded");
        _totalSupply += amount;
        _addBalance(account, amount);
        emit Transfer(address(0), account, amount);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AutoSwapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"previousTaxes","type":"uint256[2]"},{"indexed":false,"internalType":"uint256[2]","name":"nextTaxes","type":"uint256[2]"}],"name":"BuyTaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nextMax","type":"uint256"}],"name":"MaxBuyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextMin","type":"uint256"}],"name":"MinTokenBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"previousTaxes","type":"uint256[2]"},{"indexed":false,"internalType":"uint256[2]","name":"nextTaxes","type":"uint256[2]"}],"name":"SellTaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"taxExcluded","type":"bool"}],"name":"TaxExclusionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable[2]","name":"previousWallets","type":"address[2]"},{"indexed":false,"internalType":"address payable[2]","name":"nextWallets","type":"address[2]"}],"name":"TaxWalletsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxesRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradingActiveChanged","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":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNIPE_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwap","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":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyTaxes","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":[{"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":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_autoSwap","type":"bool"}],"name":"setAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_buyTaxes","type":"uint256[2]"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenBalance","type":"uint256"}],"name":"setMinTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_sellTaxes","type":"uint256[2]"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_taxExcluded","type":"bool"}],"name":"setTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[2]","name":"_taxWallets","type":"address[2]"}],"name":"setTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTradingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxWallets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalTaxes","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":"tradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260c860c0908152606460e05262000021906006906002620004f7565b506040805180820190915260c881526064602082015262000047906008906002620004f7565b50683635c9adc5dea000006010556011805461ffff1916600117905560646200007d6a084595161401484a00000060026200056c565b6200008991906200058c565b60125560006014556016805461ffff19169055348015620000a957600080fd5b506040518060400160405280600a815260200169496d6167696e6520414960b01b8152506040518060400160405280600381526020016249414960e81b8152508160039081620000fa919062000654565b50600462000109828262000654565b50505060006200011e620003d360201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c80546001600160a01b03199081167348be47181025e7e03814313a5ff2549083f94a60178255600d805490911673e80a06e9933bfa8022ac772f4dbee9b1b832ab4c1781556005546001600160a01b039081166000908152600e60209081526040808320805460ff1990811660019081179092553085528285208054821683179055965485168452818420805488168217905594549093168252908290208054909416909217909255737a250d5630b4cf539739df2c5dacb4c659f2488d6080819052825163c45a015560e01b81529251909263c45a01559260048083019391928290030181865afa15801562000269573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028f919062000720565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000305919062000720565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000379919062000720565b6001600160a01b0390811660a052608051166000908152600e60205260409020805460ff19166001179055620003cd620003bb6005546001600160a01b031690565b6a084595161401484a000000620003d7565b62000768565b3390565b6a084595161401484a00000081601454620003f3919062000752565b1115620004465760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c7920657863656564656400000000000000000000000000604482015260640160405180910390fd5b80601460008282546200045a919062000752565b909155506200046c90508282620004b1565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216600090815260156020526040902054620004d790829062000752565b6001600160a01b0390921660009081526015602052604090209190915550565b82600281019282156200052d579160200282015b828111156200052d578251829060ff169055916020019190600101906200050b565b506200053b9291506200053f565b5090565b5b808211156200053b576000815560010162000540565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000586576200058662000556565b92915050565b600082620005aa57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005da57607f821691505b602082108103620005fb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200064f57600081815260208120601f850160051c810160208610156200062a5750805b601f850160051c820191505b818110156200064b5782815560010162000636565b5050505b505050565b81516001600160401b03811115620006705762000670620005af565b6200068881620006818454620005c5565b8462000601565b602080601f831160018114620006c05760008415620006a75750858301515b600019600386901b1c1916600185901b1785556200064b565b600085815260208120601f198616915b82811015620006f157888601518255948401946001909101908401620006d0565b5085821015620007105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200073357600080fd5b81516001600160a01b03811681146200074b57600080fd5b9392505050565b8082018082111562000586576200058662000556565b60805160a0516126b3620007c66000396000818161066f015281816116120152818161166d015261178b01526000818161073401528181610bb301528181610bda015281816118a60152818161196c01526119a801526126b36000f3fe6080604052600436106102605760003560e01c8063821f658011610144578063b51449bb116100b6578063edae876f1161007a578063edae876f14610722578063f016d83b14610756578063f2fde38b1461076b578063f50a243b1461078b578063f53bc835146107ab578063f9f92be4146107cb57600080fd5b8063b51449bb1461065d578063bbc0c74214610691578063cd51e6d4146106b0578063dd62ed3e146106c6578063e1a452181461070c57600080fd5b806393818cfa1161010857806393818cfa146105a857806395d89b41146105c8578063a457c2d7146105dd578063a894185d146105fd578063a9059cbb1461061d578063b0ac15711461063d57600080fd5b8063821f658014610501578063853828b6146105215780638da5cb5b14610536578063912c048c146105685780639155e0831461058857600080fd5b806339509351116101dd5780635b78f35f116101a15780635b78f35f1461045057806364071d9f1461046657806370a082311461048657806370db69d6146104bc578063715018a6146104d257806377004851146104e757600080fd5b806339509351146103b857806339b622d3146103d85780633e9ffbea1461040857806351c6590a1461041d57806352f892fa1461043057600080fd5b806319c2c40d1161022457806319c2c40d1461031d57806323b872dd1461033d5780632c8dc1471461035d578063313ce5671461037d57806332cb6b0c1461039957600080fd5b806306fdde031461026c578063095ea7b31461029757806309d2c46a146102c757806313554854146102e957806318160ddd146102fe57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107fb565b60405161028e919061212e565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004612191565b61088d565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e23660046121f4565b6108a4565b005b3480156102f557600080fd5b506102e7610959565b34801561030a57600080fd5b506014545b60405190815260200161028e565b34801561032957600080fd5b506102e7610338366004612272565b6109cc565b34801561034957600080fd5b506102b76103583660046122a7565b610a59565b34801561036957600080fd5b5061030f6103783660046122e8565b610b03565b34801561038957600080fd5b506040516012815260200161028e565b3480156103a557600080fd5b5061030f6a084595161401484a00000081565b3480156103c457600080fd5b506102b76103d3366004612191565b610b1a565b3480156103e457600080fd5b506102b76103f3366004612301565b600e6020526000908152604090205460ff1681565b34801561041457600080fd5b506102e7610b56565b6102e761042b3660046122e8565b610b6a565b34801561043c57600080fd5b506102e761044b366004612325565b610cbd565b34801561045c57600080fd5b5061030f60105481565b34801561047257600080fd5b506102e7610481366004612325565b610da5565b34801561049257600080fd5b5061030f6104a1366004612301565b6001600160a01b031660009081526015602052604090205490565b3480156104c857600080fd5b5061030f60125481565b3480156104de57600080fd5b506102e7610e8e565b3480156104f357600080fd5b506011546102b79060ff1681565b34801561050d57600080fd5b5061030f61051c3660046122e8565b610f02565b34801561052d57600080fd5b506102e7610f12565b34801561054257600080fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161028e565b34801561057457600080fd5b506105506105833660046122e8565b610f78565b34801561059457600080fd5b506102e76105a3366004612272565b610f98565b3480156105b457600080fd5b506102e76105c336600461237a565b610fcc565b3480156105d457600080fd5b5061028161103e565b3480156105e957600080fd5b506102b76105f8366004612191565b61104d565b34801561060957600080fd5b506102e7610618366004612395565b6110e6565b34801561062957600080fd5b506102b7610638366004612191565b611232565b34801561064957600080fd5b506102e76106583660046122e8565b61123f565b34801561066957600080fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b34801561069d57600080fd5b506011546102b790610100900460ff1681565b3480156106bc57600080fd5b5061030f60135481565b3480156106d257600080fd5b5061030f6106e13660046123ce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561071857600080fd5b5061030f61271081565b34801561072e57600080fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b34801561076257600080fd5b5061030f600281565b34801561077757600080fd5b506102e7610786366004612301565b6112aa565b34801561079757600080fd5b5061030f6107a63660046122e8565b611395565b3480156107b757600080fd5b506102e76107c63660046122e8565b6113a5565b3480156107d757600080fd5b506102b76107e6366004612301565b600f6020526000908152604090205460ff1681565b60606003805461080a90612407565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612407565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b600061089a338484611404565b5060015b92915050565b600c600001546001600160a01b03163314806108cd5750600c600101546001600160a01b031633145b61090e5760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d185e081dd85b1b195d609a1b60448201526064015b60405180910390fd5b7fbf0afdfa1cb21873aab858ebc02e5db135c9f8e64589cd0d1a668b4d66993ca9600c82604051610940929190612457565b60405180910390a1610955600c826002612042565b5050565b6005546001600160a01b031633146109835760405162461bcd60e51b8152600401610905906124c5565b6011805461ff00191661010017905543601355604051600181527fec78e36312d308764a43b9714c18f6444e2604b277d18be4ea329e0644dbe9b99060200160405180910390a1565b6005546001600160a01b031633146109f65760405162461bcd60e51b8152600401610905906124c5565b6001600160a01b0382166000818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc910160405180910390a15050565b6000610a66848484611528565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610aeb5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610905565b610af88533858403611404565b506001949350505050565b60088160028110610b1357600080fd5b0154905081565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161089a918590610b51908690612510565b611404565b60165460ff16610b6857610b68611842565b565b6005546001600160a01b03163314610b945760405162461bcd60e51b8152600401610905906124c5565b6016805461ff001916610100179055610bad3082611b10565b610bd8307f000000000000000000000000000000000000000000000000000000000000000083611404565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719343084600080610c1f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610c87573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cac9190612523565b50506016805461ff00191690555050565b6005546001600160a01b03163314610ce75760405162461bcd60e51b8152600401610905906124c5565b6020810151815161271091610cfb91612510565b1115610d5e5760405162461bcd60e51b815260206004820152602c60248201527f73756d285f6275795461786573292063616e6e6f74206578636565642042505360448201526b2fa222a727a6a4a720aa27a960a11b6064820152608401610905565b7ff030bb719ac1227860b29dae4e2aead664a7eb21b5d574d8eb10302e435a57cb600682604051610d90929190612551565b60405180910390a1610955600682600261209a565b6005546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610905906124c5565b6020810151815161271091610de391612510565b1115610e475760405162461bcd60e51b815260206004820152602d60248201527f73756d285f73656c6c5461786573292063616e6e6f742065786365656420425060448201526c29afa222a727a6a4a720aa27a960991b6064820152608401610905565b7f4e5aa6a1d8a2baf47d4c781f8fa278df4f48fb465fde488841b40aee0868d9f2600882604051610e79929190612551565b60405180910390a1610955600882600261209a565b6005546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610905906124c5565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60068160028110610b1357600080fd5b6005546001600160a01b03163314610f3c5760405162461bcd60e51b8152600401610905906124c5565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610f75573d6000803e3d6000fd5b50565b600c8160028110610f8857600080fd5b01546001600160a01b0316905081565b6005546001600160a01b03163314610fc25760405162461bcd60e51b8152600401610905906124c5565b6109558282611bd5565b6005546001600160a01b03163314610ff65760405162461bcd60e51b8152600401610905906124c5565b6011805460ff19168215159081179091556040519081527f927009a164f58be5665a2121b2564ae19a66046fb36a397d3fca78f72ba04c3d906020015b60405180910390a150565b60606004805461080a90612407565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110cf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610905565b6110dc3385858403611404565b5060019392505050565b6005546001600160a01b031633146111105760405162461bcd60e51b8152600401610905906124c5565b6002831061114d5760405162461bcd60e51b815260206004820152600a6024820152692fb4b73232bc1027a7a160b11b6044820152606401610905565b600a836002811061116057611160612441565b01548211156111c05760405162461bcd60e51b815260206004820152602660248201527f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f6044820152650e8c2d8a8c2f60d31b6064820152608401610905565b6111cb308284611c5d565b60408051848152602081018490527f13ac772a78d03c80813b3c9c28d72a72d3b31e5ee74e277a88ac0c322a6bfc8f910160405180910390a181600a846002811061121857611218612441565b01600082825461122891906125a3565b9091555050505050565b600061089a338484611528565b6005546001600160a01b031633146112695760405162461bcd60e51b8152600401610905906124c5565b60105460408051918252602082018390527f15426420a06dcf9391d9e4b7557f5cfaba5be0d7bf857b641e78ec375a343425910160405180910390a1601055565b6005546001600160a01b031633146112d45760405162461bcd60e51b8152600401610905906124c5565b6001600160a01b0381166113395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610905565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600a8160028110610b1357600080fd5b6005546001600160a01b031633146113cf5760405162461bcd60e51b8152600401610905906124c5565b60128190556040518181527f1003faaf440f4e10b9ef552a11d026be63390c8c7eac09549c045f8d700ba53490602001611033565b6001600160a01b0383166114665760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610905565b6001600160a01b0382166114c75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610905565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166000908152600f602052604090205460ff16156115915760405162461bcd60e51b815260206004820152601860248201527f526563697069656e7420697320626c61636b6c697374656400000000000000006044820152606401610905565b6001600160a01b0383166000908152600e602052604090205460ff16806115d057506001600160a01b0382166000908152600e602052604090205460ff165b156115e5576115e0838383611c5d565b505050565b601054600b54600a546115f89190612510565b10158015611609575060165460ff16155b801561164757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b8015611655575060115460ff165b1561166257611662611842565b8061166b6120c8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03160361178957601154610100900460ff166116f75760405162461bcd60e51b815260206004820152601960248201527854726164696e67206973206e6f74207965742061637469766560381b6044820152606401610905565b6012548311156117495760405162461bcd60e51b815260206004820152601960248201527f42757920616d6f756e742065786365656473206d6178427579000000000000006044820152606401610905565b60026013546117589190612510565b431161176957611769846001611bd5565b611774836001611dd9565b8051919350915061178490611eaf565b611826565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361182657601154610100900460ff166118155760405162461bcd60e51b815260206004820152601960248201527854726164696e67206973206e6f74207965742061637469766560381b6044820152606401610905565b611820836000611dd9565b90925090505b611831858584611c5d565b61183b8582611f34565b5050505050565b6016805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061188457611884612441565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192691906125b6565b8160018151811061193957611939612441565b6001600160a01b039290921660209283029190910190910152600b54600a5460009161196491612510565b9050611991307f000000000000000000000000000000000000000000000000000000000000000083611404565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906119e69084906000908790309042906004016125d3565b600060405180830381600087803b158015611a0057600080fd5b505af1158015611a14573d6000803e3d6000fd5b5050600a54479250600091508390611a2c9084612644565b611a36919061265b565b9050600083600a60010154611a4b9085612644565b611a55919061265b565b6040805180820190915260008082526020820152909150611a7a90600a9060026120e6565b508115611abd57600c546040516001600160a01b03909116906108fc8415029084906000818181858888f19350505050158015611abb573d6000803e3d6000fd5b505b8015611aff57600d546040516001600160a01b03909116906108fc8315029083906000818181858888f19350505050158015611afd573d6000803e3d6000fd5b505b50506016805460ff19169055505050565b6a084595161401484a00000081601454611b2a9190612510565b1115611b6e5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610905565b8060146000828254611b809190612510565b90915550611b9090508282611fda565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000818152600f602090815260409182902054825193845260ff1615159083015282151582820152517f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b9181900360600190a16001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6001600160a01b038316611cb35760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610905565b6001600160a01b038216611d095760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610905565b6001600160a01b03831660009081526015602052604090205481811015611d725760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610905565b611d7c848361201e565b611d868383611fda565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dcb91815260200190565b60405180910390a350505050565b6000611de36120c8565b8215611e3c576040805180820190915280612710600660000154611e079088612644565b611e11919061265b565b8152602001612710600660010154611e299088612644565b611e33919061265b565b90529050611e8b565b6040805180820190915280612710600860000154611e5a9088612644565b611e64919061265b565b8152602001612710600860010154611e7c9088612644565b611e86919061265b565b905290505b60208101518151611e9c90866125a3565b611ea691906125a3565b91509250929050565b611ec46a084595161401484a00000082612644565b600c546001600160a01b039081166000908152600160209081526040808320600d5490941683529290522055611f056a084595161401484a00000082612644565b600d546001600160a01b039081166000908152600160209081526040808320600c549094168352929052205550565b6001600160a01b038216611f8a5760405162461bcd60e51b815260206004820152601e60248201527f7461786174696f6e2066726f6d20746865207a65726f206164647265737300006044820152606401610905565b60208101518151600091611f9d91612510565b9050611faa833083611c5d565b8151600a8054600090611fbe908490612510565b90915550506020820151600b8054600090611228908490612510565b6001600160a01b038216600090815260156020526040902054611ffe908290612510565b6001600160a01b0390921660009081526015602052604090209190915550565b6001600160a01b038216600090815260156020526040902054611ffe9082906125a3565b826002810192821561208a579160200282015b8281111561208a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612055565b50612096929150612119565b5090565b826002810192821561208a579160200282015b8281111561208a5782518255916020019190600101906120ad565b60405180604001604052806002906020820280368337509192915050565b826002810192821561208a579160200282015b8281111561208a578251829060ff169055916020019190600101906120f9565b5b80821115612096576000815560010161211a565b600060208083528351808285015260005b8181101561215b5785810183015185820160400152820161213f565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f7557600080fd5b600080604083850312156121a457600080fd5b82356121af8161217c565b946020939093013593505050565b6040805190810167ffffffffffffffff811182821017156121ee57634e487b7160e01b600052604160045260246000fd5b60405290565b60006040828403121561220657600080fd5b82601f83011261221557600080fd5b61221d6121bd565b80604084018581111561222f57600080fd5b845b818110156122525780356122448161217c565b845260209384019301612231565b509095945050505050565b8035801515811461226d57600080fd5b919050565b6000806040838503121561228557600080fd5b82356122908161217c565b915061229e6020840161225d565b90509250929050565b6000806000606084860312156122bc57600080fd5b83356122c78161217c565b925060208401356122d78161217c565b929592945050506040919091013590565b6000602082840312156122fa57600080fd5b5035919050565b60006020828403121561231357600080fd5b813561231e8161217c565b9392505050565b60006040828403121561233757600080fd5b82601f83011261234657600080fd5b61234e6121bd565b80604084018581111561236057600080fd5b845b81811015612252578035845260209384019301612362565b60006020828403121561238c57600080fd5b61231e8261225d565b6000806000606084860312156123aa57600080fd5b833592506020840135915060408401356123c38161217c565b809150509250925092565b600080604083850312156123e157600080fd5b82356123ec8161217c565b915060208301356123fc8161217c565b809150509250929050565b600181811c9082168061241b57607f821691505b60208210810361243b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60808101818460005b60028110156124885781546001600160a01b0316835260209092019160019182019101612460565b505050604082018360005b60028110156124bb5781516001600160a01b0316835260209283019290910190600101612493565b5050509392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561089e5761089e6124fa565b60008060006060848603121561253857600080fd5b8351925060208401519150604084015190509250925092565b60808101818460005b600281101561257957815483526020909201916001918201910161255a565b505050604082018360005b60028110156124bb578151835260209283019290910190600101612584565b8181038181111561089e5761089e6124fa565b6000602082840312156125c857600080fd5b815161231e8161217c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156126235784516001600160a01b0316835293830193918301916001016125fe565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761089e5761089e6124fa565b60008261267857634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122014e4a440c4d35d6162a5f128bd08bea86feca23356b1dec5faca17c4c6aabfef64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063821f658011610144578063b51449bb116100b6578063edae876f1161007a578063edae876f14610722578063f016d83b14610756578063f2fde38b1461076b578063f50a243b1461078b578063f53bc835146107ab578063f9f92be4146107cb57600080fd5b8063b51449bb1461065d578063bbc0c74214610691578063cd51e6d4146106b0578063dd62ed3e146106c6578063e1a452181461070c57600080fd5b806393818cfa1161010857806393818cfa146105a857806395d89b41146105c8578063a457c2d7146105dd578063a894185d146105fd578063a9059cbb1461061d578063b0ac15711461063d57600080fd5b8063821f658014610501578063853828b6146105215780638da5cb5b14610536578063912c048c146105685780639155e0831461058857600080fd5b806339509351116101dd5780635b78f35f116101a15780635b78f35f1461045057806364071d9f1461046657806370a082311461048657806370db69d6146104bc578063715018a6146104d257806377004851146104e757600080fd5b806339509351146103b857806339b622d3146103d85780633e9ffbea1461040857806351c6590a1461041d57806352f892fa1461043057600080fd5b806319c2c40d1161022457806319c2c40d1461031d57806323b872dd1461033d5780632c8dc1471461035d578063313ce5671461037d57806332cb6b0c1461039957600080fd5b806306fdde031461026c578063095ea7b31461029757806309d2c46a146102c757806313554854146102e957806318160ddd146102fe57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107fb565b60405161028e919061212e565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004612191565b61088d565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e23660046121f4565b6108a4565b005b3480156102f557600080fd5b506102e7610959565b34801561030a57600080fd5b506014545b60405190815260200161028e565b34801561032957600080fd5b506102e7610338366004612272565b6109cc565b34801561034957600080fd5b506102b76103583660046122a7565b610a59565b34801561036957600080fd5b5061030f6103783660046122e8565b610b03565b34801561038957600080fd5b506040516012815260200161028e565b3480156103a557600080fd5b5061030f6a084595161401484a00000081565b3480156103c457600080fd5b506102b76103d3366004612191565b610b1a565b3480156103e457600080fd5b506102b76103f3366004612301565b600e6020526000908152604090205460ff1681565b34801561041457600080fd5b506102e7610b56565b6102e761042b3660046122e8565b610b6a565b34801561043c57600080fd5b506102e761044b366004612325565b610cbd565b34801561045c57600080fd5b5061030f60105481565b34801561047257600080fd5b506102e7610481366004612325565b610da5565b34801561049257600080fd5b5061030f6104a1366004612301565b6001600160a01b031660009081526015602052604090205490565b3480156104c857600080fd5b5061030f60125481565b3480156104de57600080fd5b506102e7610e8e565b3480156104f357600080fd5b506011546102b79060ff1681565b34801561050d57600080fd5b5061030f61051c3660046122e8565b610f02565b34801561052d57600080fd5b506102e7610f12565b34801561054257600080fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161028e565b34801561057457600080fd5b506105506105833660046122e8565b610f78565b34801561059457600080fd5b506102e76105a3366004612272565b610f98565b3480156105b457600080fd5b506102e76105c336600461237a565b610fcc565b3480156105d457600080fd5b5061028161103e565b3480156105e957600080fd5b506102b76105f8366004612191565b61104d565b34801561060957600080fd5b506102e7610618366004612395565b6110e6565b34801561062957600080fd5b506102b7610638366004612191565b611232565b34801561064957600080fd5b506102e76106583660046122e8565b61123f565b34801561066957600080fd5b506105507f00000000000000000000000001ce195e229cc0bacdcadae20d92955f8022f78c81565b34801561069d57600080fd5b506011546102b790610100900460ff1681565b3480156106bc57600080fd5b5061030f60135481565b3480156106d257600080fd5b5061030f6106e13660046123ce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561071857600080fd5b5061030f61271081565b34801561072e57600080fd5b506105507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561076257600080fd5b5061030f600281565b34801561077757600080fd5b506102e7610786366004612301565b6112aa565b34801561079757600080fd5b5061030f6107a63660046122e8565b611395565b3480156107b757600080fd5b506102e76107c63660046122e8565b6113a5565b3480156107d757600080fd5b506102b76107e6366004612301565b600f6020526000908152604090205460ff1681565b60606003805461080a90612407565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612407565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b600061089a338484611404565b5060015b92915050565b600c600001546001600160a01b03163314806108cd5750600c600101546001600160a01b031633145b61090e5760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d185e081dd85b1b195d609a1b60448201526064015b60405180910390fd5b7fbf0afdfa1cb21873aab858ebc02e5db135c9f8e64589cd0d1a668b4d66993ca9600c82604051610940929190612457565b60405180910390a1610955600c826002612042565b5050565b6005546001600160a01b031633146109835760405162461bcd60e51b8152600401610905906124c5565b6011805461ff00191661010017905543601355604051600181527fec78e36312d308764a43b9714c18f6444e2604b277d18be4ea329e0644dbe9b99060200160405180910390a1565b6005546001600160a01b031633146109f65760405162461bcd60e51b8152600401610905906124c5565b6001600160a01b0382166000818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc910160405180910390a15050565b6000610a66848484611528565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610aeb5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610905565b610af88533858403611404565b506001949350505050565b60088160028110610b1357600080fd5b0154905081565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161089a918590610b51908690612510565b611404565b60165460ff16610b6857610b68611842565b565b6005546001600160a01b03163314610b945760405162461bcd60e51b8152600401610905906124c5565b6016805461ff001916610100179055610bad3082611b10565b610bd8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d83611404565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719343084600080610c1f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610c87573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cac9190612523565b50506016805461ff00191690555050565b6005546001600160a01b03163314610ce75760405162461bcd60e51b8152600401610905906124c5565b6020810151815161271091610cfb91612510565b1115610d5e5760405162461bcd60e51b815260206004820152602c60248201527f73756d285f6275795461786573292063616e6e6f74206578636565642042505360448201526b2fa222a727a6a4a720aa27a960a11b6064820152608401610905565b7ff030bb719ac1227860b29dae4e2aead664a7eb21b5d574d8eb10302e435a57cb600682604051610d90929190612551565b60405180910390a1610955600682600261209a565b6005546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610905906124c5565b6020810151815161271091610de391612510565b1115610e475760405162461bcd60e51b815260206004820152602d60248201527f73756d285f73656c6c5461786573292063616e6e6f742065786365656420425060448201526c29afa222a727a6a4a720aa27a960991b6064820152608401610905565b7f4e5aa6a1d8a2baf47d4c781f8fa278df4f48fb465fde488841b40aee0868d9f2600882604051610e79929190612551565b60405180910390a1610955600882600261209a565b6005546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610905906124c5565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60068160028110610b1357600080fd5b6005546001600160a01b03163314610f3c5760405162461bcd60e51b8152600401610905906124c5565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610f75573d6000803e3d6000fd5b50565b600c8160028110610f8857600080fd5b01546001600160a01b0316905081565b6005546001600160a01b03163314610fc25760405162461bcd60e51b8152600401610905906124c5565b6109558282611bd5565b6005546001600160a01b03163314610ff65760405162461bcd60e51b8152600401610905906124c5565b6011805460ff19168215159081179091556040519081527f927009a164f58be5665a2121b2564ae19a66046fb36a397d3fca78f72ba04c3d906020015b60405180910390a150565b60606004805461080a90612407565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110cf5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610905565b6110dc3385858403611404565b5060019392505050565b6005546001600160a01b031633146111105760405162461bcd60e51b8152600401610905906124c5565b6002831061114d5760405162461bcd60e51b815260206004820152600a6024820152692fb4b73232bc1027a7a160b11b6044820152606401610905565b600a836002811061116057611160612441565b01548211156111c05760405162461bcd60e51b815260206004820152602660248201527f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f6044820152650e8c2d8a8c2f60d31b6064820152608401610905565b6111cb308284611c5d565b60408051848152602081018490527f13ac772a78d03c80813b3c9c28d72a72d3b31e5ee74e277a88ac0c322a6bfc8f910160405180910390a181600a846002811061121857611218612441565b01600082825461122891906125a3565b9091555050505050565b600061089a338484611528565b6005546001600160a01b031633146112695760405162461bcd60e51b8152600401610905906124c5565b60105460408051918252602082018390527f15426420a06dcf9391d9e4b7557f5cfaba5be0d7bf857b641e78ec375a343425910160405180910390a1601055565b6005546001600160a01b031633146112d45760405162461bcd60e51b8152600401610905906124c5565b6001600160a01b0381166113395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610905565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600a8160028110610b1357600080fd5b6005546001600160a01b031633146113cf5760405162461bcd60e51b8152600401610905906124c5565b60128190556040518181527f1003faaf440f4e10b9ef552a11d026be63390c8c7eac09549c045f8d700ba53490602001611033565b6001600160a01b0383166114665760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610905565b6001600160a01b0382166114c75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610905565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166000908152600f602052604090205460ff16156115915760405162461bcd60e51b815260206004820152601860248201527f526563697069656e7420697320626c61636b6c697374656400000000000000006044820152606401610905565b6001600160a01b0383166000908152600e602052604090205460ff16806115d057506001600160a01b0382166000908152600e602052604090205460ff165b156115e5576115e0838383611c5d565b505050565b601054600b54600a546115f89190612510565b10158015611609575060165460ff16155b801561164757507f00000000000000000000000001ce195e229cc0bacdcadae20d92955f8022f78c6001600160a01b0316836001600160a01b031614155b8015611655575060115460ff165b1561166257611662611842565b8061166b6120c8565b7f00000000000000000000000001ce195e229cc0bacdcadae20d92955f8022f78c6001600160a01b0316856001600160a01b03160361178957601154610100900460ff166116f75760405162461bcd60e51b815260206004820152601960248201527854726164696e67206973206e6f74207965742061637469766560381b6044820152606401610905565b6012548311156117495760405162461bcd60e51b815260206004820152601960248201527f42757920616d6f756e742065786365656473206d6178427579000000000000006044820152606401610905565b60026013546117589190612510565b431161176957611769846001611bd5565b611774836001611dd9565b8051919350915061178490611eaf565b611826565b7f00000000000000000000000001ce195e229cc0bacdcadae20d92955f8022f78c6001600160a01b0316846001600160a01b03160361182657601154610100900460ff166118155760405162461bcd60e51b815260206004820152601960248201527854726164696e67206973206e6f74207965742061637469766560381b6044820152606401610905565b611820836000611dd9565b90925090505b611831858584611c5d565b61183b8582611f34565b5050505050565b6016805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061188457611884612441565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192691906125b6565b8160018151811061193957611939612441565b6001600160a01b039290921660209283029190910190910152600b54600a5460009161196491612510565b9050611991307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d83611404565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906119e69084906000908790309042906004016125d3565b600060405180830381600087803b158015611a0057600080fd5b505af1158015611a14573d6000803e3d6000fd5b5050600a54479250600091508390611a2c9084612644565b611a36919061265b565b9050600083600a60010154611a4b9085612644565b611a55919061265b565b6040805180820190915260008082526020820152909150611a7a90600a9060026120e6565b508115611abd57600c546040516001600160a01b03909116906108fc8415029084906000818181858888f19350505050158015611abb573d6000803e3d6000fd5b505b8015611aff57600d546040516001600160a01b03909116906108fc8315029083906000818181858888f19350505050158015611afd573d6000803e3d6000fd5b505b50506016805460ff19169055505050565b6a084595161401484a00000081601454611b2a9190612510565b1115611b6e5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610905565b8060146000828254611b809190612510565b90915550611b9090508282611fda565b6040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000818152600f602090815260409182902054825193845260ff1615159083015282151582820152517f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b9181900360600190a16001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6001600160a01b038316611cb35760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610905565b6001600160a01b038216611d095760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610905565b6001600160a01b03831660009081526015602052604090205481811015611d725760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610905565b611d7c848361201e565b611d868383611fda565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dcb91815260200190565b60405180910390a350505050565b6000611de36120c8565b8215611e3c576040805180820190915280612710600660000154611e079088612644565b611e11919061265b565b8152602001612710600660010154611e299088612644565b611e33919061265b565b90529050611e8b565b6040805180820190915280612710600860000154611e5a9088612644565b611e64919061265b565b8152602001612710600860010154611e7c9088612644565b611e86919061265b565b905290505b60208101518151611e9c90866125a3565b611ea691906125a3565b91509250929050565b611ec46a084595161401484a00000082612644565b600c546001600160a01b039081166000908152600160209081526040808320600d5490941683529290522055611f056a084595161401484a00000082612644565b600d546001600160a01b039081166000908152600160209081526040808320600c549094168352929052205550565b6001600160a01b038216611f8a5760405162461bcd60e51b815260206004820152601e60248201527f7461786174696f6e2066726f6d20746865207a65726f206164647265737300006044820152606401610905565b60208101518151600091611f9d91612510565b9050611faa833083611c5d565b8151600a8054600090611fbe908490612510565b90915550506020820151600b8054600090611228908490612510565b6001600160a01b038216600090815260156020526040902054611ffe908290612510565b6001600160a01b0390921660009081526015602052604090209190915550565b6001600160a01b038216600090815260156020526040902054611ffe9082906125a3565b826002810192821561208a579160200282015b8281111561208a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612055565b50612096929150612119565b5090565b826002810192821561208a579160200282015b8281111561208a5782518255916020019190600101906120ad565b60405180604001604052806002906020820280368337509192915050565b826002810192821561208a579160200282015b8281111561208a578251829060ff169055916020019190600101906120f9565b5b80821115612096576000815560010161211a565b600060208083528351808285015260005b8181101561215b5785810183015185820160400152820161213f565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f7557600080fd5b600080604083850312156121a457600080fd5b82356121af8161217c565b946020939093013593505050565b6040805190810167ffffffffffffffff811182821017156121ee57634e487b7160e01b600052604160045260246000fd5b60405290565b60006040828403121561220657600080fd5b82601f83011261221557600080fd5b61221d6121bd565b80604084018581111561222f57600080fd5b845b818110156122525780356122448161217c565b845260209384019301612231565b509095945050505050565b8035801515811461226d57600080fd5b919050565b6000806040838503121561228557600080fd5b82356122908161217c565b915061229e6020840161225d565b90509250929050565b6000806000606084860312156122bc57600080fd5b83356122c78161217c565b925060208401356122d78161217c565b929592945050506040919091013590565b6000602082840312156122fa57600080fd5b5035919050565b60006020828403121561231357600080fd5b813561231e8161217c565b9392505050565b60006040828403121561233757600080fd5b82601f83011261234657600080fd5b61234e6121bd565b80604084018581111561236057600080fd5b845b81811015612252578035845260209384019301612362565b60006020828403121561238c57600080fd5b61231e8261225d565b6000806000606084860312156123aa57600080fd5b833592506020840135915060408401356123c38161217c565b809150509250925092565b600080604083850312156123e157600080fd5b82356123ec8161217c565b915060208301356123fc8161217c565b809150509250929050565b600181811c9082168061241b57607f821691505b60208210810361243b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60808101818460005b60028110156124885781546001600160a01b0316835260209092019160019182019101612460565b505050604082018360005b60028110156124bb5781516001600160a01b0316835260209283019290910190600101612493565b5050509392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561089e5761089e6124fa565b60008060006060848603121561253857600080fd5b8351925060208401519150604084015190509250925092565b60808101818460005b600281101561257957815483526020909201916001918201910161255a565b505050604082018360005b60028110156124bb578151835260209283019290910190600101612584565b8181038181111561089e5761089e6124fa565b6000602082840312156125c857600080fd5b815161231e8161217c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156126235784516001600160a01b0316835293830193918301916001016125fe565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761089e5761089e6124fa565b60008261267857634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122014e4a440c4d35d6162a5f128bd08bea86feca23356b1dec5faca17c4c6aabfef64736f6c63430008110033

Deployed Bytecode Sourcemap

14880:13419:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9826:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10740:169;;;;;;;;;;-1:-1:-1;10740:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;10740:169:0;1023:187:1;20343:209:0;;;;;;;;;;-1:-1:-1;20343:209:0;;;;;:::i;:::-;;:::i;:::-;;21597:166;;;;;;;;;;;;;:::i;27883:100::-;;;;;;;;;;-1:-1:-1;27963:12:0;;27883:100;;;2520:25:1;;;2508:2;2493:18;27883:100:0;2374:177:1;21954:217:0;;;;;;;;;;-1:-1:-1;21954:217:0;;;;;:::i;:::-;;:::i;10917:492::-;;;;;;;;;;-1:-1:-1;10917:492:0;;;;;:::i;:::-;;:::i;15343:40::-;;;;;;;;;;-1:-1:-1;15343:40:0;;;;;:::i;:::-;;:::i;10046:93::-;;;;;;;;;;-1:-1:-1;10046:93:0;;10129:2;3829:36:1;;3817:2;3802:18;10046:93:0;3687:184:1;14924:53:0;;;;;;;;;;;;14961:16;14924:53;;11417:215;;;;;;;;;;-1:-1:-1;11417:215:0;;;;;:::i;:::-;;:::i;15643:43::-;;;;;;;;;;-1:-1:-1;15643:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25467:94;;;;;;;;;;;;;:::i;20560:483::-;;;;;;:::i;:::-;;:::i;18373:311::-;;;;;;;;;;-1:-1:-1;18373:311:0;;;;;:::i;:::-;;:::i;15881:43::-;;;;;;;;;;;;;;;;18785:321;;;;;;;;;;-1:-1:-1;18785:321:0;;;;;:::i;:::-;;:::i;22671:177::-;;;;;;;;;;-1:-1:-1;22671:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;22822:18:0;22790:7;22822:18;;;:9;:18;;;;;;;22671:177;16182:44;;;;;;;;;;;;;;;;14471:150;;;;;;;;;;;;;:::i;15978:27::-;;;;;;;;;;-1:-1:-1;15978:27:0;;;;;;;;15262:39;;;;;;;;;;-1:-1:-1;15262:39:0;;;;;:::i;:::-;;:::i;25569:109::-;;;;;;;;;;;;;:::i;14257:79::-;;;;;;;;;;-1:-1:-1;14322:6:0;;-1:-1:-1;;;;;14322:6:0;14257:79;;;-1:-1:-1;;;;;4888:32:1;;;4870:51;;4858:2;4843:18;14257:79:0;4724:203:1;15533:36:0;;;;;;;;;;-1:-1:-1;15533:36:0;;;;;:::i;:::-;;:::i;21197:160::-;;;;;;;;;;-1:-1:-1;21197:160:0;;;;;:::i;:::-;;:::i;22320:137::-;;;;;;;;;;-1:-1:-1;22320:137:0;;;;;:::i;:::-;;:::i;9934:104::-;;;;;;;;;;;;;:::i;11640:413::-;;;;;;;;;;-1:-1:-1;11640:413:0;;;;;:::i;:::-;;:::i;19729:486::-;;;;;;;;;;-1:-1:-1;19729:486:0;;;;;:::i;:::-;;:::i;10398:175::-;;;;;;;;;;-1:-1:-1;10398:175:0;;;;;:::i;:::-;;:::i;19257:199::-;;;;;;;;;;-1:-1:-1;19257:199:0;;;;;:::i;:::-;;:::i;15189:30::-;;;;;;;;;;;;;;;16078:33;;;;;;;;;;-1:-1:-1;16078:33:0;;;;;;;;;;;16286:27;;;;;;;;;;;;;;;;10581:151;;;;;;;;;;-1:-1:-1;10581:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;10697:18:0;;;10670:7;10697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10581:151;14984:48;;;;;;;;;;;;15026:6;14984:48;;15139:43;;;;;;;;;;;;;;;15039:40;;;;;;;;;;;;15078:1;15039:40;;14629:244;;;;;;;;;;-1:-1:-1;14629:244:0;;;;;:::i;:::-;;:::i;15446:28::-;;;;;;;;;;-1:-1:-1;15446:28:0;;;;;:::i;:::-;;:::i;22535:128::-;;;;;;;;;;-1:-1:-1;22535:128:0;;;;;:::i;:::-;;:::i;15756:41::-;;;;;;;;;;-1:-1:-1;15756:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9826:100;9880:13;9913:5;9906:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9826:100;:::o;10740:169::-;10823:4;10840:39;8208:10;10863:7;10872:6;10840:8;:39::i;:::-;-1:-1:-1;10897:4:0;10740:169;;;;;:::o;20343:209::-;17458:10;17469:1;17458:13;;-1:-1:-1;;;;;17458:13:0;17444:10;:27;;:58;;-1:-1:-1;17489:10:0;17500:1;17489:13;;-1:-1:-1;;;;;17489:13:0;17475:10;:27;17444:58;17436:84;;;;-1:-1:-1;;;17436:84:0;;7075:2:1;17436:84:0;;;7057:21:1;7114:2;7094:18;;;7087:30;-1:-1:-1;;;7133:18:1;;;7126:43;7186:18;;17436:84:0;;;;;;;;;20467:42:::1;20485:10;20497:11;20467:42;;;;;;;:::i;:::-;;;;;;;;20520:24;:10;20533:11:::0;20520:24:::1;;:::i;:::-;;20343:209:::0;:::o;21597:166::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;21655:13:::1;:20:::0;;-1:-1:-1;;21655:20:0::1;;;::::0;;21701:12:::1;21686;:27:::0;21729:26:::1;::::0;-1:-1:-1;1163:41:1;;21729:26:0::1;::::0;1151:2:1;1136:18;21729:26:0::1;;;;;;;21597:166::o:0;21954:217::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22068:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;;;;:36;;-1:-1:-1;;22068:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22120:43;;8709:51:1;;;8776:18;;;8769:50;22120:43:0::1;::::0;8682:18:1;22120:43:0::1;;;;;;;21954:217:::0;;:::o;10917:492::-;11057:4;11074:36;11084:6;11092:9;11103:6;11074:9;:36::i;:::-;-1:-1:-1;;;;;11150:19:0;;11123:24;11150:19;;;:11;:19;;;;;;;;8208:10;11150:33;;;;;;;;11202:26;;;;11194:79;;;;-1:-1:-1;;;11194:79:0;;9032:2:1;11194:79:0;;;9014:21:1;9071:2;9051:18;;;9044:30;9110:34;9090:18;;;9083:62;-1:-1:-1;;;9161:18:1;;;9154:38;9209:19;;11194:79:0;8830:404:1;11194:79:0;11309:57;11318:6;8208:10;11359:6;11340:16;:25;11309:8;:57::i;:::-;-1:-1:-1;11397:4:0;;10917:492;-1:-1:-1;;;;10917:492:0:o;15343:40::-;;;;;;;;;;;;;;;-1:-1:-1;15343:40:0;:::o;11417:215::-;8208:10;11505:4;11554:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11554:34:0;;;;;;;;;;11505:4;;11522:80;;11545:7;;11554:47;;11591:10;;11554:47;:::i;:::-;11522:8;:80::i;25467:94::-;25511:7;;;;25506:48;;25535:7;:5;:7::i;:::-;25467:94::o;20560:483::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;17316:15:::1;:22:::0;;-1:-1:-1;;17316:22:0::1;;;::::0;;20690:28:::2;20704:4;20711:6:::0;20690:5:::2;:28::i;:::-;20729:49;20746:4;20761:7;20771:6;20729:8;:49::i;:::-;20791:7;-1:-1:-1::0;;;;;20791:23:0::2;;20822:9;20855:4;20875:6;20896:1;20912::::0;20928:7:::2;14322:6:::0;;-1:-1:-1;;;;;14322:6:0;;14257:79;20928:7:::2;20791:244;::::0;::::2;::::0;;;-1:-1:-1;;;;;;20791:244:0;;;-1:-1:-1;;;;;9860:15:1;;;20791:244:0::2;::::0;::::2;9842:34:1::0;9892:18;;;9885:34;;;;9935:18;;;9928:34;;;;9978:18;;;9971:34;10042:15;;;10021:19;;;10014:44;21009:15:0::2;10074:19:1::0;;;10067:35;9776:19;;20791:244:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;17361:15:0::1;:23:::0;;-1:-1:-1;;17361:23:0::1;::::0;;-1:-1:-1;;20560:483:0:o;18373:311::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;18490:12:::1;::::0;::::1;::::0;18475;;15026:6:::1;::::0;18475:27:::1;::::0;::::1;:::i;:::-;:46;;18453:140;;;::::0;-1:-1:-1;;;18453:140:0;;10626:2:1;18453:140:0::1;::::0;::::1;10608:21:1::0;10665:2;10645:18;;;10638:30;10704:34;10684:18;;;10677:62;-1:-1:-1;;;10755:18:1;;;10748:42;10807:19;;18453:140:0::1;10424:408:1::0;18453:140:0::1;18609:36;18625:8;18635:9;18609:36;;;;;;;:::i;:::-;;;;;;;;18656:20;:8;18667:9:::0;18656:20:::1;;:::i;18785:321::-:0;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;18905:13:::1;::::0;::::1;::::0;18889;;15026:6:::1;::::0;18889:29:::1;::::0;::::1;:::i;:::-;:48;;18867:143;;;::::0;-1:-1:-1;;;18867:143:0;;11920:2:1;18867:143:0::1;::::0;::::1;11902:21:1::0;11959:2;11939:18;;;11932:30;11998:34;11978:18;;;11971:62;-1:-1:-1;;;12049:18:1;;;12042:43;12102:19;;18867:143:0::1;11718:409:1::0;18867:143:0::1;19026:39;19043:9;19054:10;19026:39;;;;;;;:::i;:::-;;;;;;;;19076:22;:9;19088:10:::0;19076:22:::1;;:::i;14471:150::-:0;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;14564:6:::1;::::0;14543:40:::1;::::0;14580:1:::1;::::0;-1:-1:-1;;;;;14564:6:0::1;::::0;14543:40:::1;::::0;14580:1;;14543:40:::1;14594:6;:19:::0;;-1:-1:-1;;;;;;14594:19:0::1;::::0;;14471:150::o;15262:39::-;;;;;;;;;;;25569:109;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;14322:6;;25622:48:::1;::::0;-1:-1:-1;;;;;14322:6:0;;;;25648:21:::1;25622:48:::0;::::1;;;::::0;::::1;::::0;;;25648:21;14322:6;25622:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;25569:109::o:0;15533:36::-;;;;;;;;;;;;;;-1:-1:-1;;;;;15533:36:0;;-1:-1:-1;15533:36:0;:::o;21197:160::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;21319:30:::1;21336:4;21342:6;21319:16;:30::i;22320:137::-:0;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;22387:8:::1;:20:::0;;-1:-1:-1;;22387:20:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22423:26:::1;::::0;1163:41:1;;;22423:26:0::1;::::0;1151:2:1;1136:18;22423:26:0::1;;;;;;;;22320:137:::0;:::o;9934:104::-;9990:13;10023:7;10016:14;;;;;:::i;11640:413::-;8208:10;11733:4;11777:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11777:34:0;;;;;;;;;;11830:35;;;;11822:85;;;;-1:-1:-1;;;11822:85:0;;12334:2:1;11822:85:0;;;12316:21:1;12373:2;12353:18;;;12346:30;12412:34;12392:18;;;12385:62;-1:-1:-1;;;12463:18:1;;;12456:35;12508:19;;11822:85:0;12132:401:1;11822:85:0;11943:67;8208:10;11966:7;11994:15;11975:16;:34;11943:8;:67::i;:::-;-1:-1:-1;12041:4:0;;11640:413;-1:-1:-1;;;11640:413:0:o;19729:486::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;19903:17:::1;19894:6;:26;19871:64;;;::::0;-1:-1:-1;;;19871:64:0;;12740:2:1;19871:64:0::1;::::0;::::1;12722:21:1::0;12779:2;12759:18;;;12752:30;-1:-1:-1;;;12798:18:1;;;12791:40;12848:18;;19871:64:0::1;12538:334:1::0;19871:64:0::1;19979:10;19990:6;19979:18;;;;;;;:::i;:::-;;;19968:7;:29;;19946:117;;;::::0;-1:-1:-1;;;19946:117:0;;13079:2:1;19946:117:0::1;::::0;::::1;13061:21:1::0;13118:2;13098:18;;;13091:30;13157:34;13137:18;;;13130:62;-1:-1:-1;;;13208:18:1;;;13201:36;13254:19;;19946:117:0::1;12877:402:1::0;19946:117:0::1;20074:48;20095:4;20102:10;20114:7;20074:12;:48::i;:::-;20138:29;::::0;;13458:25:1;;;13514:2;13499:18;;13492:34;;;20138:29:0::1;::::0;13431:18:1;20138:29:0::1;;;;;;;20200:7;20178:10;20189:6;20178:18;;;;;;;:::i;:::-;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;19729:486:0:o;10398:175::-;10484:4;10501:42;8208:10;10525:9;10536:6;10501:9;:42::i;19257:199::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;19369:15:::1;::::0;19346:57:::1;::::0;;13458:25:1;;;13514:2;13499:18;;13492:34;;;19346:57:0::1;::::0;13431:18:1;19346:57:0::1;;;;;;;19414:15;:34:::0;19257:199::o;14629:244::-;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14718:22:0;::::1;14710:73;;;::::0;-1:-1:-1;;;14710:73:0;;13872:2:1;14710:73:0::1;::::0;::::1;13854:21:1::0;13911:2;13891:18;;;13884:30;13950:34;13930:18;;;13923:62;-1:-1:-1;;;14001:18:1;;;13994:36;14047:19;;14710:73:0::1;13670:402:1::0;14710:73:0::1;14820:6;::::0;14799:38:::1;::::0;-1:-1:-1;;;;;14799:38:0;;::::1;::::0;14820:6:::1;::::0;14799:38:::1;::::0;14820:6:::1;::::0;14799:38:::1;14848:6;:17:::0;;-1:-1:-1;;;;;;14848:17:0::1;-1:-1:-1::0;;;;;14848:17:0;;;::::1;::::0;;;::::1;::::0;;14629:244::o;15446:28::-;;;;;;;;;;;22535:128;14384:6;;-1:-1:-1;;;;;14384:6:0;8208:10;14384:22;14376:67;;;;-1:-1:-1;;;14376:67:0;;;;;;;:::i;:::-;22601:6:::1;:16:::0;;;22633:22:::1;::::0;2520:25:1;;;22633:22:0::1;::::0;2508:2:1;2493:18;22633:22:0::1;2374:177:1::0;13550:380:0;-1:-1:-1;;;;;13686:19:0;;13678:68;;;;-1:-1:-1;;;13678:68:0;;14279:2:1;13678:68:0;;;14261:21:1;14318:2;14298:18;;;14291:30;14357:34;14337:18;;;14330:62;-1:-1:-1;;;14408:18:1;;;14401:34;14452:19;;13678:68:0;14077:400:1;13678:68:0;-1:-1:-1;;;;;13765:21:0;;13757:68;;;;-1:-1:-1;;;13757:68:0;;14684:2:1;13757:68:0;;;14666:21:1;14723:2;14703:18;;;14696:30;14762:34;14742:18;;;14735:62;-1:-1:-1;;;14813:18:1;;;14806:32;14855:19;;13757:68:0;14482:398:1;13757:68:0;-1:-1:-1;;;;;13838:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13890:32;;2520:25:1;;;13890:32:0;;2493:18:1;13890:32:0;;;;;;;13550:380;;;:::o;23137:1282::-;-1:-1:-1;;;;;23279:20:0;;;;;;:9;:20;;;;;;;;23278:21;23270:58;;;;-1:-1:-1;;;23270:58:0;;15087:2:1;23270:58:0;;;15069:21:1;15126:2;15106:18;;;15099:30;15165:26;15145:18;;;15138:54;15209:18;;23270:58:0;14885:348:1;23270:58:0;-1:-1:-1;;;;;23345:19:0;;;;;;:11;:19;;;;;;;;;:45;;-1:-1:-1;;;;;;23368:22:0;;;;;;:11;:22;;;;;;;;23345:45;23341:138;;;23407:39;23420:6;23428:9;23439:6;23407:12;:39::i;:::-;23137:1282;;;:::o;23341:138::-;23542:15;;23525:13;;:10;23509:13;:29;;23525:13;23509:29;:::i;:::-;:48;;:73;;;;-1:-1:-1;23575:7:0;;;;23574:8;23509:73;:105;;;;;23609:5;-1:-1:-1;;;;;23599:15:0;:6;-1:-1:-1;;;;;23599:15:0;;;23509:105;:130;;;;-1:-1:-1;23631:8:0;;;;23509:130;23491:194;;;23666:7;:5;:7::i;:::-;23712:6;23729:23;;:::i;:::-;23777:5;-1:-1:-1;;;;;23767:15:0;:6;-1:-1:-1;;;;;23767:15:0;;23763:565;;23807:13;;;;;;;23799:51;;;;-1:-1:-1;;;23799:51:0;;15440:2:1;23799:51:0;;;15422:21:1;15479:2;15459:18;;;15452:30;-1:-1:-1;;;15498:18:1;;;15491:55;15563:18;;23799:51:0;15238:349:1;23799:51:0;23883:6;;23873;:16;;23865:54;;;;-1:-1:-1;;;23865:54:0;;15794:2:1;23865:54:0;;;15776:21:1;15833:2;15813:18;;;15806:30;15872:27;15852:18;;;15845:55;15917:18;;23865:54:0;15592:349:1;23865:54:0;15078:1;23954:12;;:27;;;;:::i;:::-;23938:12;:43;23934:117;;24002:33;24019:9;24030:4;24002:16;:33::i;:::-;24081:28;24096:6;24104:4;24081:14;:28::i;:::-;24139:8;;24065:44;;-1:-1:-1;24065:44:0;-1:-1:-1;24124:24:0;;:14;:24::i;:::-;23763:565;;;24183:5;-1:-1:-1;;;;;24170:18:0;:9;-1:-1:-1;;;;;24170:18:0;;24166:162;;24213:13;;;;;;;24205:51;;;;-1:-1:-1;;;24205:51:0;;15440:2:1;24205:51:0;;;15422:21:1;15479:2;15459:18;;;15452:30;-1:-1:-1;;;15498:18:1;;;15491:55;15563:18;;24205:51:0;15238:349:1;24205:51:0;24287:29;24302:6;24310:5;24287:14;:29::i;:::-;24271:45;;-1:-1:-1;24271:45:0;-1:-1:-1;24166:162:0;24338:37;24351:6;24359:9;24370:4;24338:12;:37::i;:::-;24386:25;24397:6;24405:5;24386:10;:25::i;:::-;23259:1160;;23137:1282;;;:::o;24515:944::-;17213:7;:14;;-1:-1:-1;;17213:14:0;17223:4;17213:14;;;24585:16:::1;::::0;;24599:1:::1;24585:16:::0;;;;;::::1;::::0;;-1:-1:-1;;24585:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;24585:16:0::1;24561:40;;24630:4;24612;24617:1;24612:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;24612:23:0::1;;;-1:-1:-1::0;;;;;24612:23:0::1;;;::::0;::::1;24656:7;-1:-1:-1::0;;;;;24656:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24646:4;24651:1;24646:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24646:24:0;;;::::1;:7;::::0;;::::1;::::0;;;;;;;:24;24721:13;;:10:::1;24705:13:::0;24683:19:::1;::::0;24705:29:::1;::::0;::::1;:::i;:::-;24683:51;;24747:54;24764:4;24779:7;24789:11;24747:8;:54::i;:::-;24812:216;::::0;-1:-1:-1;;;24812:216:0;;-1:-1:-1;;;;;24812:7:0::1;:58;::::0;::::1;::::0;:216:::1;::::0;24885:11;;24911:1:::1;::::0;24955:4;;24982::::1;::::0;25002:15:::1;::::0;24812:216:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25142:10:0::1;:13:::0;25068:21:::1;::::0;-1:-1:-1;25039:26:0::1;::::0;-1:-1:-1;25159:11:0;;25121:34:::1;::::0;25068:21;25121:34:::1;:::i;:::-;25120:50;;;;:::i;:::-;25102:68:::0;-1:-1:-1;25181:15:0::1;25238:11:::0;25221:10:::1;25232:1;25221:13;::::0;25200:34:::1;::::0;:18;:34:::1;:::i;:::-;25199:50;;;;:::i;:::-;25260:19;::::0;;;;::::1;::::0;;;-1:-1:-1;25260:19:0;;;::::1;::::0;::::1;::::0;25181:68;;-1:-1:-1;25260:19:0::1;::::0;:10:::1;::::0;:19:::1;;:::i;:::-;-1:-1:-1::0;25296:11:0;;25292:75:::1;;25324:10;:13:::0;:31:::1;::::0;-1:-1:-1;;;;;25324:13:0;;::::1;::::0;:31:::1;::::0;::::1;;::::0;;;25335:1:::1;25324:31:::0;25335:1;25324:31;;:13;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;25292:75;25381:11:::0;;25377:75:::1;;25409:13:::0;;:31:::1;::::0;-1:-1:-1;;;;;25409:13:0;;::::1;::::0;:31:::1;::::0;::::1;;::::0;;;:13:::1;:31:::0;:13;:31;;:13;:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;25377:75;-1:-1:-1::0;;17250:7:0;:15;;-1:-1:-1;;17250:15:0;;;-1:-1:-1;;;24515:944:0:o;27991:268::-;14961:16;28082:6;28067:12;;:21;;;;:::i;:::-;:35;;28059:67;;;;-1:-1:-1;;;28059:67:0;;17784:2:1;28059:67:0;;;17766:21:1;17823:2;17803:18;;;17796:30;-1:-1:-1;;;17842:18:1;;;17835:49;17901:18;;28059:67:0;17582:343:1;28059:67:0;28153:6;28137:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;28170:28:0;;-1:-1:-1;28182:7:0;28191:6;28170:11;:28::i;:::-;28214:37;;2520:25:1;;;-1:-1:-1;;;;;28214:37:0;;;28231:1;;28214:37;;2508:2:1;2493:18;28214:37:0;;;;;;;27991:268;;:::o;21365:168::-;-1:-1:-1;;;;;21466:15:0;;;;;;:9;:15;;;;;;;;;;21443:47;;18120:51:1;;;21466:15:0;;18214:14:1;18207:22;18187:18;;;18180:50;18273:14;;18266:22;18246:18;;;18239:50;21443:47:0;;;;;;18108:2:1;21443:47:0;;;-1:-1:-1;;;;;21501:15:0;;;;;;;;:9;:15;;;;;:24;;-1:-1:-1;;21501:24:0;;;;;;;;;;21365:168::o;27297:578::-;-1:-1:-1;;;;;27432:20:0;;27424:63;;;;-1:-1:-1;;;27424:63:0;;18502:2:1;27424:63:0;;;18484:21:1;18541:2;18521:18;;;18514:30;18580:32;18560:18;;;18553:60;18630:18;;27424:63:0;18300:354:1;27424:63:0;-1:-1:-1;;;;;27506:23:0;;27498:64;;;;-1:-1:-1;;;27498:64:0;;18861:2:1;27498:64:0;;;18843:21:1;18900:2;18880:18;;;18873:30;18939;18919:18;;;18912:58;18987:18;;27498:64:0;18659:352:1;27498:64:0;-1:-1:-1;;;;;22822:18:0;;27575:21;22822:18;;;:9;:18;;;;;;27635:23;;;;27627:67;;;;-1:-1:-1;;;27627:67:0;;19218:2:1;27627:67:0;;;19200:21:1;19257:2;19237:18;;;19230:30;19296:33;19276:18;;;19269:61;19347:18;;27627:67:0;19016:355:1;27627:67:0;27730:32;27747:6;27755;27730:16;:32::i;:::-;27784:30;27796:9;27807:6;27784:11;:30::i;:::-;27849:9;-1:-1:-1;;;;;27832:35:0;27841:6;-1:-1:-1;;;;;27832:35:0;;27860:6;27832:35;;;;2520:25:1;;2508:2;2493:18;;2374:177;27832:35:0;;;;;;;;27413:462;27297:578;;;:::o;26460:567::-;26563:12;26577:23;;:::i;:::-;26622:6;26618:356;;;26645:141;;;;;;;;;;15026:6;26682:8;-1:-1:-1;26682:11:0;;26673:20;;:6;:20;:::i;:::-;26672:40;;;;:::i;:::-;26645:141;;;;15026:6;26741:8;26750:1;26741:11;;26732:20;;:6;:20;:::i;:::-;26731:40;;;;:::i;:::-;26645:141;;;-1:-1:-1;26618:356:0;;;26819:143;;;;;;;;;;15026:6;26856:9;-1:-1:-1;26856:12:0;;26847:21;;:6;:21;:::i;:::-;26846:41;;;;:::i;:::-;26819:143;;;;15026:6;26916:9;26926:1;26916:12;;26907:21;;:6;:21;:::i;:::-;26906:41;;;;:::i;:::-;26819:143;;;-1:-1:-1;26618:356:0;27011:8;;;;27000;;26991:17;;:6;:17;:::i;:::-;:28;;;;:::i;:::-;26984:35;;26460:567;;;;;:::o;27035:213::-;27139:23;14961:16;27139:6;:23;:::i;:::-;27107:10;:13;-1:-1:-1;;;;;27107:13:0;;;27095:26;;;;:11;:26;;;;;;;;27122:13;;;;;27095:41;;;;;;:67;27217:23;14961:16;27217:6;:23;:::i;:::-;27185:13;;-1:-1:-1;;;;;27185:13:0;;;27173:26;;;;:11;:26;;;;;;;;27185:10;27200:13;;;;27173:41;;;;;;:67;-1:-1:-1;27035:213:0:o;25872:387::-;-1:-1:-1;;;;;25983:22:0;;25975:65;;;;-1:-1:-1;;;25975:65:0;;19578:2:1;25975:65:0;;;19560:21:1;19617:2;19597:18;;;19590:30;19656:32;19636:18;;;19629:60;19706:18;;25975:65:0;19376:354:1;25975:65:0;26092:14;;;;26075;;26053:19;;26075:31;;;:::i;:::-;26053:53;;26117:50;26130:8;26148:4;26155:11;26117:12;:50::i;:::-;26195:14;;26178:10;:31;;26207:1;;26178:31;;26195:14;;26178:31;:::i;:::-;;;;-1:-1:-1;;26237:14:0;;;;26220:13;:31;;:13;;:31;;26237:14;;26220:31;:::i;22856:130::-;-1:-1:-1;;;;;22951:18:0;;;;;;:9;:18;;;;;;:27;;22972:6;;22951:27;:::i;:::-;-1:-1:-1;;;;;22930:18:0;;;;;;;:9;:18;;;;;:48;;;;-1:-1:-1;22856:130:0:o;22994:135::-;-1:-1:-1;;;;;23094:18:0;;;;;;:9;:18;;;;;;:27;;23115:6;;23094:27;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1347:343::-;1414:2;1408:9;;;1444:15;;1489:18;1474:34;;1510:22;;;1471:62;1468:185;;;1575:10;1570:3;1566:20;1563:1;1556:31;1610:4;1607:1;1600:15;1638:4;1635:1;1628:15;1468:185;1669:2;1662:22;1347:343;:::o;1695:674::-;1785:6;1838:2;1826:9;1817:7;1813:23;1809:32;1806:52;;;1854:1;1851;1844:12;1806:52;1903:7;1896:4;1885:9;1881:20;1877:34;1867:62;;1925:1;1922;1915:12;1867:62;1949:17;;:::i;:::-;1988:3;2029:2;2018:9;2014:18;2055:7;2047:6;2044:19;2041:39;;;2076:1;2073;2066:12;2041:39;2100:9;2118:221;2134:6;2129:3;2126:15;2118:221;;;2216:3;2203:17;2233:31;2258:5;2233:31;:::i;:::-;2277:18;;2324:4;2315:14;;;;2151;2118:221;;;-1:-1:-1;2358:5:1;;1695:674;-1:-1:-1;;;;;1695:674:1:o;2556:160::-;2621:20;;2677:13;;2670:21;2660:32;;2650:60;;2706:1;2703;2696:12;2650:60;2556:160;;;:::o;2721:315::-;2786:6;2794;2847:2;2835:9;2826:7;2822:23;2818:32;2815:52;;;2863:1;2860;2853:12;2815:52;2902:9;2889:23;2921:31;2946:5;2921:31;:::i;:::-;2971:5;-1:-1:-1;2995:35:1;3026:2;3011:18;;2995:35;:::i;:::-;2985:45;;2721:315;;;;;:::o;3041:456::-;3118:6;3126;3134;3187:2;3175:9;3166:7;3162:23;3158:32;3155:52;;;3203:1;3200;3193:12;3155:52;3242:9;3229:23;3261:31;3286:5;3261:31;:::i;:::-;3311:5;-1:-1:-1;3368:2:1;3353:18;;3340:32;3381:33;3340:32;3381:33;:::i;:::-;3041:456;;3433:7;;-1:-1:-1;;;3487:2:1;3472:18;;;;3459:32;;3041:456::o;3502:180::-;3561:6;3614:2;3602:9;3593:7;3589:23;3585:32;3582:52;;;3630:1;3627;3620:12;3582:52;-1:-1:-1;3653:23:1;;3502:180;-1:-1:-1;3502:180:1:o;3876:247::-;3935:6;3988:2;3976:9;3967:7;3963:23;3959:32;3956:52;;;4004:1;4001;3994:12;3956:52;4043:9;4030:23;4062:31;4087:5;4062:31;:::i;:::-;4112:5;3876:247;-1:-1:-1;;;3876:247:1:o;4128:591::-;4210:6;4263:2;4251:9;4242:7;4238:23;4234:32;4231:52;;;4279:1;4276;4269:12;4231:52;4328:7;4321:4;4310:9;4306:20;4302:34;4292:62;;4350:1;4347;4340:12;4292:62;4374:17;;:::i;:::-;4413:3;4454:2;4443:9;4439:18;4480:7;4472:6;4469:19;4466:39;;;4501:1;4498;4491:12;4466:39;4525:9;4543:146;4559:6;4554:3;4551:15;4543:146;;;4627:17;;4615:30;;4674:4;4665:14;;;;4576;4543:146;;5156:180;5212:6;5265:2;5253:9;5244:7;5240:23;5236:32;5233:52;;;5281:1;5278;5271:12;5233:52;5304:26;5320:9;5304:26;:::i;5341:383::-;5418:6;5426;5434;5487:2;5475:9;5466:7;5462:23;5458:32;5455:52;;;5503:1;5500;5493:12;5455:52;5539:9;5526:23;5516:33;;5596:2;5585:9;5581:18;5568:32;5558:42;;5650:2;5639:9;5635:18;5622:32;5663:31;5688:5;5663:31;:::i;:::-;5713:5;5703:15;;;5341:383;;;;;:::o;5729:388::-;5797:6;5805;5858:2;5846:9;5837:7;5833:23;5829:32;5826:52;;;5874:1;5871;5864:12;5826:52;5913:9;5900:23;5932:31;5957:5;5932:31;:::i;:::-;5982:5;-1:-1:-1;6039:2:1;6024:18;;6011:32;6052:33;6011:32;6052:33;:::i;:::-;6104:7;6094:17;;;5729:388;;;;;:::o;6356:380::-;6435:1;6431:12;;;;6478;;;6499:61;;6553:4;6545:6;6541:17;6531:27;;6499:61;6606:2;6598:6;6595:14;6575:18;6572:38;6569:161;;6652:10;6647:3;6643:20;6640:1;6633:31;6687:4;6684:1;6677:15;6715:4;6712:1;6705:15;6569:161;;6356:380;;;:::o;6741:127::-;6802:10;6797:3;6793:20;6790:1;6783:31;6833:4;6830:1;6823:15;6857:4;6854:1;6847:15;7215:960;7498:3;7483:19;;7487:9;7579:6;7456:4;7613:194;7627:4;7624:1;7621:11;7613:194;;;7690:13;;-1:-1:-1;;;;;7686:39:1;7674:52;;7755:4;7746:14;;;;7722:1;7783:14;;;;7640:9;7613:194;;;7617:3;;;7844:2;7833:9;7829:18;7895:6;7921:1;7931:238;7947:4;7942:3;7939:13;7931:238;;;8016:15;;-1:-1:-1;;;;;8012:41:1;7998:56;;8077:4;8103:14;;;;8142:17;;;;8050:1;7962:11;7931:238;;;7935:3;;;7215:960;;;;;:::o;8180:356::-;8382:2;8364:21;;;8401:18;;;8394:30;8460:34;8455:2;8440:18;;8433:62;8527:2;8512:18;;8180:356::o;9239:127::-;9300:10;9295:3;9291:20;9288:1;9281:31;9331:4;9328:1;9321:15;9355:4;9352:1;9345:15;9371:125;9436:9;;;9457:10;;;9454:36;;;9470:18;;:::i;10113:306::-;10201:6;10209;10217;10270:2;10258:9;10249:7;10245:23;10241:32;10238:52;;;10286:1;10283;10276:12;10238:52;10315:9;10309:16;10299:26;;10365:2;10354:9;10350:18;10344:25;10334:35;;10409:2;10398:9;10394:18;10388:25;10378:35;;10113:306;;;;;:::o;10837:876::-;11088:3;11073:19;;11077:9;11169:6;11046:4;11203:168;11217:4;11214:1;11211:11;11203:168;;;11276:13;;11264:26;;11319:4;11310:14;;;;11359:1;11347:14;;;;11230:9;11203:168;;;11207:3;;;11408:2;11397:9;11393:18;11459:6;11485:1;11495:212;11511:4;11506:3;11503:13;11495:212;;;11576:15;;11562:30;;11615:4;11641:14;;;;11680:17;;;;11535:1;11526:11;11495:212;;13537:128;13604:9;;;13625:11;;;13622:37;;;13639:18;;:::i;15946:251::-;16016:6;16069:2;16057:9;16048:7;16044:23;16040:32;16037:52;;;16085:1;16082;16075:12;16037:52;16117:9;16111:16;16136:31;16161:5;16136:31;:::i;16202:980::-;16464:4;16512:3;16501:9;16497:19;16543:6;16532:9;16525:25;16569:2;16607:6;16602:2;16591:9;16587:18;16580:34;16650:3;16645:2;16634:9;16630:18;16623:31;16674:6;16709;16703:13;16740:6;16732;16725:22;16778:3;16767:9;16763:19;16756:26;;16817:2;16809:6;16805:15;16791:29;;16838:1;16848:195;16862:6;16859:1;16856:13;16848:195;;;16927:13;;-1:-1:-1;;;;;16923:39:1;16911:52;;17018:15;;;;16983:12;;;;16959:1;16877:9;16848:195;;;-1:-1:-1;;;;;;;17099:32:1;;;;17094:2;17079:18;;17072:60;-1:-1:-1;;;17163:3:1;17148:19;17141:35;17060:3;16202:980;-1:-1:-1;;;16202:980:1:o;17187:168::-;17260:9;;;17291;;17308:15;;;17302:22;;17288:37;17278:71;;17329:18;;:::i;17360:217::-;17400:1;17426;17416:132;;17470:10;17465:3;17461:20;17458:1;17451:31;17505:4;17502:1;17495:15;17533:4;17530:1;17523:15;17416:132;-1:-1:-1;17562:9:1;;17360:217::o

Swarm Source

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