ETH Price: $3,115.94 (+0.22%)
Gas: 3 Gwei

Token

XRAID (XRAID)
 

Overview

Max Total Supply

1,000,000,000 XRAID

Holders

163

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
XRAID

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-22
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the 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 override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

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

// File: contracts/Token.sol



pragma solidity ^0.8.0;






contract XRAID is ERC20, Ownable {
    modifier lockSwap() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

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

    uint256 public constant MAX_SUPPLY = 1_000_000_000 ether;
    uint256 public constant BPS_DENOMINATOR = 10_000;
    uint256 public constant SNIPE_BLOCKS = 2;

    IUniswapV2Router02 internal immutable _router;
    address internal immutable _pair;

    /// @notice Buy taxes in BPS
    uint256[2] public buyTaxes = [100, 6000];
    /// @notice Sell taxes in BPS
    uint256[2] public sellTaxes = [100, 6000];
    /// @notice Maximum that can be bought in a single transaction
    uint256 public maxBuy = 1_000_000 ether;
    /// @notice tokens that are allocated for each tax
    uint256[2] public totalTaxes;
    /// @notice addresses that each tax is sent to
    address payable[2] public taxWallets;
    /// @notice Maps each recipient to their tax exlcusion status
    mapping(address => bool) public taxExcluded;
    /// @notice Maps each recipient to their blacklist status
    mapping(address => bool) public blacklist;

    /// @notice Contract XRAID balance threshold before `_swap` is invoked
    uint256 public minTokenBalance = 1000 ether;
    /// @notice Flag for auto-calling `_swap`
    bool public autoSwap = true;
    /// @notice Flag indicating whether buys/sells are permitted
    bool public tradingActive = false;
    /// @notice Block when trading is first enabled
    uint256 public tradingBlock;

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

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

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

    constructor(IUniswapV2Router02 _uniswapRouter, address payable[2] memory _taxWallets, uint256 _goupAmount)
        ERC20("XRAID", "XRAID")
        Ownable()
    {
        taxExcluded[owner()] = true;
        taxExcluded[address(this)] = true;
        taxWallets = _taxWallets;

        _router = _uniswapRouter;
        _pair = IUniswapV2Factory(_uniswapRouter.factory()).createPair(
            address(this),
            _uniswapRouter.WETH()
        );
        _goup(owner(), _goupAmount);
    }

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

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

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

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

    /// @notice Change the max buy amount
    /// @param _maxBuy The new max buy amount
    function setMaxBuy(uint256 _maxBuy) external onlyOwner {
        emit MaxBuyChanged(maxBuy, _maxBuy);
        maxBuy = _maxBuy;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(sender, recipient, amount);
    }

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

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IUniswapV2Router02","name":"_uniswapRouter","type":"address"},{"internalType":"address payable[2]","name":"_taxWallets","type":"address[2]"},{"internalType":"uint256","name":"_goupAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AutoSwapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"previousTaxes","type":"uint256[2]"},{"indexed":false,"internalType":"uint256[2]","name":"nextTaxes","type":"uint256[2]"}],"name":"BuyTaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextMax","type":"uint256"}],"name":"MaxBuyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextMin","type":"uint256"}],"name":"MinTokenBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"previousTaxes","type":"uint256[2]"},{"indexed":false,"internalType":"uint256[2]","name":"nextTaxes","type":"uint256[2]"}],"name":"SellTaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"taxExcluded","type":"bool"}],"name":"TaxExclusionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable[2]","name":"previousWallets","type":"address[2]"},{"indexed":false,"internalType":"address payable[2]","name":"nextWallets","type":"address[2]"}],"name":"TaxWalletsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxesRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradingActiveChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNIPE_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_autoSwap","type":"bool"}],"name":"setAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_buyTaxes","type":"uint256[2]"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenBalance","type":"uint256"}],"name":"setMinTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_sellTaxes","type":"uint256[2]"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_taxExcluded","type":"bool"}],"name":"setTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[2]","name":"_taxWallets","type":"address[2]"}],"name":"setTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_tradingActive","type":"bool"}],"name":"setTradingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxWallets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526040518060400160405280606461ffff16815260200161177061ffff168152506006906002620000369291906200072a565b506040518060400160405280606461ffff16815260200161177061ffff168152506008906002620000699291906200072a565b5069d3c21bcecceda1000000600a55683635c9adc5dea000006011556001601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff02191690831515021790555060006014556000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055503480156200010357600080fd5b50604051620051ce380380620051ce833981810160405281019062000129919062000a81565b6040518060400160405280600581526020017f58524149440000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f58524149440000000000000000000000000000000000000000000000000000008152508160039081620001a6919062000d1e565b508060049081620001b8919062000d1e565b505050620001db620001cf620004a460201b60201c565b620004ac60201b60201c565b6001600f6000620001f16200057260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600d906002620002ad92919062000775565b508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200032e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000354919062000e36565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e2919062000e36565b6040518363ffffffff1660e01b81526004016200040192919062000e79565b6020604051808303816000875af115801562000421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000447919062000e36565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200049b6200048e6200057260201b60201c565b826200059c60201b60201c565b50505062000fc1565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6b033b2e3c9fd0803ce800000081601454620005b9919062000ed5565b1115620005fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f49062000f71565b60405180910390fd5b806014600082825462000611919062000ed5565b925050819055506200062a82826200069660201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200068a919062000fa4565b60405180910390a35050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620006e3919062000ed5565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b826002810192821562000762579160200282015b8281111562000761578251829061ffff169055916020019190600101906200073e565b5b509050620007719190620007f7565b5090565b8260028101928215620007e4579160200282015b82811115620007e35782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000789565b5b509050620007f39190620007f7565b5090565b5b8082111562000812576000816000905550600101620007f8565b5090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008528262000825565b9050919050565b6000620008668262000845565b9050919050565b620008788162000859565b81146200088457600080fd5b50565b60008151905062000898816200086d565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620008ee82620008a3565b810181811067ffffffffffffffff8211171562000910576200090f620008b4565b5b80604052505050565b60006200092562000816565b9050620009338282620008e3565b919050565b600067ffffffffffffffff821115620009565762000955620008b4565b5b602082029050919050565b600080fd5b6000620009738262000825565b9050919050565b620009858162000966565b81146200099157600080fd5b50565b600081519050620009a5816200097a565b92915050565b6000620009c2620009bc8462000938565b62000919565b90508060208402830185811115620009df57620009de62000961565b5b835b8181101562000a0c5780620009f7888262000994565b845260208401935050602081019050620009e1565b5050509392505050565b600082601f83011262000a2e5762000a2d6200089e565b5b600262000a3d848285620009ab565b91505092915050565b6000819050919050565b62000a5b8162000a46565b811462000a6757600080fd5b50565b60008151905062000a7b8162000a50565b92915050565b60008060006080848603121562000a9d5762000a9c62000820565b5b600062000aad8682870162000887565b935050602062000ac08682870162000a16565b925050606062000ad38682870162000a6a565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b3057607f821691505b60208210810362000b465762000b4562000ae8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000bb07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b71565b62000bbc868362000b71565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000bff62000bf962000bf38462000a46565b62000bd4565b62000a46565b9050919050565b6000819050919050565b62000c1b8362000bde565b62000c3362000c2a8262000c06565b84845462000b7e565b825550505050565b600090565b62000c4a62000c3b565b62000c5781848462000c10565b505050565b5b8181101562000c7f5762000c7360008262000c40565b60018101905062000c5d565b5050565b601f82111562000cce5762000c988162000b4c565b62000ca38462000b61565b8101602085101562000cb3578190505b62000ccb62000cc28562000b61565b83018262000c5c565b50505b505050565b600082821c905092915050565b600062000cf36000198460080262000cd3565b1980831691505092915050565b600062000d0e838362000ce0565b9150826002028217905092915050565b62000d298262000add565b67ffffffffffffffff81111562000d455762000d44620008b4565b5b62000d51825462000b17565b62000d5e82828562000c83565b600060209050601f83116001811462000d96576000841562000d81578287015190505b62000d8d858262000d00565b86555062000dfd565b601f19841662000da68662000b4c565b60005b8281101562000dd05784890151825560018201915060208501945060208101905062000da9565b8683101562000df0578489015162000dec601f89168262000ce0565b8355505b6001600288020188555050505b505050505050565b62000e108162000845565b811462000e1c57600080fd5b50565b60008151905062000e308162000e05565b92915050565b60006020828403121562000e4f5762000e4e62000820565b5b600062000e5f8482850162000e1f565b91505092915050565b62000e738162000845565b82525050565b600060408201905062000e90600083018562000e68565b62000e9f602083018462000e68565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ee28262000a46565b915062000eef8362000a46565b925082820190508082111562000f0a5762000f0962000ea6565b5b92915050565b600082825260208201905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600062000f5960138362000f10565b915062000f668262000f21565b602082019050919050565b6000602082019050818103600083015262000f8c8162000f4a565b9050919050565b62000f9e8162000a46565b82525050565b600060208201905062000fbb600083018462000f93565b92915050565b60805160a0516141bd6200101160003960008181611a1801528181611a9c0152611bbc015260008181610c8001528181610ca701528181611d4801528181611e650152611e8c01526141bd6000f3fe60806040526004361061024a5760003560e01c8063821f658011610139578063a9059cbb116100b6578063e1a452181161007a578063e1a45218146108a0578063f016d83b146108cb578063f2fde38b146108f6578063f50a243b1461091f578063f53bc8351461095c578063f9f92be41461098557610251565b8063a9059cbb146107a7578063b0ac1571146107e4578063bbc0c7421461080d578063cd51e6d414610838578063dd62ed3e1461086357610251565b806393818cfa116100fd57806393818cfa146106c4578063959bd6c2146106ed57806395d89b4114610716578063a457c2d714610741578063a894185d1461077e57610251565b8063821f6580146105df578063853828b61461061c5780638da5cb5b14610633578063912c048c1461065e5780639155e0831461069b57610251565b806339b622d3116101c757806364071d9f1161018b57806364071d9f1461050c57806370a082311461053557806370db69d614610572578063715018a61461059d57806377004851146105b457610251565b806339b622d3146104485780633e9ffbea1461048557806351c6590a1461049c57806352f892fa146104b85780635b78f35f146104e157610251565b806323b872dd1161020e57806323b872dd1461033b5780632c8dc14714610378578063313ce567146103b557806332cb6b0c146103e0578063395093511461040b57610251565b806306fdde0314610256578063095ea7b31461028157806309d2c46a146102be57806318160ddd146102e757806319c2c40d1461031257610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b6109c2565b6040516102789190612aab565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612b70565b610a54565b6040516102b59190612bcb565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612d5a565b610a77565b005b3480156102f357600080fd5b506102fc610ace565b6040516103099190612d96565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612ddd565b610ad8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612e1d565b610b74565b60405161036f9190612bcb565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612e70565b610ba3565b6040516103ac9190612d96565b60405180910390f35b3480156103c157600080fd5b506103ca610bbe565b6040516103d79190612eb9565b60405180910390f35b3480156103ec57600080fd5b506103f5610bc7565b6040516104029190612d96565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612b70565b610bd7565b60405161043f9190612bcb565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190612ed4565b610c0e565b60405161047c9190612bcb565b60405180910390f35b34801561049157600080fd5b5061049a610c2e565b005b6104b660048036038101906104b19190612e70565b610c4d565b005b3480156104c457600080fd5b506104df60048036038101906104da9190612fb2565b610d75565b005b3480156104ed57600080fd5b506104f6610e4c565b6040516105039190612d96565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612fb2565b610e52565b005b34801561054157600080fd5b5061055c60048036038101906105579190612ed4565b610f29565b6040516105699190612d96565b60405180910390f35b34801561057e57600080fd5b50610587610f72565b6040516105949190612d96565b60405180910390f35b3480156105a957600080fd5b506105b2610f78565b005b3480156105c057600080fd5b506105c9610f8c565b6040516105d69190612bcb565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190612e70565b610f9f565b6040516106139190612d96565b60405180910390f35b34801561062857600080fd5b50610631610fba565b005b34801561063f57600080fd5b50610648611012565b6040516106559190612fee565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190612e70565b61103c565b6040516106929190613018565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612ddd565b611072565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613033565b611088565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613033565b6110e4565b005b34801561072257600080fd5b5061072b611147565b6040516107389190612aab565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190612b70565b6111d9565b6040516107759190612bcb565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190613060565b611250565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190612b70565b611375565b6040516107db9190612bcb565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190612e70565b611398565b005b34801561081957600080fd5b506108226113e5565b60405161082f9190612bcb565b60405180910390f35b34801561084457600080fd5b5061084d6113f8565b60405161085a9190612d96565b60405180910390f35b34801561086f57600080fd5b5061088a600480360381019061088591906130b3565b6113fe565b6040516108979190612d96565b60405180910390f35b3480156108ac57600080fd5b506108b5611485565b6040516108c29190612d96565b60405180910390f35b3480156108d757600080fd5b506108e061148b565b6040516108ed9190612d96565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190612ed4565b611490565b005b34801561092b57600080fd5b5061094660048036038101906109419190612e70565b611513565b6040516109539190612d96565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e9190612e70565b61152e565b005b34801561099157600080fd5b506109ac60048036038101906109a79190612ed4565b61157b565b6040516109b99190612bcb565b60405180910390f35b6060600380546109d190613122565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90613122565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b600080610a5f61159b565b9050610a6c8185856115a3565b600191505092915050565b610a7f61176c565b7fbf0afdfa1cb21873aab858ebc02e5db135c9f8e64589cd0d1a668b4d66993ca9600d82604051610ab19291906132d8565b60405180910390a180600d906002610aca9291906128da565b5050565b6000601454905090565b610ae061176c565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610b68929190613301565b60405180910390a15050565b600080610b7f61159b565b9050610b8c8582856117ea565b610b97858585611876565b60019150509392505050565b60088160028110610bb357600080fd5b016000915090505481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b600080610be261159b565b9050610c03818585610bf485896113fe565b610bfe9190613359565b6115a3565b600191505092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b601660009054906101000a900460ff16610c4b57610c4a611c8e565b5b565b610c5561176c565b6001601660016101000a81548160ff021916908315150217905550610c7a30826120e3565b610ca5307f0000000000000000000000000000000000000000000000000000000000000000836115a3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719343084600080610cef611012565b426040518863ffffffff1660e01b8152600401610d11969594939291906133d2565b60606040518083038185885af1158015610d2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d549190613448565b5050506000601660016101000a81548160ff02191690831515021790555050565b610d7d61176c565b61271081600160028110610d9457610d9361349b565b5b602002015182600060028110610dad57610dac61349b565b5b6020020151610dbc9190613359565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061353c565b60405180910390fd5b7ff030bb719ac1227860b29dae4e2aead664a7eb21b5d574d8eb10302e435a57cb600682604051610e2f9291906136be565b60405180910390a1806006906002610e48929190612957565b5050565b60115481565b610e5a61176c565b61271081600160028110610e7157610e7061349b565b5b602002015182600060028110610e8a57610e8961349b565b5b6020020151610e999190613359565b1115610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613759565b60405180910390fd5b7f4e5aa6a1d8a2baf47d4c781f8fa278df4f48fb465fde488841b40aee0868d9f2600882604051610f0c9291906136be565b60405180910390a1806008906002610f25929190612957565b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b610f8061176c565b610f8a60006121cc565b565b601260009054906101000a900460ff1681565b60068160028110610faf57600080fd5b016000915090505481565b610fc261176c565b610fca611012565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561100f573d6000803e3d6000fd5b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d816002811061104c57600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61107a61176c565b6110848282612292565b5050565b61109061176c565b80601260006101000a81548160ff0219169083151502179055507f927009a164f58be5665a2121b2564ae19a66046fb36a397d3fca78f72ba04c3d816040516110d99190612bcb565b60405180910390a150565b6110ec61176c565b80601260016101000a81548160ff021916908315150217905550436013819055507fec78e36312d308764a43b9714c18f6444e2604b277d18be4ea329e0644dbe9b98160405161113c9190612bcb565b60405180910390a150565b60606004805461115690613122565b80601f016020809104026020016040519081016040528092919081815260200182805461118290613122565b80156111cf5780601f106111a4576101008083540402835291602001916111cf565b820191906000526020600020905b8154815290600101906020018083116111b257829003601f168201915b5050505050905090565b6000806111e461159b565b905060006111f282866113fe565b905083811015611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e906137eb565b60405180910390fd5b61124482868684036115a3565b60019250505092915050565b61125861176c565b826000111580156112695750600283105b6112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90613857565b60405180910390fd5b600b83600281106112bc576112bb61349b565b5b0154821115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f7906138e9565b60405180910390fd5b61130b308284612374565b7f13ac772a78d03c80813b3c9c28d72a72d3b31e5ee74e277a88ac0c322a6bfc8f838360405161133c929190613909565b60405180910390a181600b84600281106113595761135861349b565b5b0160008282546113699190613932565b92505081905550505050565b60008061138061159b565b905061138d818585611876565b600191505092915050565b6113a061176c565b7f15426420a06dcf9391d9e4b7557f5cfaba5be0d7bf857b641e78ec375a343425601154826040516113d3929190613909565b60405180910390a18060118190555050565b601260019054906101000a900460ff1681565b60135481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b600281565b61149861176c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906139d8565b60405180910390fd5b611510816121cc565b50565b600b816002811061152357600080fd5b016000915090505481565b61153661176c565b7f4dc2313a84b395e55972a3b89a37fcaf0de5664a014223f644ee10a5cda3d926600a5482604051611569929190613909565b60405180910390a180600a8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613a6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613afc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161175f9190612d96565b60405180910390a3505050565b61177461159b565b73ffffffffffffffffffffffffffffffffffffffff16611792611012565b73ffffffffffffffffffffffffffffffffffffffff16146117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613b68565b60405180910390fd5b565b60006117f684846113fe565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118705781811015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185990613bd4565b60405180910390fd5b61186f84848484036115a3565b5b50505050565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613c40565b60405180910390fd5b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119a45750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156119b9576119b4838383612374565b611c89565b601154600b6001600281106119d1576119d061349b565b5b0154600b6000600281106119e8576119e761349b565b5b01546119f49190613359565b10158015611a0f5750601660009054906101000a900460ff16155b8015611a6757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611a7f5750601260009054906101000a900460ff165b15611a8d57611a8c611c8e565b5b6000819050611a9a612997565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bba57601260019054906101000a900460ff16611b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3390613cac565b60405180910390fd5b6002601354611b4b9190613359565b4311611b5d57611b5c846001612292565b5b611b68836001612521565b8092508193505050600a54831115611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90613d18565b60405180910390fd5b611c71565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c7057601260019054906101000a900460ff16611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613cac565b60405180910390fd5b611c67836000612521565b80925081935050505b5b611c7c858584612374565b611c86858261266d565b50505b505050565b6001601660006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611cc657611cc5612beb565b5b604051908082528060200260200182016040528015611cf45781602001602082028036833780820191505090505b5090503081600081518110611d0c57611d0b61349b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd59190613d4d565b81600181518110611de957611de861349b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600b600160028110611e3a57611e3961349b565b5b0154600b600060028110611e5157611e5061349b565b5b0154611e5d9190613359565b9050611e8a307f0000000000000000000000000000000000000000000000000000000000000000836115a3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478260008530426040518663ffffffff1660e01b8152600401611eec959493929190613e38565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b505050506000479050600082600b600060028110611f3b57611f3a61349b565b5b015483611f489190613e92565b611f529190613f03565b9050600083600b600160028110611f6c57611f6b61349b565b5b015484611f799190613e92565b611f839190613f03565b90506040518060400160405280600060ff168152602001600060ff16815250600b906002611fb29291906129b9565b50600082111561203a57600d600060028110611fd157611fd061349b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612038573d6000803e3d6000fd5b505b60008111156120c157600d6001600281106120585761205761349b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156120bf573d6000803e3d6000fd5b505b50505050506000601660006101000a81548160ff021916908315150217905550565b6b033b2e3c9fd0803ce8000000816014546120fe9190613359565b111561213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690613f80565b60405180910390fd5b80601460008282546121519190613359565b9250508190555061216282826127b6565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121c09190612d96565b60405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168360405161231193929190613fa0565b60405180910390a180601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614023565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612452576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124499061408f565b60405180910390fd5b600061245d84610f29565b9050818110156124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906140fb565b60405180910390fd5b6124ac8483612848565b6124b683836127b6565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125139190612d96565b60405180910390a350505050565b600061252b612997565b82156125a957604051806040016040528061271060066000600281106125545761255361349b565b5b0154876125619190613e92565b61256b9190613f03565b815260200161271060066001600281106125885761258761349b565b5b0154876125959190613e92565b61259f9190613f03565b815250905061261d565b604051806040016040528061271060086000600281106125cc576125cb61349b565b5b0154876125d99190613e92565b6125e39190613f03565b81526020016127106008600160028110612600576125ff61349b565b5b01548761260d9190613e92565b6126179190613f03565b81525090505b806001600281106126315761263061349b565b5b60200201518160006002811061264a5761264961349b565b5b60200201518561265a9190613932565b6126649190613932565b91509250929050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614167565b60405180910390fd5b6000816001600281106126f2576126f161349b565b5b60200201518260006002811061270b5761270a61349b565b5b602002015161271a9190613359565b9050612727833083612374565b8160006002811061273b5761273a61349b565b5b6020020151600b6000600281106127555761275461349b565b5b0160008282546127659190613359565b92505081905550816001600281106127805761277f61349b565b5b6020020151600b60016002811061279a5761279961349b565b5b0160008282546127aa9190613359565b92505081905550505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128019190613359565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128939190613932565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8260028101928215612946579160200282015b828111156129455782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128ed565b5b50905061295391906129fe565b5090565b8260028101928215612986579160200282015b8281111561298557825182559160200191906001019061296a565b5b50905061299391906129fe565b5090565b6040518060400160405280600290602082028036833780820191505090505090565b82600281019282156129ed579160200282015b828111156129ec578251829060ff169055916020019190600101906129cc565b5b5090506129fa91906129fe565b5090565b5b80821115612a175760008160009055506001016129ff565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a55578082015181840152602081019050612a3a565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a7d82612a1b565b612a878185612a26565b9350612a97818560208601612a37565b612aa081612a61565b840191505092915050565b60006020820190508181036000830152612ac58184612a72565b905092915050565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b0782612adc565b9050919050565b612b1781612afc565b8114612b2257600080fd5b50565b600081359050612b3481612b0e565b92915050565b6000819050919050565b612b4d81612b3a565b8114612b5857600080fd5b50565b600081359050612b6a81612b44565b92915050565b60008060408385031215612b8757612b86612ad7565b5b6000612b9585828601612b25565b9250506020612ba685828601612b5b565b9150509250929050565b60008115159050919050565b612bc581612bb0565b82525050565b6000602082019050612be06000830184612bbc565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c2382612a61565b810181811067ffffffffffffffff82111715612c4257612c41612beb565b5b80604052505050565b6000612c55612acd565b9050612c618282612c1a565b919050565b600067ffffffffffffffff821115612c8157612c80612beb565b5b602082029050919050565b600080fd5b6000612c9c82612adc565b9050919050565b612cac81612c91565b8114612cb757600080fd5b50565b600081359050612cc981612ca3565b92915050565b6000612ce2612cdd84612c66565b612c4b565b90508060208402830185811115612cfc57612cfb612c8c565b5b835b81811015612d255780612d118882612cba565b845260208401935050602081019050612cfe565b5050509392505050565b600082601f830112612d4457612d43612be6565b5b6002612d51848285612ccf565b91505092915050565b600060408284031215612d7057612d6f612ad7565b5b6000612d7e84828501612d2f565b91505092915050565b612d9081612b3a565b82525050565b6000602082019050612dab6000830184612d87565b92915050565b612dba81612bb0565b8114612dc557600080fd5b50565b600081359050612dd781612db1565b92915050565b60008060408385031215612df457612df3612ad7565b5b6000612e0285828601612b25565b9250506020612e1385828601612dc8565b9150509250929050565b600080600060608486031215612e3657612e35612ad7565b5b6000612e4486828701612b25565b9350506020612e5586828701612b25565b9250506040612e6686828701612b5b565b9150509250925092565b600060208284031215612e8657612e85612ad7565b5b6000612e9484828501612b5b565b91505092915050565b600060ff82169050919050565b612eb381612e9d565b82525050565b6000602082019050612ece6000830184612eaa565b92915050565b600060208284031215612eea57612ee9612ad7565b5b6000612ef884828501612b25565b91505092915050565b600067ffffffffffffffff821115612f1c57612f1b612beb565b5b602082029050919050565b6000612f3a612f3584612f01565b612c4b565b90508060208402830185811115612f5457612f53612c8c565b5b835b81811015612f7d5780612f698882612b5b565b845260208401935050602081019050612f56565b5050509392505050565b600082601f830112612f9c57612f9b612be6565b5b6002612fa9848285612f27565b91505092915050565b600060408284031215612fc857612fc7612ad7565b5b6000612fd684828501612f87565b91505092915050565b612fe881612afc565b82525050565b60006020820190506130036000830184612fdf565b92915050565b61301281612c91565b82525050565b600060208201905061302d6000830184613009565b92915050565b60006020828403121561304957613048612ad7565b5b600061305784828501612dc8565b91505092915050565b60008060006060848603121561307957613078612ad7565b5b600061308786828701612b5b565b935050602061309886828701612b5b565b92505060406130a986828701612b25565b9150509250925092565b600080604083850312156130ca576130c9612ad7565b5b60006130d885828601612b25565b92505060206130e985828601612b25565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061313a57607f821691505b60208210810361314d5761314c6130f3565b5b50919050565b600060029050919050565b600081905092915050565b6000819050919050565b61317c81612c91565b82525050565b600061318e8383613173565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131da6131d58361319a565b6131a7565b9050919050565b60006131ed82546131c7565b9050919050565b6000600182019050919050565b61320a81613153565b613214818461315e565b925061321f82613169565b8060005b8381101561325757613234826131e1565b61323e8782613182565b9650613249836131f4565b925050600181019050613223565b505050505050565b600060029050919050565b6000819050919050565b6000602082019050919050565b61328a8161325f565b613294818461315e565b925061329f8261326a565b8060005b838110156132d05781516132b78782613182565b96506132c283613274565b9250506001810190506132a3565b505050505050565b60006080820190506132ed6000830185613201565b6132fa6040830184613281565b9392505050565b60006040820190506133166000830185612fdf565b6133236020830184612bbc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061336482612b3a565b915061336f83612b3a565b92508282019050808211156133875761338661332a565b5b92915050565b6000819050919050565b6000819050919050565b60006133bc6133b76133b28461338d565b613397565b612b3a565b9050919050565b6133cc816133a1565b82525050565b600060c0820190506133e76000830189612fdf565b6133f46020830188612d87565b61340160408301876133c3565b61340e60608301866133c3565b61341b6080830185612fdf565b61342860a0830184612d87565b979650505050505050565b60008151905061344281612b44565b92915050565b60008060006060848603121561346157613460612ad7565b5b600061346f86828701613433565b935050602061348086828701613433565b925050604061349186828701613433565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f73756d285f6275795461786573292063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613526602c83612a26565b9150613531826134ca565b604082019050919050565b6000602082019050818103600083015261355581613519565b9050919050565b600060029050919050565b600081905092915050565b6000819050919050565b61358581612b3a565b82525050565b6000613597838361357c565b60208301905092915050565b6000819050919050565b60006135c06135bb8361319a565b6135a3565b9050919050565b60006135d382546135ad565b9050919050565b6000600182019050919050565b6135f08161355c565b6135fa8184613567565b925061360582613572565b8060005b8381101561363d5761361a826135c7565b613624878261358b565b965061362f836135da565b925050600181019050613609565b505050505050565b600060029050919050565b6000819050919050565b6000602082019050919050565b61367081613645565b61367a8184613567565b925061368582613650565b8060005b838110156136b657815161369d878261358b565b96506136a88361365a565b925050600181019050613689565b505050505050565b60006080820190506136d360008301856135e7565b6136e06040830184613667565b9392505050565b7f73756d285f73656c6c5461786573292063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613743602d83612a26565b915061374e826136e7565b604082019050919050565b6000602082019050818103600083015261377281613736565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006137d5602583612a26565b91506137e082613779565b604082019050919050565b60006020820190508181036000830152613804816137c8565b9050919050565b7f5f696e646578204f4f4200000000000000000000000000000000000000000000600082015250565b6000613841600a83612a26565b915061384c8261380b565b602082019050919050565b6000602082019050818103600083015261387081613834565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5461780000000000000000000000000000000000000000000000000000602082015250565b60006138d3602683612a26565b91506138de82613877565b604082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b600060408201905061391e6000830185612d87565b61392b6020830184612d87565b9392505050565b600061393d82612b3a565b915061394883612b3a565b92508282039050818111156139605761395f61332a565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139c2602683612a26565b91506139cd82613966565b604082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a54602483612a26565b9150613a5f826139f8565b604082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ae6602283612a26565b9150613af182613a8a565b604082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b52602083612a26565b9150613b5d82613b1c565b602082019050919050565b60006020820190508181036000830152613b8181613b45565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613bbe601d83612a26565b9150613bc982613b88565b602082019050919050565b60006020820190508181036000830152613bed81613bb1565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000613c2a601883612a26565b9150613c3582613bf4565b602082019050919050565b60006020820190508181036000830152613c5981613c1d565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b6000613c96601983612a26565b9150613ca182613c60565b602082019050919050565b60006020820190508181036000830152613cc581613c89565b9050919050565b7f42757920616d6f756e742065786365656473206d617842757900000000000000600082015250565b6000613d02601983612a26565b9150613d0d82613ccc565b602082019050919050565b60006020820190508181036000830152613d3181613cf5565b9050919050565b600081519050613d4781612b0e565b92915050565b600060208284031215613d6357613d62612ad7565b5b6000613d7184828501613d38565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613daf81612afc565b82525050565b6000613dc18383613da6565b60208301905092915050565b6000602082019050919050565b6000613de582613d7a565b613def8185613d85565b9350613dfa83613d96565b8060005b83811015613e2b578151613e128882613db5565b9750613e1d83613dcd565b925050600181019050613dfe565b5085935050505092915050565b600060a082019050613e4d6000830188612d87565b613e5a60208301876133c3565b8181036040830152613e6c8186613dda565b9050613e7b6060830185612fdf565b613e886080830184612d87565b9695505050505050565b6000613e9d82612b3a565b9150613ea883612b3a565b9250828202613eb681612b3a565b91508282048414831517613ecd57613ecc61332a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0e82612b3a565b9150613f1983612b3a565b925082613f2957613f28613ed4565b5b828204905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000613f6a601383612a26565b9150613f7582613f34565b602082019050919050565b60006020820190508181036000830152613f9981613f5d565b9050919050565b6000606082019050613fb56000830186612fdf565b613fc26020830185612bbc565b613fcf6040830184612bbc565b949350505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b600061400d601e83612a26565b915061401882613fd7565b602082019050919050565b6000602082019050818103600083015261403c81614000565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000614079601c83612a26565b915061408482614043565b602082019050919050565b600060208201905081810360008301526140a88161406c565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b60006140e5601f83612a26565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b6000614151601e83612a26565b915061415c8261411b565b602082019050919050565b6000602082019050818103600083015261418081614144565b905091905056fea264697066735822122073b63bdf4248c759f7282990da61ae08eba21fface95c618f69ceca8ea74c1ce64736f6c634300081300330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000fd181dc0cbdfcfacb7e0d364374efb6df4185cd3000000000000000000000000ffebed22f139f0bb52c6dcd2d99cb96d57f7240a00000000000000000000000000000000000000000094e47b8d68171534000000

