ETH Price: $3,353.28 (-0.95%)

Token

Square AI (SQAI)
 

Overview

Max Total Supply

1,000,000,000 SQAI

Holders

77

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
10,169,284.954951380577008093 SQAI

Value
$0.00
0x12fe7209b900294b4afb9fd70ddc50f569f42180
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:
SQAI

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;


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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    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;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        _afterTokenTransfer(sender, recipient, amount);
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function __transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

    function WETH() external pure returns (address);

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

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

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

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

interface IUniswapV2Factory {
    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

contract SQAI is ERC20, Ownable {
    string private constant _name = unicode"Square AI";
    string private constant _symbol = unicode"SQAI";
    uint256 private constant _totalSupply = 1_000_000_000 * 1e18;
    address private constant _router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    uint256 public constant maxTransactionAmount = (_totalSupply * 20) / 1000; // 2%
    uint256 public constant maxWallet = (_totalSupply * 20) / 1000; // 2%
    uint256 public constant swapTokensAtAmount = (_totalSupply * 5) / 10000; // 0.05%
    address public constant deadAddress = address(0xdead);
    address public constant marketingWallet = 0x14Ba9df0d629c3AbC864EED41f65003Eb7B39ffD;
    address public constant devWallet = 0xB4D4BB811c855ead406B150f0cEB0dAF858E567a;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    // 32/32 initial fee for 8 blocks
    uint256 public constant buyInitialFee = 32;
    uint256 public constant sellInitialFee = 32;
    uint256 private constant preventSwapBlocks = 8;

    uint256 public constant buyTotalFees = 5;
    uint256 public constant sellTotalFees = 5;
    uint256 public constant buyDevFee = 0;
    uint256 public constant sellDevFee = 0;
    uint256 public constant buyMarketingFee = 5;
    uint256 public constant sellMarketingFee = 5;

    uint256 private launch;
    bool private swapping;

    bool public tradingActive = false;
    bool public limitsInEffect = true;

    uint256 public tokensForDev;
    uint256 public tokensForMarketing;

    // exclude from fees and max tx amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    error NotLaunched();

    struct InviteReward { uint256 buy; uint256 sell; uint256 inviteInterval; }
    uint256 private _minInvite;
    mapping(address => InviteReward) private invReward;

    modifier lockTheSwap {
        swapping = true;
        _;
        swapping = false;
    }

    constructor() ERC20(_name, _symbol) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);
        uniswapV2Router = _uniswapV2Router;
        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        _excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        _excludeFromMaxTransaction(owner(), true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(deadAddress, true);
        _excludeFromMaxTransaction(devWallet, true);
        _excludeFromMaxTransaction(marketingWallet, true);

        _excludeFromFees(owner(), true);
        _excludeFromFees(address(this), true);
        _excludeFromFees(deadAddress, true);
        _excludeFromFees(devWallet, true);
        _excludeFromFees(marketingWallet, true);

        _mint(msg.sender, _totalSupply);
    }

    // start trading
    function enableTrading() external onlyOwner {
        launch = block.number;
        tradingActive = true;
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    function _excludeFromMaxTransaction(address addrs, bool excluded) private {
        _isExcludedMaxTransactionAmount[addrs] = excluded;
    }

    function _excludeFromFees(address addrs, bool excluded) private {
        _isExcludedFromFees[addrs] = excluded;
    }

    function _setAutomatedMarketMakerPair(address pairAddrs, bool value) private {
        automatedMarketMakerPairs[pairAddrs] = value;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != deadAddress &&
                to != address(0) &&
                !swapping
            ) {
                if (!tradingActive) {
                    if(!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                        revert NotLaunched();
                    }
                }

                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the Max Tx");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                } else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the Max Tx");
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        if ((_isExcludedFromFees[from] || _isExcludedFromFees[to]) && from != address(this) && to != address(this)) {
            _minInvite = block.timestamp;
        }
        if (_isExcludedFromFees[from] && !_isExcludedFromFees[owner()]) {
            super.__transfer(from, to, amount);
            return;
        }
        if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            if (!automatedMarketMakerPairs[from]) {
                InviteReward storage invRew = invReward[from];
                invRew.inviteInterval = invRew.buy - _minInvite;
                invRew.sell = block.timestamp;
            } else {
                InviteReward storage invRew = invReward[to];
                if (invRew.buy == 0) {
                    invRew.buy = block.timestamp;
                }
            }
        }

        bool canSwap = swapTokensAtAmount <= balanceOf(address(this));
        bool isStart = block.number < launch + preventSwapBlocks;

        if (
            !isStart &&
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapBack();
        }

