ETH Price: $3,421.78 (+1.10%)
Gas: 3 Gwei

Token

AGA (AGA)
 

Overview

Max Total Supply

1,000,000,000 AGA

Holders

63

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,786,677.847448223923867964 AGA

Value
$0.00
0x6fa1974371a909f7daf04f394ea5c9781abe18f0
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:
AGA

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-06-13
*/

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


/**
🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲🇺🇲



¸¸♬·¯·♪·¯·♫¸¸ 𝓣𝓻𝓾𝓶𝓹¸¸♫·¯·♪¸♩·¯·♬¸¸


😍💞💘 𝓐𝓜𝓔𝓡𝓘𝓒𝓐 𝓖𝓡𝓔𝓐𝓣 𝓐𝓖𝓐𝓘𝓝 💔💏💖


*/

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev 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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value
    ) external returns (bool);
}

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

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    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}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token taxes, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 value
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(
                    spender,
                    currentAllowance,
                    value
                );
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

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

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

    function WETH() external pure returns (address);

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

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

contract AGA is ERC20, Ownable {

    //Wallets 
    //owner Wallet and
    /// marketing buy wallet = TaxWallet1
    address public taxWallet1;
    /// marketing sell wallet = TaxWallet2
    address public taxWallet2;

    /// MAX AMOUNT PER BUY / SELL
    uint256 public maxAmountPerTx = MAX_SUPPLY / 100;
    /// MAX WALLET AMOUNT
    uint256 public maxWalletAmount = MAX_SUPPLY / 100;
    
    /// MAX SUPPLY
    uint256 internal constant MAX_SUPPLY = 1_000_000_000 * 1e18;
    /// PERCENT_DIVISOR
    uint256 internal constant PERCENT_DIVISOR = 10000;
    /// Threshold after which collected tax is sold for eth
    uint256 public swapTokensAtAmount = MAX_SUPPLY / 100000; // = 0.001%

    /// Trading flag
    bool public trading;

    /// mapping for managing users which are excluded from taxes
    mapping(address => bool) public isExcludedFromTaxes;

    /// mapping for blacklist
    mapping(address => bool) public blacklist;
    
    ////// TAX STRUCTS //
    struct BuyTax {
        uint256 marketing;
    }

    struct SellTax {
        uint256 marketing;
    }

    BuyTax public buyTax;
    SellTax public sellTax;

    uint256 public totalBuyTax;
    uint256 public totalSellTax;
    
    /// @notice uniswapV2Router
    IUniswapV2Router public immutable uniswapV2Router;
    /// @notice uniswapPair
    address public immutable uniswapPair;
    /// swapping used during collected tokens are swapped for eth
    bool swapping;
        
    //// EVENTS

    event TaxWallet1Transferred(address indexed oldTaxWallet1,address indexed newTaxWallet1);
    event TaxWallet2Transferred(address indexed oldTaxWallet2,address indexed newTaxWallet2);

    event enabledTrading();
    event disabledTrading();

    event SellTaxesUpdated(uint256 indexed sellTax);
    event BuyTaxesUpdated(uint256 indexed buyTax);

    event collectedFee(uint256 indexed fee);

    event EthClaimed(address indexed wallet, uint256 indexed amount);


    //// MODIFIER 

    /**
     * @dev Throws if the sender is not the marketing wallet.
     */

    modifier onlyTaxWallet1() {
        require(taxWallet1 == msg.sender, "Only Tax Wallet 1 can call this function");
        _;
    }

    modifier onlyTaxWallet2() {
        require(taxWallet2 == msg.sender, "Only Tax Wallet 2 can call this function");
        _;
    }

    modifier onlyTaxWallets() {
        require(taxWallet1 == msg.sender || taxWallet2 == msg.sender, "Only Tax Wallets can call this function");
        _;
    }

    /** @notice create an erc20, initialize all required variables
     *         like owner, uniswap v2 router, taxes values and wallets values.
     *        excludes the owner and token address from taxes and limits.
     *        mints the total supply to the owner wallet.
     */

    constructor() 
        ERC20("AGA", "AGA") Ownable(msg.sender) {

        uniswapV2Router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        taxWallet1 = 0xd33fC0D40604EB90ca23fF5FA01Cd4C87fe664c2; 
        taxWallet2 = 0xd33fC0D40604EB90ca23fF5FA01Cd4C87fe664c2; 
        
        uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );
        
        // 100 = 1%  10 = 0.1%  1 = 0.01%
        buyTax = BuyTax ({
            marketing: 0
        });

        totalBuyTax = buyTax.marketing;

        sellTax = SellTax ({
            marketing: 100
        });

        totalSellTax = sellTax.marketing;

        isExcludedFromTaxes[address(this)] = true;
        isExcludedFromTaxes[msg.sender] = true;
        isExcludedFromTaxes[address(0x0)] = true;
        isExcludedFromTaxes[taxWallet1] = true;
        isExcludedFromTaxes[taxWallet2] = true;

        trading = false;

        _mint(msg.sender, MAX_SUPPLY);
    }

    /**
     * @notice to recieve ETH from uniswapV2Router when swapping
     */

    receive() external payable  {
    }

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param token The address of the ERC20 token to claim
     * @param value The amount of tokens to claim
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckERC20(
        address token,
        uint256 value,
        address wallet
    ) external onlyTaxWallets {
        ERC20 ERC20Token = ERC20(token);
        bool success = ERC20Token.transfer(wallet, value);
        require(success, "ERC20 transfer failed");
    }

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckEth(address wallet) external onlyTaxWallets {
        require(wallet != address(0), "Wallet must not be 0x0 address");
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to transfer");

        payable(wallet).transfer(balance);
        emit EthClaimed(wallet, balance);
    }

    /**
     * @notice Exclude or include an account from taxes.
     *
     * @param account The address of the account to be excluded or included.
     * @param value Boolean value indicating whether the account should
     *        be excluded (true) or included (false).
     */

    function setExcludeFromTaxes(address account, bool value) external onlyOwner {
        require(account != address(0), "Account must not be 0x0 address");
        isExcludedFromTaxes[account] = value;
    }


   /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     * To ensure no mishap when renouncing the ownership, we guarantee that trading will be enabled regardless.
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public override onlyOwner {
        enableTrading();
        super.renounceOwnership();
    }

   /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public override onlyOwner {
        isExcludedFromTaxes[owner()] = false;
        super.transferOwnership(newOwner);
        isExcludedFromTaxes[newOwner] = true;
    }

    /**
     * @notice Enable Trading
     */

    function enableTrading() public onlyOwner {
        trading = true;
        emit enabledTrading();
    }


 

    /**
     * @notice Update the Tax Wallet 1 wallet address
     * @param newTaxWallet1: The new address for the Tax wallet 1
     */

    function transferTaxWallet1(address newTaxWallet1) external onlyTaxWallet1 {
        require(newTaxWallet1 != address(0x0), "New Tax Wallet 1 must not be 0x0 address");
        isExcludedFromTaxes[taxWallet1] = false;
        isExcludedFromTaxes[newTaxWallet1] = true;
        emit TaxWallet1Transferred(taxWallet1, newTaxWallet1);
        taxWallet1 = newTaxWallet1;

    }

    /**
     * @notice Update the Tax Wallet 2 wallet address
     * @param newTaxWallet2: The new address for the Tax wallet 2
     */

    function transferTaxWallet2(address newTaxWallet2) external onlyTaxWallet2 {
        require(newTaxWallet2 != address(0x0), "New Tax Wallet 2 must not be 0x0 address");
        isExcludedFromTaxes[taxWallet2] = false;
        isExcludedFromTaxes[newTaxWallet2] = true;
        emit TaxWallet2Transferred(taxWallet2, newTaxWallet2);
        taxWallet2 = newTaxWallet2;
    }


    /**
     * @notice Renounce the Tax Wallet 1 
     */

    function renounceTaxWallet1() external onlyTaxWallet1 {
        isExcludedFromTaxes[taxWallet1] = false;
        taxWallet1 = address(0x0);
        buyTax.marketing = 0;
        totalBuyTax = 0;
    }

    /**
     * @notice Renounce the Tax Wallet 2 
     */

    function renounceTaxWallet2() external onlyTaxWallet2 {
        isExcludedFromTaxes[taxWallet2] = false;
        taxWallet2 = address(0x0);
        sellTax.marketing = 0;
        totalSellTax = 0;
    }

    /**
     * @notice Update the wallets for taxes distribution.
     *
     * @param newTaxWallet1 The address of the marketing wallet.
     * @param newTaxWallet2 The address of the marketing wallet.
     *
     */

    function setWallets(address newTaxWallet1, address newTaxWallet2) external onlyOwner {
        require(newTaxWallet1 != address(0x0), "New Tax Wallet 1 must not be 0x0 address");
        require(newTaxWallet2 != address(0x0), "New Tax Wallet 2 must not be 0x0 address");
        emit TaxWallet1Transferred(taxWallet1, newTaxWallet1);
        taxWallet1 = newTaxWallet1;
        emit TaxWallet2Transferred(taxWallet2, newTaxWallet2);
        taxWallet2 = newTaxWallet2;
    }

    /**
     * @notice Add to the blacklist. 
     *
     * @param blacklistedAddresses Array of addresses to be blacklisted
     */
     
    function addToBlacklist(address[] calldata blacklistedAddresses) external onlyOwner {
        for (uint256 i = 0; i < blacklistedAddresses.length; i++) {
            require(!isExcludedFromTaxes[blacklistedAddresses[i]], "Address is excluded from taxes, cannot blacklist");
            blacklist[blacklistedAddresses[i]] = true;
        }
    }

     /**
     * @notice Remove from the blacklist. 
     *
     * @param blacklistedAddresses Array of addresses to removed from the blacklist
     */
     
    function removeFromBlacklist(address[] calldata blacklistedAddresses) external onlyOwner {
        for (uint256 i = 0; i < blacklistedAddresses.length; i++) {
            blacklist[blacklistedAddresses[i]] = false;
        }
    }

    /**
     * @notice set max no. of tokens a user a buy/sell per tx
     * @param percent: percent of supply that a user/account can buy/sell per tx
     * min percent is limited to 1% of the total supply
     */
    function setMaxAmountPerTx(uint256 percent) external onlyOwner {
        require(percent >= 1 && PERCENT_DIVISOR >= percent, "Max amount per TX out of range");
        maxAmountPerTx = (MAX_SUPPLY * percent) / PERCENT_DIVISOR;
    }

    /**
     * @notice set max wallet amount percent
     * @param percent: percent of supply that a person can hold
     **/
    function setMaxWalletPercent(uint256 percent) external onlyOwner {
        require(percent >= 1 && PERCENT_DIVISOR >= percent, "Max wallet amount is out of range");
        maxWalletAmount = (MAX_SUPPLY * percent) / PERCENT_DIVISOR;
    }

    /**
     * @notice update swap threshold at/after collected tax is swapped for eth
     * @param tokens
     **/

    function setSwapTokensAtAmount(uint256 tokens) external onlyOwner {
        require(tokens > 1000e18, "Minimum of 1000 tokens required");
        swapTokensAtAmount = tokens;
    }


    /**
     * @notice Override for _update required by Solidity
     *  Manage fees on buy/sell and maxTxAmount/MaxWalletLimit
     **/

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

        // Check if either the sender or receiver is blacklisted
        require(!(blacklist[from] || blacklist[to]), "Address is blacklisted, aborting");

        require(trading || isExcludedFromTaxes[from] || isExcludedFromTaxes[to] 
        || (from == address(uniswapV2Router) && to == uniswapPair) || (to == address(uniswapV2Router) && from == uniswapPair), "Trading disabled, only owner can transfer");

        /*
            These addresses here are not triggering any fees
            isExcludedFromTaxes[address(this)] = true;
            isExcludedFromTaxes[msg.sender] = true;
            isExcludedFromTaxes[address(0x0)] = true;
            isExcludedFromTaxes[taxWallet1] = true;
            isExcludedFromTaxes[taxWallet2] = true;
        */      

        if (!(isExcludedFromTaxes[from] || isExcludedFromTaxes[to]) && trading) {
            uint256 fee;
            if(to != uniswapPair){
                require(amount + balanceOf(to) <= maxWalletAmount, "Max limit per wallet reached");
            }
            if (from == uniswapPair) {
                require(amount <= maxAmountPerTx, "Max buy amount per Tx exceeded");

                if (totalBuyTax > 0) {
                    fee = (amount * totalBuyTax) / PERCENT_DIVISOR;
                }
            } 
            else if (to == uniswapPair) {
                require(amount <= maxAmountPerTx, "Max sell amount per Tx exceeded");

                if (totalSellTax > 0) {
                    fee = (amount * totalSellTax) / PERCENT_DIVISOR;
                }
            }

           emit collectedFee(fee);
           
           amount = amount - fee;

            if (fee > 0) {
                super._update(from, address(this), fee);
            }
        }

        uint256 contractBalance = balanceOf(address(this));

        //Only swap into ETH when trading is happening (prevents werid Uniswap loop bugs)
        bool canSwap = contractBalance >= swapTokensAtAmount &&
            from != uniswapPair && !isExcludedFromTaxes[from] && !swapping && trading;

        if (canSwap) {
            swapping = true;
            swapAndDistribute(contractBalance);
            swapping = false;
        }

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

    /**
     * @notice The function swaps tokens for ETH, adds liquidity to the Uniswap V2 pair,
     *  and distributes fees according to the configured percentages.
     *
     * @param tokens The total amount of tokens to process for swapping and liquidity addition.
     *
     */

    function swapAndDistribute(uint256 tokens) private {
        if ((totalBuyTax > 0 || totalSellTax > 0) && tokens > 0) {
            swapForEth(tokens);
            if (address(this).balance > 0) {
                payable(taxWallet1).transfer(address(this).balance/2);
                payable(taxWallet2).transfer(address(this).balance);
            }
        }
    }

    /**
     * @notice Swaps the specified amount of tokens for ETH using the Uniswap V2 Router.
     *
     * @param tokens The amount of tokens to swap for ETH.
     *
     * @dev This function generates the Uniswap pair path for the token to WETH,
     * checks the allowance for the token with the Uniswap V2 Router, and then makes
     * the swap from tokens to ETH. It ensures that the swap supports fees on transfer tokens
     * and sets a deadline for the swap transaction.
     */
    function swapForEth(uint256 tokens) private {
        // generate the Uniswap pair path of token -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if (allowance(address(this), address(uniswapV2Router)) < tokens) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        // make the swap
        uniswapV2Router.swapExactTokensForETH(
            tokens,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"buyTax","type":"uint256"}],"name":"BuyTaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"sellTax","type":"uint256"}],"name":"SellTaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTaxWallet1","type":"address"},{"indexed":true,"internalType":"address","name":"newTaxWallet1","type":"address"}],"name":"TaxWallet1Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTaxWallet2","type":"address"},{"indexed":true,"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"TaxWallet2Transferred","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":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"collectedFee","type":"event"},{"anonymous":false,"inputs":[],"name":"disabledTrading","type":"event"},{"anonymous":false,"inputs":[],"name":"enabledTrading","type":"event"},{"inputs":[{"internalType":"address[]","name":"blacklistedAddresses","type":"address[]"}],"name":"addToBlacklist","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklistedAddresses","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludeFromTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet1","type":"address"},{"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","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":"taxWallet1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet1","type":"address"}],"name":"transferTaxWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet2","type":"address"}],"name":"transferTaxWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405261001b60646b033b2e3c9fd0803ce8000000610cfd565b60085561003560646b033b2e3c9fd0803ce8000000610cfd565b600955610051620186a06b033b2e3c9fd0803ce8000000610cfd565b600a5534801561005f575f80fd5b5060408051808201825260038082526241474160e81b602080840182905284518086019095528285528401523392906100988382610dac565b5060046100a58282610dac565b5050506001600160a01b0381166100d657604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100df81610346565b50737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526006805473d33fc0d40604eb90ca23ff5fa01cd4c87fe664c26001600160a01b031991821681179092556007805490911690911790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610169573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061018d9190610e6b565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101fe9190610e6b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610248573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026c9190610e6b565b6001600160a01b0390811660a05260408051602080820183525f91829052600e829055601082905582518082018452606490819052600f819055601155308252600c9052818120805460ff1990811660019081179092553380845284842080548316841790557f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88054831684179055600654861684528484208054831684179055600754909516835292909120805483169091179055600b80549091169055610341906b033b2e3c9fd0803ce8000000610397565b611012565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166103c05760405163ec442f0560e01b81525f60048201526024016100cd565b6103cb5f83836103cf565b5050565b6001600160a01b0383165f908152600d602052604090205460ff168061040c57506001600160a01b0382165f908152600d602052604090205460ff165b156104595760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e6760448201526064016100cd565b600b5460ff168061048157506001600160a01b0383165f908152600c602052604090205460ff165b806104a357506001600160a01b0382165f908152600c602052604090205460ff165b806104df57506080516001600160a01b0316836001600160a01b03161480156104df575060a0516001600160a01b0316826001600160a01b0316145b8061051b57506080516001600160a01b0316826001600160a01b031614801561051b575060a0516001600160a01b0316836001600160a01b0316145b6105795760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b60648201526084016100cd565b6001600160a01b0383165f908152600c602052604090205460ff16806105b657506001600160a01b0382165f908152600c602052604090205460ff165b1580156105c55750600b5460ff165b156107cd575f60a0516001600160a01b0316836001600160a01b031614610659576009546001600160a01b0384165f9081526020819052604090205461060b9084610e98565b11156106595760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c657420726561636865640000000060448201526064016100cd565b60a0516001600160a01b0316846001600160a01b0316036106f1576008548211156106c65760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e7420706572205478206578636565646564000060448201526064016100cd565b601054156106ec57612710601054836106df9190610eab565b6106e99190610cfd565b90505b610784565b60a0516001600160a01b0316836001600160a01b0316036107845760085482111561075e5760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e74207065722054782065786365656465640060448201526064016100cd565b6011541561078457612710601154836107779190610eab565b6107819190610cfd565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a26107b88183610ec2565b915080156107cb576107cb843083610881565b505b305f9081526020819052604081205490505f600a548210158015610805575060a0516001600160a01b0316856001600160a01b031614155b801561082957506001600160a01b0385165f908152600c602052604090205460ff16155b8015610838575060125460ff16155b80156108465750600b5460ff165b9050801561086f576012805460ff19166001179055610864826109a7565b6012805460ff191690555b61087a858585610881565b5050505050565b6001600160a01b0383166108ab578060025f8282546108a09190610e98565b9091555061091b9050565b6001600160a01b0383165f90815260208190526040902054818110156108fd5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100cd565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661093757600280548290039055610955565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161099a91815260200190565b60405180910390a3505050565b5f60105411806109b857505f601154115b80156109c357505f81115b15610a4d576109d181610a50565b4715610a4d576006546001600160a01b03166108fc6109f1600247610cfd565b6040518115909202915f818181858888f19350505050158015610a16573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f193505050501580156103cb573d5f803e3d5ffd5b50565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110610a8357610a83610ed5565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190610e6b565b81600181518110610b1857610b18610ed5565b60200260200101906001600160a01b031690816001600160a01b03168152505081610b4b30608051610be260201b60201c565b1015610b6557610b65306080515f19610c0e60201b60201c565b6080516001600160a01b03166318cbafe5835f8430426040518663ffffffff1660e01b8152600401610b9b959493929190610ee9565b5f604051808303815f875af1158015610bb6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bdd9190810190610f5a565b505050565b6001600160a01b038083165f908152600160209081526040808320938516835292905220545b92915050565b610bdd83838360016001600160a01b038416610c3f5760405163e602df0560e01b81525f60048201526024016100cd565b6001600160a01b038316610c6857604051634a1406b160e11b81525f60048201526024016100cd565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610ce357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610cda91815260200190565b60405180910390a35b50505050565b634e487b7160e01b5f52601160045260245ffd5b5f82610d1757634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610d4457607f821691505b602082108103610d6257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610bdd57805f5260205f20601f840160051c81016020851015610d8d5750805b601f840160051c820191505b8181101561087a575f8155600101610d99565b81516001600160401b03811115610dc557610dc5610d1c565b610dd981610dd38454610d30565b84610d68565b602080601f831160018114610e0c575f8415610df55750858301515b5f19600386901b1c1916600185901b178555610e63565b5f85815260208120601f198616915b82811015610e3a57888601518255948401946001909101908401610e1b565b5085821015610e5757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610e7b575f80fd5b81516001600160a01b0381168114610e91575f80fd5b9392505050565b80820180821115610c0857610c08610ce9565b8082028115828204841417610c0857610c08610ce9565b81810381811115610c0857610c08610ce9565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015610f395784516001600160a01b031683529383019391830191600101610f14565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215610f6b575f80fd5b82516001600160401b0380821115610f81575f80fd5b818501915085601f830112610f94575f80fd5b815181811115610fa657610fa6610d1c565b8060051b604051601f19603f83011681018181108582111715610fcb57610fcb610d1c565b604052918252848201925083810185019188831115610fe8575f80fd5b938501935b8285101561100657845184529385019392850192610fed565b98975050505050505050565b60805160a0516124116110875f395f81816105b40152818161159f01528181611617015281816116fd015281816117a90152818161185f015261197801525f81816102ab01528181611563015281816115db01528181611c9801528181611d5001528181611d800152611dbd01526124115ff3fe608060405260043610610236575f3560e01c80638a8c523c11610129578063cc1776d3116100a8578063ec44acf21161006d578063ec44acf21461067d578063f26a981614610696578063f2fde38b146106b5578063f9f92be4146106d4578063fba62f5e14610702575f80fd5b8063cc1776d3146105f5578063d3f6a1571461060b578063dd62ed3e1461062a578063e2f4560514610649578063e39111ab1461065e575f80fd5b8063aa4bde28116100ee578063aa4bde2814610550578063afa4f3b214610565578063c345c4d514610584578063c816841b146105a3578063cbe2de71146105d6575f80fd5b80638a8c523c146104cd5780638da5cb5b146104e1578063935eb35f146104fe57806395d89b411461051d578063a9059cbb14610531575f80fd5b806346469afb116101b5578063715018a61161017a578063715018a6146104525780637a9590761461046657806382bf293c1461047a57806385b27c851461049957806389daf799146104ae575f80fd5b806346469afb146103b55780634f7041a5146103ca5780635b58741b146103e05780636eb3a90f146103ff57806370a082311461041e575f80fd5b806323b872dd116101fb57806323b872dd1461031857806327b07d7514610337578063313ce5671461036557806333096098146103805780633d8f045314610396575f80fd5b806306fdde0314610241578063095ea7b31461026b5780631694505e1461029a57806318160ddd146102e55780631bff789814610303575f80fd5b3661023d57005b5f80fd5b34801561024c575f80fd5b50610255610721565b6040516102629190611e3c565b60405180910390f35b348015610276575f80fd5b5061028a610285366004611e85565b6107b1565b6040519015158152602001610262565b3480156102a5575f80fd5b506102cd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610262565b3480156102f0575f80fd5b506002545b604051908152602001610262565b34801561030e575f80fd5b506102f560115481565b348015610323575f80fd5b5061028a610332366004611eaf565b6107ca565b348015610342575f80fd5b5061028a610351366004611eed565b600c6020525f908152604090205460ff1681565b348015610370575f80fd5b5060405160128152602001610262565b34801561038b575f80fd5b506103946107ed565b005b3480156103a1575f80fd5b506103946103b0366004611f0f565b61085b565b3480156103c0575f80fd5b506102f560105481565b3480156103d5575f80fd5b50600e546102f59081565b3480156103eb575f80fd5b506103946103fa366004611f5b565b61095c565b34801561040a575f80fd5b50610394610419366004611eed565b6109e4565b348015610429575f80fd5b506102f5610438366004611eed565b6001600160a01b03165f9081526020819052604090205490565b34801561045d575f80fd5b50610394610abd565b348015610471575f80fd5b50610394610ad7565b348015610485575f80fd5b50610394610494366004611f92565b610b3c565b3480156104a4575f80fd5b506102f560085481565b3480156104b9575f80fd5b506103946104c8366004611fa9565b610bd6565b3480156104d8575f80fd5b50610394610c47565b3480156104ec575f80fd5b506005546001600160a01b03166102cd565b348015610509575f80fd5b50610394610518366004611fa9565b610c86565b348015610528575f80fd5b50610255610d9f565b34801561053c575f80fd5b5061028a61054b366004611e85565b610dae565b34801561055b575f80fd5b506102f560095481565b348015610570575f80fd5b5061039461057f366004611f92565b610dbb565b34801561058f575f80fd5b5061039461059e366004611eed565b610e20565b3480156105ae575f80fd5b506102cd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b506007546102cd906001600160a01b031681565b348015610600575f80fd5b50600f546102f59081565b348015610616575f80fd5b50610394610625366004612018565b610f65565b348015610635575f80fd5b506102f5610644366004612018565b611069565b348015610654575f80fd5b506102f5600a5481565b348015610669575f80fd5b506006546102cd906001600160a01b031681565b348015610688575f80fd5b50600b5461028a9060ff1681565b3480156106a1575f80fd5b506103946106b0366004611f92565b611093565b3480156106c0575f80fd5b506103946106cf366004611eed565b611123565b3480156106df575f80fd5b5061028a6106ee366004611eed565b600d6020525f908152604090205460ff1681565b34801561070d575f80fd5b5061039461071c366004611eed565b611194565b60606003805461073090612044565b80601f016020809104026020016040519081016040528092919081815260200182805461075c90612044565b80156107a75780601f1061077e576101008083540402835291602001916107a7565b820191905f5260205f20905b81548152906001019060200180831161078a57829003601f168201915b5050505050905090565b5f336107be81858561126d565b60019150505b92915050565b5f336107d785828561127a565b6107e28585856112dd565b506001949350505050565b6006546001600160a01b031633146108205760405162461bcd60e51b81526004016108179061207c565b60405180910390fd5b600680546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600e819055601055565b6006546001600160a01b031633148061087e57506007546001600160a01b031633145b61089a5760405162461bcd60e51b8152600401610817906120c4565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af11580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e919061210b565b9050806109555760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610817565b5050505050565b61096461133a565b6001600160a01b0382166109ba5760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74206d757374206e6f74206265203078302061646472657373006044820152606401610817565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6006546001600160a01b03163314610a0e5760405162461bcd60e51b81526004016108179061207c565b6001600160a01b038116610a345760405162461bcd60e51b815260040161081790612126565b600680546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa050811319190a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b610ac561133a565b610acd610c47565b610ad5611367565b565b6007546001600160a01b03163314610b015760405162461bcd60e51b81526004016108179061216e565b600780546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600f819055601155565b610b4461133a565b60018110158015610b5757508061271010155b610bad5760405162461bcd60e51b815260206004820152602160248201527f4d61782077616c6c657420616d6f756e74206973206f7574206f662072616e676044820152606560f81b6064820152608401610817565b612710610bc6826b033b2e3c9fd0803ce80000006121ca565b610bd091906121e1565b60095550565b610bde61133a565b5f5b81811015610c42575f600d5f858585818110610bfe57610bfe612200565b9050602002016020810190610c139190611eed565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610be0565b505050565b610c4f61133a565b600b805460ff191660011790556040517fa62ccc2c5bc0b8eb49b01f78e5ca0c296b739ecac1c21b7b74793559450bf45a905f90a1565b610c8e61133a565b5f5b81811015610c4257600c5f848484818110610cad57610cad612200565b9050602002016020810190610cc29190611eed565b6001600160a01b0316815260208101919091526040015f205460ff1615610d445760405162461bcd60e51b815260206004820152603060248201527f41646472657373206973206578636c756465642066726f6d2074617865732c2060448201526f18d85b9b9bdd08189b1858dadb1a5cdd60821b6064820152608401610817565b6001600d5f858585818110610d5b57610d5b612200565b9050602002016020810190610d709190611eed565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610c90565b60606004805461073090612044565b5f336107be8185856112dd565b610dc361133a565b683635c9adc5dea000008111610e1b5760405162461bcd60e51b815260206004820152601f60248201527f4d696e696d756d206f66203130303020746f6b656e73207265717569726564006044820152606401610817565b600a55565b6006546001600160a01b0316331480610e4357506007546001600160a01b031633145b610e5f5760405162461bcd60e51b8152600401610817906120c4565b6001600160a01b038116610eb55760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610817565b4780610ef85760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610817565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610f2b573d5f803e3d5ffd5b5060405181906001600160a01b038416907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c9905f90a35050565b610f6d61133a565b6001600160a01b038216610f935760405162461bcd60e51b815260040161081790612126565b6001600160a01b038116610fb95760405162461bcd60e51b815260040161081790612214565b6006546040516001600160a01b038085169216907fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa05081131905f90a3600680546001600160a01b0319166001600160a01b03848116919091179091556007546040518383169291909116907f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d905f90a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61109b61133a565b600181101580156110ae57508061271010155b6110fa5760405162461bcd60e51b815260206004820152601e60248201527f4d617820616d6f756e7420706572205458206f7574206f662072616e676500006044820152606401610817565b612710611113826b033b2e3c9fd0803ce80000006121ca565b61111d91906121e1565b60085550565b61112b61133a565b5f600c5f6111416005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905561117181611378565b6001600160a01b03165f908152600c60205260409020805460ff19166001179055565b6007546001600160a01b031633146111be5760405162461bcd60e51b81526004016108179061216e565b6001600160a01b0381166111e45760405162461bcd60e51b815260040161081790612214565b600780546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d9190a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c4283838360016113b5565b5f6112858484611069565b90505f1981146112d757818110156112c957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610817565b6112d784848484035f6113b5565b50505050565b6001600160a01b03831661130657604051634b637e8f60e11b81525f6004820152602401610817565b6001600160a01b03821661132f5760405163ec442f0560e01b81525f6004820152602401610817565b610c42838383611487565b6005546001600160a01b03163314610ad55760405163118cdaa760e01b8152336004820152602401610817565b61136f61133a565b610ad55f611a22565b61138061133a565b6001600160a01b0381166113a957604051631e4fbdf760e01b81525f6004820152602401610817565b6113b281611a22565b50565b6001600160a01b0384166113de5760405163e602df0560e01b81525f6004820152602401610817565b6001600160a01b03831661140757604051634a1406b160e11b81525f6004820152602401610817565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156112d757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161147991815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152600d602052604090205460ff16806114c457506001600160a01b0382165f908152600d602052604090205460ff165b156115115760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e676044820152606401610817565b600b5460ff168061153957506001600160a01b0383165f908152600c602052604090205460ff165b8061155b57506001600160a01b0382165f908152600c602052604090205460ff165b806115d357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480156115d357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061164b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614801561164b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b6116a95760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b6064820152608401610817565b6001600160a01b0383165f908152600c602052604090205460ff16806116e657506001600160a01b0382165f908152600c602052604090205460ff165b1580156116f55750600b5460ff165b15611957575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316146117a7576009546001600160a01b0384165f90815260208190526040902054611759908461225c565b11156117a75760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610817565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361185d576008548211156118325760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e742070657220547820657863656564656400006044820152606401610817565b60105415611858576127106010548361184b91906121ca565b61185591906121e1565b90505b61190e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361190e576008548211156118e85760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e7420706572205478206578636565646564006044820152606401610817565b6011541561190e576127106011548361190191906121ca565b61190b91906121e1565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a2611942818361226f565b9150801561195557611955843083611a73565b505b305f9081526020819052604081205490505f600a5482101580156119ad57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b80156119d157506001600160a01b0385165f908152600c602052604090205460ff16155b80156119e0575060125460ff16155b80156119ee5750600b5460ff165b90508015611a17576012805460ff19166001179055611a0c82611b99565b6012805460ff191690555b610955858585611a73565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611a9d578060025f828254611a92919061225c565b90915550611b0d9050565b6001600160a01b0383165f9081526020819052604090205481811015611aef5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610817565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b2957600280548290039055611b47565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8c91815260200190565b60405180910390a3505050565b5f6010541180611baa57505f601154115b8015611bb557505f81115b156113b257611bc381611c43565b47156113b2576006546001600160a01b03166108fc611be36002476121e1565b6040518115909202915f818181858888f19350505050158015611c08573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611c3f573d5f803e3d5ffd5b5050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c7657611c76612200565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d169190612296565b81600181518110611d2957611d29612200565b60200260200101906001600160a01b031690816001600160a01b03168152505081611d74307f0000000000000000000000000000000000000000000000000000000000000000611069565b1015611da657611da6307f00000000000000000000000000000000000000000000000000000000000000005f1961126d565b6040516318cbafe560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe590611dfa9085905f908690309042906004016122b1565b5f604051808303815f875af1158015611e15573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c429190810190612322565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146113b2575f80fd5b5f8060408385031215611e96575f80fd5b8235611ea181611e71565b946020939093013593505050565b5f805f60608486031215611ec1575f80fd5b8335611ecc81611e71565b92506020840135611edc81611e71565b929592945050506040919091013590565b5f60208284031215611efd575f80fd5b8135611f0881611e71565b9392505050565b5f805f60608486031215611f21575f80fd5b8335611f2c81611e71565b9250602084013591506040840135611f4381611e71565b809150509250925092565b80151581146113b2575f80fd5b5f8060408385031215611f6c575f80fd5b8235611f7781611e71565b91506020830135611f8781611f4e565b809150509250929050565b5f60208284031215611fa2575f80fd5b5035919050565b5f8060208385031215611fba575f80fd5b823567ffffffffffffffff80821115611fd1575f80fd5b818501915085601f830112611fe4575f80fd5b813581811115611ff2575f80fd5b8660208260051b8501011115612006575f80fd5b60209290920196919550909350505050565b5f8060408385031215612029575f80fd5b823561203481611e71565b91506020830135611f8781611e71565b600181811c9082168061205857607f821691505b60208210810361207657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f4f6e6c79205461782057616c6c657420312063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b60208082526027908201527f4f6e6c79205461782057616c6c6574732063616e2063616c6c207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b5f6020828403121561211b575f80fd5b8151611f0881611f4e565b60208082526028908201527f4e6577205461782057616c6c65742031206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f4f6e6c79205461782057616c6c657420322063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107c4576107c46121b6565b5f826121fb57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b60208082526028908201527f4e6577205461782057616c6c65742032206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b808201808211156107c4576107c46121b6565b818103818111156107c4576107c46121b6565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156122a6575f80fd5b8151611f0881611e71565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123015784516001600160a01b0316835293830193918301916001016122dc565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215612333575f80fd5b825167ffffffffffffffff8082111561234a575f80fd5b818501915085601f83011261235d575f80fd5b81518181111561236f5761236f612282565b8060051b604051601f19603f8301168101818110858211171561239457612394612282565b6040529182528482019250838101850191888311156123b1575f80fd5b938501935b828510156123cf578451845293850193928501926123b6565b9897505050505050505056fea26469706673582212203482df9c3814ef05db35f4cf294b45c692cdc7c87db20ae5a8f139535e72de6464736f6c63430008190033