Deployed Bytecode

0x60806040526004361061024a5760003560e01c8063821f658011610139578063a9059cbb116100b6578063e1a452181161007a578063e1a45218146108a0578063f016d83b146108cb578063f2fde38b146108f6578063f50a243b1461091f578063f53bc8351461095c578063f9f92be41461098557610251565b8063a9059cbb146107a7578063b0ac1571146107e4578063bbc0c7421461080d578063cd51e6d414610838578063dd62ed3e1461086357610251565b806393818cfa116100fd57806393818cfa146106c4578063959bd6c2146106ed57806395d89b4114610716578063a457c2d714610741578063a894185d1461077e57610251565b8063821f6580146105df578063853828b61461061c5780638da5cb5b14610633578063912c048c1461065e5780639155e0831461069b57610251565b806339b622d3116101c757806364071d9f1161018b57806364071d9f1461050c57806370a082311461053557806370db69d614610572578063715018a61461059d57806377004851146105b457610251565b806339b622d3146104485780633e9ffbea1461048557806351c6590a1461049c57806352f892fa146104b85780635b78f35f146104e157610251565b806323b872dd1161020e57806323b872dd1461033b5780632c8dc14714610378578063313ce567146103b557806332cb6b0c146103e0578063395093511461040b57610251565b806306fdde0314610256578063095ea7b31461028157806309d2c46a146102be57806318160ddd146102e757806319c2c40d1461031257610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b6109c2565b6040516102789190612aab565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612b70565b610a54565b6040516102b59190612bcb565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612d5a565b610a77565b005b3480156102f357600080fd5b506102fc610ace565b6040516103099190612d96565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612ddd565b610ad8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612e1d565b610b74565b60405161036f9190612bcb565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612e70565b610ba3565b6040516103ac9190612d96565b60405180910390f35b3480156103c157600080fd5b506103ca610bbe565b6040516103d79190612eb9565b60405180910390f35b3480156103ec57600080fd5b506103f5610bc7565b6040516104029190612d96565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612b70565b610bd7565b60405161043f9190612bcb565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190612ed4565b610c0e565b60405161047c9190612bcb565b60405180910390f35b34801561049157600080fd5b5061049a610c2e565b005b6104b660048036038101906104b19190612e70565b610c4d565b005b3480156104c457600080fd5b506104df60048036038101906104da9190612fb2565b610d75565b005b3480156104ed57600080fd5b506104f6610e4c565b6040516105039190612d96565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190612fb2565b610e52565b005b34801561054157600080fd5b5061055c60048036038101906105579190612ed4565b610f29565b6040516105699190612d96565b60405180910390f35b34801561057e57600080fd5b50610587610f72565b6040516105949190612d96565b60405180910390f35b3480156105a957600080fd5b506105b2610f78565b005b3480156105c057600080fd5b506105c9610f8c565b6040516105d69190612bcb565b60405180910390f35b3480156105eb57600080fd5b5061060660048036038101906106019190612e70565b610f9f565b6040516106139190612d96565b60405180910390f35b34801561062857600080fd5b50610631610fba565b005b34801561063f57600080fd5b50610648611012565b6040516106559190612fee565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190612e70565b61103c565b6040516106929190613018565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612ddd565b611072565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613033565b611088565b005b3480156106f957600080fd5b50610714600480360381019061070f9190613033565b6110e4565b005b34801561072257600080fd5b5061072b611147565b6040516107389190612aab565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190612b70565b6111d9565b6040516107759190612bcb565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190613060565b611250565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190612b70565b611375565b6040516107db9190612bcb565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190612e70565b611398565b005b34801561081957600080fd5b506108226113e5565b60405161082f9190612bcb565b60405180910390f35b34801561084457600080fd5b5061084d6113f8565b60405161085a9190612d96565b60405180910390f35b34801561086f57600080fd5b5061088a600480360381019061088591906130b3565b6113fe565b6040516108979190612d96565b60405180910390f35b3480156108ac57600080fd5b506108b5611485565b6040516108c29190612d96565b60405180910390f35b3480156108d757600080fd5b506108e061148b565b6040516108ed9190612d96565b60405180910390f35b34801561090257600080fd5b5061091d60048036038101906109189190612ed4565b611490565b005b34801561092b57600080fd5b5061094660048036038101906109419190612e70565b611513565b6040516109539190612d96565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e9190612e70565b61152e565b005b34801561099157600080fd5b506109ac60048036038101906109a79190612ed4565b61157b565b6040516109b99190612bcb565b60405180910390f35b6060600380546109d190613122565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90613122565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b600080610a5f61159b565b9050610a6c8185856115a3565b600191505092915050565b610a7f61176c565b7fbf0afdfa1cb21873aab858ebc02e5db135c9f8e64589cd0d1a668b4d66993ca9600d82604051610ab19291906132d8565b60405180910390a180600d906002610aca9291906128da565b5050565b6000601454905090565b610ae061176c565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610b68929190613301565b60405180910390a15050565b600080610b7f61159b565b9050610b8c8582856117ea565b610b97858585611876565b60019150509392505050565b60088160028110610bb357600080fd5b016000915090505481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b600080610be261159b565b9050610c03818585610bf485896113fe565b610bfe9190613359565b6115a3565b600191505092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b601660009054906101000a900460ff16610c4b57610c4a611c8e565b5b565b610c5561176c565b6001601660016101000a81548160ff021916908315150217905550610c7a30826120e3565b610ca5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d836115a3565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719343084600080610cef611012565b426040518863ffffffff1660e01b8152600401610d11969594939291906133d2565b60606040518083038185885af1158015610d2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d549190613448565b5050506000601660016101000a81548160ff02191690831515021790555050565b610d7d61176c565b61271081600160028110610d9457610d9361349b565b5b602002015182600060028110610dad57610dac61349b565b5b6020020151610dbc9190613359565b1115610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061353c565b60405180910390fd5b7ff030bb719ac1227860b29dae4e2aead664a7eb21b5d574d8eb10302e435a57cb600682604051610e2f9291906136be565b60405180910390a1806006906002610e48929190612957565b5050565b60115481565b610e5a61176c565b61271081600160028110610e7157610e7061349b565b5b602002015182600060028110610e8a57610e8961349b565b5b6020020151610e999190613359565b1115610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613759565b60405180910390fd5b7f4e5aa6a1d8a2baf47d4c781f8fa278df4f48fb465fde488841b40aee0868d9f2600882604051610f0c9291906136be565b60405180910390a1806008906002610f25929190612957565b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b610f8061176c565b610f8a60006121cc565b565b601260009054906101000a900460ff1681565b60068160028110610faf57600080fd5b016000915090505481565b610fc261176c565b610fca611012565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561100f573d6000803e3d6000fd5b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d816002811061104c57600080fd5b016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61107a61176c565b6110848282612292565b5050565b61109061176c565b80601260006101000a81548160ff0219169083151502179055507f927009a164f58be5665a2121b2564ae19a66046fb36a397d3fca78f72ba04c3d816040516110d99190612bcb565b60405180910390a150565b6110ec61176c565b80601260016101000a81548160ff021916908315150217905550436013819055507fec78e36312d308764a43b9714c18f6444e2604b277d18be4ea329e0644dbe9b98160405161113c9190612bcb565b60405180910390a150565b60606004805461115690613122565b80601f016020809104026020016040519081016040528092919081815260200182805461118290613122565b80156111cf5780601f106111a4576101008083540402835291602001916111cf565b820191906000526020600020905b8154815290600101906020018083116111b257829003601f168201915b5050505050905090565b6000806111e461159b565b905060006111f282866113fe565b905083811015611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e906137eb565b60405180910390fd5b61124482868684036115a3565b60019250505092915050565b61125861176c565b826000111580156112695750600283105b6112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90613857565b60405180910390fd5b600b83600281106112bc576112bb61349b565b5b0154821115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f7906138e9565b60405180910390fd5b61130b308284612374565b7f13ac772a78d03c80813b3c9c28d72a72d3b31e5ee74e277a88ac0c322a6bfc8f838360405161133c929190613909565b60405180910390a181600b84600281106113595761135861349b565b5b0160008282546113699190613932565b92505081905550505050565b60008061138061159b565b905061138d818585611876565b600191505092915050565b6113a061176c565b7f15426420a06dcf9391d9e4b7557f5cfaba5be0d7bf857b641e78ec375a343425601154826040516113d3929190613909565b60405180910390a18060118190555050565b601260019054906101000a900460ff1681565b60135481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b600281565b61149861176c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906139d8565b60405180910390fd5b611510816121cc565b50565b600b816002811061152357600080fd5b016000915090505481565b61153661176c565b7f4dc2313a84b395e55972a3b89a37fcaf0de5664a014223f644ee10a5cda3d926600a5482604051611569929190613909565b60405180910390a180600a8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613a6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613afc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161175f9190612d96565b60405180910390a3505050565b61177461159b565b73ffffffffffffffffffffffffffffffffffffffff16611792611012565b73ffffffffffffffffffffffffffffffffffffffff16146117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90613b68565b60405180910390fd5b565b60006117f684846113fe565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118705781811015611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185990613bd4565b60405180910390fd5b61186f84848484036115a3565b5b50505050565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613c40565b60405180910390fd5b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119a45750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156119b9576119b4838383612374565b611c89565b601154600b6001600281106119d1576119d061349b565b5b0154600b6000600281106119e8576119e761349b565b5b01546119f49190613359565b10158015611a0f5750601660009054906101000a900460ff16155b8015611a6757507f00000000000000000000000049a43e0ce1f72250a7e0031df40828fa9b949f2f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611a7f5750601260009054906101000a900460ff165b15611a8d57611a8c611c8e565b5b6000819050611a9a612997565b7f00000000000000000000000049a43e0ce1f72250a7e0031df40828fa9b949f2f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bba57601260019054906101000a900460ff16611b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3390613cac565b60405180910390fd5b6002601354611b4b9190613359565b4311611b5d57611b5c846001612292565b5b611b68836001612521565b8092508193505050600a54831115611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90613d18565b60405180910390fd5b611c71565b7f00000000000000000000000049a43e0ce1f72250a7e0031df40828fa9b949f2f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c7057601260019054906101000a900460ff16611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613cac565b60405180910390fd5b611c67836000612521565b80925081935050505b5b611c7c858584612374565b611c86858261266d565b50505b505050565b6001601660006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611cc657611cc5612beb565b5b604051908082528060200260200182016040528015611cf45781602001602082028036833780820191505090505b5090503081600081518110611d0c57611d0b61349b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd59190613d4d565b81600181518110611de957611de861349b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600b600160028110611e3a57611e3961349b565b5b0154600b600060028110611e5157611e5061349b565b5b0154611e5d9190613359565b9050611e8a307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d836115a3565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478260008530426040518663ffffffff1660e01b8152600401611eec959493929190613e38565b600060405180830381600087803b158015611f0657600080fd5b505af1158015611f1a573d6000803e3d6000fd5b505050506000479050600082600b600060028110611f3b57611f3a61349b565b5b015483611f489190613e92565b611f529190613f03565b9050600083600b600160028110611f6c57611f6b61349b565b5b015484611f799190613e92565b611f839190613f03565b90506040518060400160405280600060ff168152602001600060ff16815250600b906002611fb29291906129b9565b50600082111561203a57600d600060028110611fd157611fd061349b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612038573d6000803e3d6000fd5b505b60008111156120c157600d6001600281106120585761205761349b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156120bf573d6000803e3d6000fd5b505b50505050506000601660006101000a81548160ff021916908315150217905550565b6b033b2e3c9fd0803ce8000000816014546120fe9190613359565b111561213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690613f80565b60405180910390fd5b80601460008282546121519190613359565b9250508190555061216282826127b6565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121c09190612d96565b60405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168360405161231193929190613fa0565b60405180910390a180601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614023565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612452576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124499061408f565b60405180910390fd5b600061245d84610f29565b9050818110156124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906140fb565b60405180910390fd5b6124ac8483612848565b6124b683836127b6565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125139190612d96565b60405180910390a350505050565b600061252b612997565b82156125a957604051806040016040528061271060066000600281106125545761255361349b565b5b0154876125619190613e92565b61256b9190613f03565b815260200161271060066001600281106125885761258761349b565b5b0154876125959190613e92565b61259f9190613f03565b815250905061261d565b604051806040016040528061271060086000600281106125cc576125cb61349b565b5b0154876125d99190613e92565b6125e39190613f03565b81526020016127106008600160028110612600576125ff61349b565b5b01548761260d9190613e92565b6126179190613f03565b81525090505b806001600281106126315761263061349b565b5b60200201518160006002811061264a5761264961349b565b5b60200201518561265a9190613932565b6126649190613932565b91509250929050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614167565b60405180910390fd5b6000816001600281106126f2576126f161349b565b5b60200201518260006002811061270b5761270a61349b565b5b602002015161271a9190613359565b9050612727833083612374565b8160006002811061273b5761273a61349b565b5b6020020151600b6000600281106127555761275461349b565b5b0160008282546127659190613359565b92505081905550816001600281106127805761277f61349b565b5b6020020151600b60016002811061279a5761279961349b565b5b0160008282546127aa9190613359565b92505081905550505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128019190613359565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128939190613932565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8260028101928215612946579160200282015b828111156129455782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128ed565b5b50905061295391906129fe565b5090565b8260028101928215612986579160200282015b8281111561298557825182559160200191906001019061296a565b5b50905061299391906129fe565b5090565b6040518060400160405280600290602082028036833780820191505090505090565b82600281019282156129ed579160200282015b828111156129ec578251829060ff169055916020019190600101906129cc565b5b5090506129fa91906129fe565b5090565b5b80821115612a175760008160009055506001016129ff565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a55578082015181840152602081019050612a3a565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a7d82612a1b565b612a878185612a26565b9350612a97818560208601612a37565b612aa081612a61565b840191505092915050565b60006020820190508181036000830152612ac58184612a72565b905092915050565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b0782612adc565b9050919050565b612b1781612afc565b8114612b2257600080fd5b50565b600081359050612b3481612b0e565b92915050565b6000819050919050565b612b4d81612b3a565b8114612b5857600080fd5b50565b600081359050612b6a81612b44565b92915050565b60008060408385031215612b8757612b86612ad7565b5b6000612b9585828601612b25565b9250506020612ba685828601612b5b565b9150509250929050565b60008115159050919050565b612bc581612bb0565b82525050565b6000602082019050612be06000830184612bbc565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c2382612a61565b810181811067ffffffffffffffff82111715612c4257612c41612beb565b5b80604052505050565b6000612c55612acd565b9050612c618282612c1a565b919050565b600067ffffffffffffffff821115612c8157612c80612beb565b5b602082029050919050565b600080fd5b6000612c9c82612adc565b9050919050565b612cac81612c91565b8114612cb757600080fd5b50565b600081359050612cc981612ca3565b92915050565b6000612ce2612cdd84612c66565b612c4b565b90508060208402830185811115612cfc57612cfb612c8c565b5b835b81811015612d255780612d118882612cba565b845260208401935050602081019050612cfe565b5050509392505050565b600082601f830112612d4457612d43612be6565b5b6002612d51848285612ccf565b91505092915050565b600060408284031215612d7057612d6f612ad7565b5b6000612d7e84828501612d2f565b91505092915050565b612d9081612b3a565b82525050565b6000602082019050612dab6000830184612d87565b92915050565b612dba81612bb0565b8114612dc557600080fd5b50565b600081359050612dd781612db1565b92915050565b60008060408385031215612df457612df3612ad7565b5b6000612e0285828601612b25565b9250506020612e1385828601612dc8565b9150509250929050565b600080600060608486031215612e3657612e35612ad7565b5b6000612e4486828701612b25565b9350506020612e5586828701612b25565b9250506040612e6686828701612b5b565b9150509250925092565b600060208284031215612e8657612e85612ad7565b5b6000612e9484828501612b5b565b91505092915050565b600060ff82169050919050565b612eb381612e9d565b82525050565b6000602082019050612ece6000830184612eaa565b92915050565b600060208284031215612eea57612ee9612ad7565b5b6000612ef884828501612b25565b91505092915050565b600067ffffffffffffffff821115612f1c57612f1b612beb565b5b602082029050919050565b6000612f3a612f3584612f01565b612c4b565b90508060208402830185811115612f5457612f53612c8c565b5b835b81811015612f7d5780612f698882612b5b565b845260208401935050602081019050612f56565b5050509392505050565b600082601f830112612f9c57612f9b612be6565b5b6002612fa9848285612f27565b91505092915050565b600060408284031215612fc857612fc7612ad7565b5b6000612fd684828501612f87565b91505092915050565b612fe881612afc565b82525050565b60006020820190506130036000830184612fdf565b92915050565b61301281612c91565b82525050565b600060208201905061302d6000830184613009565b92915050565b60006020828403121561304957613048612ad7565b5b600061305784828501612dc8565b91505092915050565b60008060006060848603121561307957613078612ad7565b5b600061308786828701612b5b565b935050602061309886828701612b5b565b92505060406130a986828701612b25565b9150509250925092565b600080604083850312156130ca576130c9612ad7565b5b60006130d885828601612b25565b92505060206130e985828601612b25565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061313a57607f821691505b60208210810361314d5761314c6130f3565b5b50919050565b600060029050919050565b600081905092915050565b6000819050919050565b61317c81612c91565b82525050565b600061318e8383613173565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131da6131d58361319a565b6131a7565b9050919050565b60006131ed82546131c7565b9050919050565b6000600182019050919050565b61320a81613153565b613214818461315e565b925061321f82613169565b8060005b8381101561325757613234826131e1565b61323e8782613182565b9650613249836131f4565b925050600181019050613223565b505050505050565b600060029050919050565b6000819050919050565b6000602082019050919050565b61328a8161325f565b613294818461315e565b925061329f8261326a565b8060005b838110156132d05781516132b78782613182565b96506132c283613274565b9250506001810190506132a3565b505050505050565b60006080820190506132ed6000830185613201565b6132fa6040830184613281565b9392505050565b60006040820190506133166000830185612fdf565b6133236020830184612bbc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061336482612b3a565b915061336f83612b3a565b92508282019050808211156133875761338661332a565b5b92915050565b6000819050919050565b6000819050919050565b60006133bc6133b76133b28461338d565b613397565b612b3a565b9050919050565b6133cc816133a1565b82525050565b600060c0820190506133e76000830189612fdf565b6133f46020830188612d87565b61340160408301876133c3565b61340e60608301866133c3565b61341b6080830185612fdf565b61342860a0830184612d87565b979650505050505050565b60008151905061344281612b44565b92915050565b60008060006060848603121561346157613460612ad7565b5b600061346f86828701613433565b935050602061348086828701613433565b925050604061349186828701613433565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f73756d285f6275795461786573292063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613526602c83612a26565b9150613531826134ca565b604082019050919050565b6000602082019050818103600083015261355581613519565b9050919050565b600060029050919050565b600081905092915050565b6000819050919050565b61358581612b3a565b82525050565b6000613597838361357c565b60208301905092915050565b6000819050919050565b60006135c06135bb8361319a565b6135a3565b9050919050565b60006135d382546135ad565b9050919050565b6000600182019050919050565b6135f08161355c565b6135fa8184613567565b925061360582613572565b8060005b8381101561363d5761361a826135c7565b613624878261358b565b965061362f836135da565b925050600181019050613609565b505050505050565b600060029050919050565b6000819050919050565b6000602082019050919050565b61367081613645565b61367a8184613567565b925061368582613650565b8060005b838110156136b657815161369d878261358b565b96506136a88361365a565b925050600181019050613689565b505050505050565b60006080820190506136d360008301856135e7565b6136e06040830184613667565b9392505050565b7f73756d285f73656c6c5461786573292063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613743602d83612a26565b915061374e826136e7565b604082019050919050565b6000602082019050818103600083015261377281613736565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006137d5602583612a26565b91506137e082613779565b604082019050919050565b60006020820190508181036000830152613804816137c8565b9050919050565b7f5f696e646578204f4f4200000000000000000000000000000000000000000000600082015250565b6000613841600a83612a26565b915061384c8261380b565b602082019050919050565b6000602082019050818103600083015261387081613834565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5461780000000000000000000000000000000000000000000000000000602082015250565b60006138d3602683612a26565b91506138de82613877565b604082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b600060408201905061391e6000830185612d87565b61392b6020830184612d87565b9392505050565b600061393d82612b3a565b915061394883612b3a565b92508282039050818111156139605761395f61332a565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139c2602683612a26565b91506139cd82613966565b604082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a54602483612a26565b9150613a5f826139f8565b604082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ae6602283612a26565b9150613af182613a8a565b604082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b52602083612a26565b9150613b5d82613b1c565b602082019050919050565b60006020820190508181036000830152613b8181613b45565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613bbe601d83612a26565b9150613bc982613b88565b602082019050919050565b60006020820190508181036000830152613bed81613bb1565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000613c2a601883612a26565b9150613c3582613bf4565b602082019050919050565b60006020820190508181036000830152613c5981613c1d565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b6000613c96601983612a26565b9150613ca182613c60565b602082019050919050565b60006020820190508181036000830152613cc581613c89565b9050919050565b7f42757920616d6f756e742065786365656473206d617842757900000000000000600082015250565b6000613d02601983612a26565b9150613d0d82613ccc565b602082019050919050565b60006020820190508181036000830152613d3181613cf5565b9050919050565b600081519050613d4781612b0e565b92915050565b600060208284031215613d6357613d62612ad7565b5b6000613d7184828501613d38565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613daf81612afc565b82525050565b6000613dc18383613da6565b60208301905092915050565b6000602082019050919050565b6000613de582613d7a565b613def8185613d85565b9350613dfa83613d96565b8060005b83811015613e2b578151613e128882613db5565b9750613e1d83613dcd565b925050600181019050613dfe565b5085935050505092915050565b600060a082019050613e4d6000830188612d87565b613e5a60208301876133c3565b8181036040830152613e6c8186613dda565b9050613e7b6060830185612fdf565b613e886080830184612d87565b9695505050505050565b6000613e9d82612b3a565b9150613ea883612b3a565b9250828202613eb681612b3a565b91508282048414831517613ecd57613ecc61332a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f0e82612b3a565b9150613f1983612b3a565b925082613f2957613f28613ed4565b5b828204905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000613f6a601383612a26565b9150613f7582613f34565b602082019050919050565b60006020820190508181036000830152613f9981613f5d565b9050919050565b6000606082019050613fb56000830186612fdf565b613fc26020830185612bbc565b613fcf6040830184612bbc565b949350505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b600061400d601e83612a26565b915061401882613fd7565b602082019050919050565b6000602082019050818103600083015261403c81614000565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000614079601c83612a26565b915061408482614043565b602082019050919050565b600060208201905081810360008301526140a88161406c565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b60006140e5601f83612a26565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b6000614151601e83612a26565b915061415c8261411b565b602082019050919050565b6000602082019050818103600083015261418081614144565b905091905056fea264697066735822122073b63bdf4248c759f7282990da61ae08eba21fface95c618f69ceca8ea74c1ce64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000fd181dc0cbdfcfacb7e0d364374efb6df4185cd3000000000000000000000000ffebed22f139f0bb52c6dcd2d99cb96d57f7240a00000000000000000000000000000000000000000094e47b8d68171534000000