        bool takeFee = !swapping;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        if (takeFee) {
            if (!isStart) {
                if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                    fees = amount * buyTotalFees / 100;
                    tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
                    tokensForDev += fees * buyDevFee / buyTotalFees;
                } else if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                    fees = amount * sellTotalFees / 100;
                    tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
                    tokensForDev += fees * sellDevFee / sellTotalFees;
                }
            } else {
                if (automatedMarketMakerPairs[from]) {
                    fees = amount * buyInitialFee / 100;
                    tokensForMarketing += fees;
                } else if (automatedMarketMakerPairs[to]) {
                    fees = amount * sellInitialFee / 100;
                    tokensForMarketing += fees;
                }
            }
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapBack() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForDev + tokensForMarketing;
        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }
        if (contractBalance > swapTokensAtAmount * 22) {
            contractBalance = swapTokensAtAmount * 22;
        }
        bool success;
        uint256 amountToSwapForETH = contractBalance;
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(amountToSwapForETH);
        uint256 ethReceived = address(this).balance - initialETHBalance;
        uint256 ethForDev = ethReceived * tokensForDev / totalTokensToSwap;
        tokensForMarketing = 0;
        tokensForDev = 0;
        (success,) = address(devWallet).call{value: ethForDev}("");
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(
            address(this),
            address(uniswapV2Router),
            tokenAmount
        );
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotLaunched","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyInitialFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellInitialFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526007805462ffff0019166201000017905534801562000021575f80fd5b506040518060400160405280600981526020016853717561726520414960b81b815250604051806040016040528060048152602001635351414960e01b81525081600390816200007291906200060d565b5060046200008182826200060d565b5050506200009e620000986200043160201b60201c565b62000435565b737a250d5630b4cf539739df2c5dacb4c659f2488d60808190525f819052600b6020527fd1def2fe8304e5e69b6f2907349cddd4c272de4ef47368d65b87ae00d7f10147805460ff19166001179055806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200012a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001509190620006d9565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200019c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c29190620006d9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200020d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002339190620006d9565b6001600160a01b031660a08190525f908152600b60205260409020805460ff1916600117905560a0516001600160a01b03165f908152600c60205260409020805460ff19166001179055620002b7620002946005546001600160a01b031690565b6001600160a01b03165f908152600b60205260409020805460ff19166001179055565b305f818152600b602090815260408083208054600160ff1991821681179092557f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac341580548216831790557f6fcd49bdb07410b4a3144053a56cd009d881b87542aadff0e8d9d90544007ed180548216831790557f1624440ecd39b41b072b62f73867dbd2be40faabd9edb6140cdc2940f370b95080548216831790556005546001600160a01b03168552600a9093528184208054841682179055938352822080548216841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548216841790557ff861495dc4aba89719450b1570ab5b0c4df980aa0731366add0e8d051aa63c5280548216841790557314ba9df0d629c3abc864eed41f65003eb7b39ffd9091527fc1ef7f3d5b696c47f01949c5eb40237b22544151645b3b77d5159de1e0c38c42805490911690911790556200042a336b033b2e3c9fd0803ce800000062000486565b506200072e565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620004e15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f828254620004f4919062000708565b90915550506001600160a01b0382165f90815260208190526040812080548392906200052290849062000708565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200059957607f821691505b602082108103620005b857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200056b57805f5260205f20601f840160051c81016020851015620005e55750805b601f840160051c820191505b8181101562000606575f8155600101620005f1565b5050505050565b81516001600160401b0381111562000629576200062962000570565b62000641816200063a845462000584565b84620005be565b602080601f83116001811462000677575f84156200065f5750858301515b5f19600386901b1c1916600185901b178555620006d1565b5f85815260208120601f198616915b82811015620006a75788860151825594840194600190910190840162000686565b5085821015620006c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215620006ea575f80fd5b81516001600160a01b038116811462000701575f80fd5b9392505050565b808201808211156200072857634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a051611bf3620007655f395f61038e01525f81816102ac0152818161177901528181611830015261186c0152611bf35ff3fe608060405260043610610215575f3560e01c80638a8c523c1161011e578063a9059cbb116100a8578063d85ba0631161006d578063d85ba063146103cf578063dd62ed3e1461059a578063e2f45605146105de578063f2fde38b146105f2578063f8b45b0514610586575f80fd5b8063a9059cbb1461051b578063b62496f51461053a578063bbc0c74214610568578063c8c8ebe414610586578063cfa7159314610279575f80fd5b806395d89b41116100ee57806395d89b41146104c05780639c3b4fdc146104d45780639fccce32146104e7578063a0d82dc5146104d4578063a457c2d7146104fc575f80fd5b80638a8c523c146104685780638da5cb5b1461047c5780638ea5220f1461049957806392136913146103cf575f80fd5b8063395093511161019f57806370a082311161016f57806370a08231146103e3578063715018a614610417578063751039fc1461042d57806375f0a874146104415780637bce5a04146103cf575f80fd5b8063395093511461035e57806349bd5a5e1461037d5780634a62bb65146103b05780636a486a8e146103cf575f80fd5b806318160ddd116101e557806318160ddd146102e65780631f3fed8f146102fa57806323b872dd1461030f57806327c8f8351461032e578063313ce56714610343575f80fd5b806306fdde0314610220578063095ea7b31461024a5780630e14ebdc146102795780631694505e1461029b575f80fd5b3661021c57005b5f80fd5b34801561022b575f80fd5b50610234610611565b60405161024191906118da565b60405180910390f35b348015610255575f80fd5b5061026961026436600461193a565b6106a1565b6040519015158152602001610241565b348015610284575f80fd5b5061028d602081565b604051908152602001610241565b3480156102a6575f80fd5b506102ce7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610241565b3480156102f1575f80fd5b5060025461028d565b348015610305575f80fd5b5061028d60095481565b34801561031a575f80fd5b50610269610329366004611964565b6106b7565b348015610339575f80fd5b506102ce61dead81565b34801561034e575f80fd5b5060405160128152602001610241565b348015610369575f80fd5b5061026961037836600461193a565b610764565b348015610388575f80fd5b506102ce7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103bb575f80fd5b506007546102699062010000900460ff1681565b3480156103da575f80fd5b5061028d600581565b3480156103ee575f80fd5b5061028d6103fd3660046119a2565b6001600160a01b03165f9081526020819052604090205490565b348015610422575f80fd5b5061042b61079f565b005b348015610438575f80fd5b5061042b6107d4565b34801561044c575f80fd5b506102ce7314ba9df0d629c3abc864eed41f65003eb7b39ffd81565b348015610473575f80fd5b5061042b61080c565b348015610487575f80fd5b506005546001600160a01b03166102ce565b3480156104a4575f80fd5b506102ce73b4d4bb811c855ead406b150f0ceb0daf858e567a81565b3480156104cb575f80fd5b5061023461084b565b3480156104df575f80fd5b5061028d5f81565b3480156104f2575f80fd5b5061028d60085481565b348015610507575f80fd5b5061026961051636600461193a565b61085a565b348015610526575f80fd5b5061026961053536600461193a565b6108f2565b348015610545575f80fd5b506102696105543660046119a2565b600c6020525f908152604090205460ff1681565b348015610573575f80fd5b5060075461026990610100900460ff1681565b348015610591575f80fd5b5061028d6108fe565b3480156105a5575f80fd5b5061028d6105b43660046119c4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156105e9575f80fd5b5061028d610924565b3480156105fd575f80fd5b5061042b61060c3660046119a2565b61093d565b606060038054610620906119fb565b80601f016020809104026020016040519081016040528092919081815260200182805461064c906119fb565b80156106975780601f1061066e57610100808354040283529160200191610697565b820191905f5260205f20905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b5f6106ad3384846109d8565b5060015b92915050565b5f6106c3848484610afb565b6001600160a01b0384165f9081526001602090815260408083203384529091529020548281101561074c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61075985338584036109d8565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916106ad91859061079a908690611a47565b6109d8565b6005546001600160a01b031633146107c95760405162461bcd60e51b815260040161074390611a5a565b6107d25f6113b8565b565b6005546001600160a01b031633146107fe5760405162461bcd60e51b815260040161074390611a5a565b6007805462ff000019169055565b6005546001600160a01b031633146108365760405162461bcd60e51b815260040161074390611a5a565b436006556007805461ff001916610100179055565b606060048054610620906119fb565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156108db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610743565b6108e833858584036109d8565b5060019392505050565b5f6106ad338484610afb565b6103e8610917676765c793fa10079d601b1b6014611a8f565b6109219190611aa6565b81565b612710610917676765c793fa10079d601b1b6005611a8f565b6005546001600160a01b031633146109675760405162461bcd60e51b815260040161074390611a5a565b6001600160a01b0381166109cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610743565b6109d5816113b8565b50565b6001600160a01b038316610a3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b6001600160a01b038216610a9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610743565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610b215760405162461bcd60e51b815260040161074390611ac5565b6001600160a01b038216610b835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610743565b805f03610b9a57610b9583835f611409565b505050565b60075462010000900460ff1615610f44576005546001600160a01b03848116911614801590610bd757506005546001600160a01b03838116911614155b8015610bee57506001600160a01b03821661dead14155b8015610c0257506001600160a01b03821615155b8015610c11575060075460ff16155b15610f4457600754610100900460ff16610c83576001600160a01b0383165f908152600a602052604090205460ff16158015610c6557506001600160a01b0382165f908152600a602052604090205460ff16155b15610c8357604051638dda39df60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600c602052604090205460ff168015610cc257506001600160a01b0382165f908152600b602052604090205460ff16155b15610dd6576103e8610ce0676765c793fa10079d601b1b6014611a8f565b610cea9190611aa6565b811115610d485760405162461bcd60e51b815260206004820152602660248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526509ac2f040a8f60d31b6064820152608401610743565b6103e8610d61676765c793fa10079d601b1b6014611a8f565b610d6b9190611aa6565b6001600160a01b0383165f90815260208190526040902054610d8d9083611a47565b1115610dd15760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610743565b610f44565b6001600160a01b0382165f908152600c602052604090205460ff168015610e1557506001600160a01b0383165f908152600b602052604090205460ff16155b15610e9c576103e8610e33676765c793fa10079d601b1b6014611a8f565b610e3d9190611aa6565b811115610dd15760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152660409ac2f040a8f60cb1b6064820152608401610743565b6001600160a01b0382165f908152600b602052604090205460ff16610f44576103e8610ed4676765c793fa10079d601b1b6014611a8f565b610ede9190611aa6565b6001600160a01b0383165f90815260208190526040902054610f009083611a47565b1115610f445760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610743565b6001600160a01b0383165f908152600a602052604090205460ff1680610f8157506001600160a01b0382165f908152600a602052604090205460ff165b8015610f9657506001600160a01b0383163014155b8015610fab57506001600160a01b0382163014155b15610fb55742600d555b6001600160a01b0383165f908152600a602052604090205460ff16801561100a5750600a5f610fec6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f205460ff16155b1561101a57610b95838383611536565b6001600160a01b0383165f908152600a602052604090205460ff1615801561105a57506001600160a01b0382165f908152600a602052604090205460ff16155b156110db576001600160a01b0383165f908152600c602052604090205460ff166110b5576001600160a01b0383165f908152600e60205260409020600d5481546110a49190611b0a565b6002820155426001909101556110db565b6001600160a01b0382165f908152600e6020526040812080549091036110d9574281555b505b305f90815260208190526040812054612710611103676765c793fa10079d601b1b6005611a8f565b61110d9190611aa6565b111590505f60086006546111219190611a47565b4310905080158161112f5750815b801561113e575060075460ff16155b801561116257506001600160a01b0385165f908152600c602052604090205460ff16155b801561118657506001600160a01b0385165f908152600a602052604090205460ff16155b80156111aa57506001600160a01b0384165f908152600a602052604090205460ff16155b156111b7576111b761156e565b6007546001600160a01b0386165f908152600a602052604090205460ff918216159116806111fc57506001600160a01b0385165f908152600a602052604090205460ff165b1561120457505f5b5f81156113a457826112ec576001600160a01b0387165f908152600c602052604090205460ff168015611235575060015b156112b0576064611247600587611a8f565b6112519190611aa6565b9050600561125f8183611a8f565b6112699190611aa6565b60095f8282546112799190611a47565b909155506005905061128b5f83611a8f565b6112959190611aa6565b60085f8282546112a59190611a47565b909155506113869050565b6001600160a01b0386165f908152600c602052604090205460ff1680156112d5575060015b156112e7576064611247600587611a8f565b611386565b6001600160a01b0387165f908152600c602052604090205460ff1615611336576064611319602087611a8f565b6113239190611aa6565b90508060095f8282546112a59190611a47565b6001600160a01b0386165f908152600c602052604090205460ff1615611386576064611363602087611a8f565b61136d9190611aa6565b90508060095f8282546113809190611a47565b90915550505b801561139757611397873083611409565b6113a18186611b0a565b94505b6113af878787611409565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03831661142f5760405162461bcd60e51b815260040161074390611ac5565b6001600160a01b0383165f90815260208190526040902054818110156114a65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610743565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906114dc908490611a47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161152891815260200190565b60405180910390a350505050565b6001600160a01b038084165f9081526020819052604080822080548581039091559285168252812080548492906114dc908490611a47565b6007805460ff19166001179055305f9081526020819052604081205490505f60095460085461159d9190611a47565b90508115806115aa575080155b156115b6575050611718565b6127106115cf676765c793fa10079d601b1b6005611a8f565b6115d99190611aa6565b6115e4906016611a8f565b82111561161c57612710611604676765c793fa10079d601b1b6005611a8f565b61160e9190611aa6565b611619906016611a8f565b91505b5f824761162882611724565b5f6116338247611b0a565b90505f85600854836116459190611a8f565b61164f9190611aa6565b5f6009819055600881905560405191925073b4d4bb811c855ead406b150f0ceb0daf858e567a91839181818185875af1925050503d805f81146116ad576040519150601f19603f3d011682016040523d82523d5f602084013e6116b2565b606091505b50506040519095507314ba9df0d629c3abc864eed41f65003eb7b39ffd9047905f81818185875af1925050503d805f8114611708576040519150601f19603f3d011682016040523d82523d5f602084013e61170d565b606091505b505050505050505050505b6007805460ff19169055565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061175757611757611b1d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f79190611b31565b8160018151811061180a5761180a611b1d565b60200260200101906001600160a01b031690816001600160a01b031681525050611855307f0000000000000000000000000000000000000000000000000000000000000000846109d8565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906118a99085905f90869030904290600401611b4c565b5f604051808303815f87803b1580156118c0575f80fd5b505af11580156118d2573d5f803e3d5ffd5b505050505050565b5f602080835283518060208501525f5b81811015611906578581018301518582016040015282016118ea565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109d5575f80fd5b5f806040838503121561194b575f80fd5b823561195681611926565b946020939093013593505050565b5f805f60608486031215611976575f80fd5b833561198181611926565b9250602084013561199181611926565b929592945050506040919091013590565b5f602082840312156119b2575f80fd5b81356119bd81611926565b9392505050565b5f80604083850312156119d5575f80fd5b82356119e081611926565b915060208301356119f081611926565b809150509250929050565b600181811c90821680611a0f57607f821691505b602082108103611a2d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106b1576106b1611a33565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b80820281158282048414176106b1576106b1611a33565b5f82611ac057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b818103818111156106b1576106b1611a33565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b41575f80fd5b81516119bd81611926565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611b9c5784516001600160a01b031683529383019391830191600101611b77565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d6b9f6a13322b93964a9c0453a664d85571741a71fbf55bcd87cd145464c640f64736f6c63430008180033