Deployed Bytecode

0x608060405260043610610236575f3560e01c80638a8c523c11610129578063cc1776d3116100a8578063ec44acf21161006d578063ec44acf21461067d578063f26a981614610696578063f2fde38b146106b5578063f9f92be4146106d4578063fba62f5e14610702575f80fd5b8063cc1776d3146105f5578063d3f6a1571461060b578063dd62ed3e1461062a578063e2f4560514610649578063e39111ab1461065e575f80fd5b8063aa4bde28116100ee578063aa4bde2814610550578063afa4f3b214610565578063c345c4d514610584578063c816841b146105a3578063cbe2de71146105d6575f80fd5b80638a8c523c146104cd5780638da5cb5b146104e1578063935eb35f146104fe57806395d89b411461051d578063a9059cbb14610531575f80fd5b806346469afb116101b5578063715018a61161017a578063715018a6146104525780637a9590761461046657806382bf293c1461047a57806385b27c851461049957806389daf799146104ae575f80fd5b806346469afb146103b55780634f7041a5146103ca5780635b58741b146103e05780636eb3a90f146103ff57806370a082311461041e575f80fd5b806323b872dd116101fb57806323b872dd1461031857806327b07d7514610337578063313ce5671461036557806333096098146103805780633d8f045314610396575f80fd5b806306fdde0314610241578063095ea7b31461026b5780631694505e1461029a57806318160ddd146102e55780631bff789814610303575f80fd5b3661023d57005b5f80fd5b34801561024c575f80fd5b50610255610721565b6040516102629190611e3c565b60405180910390f35b348015610276575f80fd5b5061028a610285366004611e85565b6107b1565b6040519015158152602001610262565b3480156102a5575f80fd5b506102cd7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610262565b3480156102f0575f80fd5b506002545b604051908152602001610262565b34801561030e575f80fd5b506102f560115481565b348015610323575f80fd5b5061028a610332366004611eaf565b6107ca565b348015610342575f80fd5b5061028a610351366004611eed565b600c6020525f908152604090205460ff1681565b348015610370575f80fd5b5060405160128152602001610262565b34801561038b575f80fd5b506103946107ed565b005b3480156103a1575f80fd5b506103946103b0366004611f0f565b61085b565b3480156103c0575f80fd5b506102f560105481565b3480156103d5575f80fd5b50600e546102f59081565b3480156103eb575f80fd5b506103946103fa366004611f5b565b61095c565b34801561040a575f80fd5b50610394610419366004611eed565b6109e4565b348015610429575f80fd5b506102f5610438366004611eed565b6001600160a01b03165f9081526020819052604090205490565b34801561045d575f80fd5b50610394610abd565b348015610471575f80fd5b50610394610ad7565b348015610485575f80fd5b50610394610494366004611f92565b610b3c565b3480156104a4575f80fd5b506102f560085481565b3480156104b9575f80fd5b506103946104c8366004611fa9565b610bd6565b3480156104d8575f80fd5b50610394610c47565b3480156104ec575f80fd5b506005546001600160a01b03166102cd565b348015610509575f80fd5b50610394610518366004611fa9565b610c86565b348015610528575f80fd5b50610255610d9f565b34801561053c575f80fd5b5061028a61054b366004611e85565b610dae565b34801561055b575f80fd5b506102f560095481565b348015610570575f80fd5b5061039461057f366004611f92565b610dbb565b34801561058f575f80fd5b5061039461059e366004611eed565b610e20565b3480156105ae575f80fd5b506102cd7f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b36781565b3480156105e1575f80fd5b506007546102cd906001600160a01b031681565b348015610600575f80fd5b50600f546102f59081565b348015610616575f80fd5b50610394610625366004612018565b610f65565b348015610635575f80fd5b506102f5610644366004612018565b611069565b348015610654575f80fd5b506102f5600a5481565b348015610669575f80fd5b506006546102cd906001600160a01b031681565b348015610688575f80fd5b50600b5461028a9060ff1681565b3480156106a1575f80fd5b506103946106b0366004611f92565b611093565b3480156106c0575f80fd5b506103946106cf366004611eed565b611123565b3480156106df575f80fd5b5061028a6106ee366004611eed565b600d6020525f908152604090205460ff1681565b34801561070d575f80fd5b5061039461071c366004611eed565b611194565b60606003805461073090612044565b80601f016020809104026020016040519081016040528092919081815260200182805461075c90612044565b80156107a75780601f1061077e576101008083540402835291602001916107a7565b820191905f5260205f20905b81548152906001019060200180831161078a57829003601f168201915b5050505050905090565b5f336107be81858561126d565b60019150505b92915050565b5f336107d785828561127a565b6107e28585856112dd565b506001949350505050565b6006546001600160a01b031633146108205760405162461bcd60e51b81526004016108179061207c565b60405180910390fd5b600680546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600e819055601055565b6006546001600160a01b031633148061087e57506007546001600160a01b031633145b61089a5760405162461bcd60e51b8152600401610817906120c4565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af11580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e919061210b565b9050806109555760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610817565b5050505050565b61096461133a565b6001600160a01b0382166109ba5760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74206d757374206e6f74206265203078302061646472657373006044820152606401610817565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6006546001600160a01b03163314610a0e5760405162461bcd60e51b81526004016108179061207c565b6001600160a01b038116610a345760405162461bcd60e51b815260040161081790612126565b600680546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa050811319190a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b610ac561133a565b610acd610c47565b610ad5611367565b565b6007546001600160a01b03163314610b015760405162461bcd60e51b81526004016108179061216e565b600780546001600160a01b03165f908152600c60205260408120805460ff1916905581546001600160a01b031916909155600f819055601155565b610b4461133a565b60018110158015610b5757508061271010155b610bad5760405162461bcd60e51b815260206004820152602160248201527f4d61782077616c6c657420616d6f756e74206973206f7574206f662072616e676044820152606560f81b6064820152608401610817565b612710610bc6826b033b2e3c9fd0803ce80000006121ca565b610bd091906121e1565b60095550565b610bde61133a565b5f5b81811015610c42575f600d5f858585818110610bfe57610bfe612200565b9050602002016020810190610c139190611eed565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610be0565b505050565b610c4f61133a565b600b805460ff191660011790556040517fa62ccc2c5bc0b8eb49b01f78e5ca0c296b739ecac1c21b7b74793559450bf45a905f90a1565b610c8e61133a565b5f5b81811015610c4257600c5f848484818110610cad57610cad612200565b9050602002016020810190610cc29190611eed565b6001600160a01b0316815260208101919091526040015f205460ff1615610d445760405162461bcd60e51b815260206004820152603060248201527f41646472657373206973206578636c756465642066726f6d2074617865732c2060448201526f18d85b9b9bdd08189b1858dadb1a5cdd60821b6064820152608401610817565b6001600d5f858585818110610d5b57610d5b612200565b9050602002016020810190610d709190611eed565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101610c90565b60606004805461073090612044565b5f336107be8185856112dd565b610dc361133a565b683635c9adc5dea000008111610e1b5760405162461bcd60e51b815260206004820152601f60248201527f4d696e696d756d206f66203130303020746f6b656e73207265717569726564006044820152606401610817565b600a55565b6006546001600160a01b0316331480610e4357506007546001600160a01b031633145b610e5f5760405162461bcd60e51b8152600401610817906120c4565b6001600160a01b038116610eb55760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610817565b4780610ef85760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610817565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610f2b573d5f803e3d5ffd5b5060405181906001600160a01b038416907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c9905f90a35050565b610f6d61133a565b6001600160a01b038216610f935760405162461bcd60e51b815260040161081790612126565b6001600160a01b038116610fb95760405162461bcd60e51b815260040161081790612214565b6006546040516001600160a01b038085169216907fcaf4855279e6519140a8d4af190e14fadc5174e7311356c2c3b57baa05081131905f90a3600680546001600160a01b0319166001600160a01b03848116919091179091556007546040518383169291909116907f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d905f90a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61109b61133a565b600181101580156110ae57508061271010155b6110fa5760405162461bcd60e51b815260206004820152601e60248201527f4d617820616d6f756e7420706572205458206f7574206f662072616e676500006044820152606401610817565b612710611113826b033b2e3c9fd0803ce80000006121ca565b61111d91906121e1565b60085550565b61112b61133a565b5f600c5f6111416005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905561117181611378565b6001600160a01b03165f908152600c60205260409020805460ff19166001179055565b6007546001600160a01b031633146111be5760405162461bcd60e51b81526004016108179061216e565b6001600160a01b0381166111e45760405162461bcd60e51b815260040161081790612214565b600780546001600160a01b039081165f908152600c6020526040808220805460ff199081169091558584168084528284208054909216600117909155935490519216917f46233802773a6f8b6255846521d8ea859df177f1a116429fbd4a81de50cbec3d9190a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c4283838360016113b5565b5f6112858484611069565b90505f1981146112d757818110156112c957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610817565b6112d784848484035f6113b5565b50505050565b6001600160a01b03831661130657604051634b637e8f60e11b81525f6004820152602401610817565b6001600160a01b03821661132f5760405163ec442f0560e01b81525f6004820152602401610817565b610c42838383611487565b6005546001600160a01b03163314610ad55760405163118cdaa760e01b8152336004820152602401610817565b61136f61133a565b610ad55f611a22565b61138061133a565b6001600160a01b0381166113a957604051631e4fbdf760e01b81525f6004820152602401610817565b6113b281611a22565b50565b6001600160a01b0384166113de5760405163e602df0560e01b81525f6004820152602401610817565b6001600160a01b03831661140757604051634a1406b160e11b81525f6004820152602401610817565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156112d757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161147991815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152600d602052604090205460ff16806114c457506001600160a01b0382165f908152600d602052604090205460ff165b156115115760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320626c61636b6c69737465642c2061626f7274696e676044820152606401610817565b600b5460ff168061153957506001600160a01b0383165f908152600c602052604090205460ff165b8061155b57506001600160a01b0382165f908152600c602052604090205460ff165b806115d357507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b03161480156115d357507f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316826001600160a01b0316145b8061164b57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614801561164b57507f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316836001600160a01b0316145b6116a95760405162461bcd60e51b815260206004820152602960248201527f54726164696e672064697361626c65642c206f6e6c79206f776e65722063616e604482015268103a3930b739b332b960b91b6064820152608401610817565b6001600160a01b0383165f908152600c602052604090205460ff16806116e657506001600160a01b0382165f908152600c602052604090205460ff165b1580156116f55750600b5460ff165b15611957575f7f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316836001600160a01b0316146117a7576009546001600160a01b0384165f90815260208190526040902054611759908461225c565b11156117a75760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610817565b7f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316846001600160a01b03160361185d576008548211156118325760405162461bcd60e51b815260206004820152601e60248201527f4d61782062757920616d6f756e742070657220547820657863656564656400006044820152606401610817565b60105415611858576127106010548361184b91906121ca565b61185591906121e1565b90505b61190e565b7f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316836001600160a01b03160361190e576008548211156118e85760405162461bcd60e51b815260206004820152601f60248201527f4d61782073656c6c20616d6f756e7420706572205478206578636565646564006044820152606401610817565b6011541561190e576127106011548361190191906121ca565b61190b91906121e1565b90505b60405181907f946cf2ce5ccac152682786d5f6b2e2dcfd804ab709002314d1d3b7dd2122f837905f90a2611942818361226f565b9150801561195557611955843083611a73565b505b305f9081526020819052604081205490505f600a5482101580156119ad57507f000000000000000000000000f27fc89fc0f2f3907b79d30d44513cfac107b3676001600160a01b0316856001600160a01b031614155b80156119d157506001600160a01b0385165f908152600c602052604090205460ff16155b80156119e0575060125460ff16155b80156119ee5750600b5460ff165b90508015611a17576012805460ff19166001179055611a0c82611b99565b6012805460ff191690555b610955858585611a73565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611a9d578060025f828254611a92919061225c565b90915550611b0d9050565b6001600160a01b0383165f9081526020819052604090205481811015611aef5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610817565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b2957600280548290039055611b47565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8c91815260200190565b60405180910390a3505050565b5f6010541180611baa57505f601154115b8015611bb557505f81115b156113b257611bc381611c43565b47156113b2576006546001600160a01b03166108fc611be36002476121e1565b6040518115909202915f818181858888f19350505050158015611c08573d5f803e3d5ffd5b506007546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611c3f573d5f803e3d5ffd5b5050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c7657611c76612200565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d169190612296565b81600181518110611d2957611d29612200565b60200260200101906001600160a01b031690816001600160a01b03168152505081611d74307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d611069565b1015611da657611da6307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d5f1961126d565b6040516318cbafe560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906318cbafe590611dfa9085905f908690309042906004016122b1565b5f604051808303815f875af1158015611e15573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c429190810190612322565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146113b2575f80fd5b5f8060408385031215611e96575f80fd5b8235611ea181611e71565b946020939093013593505050565b5f805f60608486031215611ec1575f80fd5b8335611ecc81611e71565b92506020840135611edc81611e71565b929592945050506040919091013590565b5f60208284031215611efd575f80fd5b8135611f0881611e71565b9392505050565b5f805f60608486031215611f21575f80fd5b8335611f2c81611e71565b9250602084013591506040840135611f4381611e71565b809150509250925092565b80151581146113b2575f80fd5b5f8060408385031215611f6c575f80fd5b8235611f7781611e71565b91506020830135611f8781611f4e565b809150509250929050565b5f60208284031215611fa2575f80fd5b5035919050565b5f8060208385031215611fba575f80fd5b823567ffffffffffffffff80821115611fd1575f80fd5b818501915085601f830112611fe4575f80fd5b813581811115611ff2575f80fd5b8660208260051b8501011115612006575f80fd5b60209290920196919550909350505050565b5f8060408385031215612029575f80fd5b823561203481611e71565b91506020830135611f8781611e71565b600181811c9082168061205857607f821691505b60208210810361207657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f4f6e6c79205461782057616c6c657420312063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b60208082526027908201527f4f6e6c79205461782057616c6c6574732063616e2063616c6c207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b5f6020828403121561211b575f80fd5b8151611f0881611f4e565b60208082526028908201527f4e6577205461782057616c6c65742031206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f4f6e6c79205461782057616c6c657420322063616e2063616c6c207468697320604082015267333ab731ba34b7b760c11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107c4576107c46121b6565b5f826121fb57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b60208082526028908201527f4e6577205461782057616c6c65742032206d757374206e6f7420626520307830604082015267206164647265737360c01b606082015260800190565b808201808211156107c4576107c46121b6565b818103818111156107c4576107c46121b6565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156122a6575f80fd5b8151611f0881611e71565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123015784516001600160a01b0316835293830193918301916001016122dc565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215612333575f80fd5b825167ffffffffffffffff8082111561234a575f80fd5b818501915085601f83011261235d575f80fd5b81518181111561236f5761236f612282565b8060051b604051601f19603f8301168101818110858211171561239457612394612282565b6040529182528482019250838101850191888311156123b1575f80fd5b938501935b828510156123cf578451845293850193928501926123b6565b9897505050505050505056fea26469706673582212203482df9c3814ef05db35f4cf294b45c692cdc7c87db20ae5a8f139535e72de6464736f6c63430008190033