-----Decoded View---------------
Arg [0] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _taxWallets (address[2]): 0xFD181dc0CbdFcfaCB7E0d364374efB6DF4185CD3,0xFFebED22f139F0bb52c6DCD2D99cB96D57F7240a
Arg [2] : _goupAmount (uint256): 180000000000000000000000000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000fd181dc0cbdfcfacb7e0d364374efb6df4185cd3
Arg [2] : 000000000000000000000000ffebed22f139f0bb52c6dcd2d99cb96d57f7240a
Arg [3] : 00000000000000000000000000000000000000000094e47b8d68171534000000


Deployed Bytecode Sourcemap

28754:12839:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17688:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20048:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31887:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41177:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35711:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20829:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29388:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18659:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29012:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21499:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29803:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38980:94;;;;;;;;;;;;;:::i;:::-;;34278:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32190:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30042:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32602:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36222:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29504:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11143:103;;;;;;;;;;;;;:::i;:::-;;30139:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29306:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39082:109;;;;;;;;;;;;;:::i;:::-;;10502:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29693:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34915:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36077:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35315:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17907:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22240:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33784:486;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19321:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33075:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30239:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30332:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19577:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29075:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29130:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11401:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29606:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33372:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29916:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17688:100;17742:13;17775:5;17768:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17688:100;:::o;20048:201::-;20131:4;20148:13;20164:12;:10;:12::i;:::-;20148:28;;20187:32;20196:5;20203:7;20212:6;20187:8;:32::i;:::-;20237:4;20230:11;;;20048:201;;;;:::o;31887:205::-;10388:13;:11;:13::i;:::-;32007:42:::1;32025:10;32037:11;32007:42;;;;;;;:::i;:::-;;;;;;;;32073:11;32060:10;:24;;;;;;;:::i;:::-;;31887:205:::0;:::o;41177:100::-;41230:7;41257:12;;41250:19;;41177:100;:::o;35711:217::-;10388:13;:11;:13::i;:::-;35849:12:::1;35825:11;:21;35837:8;35825:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35877:43;35897:8;35907:12;35877:43;;;;;;;:::i;:::-;;;;;;;;35711:217:::0;;:::o;20829:261::-;20926:4;20943:15;20961:12;:10;:12::i;:::-;20943:30;;20984:38;21000:4;21006:7;21015:6;20984:15;:38::i;:::-;21033:27;21043:4;21049:2;21053:6;21033:9;:27::i;:::-;21078:4;21071:11;;;20829:261;;;;;:::o;29388:41::-;;;;;;;;;;;;;;;;;;;;:::o;18659:93::-;18717:5;18742:2;18735:9;;18659:93;:::o;29012:56::-;29049:19;29012:56;:::o;21499:238::-;21587:4;21604:13;21620:12;:10;:12::i;:::-;21604:28;;21643:64;21652:5;21659:7;21696:10;21668:25;21678:5;21685:7;21668:9;:25::i;:::-;:38;;;;:::i;:::-;21643:8;:64::i;:::-;21725:4;21718:11;;;21499:238;;;;:::o;29803:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;38980:94::-;39024:7;;;;;;;;;;;39019:48;;39048:7;:5;:7::i;:::-;39019:48;38980:94::o;34278:483::-;10388:13;:11;:13::i;:::-;28946:4:::1;28928:15;;:22;;;;;;;;;;;;;;;;;;34408:28:::2;34422:4;34429:6;34408:5;:28::i;:::-;34447:49;34464:4;34479:7;34489:6;34447:8;:49::i;:::-;34509:7;:23;;;34540:9;34573:4;34593:6;34614:1;34630::::0;34646:7:::2;:5;:7::i;:::-;34727:15;34509:244;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28991:5:::1;28973:15;;:23;;;;;;;;;;;;;;;;;;34278:483:::0;:::o;32190:311::-;10388:13;:11;:13::i;:::-;29117:6:::1;32307:9;32317:1;32307:12;;;;;;;:::i;:::-;;;;;;32292:9;32302:1;32292:12;;;;;;;:::i;:::-;;;;;;:27;;;;:::i;:::-;:46;;32270:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;32426:36;32442:8;32452:9;32426:36;;;;;;;:::i;:::-;;;;;;;;32484:9;32473:8;:20;;;;;;;:::i;:::-;;32190:311:::0;:::o;30042:43::-;;;;:::o;32602:321::-;10388:13;:11;:13::i;:::-;29117:6:::1;32722:10;32733:1;32722:13;;;;;;;:::i;:::-;;;;;;32706:10;32717:1;32706:13;;;;;;;:::i;:::-;;;;;;:29;;;;:::i;:::-;:48;;32684:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;32843:39;32860:9;32871:10;32843:39;;;;;;;:::i;:::-;;;;;;;;32905:10;32893:9;:22;;;;;;;:::i;:::-;;32602:321:::0;:::o;36222:177::-;36341:7;36373:9;:18;36383:7;36373:18;;;;;;;;;;;;;;;;36366:25;;36222:177;;;:::o;29504:39::-;;;;:::o;11143:103::-;10388:13;:11;:13::i;:::-;11208:30:::1;11235:1;11208:18;:30::i;:::-;11143:103::o:0;30139:27::-;;;;;;;;;;;;;:::o;29306:40::-;;;;;;;;;;;;;;;;;;;;:::o;39082:109::-;10388:13;:11;:13::i;:::-;39143:7:::1;:5;:7::i;:::-;39135:25;;:48;39161:21;39135:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;39082:109::o:0;10502:87::-;10548:7;10575:6;;;;;;;;;;;10568:13;;10502:87;:::o;29693:36::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34915:160::-;10388:13;:11;:13::i;:::-;35037:30:::1;35054:4;35060:6;35037:16;:30::i;:::-;34915:160:::0;;:::o;36077:137::-;10388:13;:11;:13::i;:::-;36155:9:::1;36144:8;;:20;;;;;;;;;;;;;;;;;;36180:26;36196:9;36180:26;;;;;;:::i;:::-;;;;;;;;36077:137:::0;:::o;35315:205::-;10388:13;:11;:13::i;:::-;35408:14:::1;35392:13;;:30;;;;;;;;;;;;;;;;;;35448:12;35433;:27;;;;35476:36;35497:14;35476:36;;;;;;:::i;:::-;;;;;;;;35315:205:::0;:::o;17907:104::-;17963:13;17996:7;17989:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17907:104;:::o;22240:436::-;22333:4;22350:13;22366:12;:10;:12::i;:::-;22350:28;;22389:24;22416:25;22426:5;22433:7;22416:9;:25::i;:::-;22389:52;;22480:15;22460:16;:35;;22452:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22573:60;22582:5;22589:7;22617:15;22598:16;:34;22573:8;:60::i;:::-;22664:4;22657:11;;;;22240:436;;;;:::o;33784:486::-;10388:13;:11;:13::i;:::-;33939:6:::1;33934:1;:11;;:41;;;;;33958:17;33949:6;:26;33934:41;33926:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34034:10;34045:6;34034:18;;;;;;;:::i;:::-;;;;34023:7;:29;;34001:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34129:48;34150:4;34157:10;34169:7;34129:12;:48::i;:::-;34193:29;34206:6;34214:7;34193:29;;;;;;;:::i;:::-;;;;;;;;34255:7;34233:10;34244:6;34233:18;;;;;;;:::i;:::-;;;;:29;;;;;;;:::i;:::-;;;;;;;;33784:486:::0;;;:::o;19321:193::-;19400:4;19417:13;19433:12;:10;:12::i;:::-;19417:28;;19456;19466:5;19473:2;19477:6;19456:9;:28::i;:::-;19502:4;19495:11;;;19321:193;;;;:::o;33075:199::-;10388:13;:11;:13::i;:::-;33164:57:::1;33187:15;;33204:16;33164:57;;;;;;;:::i;:::-;;;;;;;;33250:16;33232:15;:34;;;;33075:199:::0;:::o;30239:33::-;;;;;;;;;;;;;:::o;30332:27::-;;;;:::o;19577:151::-;19666:7;19693:11;:18;19705:5;19693:18;;;;;;;;;;;;;;;:27;19712:7;19693:27;;;;;;;;;;;;;;;;19686:34;;19577:151;;;;:::o;29075:48::-;29117:6;29075:48;:::o;29130:40::-;29169:1;29130:40;:::o;11401:201::-;10388:13;:11;:13::i;:::-;11510:1:::1;11490:22;;:8;:22;;::::0;11482:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11566:28;11585:8;11566:18;:28::i;:::-;11401:201:::0;:::o;29606:28::-;;;;;;;;;;;;;;;;;;;;:::o;33372:136::-;10388:13;:11;:13::i;:::-;33443:30:::1;33457:6;;33465:7;33443:30;;;;;;;:::i;:::-;;;;;;;;33493:7;33484:6;:16;;;;33372:136:::0;:::o;29916:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;9053:98::-;9106:7;9133:10;9126:17;;9053:98;:::o;26233:346::-;26352:1;26335:19;;:5;:19;;;26327:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26433:1;26414:21;;:7;:21;;;26406:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26517:6;26487:11;:18;26499:5;26487:18;;;;;;;;;;;;;;;:27;26506:7;26487:27;;;;;;;;;;;;;;;:36;;;;26555:7;26539:32;;26548:5;26539:32;;;26564:6;26539:32;;;;;;:::i;:::-;;;;;;;;26233:346;;;:::o;10667:132::-;10742:12;:10;:12::i;:::-;10731:23;;:7;:5;:7::i;:::-;:23;;;10723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10667:132::o;26870:419::-;26971:24;26998:25;27008:5;27015:7;26998:9;:25::i;:::-;26971:52;;27058:17;27038:16;:37;27034:248;;27120:6;27100:16;:26;;27092:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27204:51;27213:5;27220:7;27248:6;27229:16;:25;27204:8;:51::i;:::-;27034:248;26960:329;26870:419;;;:::o;36688:1243::-;36830:9;:20;36840:9;36830:20;;;;;;;;;;;;;;;;;;;;;;;;;36829:21;36821:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36896:11;:19;36908:6;36896:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;36919:11;:22;36931:9;36919:22;;;;;;;;;;;;;;;;;;;;;;;;;36896:45;36892:138;;;36958:39;36971:6;36979:9;36990:6;36958:12;:39::i;:::-;37012:7;;36892:138;37093:15;;37076:10;37087:1;37076:13;;;;;;;:::i;:::-;;;;37060:10;37071:1;37060:13;;;;;;;:::i;:::-;;;;:29;;;;:::i;:::-;:48;;:73;;;;;37126:7;;;;;;;;;;;37125:8;37060:73;:105;;;;;37160:5;37150:15;;:6;:15;;;;37060:105;:130;;;;;37182:8;;;;;;;;;;;37060:130;37042:194;;;37217:7;:5;:7::i;:::-;37042:194;37248:12;37263:6;37248:21;;37280:23;;:::i;:::-;37328:5;37318:15;;:6;:15;;;37314:526;;37358:13;;;;;;;;;;;37350:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;29169:1;37436:12;;:27;;;;:::i;:::-;37420:12;:43;37416:117;;37484:33;37501:9;37512:4;37484:16;:33::i;:::-;37416:117;37563:28;37578:6;37586:4;37563:14;:28::i;:::-;37547:44;;;;;;;;37624:6;;37614;:16;;37606:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;37314:526;;;37695:5;37682:18;;:9;:18;;;37678:162;;37725:13;;;;;;;;;;;37717:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;37799:29;37814:6;37822:5;37799:14;:29::i;:::-;37783:45;;;;;;;;37678:162;37314:526;37850:37;37863:6;37871:9;37882:4;37850:12;:37::i;:::-;37898:25;37909:6;37917:5;37898:10;:25::i;:::-;36810:1121;;36688:1243;;;;:::o;38028:944::-;28835:4;28825:7;;:14;;;;;;;;;;;;;;;;;;38074:21:::1;38112:1;38098:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38074:40;;38143:4;38125;38130:1;38125:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;38169:7;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38159:4;38164:1;38159:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;::::0;::::1;38196:19;38234:10;38245:1;38234:13;;;;;;;:::i;:::-;;;;38218:10;38229:1;38218:13;;;;;;;:::i;:::-;;;;:29;;;;:::i;:::-;38196:51;;38260:54;38277:4;38292:7;38302:11;38260:8;:54::i;:::-;38325:7;:58;;;38398:11;38424:1;38468:4;38495;38515:15;38325:216;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38552:26;38581:21;38552:50;;38615:15;38672:11;38655:10;38666:1;38655:13;;;;;;;:::i;:::-;;;;38634:18;:34;;;;:::i;:::-;38633:50;;;;:::i;:::-;38615:68;;38694:15;38751:11;38734:10;38745:1;38734:13;;;;;;;:::i;:::-;;;;38713:18;:34;;;;:::i;:::-;38712:50;;;;:::i;:::-;38694:68;;38773:19;;;;;;;;38787:1;38773:19;;;;;;38790:1;38773:19;;;;::::0;:10:::1;:19;;;;;;;:::i;:::-;;38819:1;38809:7;:11;38805:75;;;38837:10;38848:1;38837:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:22;;:31;38860:7;38837:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38805:75;38904:1;38894:7;:11;38890:75;;;38922:10;38933:1;38922:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:22;;:31;38945:7;38922:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38890:75;38063:909;;;;;28872:5:::0;28862:7;;:15;;;;;;;;;;;;;;;;;;38028:944::o;41285:268::-;29049:19;41376:6;41361:12;;:21;;;;:::i;:::-;:35;;41353:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41447:6;41431:12;;:22;;;;;;;:::i;:::-;;;;;;;;41464:28;41476:7;41485:6;41464:11;:28::i;:::-;41529:7;41508:37;;41525:1;41508:37;;;41538:6;41508:37;;;;;;:::i;:::-;;;;;;;;41285:268;;:::o;11762:191::-;11836:16;11855:6;;;;;;;;;;;11836:25;;11881:8;11872:6;;:17;;;;;;;;;;;;;;;;;;11936:8;11905:40;;11926:8;11905:40;;;;;;;;;;;;11825:128;11762:191;:::o;35083:168::-;35161:47;35178:4;35184:9;:15;35194:4;35184:15;;;;;;;;;;;;;;;;;;;;;;;;;35201:6;35161:47;;;;;;;;:::i;:::-;;;;;;;;35237:6;35219:9;:15;35229:4;35219:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;35083:168;;:::o;40591:578::-;40744:1;40726:20;;:6;:20;;;40718:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40821:1;40800:23;;:9;:23;;;40792:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40869:21;40893:17;40903:6;40893:9;:17::i;:::-;40869:41;;40946:6;40929:13;:23;;40921:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41024:32;41041:6;41049;41024:16;:32::i;:::-;41078:30;41090:9;41101:6;41078:11;:30::i;:::-;41143:9;41126:35;;41135:6;41126:35;;;41154:6;41126:35;;;;;;:::i;:::-;;;;;;;;40707:462;40591:578;;;:::o;39975:567::-;40078:12;40092:23;;:::i;:::-;40137:6;40133:356;;;40160:141;;;;;;;;29117:6;40197:8;40206:1;40197:11;;;;;;;:::i;:::-;;;;40188:6;:20;;;;:::i;:::-;40187:40;;;;:::i;:::-;40160:141;;;;29117:6;40256:8;40265:1;40256:11;;;;;;;:::i;:::-;;;;40247:6;:20;;;;:::i;:::-;40246:40;;;;:::i;:::-;40160:141;;;;;40133:356;;;40334:143;;;;;;;;29117:6;40371:9;40381:1;40371:12;;;;;;;:::i;:::-;;;;40362:6;:21;;;;:::i;:::-;40361:41;;;;:::i;:::-;40334:143;;;;29117:6;40431:9;40441:1;40431:12;;;;;;;:::i;:::-;;;;40422:6;:21;;;;:::i;:::-;40421:41;;;;:::i;:::-;40334:143;;;;;40133:356;40526:5;40532:1;40526:8;;;;;;;:::i;:::-;;;;;;40515:5;40521:1;40515:8;;;;;;;:::i;:::-;;;;;;40506:6;:17;;;;:::i;:::-;:28;;;;:::i;:::-;40499:35;;39975:567;;;;;:::o;39387:387::-;39518:1;39498:22;;:8;:22;;;39490:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39568:19;39607:11;39619:1;39607:14;;;;;;;:::i;:::-;;;;;;39590:11;39602:1;39590:14;;;;;;;:::i;:::-;;;;;;:31;;;;:::i;:::-;39568:53;;39632:50;39645:8;39663:4;39670:11;39632:12;:50::i;:::-;39710:11;39722:1;39710:14;;;;;;;:::i;:::-;;;;;;39693:10;39704:1;39693:13;;;;;;;:::i;:::-;;;;:31;;;;;;;:::i;:::-;;;;;;;;39752:11;39764:1;39752:14;;;;;;;:::i;:::-;;;;;;39735:10;39746:1;39735:13;;;;;;;:::i;:::-;;;;:31;;;;;;;:::i;:::-;;;;;;;;39479:295;39387:387;;:::o;36407:130::-;36523:6;36502:9;:18;36512:7;36502:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;36481:9;:18;36491:7;36481:18;;;;;;;;;;;;;;;:48;;;;36407:130;;:::o;36545:135::-;36666:6;36645:9;:18;36655:7;36645:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;36624:9;:18;36634:7;36624:18;;;;;;;;;;;;;;;:48;;;;36545:135;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:117::-;3555:1;3552;3545:12;3569:180;3617:77;3614:1;3607:88;3714:4;3711:1;3704:15;3738:4;3735:1;3728:15;3755:281;3838:27;3860:4;3838:27;:::i;:::-;3830:6;3826:40;3968:6;3956:10;3953:22;3932:18;3920:10;3917:34;3914:62;3911:88;;;3979:18;;:::i;:::-;3911:88;4019:10;4015:2;4008:22;3798:238;3755:281;;:::o;4042:129::-;4076:6;4103:20;;:::i;:::-;4093:30;;4132:33;4160:4;4152:6;4132:33;:::i;:::-;4042:129;;;:::o;4177:257::-;4260:4;4350:18;4342:6;4339:30;4336:56;;;4372:18;;:::i;:::-;4336:56;4422:4;4414:6;4410:17;4402:25;;4177:257;;;:::o;4440:117::-;4549:1;4546;4539:12;4563:104;4608:7;4637:24;4655:5;4637:24;:::i;:::-;4626:35;;4563:104;;;:::o;4673:138::-;4754:32;4780:5;4754:32;:::i;:::-;4747:5;4744:43;4734:71;;4801:1;4798;4791:12;4734:71;4673:138;:::o;4817:155::-;4871:5;4909:6;4896:20;4887:29;;4925:41;4960:5;4925:41;:::i;:::-;4817:155;;;;:::o;5004:667::-;5106:5;5131:87;5147:70;5210:6;5147:70;:::i;:::-;5131:87;:::i;:::-;5122:96;;5238:5;5291:4;5283:6;5279:17;5271:6;5267:30;5320:3;5312:6;5309:15;5306:122;;;5339:79;;:::i;:::-;5306:122;5454:6;5437:228;5471:6;5466:3;5463:15;5437:228;;;5546:3;5575:45;5616:3;5604:10;5575:45;:::i;:::-;5570:3;5563:58;5650:4;5645:3;5641:14;5634:21;;5513:152;5497:4;5492:3;5488:14;5481:21;;5437:228;;;5441:21;5112:559;;5004:667;;;;;:::o;5703:355::-;5780:5;5829:3;5822:4;5814:6;5810:17;5806:27;5796:122;;5837:79;;:::i;:::-;5796:122;5941:4;5963:89;6048:3;6040:6;6032;5963:89;:::i;:::-;5954:98;;5786:272;5703:355;;;;:::o;6064:391::-;6154:6;6203:2;6191:9;6182:7;6178:23;6174:32;6171:119;;;6209:79;;:::i;:::-;6171:119;6329:1;6354:84;6430:7;6421:6;6410:9;6406:22;6354:84;:::i;:::-;6344:94;;6300:148;6064:391;;;;:::o;6461:118::-;6548:24;6566:5;6548:24;:::i;:::-;6543:3;6536:37;6461:118;;:::o;6585:222::-;6678:4;6716:2;6705:9;6701:18;6693:26;;6729:71;6797:1;6786:9;6782:17;6773:6;6729:71;:::i;:::-;6585:222;;;;:::o;6813:116::-;6883:21;6898:5;6883:21;:::i;:::-;6876:5;6873:32;6863:60;;6919:1;6916;6909:12;6863:60;6813:116;:::o;6935:133::-;6978:5;7016:6;7003:20;6994:29;;7032:30;7056:5;7032:30;:::i;:::-;6935:133;;;;:::o;7074:468::-;7139:6;7147;7196:2;7184:9;7175:7;7171:23;7167:32;7164:119;;;7202:79;;:::i;:::-;7164:119;7322:1;7347:53;7392:7;7383:6;7372:9;7368:22;7347:53;:::i;:::-;7337:63;;7293:117;7449:2;7475:50;7517:7;7508:6;7497:9;7493:22;7475:50;:::i;:::-;7465:60;;7420:115;7074:468;;;;;:::o;7548:619::-;7625:6;7633;7641;7690:2;7678:9;7669:7;7665:23;7661:32;7658:119;;;7696:79;;:::i;:::-;7658:119;7816:1;7841:53;7886:7;7877:6;7866:9;7862:22;7841:53;:::i;:::-;7831:63;;7787:117;7943:2;7969:53;8014:7;8005:6;7994:9;7990:22;7969:53;:::i;:::-;7959:63;;7914:118;8071:2;8097:53;8142:7;8133:6;8122:9;8118:22;8097:53;:::i;:::-;8087:63;;8042:118;7548:619;;;;;:::o;8173:329::-;8232:6;8281:2;8269:9;8260:7;8256:23;8252:32;8249:119;;;8287:79;;:::i;:::-;8249:119;8407:1;8432:53;8477:7;8468:6;8457:9;8453:22;8432:53;:::i;:::-;8422:63;;8378:117;8173:329;;;;:::o;8508:86::-;8543:7;8583:4;8576:5;8572:16;8561:27;;8508:86;;;:::o;8600:112::-;8683:22;8699:5;8683:22;:::i;:::-;8678:3;8671:35;8600:112;;:::o;8718:214::-;8807:4;8845:2;8834:9;8830:18;8822:26;;8858:67;8922:1;8911:9;8907:17;8898:6;8858:67;:::i;:::-;8718:214;;;;:::o;8938:329::-;8997:6;9046:2;9034:9;9025:7;9021:23;9017:32;9014:119;;;9052:79;;:::i;:::-;9014:119;9172:1;9197:53;9242:7;9233:6;9222:9;9218:22;9197:53;:::i;:::-;9187:63;;9143:117;8938:329;;;;:::o;9273:249::-;9348:4;9438:18;9430:6;9427:30;9424:56;;;9460:18;;:::i;:::-;9424:56;9510:4;9502:6;9498:17;9490:25;;9273:249;;;:::o;9546:643::-;9640:5;9665:79;9681:62;9736:6;9681:62;:::i;:::-;9665:79;:::i;:::-;9656:88;;9764:5;9817:4;9809:6;9805:17;9797:6;9793:30;9846:3;9838:6;9835:15;9832:122;;;9865:79;;:::i;:::-;9832:122;9980:6;9963:220;9997:6;9992:3;9989:15;9963:220;;;10072:3;10101:37;10134:3;10122:10;10101:37;:::i;:::-;10096:3;10089:50;10168:4;10163:3;10159:14;10152:21;;10039:144;10023:4;10018:3;10014:14;10007:21;;9963:220;;;9967:21;9646:543;;9546:643;;;;;:::o;10213:339::-;10282:5;10331:3;10324:4;10316:6;10312:17;10308:27;10298:122;;10339:79;;:::i;:::-;10298:122;10443:4;10465:81;10542:3;10534:6;10526;10465:81;:::i;:::-;10456:90;;10288:264;10213:339;;;;:::o;10558:375::-;10640:6;10689:2;10677:9;10668:7;10664:23;10660:32;10657:119;;;10695:79;;:::i;:::-;10657:119;10815:1;10840:76;10908:7;10899:6;10888:9;10884:22;10840:76;:::i;:::-;10830:86;;10786:140;10558:375;;;;:::o;10939:118::-;11026:24;11044:5;11026:24;:::i;:::-;11021:3;11014:37;10939:118;;:::o;11063:222::-;11156:4;11194:2;11183:9;11179:18;11171:26;;11207:71;11275:1;11264:9;11260:17;11251:6;11207:71;:::i;:::-;11063:222;;;;:::o;11291:142::-;11394:32;11420:5;11394:32;:::i;:::-;11389:3;11382:45;11291:142;;:::o;11439:254::-;11548:4;11586:2;11575:9;11571:18;11563:26;;11599:87;11683:1;11672:9;11668:17;11659:6;11599:87;:::i;:::-;11439:254;;;;:::o;11699:323::-;11755:6;11804:2;11792:9;11783:7;11779:23;11775:32;11772:119;;;11810:79;;:::i;:::-;11772:119;11930:1;11955:50;11997:7;11988:6;11977:9;11973:22;11955:50;:::i;:::-;11945:60;;11901:114;11699:323;;;;:::o;12028:619::-;12105:6;12113;12121;12170:2;12158:9;12149:7;12145:23;12141:32;12138:119;;;12176:79;;:::i;:::-;12138:119;12296:1;12321:53;12366:7;12357:6;12346:9;12342:22;12321:53;:::i;:::-;12311:63;;12267:117;12423:2;12449:53;12494:7;12485:6;12474:9;12470:22;12449:53;:::i;:::-;12439:63;;12394:118;12551:2;12577:53;12622:7;12613:6;12602:9;12598:22;12577:53;:::i;:::-;12567:63;;12522:118;12028:619;;;;;:::o;12653:474::-;12721:6;12729;12778:2;12766:9;12757:7;12753:23;12749:32;12746:119;;;12784:79;;:::i;:::-;12746:119;12904:1;12929:53;12974:7;12965:6;12954:9;12950:22;12929:53;:::i;:::-;12919:63;;12875:117;13031:2;13057:53;13102:7;13093:6;13082:9;13078:22;13057:53;:::i;:::-;13047:63;;13002:118;12653:474;;;;;:::o;13133:180::-;13181:77;13178:1;13171:88;13278:4;13275:1;13268:15;13302:4;13299:1;13292:15;13319:320;13363:6;13400:1;13394:4;13390:12;13380:22;;13447:1;13441:4;13437:12;13468:18;13458:81;;13524:4;13516:6;13512:17;13502:27;;13458:81;13586:2;13578:6;13575:14;13555:18;13552:38;13549:84;;13605:18;;:::i;:::-;13549:84;13370:269;13319:320;;;:::o;13645:109::-;13715:6;13743:4;13733:14;;13645:109;;;:::o;13760:151::-;13865:11;13902:3;13887:18;;13760:151;;;;:::o;13917:103::-;13987:4;14010:3;14002:11;;13917:103;;;:::o;14026:132::-;14119:32;14145:5;14119:32;:::i;:::-;14114:3;14107:45;14026:132;;:::o;14164:211::-;14249:10;14270:62;14328:3;14320:6;14270:62;:::i;:::-;14364:4;14359:3;14355:14;14341:28;;14164:211;;;;:::o;14381:102::-;14423:8;14470:5;14467:1;14463:13;14442:34;;14381:102;;;:::o;14489:147::-;14547:7;14587:42;14580:5;14576:54;14565:65;;14489:147;;;:::o;14642:182::-;14719:5;14744:74;14783:34;14806:10;14783:34;:::i;:::-;14744:74;:::i;:::-;14735:83;;14642:182;;;:::o;14830:160::-;14893:5;14918:65;14977:4;14971:11;14918:65;:::i;:::-;14909:74;;14830:160;;;:::o;14996:116::-;15069:4;15101;15096:3;15092:14;15084:22;;14996:116;;;:::o;15166:785::-;15315:57;15366:5;15315:57;:::i;:::-;15388:92;15473:6;15468:3;15388:92;:::i;:::-;15381:99;;15504:59;15557:5;15504:59;:::i;:::-;15586:7;15617:1;15602:342;15627:6;15624:1;15621:13;15602:342;;;15697:52;15742:6;15697:52;:::i;:::-;15769:79;15844:3;15829:13;15769:79;:::i;:::-;15762:86;;15871:63;15927:6;15871:63;:::i;:::-;15861:73;;15662:282;15649:1;15646;15642:9;15637:14;;15602:342;;;15606:14;15291:660;;;15166:785;;:::o;15957:112::-;16030:6;16058:4;16048:14;;15957:112;;;:::o;16075:106::-;16148:4;16171:3;16163:11;;16075:106;;;:::o;16187:119::-;16263:4;16295;16290:3;16286:14;16278:22;;16187:119;;;:::o;16360:758::-;16512:60;16566:5;16512:60;:::i;:::-;16588:92;16673:6;16668:3;16588:92;:::i;:::-;16581:99;;16704:62;16760:5;16704:62;:::i;:::-;16789:7;16820:1;16805:306;16830:6;16827:1;16824:13;16805:306;;;16906:6;16900:13;16933:79;17008:3;16993:13;16933:79;:::i;:::-;16926:86;;17035:66;17094:6;17035:66;:::i;:::-;17025:76;;16865:246;16852:1;16849;16845:9;16840:14;;16805:306;;;16809:14;16488:630;;;16360:758;;:::o;17124:575::-;17366:4;17404:3;17393:9;17389:19;17381:27;;17418:130;17545:1;17534:9;17530:17;17521:6;17418:130;:::i;:::-;17558:134;17688:2;17677:9;17673:18;17664:6;17558:134;:::i;:::-;17124:575;;;;;:::o;17705:320::-;17820:4;17858:2;17847:9;17843:18;17835:26;;17871:71;17939:1;17928:9;17924:17;17915:6;17871:71;:::i;:::-;17952:66;18014:2;18003:9;17999:18;17990:6;17952:66;:::i;:::-;17705:320;;;;;:::o;18031:180::-;18079:77;18076:1;18069:88;18176:4;18173:1;18166:15;18200:4;18197:1;18190:15;18217:191;18257:3;18276:20;18294:1;18276:20;:::i;:::-;18271:25;;18310:20;18328:1;18310:20;:::i;:::-;18305:25;;18353:1;18350;18346:9;18339:16;;18374:3;18371:1;18368:10;18365:36;;;18381:18;;:::i;:::-;18365:36;18217:191;;;;:::o;18414:85::-;18459:7;18488:5;18477:16;;18414:85;;;:::o;18505:60::-;18533:3;18554:5;18547:12;;18505:60;;;:::o;18571:158::-;18629:9;18662:61;18680:42;18689:32;18715:5;18689:32;:::i;:::-;18680:42;:::i;:::-;18662:61;:::i;:::-;18649:74;;18571:158;;;:::o;18735:147::-;18830:45;18869:5;18830:45;:::i;:::-;18825:3;18818:58;18735:147;;:::o;18888:807::-;19137:4;19175:3;19164:9;19160:19;19152:27;;19189:71;19257:1;19246:9;19242:17;19233:6;19189:71;:::i;:::-;19270:72;19338:2;19327:9;19323:18;19314:6;19270:72;:::i;:::-;19352:80;19428:2;19417:9;19413:18;19404:6;19352:80;:::i;:::-;19442;19518:2;19507:9;19503:18;19494:6;19442:80;:::i;:::-;19532:73;19600:3;19589:9;19585:19;19576:6;19532:73;:::i;:::-;19615;19683:3;19672:9;19668:19;19659:6;19615:73;:::i;:::-;18888:807;;;;;;;;;:::o;19701:143::-;19758:5;19789:6;19783:13;19774:22;;19805:33;19832:5;19805:33;:::i;:::-;19701:143;;;;:::o;19850:663::-;19938:6;19946;19954;20003:2;19991:9;19982:7;19978:23;19974:32;19971:119;;;20009:79;;:::i;:::-;19971:119;20129:1;20154:64;20210:7;20201:6;20190:9;20186:22;20154:64;:::i;:::-;20144:74;;20100:128;20267:2;20293:64;20349:7;20340:6;20329:9;20325:22;20293:64;:::i;:::-;20283:74;;20238:129;20406:2;20432:64;20488:7;20479:6;20468:9;20464:22;20432:64;:::i;:::-;20422:74;;20377:129;19850:663;;;;;:::o;20519:180::-;20567:77;20564:1;20557:88;20664:4;20661:1;20654:15;20688:4;20685:1;20678:15;20705:231;20845:34;20841:1;20833:6;20829:14;20822:58;20914:14;20909:2;20901:6;20897:15;20890:39;20705:231;:::o;20942:366::-;21084:3;21105:67;21169:2;21164:3;21105:67;:::i;:::-;21098:74;;21181:93;21270:3;21181:93;:::i;:::-;21299:2;21294:3;21290:12;21283:19;;20942:366;;;:::o;21314:419::-;21480:4;21518:2;21507:9;21503:18;21495:26;;21567:9;21561:4;21557:20;21553:1;21542:9;21538:17;21531:47;21595:131;21721:4;21595:131;:::i;:::-;21587:139;;21314:419;;;:::o;21739:101::-;21801:6;21829:4;21819:14;;21739:101;;;:::o;21846:143::-;21943:11;21980:3;21965:18;;21846:143;;;;:::o;21995:95::-;22057:4;22080:3;22072:11;;21995:95;;;:::o;22096:108::-;22173:24;22191:5;22173:24;:::i;:::-;22168:3;22161:37;22096:108;;:::o;22210:179::-;22279:10;22300:46;22342:3;22334:6;22300:46;:::i;:::-;22378:4;22373:3;22369:14;22355:28;;22210:179;;;;:::o;22395:90::-;22445:7;22474:5;22463:16;;22395:90;;;:::o;22491:166::-;22560:5;22585:66;22616:34;22639:10;22616:34;:::i;:::-;22585:66;:::i;:::-;22576:75;;22491:166;;;:::o;22663:144::-;22718:5;22743:57;22794:4;22788:11;22743:57;:::i;:::-;22734:66;;22663:144;;;:::o;22813:108::-;22878:4;22910;22905:3;22901:14;22893:22;;22813:108;;;:::o;22959:713::-;23092:49;23135:5;23092:49;:::i;:::-;23157:84;23234:6;23229:3;23157:84;:::i;:::-;23150:91;;23265:51;23310:5;23265:51;:::i;:::-;23339:7;23370:1;23355:310;23380:6;23377:1;23374:13;23355:310;;;23450:44;23487:6;23450:44;:::i;:::-;23514:63;23573:3;23558:13;23514:63;:::i;:::-;23507:70;;23600:55;23648:6;23600:55;:::i;:::-;23590:65;;23415:250;23402:1;23399;23395:9;23390:14;;23355:310;;;23359:14;23068:604;;;22959:713;;:::o;23678:104::-;23743:6;23771:4;23761:14;;23678:104;;;:::o;23788:98::-;23853:4;23876:3;23868:11;;23788:98;;;:::o;23892:111::-;23960:4;23992;23987:3;23983:14;23975:22;;23892:111;;;:::o;24041:694::-;24177:52;24223:5;24177:52;:::i;:::-;24245:84;24322:6;24317:3;24245:84;:::i;:::-;24238:91;;24353:54;24401:5;24353:54;:::i;:::-;24430:7;24461:1;24446:282;24471:6;24468:1;24465:13;24446:282;;;24547:6;24541:13;24574:63;24633:3;24618:13;24574:63;:::i;:::-;24567:70;;24660:58;24711:6;24660:58;:::i;:::-;24650:68;;24506:222;24493:1;24490;24486:9;24481:14;;24446:282;;;24450:14;24153:582;;;24041:694;;:::o;24741:511::-;24951:4;24989:3;24978:9;24974:19;24966:27;;25003:114;25114:1;25103:9;25099:17;25090:6;25003:114;:::i;:::-;25127:118;25241:2;25230:9;25226:18;25217:6;25127:118;:::i;:::-;24741:511;;;;;:::o;25258:232::-;25398:34;25394:1;25386:6;25382:14;25375:58;25467:15;25462:2;25454:6;25450:15;25443:40;25258:232;:::o;25496:366::-;25638:3;25659:67;25723:2;25718:3;25659:67;:::i;:::-;25652:74;;25735:93;25824:3;25735:93;:::i;:::-;25853:2;25848:3;25844:12;25837:19;;25496:366;;;:::o;25868:419::-;26034:4;26072:2;26061:9;26057:18;26049:26;;26121:9;26115:4;26111:20;26107:1;26096:9;26092:17;26085:47;26149:131;26275:4;26149:131;:::i;:::-;26141:139;;25868:419;;;:::o;26293:224::-;26433:34;26429:1;26421:6;26417:14;26410:58;26502:7;26497:2;26489:6;26485:15;26478:32;26293:224;:::o;26523:366::-;26665:3;26686:67;26750:2;26745:3;26686:67;:::i;:::-;26679:74;;26762:93;26851:3;26762:93;:::i;:::-;26880:2;26875:3;26871:12;26864:19;;26523:366;;;:::o;26895:419::-;27061:4;27099:2;27088:9;27084:18;27076:26;;27148:9;27142:4;27138:20;27134:1;27123:9;27119:17;27112:47;27176:131;27302:4;27176:131;:::i;:::-;27168:139;;26895:419;;;:::o;27320:160::-;27460:12;27456:1;27448:6;27444:14;27437:36;27320:160;:::o;27486:366::-;27628:3;27649:67;27713:2;27708:3;27649:67;:::i;:::-;27642:74;;27725:93;27814:3;27725:93;:::i;:::-;27843:2;27838:3;27834:12;27827:19;;27486:366;;;:::o;27858:419::-;28024:4;28062:2;28051:9;28047:18;28039:26;;28111:9;28105:4;28101:20;28097:1;28086:9;28082:17;28075:47;28139:131;28265:4;28139:131;:::i;:::-;28131:139;;27858:419;;;:::o;28283:225::-;28423:34;28419:1;28411:6;28407:14;28400:58;28492:8;28487:2;28479:6;28475:15;28468:33;28283:225;:::o;28514:366::-;28656:3;28677:67;28741:2;28736:3;28677:67;:::i;:::-;28670:74;;28753:93;28842:3;28753:93;:::i;:::-;28871:2;28866:3;28862:12;28855:19;;28514:366;;;:::o;28886:419::-;29052:4;29090:2;29079:9;29075:18;29067:26;;29139:9;29133:4;29129:20;29125:1;29114:9;29110:17;29103:47;29167:131;29293:4;29167:131;:::i;:::-;29159:139;;28886:419;;;:::o;29311:332::-;29432:4;29470:2;29459:9;29455:18;29447:26;;29483:71;29551:1;29540:9;29536:17;29527:6;29483:71;:::i;:::-;29564:72;29632:2;29621:9;29617:18;29608:6;29564:72;:::i;:::-;29311:332;;;;;:::o;29649:194::-;29689:4;29709:20;29727:1;29709:20;:::i;:::-;29704:25;;29743:20;29761:1;29743:20;:::i;:::-;29738:25;;29787:1;29784;29780:9;29772:17;;29811:1;29805:4;29802:11;29799:37;;;29816:18;;:::i;:::-;29799:37;29649:194;;;;:::o;29849:225::-;29989:34;29985:1;29977:6;29973:14;29966:58;30058:8;30053:2;30045:6;30041:15;30034:33;29849:225;:::o;30080:366::-;30222:3;30243:67;30307:2;30302:3;30243:67;:::i;:::-;30236:74;;30319:93;30408:3;30319:93;:::i;:::-;30437:2;30432:3;30428:12;30421:19;;30080:366;;;:::o;30452:419::-;30618:4;30656:2;30645:9;30641:18;30633:26;;30705:9;30699:4;30695:20;30691:1;30680:9;30676:17;30669:47;30733:131;30859:4;30733:131;:::i;:::-;30725:139;;30452:419;;;:::o;30877:223::-;31017:34;31013:1;31005:6;31001:14;30994:58;31086:6;31081:2;31073:6;31069:15;31062:31;30877:223;:::o;31106:366::-;31248:3;31269:67;31333:2;31328:3;31269:67;:::i;:::-;31262:74;;31345:93;31434:3;31345:93;:::i;:::-;31463:2;31458:3;31454:12;31447:19;;31106:366;;;:::o;31478:419::-;31644:4;31682:2;31671:9;31667:18;31659:26;;31731:9;31725:4;31721:20;31717:1;31706:9;31702:17;31695:47;31759:131;31885:4;31759:131;:::i;:::-;31751:139;;31478:419;;;:::o;31903:221::-;32043:34;32039:1;32031:6;32027:14;32020:58;32112:4;32107:2;32099:6;32095:15;32088:29;31903:221;:::o;32130:366::-;32272:3;32293:67;32357:2;32352:3;32293:67;:::i;:::-;32286:74;;32369:93;32458:3;32369:93;:::i;:::-;32487:2;32482:3;32478:12;32471:19;;32130:366;;;:::o;32502:419::-;32668:4;32706:2;32695:9;32691:18;32683:26;;32755:9;32749:4;32745:20;32741:1;32730:9;32726:17;32719:47;32783:131;32909:4;32783:131;:::i;:::-;32775:139;;32502:419;;;:::o;32927:182::-;33067:34;33063:1;33055:6;33051:14;33044:58;32927:182;:::o;33115:366::-;33257:3;33278:67;33342:2;33337:3;33278:67;:::i;:::-;33271:74;;33354:93;33443:3;33354:93;:::i;:::-;33472:2;33467:3;33463:12;33456:19;;33115:366;;;:::o;33487:419::-;33653:4;33691:2;33680:9;33676:18;33668:26;;33740:9;33734:4;33730:20;33726:1;33715:9;33711:17;33704:47;33768:131;33894:4;33768:131;:::i;:::-;33760:139;;33487:419;;;:::o;33912:179::-;34052:31;34048:1;34040:6;34036:14;34029:55;33912:179;:::o;34097:366::-;34239:3;34260:67;34324:2;34319:3;34260:67;:::i;:::-;34253:74;;34336:93;34425:3;34336:93;:::i;:::-;34454:2;34449:3;34445:12;34438:19;;34097:366;;;:::o;34469:419::-;34635:4;34673:2;34662:9;34658:18;34650:26;;34722:9;34716:4;34712:20;34708:1;34697:9;34693:17;34686:47;34750:131;34876:4;34750:131;:::i;:::-;34742:139;;34469:419;;;:::o;34894:174::-;35034:26;35030:1;35022:6;35018:14;35011:50;34894:174;:::o;35074:366::-;35216:3;35237:67;35301:2;35296:3;35237:67;:::i;:::-;35230:74;;35313:93;35402:3;35313:93;:::i;:::-;35431:2;35426:3;35422:12;35415:19;;35074:366;;;:::o;35446:419::-;35612:4;35650:2;35639:9;35635:18;35627:26;;35699:9;35693:4;35689:20;35685:1;35674:9;35670:17;35663:47;35727:131;35853:4;35727:131;:::i;:::-;35719:139;;35446:419;;;:::o;35871:175::-;36011:27;36007:1;35999:6;35995:14;35988:51;35871:175;:::o;36052:366::-;36194:3;36215:67;36279:2;36274:3;36215:67;:::i;:::-;36208:74;;36291:93;36380:3;36291:93;:::i;:::-;36409:2;36404:3;36400:12;36393:19;;36052:366;;;:::o;36424:419::-;36590:4;36628:2;36617:9;36613:18;36605:26;;36677:9;36671:4;36667:20;36663:1;36652:9;36648:17;36641:47;36705:131;36831:4;36705:131;:::i;:::-;36697:139;;36424:419;;;:::o;36849:175::-;36989:27;36985:1;36977:6;36973:14;36966:51;36849:175;:::o;37030:366::-;37172:3;37193:67;37257:2;37252:3;37193:67;:::i;:::-;37186:74;;37269:93;37358:3;37269:93;:::i;:::-;37387:2;37382:3;37378:12;37371:19;;37030:366;;;:::o;37402:419::-;37568:4;37606:2;37595:9;37591:18;37583:26;;37655:9;37649:4;37645:20;37641:1;37630:9;37626:17;37619:47;37683:131;37809:4;37683:131;:::i;:::-;37675:139;;37402:419;;;:::o;37827:143::-;37884:5;37915:6;37909:13;37900:22;;37931:33;37958:5;37931:33;:::i;:::-;37827:143;;;;:::o;37976:351::-;38046:6;38095:2;38083:9;38074:7;38070:23;38066:32;38063:119;;;38101:79;;:::i;:::-;38063:119;38221:1;38246:64;38302:7;38293:6;38282:9;38278:22;38246:64;:::i;:::-;38236:74;;38192:128;37976:351;;;;:::o;38333:114::-;38400:6;38434:5;38428:12;38418:22;;38333:114;;;:::o;38453:184::-;38552:11;38586:6;38581:3;38574:19;38626:4;38621:3;38617:14;38602:29;;38453:184;;;;:::o;38643:132::-;38710:4;38733:3;38725:11;;38763:4;38758:3;38754:14;38746:22;;38643:132;;;:::o;38781:108::-;38858:24;38876:5;38858:24;:::i;:::-;38853:3;38846:37;38781:108;;:::o;38895:179::-;38964:10;38985:46;39027:3;39019:6;38985:46;:::i;:::-;39063:4;39058:3;39054:14;39040:28;;38895:179;;;;:::o;39080:113::-;39150:4;39182;39177:3;39173:14;39165:22;;39080:113;;;:::o;39229:732::-;39348:3;39377:54;39425:5;39377:54;:::i;:::-;39447:86;39526:6;39521:3;39447:86;:::i;:::-;39440:93;;39557:56;39607:5;39557:56;:::i;:::-;39636:7;39667:1;39652:284;39677:6;39674:1;39671:13;39652:284;;;39753:6;39747:13;39780:63;39839:3;39824:13;39780:63;:::i;:::-;39773:70;;39866:60;39919:6;39866:60;:::i;:::-;39856:70;;39712:224;39699:1;39696;39692:9;39687:14;;39652:284;;;39656:14;39952:3;39945:10;;39353:608;;;39229:732;;;;:::o;39967:831::-;40230:4;40268:3;40257:9;40253:19;40245:27;;40282:71;40350:1;40339:9;40335:17;40326:6;40282:71;:::i;:::-;40363:80;40439:2;40428:9;40424:18;40415:6;40363:80;:::i;:::-;40490:9;40484:4;40480:20;40475:2;40464:9;40460:18;40453:48;40518:108;40621:4;40612:6;40518:108;:::i;:::-;40510:116;;40636:72;40704:2;40693:9;40689:18;40680:6;40636:72;:::i;:::-;40718:73;40786:3;40775:9;40771:19;40762:6;40718:73;:::i;:::-;39967:831;;;;;;;;:::o;40804:410::-;40844:7;40867:20;40885:1;40867:20;:::i;:::-;40862:25;;40901:20;40919:1;40901:20;:::i;:::-;40896:25;;40956:1;40953;40949:9;40978:30;40996:11;40978:30;:::i;:::-;40967:41;;41157:1;41148:7;41144:15;41141:1;41138:22;41118:1;41111:9;41091:83;41068:139;;41187:18;;:::i;:::-;41068:139;40852:362;40804:410;;;;:::o;41220:180::-;41268:77;41265:1;41258:88;41365:4;41362:1;41355:15;41389:4;41386:1;41379:15;41406:185;41446:1;41463:20;41481:1;41463:20;:::i;:::-;41458:25;;41497:20;41515:1;41497:20;:::i;:::-;41492:25;;41536:1;41526:35;;41541:18;;:::i;:::-;41526:35;41583:1;41580;41576:9;41571:14;;41406:185;;;;:::o;41597:169::-;41737:21;41733:1;41725:6;41721:14;41714:45;41597:169;:::o;41772:366::-;41914:3;41935:67;41999:2;41994:3;41935:67;:::i;:::-;41928:74;;42011:93;42100:3;42011:93;:::i;:::-;42129:2;42124:3;42120:12;42113:19;;41772:366;;;:::o;42144:419::-;42310:4;42348:2;42337:9;42333:18;42325:26;;42397:9;42391:4;42387:20;42383:1;42372:9;42368:17;42361:47;42425:131;42551:4;42425:131;:::i;:::-;42417:139;;42144:419;;;:::o;42569:418::-;42706:4;42744:2;42733:9;42729:18;42721:26;;42757:71;42825:1;42814:9;42810:17;42801:6;42757:71;:::i;:::-;42838:66;42900:2;42889:9;42885:18;42876:6;42838:66;:::i;:::-;42914;42976:2;42965:9;42961:18;42952:6;42914:66;:::i;:::-;42569:418;;;;;;:::o;42993:180::-;43133:32;43129:1;43121:6;43117:14;43110:56;42993:180;:::o;43179:366::-;43321:3;43342:67;43406:2;43401:3;43342:67;:::i;:::-;43335:74;;43418:93;43507:3;43418:93;:::i;:::-;43536:2;43531:3;43527:12;43520:19;;43179:366;;;:::o;43551:419::-;43717:4;43755:2;43744:9;43740:18;43732:26;;43804:9;43798:4;43794:20;43790:1;43779:9;43775:17;43768:47;43832:131;43958:4;43832:131;:::i;:::-;43824:139;;43551:419;;;:::o;43976:178::-;44116:30;44112:1;44104:6;44100:14;44093:54;43976:178;:::o;44160:366::-;44302:3;44323:67;44387:2;44382:3;44323:67;:::i;:::-;44316:74;;44399:93;44488:3;44399:93;:::i;:::-;44517:2;44512:3;44508:12;44501:19;;44160:366;;;:::o;44532:419::-;44698:4;44736:2;44725:9;44721:18;44713:26;;44785:9;44779:4;44775:20;44771:1;44760:9;44756:17;44749:47;44813:131;44939:4;44813:131;:::i;:::-;44805:139;;44532:419;;;:::o;44957:181::-;45097:33;45093:1;45085:6;45081:14;45074:57;44957:181;:::o;45144:366::-;45286:3;45307:67;45371:2;45366:3;45307:67;:::i;:::-;45300:74;;45383:93;45472:3;45383:93;:::i;:::-;45501:2;45496:3;45492:12;45485:19;;45144:366;;;:::o;45516:419::-;45682:4;45720:2;45709:9;45705:18;45697:26;;45769:9;45763:4;45759:20;45755:1;45744:9;45740:17;45733:47;45797:131;45923:4;45797:131;:::i;:::-;45789:139;;45516:419;;;:::o;45941:180::-;46081:32;46077:1;46069:6;46065:14;46058:56;45941:180;:::o;46127:366::-;46269:3;46290:67;46354:2;46349:3;46290:67;:::i;:::-;46283:74;;46366:93;46455:3;46366:93;:::i;:::-;46484:2;46479:3;46475:12;46468:19;;46127:366;;;:::o;46499:419::-;46665:4;46703:2;46692:9;46688:18;46680:26;;46752:9;46746:4;46742:20;46738:1;46727:9;46723:17;46716:47;46780:131;46906:4;46780:131;:::i;:::-;46772:139;;46499:419;;;:::o

Swarm Source

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