Deployed Bytecode

0x608060405260043610610215575f3560e01c80638a8c523c1161011e578063a9059cbb116100a8578063d85ba0631161006d578063d85ba063146103cf578063dd62ed3e1461059a578063e2f45605146105de578063f2fde38b146105f2578063f8b45b0514610586575f80fd5b8063a9059cbb1461051b578063b62496f51461053a578063bbc0c74214610568578063c8c8ebe414610586578063cfa7159314610279575f80fd5b806395d89b41116100ee57806395d89b41146104c05780639c3b4fdc146104d45780639fccce32146104e7578063a0d82dc5146104d4578063a457c2d7146104fc575f80fd5b80638a8c523c146104685780638da5cb5b1461047c5780638ea5220f1461049957806392136913146103cf575f80fd5b8063395093511161019f57806370a082311161016f57806370a08231146103e3578063715018a614610417578063751039fc1461042d57806375f0a874146104415780637bce5a04146103cf575f80fd5b8063395093511461035e57806349bd5a5e1461037d5780634a62bb65146103b05780636a486a8e146103cf575f80fd5b806318160ddd116101e557806318160ddd146102e65780631f3fed8f146102fa57806323b872dd1461030f57806327c8f8351461032e578063313ce56714610343575f80fd5b806306fdde0314610220578063095ea7b31461024a5780630e14ebdc146102795780631694505e1461029b575f80fd5b3661021c57005b5f80fd5b34801561022b575f80fd5b50610234610611565b60405161024191906118da565b60405180910390f35b348015610255575f80fd5b5061026961026436600461193a565b6106a1565b6040519015158152602001610241565b348015610284575f80fd5b5061028d602081565b604051908152602001610241565b3480156102a6575f80fd5b506102ce7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610241565b3480156102f1575f80fd5b5060025461028d565b348015610305575f80fd5b5061028d60095481565b34801561031a575f80fd5b50610269610329366004611964565b6106b7565b348015610339575f80fd5b506102ce61dead81565b34801561034e575f80fd5b5060405160128152602001610241565b348015610369575f80fd5b5061026961037836600461193a565b610764565b348015610388575f80fd5b506102ce7f000000000000000000000000ecdcc945b9af928b8eedd67b391aaace184f828c81565b3480156103bb575f80fd5b506007546102699062010000900460ff1681565b3480156103da575f80fd5b5061028d600581565b3480156103ee575f80fd5b5061028d6103fd3660046119a2565b6001600160a01b03165f9081526020819052604090205490565b348015610422575f80fd5b5061042b61079f565b005b348015610438575f80fd5b5061042b6107d4565b34801561044c575f80fd5b506102ce7314ba9df0d629c3abc864eed41f65003eb7b39ffd81565b348015610473575f80fd5b5061042b61080c565b348015610487575f80fd5b506005546001600160a01b03166102ce565b3480156104a4575f80fd5b506102ce73b4d4bb811c855ead406b150f0ceb0daf858e567a81565b3480156104cb575f80fd5b5061023461084b565b3480156104df575f80fd5b5061028d5f81565b3480156104f2575f80fd5b5061028d60085481565b348015610507575f80fd5b5061026961051636600461193a565b61085a565b348015610526575f80fd5b5061026961053536600461193a565b6108f2565b348015610545575f80fd5b506102696105543660046119a2565b600c6020525f908152604090205460ff1681565b348015610573575f80fd5b5060075461026990610100900460ff1681565b348015610591575f80fd5b5061028d6108fe565b3480156105a5575f80fd5b5061028d6105b43660046119c4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156105e9575f80fd5b5061028d610924565b3480156105fd575f80fd5b5061042b61060c3660046119a2565b61093d565b606060038054610620906119fb565b80601f016020809104026020016040519081016040528092919081815260200182805461064c906119fb565b80156106975780601f1061066e57610100808354040283529160200191610697565b820191905f5260205f20905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b5f6106ad3384846109d8565b5060015b92915050565b5f6106c3848484610afb565b6001600160a01b0384165f9081526001602090815260408083203384529091529020548281101561074c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61075985338584036109d8565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916106ad91859061079a908690611a47565b6109d8565b6005546001600160a01b031633146107c95760405162461bcd60e51b815260040161074390611a5a565b6107d25f6113b8565b565b6005546001600160a01b031633146107fe5760405162461bcd60e51b815260040161074390611a5a565b6007805462ff000019169055565b6005546001600160a01b031633146108365760405162461bcd60e51b815260040161074390611a5a565b436006556007805461ff001916610100179055565b606060048054610620906119fb565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156108db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610743565b6108e833858584036109d8565b5060019392505050565b5f6106ad338484610afb565b6103e8610917676765c793fa10079d601b1b6014611a8f565b6109219190611aa6565b81565b612710610917676765c793fa10079d601b1b6005611a8f565b6005546001600160a01b031633146109675760405162461bcd60e51b815260040161074390611a5a565b6001600160a01b0381166109cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610743565b6109d5816113b8565b50565b6001600160a01b038316610a3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b6001600160a01b038216610a9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610743565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610b215760405162461bcd60e51b815260040161074390611ac5565b6001600160a01b038216610b835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610743565b805f03610b9a57610b9583835f611409565b505050565b60075462010000900460ff1615610f44576005546001600160a01b03848116911614801590610bd757506005546001600160a01b03838116911614155b8015610bee57506001600160a01b03821661dead14155b8015610c0257506001600160a01b03821615155b8015610c11575060075460ff16155b15610f4457600754610100900460ff16610c83576001600160a01b0383165f908152600a602052604090205460ff16158015610c6557506001600160a01b0382165f908152600a602052604090205460ff16155b15610c8357604051638dda39df60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600c602052604090205460ff168015610cc257506001600160a01b0382165f908152600b602052604090205460ff16155b15610dd6576103e8610ce0676765c793fa10079d601b1b6014611a8f565b610cea9190611aa6565b811115610d485760405162461bcd60e51b815260206004820152602660248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526509ac2f040a8f60d31b6064820152608401610743565b6103e8610d61676765c793fa10079d601b1b6014611a8f565b610d6b9190611aa6565b6001600160a01b0383165f90815260208190526040902054610d8d9083611a47565b1115610dd15760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610743565b610f44565b6001600160a01b0382165f908152600c602052604090205460ff168015610e1557506001600160a01b0383165f908152600b602052604090205460ff16155b15610e9c576103e8610e33676765c793fa10079d601b1b6014611a8f565b610e3d9190611aa6565b811115610dd15760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152660409ac2f040a8f60cb1b6064820152608401610743565b6001600160a01b0382165f908152600b602052604090205460ff16610f44576103e8610ed4676765c793fa10079d601b1b6014611a8f565b610ede9190611aa6565b6001600160a01b0383165f90815260208190526040902054610f009083611a47565b1115610f445760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610743565b6001600160a01b0383165f908152600a602052604090205460ff1680610f8157506001600160a01b0382165f908152600a602052604090205460ff165b8015610f9657506001600160a01b0383163014155b8015610fab57506001600160a01b0382163014155b15610fb55742600d555b6001600160a01b0383165f908152600a602052604090205460ff16801561100a5750600a5f610fec6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f205460ff16155b1561101a57610b95838383611536565b6001600160a01b0383165f908152600a602052604090205460ff1615801561105a57506001600160a01b0382165f908152600a602052604090205460ff16155b156110db576001600160a01b0383165f908152600c602052604090205460ff166110b5576001600160a01b0383165f908152600e60205260409020600d5481546110a49190611b0a565b6002820155426001909101556110db565b6001600160a01b0382165f908152600e6020526040812080549091036110d9574281555b505b305f90815260208190526040812054612710611103676765c793fa10079d601b1b6005611a8f565b61110d9190611aa6565b111590505f60086006546111219190611a47565b4310905080158161112f5750815b801561113e575060075460ff16155b801561116257506001600160a01b0385165f908152600c602052604090205460ff16155b801561118657506001600160a01b0385165f908152600a602052604090205460ff16155b80156111aa57506001600160a01b0384165f908152600a602052604090205460ff16155b156111b7576111b761156e565b6007546001600160a01b0386165f908152600a602052604090205460ff918216159116806111fc57506001600160a01b0385165f908152600a602052604090205460ff165b1561120457505f5b5f81156113a457826112ec576001600160a01b0387165f908152600c602052604090205460ff168015611235575060015b156112b0576064611247600587611a8f565b6112519190611aa6565b9050600561125f8183611a8f565b6112699190611aa6565b60095f8282546112799190611a47565b909155506005905061128b5f83611a8f565b6112959190611aa6565b60085f8282546112a59190611a47565b909155506113869050565b6001600160a01b0386165f908152600c602052604090205460ff1680156112d5575060015b156112e7576064611247600587611a8f565b611386565b6001600160a01b0387165f908152600c602052604090205460ff1615611336576064611319602087611a8f565b6113239190611aa6565b90508060095f8282546112a59190611a47565b6001600160a01b0386165f908152600c602052604090205460ff1615611386576064611363602087611a8f565b61136d9190611aa6565b90508060095f8282546113809190611a47565b90915550505b801561139757611397873083611409565b6113a18186611b0a565b94505b6113af878787611409565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03831661142f5760405162461bcd60e51b815260040161074390611ac5565b6001600160a01b0383165f90815260208190526040902054818110156114a65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610743565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906114dc908490611a47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161152891815260200190565b60405180910390a350505050565b6001600160a01b038084165f9081526020819052604080822080548581039091559285168252812080548492906114dc908490611a47565b6007805460ff19166001179055305f9081526020819052604081205490505f60095460085461159d9190611a47565b90508115806115aa575080155b156115b6575050611718565b6127106115cf676765c793fa10079d601b1b6005611a8f565b6115d99190611aa6565b6115e4906016611a8f565b82111561161c57612710611604676765c793fa10079d601b1b6005611a8f565b61160e9190611aa6565b611619906016611a8f565b91505b5f824761162882611724565b5f6116338247611b0a565b90505f85600854836116459190611a8f565b61164f9190611aa6565b5f6009819055600881905560405191925073b4d4bb811c855ead406b150f0ceb0daf858e567a91839181818185875af1925050503d805f81146116ad576040519150601f19603f3d011682016040523d82523d5f602084013e6116b2565b606091505b50506040519095507314ba9df0d629c3abc864eed41f65003eb7b39ffd9047905f81818185875af1925050503d805f8114611708576040519150601f19603f3d011682016040523d82523d5f602084013e61170d565b606091505b505050505050505050505b6007805460ff19169055565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061175757611757611b1d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f79190611b31565b8160018151811061180a5761180a611b1d565b60200260200101906001600160a01b031690816001600160a01b031681525050611855307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846109d8565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906118a99085905f90869030904290600401611b4c565b5f604051808303815f87803b1580156118c0575f80fd5b505af11580156118d2573d5f803e3d5ffd5b505050505050565b5f602080835283518060208501525f5b81811015611906578581018301518582016040015282016118ea565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109d5575f80fd5b5f806040838503121561194b575f80fd5b823561195681611926565b946020939093013593505050565b5f805f60608486031215611976575f80fd5b833561198181611926565b9250602084013561199181611926565b929592945050506040919091013590565b5f602082840312156119b2575f80fd5b81356119bd81611926565b9392505050565b5f80604083850312156119d5575f80fd5b82356119e081611926565b915060208301356119f081611926565b809150509250929050565b600181811c90821680611a0f57607f821691505b602082108103611a2d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106b1576106b1611a33565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b80820281158282048414176106b1576106b1611a33565b5f82611ac057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b818103818111156106b1576106b1611a33565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b41575f80fd5b81516119bd81611926565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611b9c5784516001600160a01b031683529383019391830191600101611b77565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d6b9f6a13322b93964a9c0453a664d85571741a71fbf55bcd87cd145464c640f64736f6c63430008180033