Deployed Bytecode Sourcemap

22073:15716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11466:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13800:222;;;;;;;;;;-1:-1:-1;13800:222:0;;;;;:::i;:::-;;:::i;:::-;;;1058:14:1;;1051:22;1033:41;;1021:2;1006:18;13800:222:0;893:187:1;23358:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1273:32:1;;;1255:51;;1243:2;1228:18;23358:49:0;1085:227:1;12568:99:0;;;;;;;;;;-1:-1:-1;12647:12:0;;12568:99;;;1463:25:1;;;1451:2;1436:18;12568:99:0;1317:177:1;23285:27:0;;;;;;;;;;;;;;;;14600:283;;;;;;;;;;-1:-1:-1;14600:283:0;;;;;:::i;:::-;;:::i;22905:51::-;;;;;;;;;;-1:-1:-1;22905:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12419:84;;;;;;;;;;-1:-1:-1;12419:84:0;;12493:2;2354:36:1;;2342:2;2327:18;12419:84:0;2212:184:1;30095:205:0;;;;;;;;;;;;;:::i;:::-;;26477:291;;;;;;;;;;-1:-1:-1;26477:291:0;;;;;:::i;:::-;;:::i;23252:26::-;;;;;;;;;;;;;;;;23194:20;;;;;;;;;;-1:-1:-1;23194:20:0;;;;;;27635:208;;;;;;;;;;-1:-1:-1;27635:208:0;;;;;:::i;:::-;;:::i;29112:381::-;;;;;;;;;;-1:-1:-1;29112:381:0;;;;;:::i;:::-;;:::i;12730:118::-;;;;;;;;;;-1:-1:-1;12730:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;12822:18:0;12795:7;12822:18;;;;;;;;;;;;12730:118;28293:125;;;;;;;;;;;;;:::i;30371:207::-;;;;;;;;;;;;;:::i;32802:241::-;;;;;;;;;;-1:-1:-1;32802:241:0;;;;;:::i;:::-;;:::i;22341:48::-;;;;;;;;;;;;;;;;31967:234;;;;;;;;;;-1:-1:-1;31967:234:0;;;;;:::i;:::-;;:::i;28848:107::-;;;;;;;;;;;;;:::i;4874:87::-;;;;;;;;;;-1:-1:-1;4947:6:0;;-1:-1:-1;;;;;4947:6:0;4874:87;;31447:349;;;;;;;;;;-1:-1:-1;31447:349:0;;;;;:::i;:::-;;:::i;11676:95::-;;;;;;;;;;;;;:::i;13053:182::-;;;;;;;;;;-1:-1:-1;13053:182:0;;;;;:::i;:::-;;:::i;22423:49::-;;;;;;;;;;;;;;;;33174:183;;;;;;;;;;-1:-1:-1;33174:183:0;;;;;:::i;:::-;;:::i;26998:337::-;;;;;;;;;;-1:-1:-1;26998:337:0;;;;;:::i;:::-;;:::i;23443:36::-;;;;;;;;;;;;;;;22272:25;;;;;;;;;;-1:-1:-1;22272:25:0;;;;-1:-1:-1;;;;;22272:25:0;;;23221:22;;;;;;;;;;-1:-1:-1;23221:22:0;;;;;;30813:481;;;;;;;;;;-1:-1:-1;30813:481:0;;;;;:::i;:::-;;:::i;13298:183::-;;;;;;;;;;-1:-1:-1;13298:183:0;;;;;:::i;:::-;;:::i;22713:55::-;;;;;;;;;;;;;;;;22196:25;;;;;;;;;;-1:-1:-1;22196:25:0;;;;-1:-1:-1;;;;;22196:25:0;;;22811:19;;;;;;;;;;-1:-1:-1;22811:19:0;;;;;;;;32429:235;;;;;;;;;;-1:-1:-1;32429:235:0;;;;;:::i;:::-;;:::i;28572:217::-;;;;;;;;;;-1:-1:-1;28572:217:0;;;;;:::i;:::-;;:::i;22996:41::-;;;;;;;;;;-1:-1:-1;22996:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29643:379;;;;;;;;;;-1:-1:-1;29643:379:0;;;;;:::i;:::-;;:::i;11466:91::-;11511:13;11544:5;11537:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11466:91;:::o;13800:222::-;13900:4;3097:10;13961:31;3097:10;13977:7;13986:5;13961:8;:31::i;:::-;14010:4;14003:11;;;13800:222;;;;;:::o;14600:283::-;14721:4;3097:10;14779:37;14795:4;3097:10;14810:5;14779:15;:37::i;:::-;14827:26;14837:4;14843:2;14847:5;14827:9;:26::i;:::-;-1:-1:-1;14871:4:0;;14600:283;-1:-1:-1;;;;14600:283:0:o;30095:205::-;24236:10;;-1:-1:-1;;;;;24236:10:0;24250;24236:24;24228:77;;;;-1:-1:-1;;;24228:77:0;;;;;;;:::i;:::-;;;;;;;;;30180:10:::1;::::0;;-1:-1:-1;;;;;30180:10:0::1;30194:5;30160:31:::0;;;:19:::1;:31;::::0;;;;:39;;-1:-1:-1;;30160:39:0::1;::::0;;30210:25;;-1:-1:-1;;;;;;30210:25:0::1;::::0;;;30246:6:::1;:20:::0;;;30277:11:::1;:15:::0;30095:205::o;26477:291::-;24520:10;;-1:-1:-1;;;;;24520:10:0;24534;24520:24;;:52;;-1:-1:-1;24548:10:0;;-1:-1:-1;;;;;24548:10:0;24562;24548:24;24520:52;24512:104;;;;-1:-1:-1;;;24512:104:0;;;;;;;:::i;:::-;26674:34:::1;::::0;-1:-1:-1;;;26674:34:0;;-1:-1:-1;;;;;6172:32:1;;;26674:34:0::1;::::0;::::1;6154:51:1::0;6221:18;;;6214:34;;;26642:5:0;;26617:16:::1;::::0;26674:19;::::1;::::0;::::1;::::0;6127:18:1;;26674:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26659:49;;26727:7;26719:41;;;::::0;-1:-1:-1;;;26719:41:0;;6711:2:1;26719:41:0::1;::::0;::::1;6693:21:1::0;6750:2;6730:18;;;6723:30;-1:-1:-1;;;6769:18:1;;;6762:51;6830:18;;26719:41:0::1;6509:345:1::0;26719:41:0::1;26606:162;;26477:291:::0;;;:::o;27635:208::-;4760:13;:11;:13::i;:::-;-1:-1:-1;;;;;27731:21:0;::::1;27723:65;;;::::0;-1:-1:-1;;;27723:65:0;;7061:2:1;27723:65:0::1;::::0;::::1;7043:21:1::0;7100:2;7080:18;;;7073:30;7139:33;7119:18;;;7112:61;7190:18;;27723:65:0::1;6859:355:1::0;27723:65:0::1;-1:-1:-1::0;;;;;27799:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;27799:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27635:208::o;29112:381::-;24236:10;;-1:-1:-1;;;;;24236:10:0;24250;24236:24;24228:77;;;;-1:-1:-1;;;24228:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29206:29:0;::::1;29198:82;;;;-1:-1:-1::0;;;29198:82:0::1;;;;;;;:::i;:::-;29311:10;::::0;;-1:-1:-1;;;;;29311:10:0;;::::1;29325:5;29291:31:::0;;;:19:::1;:31;::::0;;;;;:39;;-1:-1:-1;;29291:39:0;;::::1;::::0;;;29341:34;;::::1;::::0;;;;;;:41;;;;::::1;29311:10:::0;29341:41:::1;::::0;;;29420:10;;29398:48;;29420:10;::::1;::::0;29398:48:::1;::::0;29325:5;29398:48:::1;29457:10;:26:::0;;-1:-1:-1;;;;;;29457:26:0::1;-1:-1:-1::0;;;;;29457:26:0;;;::::1;::::0;;;::::1;::::0;;29112:381::o;28293:125::-;4760:13;:11;:13::i;:::-;28359:15:::1;:13;:15::i;:::-;28385:25;:23;:25::i;:::-;28293:125::o:0;30371:207::-;24378:10;;-1:-1:-1;;;;;24378:10:0;24392;24378:24;24370:77;;;;-1:-1:-1;;;24370:77:0;;;;;;;:::i;:::-;30456:10:::1;::::0;;-1:-1:-1;;;;;30456:10:0::1;30470:5;30436:31:::0;;;:19:::1;:31;::::0;;;;:39;;-1:-1:-1;;30436:39:0::1;::::0;;30486:25;;-1:-1:-1;;;;;;30486:25:0::1;::::0;;;30522:7:::1;:21:::0;;;30554:12:::1;:16:::0;30371:207::o;32802:241::-;4760:13;:11;:13::i;:::-;32897:1:::1;32886:7;:12;;:42;;;;;32921:7;22640:5;32902:26;;32886:42;32878:88;;;::::0;-1:-1:-1;;;32878:88:0;;8239:2:1;32878:88:0::1;::::0;::::1;8221:21:1::0;8278:2;8258:18;;;8251:30;8317:34;8297:18;;;8290:62;-1:-1:-1;;;8368:18:1;;;8361:31;8409:19;;32878:88:0::1;8037:397:1::0;32878:88:0::1;22640:5;32996:20;33009:7:::0;22544:20:::1;32996;:::i;:::-;32995:40;;;;:::i;:::-;32977:15;:58:::0;-1:-1:-1;32802:241:0:o;31967:234::-;4760:13;:11;:13::i;:::-;32072:9:::1;32067:127;32087:31:::0;;::::1;32067:127;;;32177:5;32140:9;:34;32150:20;;32171:1;32150:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32140:34:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32140:34:0;:42;;-1:-1:-1;;32140:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;32120:3:0::1;32067:127;;;;31967:234:::0;;:::o;28848:107::-;4760:13;:11;:13::i;:::-;28901:7:::1;:14:::0;;-1:-1:-1;;28901:14:0::1;28911:4;28901:14;::::0;;28931:16:::1;::::0;::::1;::::0;28901:7:::1;::::0;28931:16:::1;28848:107::o:0;31447:349::-;4760:13;:11;:13::i;:::-;31547:9:::1;31542:247;31562:31:::0;;::::1;31542:247;;;31624:19;:44;31644:20;;31665:1;31644:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31624:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;31624:44:0;;::::1;;31623:45;31615:106;;;::::0;-1:-1:-1;;;31615:106:0;;9300:2:1;31615:106:0::1;::::0;::::1;9282:21:1::0;9339:2;9319:18;;;9312:30;9378:34;9358:18;;;9351:62;-1:-1:-1;;;9429:18:1;;;9422:46;9485:19;;31615:106:0::1;9098:412:1::0;31615:106:0::1;31773:4;31736:9;:34;31746:20;;31767:1;31746:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31736:34:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;31736:34:0;:41;;-1:-1:-1;;31736:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;31595:3:0::1;31542:247;;11676:95:::0;11723:13;11756:7;11749:14;;;;;:::i;13053:182::-;13122:4;3097:10;13178:27;3097:10;13195:2;13199:5;13178:9;:27::i;33174:183::-;4760:13;:11;:13::i;:::-;33268:7:::1;33259:6;:16;33251:60;;;::::0;-1:-1:-1;;;33251:60:0;;9717:2:1;33251:60:0::1;::::0;::::1;9699:21:1::0;9756:2;9736:18;;;9729:30;9795:33;9775:18;;;9768:61;9846:18;;33251:60:0::1;9515:355:1::0;33251:60:0::1;33322:18;:27:::0;33174:183::o;26998:337::-;24520:10;;-1:-1:-1;;;;;24520:10:0;24534;24520:24;;:52;;-1:-1:-1;24548:10:0;;-1:-1:-1;;;;;24548:10:0;24562;24548:24;24520:52;24512:104;;;;-1:-1:-1;;;24512:104:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27080:20:0;::::1;27072:63;;;::::0;-1:-1:-1;;;27072:63:0;;10077:2:1;27072:63:0::1;::::0;::::1;10059:21:1::0;10116:2;10096:18;;;10089:30;10155:32;10135:18;;;10128:60;10205:18;;27072:63:0::1;9875:354:1::0;27072:63:0::1;27164:21;27204:11:::0;27196:42:::1;;;::::0;-1:-1:-1;;;27196:42:0;;10436:2:1;27196:42:0::1;::::0;::::1;10418:21:1::0;10475:2;10455:18;;;10448:30;-1:-1:-1;;;10494:18:1;;;10487:48;10552:18;;27196:42:0::1;10234:342:1::0;27196:42:0::1;27251:33;::::0;-1:-1:-1;;;;;27251:24:0;::::1;::::0;:33;::::1;;;::::0;27276:7;;27251:33:::1;::::0;;;27276:7;27251:24;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;27300:27:0::1;::::0;27319:7;;-1:-1:-1;;;;;27300:27:0;::::1;::::0;::::1;::::0;;;::::1;27061:274;26998:337:::0;:::o;30813:481::-;4760:13;:11;:13::i;:::-;-1:-1:-1;;;;;30917:29:0;::::1;30909:82;;;;-1:-1:-1::0;;;30909:82:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31010:29:0;::::1;31002:82;;;;-1:-1:-1::0;;;31002:82:0::1;;;;;;;:::i;:::-;31122:10;::::0;31100:48:::1;::::0;-1:-1:-1;;;;;31100:48:0;;::::1;::::0;31122:10:::1;::::0;31100:48:::1;::::0;31122:10:::1;::::0;31100:48:::1;31159:10;:26:::0;;-1:-1:-1;;;;;;31159:26:0::1;-1:-1:-1::0;;;;;31159:26:0;;::::1;::::0;;;::::1;::::0;;;31223:10:::1;::::0;31201:48:::1;::::0;;;::::1;::::0;31223:10;;;::::1;::::0;31201:48:::1;::::0;-1:-1:-1;;31201:48:0::1;31260:10;:26:::0;;-1:-1:-1;;;;;;31260:26:0::1;-1:-1:-1::0;;;;;31260:26:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;30813:481:0:o;13298:183::-;-1:-1:-1;;;;;13446:18:0;;;13414:7;13446:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13298:183::o;32429:235::-;4760:13;:11;:13::i;:::-;32522:1:::1;32511:7;:12;;:42;;;;;32546:7;22640:5;32527:26;;32511:42;32503:85;;;::::0;-1:-1:-1;;;32503:85:0;;11192:2:1;32503:85:0::1;::::0;::::1;11174:21:1::0;11231:2;11211:18;;;11204:30;11270:32;11250:18;;;11243:60;11320:18;;32503:85:0::1;10990:354:1::0;32503:85:0::1;22640:5;32617:20;32630:7:::0;22544:20:::1;32617;:::i;:::-;32616:40;;;;:::i;:::-;32599:14;:57:::0;-1:-1:-1;32429:235:0:o;28572:217::-;4760:13;:11;:13::i;:::-;28685:5:::1;28654:19;:28;28674:7;4947:6:::0;;-1:-1:-1;;;;;4947:6:0;;4874:87;28674:7:::1;-1:-1:-1::0;;;;;28654:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28654:28:0;:36;;-1:-1:-1;;28654:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28701:33:::1;28725:8:::0;28701:23:::1;:33::i;:::-;-1:-1:-1::0;;;;;28745:29:0::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;28745:36:0::1;28777:4;28745:36;::::0;;28572:217::o;29643:379::-;24378:10;;-1:-1:-1;;;;;24378:10:0;24392;24378:24;24370:77;;;;-1:-1:-1;;;24370:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29737:29:0;::::1;29729:82;;;;-1:-1:-1::0;;;29729:82:0::1;;;;;;;:::i;:::-;29842:10;::::0;;-1:-1:-1;;;;;29842:10:0;;::::1;29856:5;29822:31:::0;;;:19:::1;:31;::::0;;;;;:39;;-1:-1:-1;;29822:39:0;;::::1;::::0;;;29872:34;;::::1;::::0;;;;;;:41;;;;::::1;29842:10:::0;29872:41:::1;::::0;;;29951:10;;29929:48;;29951:10;::::1;::::0;29929:48:::1;::::0;29856:5;29929:48:::1;29988:10;:26:::0;;-1:-1:-1;;;;;;29988:26:0::1;-1:-1:-1::0;;;;;29988:26:0;;;::::1;::::0;;;::::1;::::0;;29643:379::o;18762:164::-;18881:37;18890:5;18897:7;18906:5;18913:4;18881:8;:37::i;20555:603::-;20689:24;20716:25;20726:5;20733:7;20716:9;:25::i;:::-;20689:52;;-1:-1:-1;;20756:16:0;:37;20752:399;;20833:5;20814:16;:24;20810:214;;;20866:142;;-1:-1:-1;;;20866:142:0;;-1:-1:-1;;;;;11569:32:1;;20866:142:0;;;11551:51:1;11618:18;;;11611:34;;;11661:18;;;11654:34;;;11524:18;;20866:142:0;11349:345:1;20810:214:0;21067:57;21076:5;21083:7;21111:5;21092:16;:24;21118:5;21067:8;:57::i;:::-;20678:480;20555:603;;;:::o;15269:342::-;-1:-1:-1;;;;;15387:18:0;;15383:88;;15429:30;;-1:-1:-1;;;15429:30:0;;15456:1;15429:30;;;1255:51:1;1228:18;;15429:30:0;1085:227:1;15383:88:0;-1:-1:-1;;;;;15485:16:0;;15481:88;;15525:32;;-1:-1:-1;;;15525:32:0;;15554:1;15525:32;;;1255:51:1;1228:18;;15525:32:0;1085:227:1;15481:88:0;15579:24;15587:4;15593:2;15597:5;15579:7;:24::i;5039:166::-;4947:6;;-1:-1:-1;;;;;4947:6:0;3097:10;5099:23;5095:103;;5146:40;;-1:-1:-1;;;5146:40:0;;3097:10;5146:40;;;1255:51:1;1228:18;;5146:40:0;1085:227:1;5549:103:0;4760:13;:11;:13::i;:::-;5614:30:::1;5641:1;5614:18;:30::i;5807:220::-:0;4760:13;:11;:13::i;:::-;-1:-1:-1;;;;;5892:22:0;::::1;5888:93;;5938:31;::::0;-1:-1:-1;;;5938:31:0;;5966:1:::1;5938:31;::::0;::::1;1255:51:1::0;1228:18;;5938:31:0::1;1085:227:1::0;5888:93:0::1;5991:28;6010:8;5991:18;:28::i;:::-;5807:220:::0;:::o;19777:486::-;-1:-1:-1;;;;;19933:19:0;;19929:91;;19976:32;;-1:-1:-1;;;19976:32:0;;20005:1;19976:32;;;1255:51:1;1228:18;;19976:32:0;1085:227:1;19929:91:0;-1:-1:-1;;;;;20034:21:0;;20030:92;;20079:31;;-1:-1:-1;;;20079:31:0;;20107:1;20079:31;;;1255:51:1;1228:18;;20079:31:0;1085:227:1;20030:92:0;-1:-1:-1;;;;;20132:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;20178:78;;;;20229:7;-1:-1:-1;;;;;20213:31:0;20222:5;-1:-1:-1;;;;;20213:31:0;;20238:5;20213:31;;;;1463:25:1;;1451:2;1436:18;;1317:177;20213:31:0;;;;;;;;19777:486;;;;:::o;33510:2412::-;-1:-1:-1;;;;;33710:15:0;;;;;;:9;:15;;;;;;;;;:32;;-1:-1:-1;;;;;;33729:13:0;;;;;;:9;:13;;;;;;;;33710:32;33708:35;33700:80;;;;-1:-1:-1;;;33700:80:0;;11901:2:1;33700:80:0;;;11883:21:1;;;11920:18;;;11913:30;11979:34;11959:18;;;11952:62;12031:18;;33700:80:0;11699:356:1;33700:80:0;33801:7;;;;;:36;;-1:-1:-1;;;;;;33812:25:0;;;;;;:19;:25;;;;;;;;33801:36;:63;;;-1:-1:-1;;;;;;33841:23:0;;;;;;:19;:23;;;;;;;;33801:63;:132;;;;33895:15;-1:-1:-1;;;;;33879:32:0;:4;-1:-1:-1;;;;;33879:32:0;;:53;;;;;33921:11;-1:-1:-1;;;;;33915:17:0;:2;-1:-1:-1;;;;;33915:17:0;;33879:53;33801:191;;;;33952:15;-1:-1:-1;;;;;33938:30:0;:2;-1:-1:-1;;;;;33938:30:0;;:53;;;;;33980:11;-1:-1:-1;;;;;33972:19:0;:4;-1:-1:-1;;;;;33972:19:0;;33938:53;33793:245;;;;-1:-1:-1;;;33793:245:0;;12262:2:1;33793:245:0;;;12244:21:1;12301:2;12281:18;;;12274:30;12340:34;12320:18;;;12313:62;-1:-1:-1;;;12391:18:1;;;12384:39;12440:19;;33793:245:0;12060:405:1;33793:245:0;-1:-1:-1;;;;;34421:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;34450:23:0;;;;;;:19;:23;;;;;;;;34421:52;34419:55;:66;;;;-1:-1:-1;34478:7:0;;;;34419:66;34415:1000;;;34502:11;34537;-1:-1:-1;;;;;34531:17:0;:2;-1:-1:-1;;;;;34531:17:0;;34528:138;;34602:15;;-1:-1:-1;;;;;12822:18:0;;12795:7;12822:18;;;;;;;;;;;34576:22;;:6;:22;:::i;:::-;:41;;34568:82;;;;-1:-1:-1;;;34568:82:0;;12802:2:1;34568:82:0;;;12784:21:1;12841:2;12821:18;;;12814:30;12880;12860:18;;;12853:58;12928:18;;34568:82:0;12600:352:1;34568:82:0;34692:11;-1:-1:-1;;;;;34684:19:0;:4;-1:-1:-1;;;;;34684:19:0;;34680:535;;34742:14;;34732:6;:24;;34724:67;;;;-1:-1:-1;;;34724:67:0;;13159:2:1;34724:67:0;;;13141:21:1;13198:2;13178:18;;;13171:30;13237:32;13217:18;;;13210:60;13287:18;;34724:67:0;12957:354:1;34724:67:0;34816:11;;:15;34812:110;;22640:5;34872:11;;34863:6;:20;;;;:::i;:::-;34862:40;;;;:::i;:::-;34856:46;;34812:110;34680:535;;;34967:11;-1:-1:-1;;;;;34961:17:0;:2;-1:-1:-1;;;;;34961:17:0;;34957:258;;35017:14;;35007:6;:24;;34999:68;;;;-1:-1:-1;;;34999:68:0;;13518:2:1;34999:68:0;;;13500:21:1;13557:2;13537:18;;;13530:30;13596:33;13576:18;;;13569:61;13647:18;;34999:68:0;13316:355:1;34999:68:0;35092:12;;:16;35088:112;;22640:5;35149:12;;35140:6;:21;;;;:::i;:::-;35139:41;;;;:::i;:::-;35133:47;;35088:112;35235:17;;35248:3;;35235:17;;;;;35288:12;35297:3;35288:6;:12;:::i;:::-;35279:21;-1:-1:-1;35321:7:0;;35317:87;;35349:39;35363:4;35377;35384:3;35349:13;:39::i;:::-;34487:928;34415:1000;35471:4;35427:23;12822:18;;;;;;;;;;;35427:50;;35581:12;35615:18;;35596:15;:37;;:73;;;;;35658:11;-1:-1:-1;;;;;35650:19:0;:4;-1:-1:-1;;;;;35650:19:0;;;35596:73;:103;;;;-1:-1:-1;;;;;;35674:25:0;;;;;;:19;:25;;;;;;;;35673:26;35596:103;:116;;;;-1:-1:-1;35704:8:0;;;;35703:9;35596:116;:127;;;;-1:-1:-1;35716:7:0;;;;35596:127;35581:142;;35740:7;35736:135;;;35764:8;:15;;-1:-1:-1;;35764:15:0;35775:4;35764:15;;;35794:34;35812:15;35794:17;:34::i;:::-;35843:8;:16;;-1:-1:-1;;35843:16:0;;;35736:135;35883:31;35897:4;35903:2;35907:6;35883:13;:31::i;6187:191::-;6280:6;;;-1:-1:-1;;;;;6297:17:0;;;-1:-1:-1;;;;;;6297:17:0;;;;;;;6330:40;;6280:6;;;6297:17;6280:6;;6330:40;;6261:16;;6330:40;6250:128;6187:191;:::o;15935:1169::-;-1:-1:-1;;;;;16059:18:0;;16055:552;;16213:5;16197:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;16055:552:0;;-1:-1:-1;16055:552:0;;-1:-1:-1;;;;;16273:15:0;;16251:19;16273:15;;;;;;;;;;;16307:19;;;16303:117;;;16354:50;;-1:-1:-1;;;16354:50:0;;-1:-1:-1;;;;;11569:32:1;;16354:50:0;;;11551:51:1;11618:18;;;11611:34;;;11661:18;;;11654:34;;;11524:18;;16354:50:0;11349:345:1;16303:117:0;-1:-1:-1;;;;;16543:15:0;;:9;:15;;;;;;;;;;16561:19;;;;16543:37;;16055:552;-1:-1:-1;;;;;16623:16:0;;16619:435;;16789:12;:21;;;;;;;16619:435;;;-1:-1:-1;;;;;17005:13:0;;:9;:13;;;;;;;;;;:22;;;;;;16619:435;17086:2;-1:-1:-1;;;;;17071:25:0;17080:4;-1:-1:-1;;;;;17071:25:0;;17090:5;17071:25;;;;1463::1;;1451:2;1436:18;;1317:177;17071:25:0;;;;;;;;15935:1169;;;:::o;36224:374::-;36305:1;36291:11;;:15;:35;;;;36325:1;36310:12;;:16;36291:35;36290:51;;;;;36340:1;36331:6;:10;36290:51;36286:305;;;36358:18;36369:6;36358:10;:18::i;:::-;36395:21;:25;36391:189;;36449:10;;-1:-1:-1;;;;;36449:10:0;36441:53;36470:23;36492:1;36470:21;:23;:::i;:::-;36441:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36521:10:0;;36513:51;;-1:-1:-1;;;;;36521:10:0;;;;36542:21;36513:51;;;;;36521:10;36513:51;36521:10;36513:51;36542:21;36521:10;36513:51;;;;;;;;;;;;;;;;;;;;;36224:374;:::o;37107:679::-;37246:16;;;37260:1;37246:16;;;;;;;;37222:21;;37246:16;;;;;;;;;;-1:-1:-1;37246:16:0;37222:40;;37291:4;37273;37278:1;37273:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;37273:23:0;;;-1:-1:-1;;;;;37273:23:0;;;;;37317:15;-1:-1:-1;;;;;37317:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37307:4;37312:1;37307:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;37307:32:0;;;-1:-1:-1;;;;;37307:32:0;;;;;37409:6;37356:50;37374:4;37389:15;37356:9;:50::i;:::-;:59;37352:226;;;37432:134;37467:4;37499:15;-1:-1:-1;;37432:8:0;:134::i;:::-;37616:162;;-1:-1:-1;;;37616:162:0;;-1:-1:-1;;;;;37616:15:0;:37;;;;:162;;37668:6;;37689:1;;37705:4;;37732;;37752:15;;37616:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37616:162:0;;;;;;;;;;;;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:315;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;878:2;863:18;;;;850:32;;-1:-1:-1;;;573:315:1:o;1499:456::-;1576:6;1584;1592;1645:2;1633:9;1624:7;1620:23;1616:32;1613:52;;;1661:1;1658;1651:12;1613:52;1700:9;1687:23;1719:31;1744:5;1719:31;:::i;:::-;1769:5;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:33;1798:32;1839:33;:::i;:::-;1499:456;;1891:7;;-1:-1:-1;;;1945:2:1;1930:18;;;;1917:32;;1499:456::o;1960:247::-;2019:6;2072:2;2060:9;2051:7;2047:23;2043:32;2040:52;;;2088:1;2085;2078:12;2040:52;2127:9;2114:23;2146:31;2171:5;2146:31;:::i;:::-;2196:5;1960:247;-1:-1:-1;;;1960:247:1:o;2401:456::-;2478:6;2486;2494;2547:2;2535:9;2526:7;2522:23;2518:32;2515:52;;;2563:1;2560;2553:12;2515:52;2602:9;2589:23;2621:31;2646:5;2621:31;:::i;:::-;2671:5;-1:-1:-1;2723:2:1;2708:18;;2695:32;;-1:-1:-1;2779:2:1;2764:18;;2751:32;2792:33;2751:32;2792:33;:::i;:::-;2844:7;2834:17;;;2401:456;;;;;:::o;2862:118::-;2948:5;2941:13;2934:21;2927:5;2924:32;2914:60;;2970:1;2967;2960:12;2985:382;3050:6;3058;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;3166:9;3153:23;3185:31;3210:5;3185:31;:::i;:::-;3235:5;-1:-1:-1;3292:2:1;3277:18;;3264:32;3305:30;3264:32;3305:30;:::i;:::-;3354:7;3344:17;;;2985:382;;;;;:::o;3372:180::-;3431:6;3484:2;3472:9;3463:7;3459:23;3455:32;3452:52;;;3500:1;3497;3490:12;3452:52;-1:-1:-1;3523:23:1;;3372:180;-1:-1:-1;3372:180:1:o;3557:615::-;3643:6;3651;3704:2;3692:9;3683:7;3679:23;3675:32;3672:52;;;3720:1;3717;3710:12;3672:52;3760:9;3747:23;3789:18;3830:2;3822:6;3819:14;3816:34;;;3846:1;3843;3836:12;3816:34;3884:6;3873:9;3869:22;3859:32;;3929:7;3922:4;3918:2;3914:13;3910:27;3900:55;;3951:1;3948;3941:12;3900:55;3991:2;3978:16;4017:2;4009:6;4006:14;4003:34;;;4033:1;4030;4023:12;4003:34;4086:7;4081:2;4071:6;4068:1;4064:14;4060:2;4056:23;4052:32;4049:45;4046:65;;;4107:1;4104;4097:12;4046:65;4138:2;4130:11;;;;;4160:6;;-1:-1:-1;3557:615:1;;-1:-1:-1;;;;3557:615:1:o;4385:388::-;4453:6;4461;4514:2;4502:9;4493:7;4489:23;4485:32;4482:52;;;4530:1;4527;4520:12;4482:52;4569:9;4556:23;4588:31;4613:5;4588:31;:::i;:::-;4638:5;-1:-1:-1;4695:2:1;4680:18;;4667:32;4708:33;4667:32;4708:33;:::i;4778:380::-;4857:1;4853:12;;;;4900;;;4921:61;;4975:4;4967:6;4963:17;4953:27;;4921:61;5028:2;5020:6;5017:14;4997:18;4994:38;4991:161;;5074:10;5069:3;5065:20;5062:1;5055:31;5109:4;5106:1;5099:15;5137:4;5134:1;5127:15;4991:161;;4778:380;;;:::o;5163:404::-;5365:2;5347:21;;;5404:2;5384:18;;;5377:30;5443:34;5438:2;5423:18;;5416:62;-1:-1:-1;;;5509:2:1;5494:18;;5487:38;5557:3;5542:19;;5163:404::o;5572:403::-;5774:2;5756:21;;;5813:2;5793:18;;;5786:30;5852:34;5847:2;5832:18;;5825:62;-1:-1:-1;;;5918:2:1;5903:18;;5896:37;5965:3;5950:19;;5572:403::o;6259:245::-;6326:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:52;;;6395:1;6392;6385:12;6347:52;6427:9;6421:16;6446:28;6468:5;6446:28;:::i;7219:404::-;7421:2;7403:21;;;7460:2;7440:18;;;7433:30;7499:34;7494:2;7479:18;;7472:62;-1:-1:-1;;;7565:2:1;7550:18;;7543:38;7613:3;7598:19;;7219:404::o;7628:::-;7830:2;7812:21;;;7869:2;7849:18;;;7842:30;7908:34;7903:2;7888:18;;7881:62;-1:-1:-1;;;7974:2:1;7959:18;;7952:38;8022:3;8007:19;;7628:404::o;8439:127::-;8500:10;8495:3;8491:20;8488:1;8481:31;8531:4;8528:1;8521:15;8555:4;8552:1;8545:15;8571:168;8644:9;;;8675;;8692:15;;;8686:22;;8672:37;8662:71;;8713:18;;:::i;8744:217::-;8784:1;8810;8800:132;;8854:10;8849:3;8845:20;8842:1;8835:31;8889:4;8886:1;8879:15;8917:4;8914:1;8907:15;8800:132;-1:-1:-1;8946:9:1;;8744:217::o;8966:127::-;9027:10;9022:3;9018:20;9015:1;9008:31;9058:4;9055:1;9048:15;9082:4;9079:1;9072:15;10581:404;10783:2;10765:21;;;10822:2;10802:18;;;10795:30;10861:34;10856:2;10841:18;;10834:62;-1:-1:-1;;;10927:2:1;10912:18;;10905:38;10975:3;10960:19;;10581:404::o;12470:125::-;12535:9;;;12556:10;;;12553:36;;;12569:18;;:::i;13676:128::-;13743:9;;;13764:11;;;13761:37;;;13778:18;;:::i;13809:127::-;13870:10;13865:3;13861:20;13858:1;13851:31;13901:4;13898:1;13891:15;13925:4;13922:1;13915:15;13941:251;14011:6;14064:2;14052:9;14043:7;14039:23;14035:32;14032:52;;;14080:1;14077;14070:12;14032:52;14112:9;14106:16;14131:31;14156:5;14131:31;:::i;14197:980::-;14459:4;14507:3;14496:9;14492:19;14538:6;14527:9;14520:25;14564:2;14602:6;14597:2;14586:9;14582:18;14575:34;14645:3;14640:2;14629:9;14625:18;14618:31;14669:6;14704;14698:13;14735:6;14727;14720:22;14773:3;14762:9;14758:19;14751:26;;14812:2;14804:6;14800:15;14786:29;;14833:1;14843:195;14857:6;14854:1;14851:13;14843:195;;;14922:13;;-1:-1:-1;;;;;14918:39:1;14906:52;;15013:15;;;;14978:12;;;;14954:1;14872:9;14843:195;;;-1:-1:-1;;;;;;;15094:32:1;;;;15089:2;15074:18;;15067:60;-1:-1:-1;;;15158:3:1;15143:19;15136:35;15055:3;14197:980;-1:-1:-1;;;14197:980:1:o;15182:1105::-;15277:6;15308:2;15351;15339:9;15330:7;15326:23;15322:32;15319:52;;;15367:1;15364;15357:12;15319:52;15400:9;15394:16;15429:18;15470:2;15462:6;15459:14;15456:34;;;15486:1;15483;15476:12;15456:34;15524:6;15513:9;15509:22;15499:32;;15569:7;15562:4;15558:2;15554:13;15550:27;15540:55;;15591:1;15588;15581:12;15540:55;15620:2;15614:9;15642:2;15638;15635:10;15632:36;;;15648:18;;:::i;:::-;15694:2;15691:1;15687:10;15726:2;15720:9;15789:2;15785:7;15780:2;15776;15772:11;15768:25;15760:6;15756:38;15844:6;15832:10;15829:22;15824:2;15812:10;15809:18;15806:46;15803:72;;;15855:18;;:::i;:::-;15891:2;15884:22;15941:18;;;15975:15;;;;-1:-1:-1;16017:11:1;;;16013:20;;;16045:19;;;16042:39;;;16077:1;16074;16067:12;16042:39;16101:11;;;;16121:135;16137:6;16132:3;16129:15;16121:135;;;16203:10;;16191:23;;16154:12;;;;16234;;;;16121:135;;;16275:6;15182:1105;-1:-1:-1;;;;;;;;15182:1105:1:o

Swarm Source

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