ETH Price: $2,520.01 (+3.48%)

Token

SONIC SPACE CAT (SCAT)
 

Overview

Max Total Supply

1,000,000,000,000,000 SCAT

Holders

160

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000546548763888679 SCAT

Value
$0.00
0x310af2231532872629d525eacc8b79d60693bb1b
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:
SONICSPACECAT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

interface IERC20 {
    /**
     * @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 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @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 {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint256);

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

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

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

    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);

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

    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    IUniswapV2Router02 public uniswapV2Router;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool public tradingEnabled = false;

    uint256 internal sellAmount = 1;
    uint256 internal buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    address payable public marketingWallet; 
    address payable public devWallet;
  
    uint256 public swapTokensAtAmount;
    uint256 public sellMarketingFees;
    uint256 public buyMarketingFees;
    uint256 public buyDevFee;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;
    uint256 public buyLiquidityFee; 
    bool public swapAndLiquifyEnabled = true;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    bool public limitsInEffect = true; 
    mapping(address => uint256) private _holderLastTransferBlock; // FOR 1TX PER BLOCK
    mapping(address => uint256) private _holderLastTransferTimestamp; // FOR COOLDOWN
    uint256 public launchblock; // FOR DEADBLOCKS
    uint256 private deadblocks;
    uint256 public launchtimestamp; 
    uint256 public cooldowntimer = 60; //COOLDOWN TIMER

    event EnableSwapAndLiquify(bool enabled);  
    event SetPreSaleWallet(address wallet);
    event updateMarketingWallet(address wallet);
    event updateDevWallet(address wallet);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event TradingEnabled();

    event UpdateFees(uint256 sellMarketingFees, uint256 buyMarketingFees,
                     uint256 buyDevFee, uint256 sellDevFee, uint256 buyLiquidityFee, uint256 sellLiquidityFee);

    event Airdrop(address holder, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendDividends(uint256 opAmount, bool success);

    constructor() ERC20("SONIC SPACE CAT", "SCAT") { 
        marketingWallet = payable(0x001986Ed67D2cf521545fCe9e7B55bCA3ae12d79); 
        devWallet = payable(0xD57fB7349Ea015D5cF03a1E548570B789661b936); 
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; 
        
        buyMarketingFees = 2;
        sellMarketingFees = 6;
        buyDevFee = 0;
        sellDevFee = 1;
        buyLiquidityFee = 1;
        sellLiquidityFee = 1;

        totalBuyFees = buyMarketingFees.add(buyDevFee).add(buyLiquidityFee);
        totalSellFees = sellMarketingFees.add(sellDevFee).add(sellLiquidityFee);

        uniswapV2Router = IUniswapV2Router02(router);

        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[marketingWallet] = true;

        // TOTAL SUPPLY IS SET HERE
        uint _totalSupply = 1_000_000_000_000_000 ether;
        _mint(owner(), _totalSupply); // only time internal mint function is ever called is to create supply
        swapTokensAtAmount = _totalSupply / 1000;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

    receive() external payable {}

    function enableTrading(uint256 setdeadblocks) external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        launchblock = block.number;
        launchtimestamp = block.timestamp;
        deadblocks = setdeadblocks;
        emit TradingEnabled();
    }

    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        emit SetPreSaleWallet(wallet);
    }    
    
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }

    function setDevWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        devWallet = payable(wallet);
        emit updateDevWallet(wallet);
    }  
    
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    function Sweep() external onlyOwner {
        uint256 amountBNB = address(this).balance;
        payable(msg.sender).transfer(amountBNB);
    }

    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateFees(uint256 marketingBuy, uint256 marketingSell, uint256 devBuy, uint256 devSell,
                        uint256 liquidityBuy, uint256 liquiditySell) public onlyOwner {

        buyMarketingFees = marketingBuy;
        sellMarketingFees = marketingSell;
        buyDevFee = devBuy;
        sellDevFee = devSell;
        sellLiquidityFee = liquiditySell;
        buyLiquidityFee = liquidityBuy;

        totalSellFees = sellMarketingFees.add(sellDevFee).add(sellLiquidityFee);
        totalBuyFees = buyMarketingFees.add(buyDevFee).add(buyLiquidityFee);

        require(totalSellFees <= 5 && totalBuyFees <= 3, "total fees cannot be higher than 3% buys 5% sells");

        emit UpdateFees(sellMarketingFees, sellDevFee, sellLiquidityFee, buyMarketingFees, buyDevFee, buyLiquidityFee);
    }

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

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "IERC20: transfer from the zero address");
        require(to != address(0), "IERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 marketingFees;
        uint256 devFee;
        uint256 liquidityFee;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");          
        }

        if (to == DEAD) {
            _burn(from, amount);
            return;
        }
        
        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];            
            
            if (!isBuying && !isSelling) {
                super._transfer(from, to, amount);
                return;
            }            
            
            else if (isSelling) {
                marketingFees = sellMarketingFees;
                devFee = sellDevFee;
                liquidityFee = sellLiquidityFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "One Sell Per 60 Seconds");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;
                }
            } 
            
            else if (isBuying) {
                marketingFees = buyMarketingFees;
                devFee = buyDevFee;
                liquidityFee = buyLiquidityFee;

                if (limitsInEffect) {
                    require(block.number > launchblock + deadblocks,"Bought Too Fast");
                    require(_holderLastTransferBlock[tx.origin] != block.number,"One Buy per block");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

            }

            uint256 totalFees = marketingFees.add(devFee).add(liquidityFee);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (canSwap && isSelling) {
                swapping = true;
             
                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }                
                
                
                uint256 swapBalance = balanceOf(address(this));
                swapAndSendDividends(swapBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);

            amount = amount.sub(fees);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

            super._transfer(from, address(this), fees);
            
        }

        super._transfer(from, to, amount);

    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    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, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    // TAX PAYOUT CODE 
    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);

        bool success = true;
        bool successOp1 = true;
        
        uint256 _completeFees = sellMarketingFees.add(sellDevFee) + buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 devPayout = buyDevFee.add(sellDevFee) * feePortions;
        
        if (marketingPayout > 0) {
            (success, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        
        if (devPayout > 0) {
            (successOp1, ) = address(devWallet).call{value: devPayout}("");
        }

        emit SendDividends(
            marketingPayout + devPayout,
            success && successOp1
        );
    }
    
    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length, "Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"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":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"setdeadblocks","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchtimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260078054600161ff0160a01b03191661dead1790556001600881905560098190556015805460ff199081168317909155601980549091169091179055603c601f553480156200005257600080fd5b506040518060400160405280600f81526020016e14d3d39250c814d41050d14810d055608a1b8152506040518060400160405280600481526020016314d0d05560e21b8152508160039081620000a99190620004b5565b506004620000b88282620004b5565b505050620000d5620000cf620002b760201b60201c565b620002bb565b600c8054721986ed67d2cf521545fce9e7b55bca3ae12d796001600160a01b031991821617909155600d805473d57fb7349ea015d5cf03a1e548570b789661b9369216919091179055600260108190556006600f55600060118190556001601281905560148190556013819055737a250d5630b4cf539739df2c5dacb4c659f2488d9262000189926200017591906200030d602090811b6200109617901c565b6200030d60201b620010961790919060201c565b600b81905550620001b460135462000175601254600f546200030d60201b620010961790919060201c565b600a55600680546001600160a01b0319166001600160a01b038381169190911790915530600090815260166020526040808220805460ff1990811660019081179092553384528284208054821683179055600c549094168352912080549092161790556d314dc6448d9338c15b0a00000000620002446200023d6005546001600160a01b031690565b8262000324565b620002526103e88262000581565b600e556001601860006200026e6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601890925290208054909116600117905550620005c69050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006200031b8284620005a4565b90505b92915050565b6001600160a01b0382166200037f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620003939190620005a4565b90915550506001600160a01b03821660009081526020819052604081208054839290620003c2908490620005a4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200043c57607f821691505b6020821081036200045d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200040c57600081815260208120601f850160051c810160208610156200048c5750805b601f850160051c820191505b81811015620004ad5782815560010162000498565b505050505050565b81516001600160401b03811115620004d157620004d162000411565b620004e981620004e2845462000427565b8462000463565b602080601f831160018114620005215760008415620005085750858301515b600019600386901b1c1916600185901b178555620004ad565b600085815260208120601f198616915b82811015620005525788860151825594840194600190910190840162000531565b5085821015620005715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000826200059f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200031e57634e487b7160e01b600052601160045260246000fd5b6125ec80620005d66000396000f3fe6080604052600436106102815760003560e01c8063715018a61161014f578063a0d82dc5116100c1578063d5e372511161007a578063d5e3725114610784578063dd62ed3e146107a4578063e2f45605146107c4578063f11a24d3146107da578063f2fde38b146107f0578063f63743421461081057600080fd5b8063a0d82dc5146106c8578063a457c2d7146106de578063a9059cbb146106fe578063b49429881461071e578063b62496f514610734578063d07a091c1461076457600080fd5b80638ea5220f116101135780638ea5220f1461062757806395451c291461064757806395d89b411461065d578063992c58e4146106725780639a7a23d6146106925780639c3b4fdc146106b257600080fd5b8063715018a61461059e57806375f0a874146105b357806382aa7c68146105d35780638c3c82b2146105f35780638da5cb5b1461060957600080fd5b8063313ce567116101f35780635124f874116101ac5780635124f874146104dd5780635d098b38146104f35780635eee4bae14610513578063679ca6e9146105335780637088fb7f1461055357806370a082311461056857600080fd5b8063313ce56714610413578063395093511461042f5780634a62bb651461044f5780634a74bb02146104695780634ada218b146104835780634fbee193146104a457600080fd5b80631694505e116102455780631694505e1461035e57806318160ddd1461037e5780631d7b1fb41461039d5780631f53ac02146103b35780632307b441146103d357806323b872dd146103f357600080fd5b806303fd2a451461028d57806305ca5f08146102ca57806306fdde03146102ec57806308dfe8a51461030e578063095ea7b31461032e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506007546102ad906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d657600080fd5b506102ea6102e536600461209d565b610826565b005b3480156102f857600080fd5b506103016108cc565b6040516102c191906120b6565b34801561031a57600080fd5b506102ea61032936600461212e565b61095e565b34801561033a57600080fd5b5061034e610349366004612163565b6109c5565b60405190151581526020016102c1565b34801561036a57600080fd5b506006546102ad906001600160a01b031681565b34801561038a57600080fd5b506002545b6040519081526020016102c1565b3480156103a957600080fd5b5061038f601f5481565b3480156103bf57600080fd5b506102ea6103ce36600461218f565b6109df565b3480156103df57600080fd5b506102ea6103ee366004612282565b610a54565b3480156103ff57600080fd5b5061034e61040e366004612344565b610b8f565b34801561041f57600080fd5b50604051601281526020016102c1565b34801561043b57600080fd5b5061034e61044a366004612163565b610bb3565b34801561045b57600080fd5b5060195461034e9060ff1681565b34801561047557600080fd5b5060155461034e9060ff1681565b34801561048f57600080fd5b5060075461034e90600160a81b900460ff1681565b3480156104b057600080fd5b5061034e6104bf36600461218f565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156104e957600080fd5b5061038f60105481565b3480156104ff57600080fd5b506102ea61050e36600461218f565b610bd5565b34801561051f57600080fd5b506102ea61052e36600461209d565b610c43565b34801561053f57600080fd5b506102ea61054e366004612385565b610c63565b34801561055f57600080fd5b506102ea610c7e565b34801561057457600080fd5b5061038f61058336600461218f565b6001600160a01b031660009081526020819052604090205490565b3480156105aa57600080fd5b506102ea610cb9565b3480156105bf57600080fd5b50600c546102ad906001600160a01b031681565b3480156105df57600080fd5b506102ea6105ee36600461209d565b610ccd565b3480156105ff57600080fd5b5061038f601e5481565b34801561061557600080fd5b506005546001600160a01b03166102ad565b34801561063357600080fd5b50600d546102ad906001600160a01b031681565b34801561065357600080fd5b5061038f600f5481565b34801561066957600080fd5b50610301610d38565b34801561067e57600080fd5b506102ea61068d3660046123a0565b610d47565b34801561069e57600080fd5b506102ea6106ad36600461212e565b610e87565b3480156106be57600080fd5b5061038f60115481565b3480156106d457600080fd5b5061038f60125481565b3480156106ea57600080fd5b5061034e6106f9366004612163565b610e99565b34801561070a57600080fd5b5061034e610719366004612163565b610f14565b34801561072a57600080fd5b5061038f601c5481565b34801561074057600080fd5b5061034e61074f36600461218f565b60176020526000908152604090205460ff1681565b34801561077057600080fd5b506102ea61077f36600461218f565b610f22565b34801561079057600080fd5b506102ea61079f366004612385565b610f92565b3480156107b057600080fd5b5061038f6107bf3660046123e3565b610ff2565b3480156107d057600080fd5b5061038f600e5481565b3480156107e657600080fd5b5061038f60145481565b3480156107fc57600080fd5b506102ea61080b36600461218f565b61101d565b34801561081c57600080fd5b5061038f60135481565b61082e6110a9565b61084081670de0b6b3a7640000612432565b9050600061085b60085460095461109690919063ffffffff16565b9050600061087e826108786009548661110390919063ffffffff16565b9061110f565b9050600061089b836108786008548761110390919063ffffffff16565b90506108a68461111b565b6009546108b390836112d5565b6009556008546108c390826112d5565b60085550505050565b6060600380546108db90612449565b80601f016020809104026020016040519081016040528092919081815260200182805461090790612449565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b6109666110a9565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000336109d38185856112e1565b60019150505b92915050565b6109e76110a9565b6001600160a01b038116600081815260166020908152604091829020805460ff19166001179055600d80546001600160a01b0319168417905590519182527f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa91015b60405180910390a150565b610a5c6110a9565b8051825114610ab25760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064015b60405180910390fd5b60c882511115610b0f5760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610aa9565b60005b8251811015610b8a576000838281518110610b2f57610b2f612483565b602002602001015190506000838381518110610b4d57610b4d612483565b6020026020010151670de0b6b3a7640000610b689190612432565b9050610b75338383611405565b50508080610b8290612499565b915050610b12565b505050565b600033610b9d8582856115d5565b610ba8858585611649565b506001949350505050565b6000336109d3818585610bc68383610ff2565b610bd091906124b2565b6112e1565b610bdd6110a9565b6001600160a01b038116600081815260166020908152604091829020805460ff19166001179055600c80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610a49565b610c4b6110a9565b610c5d81670de0b6b3a7640000612432565b600e5550565b610c6b6110a9565b6019805460ff1916911515919091179055565b610c866110a9565b6040514790339082156108fc029083906000818181858888f19350505050158015610cb5573d6000803e3d6000fd5b5050565b610cc16110a9565b610ccb6000611bfb565b565b610cd56110a9565b600754600160a81b900460ff1615610cec57600080fd5b6007805460ff60a81b1916600160a81b17905543601c5542601e55601d8190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6060600480546108db90612449565b610d4f6110a9565b6010869055600f8590556011849055601283905560138190556014829055610d8181610d7b8786611096565b90611096565b600a55601454601154601054610d9c9291610d7b9190611096565b600b55600a54600510801590610db557506003600b5411155b610e1b5760405162461bcd60e51b815260206004820152603160248201527f746f74616c20666565732063616e6e6f7420626520686967686572207468616e60448201527020332520627579732035252073656c6c7360781b6064820152608401610aa9565b600f54601254601354601054601154601454604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b610e8f6110a9565b610cb58282611c4d565b60003381610ea78286610ff2565b905083811015610f075760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610aa9565b610ba882868684036112e1565b6000336109d3818585611649565b610f2a6110a9565b6001600160a01b03811660008181526018602090815260408083208054600160ff199182168117909255601684529382902080549094161790925590519182527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c59101610a49565b610f9a6110a9565b60155481151560ff909116151503610fb157600080fd5b6015805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001610a49565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110256110a9565b6001600160a01b03811661108a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa9565b61109381611bfb565b50565b60006110a282846124b2565b9392505050565b6005546001600160a01b03163314610ccb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aa9565b60006110a28284612432565b60006110a282846124c5565b806000036111265750565b61112f81611ca1565b60115460105460019182916000916111479190611096565b601254600f5461115691611096565b61116091906124b2565b90506000811561117757611174478361110f565b90505b600081611191600f5460105461109690919063ffffffff16565b61119b9190612432565b90506000826111b760125460115461109690919063ffffffff16565b6111c19190612432565b9050811561122157600c546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611216576040519150601f19603f3d011682016040523d82523d6000602084013e61121b565b606091505b50909650505b801561127f57600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50909550505b7f31ea026303a62d39c4ad14716f9621f1afe3242309c2ed761d4e241ae4bf2ea96112aa82846124b2565b8780156112b45750865b6040805192835290151560208301520160405180910390a150505050505050565b60006110a282846124e7565b6001600160a01b0383166113435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa9565b6001600160a01b0382166113a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aa9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa9565b6001600160a01b0382166114cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aa9565b6001600160a01b038316600090815260208190526040902054818110156115435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610aa9565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061157a9084906124b2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115c691815260200190565b60405180910390a35b50505050565b60006115e18484610ff2565b905060001981146115cf578181101561163c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610aa9565b6115cf84848484036112e1565b6001600160a01b0383166116ae5760405162461bcd60e51b815260206004820152602660248201527f4945524332303a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610aa9565b6001600160a01b0382166117105760405162461bcd60e51b8152602060048201526024808201527f4945524332303a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa9565b600081116117725760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610aa9565b6001600160a01b0383166000908152601860205260408120548190819060ff166117ef57600754600160a81b900460ff166117ef5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610aa9565b6007546001600160a01b03908116908616036118175761180f8685611df3565b505050505050565b600754600160a01b900460ff1615801561184a57506001600160a01b03861660009081526016602052604090205460ff16155b801561186f57506001600160a01b03851660009081526016602052604090205460ff16155b15611bf0576001600160a01b0380861660009081526017602052604080822054928916825290205460ff9182169116801580156118aa575081155b156118c4576118ba888888611405565b5050505050505050565b811561196a57600f54601254601354601954929750909550935060ff161561196557601f54326000908152601b602052604090205461190391906124b2565b4210156119525760405162461bcd60e51b815260206004820152601760248201527f4f6e652053656c6c20506572203630205365636f6e64730000000000000000006044820152606401610aa9565b326000908152601b602052604090204290555b611a42565b8015611a4257601054601154601454601954929750909550935060ff1615611a4257601d54601c5461199c91906124b2565b43116119dc5760405162461bcd60e51b815260206004820152600f60248201526e109bdd59da1d08151bdbc811985cdd608a1b6044820152606401610aa9565b326000908152601a6020526040902054439003611a2f5760405162461bcd60e51b81526020600482015260116024820152704f6e65204275792070657220626c6f636b60781b6044820152606401610aa9565b326000908152601a602052604090204390555b6000611a5284610d7b8888611096565b30600090815260208190526040902054600e549192509081108015908190611a775750845b15611b93576007805460ff60a01b1916600160a01b17905560155460ff168015611aa15750600086115b8015611aaf57506000600b54115b15611b61576000611acd60085460095461109690919063ffffffff16565b90506000611aea826108786009548761110390919063ffffffff16565b90506000611b07836108786008548861110390919063ffffffff16565b90506000611b24600b546108788c8661110390919063ffffffff16565b90506000611b41600a546108788d8661110390919063ffffffff16565b90506000611b4f8284611096565b9050611b5a81611f41565b5050505050505b30600090815260208190526040902054611b7a8161111b565b50600160098190556008556007805460ff60a01b191690555b6000611ba460646108788c87611103565b9050611bb08a826112d5565b99508515611bcd57600854611bc59082611096565b600855611bde565b600954611bda9082611096565b6009555b611be98c3083611405565b5050505050505b61180f868686611405565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611cd657611cd6612483565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5391906124fa565b81600181518110611d6657611d66612483565b6001600160a01b039283166020918202929092010152600654611d8c91309116846112e1565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611dc5908590600090869030904290600401612517565b600060405180830381600087803b158015611ddf57600080fd5b505af115801561180f573d6000803e3d6000fd5b6001600160a01b038216611e535760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610aa9565b6001600160a01b03821660009081526020819052604090205481811015611ec75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610aa9565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ef69084906124e7565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000611f4e82600261110f565b90506000611f5c83836112d5565b905047611f6883611ca1565b6000611f7447836112d5565b9050611f808382611fc8565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654611fe09030906001600160a01b0316846112e1565b6006546001600160a01b031663f305d7198230856000806120096005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612071573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120969190612588565b5050505050565b6000602082840312156120af57600080fd5b5035919050565b600060208083528351808285015260005b818110156120e3578581018301518582016040015282016120c7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461109357600080fd5b8035801515811461212957600080fd5b919050565b6000806040838503121561214157600080fd5b823561214c81612104565b915061215a60208401612119565b90509250929050565b6000806040838503121561217657600080fd5b823561218181612104565b946020939093013593505050565b6000602082840312156121a157600080fd5b81356110a281612104565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121eb576121eb6121ac565b604052919050565b600067ffffffffffffffff82111561220d5761220d6121ac565b5060051b60200190565b600082601f83011261222857600080fd5b8135602061223d612238836121f3565b6121c2565b82815260059290921b8401810191818101908684111561225c57600080fd5b8286015b848110156122775780358352918301918301612260565b509695505050505050565b6000806040838503121561229557600080fd5b823567ffffffffffffffff808211156122ad57600080fd5b818501915085601f8301126122c157600080fd5b813560206122d1612238836121f3565b82815260059290921b840181019181810190898411156122f057600080fd5b948201945b8386101561231757853561230881612104565b825294820194908201906122f5565b9650508601359250508082111561232d57600080fd5b5061233a85828601612217565b9150509250929050565b60008060006060848603121561235957600080fd5b833561236481612104565b9250602084013561237481612104565b929592945050506040919091013590565b60006020828403121561239757600080fd5b6110a282612119565b60008060008060008060c087890312156123b957600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156123f657600080fd5b823561240181612104565b9150602083013561241181612104565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d9576109d961241c565b600181811c9082168061245d57607f821691505b60208210810361247d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016124ab576124ab61241c565b5060010190565b808201808211156109d9576109d961241c565b6000826124e257634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109d9576109d961241c565b60006020828403121561250c57600080fd5b81516110a281612104565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125675784516001600160a01b031683529383019391830191600101612542565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561259d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206a4e4e59bb9123df4fc747fd9ce119a85f7197f1088668446e1c74135459b2b564736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063715018a61161014f578063a0d82dc5116100c1578063d5e372511161007a578063d5e3725114610784578063dd62ed3e146107a4578063e2f45605146107c4578063f11a24d3146107da578063f2fde38b146107f0578063f63743421461081057600080fd5b8063a0d82dc5146106c8578063a457c2d7146106de578063a9059cbb146106fe578063b49429881461071e578063b62496f514610734578063d07a091c1461076457600080fd5b80638ea5220f116101135780638ea5220f1461062757806395451c291461064757806395d89b411461065d578063992c58e4146106725780639a7a23d6146106925780639c3b4fdc146106b257600080fd5b8063715018a61461059e57806375f0a874146105b357806382aa7c68146105d35780638c3c82b2146105f35780638da5cb5b1461060957600080fd5b8063313ce567116101f35780635124f874116101ac5780635124f874146104dd5780635d098b38146104f35780635eee4bae14610513578063679ca6e9146105335780637088fb7f1461055357806370a082311461056857600080fd5b8063313ce56714610413578063395093511461042f5780634a62bb651461044f5780634a74bb02146104695780634ada218b146104835780634fbee193146104a457600080fd5b80631694505e116102455780631694505e1461035e57806318160ddd1461037e5780631d7b1fb41461039d5780631f53ac02146103b35780632307b441146103d357806323b872dd146103f357600080fd5b806303fd2a451461028d57806305ca5f08146102ca57806306fdde03146102ec57806308dfe8a51461030e578063095ea7b31461032e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506007546102ad906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d657600080fd5b506102ea6102e536600461209d565b610826565b005b3480156102f857600080fd5b506103016108cc565b6040516102c191906120b6565b34801561031a57600080fd5b506102ea61032936600461212e565b61095e565b34801561033a57600080fd5b5061034e610349366004612163565b6109c5565b60405190151581526020016102c1565b34801561036a57600080fd5b506006546102ad906001600160a01b031681565b34801561038a57600080fd5b506002545b6040519081526020016102c1565b3480156103a957600080fd5b5061038f601f5481565b3480156103bf57600080fd5b506102ea6103ce36600461218f565b6109df565b3480156103df57600080fd5b506102ea6103ee366004612282565b610a54565b3480156103ff57600080fd5b5061034e61040e366004612344565b610b8f565b34801561041f57600080fd5b50604051601281526020016102c1565b34801561043b57600080fd5b5061034e61044a366004612163565b610bb3565b34801561045b57600080fd5b5060195461034e9060ff1681565b34801561047557600080fd5b5060155461034e9060ff1681565b34801561048f57600080fd5b5060075461034e90600160a81b900460ff1681565b3480156104b057600080fd5b5061034e6104bf36600461218f565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156104e957600080fd5b5061038f60105481565b3480156104ff57600080fd5b506102ea61050e36600461218f565b610bd5565b34801561051f57600080fd5b506102ea61052e36600461209d565b610c43565b34801561053f57600080fd5b506102ea61054e366004612385565b610c63565b34801561055f57600080fd5b506102ea610c7e565b34801561057457600080fd5b5061038f61058336600461218f565b6001600160a01b031660009081526020819052604090205490565b3480156105aa57600080fd5b506102ea610cb9565b3480156105bf57600080fd5b50600c546102ad906001600160a01b031681565b3480156105df57600080fd5b506102ea6105ee36600461209d565b610ccd565b3480156105ff57600080fd5b5061038f601e5481565b34801561061557600080fd5b506005546001600160a01b03166102ad565b34801561063357600080fd5b50600d546102ad906001600160a01b031681565b34801561065357600080fd5b5061038f600f5481565b34801561066957600080fd5b50610301610d38565b34801561067e57600080fd5b506102ea61068d3660046123a0565b610d47565b34801561069e57600080fd5b506102ea6106ad36600461212e565b610e87565b3480156106be57600080fd5b5061038f60115481565b3480156106d457600080fd5b5061038f60125481565b3480156106ea57600080fd5b5061034e6106f9366004612163565b610e99565b34801561070a57600080fd5b5061034e610719366004612163565b610f14565b34801561072a57600080fd5b5061038f601c5481565b34801561074057600080fd5b5061034e61074f36600461218f565b60176020526000908152604090205460ff1681565b34801561077057600080fd5b506102ea61077f36600461218f565b610f22565b34801561079057600080fd5b506102ea61079f366004612385565b610f92565b3480156107b057600080fd5b5061038f6107bf3660046123e3565b610ff2565b3480156107d057600080fd5b5061038f600e5481565b3480156107e657600080fd5b5061038f60145481565b3480156107fc57600080fd5b506102ea61080b36600461218f565b61101d565b34801561081c57600080fd5b5061038f60135481565b61082e6110a9565b61084081670de0b6b3a7640000612432565b9050600061085b60085460095461109690919063ffffffff16565b9050600061087e826108786009548661110390919063ffffffff16565b9061110f565b9050600061089b836108786008548761110390919063ffffffff16565b90506108a68461111b565b6009546108b390836112d5565b6009556008546108c390826112d5565b60085550505050565b6060600380546108db90612449565b80601f016020809104026020016040519081016040528092919081815260200182805461090790612449565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b6109666110a9565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000336109d38185856112e1565b60019150505b92915050565b6109e76110a9565b6001600160a01b038116600081815260166020908152604091829020805460ff19166001179055600d80546001600160a01b0319168417905590519182527f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa91015b60405180910390a150565b610a5c6110a9565b8051825114610ab25760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064015b60405180910390fd5b60c882511115610b0f5760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610aa9565b60005b8251811015610b8a576000838281518110610b2f57610b2f612483565b602002602001015190506000838381518110610b4d57610b4d612483565b6020026020010151670de0b6b3a7640000610b689190612432565b9050610b75338383611405565b50508080610b8290612499565b915050610b12565b505050565b600033610b9d8582856115d5565b610ba8858585611649565b506001949350505050565b6000336109d3818585610bc68383610ff2565b610bd091906124b2565b6112e1565b610bdd6110a9565b6001600160a01b038116600081815260166020908152604091829020805460ff19166001179055600c80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610a49565b610c4b6110a9565b610c5d81670de0b6b3a7640000612432565b600e5550565b610c6b6110a9565b6019805460ff1916911515919091179055565b610c866110a9565b6040514790339082156108fc029083906000818181858888f19350505050158015610cb5573d6000803e3d6000fd5b5050565b610cc16110a9565b610ccb6000611bfb565b565b610cd56110a9565b600754600160a81b900460ff1615610cec57600080fd5b6007805460ff60a81b1916600160a81b17905543601c5542601e55601d8190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6060600480546108db90612449565b610d4f6110a9565b6010869055600f8590556011849055601283905560138190556014829055610d8181610d7b8786611096565b90611096565b600a55601454601154601054610d9c9291610d7b9190611096565b600b55600a54600510801590610db557506003600b5411155b610e1b5760405162461bcd60e51b815260206004820152603160248201527f746f74616c20666565732063616e6e6f7420626520686967686572207468616e60448201527020332520627579732035252073656c6c7360781b6064820152608401610aa9565b600f54601254601354601054601154601454604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b610e8f6110a9565b610cb58282611c4d565b60003381610ea78286610ff2565b905083811015610f075760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610aa9565b610ba882868684036112e1565b6000336109d3818585611649565b610f2a6110a9565b6001600160a01b03811660008181526018602090815260408083208054600160ff199182168117909255601684529382902080549094161790925590519182527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c59101610a49565b610f9a6110a9565b60155481151560ff909116151503610fb157600080fd5b6015805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001610a49565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110256110a9565b6001600160a01b03811661108a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa9565b61109381611bfb565b50565b60006110a282846124b2565b9392505050565b6005546001600160a01b03163314610ccb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aa9565b60006110a28284612432565b60006110a282846124c5565b806000036111265750565b61112f81611ca1565b60115460105460019182916000916111479190611096565b601254600f5461115691611096565b61116091906124b2565b90506000811561117757611174478361110f565b90505b600081611191600f5460105461109690919063ffffffff16565b61119b9190612432565b90506000826111b760125460115461109690919063ffffffff16565b6111c19190612432565b9050811561122157600c546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611216576040519150601f19603f3d011682016040523d82523d6000602084013e61121b565b606091505b50909650505b801561127f57600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50909550505b7f31ea026303a62d39c4ad14716f9621f1afe3242309c2ed761d4e241ae4bf2ea96112aa82846124b2565b8780156112b45750865b6040805192835290151560208301520160405180910390a150505050505050565b60006110a282846124e7565b6001600160a01b0383166113435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa9565b6001600160a01b0382166113a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aa9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166114695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa9565b6001600160a01b0382166114cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aa9565b6001600160a01b038316600090815260208190526040902054818110156115435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610aa9565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061157a9084906124b2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115c691815260200190565b60405180910390a35b50505050565b60006115e18484610ff2565b905060001981146115cf578181101561163c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610aa9565b6115cf84848484036112e1565b6001600160a01b0383166116ae5760405162461bcd60e51b815260206004820152602660248201527f4945524332303a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610aa9565b6001600160a01b0382166117105760405162461bcd60e51b8152602060048201526024808201527f4945524332303a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa9565b600081116117725760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610aa9565b6001600160a01b0383166000908152601860205260408120548190819060ff166117ef57600754600160a81b900460ff166117ef5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610aa9565b6007546001600160a01b03908116908616036118175761180f8685611df3565b505050505050565b600754600160a01b900460ff1615801561184a57506001600160a01b03861660009081526016602052604090205460ff16155b801561186f57506001600160a01b03851660009081526016602052604090205460ff16155b15611bf0576001600160a01b0380861660009081526017602052604080822054928916825290205460ff9182169116801580156118aa575081155b156118c4576118ba888888611405565b5050505050505050565b811561196a57600f54601254601354601954929750909550935060ff161561196557601f54326000908152601b602052604090205461190391906124b2565b4210156119525760405162461bcd60e51b815260206004820152601760248201527f4f6e652053656c6c20506572203630205365636f6e64730000000000000000006044820152606401610aa9565b326000908152601b602052604090204290555b611a42565b8015611a4257601054601154601454601954929750909550935060ff1615611a4257601d54601c5461199c91906124b2565b43116119dc5760405162461bcd60e51b815260206004820152600f60248201526e109bdd59da1d08151bdbc811985cdd608a1b6044820152606401610aa9565b326000908152601a6020526040902054439003611a2f5760405162461bcd60e51b81526020600482015260116024820152704f6e65204275792070657220626c6f636b60781b6044820152606401610aa9565b326000908152601a602052604090204390555b6000611a5284610d7b8888611096565b30600090815260208190526040902054600e549192509081108015908190611a775750845b15611b93576007805460ff60a01b1916600160a01b17905560155460ff168015611aa15750600086115b8015611aaf57506000600b54115b15611b61576000611acd60085460095461109690919063ffffffff16565b90506000611aea826108786009548761110390919063ffffffff16565b90506000611b07836108786008548861110390919063ffffffff16565b90506000611b24600b546108788c8661110390919063ffffffff16565b90506000611b41600a546108788d8661110390919063ffffffff16565b90506000611b4f8284611096565b9050611b5a81611f41565b5050505050505b30600090815260208190526040902054611b7a8161111b565b50600160098190556008556007805460ff60a01b191690555b6000611ba460646108788c87611103565b9050611bb08a826112d5565b99508515611bcd57600854611bc59082611096565b600855611bde565b600954611bda9082611096565b6009555b611be98c3083611405565b5050505050505b61180f868686611405565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611cd657611cd6612483565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5391906124fa565b81600181518110611d6657611d66612483565b6001600160a01b039283166020918202929092010152600654611d8c91309116846112e1565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611dc5908590600090869030904290600401612517565b600060405180830381600087803b158015611ddf57600080fd5b505af115801561180f573d6000803e3d6000fd5b6001600160a01b038216611e535760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610aa9565b6001600160a01b03821660009081526020819052604090205481811015611ec75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610aa9565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ef69084906124e7565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000611f4e82600261110f565b90506000611f5c83836112d5565b905047611f6883611ca1565b6000611f7447836112d5565b9050611f808382611fc8565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654611fe09030906001600160a01b0316846112e1565b6006546001600160a01b031663f305d7198230856000806120096005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612071573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120969190612588565b5050505050565b6000602082840312156120af57600080fd5b5035919050565b600060208083528351808285015260005b818110156120e3578581018301518582016040015282016120c7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461109357600080fd5b8035801515811461212957600080fd5b919050565b6000806040838503121561214157600080fd5b823561214c81612104565b915061215a60208401612119565b90509250929050565b6000806040838503121561217657600080fd5b823561218181612104565b946020939093013593505050565b6000602082840312156121a157600080fd5b81356110a281612104565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121eb576121eb6121ac565b604052919050565b600067ffffffffffffffff82111561220d5761220d6121ac565b5060051b60200190565b600082601f83011261222857600080fd5b8135602061223d612238836121f3565b6121c2565b82815260059290921b8401810191818101908684111561225c57600080fd5b8286015b848110156122775780358352918301918301612260565b509695505050505050565b6000806040838503121561229557600080fd5b823567ffffffffffffffff808211156122ad57600080fd5b818501915085601f8301126122c157600080fd5b813560206122d1612238836121f3565b82815260059290921b840181019181810190898411156122f057600080fd5b948201945b8386101561231757853561230881612104565b825294820194908201906122f5565b9650508601359250508082111561232d57600080fd5b5061233a85828601612217565b9150509250929050565b60008060006060848603121561235957600080fd5b833561236481612104565b9250602084013561237481612104565b929592945050506040919091013590565b60006020828403121561239757600080fd5b6110a282612119565b60008060008060008060c087890312156123b957600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156123f657600080fd5b823561240181612104565b9150602083013561241181612104565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109d9576109d961241c565b600181811c9082168061245d57607f821691505b60208210810361247d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016124ab576124ab61241c565b5060010190565b808201808211156109d9576109d961241c565b6000826124e257634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109d9576109d961241c565b60006020828403121561250c57600080fd5b81516110a281612104565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125675784516001600160a01b031683529383019391830191600101612542565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561259d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206a4e4e59bb9123df4fc747fd9ce119a85f7197f1088668446e1c74135459b2b564736f6c63430008110033

Deployed Bytecode Sourcemap

32320:14272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32454:64;;;;;;;;;;-1:-1:-1;32454:64:0;;;;-1:-1:-1;;;;;32454:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;32454:64:0;;;;;;;;44507:443;;;;;;;;;;-1:-1:-1;44507:443:0;;;;;:::i;:::-;;:::i;:::-;;7201:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36868:181::-;;;;;;;;;;-1:-1:-1;36868:181:0;;;;;:::i;:::-;;:::i;9552:201::-;;;;;;;;;;-1:-1:-1;9552:201:0;;;;;:::i;:::-;;:::i;:::-;;;2066:14:1;;2059:22;2041:41;;2029:2;2014:18;9552:201:0;1901:187:1;32404:41:0;;;;;;;;;;-1:-1:-1;32404:41:0;;;;-1:-1:-1;;;;;32404:41:0;;;8321:108;;;;;;;;;;-1:-1:-1;8409:12:0;;8321:108;;;2474:25:1;;;2462:2;2447:18;8321:108:0;2328:177:1;33676:33:0;;;;;;;;;;;;;;;;36667:187;;;;;;;;;;-1:-1:-1;36667:187:0;;;;;:::i;:::-;;:::i;46026:561::-;;;;;;;;;;-1:-1:-1;46026:561:0;;;;;:::i;:::-;;:::i;10333:295::-;;;;;;;;;;-1:-1:-1;10333:295:0;;;;;:::i;:::-;;:::i;8163:93::-;;;;;;;;;;-1:-1:-1;8163:93:0;;8246:2;5852:36:1;;5840:2;5825:18;8163:93:0;5710:184:1;11037:238:0;;;;;;;;;;-1:-1:-1;11037:238:0;;;;;:::i;:::-;;:::i;33338:33::-;;;;;;;;;;-1:-1:-1;33338:33:0;;;;;;;;33091:40;;;;;;;;;;-1:-1:-1;33091:40:0;;;;;;;;32553:34;;;;;;;;;;-1:-1:-1;32553:34:0;;;;-1:-1:-1;;;32553:34:0;;;;;;38838:126;;;;;;;;;;-1:-1:-1;38838:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;38928:28:0;38904:4;38928:28;;;:19;:28;;;;;;;;;38838:126;32914:31;;;;;;;;;;;;;;;;36454:205;;;;;;;;;;-1:-1:-1;36454:205:0;;;;;:::i;:::-;;:::i;37318:120::-;;;;;;;;;;-1:-1:-1;37318:120:0;;;;;:::i;:::-;;:::i;37057:99::-;;;;;;;;;;-1:-1:-1;37057:99:0;;;;;:::i;:::-;;:::i;37164:146::-;;;;;;;;;;;;;:::i;8492:127::-;;;;;;;;;;-1:-1:-1;8492:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;8593:18:0;8566:7;8593:18;;;;;;;;;;;;8492:127;2539:103;;;;;;;;;;;;;:::i;32746:38::-;;;;;;;;;;-1:-1:-1;32746:38:0;;;;-1:-1:-1;;;;;32746:38:0;;;35868:290;;;;;;;;;;-1:-1:-1;35868:290:0;;;;;:::i;:::-;;:::i;33638:30::-;;;;;;;;;;;;;;;;1891:87;;;;;;;;;;-1:-1:-1;1964:6:0;;-1:-1:-1;;;;;1964:6:0;1891:87;;32792:32;;;;;;;;;;-1:-1:-1;32792:32:0;;;;-1:-1:-1;;;;;32792:32:0;;;32875;;;;;;;;;;;;;;;;7420:104;;;;;;;;;;;;;:::i;38006:824::-;;;;;;;;;;-1:-1:-1;38006:824:0;;;;;:::i;:::-;;:::i;37662:140::-;;;;;;;;;;-1:-1:-1;37662:140:0;;;;;:::i;:::-;;:::i;32952:24::-;;;;;;;;;;;;;;;;32983:25;;;;;;;;;;;;;;;;11778:436;;;;;;;;;;-1:-1:-1;11778:436:0;;;;;:::i;:::-;;:::i;8825:193::-;;;;;;;;;;-1:-1:-1;8825:193:0;;;;;:::i;:::-;;:::i;33554:26::-;;;;;;;;;;;;;;;;33199:57;;;;;;;;;;-1:-1:-1;33199:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36225:213;;;;;;;;;;-1:-1:-1;36225:213:0;;;;;:::i;:::-;;:::i;37446:208::-;;;;;;;;;;-1:-1:-1;37446:208:0;;;;;:::i;:::-;;:::i;9081:151::-;;;;;;;;;;-1:-1:-1;9081:151:0;;;;;:::i;:::-;;:::i;32835:33::-;;;;;;;;;;;;;;;;33053:30;;;;;;;;;;;;;;;;2797:201;;;;;;;;;;-1:-1:-1;2797:201:0;;;;;:::i;:::-;;:::i;33015:31::-;;;;;;;;;;;;;;;;44507:443;1777:13;:11;:13::i;:::-;44595:17:::1;:6:::0;44605::::1;44595:17;:::i;:::-;44586:26;;44623:19;44645:25;44659:10;;44645:9;;:13;;:25;;;;:::i;:::-;44623:47;;44681:15;44699:38;44725:11;44699:21;44710:9;;44699:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;44681:56;;44748:16;44767:39;44794:11;44767:22;44778:10;;44767:6;:10;;:22;;;;:::i;:39::-;44748:58;;44819:28;44840:6;44819:20;:28::i;:::-;44872:9;::::0;:22:::1;::::0;44886:7;44872:13:::1;:22::i;:::-;44860:9;:34:::0;44918:10:::1;::::0;:24:::1;::::0;44933:8;44918:14:::1;:24::i;:::-;44905:10;:37:::0;-1:-1:-1;;;;44507:443:0:o;7201:100::-;7255:13;7288:5;7281:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7201:100;:::o;36868:181::-;1777:13;:11;:13::i;:::-;-1:-1:-1;;;;;36952:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;36952:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37007:34;;2041:41:1;;;37007:34:0::1;::::0;2014:18:1;37007:34:0::1;;;;;;;36868:181:::0;;:::o;9552:201::-;9635:4;680:10;9691:32;680:10;9707:7;9716:6;9691:8;:32::i;:::-;9741:4;9734:11;;;9552:201;;;;;:::o;36667:187::-;1777:13;:11;:13::i;:::-;-1:-1:-1;;;;;36735:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;36735:34:0::1;36765:4;36735:34;::::0;;36780:9:::1;:27:::0;;-1:-1:-1;;;;;;36780:27:0::1;::::0;::::1;::::0;;36823:23;;160:51:1;;;36823:23:0::1;::::0;133:18:1;36823:23:0::1;;;;;;;;36667:187:::0;:::o;46026:561::-;1777:13;:11;:13::i;:::-;46198:6:::1;:13;46173:14;:21;:38;46165:81;;;::::0;-1:-1:-1;;;46165:81:0;;8121:2:1;46165:81:0::1;::::0;::::1;8103:21:1::0;8160:2;8140:18;;;8133:30;8199:32;8179:18;;;8172:60;8249:18;;46165:81:0::1;;;;;;;;;46290:3;46265:14;:21;:28;;46257:75;;;::::0;-1:-1:-1;;;46257:75:0;;8480:2:1;46257:75:0::1;::::0;::::1;8462:21:1::0;8519:2;8499:18;;;8492:30;8558:34;8538:18;;;8531:62;-1:-1:-1;;;8609:18:1;;;8602:32;8651:19;;46257:75:0::1;8278:398:1::0;46257:75:0::1;46348:9;46343:237;46367:14;:21;46363:1;:25;46343:237;;;46410:14;46427;46442:1;46427:17;;;;;;;;:::i;:::-;;;;;;;46410:34;;46459:21;46483:6;46490:1;46483:9;;;;;;;;:::i;:::-;;;;;;;46496:6;46483:20;;;;:::i;:::-;46459:44;;46518:50;46534:10;46546:6;46554:13;46518:15;:50::i;:::-;46395:185;;46390:3;;;;;:::i;:::-;;;;46343:237;;;;46026:561:::0;;:::o;10333:295::-;10464:4;680:10;10522:38;10538:4;680:10;10553:6;10522:15;:38::i;:::-;10571:27;10581:4;10587:2;10591:6;10571:9;:27::i;:::-;-1:-1:-1;10616:4:0;;10333:295;-1:-1:-1;;;;10333:295:0:o;11037:238::-;11125:4;680:10;11181:64;680:10;11197:7;11234:10;11206:25;680:10;11197:7;11206:9;:25::i;:::-;:38;;;;:::i;:::-;11181:8;:64::i;36454:205::-;1777:13;:11;:13::i;:::-;-1:-1:-1;;;;;36528:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;36528:34:0::1;36558:4;36528:34;::::0;;36573:15:::1;:33:::0;;-1:-1:-1;;;;;;36573:33:0::1;::::0;::::1;::::0;;36622:29;;160:51:1;;;36622:29:0::1;::::0;133:18:1;36622:29:0::1;14:203:1::0;37318:120:0;1777:13;:11;:13::i;:::-;37413:17:::1;:6:::0;37423::::1;37413:17;:::i;:::-;37392:18;:38:::0;-1:-1:-1;37318:120:0:o;37057:99::-;1777:13;:11;:13::i;:::-;37126:14:::1;:22:::0;;-1:-1:-1;;37126:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37057:99::o;37164:146::-;1777:13;:11;:13::i;:::-;37263:39:::1;::::0;37231:21:::1;::::0;37271:10:::1;::::0;37263:39;::::1;;;::::0;37231:21;;37211:17:::1;37263:39:::0;37211:17;37263:39;37231:21;37271:10;37263:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;37200:110;37164:146::o:0;2539:103::-;1777:13;:11;:13::i;:::-;2604:30:::1;2631:1;2604:18;:30::i;:::-;2539:103::o:0;35868:290::-;1777:13;:11;:13::i;:::-;35953:14:::1;::::0;-1:-1:-1;;;35953:14:0;::::1;;;35952:15;35944:24;;;::::0;::::1;;35979:14;:21:::0;;-1:-1:-1;;;;35979:21:0::1;-1:-1:-1::0;;;35979:21:0::1;::::0;;36025:12:::1;36011:11;:26:::0;36066:15:::1;36048;:33:::0;36092:10:::1;:26:::0;;;36134:16:::1;::::0;::::1;::::0;35979:21;;36134:16:::1;35868:290:::0;:::o;7420:104::-;7476:13;7509:7;7502:14;;;;;:::i;38006:824::-;1777:13;:11;:13::i;:::-;38204:16:::1;:31:::0;;;38246:17:::1;:33:::0;;;38290:9:::1;:18:::0;;;38319:10:::1;:20:::0;;;38350:16:::1;:32:::0;;;38393:15:::1;:30:::0;;;38452:55:::1;38369:13:::0;38452:33:::1;38266:13:::0;38332:7;38452:21:::1;:33::i;:::-;:37:::0;::::1;:55::i;:::-;38436:13;:71:::0;38569:15:::1;::::0;38554:9:::1;::::0;38533:16:::1;::::0;:52:::1;::::0;38569:15;38533:31:::1;::::0;:16;:20:::1;:31::i;:52::-;38518:12;:67:::0;38606:13:::1;::::0;38623:1:::1;-1:-1:-1::0;38606:18:0;::::1;::::0;:39:::1;;;38644:1;38628:12;;:17;;38606:39;38598:101;;;::::0;-1:-1:-1;;;38598:101:0;;9285:2:1;38598:101:0::1;::::0;::::1;9267:21:1::0;9324:2;9304:18;;;9297:30;9363:34;9343:18;;;9336:62;-1:-1:-1;;;9414:18:1;;;9407:47;9471:19;;38598:101:0::1;9083:413:1::0;38598:101:0::1;38728:17;::::0;38747:10:::1;::::0;38759:16:::1;::::0;38777::::1;::::0;38795:9:::1;::::0;38806:15:::1;::::0;38717:105:::1;::::0;;9788:25:1;;;9844:2;9829:18;;9822:34;;;;9872:18;;;9865:34;;;;9930:2;9915:18;;9908:34;9973:3;9958:19;;9951:35;10017:3;10002:19;;9995:35;38717:105:0::1;::::0;9775:3:1;9760:19;38717:105:0::1;;;;;;;38006:824:::0;;;;;;:::o;37662:140::-;1777:13;:11;:13::i;:::-;37753:41:::1;37782:4;37788:5;37753:28;:41::i;11778:436::-:0;11871:4;680:10;11871:4;11954:25;680:10;11971:7;11954:9;:25::i;:::-;11927:52;;12018:15;11998:16;:35;;11990:85;;;;-1:-1:-1;;;11990:85:0;;10243:2:1;11990:85:0;;;10225:21:1;10282:2;10262:18;;;10255:30;10321:34;10301:18;;;10294:62;-1:-1:-1;;;10372:18:1;;;10365:35;10417:19;;11990:85:0;10041:401:1;11990:85:0;12111:60;12120:5;12127:7;12155:15;12136:16;:34;12111:8;:60::i;8825:193::-;8904:4;680:10;8960:28;680:10;8977:2;8981:6;8960:9;:28::i;36225:213::-;1777:13;:11;:13::i;:::-;-1:-1:-1;;;;;36297:41:0;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;36341:4:::1;-1:-1:-1::0;;36297:48:0;;::::1;::::0;::::1;::::0;;;36356:19:::1;:27:::0;;;;;;:34;;;;::::1;;::::0;;;36406:24;;160:51:1;;;36406:24:0::1;::::0;133:18:1;36406:24:0::1;14:203:1::0;37446:208:0;1777:13;:11;:13::i;:::-;37526:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;37518:41:::1;;;::::0;::::1;;37570:21;:31:::0;;-1:-1:-1;;37570:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37617:29:::1;::::0;2041:41:1;;;37617:29:0::1;::::0;2029:2:1;2014:18;37617:29:0::1;1901:187:1::0;9081:151:0;-1:-1:-1;;;;;9197:18:0;;;9170:7;9197:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9081:151::o;2797:201::-;1777:13;:11;:13::i;:::-;-1:-1:-1;;;;;2886:22:0;::::1;2878:73;;;::::0;-1:-1:-1;;;2878:73:0;;10649:2:1;2878:73:0::1;::::0;::::1;10631:21:1::0;10688:2;10668:18;;;10661:30;10727:34;10707:18;;;10700:62;-1:-1:-1;;;10778:18:1;;;10771:36;10824:19;;2878:73:0::1;10447:402:1::0;2878:73:0::1;2962:28;2981:8;2962:18;:28::i;:::-;2797:201:::0;:::o;20337:98::-;20395:7;20422:5;20426:1;20422;:5;:::i;:::-;20415:12;20337:98;-1:-1:-1;;;20337:98:0:o;2056:132::-;1964:6;;-1:-1:-1;;;;;1964:6:0;680:10;2120:23;2112:68;;;;-1:-1:-1;;;2112:68:0;;11056:2:1;2112:68:0;;;11038:21:1;;;11075:18;;;11068:30;11134:34;11114:18;;;11107:62;11186:18;;2112:68:0;10854:356:1;21075:98:0;21133:7;21160:5;21164:1;21160;:5;:::i;21474:98::-;21532:7;21559:5;21563:1;21559;:5;:::i;44983:1031::-;45052:6;45062:1;45052:11;45048:50;;44983:1031;:::o;45048:50::-;45108:24;45125:6;45108:16;:24::i;:::-;45299:9;;45278:16;;45160:4;;;;45145:12;;45278:31;;:16;:20;:31::i;:::-;45264:10;;45242:17;;:33;;:21;:33::i;:::-;:67;;;;:::i;:::-;45218:91;-1:-1:-1;45322:19:0;45356:17;;45352:104;;45404:40;:21;45430:13;45404:25;:40::i;:::-;45390:54;;45352:104;45466:23;45534:11;45492:39;45513:17;;45492:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;45466:79;;45556:17;45604:11;45576:25;45590:10;;45576:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;45556:59;-1:-1:-1;45640:19:0;;45636:123;;45698:15;;45690:57;;-1:-1:-1;;;;;45698:15:0;;;;45727;;45690:57;;;;45727:15;45698;45690:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45676:71:0;;-1:-1:-1;;45636:123:0;45783:13;;45779:108;;45838:9;;45830:45;;-1:-1:-1;;;;;45838:9:0;;;;45861;;45830:45;;;;45861:9;45838;45830:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45813:62:0;;-1:-1:-1;;45779:108:0;45904:102;45932:27;45950:9;45932:15;:27;:::i;:::-;45974:7;:21;;;;;45985:10;45974:21;45904:102;;;11815:25:1;;;11883:14;;11876:22;11871:2;11856:18;;11849:50;11788:18;45904:102:0;;;;;;;45037:977;;;;;;44983:1031;:::o;20718:98::-;20776:7;20803:5;20807:1;20803;:5;:::i;15403:380::-;-1:-1:-1;;;;;15539:19:0;;15531:68;;;;-1:-1:-1;;;15531:68:0;;12245:2:1;15531:68:0;;;12227:21:1;12284:2;12264:18;;;12257:30;12323:34;12303:18;;;12296:62;-1:-1:-1;;;12374:18:1;;;12367:34;12418:19;;15531:68:0;12043:400:1;15531:68:0;-1:-1:-1;;;;;15618:21:0;;15610:68;;;;-1:-1:-1;;;15610:68:0;;12650:2:1;15610:68:0;;;12632:21:1;12689:2;12669:18;;;12662:30;12728:34;12708:18;;;12701:62;-1:-1:-1;;;12779:18:1;;;12772:32;12821:19;;15610:68:0;12448:398:1;15610:68:0;-1:-1:-1;;;;;15691:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15743:32;;2474:25:1;;;15743:32:0;;2447:18:1;15743:32:0;;;;;;;15403:380;;;:::o;12684:671::-;-1:-1:-1;;;;;12815:18:0;;12807:68;;;;-1:-1:-1;;;12807:68:0;;13053:2:1;12807:68:0;;;13035:21:1;13092:2;13072:18;;;13065:30;13131:34;13111:18;;;13104:62;-1:-1:-1;;;13182:18:1;;;13175:35;13227:19;;12807:68:0;12851:401:1;12807:68:0;-1:-1:-1;;;;;12894:16:0;;12886:64;;;;-1:-1:-1;;;12886:64:0;;13459:2:1;12886:64:0;;;13441:21:1;13498:2;13478:18;;;13471:30;13537:34;13517:18;;;13510:62;-1:-1:-1;;;13588:18:1;;;13581:33;13631:19;;12886:64:0;13257:399:1;12886:64:0;-1:-1:-1;;;;;13036:15:0;;13014:19;13036:15;;;;;;;;;;;13070:21;;;;13062:72;;;;-1:-1:-1;;;13062:72:0;;13863:2:1;13062:72:0;;;13845:21:1;13902:2;13882:18;;;13875:30;13941:34;13921:18;;;13914:62;-1:-1:-1;;;13992:18:1;;;13985:36;14038:19;;13062:72:0;13661:402:1;13062:72:0;-1:-1:-1;;;;;13170:15:0;;;:9;:15;;;;;;;;;;;13188:20;;;13170:38;;13230:13;;;;;;;;:23;;13202:6;;13170:9;13230:23;;13202:6;;13230:23;:::i;:::-;;;;;;;;13286:2;-1:-1:-1;;;;;13271:26:0;13280:4;-1:-1:-1;;;;;13271:26:0;;13290:6;13271:26;;;;2474:25:1;;2462:2;2447:18;;2328:177;13271:26:0;;;;;;;;13310:37;12796:559;12684:671;;;:::o;16074:453::-;16209:24;16236:25;16246:5;16253:7;16236:9;:25::i;:::-;16209:52;;-1:-1:-1;;16276:16:0;:37;16272:248;;16358:6;16338:16;:26;;16330:68;;;;-1:-1:-1;;;16330:68:0;;14270:2:1;16330:68:0;;;14252:21:1;14309:2;14289:18;;;14282:30;14348:31;14328:18;;;14321:59;14397:18;;16330:68:0;14068:353:1;16330:68:0;16442:51;16451:5;16458:7;16486:6;16467:16;:25;16442:8;:51::i;38972:4021::-;-1:-1:-1;;;;;39072:18:0;;39064:69;;;;-1:-1:-1;;;39064:69:0;;14628:2:1;39064:69:0;;;14610:21:1;14667:2;14647:18;;;14640:30;14706:34;14686:18;;;14679:62;-1:-1:-1;;;14757:18:1;;;14750:36;14803:19;;39064:69:0;14426:402:1;39064:69:0;-1:-1:-1;;;;;39152:16:0;;39144:65;;;;-1:-1:-1;;;39144:65:0;;15035:2:1;39144:65:0;;;15017:21:1;15074:2;15054:18;;;15047:30;15113:34;15093:18;;;15086:62;-1:-1:-1;;;15164:18:1;;;15157:34;15208:19;;39144:65:0;14833:400:1;39144:65:0;39237:1;39228:6;:10;39220:64;;;;-1:-1:-1;;;39220:64:0;;15440:2:1;39220:64:0;;;15422:21:1;15479:2;15459:18;;;15452:30;15518:34;15498:18;;;15491:62;-1:-1:-1;;;15569:18:1;;;15562:39;15618:19;;39220:64:0;15238:405:1;39220:64:0;-1:-1:-1;;;;;39392:39:0;;39297:21;39392:39;;;:33;:39;;;;;;39297:21;;;;39392:39;;39387:142;;39456:14;;-1:-1:-1;;;39456:14:0;;;;39448:59;;;;-1:-1:-1;;;39448:59:0;;15850:2:1;39448:59:0;;;15832:21:1;;;15869:18;;;15862:30;15928:34;15908:18;;;15901:62;15980:18;;39448:59:0;15648:356:1;39448:59:0;39551:4;;-1:-1:-1;;;;;39551:4:0;;;39545:10;;;;39541:3397;;39572:19;39578:4;39584:6;39572:5;:19::i;:::-;39606:7;;;38972:4021;;;:::o;39541:3397::-;39668:8;;-1:-1:-1;;;39668:8:0;;;;39667:9;:39;;;;-1:-1:-1;;;;;;39681:25:0;;;;;;:19;:25;;;;;;;;39680:26;39667:39;:67;;;;-1:-1:-1;;;;;;39711:23:0;;;;;;:19;:23;;;;;;;;39710:24;39667:67;39649:3289;;;-1:-1:-1;;;;;39768:29:0;;;39751:14;39768:29;;;:25;:29;;;;;;;39828:31;;;;;;;;39768:29;;;;;39828:31;39904:9;;:23;;;;;39918:9;39917:10;39904:23;39900:1156;;;39948:33;39964:4;39970:2;39974:6;39948:15;:33::i;:::-;40000:7;;;;;38972:4021;;;:::o;39900:1156::-;40071:9;40067:989;;;40117:17;;40162:10;;40206:16;;40247:14;;40117:17;;-1:-1:-1;40162:10:0;;-1:-1:-1;40206:16:0;-1:-1:-1;40247:14:0;;40243:270;;;40351:13;;40338:9;40309:39;;;;:28;:39;;;;;;:55;;40351:13;40309:55;:::i;:::-;40290:15;:74;;40282:135;;;;-1:-1:-1;;;40282:135:0;;16211:2:1;40282:135:0;;;16193:21:1;16250:2;16230:18;;;16223:30;16289:25;16269:18;;;16262:53;16332:18;;40282:135:0;16009:347:1;40282:135:0;40465:9;40436:39;;;;:28;:39;;;;;40478:15;40436:57;;40243:270;40067:989;;;40566:8;40562:494;;;40611:16;;40655:9;;40698:15;;40738:14;;40611:16;;-1:-1:-1;40655:9:0;;-1:-1:-1;40698:15:0;-1:-1:-1;40738:14:0;;40734:305;;;40814:10;;40800:11;;:24;;;;:::i;:::-;40785:12;:39;40777:66;;;;-1:-1:-1;;;40777:66:0;;16563:2:1;40777:66:0;;;16545:21:1;16602:2;16582:18;;;16575:30;-1:-1:-1;;;16621:18:1;;;16614:45;16676:18;;40777:66:0;16361:339:1;40777:66:0;40899:9;40874:35;;;;:24;:35;;;;;;40913:12;40874:51;;40866:80;;;;-1:-1:-1;;;40866:80:0;;16907:2:1;40866:80:0;;;16889:21:1;16946:2;16926:18;;;16919:30;-1:-1:-1;;;16965:18:1;;;16958:47;17022:18;;40866:80:0;16705:341:1;40866:80:0;40994:9;40969:35;;;;:24;:35;;;;;41007:12;40969:50;;40734:305;41072:17;41092:43;41122:12;41092:25;:13;41110:6;41092:17;:25::i;:43::-;41201:4;41152:28;8593:18;;;;;;;;;;;41263;;41072:63;;-1:-1:-1;8593:18:0;41239:42;;;;;;;41302:20;;;41313:9;41302:20;41298:1281;;;41343:8;:15;;-1:-1:-1;;;;41343:15:0;-1:-1:-1;;;41343:15:0;;;41396:21;;41343:15;41396:21;:41;;;;;41436:1;41421:12;:16;41396:41;:61;;;;;41456:1;41441:12;;:16;41396:61;41392:903;;;41482:20;41505:25;41519:10;;41505:9;;:13;;:25;;;;:::i;:::-;41482:48;;41553:24;41580:105;41672:12;41580:61;41631:9;;41580:20;:50;;:61;;;;:::i;:105::-;41553:132;;41708:22;41733:106;41826:12;41733:62;41784:10;;41733:20;:50;;:62;;;;:::i;:106::-;41708:131;;41864:21;41888:104;41979:12;;41888:60;41935:12;41888:16;:46;;:60;;;;:::i;:104::-;41864:128;;42017:22;42042:103;42131:13;;42042:58;42087:12;42042:14;:44;;:58;;;;:::i;:103::-;42017:128;-1:-1:-1;42170:18:0;42191:33;42017:128;42210:13;42191:18;:33::i;:::-;42170:54;;42249:26;42264:10;42249:14;:26::i;:::-;41459:836;;;;;;41392:903;42405:4;42365:19;8593:18;;;;;;;;;;;42430:33;8593:18;42430:20;:33::i;:::-;-1:-1:-1;42494:1:0;42482:9;:13;;;42514:10;:14;42547:8;:16;;-1:-1:-1;;;;42547:16:0;;;41298:1281;42595:12;42610:30;42636:3;42610:21;:6;42621:9;42610:10;:21::i;:30::-;42595:45;-1:-1:-1;42666:16:0;:6;42595:45;42666:10;:16::i;:::-;42657:25;;42703:9;42699:155;;;42746:10;;:20;;42761:4;42746:14;:20::i;:::-;42733:10;:33;42699:155;;;42819:9;;:19;;42833:4;42819:13;:19::i;:::-;42807:9;:31;42699:155;42870:42;42886:4;42900;42907;42870:15;:42::i;:::-;39736:3202;;;;;;39649:3289;42950:33;42966:4;42972:2;42976:6;42950:15;:33::i;3158:191::-;3251:6;;;-1:-1:-1;;;;;3268:17:0;;;-1:-1:-1;;;;;;3268:17:0;;;;;;;3301:40;;3251:6;;;3268:17;3251:6;;3301:40;;3232:16;;3301:40;3221:128;3158:191;:::o;37810:188::-;-1:-1:-1;;;;;37893:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;37893:39:0;;;;;;;;;;37950:40;;37893:39;;:31;37950:40;;;37810:188;;:::o;43479:499::-;43569:16;;;43583:1;43569:16;;;;;;;;43545:21;;43569:16;;;;;;;;;;-1:-1:-1;43569:16:0;43545:40;;43614:4;43596;43601:1;43596:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43596:23:0;;;:7;;;;;;;;;;:23;;;;43640:15;;:22;;;-1:-1:-1;;;43640:22:0;;;;:15;;;;;:20;;:22;;;;;43596:7;;43640:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43630:4;43635:1;43630:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43630:32:0;;;:7;;;;;;;;;:32;43705:15;;43673:62;;43690:4;;43705:15;43723:11;43673:8;:62::i;:::-;43746:15;;:224;;-1:-1:-1;;;43746:224:0;;-1:-1:-1;;;;;43746:15:0;;;;:66;;:224;;43827:11;;43746:15;;43897:4;;43924;;43944:15;;43746:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14374:591;-1:-1:-1;;;;;14458:21:0;;14450:67;;;;-1:-1:-1;;;14450:67:0;;18494:2:1;14450:67:0;;;18476:21:1;18533:2;18513:18;;;18506:30;18572:34;18552:18;;;18545:62;-1:-1:-1;;;18623:18:1;;;18616:31;18664:19;;14450:67:0;18292:397:1;14450:67:0;-1:-1:-1;;;;;14617:18:0;;14592:22;14617:18;;;;;;;;;;;14654:24;;;;14646:71;;;;-1:-1:-1;;;14646:71:0;;18896:2:1;14646:71:0;;;18878:21:1;18935:2;18915:18;;;18908:30;18974:34;18954:18;;;18947:62;-1:-1:-1;;;19025:18:1;;;19018:32;19067:19;;14646:71:0;18694:398:1;14646:71:0;-1:-1:-1;;;;;14753:18:0;;:9;:18;;;;;;;;;;14774:23;;;14753:44;;14819:12;:22;;14791:6;;14753:9;14819:22;;14791:6;;14819:22;:::i;:::-;;;;-1:-1:-1;;14859:37:0;;2474:25:1;;;14885:1:0;;-1:-1:-1;;;;;14859:37:0;;;;;2462:2:1;2447:18;14859:37:0;;;;;;;46343:237:::1;46026:561:::0;;:::o;43001:470::-;43060:12;43075:13;:6;43086:1;43075:10;:13::i;:::-;43060:28;-1:-1:-1;43099:17:0;43119:16;:6;43060:28;43119:10;:16::i;:::-;43099:36;-1:-1:-1;43171:21:0;43203:22;43220:4;43203:16;:22::i;:::-;43296:18;43317:41;:21;43343:14;43317:25;:41::i;:::-;43296:62;;43369:35;43382:9;43393:10;43369:12;:35::i;:::-;43420:43;;;19299:25:1;;;19355:2;19340:18;;19333:34;;;19383:18;;;19376:34;;;43420:43:0;;19287:2:1;19272:18;43420:43:0;;;;;;;43049:422;;;;43001:470;:::o;43986:513::-;44166:15;;44134:62;;44151:4;;-1:-1:-1;;;;;44166:15:0;44184:11;44134:8;:62::i;:::-;44239:15;;-1:-1:-1;;;;;44239:15:0;:31;44278:9;44311:4;44331:11;44239:15;;44443:7;1964:6;;-1:-1:-1;;;;;1964:6:0;;1891:87;44443:7;44239:252;;;;;;-1:-1:-1;;;;;;44239:252:0;;;-1:-1:-1;;;;;19780:15:1;;;44239:252:0;;;19762:34:1;19812:18;;;19805:34;;;;19855:18;;;19848:34;;;;19898:18;;;19891:34;19962:15;;;19941:19;;;19934:44;44465:15:0;19994:19:1;;;19987:35;19696:19;;44239:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;43986:513;;:::o;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:548::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:160;1161:20;;1217:13;;1210:21;1200:32;;1190:60;;1246:1;1243;1236:12;1190:60;1096:160;;;:::o;1261:315::-;1326:6;1334;1387:2;1375:9;1366:7;1362:23;1358:32;1355:52;;;1403:1;1400;1393:12;1355:52;1442:9;1429:23;1461:31;1486:5;1461:31;:::i;:::-;1511:5;-1:-1:-1;1535:35:1;1566:2;1551:18;;1535:35;:::i;:::-;1525:45;;1261:315;;;;;:::o;1581:::-;1649:6;1657;1710:2;1698:9;1689:7;1685:23;1681:32;1678:52;;;1726:1;1723;1716:12;1678:52;1765:9;1752:23;1784:31;1809:5;1784:31;:::i;:::-;1834:5;1886:2;1871:18;;;;1858:32;;-1:-1:-1;;;1581:315:1:o;2510:247::-;2569:6;2622:2;2610:9;2601:7;2597:23;2593:32;2590:52;;;2638:1;2635;2628:12;2590:52;2677:9;2664:23;2696:31;2721:5;2696:31;:::i;2762:127::-;2823:10;2818:3;2814:20;2811:1;2804:31;2854:4;2851:1;2844:15;2878:4;2875:1;2868:15;2894:275;2965:2;2959:9;3030:2;3011:13;;-1:-1:-1;;3007:27:1;2995:40;;3065:18;3050:34;;3086:22;;;3047:62;3044:88;;;3112:18;;:::i;:::-;3148:2;3141:22;2894:275;;-1:-1:-1;2894:275:1:o;3174:183::-;3234:4;3267:18;3259:6;3256:30;3253:56;;;3289:18;;:::i;:::-;-1:-1:-1;3334:1:1;3330:14;3346:4;3326:25;;3174:183::o;3362:662::-;3416:5;3469:3;3462:4;3454:6;3450:17;3446:27;3436:55;;3487:1;3484;3477:12;3436:55;3523:6;3510:20;3549:4;3573:60;3589:43;3629:2;3589:43;:::i;:::-;3573:60;:::i;:::-;3667:15;;;3753:1;3749:10;;;;3737:23;;3733:32;;;3698:12;;;;3777:15;;;3774:35;;;3805:1;3802;3795:12;3774:35;3841:2;3833:6;3829:15;3853:142;3869:6;3864:3;3861:15;3853:142;;;3935:17;;3923:30;;3973:12;;;;3886;;3853:142;;;-1:-1:-1;4013:5:1;3362:662;-1:-1:-1;;;;;;3362:662:1:o;4029:1215::-;4147:6;4155;4208:2;4196:9;4187:7;4183:23;4179:32;4176:52;;;4224:1;4221;4214:12;4176:52;4264:9;4251:23;4293:18;4334:2;4326:6;4323:14;4320:34;;;4350:1;4347;4340:12;4320:34;4388:6;4377:9;4373:22;4363:32;;4433:7;4426:4;4422:2;4418:13;4414:27;4404:55;;4455:1;4452;4445:12;4404:55;4491:2;4478:16;4513:4;4537:60;4553:43;4593:2;4553:43;:::i;4537:60::-;4631:15;;;4713:1;4709:10;;;;4701:19;;4697:28;;;4662:12;;;;4737:19;;;4734:39;;;4769:1;4766;4759:12;4734:39;4793:11;;;;4813:217;4829:6;4824:3;4821:15;4813:217;;;4909:3;4896:17;4926:31;4951:5;4926:31;:::i;:::-;4970:18;;4846:12;;;;5008;;;;4813:217;;;5049:5;-1:-1:-1;;5092:18:1;;5079:32;;-1:-1:-1;;5123:16:1;;;5120:36;;;5152:1;5149;5142:12;5120:36;;5175:63;5230:7;5219:8;5208:9;5204:24;5175:63;:::i;:::-;5165:73;;;4029:1215;;;;;:::o;5249:456::-;5326:6;5334;5342;5395:2;5383:9;5374:7;5370:23;5366:32;5363:52;;;5411:1;5408;5401:12;5363:52;5450:9;5437:23;5469:31;5494:5;5469:31;:::i;:::-;5519:5;-1:-1:-1;5576:2:1;5561:18;;5548:32;5589:33;5548:32;5589:33;:::i;:::-;5249:456;;5641:7;;-1:-1:-1;;;5695:2:1;5680:18;;;;5667:32;;5249:456::o;5899:180::-;5955:6;6008:2;5996:9;5987:7;5983:23;5979:32;5976:52;;;6024:1;6021;6014:12;5976:52;6047:26;6063:9;6047:26;:::i;6308:523::-;6412:6;6420;6428;6436;6444;6452;6505:3;6493:9;6484:7;6480:23;6476:33;6473:53;;;6522:1;6519;6512:12;6473:53;-1:-1:-1;;6545:23:1;;;6615:2;6600:18;;6587:32;;-1:-1:-1;6666:2:1;6651:18;;6638:32;;6717:2;6702:18;;6689:32;;-1:-1:-1;6768:3:1;6753:19;;6740:33;;-1:-1:-1;6820:3:1;6805:19;6792:33;;-1:-1:-1;6308:523:1;-1:-1:-1;6308:523:1:o;6836:388::-;6904:6;6912;6965:2;6953:9;6944:7;6940:23;6936:32;6933:52;;;6981:1;6978;6971:12;6933:52;7020:9;7007:23;7039:31;7064:5;7039:31;:::i;:::-;7089:5;-1:-1:-1;7146:2:1;7131:18;;7118:32;7159:33;7118:32;7159:33;:::i;:::-;7211:7;7201:17;;;6836:388;;;;;:::o;7229:127::-;7290:10;7285:3;7281:20;7278:1;7271:31;7321:4;7318:1;7311:15;7345:4;7342:1;7335:15;7361:168;7434:9;;;7465;;7482:15;;;7476:22;;7462:37;7452:71;;7503:18;;:::i;7534:380::-;7613:1;7609:12;;;;7656;;;7677:61;;7731:4;7723:6;7719:17;7709:27;;7677:61;7784:2;7776:6;7773:14;7753:18;7750:38;7747:161;;7830:10;7825:3;7821:20;7818:1;7811:31;7865:4;7862:1;7855:15;7893:4;7890:1;7883:15;7747:161;;7534:380;;;:::o;8681:127::-;8742:10;8737:3;8733:20;8730:1;8723:31;8773:4;8770:1;8763:15;8797:4;8794:1;8787:15;8813:135;8852:3;8873:17;;;8870:43;;8893:18;;:::i;:::-;-1:-1:-1;8940:1:1;8929:13;;8813:135::o;8953:125::-;9018:9;;;9039:10;;;9036:36;;;9052:18;;:::i;11215:217::-;11255:1;11281;11271:132;;11325:10;11320:3;11316:20;11313:1;11306:31;11360:4;11357:1;11350:15;11388:4;11385:1;11378:15;11271:132;-1:-1:-1;11417:9:1;;11215:217::o;11910:128::-;11977:9;;;11998:11;;;11995:37;;;12012:18;;:::i;17051:251::-;17121:6;17174:2;17162:9;17153:7;17149:23;17145:32;17142:52;;;17190:1;17187;17180:12;17142:52;17222:9;17216:16;17241:31;17266:5;17241:31;:::i;17307:980::-;17569:4;17617:3;17606:9;17602:19;17648:6;17637:9;17630:25;17674:2;17712:6;17707:2;17696:9;17692:18;17685:34;17755:3;17750:2;17739:9;17735:18;17728:31;17779:6;17814;17808:13;17845:6;17837;17830:22;17883:3;17872:9;17868:19;17861:26;;17922:2;17914:6;17910:15;17896:29;;17943:1;17953:195;17967:6;17964:1;17961:13;17953:195;;;18032:13;;-1:-1:-1;;;;;18028:39:1;18016:52;;18123:15;;;;18088:12;;;;18064:1;17982:9;17953:195;;;-1:-1:-1;;;;;;;18204:32:1;;;;18199:2;18184:18;;18177:60;-1:-1:-1;;;18268:3:1;18253:19;18246:35;18165:3;17307:980;-1:-1:-1;;;17307:980:1:o;20033:306::-;20121:6;20129;20137;20190:2;20178:9;20169:7;20165:23;20161:32;20158:52;;;20206:1;20203;20196:12;20158:52;20235:9;20229:16;20219:26;;20285:2;20274:9;20270:18;20264:25;20254:35;;20329:2;20318:9;20314:18;20308:25;20298:35;;20033:306;;;;;:::o

Swarm Source

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