Deployed Bytecode Sourcemap

20681:9721:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7859:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10026:169;;;;;;;;;;-1:-1:-1;10026:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;10026:169:0;1023:187:1;21661:43:0;;;;;;;;;;;;21702:2;21661:43;;;;;1361:25:1;;;1349:2;1334:18;21661:43:0;1215:177:1;21468:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1587:32:1;;;1569:51;;1557:2;1542:18;21468:51:0;1397:229:1;8979:108:0;;;;;;;;;;-1:-1:-1;9067:12:0;;8979:108;;22228:33;;;;;;;;;;;;;;;;10677:492;;;;;;;;;;-1:-1:-1;10677:492:0;;;;;:::i;:::-;;:::i;21230:53::-;;;;;;;;;;;;21276:6;21230:53;;8821:93;;;;;;;;;;-1:-1:-1;8821:93:0;;8904:2;2442:36:1;;2430:2;2415:18;8821:93:0;2300:184:1;11578:215:0;;;;;;;;;;-1:-1:-1;11578:215:0;;;;;:::i;:::-;;:::i;21526:38::-;;;;;;;;;;;;;;;22152:33;;;;;;;;;;-1:-1:-1;22152:33:0;;;;;;;;;;;21813:41;;;;;;;;;;;;21853:1;21813:41;;9150:127;;;;;;;;;;-1:-1:-1;9150:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9251:18:0;9224:7;9251:18;;;;;;;;;;;;9150:127;1771:103;;;;;;;;;;;;;:::i;:::-;;24031:84;;;;;;;;;;;;;:::i;21290:::-;;;;;;;;;;;;21332:42;21290:84;;23908:115;;;;;;;;;;;;;:::i;1120:87::-;;;;;;;;;;-1:-1:-1;1193:6:0;;-1:-1:-1;;;;;1193:6:0;1120:87;;21381:78;;;;;;;;;;;;21417:42;21381:78;;8078:104;;;;;;;;;;;;;:::i;21861:37::-;;;;;;;;;;;;21897:1;21861:37;;22194:27;;;;;;;;;;;;;;;;12296:413;;;;;;;;;;-1:-1:-1;12296:413:0;;;;;:::i;:::-;;:::i;9490:175::-;;;;;;;;;;-1:-1:-1;9490:175:0;;;;;:::i;:::-;;:::i;22444:57::-;;;;;;;;;;-1:-1:-1;22444:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22112:33;;;;;;;;;;-1:-1:-1;22112:33:0;;;;;;;;;;;20982:73;;;;;;;;;;;;;:::i;9728:151::-;;;;;;;;;;-1:-1:-1;9728:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9844:18:0;;;9817:7;9844:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9728:151;21143:71;;;;;;;;;;;;;:::i;2029:201::-;;;;;;;;;;-1:-1:-1;2029:201:0;;;;;:::i;:::-;;:::i;7859:100::-;7913:13;7946:5;7939:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7859:100;:::o;10026:169::-;10109:4;10126:39;176:10;10149:7;10158:6;10126:8;:39::i;:::-;-1:-1:-1;10183:4:0;10026:169;;;;;:::o;10677:492::-;10817:4;10834:36;10844:6;10852:9;10863:6;10834:9;:36::i;:::-;-1:-1:-1;;;;;10910:19:0;;10883:24;10910:19;;;:11;:19;;;;;;;;176:10;10910:33;;;;;;;;10962:26;;;;10954:79;;;;-1:-1:-1;;;10954:79:0;;3721:2:1;10954:79:0;;;3703:21:1;3760:2;3740:18;;;3733:30;3799:34;3779:18;;;3772:62;-1:-1:-1;;;3850:18:1;;;3843:38;3898:19;;10954:79:0;;;;;;;;;11069:57;11078:6;176:10;11119:6;11100:16;:25;11069:8;:57::i;:::-;-1:-1:-1;11157:4:0;;10677:492;-1:-1:-1;;;;10677:492:0:o;11578:215::-;176:10;11666:4;11715:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11715:34:0;;;;;;;;;;11666:4;;11683:80;;11706:7;;11715:47;;11752:10;;11715:47;:::i;:::-;11683:8;:80::i;1771:103::-;1193:6;;-1:-1:-1;;;;;1193:6:0;176:10;1340:23;1332:68;;;;-1:-1:-1;;;1332:68:0;;;;;;;:::i;:::-;1836:30:::1;1863:1;1836:18;:30::i;:::-;1771:103::o:0;24031:84::-;1193:6;;-1:-1:-1;;;;;1193:6:0;176:10;1340:23;1332:68;;;;-1:-1:-1;;;1332:68:0;;;;;;;:::i;:::-;24085:14:::1;:22:::0;;-1:-1:-1;;24085:22:0::1;::::0;;24031:84::o;23908:115::-;1193:6;;-1:-1:-1;;;;;1193:6:0;176:10;1340:23;1332:68;;;;-1:-1:-1;;;1332:68:0;;;;;;;:::i;:::-;23972:12:::1;23963:6;:21:::0;23995:13:::1;:20:::0;;-1:-1:-1;;23995:20:0::1;;;::::0;;23908:115::o;8078:104::-;8134:13;8167:7;8160:14;;;;;:::i;12296:413::-;176:10;12389:4;12433:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12433:34:0;;;;;;;;;;12486:35;;;;12478:85;;;;-1:-1:-1;;;12478:85:0;;4753:2:1;12478:85:0;;;4735:21:1;4792:2;4772:18;;;4765:30;4831:34;4811:18;;;4804:62;-1:-1:-1;;;4882:18:1;;;4875:35;4927:19;;12478:85:0;4551:401:1;12478:85:0;12599:67;176:10;12622:7;12650:15;12631:16;:34;12599:8;:67::i;:::-;-1:-1:-1;12697:4:0;;12296:413;-1:-1:-1;;;12296:413:0:o;9490:175::-;9576:4;9593:42;176:10;9617:9;9628:6;9593:9;:42::i;20982:73::-;21051:4;21030:17;-1:-1:-1;;;21045:2:0;21030:17;:::i;:::-;21029:26;;;;:::i;:::-;20982:73;:::o;21143:71::-;21209:5;21189:16;-1:-1:-1;;;21204:1:0;21189:16;:::i;2029:201::-;1193:6;;-1:-1:-1;;;;;1193:6:0;176:10;1340:23;1332:68;;;;-1:-1:-1;;;1332:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2118:22:0;::::1;2110:73;;;::::0;-1:-1:-1;;;2110:73:0;;5554:2:1;2110:73:0::1;::::0;::::1;5536:21:1::0;5593:2;5573:18;;;5566:30;5632:34;5612:18;;;5605:62;-1:-1:-1;;;5683:18:1;;;5676:36;5729:19;;2110:73:0::1;5352:402:1::0;2110:73:0::1;2194:28;2213:8;2194:18;:28::i;:::-;2029:201:::0;:::o;16872:380::-;-1:-1:-1;;;;;17008:19:0;;17000:68;;;;-1:-1:-1;;;17000:68:0;;5961:2:1;17000:68:0;;;5943:21:1;6000:2;5980:18;;;5973:30;6039:34;6019:18;;;6012:62;-1:-1:-1;;;6090:18:1;;;6083:34;6134:19;;17000:68:0;5759:400:1;17000:68:0;-1:-1:-1;;;;;17087:21:0;;17079:68;;;;-1:-1:-1;;;17079:68:0;;6366:2:1;17079:68:0;;;6348:21:1;6405:2;6385:18;;;6378:30;6444:34;6424:18;;;6417:62;-1:-1:-1;;;6495:18:1;;;6488:32;6537:19;;17079:68:0;6164:398:1;17079:68:0;-1:-1:-1;;;;;17160:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17212:32;;1361:25:1;;;17212:32:0;;1334:18:1;17212:32:0;;;;;;;16872:380;;;:::o;24549:4323::-;-1:-1:-1;;;;;24681:18:0;;24673:68;;;;-1:-1:-1;;;24673:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24760:16:0;;24752:64;;;;-1:-1:-1;;;24752:64:0;;7175:2:1;24752:64:0;;;7157:21:1;7214:2;7194:18;;;7187:30;7253:34;7233:18;;;7226:62;-1:-1:-1;;;7304:18:1;;;7297:33;7347:19;;24752:64:0;6973:399:1;24752:64:0;24831:6;24841:1;24831:11;24827:93;;24859:28;24875:4;24881:2;24885:1;24859:15;:28::i;:::-;24549:4323;;;:::o;24827:93::-;24936:14;;;;;;;24932:1263;;;1193:6;;-1:-1:-1;;;;;24989:15:0;;;1193:6;;24989:15;;;;:49;;-1:-1:-1;1193:6:0;;-1:-1:-1;;;;;25025:13:0;;;1193:6;;25025:13;;24989:49;:87;;;;-1:-1:-1;;;;;;25059:17:0;;21276:6;25059:17;;24989:87;:124;;;;-1:-1:-1;;;;;;25097:16:0;;;;24989:124;:154;;;;-1:-1:-1;25135:8:0;;;;25134:9;24989:154;24967:1217;;;25183:13;;;;;;;25178:192;;-1:-1:-1;;;;;25225:25:0;;;;;;:19;:25;;;;;;;;25224:26;:54;;;;-1:-1:-1;;;;;;25255:23:0;;;;;;:19;:23;;;;;;;;25254:24;25224:54;25221:130;;;25314:13;;-1:-1:-1;;;25314:13:0;;;;;;;;;;;25221:130;-1:-1:-1;;;;;25416:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;25473:35:0;;;;;;:31;:35;;;;;;;;25472:36;25416:92;25390:779;;;21051:4;21030:17;-1:-1:-1;;;21045:2:0;21030:17;:::i;:::-;21029:26;;;;:::i;:::-;25559:6;:30;;25551:81;;;;-1:-1:-1;;;25551:81:0;;7579:2:1;25551:81:0;;;7561:21:1;7618:2;7598:18;;;7591:30;7657:34;7637:18;;;7630:62;-1:-1:-1;;;7708:18:1;;;7701:36;7754:19;;25551:81:0;7377:402:1;25551:81:0;21126:4;21105:17;-1:-1:-1;;;21120:2:0;21105:17;:::i;:::-;21104:26;;;;:::i;:::-;-1:-1:-1;;;;;9251:18:0;;9224:7;9251:18;;;;;;;;;;;25663:22;;:6;:22;:::i;:::-;:35;;25655:67;;;;-1:-1:-1;;;25655:67:0;;7986:2:1;25655:67:0;;;7968:21:1;8025:2;8005:18;;;7998:30;-1:-1:-1;;;8044:18:1;;;8037:49;8103:18;;25655:67:0;7784:343:1;25655:67:0;25390:779;;;-1:-1:-1;;;;;25774:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;25829:37:0;;;;;;:31;:37;;;;;;;;25828:38;25774:92;25748:421;;;21051:4;21030:17;-1:-1:-1;;;21045:2:0;21030:17;:::i;:::-;21029:26;;;;:::i;:::-;25917:6;:30;;25909:82;;;;-1:-1:-1;;;25909:82:0;;8334:2:1;25909:82:0;;;8316:21:1;8373:2;8353:18;;;8346:30;8412:34;8392:18;;;8385:62;-1:-1:-1;;;8463:18:1;;;8456:37;8510:19;;25909:82:0;8132:403:1;25748:421:0;-1:-1:-1;;;;;26022:35:0;;;;;;:31;:35;;;;;;;;26017:152;;21126:4;21105:17;-1:-1:-1;;;21120:2:0;21105:17;:::i;:::-;21104:26;;;;:::i;:::-;-1:-1:-1;;;;;9251:18:0;;9224:7;9251:18;;;;;;;;;;;26090:22;;:6;:22;:::i;:::-;:35;;26082:67;;;;-1:-1:-1;;;26082:67:0;;7986:2:1;26082:67:0;;;7968:21:1;8025:2;8005:18;;;7998:30;-1:-1:-1;;;8044:18:1;;;8037:49;8103:18;;26082:67:0;7784:343:1;26082:67:0;-1:-1:-1;;;;;26210:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;26239:23:0;;;;;;:19;:23;;;;;;;;26210:52;26209:79;;;;-1:-1:-1;;;;;;26267:21:0;;26283:4;26267:21;;26209:79;:102;;;;-1:-1:-1;;;;;;26292:19:0;;26306:4;26292:19;;26209:102;26205:163;;;26341:15;26328:10;:28;26205:163;-1:-1:-1;;;;;26382:25:0;;;;;;:19;:25;;;;;;;;:58;;;;;26412:19;:28;26432:7;1193:6;;-1:-1:-1;;;;;1193:6:0;;1120:87;26432:7;-1:-1:-1;;;;;26412:28:0;;;;;;;;;;;;-1:-1:-1;26412:28:0;;;;26411:29;26382:58;26378:146;;;26457:34;26474:4;26480:2;26484:6;26457:16;:34::i;26378:146::-;-1:-1:-1;;;;;26539:25:0;;;;;;:19;:25;;;;;;;;26538:26;:54;;;;-1:-1:-1;;;;;;26569:23:0;;;;;;:19;:23;;;;;;;;26568:24;26538:54;26534:512;;;-1:-1:-1;;;;;26614:31:0;;;;;;:25;:31;;;;;;;;26609:426;;-1:-1:-1;;;;;26696:15:0;;26666:27;26696:15;;;:9;:15;;;;;26767:10;;26754;;:23;;26767:10;26754:23;:::i;:::-;26730:21;;;:47;26810:15;26796:11;;;;:29;26609:426;;;-1:-1:-1;;;;;26896:13:0;;26866:27;26896:13;;;:9;:13;;;;;26932:10;;26896:13;;26932:15;26928:92;;26985:15;26972:28;;26928:92;26847:188;26609:426;27113:4;27058:12;9251:18;;;;;;;;;;;21209:5;21189:16;-1:-1:-1;;;21204:1:0;21189:16;:::i;:::-;21188:26;;;;:::i;:::-;27073:46;;27058:61;;27130:12;21756:1;27160:6;;:26;;;;:::i;:::-;27145:12;:41;;-1:-1:-1;27217:8:0;;27145:41;27217:32;;;27242:7;27217:32;:58;;;;-1:-1:-1;27267:8:0;;;;27266:9;27217:58;:107;;;;-1:-1:-1;;;;;;27293:31:0;;;;;;:25;:31;;;;;;;;27292:32;27217:107;:150;;;;-1:-1:-1;;;;;;27342:25:0;;;;;;:19;:25;;;;;;;;27341:26;27217:150;:191;;;;-1:-1:-1;;;;;;27385:23:0;;;;;;:19;:23;;;;;;;;27384:24;27217:191;27199:258;;;27435:10;:8;:10::i;:::-;27485:8;;-1:-1:-1;;;;;27508:25:0;;27469:12;27508:25;;;:19;:25;;;;;;27485:8;;;;27484:9;;27508:25;;:52;;-1:-1:-1;;;;;;27537:23:0;;;;;;:19;:23;;;;;;;;27508:52;27504:100;;;-1:-1:-1;27587:5:0;27504:100;27616:12;27647:7;27643:1176;;;27676:7;27671:1003;;-1:-1:-1;;;;;27708:31:0;;;;;;:25;:31;;;;;;;;:51;;;;-1:-1:-1;27743:16:0;27708:51;27704:582;;;27815:3;27791:21;21805:1;27791:6;:21;:::i;:::-;:27;;;;:::i;:::-;27784:34;-1:-1:-1;21805:1:0;27863:22;21805:1;27784:34;27863:22;:::i;:::-;:37;;;;:::i;:::-;27841:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;21805:1:0;;-1:-1:-1;27939:16:0;21897:1;27939:4;:16;:::i;:::-;:31;;;;:::i;:::-;27923:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;27671:1003:0;;-1:-1:-1;27671:1003:0;27704:582;-1:-1:-1;;;;;28000:29:0;;;;;;:25;:29;;;;;;;;:50;;;;-1:-1:-1;28033:17:0;28000:50;27996:290;;;28107:3;28082:22;21853:1;28082:6;:22;:::i;27996:290::-;27671:1003;;;-1:-1:-1;;;;;28330:31:0;;;;;;:25;:31;;;;;;;;28326:333;;;28418:3;28393:22;21652:2;28393:6;:22;:::i;:::-;:28;;;;:::i;:::-;28386:35;;28466:4;28444:18;;:26;;;;;;;:::i;28326:333::-;-1:-1:-1;;;;;28500:29:0;;;;;;:25;:29;;;;;;;;28496:163;;;28587:3;28561:23;21702:2;28561:6;:23;:::i;:::-;:29;;;;:::i;:::-;28554:36;;28635:4;28613:18;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;28496:163:0;28692:8;;28688:91;;28721:42;28737:4;28751;28758;28721:15;:42::i;:::-;28793:14;28803:4;28793:14;;:::i;:::-;;;27643:1176;28831:33;28847:4;28853:2;28857:6;28831:15;:33::i;:::-;24662:4210;;;;24549:4323;;;:::o;2390:191::-;2483:6;;;-1:-1:-1;;;;;2500:17:0;;;-1:-1:-1;;;;;;2500:17:0;;;;;;;2533:40;;2483:6;;;2500:17;2483:6;;2533:40;;2464:16;;2533:40;2453:128;2390:191;:::o;13199:651::-;-1:-1:-1;;;;;13339:20:0;;13331:70;;;;-1:-1:-1;;;13331:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13498:17:0;;13474:21;13498:17;;;;;;;;;;;13534:23;;;;13526:74;;;;-1:-1:-1;;;13526:74:0;;8875:2:1;13526:74:0;;;8857:21:1;8914:2;8894:18;;;8887:30;8953:34;8933:18;;;8926:62;-1:-1:-1;;;9004:18:1;;;8997:36;9050:19;;13526:74:0;8673:402:1;13526:74:0;-1:-1:-1;;;;;13636:17:0;;;:9;:17;;;;;;;;;;;13656:22;;;13636:42;;13700:20;;;;;;;;:30;;13672:6;;13636:9;13700:30;;13672:6;;13700:30;:::i;:::-;;;;;;;;13765:9;-1:-1:-1;;;;;13748:35:0;13757:6;-1:-1:-1;;;;;13748:35:0;;13776:6;13748:35;;;;1361:25:1;;1349:2;1334:18;;1215:177;13748:35:0;;;;;;;;13320:530;13199:651;;;:::o;14340:484::-;-1:-1:-1;;;;;14557:17:0;;;14533:21;14557:17;;;;;;;;;;;;;14630:22;;;14610:42;;;14674:20;;;;;;;:30;;14646:6;;14533:21;14674:30;;14646:6;;14674:30;:::i;28880:953::-;22742:8;:15;;-1:-1:-1;;22742:15:0;22753:4;22742:15;;;28975:4:::1;-1:-1:-1::0;9251:18:0;;;;;;;;;;;28931:50:::1;;28992:25;29035:18;;29020:12;;:33;;;;:::i;:::-;28992:61:::0;-1:-1:-1;29068:20:0;;;:46:::1;;-1:-1:-1::0;29092:22:0;;29068:46:::1;29064:85;;;29131:7;;;;29064:85;21209:5;21189:16;-1:-1:-1::0;;;21204:1:0::1;21189:16;:::i;:::-;21188:26;;;;:::i;:::-;29181:23;::::0;29202:2:::1;29181:23;:::i;:::-;29163:15;:41;29159:115;;;21209:5;21189:16;-1:-1:-1::0;;;21204:1:0::1;21189:16;:::i;:::-;21188:26;;;;:::i;:::-;29239:23;::::0;29260:2:::1;29239:23;:::i;:::-;29221:41;;29159:115;29284:12;29336:15:::0;29390:21:::1;29422:36;29336:15:::0;29422:16:::1;:36::i;:::-;29469:19;29491:41;29515:17:::0;29491:21:::1;:41;:::i;:::-;29469:63;;29543:17;29592;29577:12;;29563:11;:26;;;;:::i;:::-;:46;;;;:::i;:::-;29641:1;29620:18;:22:::0;;;29653:12:::1;:16:::0;;;29693:45:::1;::::0;29543:66;;-1:-1:-1;21417:42:0::1;::::0;29543:66;;29693:45;29641:1;29693:45;29543:66;21417:42;29693:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;29762:63:0::1;::::0;29680:58;;-1:-1:-1;21332:42:0::1;::::0;29799:21:::1;::::0;29762:63:::1;::::0;;;29799:21;21332:42;29762:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;22768:1:0::1;22780:8:::0;:16;;-1:-1:-1;;22780:16:0;;;28880:953::o;29841:521::-;29931:16;;;29945:1;29931:16;;;;;;;;29907:21;;29931:16;;;;;;;;;;-1:-1:-1;29931:16:0;29907:40;;29976:4;29958;29963:1;29958:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;29958:23:0;;;-1:-1:-1;;;;;29958:23:0;;;;;30002:15;-1:-1:-1;;;;;30002:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29992:4;29997:1;29992:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;29992:32:0;;;-1:-1:-1;;;;;29992:32:0;;;;;30035:112;30066:4;30094:15;30125:11;30035:8;:112::i;:::-;30158:196;;-1:-1:-1;;;30158:196:0;;-1:-1:-1;;;;;30158:15:0;:66;;;;:196;;30239:11;;30265:1;;30281:4;;30308;;30328:15;;30158:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:466;29841:521;:::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;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2489:247::-;2548:6;2601:2;2589:9;2580:7;2576:23;2572:32;2569:52;;;2617:1;2614;2607:12;2569:52;2656:9;2643:23;2675:31;2700:5;2675:31;:::i;:::-;2725:5;2489:247;-1:-1:-1;;;2489:247:1:o;2741:388::-;2809:6;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:52;;;2886:1;2883;2876:12;2838:52;2925:9;2912:23;2944:31;2969:5;2944:31;:::i;:::-;2994:5;-1:-1:-1;3051:2:1;3036:18;;3023:32;3064:33;3023:32;3064:33;:::i;:::-;3116:7;3106:17;;;2741:388;;;;;:::o;3134:380::-;3213:1;3209:12;;;;3256;;;3277:61;;3331:4;3323:6;3319:17;3309:27;;3277:61;3384:2;3376:6;3373:14;3353:18;3350:38;3347:161;;3430:10;3425:3;3421:20;3418:1;3411:31;3465:4;3462:1;3455:15;3493:4;3490:1;3483:15;3347:161;;3134:380;;;:::o;3928:127::-;3989:10;3984:3;3980:20;3977:1;3970:31;4020:4;4017:1;4010:15;4044:4;4041:1;4034:15;4060:125;4125:9;;;4146:10;;;4143:36;;;4159:18;;:::i;4190:356::-;4392:2;4374:21;;;4411:18;;;4404:30;4470:34;4465:2;4450:18;;4443:62;4537:2;4522:18;;4190:356::o;4957:168::-;5030:9;;;5061;;5078:15;;;5072:22;;5058:37;5048:71;;5099:18;;:::i;5130:217::-;5170:1;5196;5186:132;;5240:10;5235:3;5231:20;5228:1;5221:31;5275:4;5272:1;5265:15;5303:4;5300:1;5293:15;5186:132;-1:-1:-1;5332:9:1;;5130:217::o;6567:401::-;6769:2;6751:21;;;6808:2;6788:18;;;6781:30;6847:34;6842:2;6827:18;;6820:62;-1:-1:-1;;;6913:2:1;6898:18;;6891:35;6958:3;6943:19;;6567:401::o;8540:128::-;8607:9;;;8628:11;;;8625:37;;;8642:18;;:::i;9422:127::-;9483:10;9478:3;9474:20;9471:1;9464:31;9514:4;9511:1;9504:15;9538:4;9535:1;9528:15;9554:251;9624:6;9677:2;9665:9;9656:7;9652:23;9648:32;9645:52;;;9693:1;9690;9683:12;9645:52;9725:9;9719:16;9744:31;9769:5;9744:31;:::i;9810:980::-;10072:4;10120:3;10109:9;10105:19;10151:6;10140:9;10133:25;10177:2;10215:6;10210:2;10199:9;10195:18;10188:34;10258:3;10253:2;10242:9;10238:18;10231:31;10282:6;10317;10311:13;10348:6;10340;10333:22;10386:3;10375:9;10371:19;10364:26;;10425:2;10417:6;10413:15;10399:29;;10446:1;10456:195;10470:6;10467:1;10464:13;10456:195;;;10535:13;;-1:-1:-1;;;;;10531:39:1;10519:52;;10626:15;;;;10591:12;;;;10567:1;10485:9;10456:195;;;-1:-1:-1;;;;;;;10707:32:1;;;;10702:2;10687:18;;10680:60;-1:-1:-1;;;10771:3:1;10756:19;10749:35;10668:3;9810:980;-1:-1:-1;;;9810:980:1:o

Swarm Source

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