ETH Price: $1,994.89 (-0.03%)
Gas: 0.13 Gwei

Token

Onyx (ONYX)
 

Overview

Max Total Supply

1,000 ONYX

Holders

17

Transfers

-
0 (0%)

Market

Onchain Market Cap

-

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

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2023-12-15
*/

// Website: https://onyx-eth.com

// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.8.10;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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, _allowances[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 = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * 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 {}
}

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

    address private immutable pair;
    IUniswapV2Router02 private immutable router;

    address public marketingWallet;

    uint256 public maxTx;
    uint256 public maxWallet;

    mapping(address => bool) private excludedFromLimits;

    uint256 public buyFee = 5;
    uint256 public sellFee = 5;
    mapping(address => bool) private excludedFromFees;

    bool private swapping;

    mapping(address => uint256) private addressLastTxBlock;

    constructor() ERC20("Onyx", "ONYX") {
        uint256 totalSupply = 1000 * 1e18;

        maxTx = 10 * 1e18;
        maxWallet = 20 * 1e18;

        marketingWallet = address(owner());

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(
            address(this),
            router.WETH()
        );

        _excludeFromLimits(address(router), true);
        _excludeFromLimits(pair, true);

        _excludeFromLimits(owner(), true);
        _excludeFromLimits(address(this), true);
        _excludeFromLimits(address(0xdead), true);

        _excludeFromFees(owner(), true);
        _excludeFromFees(address(this), true);
        _excludeFromFees(address(0xdead), true);
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function updateMaxTx(uint256 _maxTxAmount) external onlyOwner {
        require(_maxTxAmount * 1e18 >= maxTx, "Max tx can not be lowered");
        maxTx = _maxTxAmount * 1e18;
    }

    function updateMaxWallet(uint256 _maxWalletAmount) external onlyOwner {
        require(
            _maxWalletAmount * 1e18 >= maxWallet,
            "Max wallet can not be lowered"
        );
        maxWallet = _maxWalletAmount * 1e18;
    }

    function updateBuyFee(uint256 _fee) external onlyOwner {
        require(_fee <= 5, "Buy fee can not be set higher than 5%");
        buyFee = _fee;
    }

    function updateSellFee(uint256 _fee) external onlyOwner {
        require(_fee <= 5, "Sell fee can not be set higher than 5%");
        sellFee = _fee;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (
            from != owner() &&
            to != owner() &&
            to != address(0) &&
            to != address(0xdead)
        ) {
            _checkTx(to);

            if (_isBuy(from) && !_excludedFromLimits(to)) {
                _maxTxCheck(amount);
                _maxWalletCheck(to, amount);
            } else if (_isSell(to) && !_excludedFromLimits(from)) {
                _maxTxCheck(amount);
            } else if (!_excludedFromLimits(to)) {
                _maxWalletCheck(to, amount);
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance > 0;

        if (
            canSwap &&
            !swapping &&
            pair != from &&
            !_excludedFromFees(from) &&
            !_excludedFromFees(to)
        ) {
            swapping = true;

            _swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        if (_excludedFromFees(from) || _excludedFromFees(to)) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees = 0;

            // on sell
            if (to == pair) {
                fees = amount.mul(sellFee).div(100);
            }
            // on buy
            else if (from == pair) {
                fees = amount.mul(buyFee).div(100);
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    function _checkTx(address _to) internal {
        if (_to != owner() && _to != pair && _to != address(router)) {
            require(
                addressLastTxBlock[tx.origin] != block.number,
                "Only one purchase per block allowed"
            );
            addressLastTxBlock[tx.origin] = block.number;
        }
    }

    function _swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));

        if (contractBalance == 0) {
            return;
        }

        _swapTokensForEth(contractBalance);
    }

    function _isSell(address _to) internal view returns (bool) {
        return _to == pair;
    }

    function _isBuy(address _from) internal view returns (bool) {
        return _from == pair;
    }

    function _excludeFromFees(address _addr, bool _doesBypass) internal {
        excludedFromFees[_addr] = _doesBypass;
    }

    function _excludedFromFees(address _addr) internal view returns (bool) {
        return excludedFromFees[_addr];
    }

    function _excludeFromLimits(address _addr, bool _doesBypass) internal {
        excludedFromLimits[_addr] = _doesBypass;
    }

    function _excludedFromLimits(address _addr) internal view returns (bool) {
        return excludedFromLimits[_addr];
    }

    function _maxTxCheck(uint256 _amount) internal view {
        require(_amount <= maxTx, "Max transaction limit reached");
    }

    function _maxWalletCheck(address _addr, uint256 _amount) internal view {
        require(
            _amount + balanceOf(_addr) <= maxWallet,
            "Max wallet limit reached"
        );
    }

    function _swapTokensForEth(uint256 _tokenAmount) internal {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), _tokenAmount);

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            path,
            address(marketingWallet),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","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":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"_fee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"updateMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526005600a556005600b553480156200001a575f80fd5b506040518060400160405280600481526020017f4f6e7978000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f4e59580000000000000000000000000000000000000000000000000000000081525081600390816200009891906200097c565b508060049081620000aa91906200097c565b505050620000cd620000c1620003fc60201b60201c565b6200040360201b60201c565b5f683635c9adc5dea000009050678ac7230489e800006007819055506801158e460913d0000060088190555062000109620004c660201b60201c565b60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000202919062000ac5565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000290919062000ac5565b6040518363ffffffff1660e01b8152600401620002af92919062000b06565b6020604051808303815f875af1158015620002cc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002f2919062000ac5565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200033a60a0516001620004ee60201b60201c565b6200034f6080516001620004ee60201b60201c565b6200037162000363620004c660201b60201c565b6001620004ee60201b60201c565b62000384306001620004ee60201b60201c565b6200039961dead6001620004ee60201b60201c565b620003bb620003ad620004c660201b60201c565b60016200054660201b60201c565b620003ce3060016200054660201b60201c565b620003e361dead60016200054660201b60201c565b620003f533826200059e60201b60201c565b5062000c42565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200060f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006069062000b8f565b60405180910390fd5b620006225f83836200070e60201b60201c565b8060025f82825462000635919062000bdc565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825462000689919062000bdc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006ef919062000c27565b60405180910390a36200070a5f83836200071360201b60201c565b5050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200079457607f821691505b602082108103620007aa57620007a96200074f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200080e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007d1565b6200081a8683620007d1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620008646200085e620008588462000832565b6200083b565b62000832565b9050919050565b5f819050919050565b6200087f8362000844565b620008976200088e826200086b565b848454620007dd565b825550505050565b5f90565b620008ad6200089f565b620008ba81848462000874565b505050565b5b81811015620008e157620008d55f82620008a3565b600181019050620008c0565b5050565b601f8211156200093057620008fa81620007b0565b6200090584620007c2565b8101602085101562000915578190505b6200092d6200092485620007c2565b830182620008bf565b50505b505050565b5f82821c905092915050565b5f620009525f198460080262000935565b1980831691505092915050565b5f6200096c838362000941565b9150826002028217905092915050565b620009878262000718565b67ffffffffffffffff811115620009a357620009a262000722565b5b620009af82546200077c565b620009bc828285620008e5565b5f60209050601f831160018114620009f2575f8415620009dd578287015190505b620009e985826200095f565b86555062000a58565b601f19841662000a0286620007b0565b5f5b8281101562000a2b5784890151825560018201915060208501945060208101905062000a04565b8683101562000a4b578489015162000a47601f89168262000941565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000a8f8262000a64565b9050919050565b62000aa18162000a83565b811462000aac575f80fd5b50565b5f8151905062000abf8162000a96565b92915050565b5f6020828403121562000add5762000adc62000a60565b5b5f62000aec8482850162000aaf565b91505092915050565b62000b008162000a83565b82525050565b5f60408201905062000b1b5f83018562000af5565b62000b2a602083018462000af5565b9392505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000b77601f8362000b31565b915062000b848262000b41565b602082019050919050565b5f6020820190508181035f83015262000ba88162000b69565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000be88262000832565b915062000bf58362000832565b925082820190508082111562000c105762000c0f62000baf565b5b92915050565b62000c218162000832565b82525050565b5f60208201905062000c3c5f83018462000c16565b92915050565b60805160a051612d4a62000c9c5f395f81816118cf01528181611cd501528181611db40152611ddb01525f81816112ed015281816113c80152818161144a01528181611877015281816119eb0152611b380152612d4a5ff3fe608060405260043610610143575f3560e01c806370a08231116100b5578063a457c2d71161006e578063a457c2d714610446578063a9059cbb14610482578063c2d0ffca146104be578063dd62ed3e146104e6578063f2fde38b14610522578063f8b45b051461054a5761014a565b806370a082311461034c578063715018a6146103885780637437681e1461039e57806375f0a874146103c85780638da5cb5b146103f257806395d89b411461041c5761014a565b806323b872dd1161010757806323b872dd1461022e5780632b14ca561461026a578063313ce5671461029457806339509351146102be578063467abe0a146102fa57806347062402146103225761014a565b806306fdde031461014e578063095ea7b31461017857806318160ddd146101b45780631c499ab0146101de5780631d933a4a146102065761014a565b3661014a57005b5f80fd5b348015610159575f80fd5b50610162610574565b60405161016f9190611f16565b60405180910390f35b348015610183575f80fd5b5061019e60048036038101906101999190611fc7565b610604565b6040516101ab919061201f565b60405180910390f35b3480156101bf575f80fd5b506101c8610626565b6040516101d59190612047565b60405180910390f35b3480156101e9575f80fd5b5061020460048036038101906101ff9190612060565b61062f565b005b348015610211575f80fd5b5061022c60048036038101906102279190612060565b610720565b005b348015610239575f80fd5b50610254600480360381019061024f919061208b565b6107ea565b604051610261919061201f565b60405180910390f35b348015610275575f80fd5b5061027e610818565b60405161028b9190612047565b60405180910390f35b34801561029f575f80fd5b506102a861081e565b6040516102b591906120f6565b60405180910390f35b3480156102c9575f80fd5b506102e460048036038101906102df9190611fc7565b610826565b6040516102f1919061201f565b60405180910390f35b348015610305575f80fd5b50610320600480360381019061031b9190612060565b6108cb565b005b34801561032d575f80fd5b50610336610995565b6040516103439190612047565b60405180910390f35b348015610357575f80fd5b50610372600480360381019061036d919061210f565b61099b565b60405161037f9190612047565b60405180910390f35b348015610393575f80fd5b5061039c6109e0565b005b3480156103a9575f80fd5b506103b2610a67565b6040516103bf9190612047565b60405180910390f35b3480156103d3575f80fd5b506103dc610a6d565b6040516103e99190612149565b60405180910390f35b3480156103fd575f80fd5b50610406610a92565b6040516104139190612149565b60405180910390f35b348015610427575f80fd5b50610430610aba565b60405161043d9190611f16565b60405180910390f35b348015610451575f80fd5b5061046c60048036038101906104679190611fc7565b610b4a565b604051610479919061201f565b60405180910390f35b34801561048d575f80fd5b506104a860048036038101906104a39190611fc7565b610c2e565b6040516104b5919061201f565b60405180910390f35b3480156104c9575f80fd5b506104e460048036038101906104df9190612060565b610c50565b005b3480156104f1575f80fd5b5061050c60048036038101906105079190612162565b610d41565b6040516105199190612047565b60405180910390f35b34801561052d575f80fd5b506105486004803603810190610543919061210f565b610dc3565b005b348015610555575f80fd5b5061055e610eb9565b60405161056b9190612047565b60405180910390f35b606060038054610583906121cd565b80601f01602080910402602001604051908101604052809291908181526020018280546105af906121cd565b80156105fa5780601f106105d1576101008083540402835291602001916105fa565b820191905f5260205f20905b8154815290600101906020018083116105dd57829003601f168201915b5050505050905090565b5f8061060e610ebf565b905061061b818585610ec6565b600191505092915050565b5f600254905090565b610637610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610655610a92565b73ffffffffffffffffffffffffffffffffffffffff16146106ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a290612247565b60405180910390fd5b600854670de0b6b3a7640000826106c29190612292565b1015610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061231d565b60405180910390fd5b670de0b6b3a7640000816107179190612292565b60088190555050565b610728610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610746610a92565b73ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390612247565b60405180910390fd5b60058111156107e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d7906123ab565b60405180910390fd5b80600b8190555050565b5f806107f4610ebf565b9050610801858285611089565b61080c858585611114565b60019150509392505050565b600b5481565b5f6012905090565b5f80610830610ebf565b90506108c081858560015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546108bb91906123c9565b610ec6565b600191505092915050565b6108d3610ebf565b73ffffffffffffffffffffffffffffffffffffffff166108f1610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e90612247565b60405180910390fd5b600581111561098b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109829061246c565b60405180910390fd5b80600a8190555050565b600a5481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6109e8610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610a06610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390612247565b60405180910390fd5b610a655f6114ff565b565b60075481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ac9906121cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610af5906121cd565b8015610b405780601f10610b1757610100808354040283529160200191610b40565b820191905f5260205f20905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b5f80610b54610ebf565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083811015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906124fa565b60405180910390fd5b610c228286868403610ec6565b60019250505092915050565b5f80610c38610ebf565b9050610c45818585611114565b600191505092915050565b610c58610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610c76610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390612247565b60405180910390fd5b600754670de0b6b3a764000082610ce39190612292565b1015610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90612562565b60405180910390fd5b670de0b6b3a764000081610d389190612292565b60078190555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610dcb610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610de9610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690612247565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea4906125f0565b60405180910390fd5b610eb6816114ff565b50565b60085481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b9061267e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f999061270c565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161107c9190612047565b60405180910390a3505050565b5f6110948484610d41565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461110e5781811015611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f790612774565b60405180910390fd5b61110d8484848403610ec6565b5b50505050565b5f810361112b5761112683835f6115c2565b6114fa565b611133610a92565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111a15750611171610a92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156111d957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611213575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156112a25761122182611837565b61122a836119e8565b801561123c575061123a82611a3f565b155b156112595761124a81611a91565b6112548282611ad9565b6112a1565b61126282611b35565b8015611274575061127283611a3f565b155b156112875761128281611a91565b6112a0565b61129082611a3f565b61129f5761129e8282611ad9565b5b5b5b5b5f6112ac3061099b565b90505f80821190508080156112cd5750600d5f9054906101000a900460ff16155b801561132557508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614155b8015611337575061133585611b8c565b155b8015611349575061134784611b8c565b155b1561138a576001600d5f6101000a81548160ff021916908315150217905550611370611bde565b5f600d5f6101000a81548160ff0219169083151502179055505b5f600d5f9054906101000a900460ff161590506113a686611b8c565b806113b657506113b585611b8c565b5b156113bf575f90505b80156114eb575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611448576114416064611433600b5488611c0490919063ffffffff16565b611c1990919063ffffffff16565b90506114c7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036114c6576114c360646114b5600a5488611c0490919063ffffffff16565b611c1990919063ffffffff16565b90505b5b5f8111156114db576114da8730836115c2565b5b80856114e79190612792565b9450505b6114f68686866115c2565b5050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790612835565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611695906128c3565b60405180910390fd5b6116a9838383611c2e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390612951565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117ba91906123c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161181e9190612047565b60405180910390a3611831848484611c33565b50505050565b61183f610a92565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156118c657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561191e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156119e55743600e5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611999906129df565b60405180910390fd5b43600e5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600754811115611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd90612a47565b60405180910390fd5b50565b600854611ae58361099b565b82611af091906123c9565b1115611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2890612aaf565b60405180910390fd5b5050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f611be83061099b565b90505f8103611bf75750611c02565b611c0081611c38565b505b565b5f8183611c119190612292565b905092915050565b5f8183611c269190612afa565b905092915050565b505050565b505050565b5f600267ffffffffffffffff811115611c5457611c53612b2a565b5b604051908082528060200260200182016040528015611c825781602001602082028036833780820191505090505b50905030815f81518110611c9957611c98612b57565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d609190612b98565b81600181518110611d7457611d73612b57565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611dd9307f000000000000000000000000000000000000000000000000000000000000000084610ec6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611e5b959493929190612cbc565b5f604051808303815f87803b158015611e72575f80fd5b505af1158015611e84573d5f803e3d5ffd5b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611ec3578082015181840152602081019050611ea8565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ee882611e8c565b611ef28185611e96565b9350611f02818560208601611ea6565b611f0b81611ece565b840191505092915050565b5f6020820190508181035f830152611f2e8184611ede565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6382611f3a565b9050919050565b611f7381611f59565b8114611f7d575f80fd5b50565b5f81359050611f8e81611f6a565b92915050565b5f819050919050565b611fa681611f94565b8114611fb0575f80fd5b50565b5f81359050611fc181611f9d565b92915050565b5f8060408385031215611fdd57611fdc611f36565b5b5f611fea85828601611f80565b9250506020611ffb85828601611fb3565b9150509250929050565b5f8115159050919050565b61201981612005565b82525050565b5f6020820190506120325f830184612010565b92915050565b61204181611f94565b82525050565b5f60208201905061205a5f830184612038565b92915050565b5f6020828403121561207557612074611f36565b5b5f61208284828501611fb3565b91505092915050565b5f805f606084860312156120a2576120a1611f36565b5b5f6120af86828701611f80565b93505060206120c086828701611f80565b92505060406120d186828701611fb3565b9150509250925092565b5f60ff82169050919050565b6120f0816120db565b82525050565b5f6020820190506121095f8301846120e7565b92915050565b5f6020828403121561212457612123611f36565b5b5f61213184828501611f80565b91505092915050565b61214381611f59565b82525050565b5f60208201905061215c5f83018461213a565b92915050565b5f806040838503121561217857612177611f36565b5b5f61218585828601611f80565b925050602061219685828601611f80565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806121e457607f821691505b6020821081036121f7576121f66121a0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612231602083611e96565b915061223c826121fd565b602082019050919050565b5f6020820190508181035f83015261225e81612225565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61229c82611f94565b91506122a783611f94565b92508282026122b581611f94565b915082820484148315176122cc576122cb612265565b5b5092915050565b7f4d61782077616c6c65742063616e206e6f74206265206c6f77657265640000005f82015250565b5f612307601d83611e96565b9150612312826122d3565b602082019050919050565b5f6020820190508181035f830152612334816122fb565b9050919050565b7f53656c6c206665652063616e206e6f74206265207365742068696768657220745f8201527f68616e2035250000000000000000000000000000000000000000000000000000602082015250565b5f612395602683611e96565b91506123a08261233b565b604082019050919050565b5f6020820190508181035f8301526123c281612389565b9050919050565b5f6123d382611f94565b91506123de83611f94565b92508282019050808211156123f6576123f5612265565b5b92915050565b7f427579206665652063616e206e6f7420626520736574206869676865722074685f8201527f616e203525000000000000000000000000000000000000000000000000000000602082015250565b5f612456602583611e96565b9150612461826123fc565b604082019050919050565b5f6020820190508181035f8301526124838161244a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6124e4602583611e96565b91506124ef8261248a565b604082019050919050565b5f6020820190508181035f830152612511816124d8565b9050919050565b7f4d61782074782063616e206e6f74206265206c6f7765726564000000000000005f82015250565b5f61254c601983611e96565b915061255782612518565b602082019050919050565b5f6020820190508181035f83015261257981612540565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6125da602683611e96565b91506125e582612580565b604082019050919050565b5f6020820190508181035f830152612607816125ce565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612668602483611e96565b91506126738261260e565b604082019050919050565b5f6020820190508181035f8301526126958161265c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6126f6602283611e96565b91506127018261269c565b604082019050919050565b5f6020820190508181035f830152612723816126ea565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61275e601d83611e96565b91506127698261272a565b602082019050919050565b5f6020820190508181035f83015261278b81612752565b9050919050565b5f61279c82611f94565b91506127a783611f94565b92508282039050818111156127bf576127be612265565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61281f602583611e96565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad602383611e96565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61293b602683611e96565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f4f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f5f8201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c9602383611e96565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f4d6178207472616e73616374696f6e206c696d697420726561636865640000005f82015250565b5f612a31601d83611e96565b9150612a3c826129fd565b602082019050919050565b5f6020820190508181035f830152612a5e81612a25565b9050919050565b7f4d61782077616c6c6574206c696d6974207265616368656400000000000000005f82015250565b5f612a99601883611e96565b9150612aa482612a65565b602082019050919050565b5f6020820190508181035f830152612ac681612a8d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612b0482611f94565b9150612b0f83611f94565b925082612b1f57612b1e612acd565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612b9281611f6a565b92915050565b5f60208284031215612bad57612bac611f36565b5b5f612bba84828501612b84565b91505092915050565b5f819050919050565b5f819050919050565b5f612bef612bea612be584612bc3565b612bcc565b611f94565b9050919050565b612bff81612bd5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612c3781611f59565b82525050565b5f612c488383612c2e565b60208301905092915050565b5f602082019050919050565b5f612c6a82612c05565b612c748185612c0f565b9350612c7f83612c1f565b805f5b83811015612caf578151612c968882612c3d565b9750612ca183612c54565b925050600181019050612c82565b5085935050505092915050565b5f60a082019050612ccf5f830188612038565b612cdc6020830187612bf6565b8181036040830152612cee8186612c60565b9050612cfd606083018561213a565b612d0a6080830184612038565b969550505050505056fea264697066735822122091423a0988f73a048779d80b51cce41c9e4ccddc21c65ffdd8d756d0c886438564736f6c63430008160033

Deployed Bytecode

0x608060405260043610610143575f3560e01c806370a08231116100b5578063a457c2d71161006e578063a457c2d714610446578063a9059cbb14610482578063c2d0ffca146104be578063dd62ed3e146104e6578063f2fde38b14610522578063f8b45b051461054a5761014a565b806370a082311461034c578063715018a6146103885780637437681e1461039e57806375f0a874146103c85780638da5cb5b146103f257806395d89b411461041c5761014a565b806323b872dd1161010757806323b872dd1461022e5780632b14ca561461026a578063313ce5671461029457806339509351146102be578063467abe0a146102fa57806347062402146103225761014a565b806306fdde031461014e578063095ea7b31461017857806318160ddd146101b45780631c499ab0146101de5780631d933a4a146102065761014a565b3661014a57005b5f80fd5b348015610159575f80fd5b50610162610574565b60405161016f9190611f16565b60405180910390f35b348015610183575f80fd5b5061019e60048036038101906101999190611fc7565b610604565b6040516101ab919061201f565b60405180910390f35b3480156101bf575f80fd5b506101c8610626565b6040516101d59190612047565b60405180910390f35b3480156101e9575f80fd5b5061020460048036038101906101ff9190612060565b61062f565b005b348015610211575f80fd5b5061022c60048036038101906102279190612060565b610720565b005b348015610239575f80fd5b50610254600480360381019061024f919061208b565b6107ea565b604051610261919061201f565b60405180910390f35b348015610275575f80fd5b5061027e610818565b60405161028b9190612047565b60405180910390f35b34801561029f575f80fd5b506102a861081e565b6040516102b591906120f6565b60405180910390f35b3480156102c9575f80fd5b506102e460048036038101906102df9190611fc7565b610826565b6040516102f1919061201f565b60405180910390f35b348015610305575f80fd5b50610320600480360381019061031b9190612060565b6108cb565b005b34801561032d575f80fd5b50610336610995565b6040516103439190612047565b60405180910390f35b348015610357575f80fd5b50610372600480360381019061036d919061210f565b61099b565b60405161037f9190612047565b60405180910390f35b348015610393575f80fd5b5061039c6109e0565b005b3480156103a9575f80fd5b506103b2610a67565b6040516103bf9190612047565b60405180910390f35b3480156103d3575f80fd5b506103dc610a6d565b6040516103e99190612149565b60405180910390f35b3480156103fd575f80fd5b50610406610a92565b6040516104139190612149565b60405180910390f35b348015610427575f80fd5b50610430610aba565b60405161043d9190611f16565b60405180910390f35b348015610451575f80fd5b5061046c60048036038101906104679190611fc7565b610b4a565b604051610479919061201f565b60405180910390f35b34801561048d575f80fd5b506104a860048036038101906104a39190611fc7565b610c2e565b6040516104b5919061201f565b60405180910390f35b3480156104c9575f80fd5b506104e460048036038101906104df9190612060565b610c50565b005b3480156104f1575f80fd5b5061050c60048036038101906105079190612162565b610d41565b6040516105199190612047565b60405180910390f35b34801561052d575f80fd5b506105486004803603810190610543919061210f565b610dc3565b005b348015610555575f80fd5b5061055e610eb9565b60405161056b9190612047565b60405180910390f35b606060038054610583906121cd565b80601f01602080910402602001604051908101604052809291908181526020018280546105af906121cd565b80156105fa5780601f106105d1576101008083540402835291602001916105fa565b820191905f5260205f20905b8154815290600101906020018083116105dd57829003601f168201915b5050505050905090565b5f8061060e610ebf565b905061061b818585610ec6565b600191505092915050565b5f600254905090565b610637610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610655610a92565b73ffffffffffffffffffffffffffffffffffffffff16146106ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a290612247565b60405180910390fd5b600854670de0b6b3a7640000826106c29190612292565b1015610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fa9061231d565b60405180910390fd5b670de0b6b3a7640000816107179190612292565b60088190555050565b610728610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610746610a92565b73ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390612247565b60405180910390fd5b60058111156107e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d7906123ab565b60405180910390fd5b80600b8190555050565b5f806107f4610ebf565b9050610801858285611089565b61080c858585611114565b60019150509392505050565b600b5481565b5f6012905090565b5f80610830610ebf565b90506108c081858560015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546108bb91906123c9565b610ec6565b600191505092915050565b6108d3610ebf565b73ffffffffffffffffffffffffffffffffffffffff166108f1610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e90612247565b60405180910390fd5b600581111561098b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109829061246c565b60405180910390fd5b80600a8190555050565b600a5481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6109e8610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610a06610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390612247565b60405180910390fd5b610a655f6114ff565b565b60075481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ac9906121cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610af5906121cd565b8015610b405780601f10610b1757610100808354040283529160200191610b40565b820191905f5260205f20905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b5f80610b54610ebf565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083811015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906124fa565b60405180910390fd5b610c228286868403610ec6565b60019250505092915050565b5f80610c38610ebf565b9050610c45818585611114565b600191505092915050565b610c58610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610c76610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390612247565b60405180910390fd5b600754670de0b6b3a764000082610ce39190612292565b1015610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90612562565b60405180910390fd5b670de0b6b3a764000081610d389190612292565b60078190555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610dcb610ebf565b73ffffffffffffffffffffffffffffffffffffffff16610de9610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690612247565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea4906125f0565b60405180910390fd5b610eb6816114ff565b50565b60085481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b9061267e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f999061270c565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161107c9190612047565b60405180910390a3505050565b5f6110948484610d41565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461110e5781811015611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f790612774565b60405180910390fd5b61110d8484848403610ec6565b5b50505050565b5f810361112b5761112683835f6115c2565b6114fa565b611133610a92565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111a15750611171610a92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156111d957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611213575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156112a25761122182611837565b61122a836119e8565b801561123c575061123a82611a3f565b155b156112595761124a81611a91565b6112548282611ad9565b6112a1565b61126282611b35565b8015611274575061127283611a3f565b155b156112875761128281611a91565b6112a0565b61129082611a3f565b61129f5761129e8282611ad9565b5b5b5b5b5f6112ac3061099b565b90505f80821190508080156112cd5750600d5f9054906101000a900460ff16155b801561132557508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff1614155b8015611337575061133585611b8c565b155b8015611349575061134784611b8c565b155b1561138a576001600d5f6101000a81548160ff021916908315150217905550611370611bde565b5f600d5f6101000a81548160ff0219169083151502179055505b5f600d5f9054906101000a900460ff161590506113a686611b8c565b806113b657506113b585611b8c565b5b156113bf575f90505b80156114eb575f7f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611448576114416064611433600b5488611c0490919063ffffffff16565b611c1990919063ffffffff16565b90506114c7565b7f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036114c6576114c360646114b5600a5488611c0490919063ffffffff16565b611c1990919063ffffffff16565b90505b5b5f8111156114db576114da8730836115c2565b5b80856114e79190612792565b9450505b6114f68686866115c2565b5050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790612835565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611695906128c3565b60405180910390fd5b6116a9838383611c2e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390612951565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117ba91906123c9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161181e9190612047565b60405180910390a3611831848484611c33565b50505050565b61183f610a92565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156118c657507f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561191e57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156119e55743600e5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611999906129df565b60405180910390fd5b43600e5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b50565b5f7f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600754811115611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd90612a47565b60405180910390fd5b50565b600854611ae58361099b565b82611af091906123c9565b1115611b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2890612aaf565b60405180910390fd5b5050565b5f7f000000000000000000000000db0ecb2bc9e629d954635a385871ce40a7a6d98873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f611be83061099b565b90505f8103611bf75750611c02565b611c0081611c38565b505b565b5f8183611c119190612292565b905092915050565b5f8183611c269190612afa565b905092915050565b505050565b505050565b5f600267ffffffffffffffff811115611c5457611c53612b2a565b5b604051908082528060200260200182016040528015611c825781602001602082028036833780820191505090505b50905030815f81518110611c9957611c98612b57565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d609190612b98565b81600181518110611d7457611d73612b57565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611dd9307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610ec6565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611e5b959493929190612cbc565b5f604051808303815f87803b158015611e72575f80fd5b505af1158015611e84573d5f803e3d5ffd5b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611ec3578082015181840152602081019050611ea8565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ee882611e8c565b611ef28185611e96565b9350611f02818560208601611ea6565b611f0b81611ece565b840191505092915050565b5f6020820190508181035f830152611f2e8184611ede565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f6382611f3a565b9050919050565b611f7381611f59565b8114611f7d575f80fd5b50565b5f81359050611f8e81611f6a565b92915050565b5f819050919050565b611fa681611f94565b8114611fb0575f80fd5b50565b5f81359050611fc181611f9d565b92915050565b5f8060408385031215611fdd57611fdc611f36565b5b5f611fea85828601611f80565b9250506020611ffb85828601611fb3565b9150509250929050565b5f8115159050919050565b61201981612005565b82525050565b5f6020820190506120325f830184612010565b92915050565b61204181611f94565b82525050565b5f60208201905061205a5f830184612038565b92915050565b5f6020828403121561207557612074611f36565b5b5f61208284828501611fb3565b91505092915050565b5f805f606084860312156120a2576120a1611f36565b5b5f6120af86828701611f80565b93505060206120c086828701611f80565b92505060406120d186828701611fb3565b9150509250925092565b5f60ff82169050919050565b6120f0816120db565b82525050565b5f6020820190506121095f8301846120e7565b92915050565b5f6020828403121561212457612123611f36565b5b5f61213184828501611f80565b91505092915050565b61214381611f59565b82525050565b5f60208201905061215c5f83018461213a565b92915050565b5f806040838503121561217857612177611f36565b5b5f61218585828601611f80565b925050602061219685828601611f80565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806121e457607f821691505b6020821081036121f7576121f66121a0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612231602083611e96565b915061223c826121fd565b602082019050919050565b5f6020820190508181035f83015261225e81612225565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61229c82611f94565b91506122a783611f94565b92508282026122b581611f94565b915082820484148315176122cc576122cb612265565b5b5092915050565b7f4d61782077616c6c65742063616e206e6f74206265206c6f77657265640000005f82015250565b5f612307601d83611e96565b9150612312826122d3565b602082019050919050565b5f6020820190508181035f830152612334816122fb565b9050919050565b7f53656c6c206665652063616e206e6f74206265207365742068696768657220745f8201527f68616e2035250000000000000000000000000000000000000000000000000000602082015250565b5f612395602683611e96565b91506123a08261233b565b604082019050919050565b5f6020820190508181035f8301526123c281612389565b9050919050565b5f6123d382611f94565b91506123de83611f94565b92508282019050808211156123f6576123f5612265565b5b92915050565b7f427579206665652063616e206e6f7420626520736574206869676865722074685f8201527f616e203525000000000000000000000000000000000000000000000000000000602082015250565b5f612456602583611e96565b9150612461826123fc565b604082019050919050565b5f6020820190508181035f8301526124838161244a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6124e4602583611e96565b91506124ef8261248a565b604082019050919050565b5f6020820190508181035f830152612511816124d8565b9050919050565b7f4d61782074782063616e206e6f74206265206c6f7765726564000000000000005f82015250565b5f61254c601983611e96565b915061255782612518565b602082019050919050565b5f6020820190508181035f83015261257981612540565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6125da602683611e96565b91506125e582612580565b604082019050919050565b5f6020820190508181035f830152612607816125ce565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612668602483611e96565b91506126738261260e565b604082019050919050565b5f6020820190508181035f8301526126958161265c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6126f6602283611e96565b91506127018261269c565b604082019050919050565b5f6020820190508181035f830152612723816126ea565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61275e601d83611e96565b91506127698261272a565b602082019050919050565b5f6020820190508181035f83015261278b81612752565b9050919050565b5f61279c82611f94565b91506127a783611f94565b92508282039050818111156127bf576127be612265565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61281f602583611e96565b915061282a826127c5565b604082019050919050565b5f6020820190508181035f83015261284c81612813565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6128ad602383611e96565b91506128b882612853565b604082019050919050565b5f6020820190508181035f8301526128da816128a1565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61293b602683611e96565b9150612946826128e1565b604082019050919050565b5f6020820190508181035f8301526129688161292f565b9050919050565b7f4f6e6c79206f6e652070757263686173652070657220626c6f636b20616c6c6f5f8201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b5f6129c9602383611e96565b91506129d48261296f565b604082019050919050565b5f6020820190508181035f8301526129f6816129bd565b9050919050565b7f4d6178207472616e73616374696f6e206c696d697420726561636865640000005f82015250565b5f612a31601d83611e96565b9150612a3c826129fd565b602082019050919050565b5f6020820190508181035f830152612a5e81612a25565b9050919050565b7f4d61782077616c6c6574206c696d6974207265616368656400000000000000005f82015250565b5f612a99601883611e96565b9150612aa482612a65565b602082019050919050565b5f6020820190508181035f830152612ac681612a8d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612b0482611f94565b9150612b0f83611f94565b925082612b1f57612b1e612acd565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612b9281611f6a565b92915050565b5f60208284031215612bad57612bac611f36565b5b5f612bba84828501612b84565b91505092915050565b5f819050919050565b5f819050919050565b5f612bef612bea612be584612bc3565b612bcc565b611f94565b9050919050565b612bff81612bd5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612c3781611f59565b82525050565b5f612c488383612c2e565b60208301905092915050565b5f602082019050919050565b5f612c6a82612c05565b612c748185612c0f565b9350612c7f83612c1f565b805f5b83811015612caf578151612c968882612c3d565b9750612ca183612c54565b925050600181019050612c82565b5085935050505092915050565b5f60a082019050612ccf5f830188612038565b612cdc6020830187612bf6565b8181036040830152612cee8186612c60565b9050612cfd606083018561213a565b612d0a6080830184612038565b969550505050505056fea264697066735822122091423a0988f73a048779d80b51cce41c9e4ccddc21c65ffdd8d756d0c886438564736f6c63430008160033

Deployed Bytecode Sourcemap

36153:6252:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24989:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27481:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26109:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37767:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38190:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28303:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36507:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25951:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29007:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38025:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36475:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26280:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18835:103;;;;;;;;;;;;;:::i;:::-;;36355:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36316:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18184:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25208:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29782:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26663:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37574:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26960:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19093:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36382:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24989:100;25043:13;25076:5;25069:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24989:100;:::o;27481:242::-;27600:4;27622:13;27638:12;:10;:12::i;:::-;27622:28;;27661:32;27670:5;27677:7;27686:6;27661:8;:32::i;:::-;27711:4;27704:11;;;27481:242;;;;:::o;26109:108::-;26170:7;26197:12;;26190:19;;26109:108;:::o;37767:250::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37897:9:::1;;37889:4;37870:16;:23;;;;:::i;:::-;:36;;37848:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;38005:4;37986:16;:23;;;;:::i;:::-;37974:9;:35;;;;37767:250:::0;:::o;38190:160::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38273:1:::1;38265:4;:9;;38257:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38338:4;38328:7;:14;;;;38190:160:::0;:::o;28303:295::-;28434:4;28451:15;28469:12;:10;:12::i;:::-;28451:30;;28492:38;28508:4;28514:7;28523:6;28492:15;:38::i;:::-;28541:27;28551:4;28557:2;28561:6;28541:9;:27::i;:::-;28586:4;28579:11;;;28303:295;;;;;:::o;36507:26::-;;;;:::o;25951:93::-;26009:5;26034:2;26027:9;;25951:93;:::o;29007:272::-;29122:4;29144:13;29160:12;:10;:12::i;:::-;29144:28;;29183:66;29192:5;29199:7;29238:10;29208:11;:18;29220:5;29208:18;;;;;;;;;;;;;;;:27;29227:7;29208:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;29183:8;:66::i;:::-;29267:4;29260:11;;;29007:272;;;;:::o;38025:157::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38107:1:::1;38099:4;:9;;38091:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;38170:4;38161:6;:13;;;;38025:157:::0;:::o;36475:25::-;;;;:::o;26280:177::-;26399:7;26431:9;:18;26441:7;26431:18;;;;;;;;;;;;;;;;26424:25;;26280:177;;;:::o;18835:103::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18900:30:::1;18927:1;18900:18;:30::i;:::-;18835:103::o:0;36355:20::-;;;;:::o;36316:30::-;;;;;;;;;;;;;:::o;18184:87::-;18230:7;18257:6;;;;;;;;;;;18250:13;;18184:87;:::o;25208:104::-;25264:13;25297:7;25290:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25208:104;:::o;29782:507::-;29902:4;29924:13;29940:12;:10;:12::i;:::-;29924:28;;29963:24;29990:11;:18;30002:5;29990:18;;;;;;;;;;;;;;;:27;30009:7;29990:27;;;;;;;;;;;;;;;;29963:54;;30070:15;30050:16;:35;;30028:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;30186:60;30195:5;30202:7;30230:15;30211:16;:34;30186:8;:60::i;:::-;30277:4;30270:11;;;;29782:507;;;;:::o;26663:234::-;26778:4;26800:13;26816:12;:10;:12::i;:::-;26800:28;;26839;26849:5;26856:2;26860:6;26839:9;:28::i;:::-;26885:4;26878:11;;;26663:234;;;;:::o;37574:185::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37678:5:::1;;37670:4;37655:12;:19;;;;:::i;:::-;:28;;37647:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37747:4;37732:12;:19;;;;:::i;:::-;37724:5;:27;;;;37574:185:::0;:::o;26960:201::-;27094:7;27126:11;:18;27138:5;27126:18;;;;;;;;;;;;;;;:27;27145:7;27126:27;;;;;;;;;;;;;;;;27119:34;;26960:201;;;;:::o;19093:238::-;18415:12;:10;:12::i;:::-;18404:23;;:7;:5;:7::i;:::-;:23;;;18396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19216:1:::1;19196:22;;:8;:22;;::::0;19174:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19295:28;19314:8;19295:18;:28::i;:::-;19093:238:::0;:::o;36382:24::-;;;;:::o;17026:98::-;17079:7;17106:10;17099:17;;17026:98;:::o;33524:380::-;33677:1;33660:19;;:5;:19;;;33652:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33758:1;33739:21;;:7;:21;;;33731:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33842:6;33812:11;:18;33824:5;33812:18;;;;;;;;;;;;;;;:27;33831:7;33812:27;;;;;;;;;;;;;;;:36;;;;33880:7;33864:32;;33873:5;33864:32;;;33889:6;33864:32;;;;;;:::i;:::-;;;;;;;;33524:380;;;:::o;34191:502::-;34326:24;34353:25;34363:5;34370:7;34353:9;:25::i;:::-;34326:52;;34413:17;34393:16;:37;34389:297;;34493:6;34473:16;:26;;34447:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34608:51;34617:5;34624:7;34652:6;34633:16;:25;34608:8;:51::i;:::-;34389:297;34315:378;34191:502;;;:::o;38358:1845::-;38496:1;38486:6;:11;38482:93;;38514:28;38530:4;38536:2;38540:1;38514:15;:28::i;:::-;38557:7;;38482:93;38613:7;:5;:7::i;:::-;38605:15;;:4;:15;;;;:45;;;;;38643:7;:5;:7::i;:::-;38637:13;;:2;:13;;;;38605:45;:78;;;;;38681:1;38667:16;;:2;:16;;;;38605:78;:116;;;;;38714:6;38700:21;;:2;:21;;;;38605:116;38587:552;;;38748:12;38757:2;38748:8;:12::i;:::-;38781;38788:4;38781:6;:12::i;:::-;:40;;;;;38798:23;38818:2;38798:19;:23::i;:::-;38797:24;38781:40;38777:351;;;38842:19;38854:6;38842:11;:19::i;:::-;38880:27;38896:2;38900:6;38880:15;:27::i;:::-;38777:351;;;38933:11;38941:2;38933:7;:11::i;:::-;:41;;;;;38949:25;38969:4;38949:19;:25::i;:::-;38948:26;38933:41;38929:199;;;38995:19;39007:6;38995:11;:19::i;:::-;38929:199;;;39041:23;39061:2;39041:19;:23::i;:::-;39036:92;;39085:27;39101:2;39105:6;39085:15;:27::i;:::-;39036:92;38929:199;38777:351;38587:552;39151:28;39182:24;39200:4;39182:9;:24::i;:::-;39151:55;;39217:12;39255:1;39232:20;:24;39217:39;;39287:7;:33;;;;;39312:8;;;;;;;;;;;39311:9;39287:33;:62;;;;;39345:4;39337:12;;:4;:12;;;;39287:62;:103;;;;;39367:23;39385:4;39367:17;:23::i;:::-;39366:24;39287:103;:142;;;;;39408:21;39426:2;39408:17;:21::i;:::-;39407:22;39287:142;39269:275;;;39467:4;39456:8;;:15;;;;;;;;;;;;;;;;;;39488:11;:9;:11::i;:::-;39527:5;39516:8;;:16;;;;;;;;;;;;;;;;;;39269:275;39556:12;39572:8;;;;;;;;;;;39571:9;39556:24;;39597:23;39615:4;39597:17;:23::i;:::-;:48;;;;39624:21;39642:2;39624:17;:21::i;:::-;39597:48;39593:96;;;39672:5;39662:15;;39593:96;39705:7;39701:449;;;39729:12;39796:4;39790:10;;:2;:10;;;39786:215;;39828:28;39852:3;39828:19;39839:7;;39828:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;39821:35;;39786:215;;;39926:4;39918:12;;:4;:12;;;39914:87;;39958:27;39981:3;39958:18;39969:6;;39958;:10;;:18;;;;:::i;:::-;:22;;:27;;;;:::i;:::-;39951:34;;39914:87;39786:215;40028:1;40021:4;:8;40017:91;;;40050:42;40066:4;40080;40087;40050:15;:42::i;:::-;40017:91;40134:4;40124:14;;;;;:::i;:::-;;;39714:436;39701:449;40162:33;40178:4;40184:2;40188:6;40162:15;:33::i;:::-;38471:1732;;;38358:1845;;;;:::o;19491:191::-;19565:16;19584:6;;;;;;;;;;;19565:25;;19610:8;19601:6;;:17;;;;;;;;;;;;;;;;;;19665:8;19634:40;;19655:8;19634:40;;;;;;;;;;;;19554:128;19491:191;:::o;30768:708::-;30915:1;30899:18;;:4;:18;;;30891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30992:1;30978:16;;:2;:16;;;30970:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31047:38;31068:4;31074:2;31078:6;31047:20;:38::i;:::-;31098:19;31120:9;:15;31130:4;31120:15;;;;;;;;;;;;;;;;31098:37;;31183:6;31168:11;:21;;31146:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;31323:6;31309:11;:20;31291:9;:15;31301:4;31291:15;;;;;;;;;;;;;;;:38;;;;31368:6;31351:9;:13;31361:2;31351:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;31407:2;31392:26;;31401:4;31392:26;;;31411:6;31392:26;;;;;;:::i;:::-;;;;;;;;31431:37;31451:4;31457:2;31461:6;31431:19;:37::i;:::-;30880:596;30768:708;;;:::o;40211:347::-;40273:7;:5;:7::i;:::-;40266:14;;:3;:14;;;;:29;;;;;40291:4;40284:11;;:3;:11;;;;40266:29;:55;;;;;40314:6;40299:22;;:3;:22;;;;40266:55;40262:289;;;40397:12;40364:18;:29;40383:9;40364:29;;;;;;;;;;;;;;;;:45;40338:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;40527:12;40495:18;:29;40514:9;40495:29;;;;;;;;;;;;;;;:44;;;;40262:289;40211:347;:::o;40895:99::-;40949:4;40982;40973:13;;:5;:13;;;40966:20;;40895:99;;;:::o;41398:124::-;41465:4;41489:18;:25;41508:5;41489:25;;;;;;;;;;;;;;;;;;;;;;;;;41482:32;;41398:124;;;:::o;41530:129::-;41612:5;;41601:7;:16;;41593:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41530:129;:::o;41667:203::-;41801:9;;41781:16;41791:5;41781:9;:16::i;:::-;41771:7;:26;;;;:::i;:::-;:39;;41749:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41667:203;;:::o;40791:96::-;40844:4;40875;40868:11;;:3;:11;;;40861:18;;40791:96;;;:::o;41134:120::-;41199:4;41223:16;:23;41240:5;41223:23;;;;;;;;;;;;;;;;;;;;;;;;;41216:30;;41134:120;;;:::o;40566:217::-;40607:23;40633:24;40651:4;40633:9;:24::i;:::-;40607:50;;40693:1;40674:15;:20;40670:59;;40711:7;;;40670:59;40741:34;40759:15;40741:17;:34::i;:::-;40596:187;40566:217;:::o;13059:98::-;13117:7;13148:1;13144;:5;;;;:::i;:::-;13137:12;;13059:98;;;;:::o;13458:::-;13516:7;13547:1;13543;:5;;;;:::i;:::-;13536:12;;13458:98;;;;:::o;35293:125::-;;;;:::o;36022:124::-;;;;:::o;41878:524::-;42007:21;42045:1;42031:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42007:40;;42076:4;42058;42063:1;42058:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;42102:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42092:4;42097:1;42092:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;42128:54;42145:4;42160:6;42169:12;42128:8;:54::i;:::-;42195:6;:57;;;42267:12;42294:1;42310:4;42337:15;;;;;;;;;;;42368;42195:199;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41936:466;41878:524;:::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;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:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:474::-;5943:6;5951;6000:2;5988:9;5979:7;5975:23;5971:32;5968:119;;;6006:79;;:::i;:::-;5968:119;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6253:2;6279:53;6324:7;6315:6;6304:9;6300:22;6279:53;:::i;:::-;6269:63;;6224:118;5875:474;;;;;:::o;6355:180::-;6403:77;6400:1;6393:88;6500:4;6497:1;6490:15;6524:4;6521:1;6514:15;6541:320;6585:6;6622:1;6616:4;6612:12;6602:22;;6669:1;6663:4;6659:12;6690:18;6680:81;;6746:4;6738:6;6734:17;6724:27;;6680:81;6808:2;6800:6;6797:14;6777:18;6774:38;6771:84;;6827:18;;:::i;:::-;6771:84;6592:269;6541:320;;;:::o;6867:182::-;7007:34;7003:1;6995:6;6991:14;6984:58;6867:182;:::o;7055:366::-;7197:3;7218:67;7282:2;7277:3;7218:67;:::i;:::-;7211:74;;7294:93;7383:3;7294:93;:::i;:::-;7412:2;7407:3;7403:12;7396:19;;7055:366;;;:::o;7427:419::-;7593:4;7631:2;7620:9;7616:18;7608:26;;7680:9;7674:4;7670:20;7666:1;7655:9;7651:17;7644:47;7708:131;7834:4;7708:131;:::i;:::-;7700:139;;7427:419;;;:::o;7852:180::-;7900:77;7897:1;7890:88;7997:4;7994:1;7987:15;8021:4;8018:1;8011:15;8038:410;8078:7;8101:20;8119:1;8101:20;:::i;:::-;8096:25;;8135:20;8153:1;8135:20;:::i;:::-;8130:25;;8190:1;8187;8183:9;8212:30;8230:11;8212:30;:::i;:::-;8201:41;;8391:1;8382:7;8378:15;8375:1;8372:22;8352:1;8345:9;8325:83;8302:139;;8421:18;;:::i;:::-;8302:139;8086:362;8038:410;;;;:::o;8454:179::-;8594:31;8590:1;8582:6;8578:14;8571:55;8454:179;:::o;8639:366::-;8781:3;8802:67;8866:2;8861:3;8802:67;:::i;:::-;8795:74;;8878:93;8967:3;8878:93;:::i;:::-;8996:2;8991:3;8987:12;8980:19;;8639:366;;;:::o;9011:419::-;9177:4;9215:2;9204:9;9200:18;9192:26;;9264:9;9258:4;9254:20;9250:1;9239:9;9235:17;9228:47;9292:131;9418:4;9292:131;:::i;:::-;9284:139;;9011:419;;;:::o;9436:225::-;9576:34;9572:1;9564:6;9560:14;9553:58;9645:8;9640:2;9632:6;9628:15;9621:33;9436:225;:::o;9667:366::-;9809:3;9830:67;9894:2;9889:3;9830:67;:::i;:::-;9823:74;;9906:93;9995:3;9906:93;:::i;:::-;10024:2;10019:3;10015:12;10008:19;;9667:366;;;:::o;10039:419::-;10205:4;10243:2;10232:9;10228:18;10220:26;;10292:9;10286:4;10282:20;10278:1;10267:9;10263:17;10256:47;10320:131;10446:4;10320:131;:::i;:::-;10312:139;;10039:419;;;:::o;10464:191::-;10504:3;10523:20;10541:1;10523:20;:::i;:::-;10518:25;;10557:20;10575:1;10557:20;:::i;:::-;10552:25;;10600:1;10597;10593:9;10586:16;;10621:3;10618:1;10615:10;10612:36;;;10628:18;;:::i;:::-;10612:36;10464:191;;;;:::o;10661:224::-;10801:34;10797:1;10789:6;10785:14;10778:58;10870:7;10865:2;10857:6;10853:15;10846:32;10661:224;:::o;10891:366::-;11033:3;11054:67;11118:2;11113:3;11054:67;:::i;:::-;11047:74;;11130:93;11219:3;11130:93;:::i;:::-;11248:2;11243:3;11239:12;11232:19;;10891:366;;;:::o;11263:419::-;11429:4;11467:2;11456:9;11452:18;11444:26;;11516:9;11510:4;11506:20;11502:1;11491:9;11487:17;11480:47;11544:131;11670:4;11544:131;:::i;:::-;11536:139;;11263:419;;;:::o;11688:224::-;11828:34;11824:1;11816:6;11812:14;11805:58;11897:7;11892:2;11884:6;11880:15;11873:32;11688:224;:::o;11918:366::-;12060:3;12081:67;12145:2;12140:3;12081:67;:::i;:::-;12074:74;;12157:93;12246:3;12157:93;:::i;:::-;12275:2;12270:3;12266:12;12259:19;;11918:366;;;:::o;12290:419::-;12456:4;12494:2;12483:9;12479:18;12471:26;;12543:9;12537:4;12533:20;12529:1;12518:9;12514:17;12507:47;12571:131;12697:4;12571:131;:::i;:::-;12563:139;;12290:419;;;:::o;12715:175::-;12855:27;12851:1;12843:6;12839:14;12832:51;12715:175;:::o;12896:366::-;13038:3;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13135:93;13224:3;13135:93;:::i;:::-;13253:2;13248:3;13244:12;13237:19;;12896:366;;;:::o;13268:419::-;13434:4;13472:2;13461:9;13457:18;13449:26;;13521:9;13515:4;13511:20;13507:1;13496:9;13492:17;13485:47;13549:131;13675:4;13549:131;:::i;:::-;13541:139;;13268:419;;;:::o;13693:225::-;13833:34;13829:1;13821:6;13817:14;13810:58;13902:8;13897:2;13889:6;13885:15;13878:33;13693:225;:::o;13924:366::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;13924:366;;;:::o;14296:419::-;14462:4;14500:2;14489:9;14485:18;14477:26;;14549:9;14543:4;14539:20;14535:1;14524:9;14520:17;14513:47;14577:131;14703:4;14577:131;:::i;:::-;14569:139;;14296:419;;;:::o;14721:223::-;14861:34;14857:1;14849:6;14845:14;14838:58;14930:6;14925:2;14917:6;14913:15;14906:31;14721:223;:::o;14950:366::-;15092:3;15113:67;15177:2;15172:3;15113:67;:::i;:::-;15106:74;;15189:93;15278:3;15189:93;:::i;:::-;15307:2;15302:3;15298:12;15291:19;;14950:366;;;:::o;15322:419::-;15488:4;15526:2;15515:9;15511:18;15503:26;;15575:9;15569:4;15565:20;15561:1;15550:9;15546:17;15539:47;15603:131;15729:4;15603:131;:::i;:::-;15595:139;;15322:419;;;:::o;15747:221::-;15887:34;15883:1;15875:6;15871:14;15864:58;15956:4;15951:2;15943:6;15939:15;15932:29;15747:221;:::o;15974:366::-;16116:3;16137:67;16201:2;16196:3;16137:67;:::i;:::-;16130:74;;16213:93;16302:3;16213:93;:::i;:::-;16331:2;16326:3;16322:12;16315:19;;15974:366;;;:::o;16346:419::-;16512:4;16550:2;16539:9;16535:18;16527:26;;16599:9;16593:4;16589:20;16585:1;16574:9;16570:17;16563:47;16627:131;16753:4;16627:131;:::i;:::-;16619:139;;16346:419;;;:::o;16771:179::-;16911:31;16907:1;16899:6;16895:14;16888:55;16771:179;:::o;16956:366::-;17098:3;17119:67;17183:2;17178:3;17119:67;:::i;:::-;17112:74;;17195:93;17284:3;17195:93;:::i;:::-;17313:2;17308:3;17304:12;17297:19;;16956:366;;;:::o;17328:419::-;17494:4;17532:2;17521:9;17517:18;17509:26;;17581:9;17575:4;17571:20;17567:1;17556:9;17552:17;17545:47;17609:131;17735:4;17609:131;:::i;:::-;17601:139;;17328:419;;;:::o;17753:194::-;17793:4;17813:20;17831:1;17813:20;:::i;:::-;17808:25;;17847:20;17865:1;17847:20;:::i;:::-;17842:25;;17891:1;17888;17884:9;17876:17;;17915:1;17909:4;17906:11;17903:37;;;17920:18;;:::i;:::-;17903:37;17753:194;;;;:::o;17953:224::-;18093:34;18089:1;18081:6;18077:14;18070:58;18162:7;18157:2;18149:6;18145:15;18138:32;17953:224;:::o;18183:366::-;18325:3;18346:67;18410:2;18405:3;18346:67;:::i;:::-;18339:74;;18422:93;18511:3;18422:93;:::i;:::-;18540:2;18535:3;18531:12;18524:19;;18183:366;;;:::o;18555:419::-;18721:4;18759:2;18748:9;18744:18;18736:26;;18808:9;18802:4;18798:20;18794:1;18783:9;18779:17;18772:47;18836:131;18962:4;18836:131;:::i;:::-;18828:139;;18555:419;;;:::o;18980:222::-;19120:34;19116:1;19108:6;19104:14;19097:58;19189:5;19184:2;19176:6;19172:15;19165:30;18980:222;:::o;19208:366::-;19350:3;19371:67;19435:2;19430:3;19371:67;:::i;:::-;19364:74;;19447:93;19536:3;19447:93;:::i;:::-;19565:2;19560:3;19556:12;19549:19;;19208:366;;;:::o;19580:419::-;19746:4;19784:2;19773:9;19769:18;19761:26;;19833:9;19827:4;19823:20;19819:1;19808:9;19804:17;19797:47;19861:131;19987:4;19861:131;:::i;:::-;19853:139;;19580:419;;;:::o;20005:225::-;20145:34;20141:1;20133:6;20129:14;20122:58;20214:8;20209:2;20201:6;20197:15;20190:33;20005:225;:::o;20236:366::-;20378:3;20399:67;20463:2;20458:3;20399:67;:::i;:::-;20392:74;;20475:93;20564:3;20475:93;:::i;:::-;20593:2;20588:3;20584:12;20577:19;;20236:366;;;:::o;20608:419::-;20774:4;20812:2;20801:9;20797:18;20789:26;;20861:9;20855:4;20851:20;20847:1;20836:9;20832:17;20825:47;20889:131;21015:4;20889:131;:::i;:::-;20881:139;;20608:419;;;:::o;21033:222::-;21173:34;21169:1;21161:6;21157:14;21150:58;21242:5;21237:2;21229:6;21225:15;21218:30;21033:222;:::o;21261:366::-;21403:3;21424:67;21488:2;21483:3;21424:67;:::i;:::-;21417:74;;21500:93;21589:3;21500:93;:::i;:::-;21618:2;21613:3;21609:12;21602:19;;21261:366;;;:::o;21633:419::-;21799:4;21837:2;21826:9;21822:18;21814:26;;21886:9;21880:4;21876:20;21872:1;21861:9;21857:17;21850:47;21914:131;22040:4;21914:131;:::i;:::-;21906:139;;21633:419;;;:::o;22058:179::-;22198:31;22194:1;22186:6;22182:14;22175:55;22058:179;:::o;22243:366::-;22385:3;22406:67;22470:2;22465:3;22406:67;:::i;:::-;22399:74;;22482:93;22571:3;22482:93;:::i;:::-;22600:2;22595:3;22591:12;22584:19;;22243:366;;;:::o;22615:419::-;22781:4;22819:2;22808:9;22804:18;22796:26;;22868:9;22862:4;22858:20;22854:1;22843:9;22839:17;22832:47;22896:131;23022:4;22896:131;:::i;:::-;22888:139;;22615:419;;;:::o;23040:174::-;23180:26;23176:1;23168:6;23164:14;23157:50;23040:174;:::o;23220:366::-;23362:3;23383:67;23447:2;23442:3;23383:67;:::i;:::-;23376:74;;23459:93;23548:3;23459:93;:::i;:::-;23577:2;23572:3;23568:12;23561:19;;23220:366;;;:::o;23592:419::-;23758:4;23796:2;23785:9;23781:18;23773:26;;23845:9;23839:4;23835:20;23831:1;23820:9;23816:17;23809:47;23873:131;23999:4;23873:131;:::i;:::-;23865:139;;23592:419;;;:::o;24017:180::-;24065:77;24062:1;24055:88;24162:4;24159:1;24152:15;24186:4;24183:1;24176:15;24203:185;24243:1;24260:20;24278:1;24260:20;:::i;:::-;24255:25;;24294:20;24312:1;24294:20;:::i;:::-;24289:25;;24333:1;24323:35;;24338:18;;:::i;:::-;24323:35;24380:1;24377;24373:9;24368:14;;24203:185;;;;:::o;24394:180::-;24442:77;24439:1;24432:88;24539:4;24536:1;24529:15;24563:4;24560:1;24553:15;24580:180;24628:77;24625:1;24618:88;24725:4;24722:1;24715:15;24749:4;24746:1;24739:15;24766:143;24823:5;24854:6;24848:13;24839:22;;24870:33;24897:5;24870:33;:::i;:::-;24766:143;;;;:::o;24915:351::-;24985:6;25034:2;25022:9;25013:7;25009:23;25005:32;25002:119;;;25040:79;;:::i;:::-;25002:119;25160:1;25185:64;25241:7;25232:6;25221:9;25217:22;25185:64;:::i;:::-;25175:74;;25131:128;24915:351;;;;:::o;25272:85::-;25317:7;25346:5;25335:16;;25272:85;;;:::o;25363:60::-;25391:3;25412:5;25405:12;;25363:60;;;:::o;25429:158::-;25487:9;25520:61;25538:42;25547:32;25573:5;25547:32;:::i;:::-;25538:42;:::i;:::-;25520:61;:::i;:::-;25507:74;;25429:158;;;:::o;25593:147::-;25688:45;25727:5;25688:45;:::i;:::-;25683:3;25676:58;25593:147;;:::o;25746:114::-;25813:6;25847:5;25841:12;25831:22;;25746:114;;;:::o;25866:184::-;25965:11;25999:6;25994:3;25987:19;26039:4;26034:3;26030:14;26015:29;;25866:184;;;;:::o;26056:132::-;26123:4;26146:3;26138:11;;26176:4;26171:3;26167:14;26159:22;;26056:132;;;:::o;26194:108::-;26271:24;26289:5;26271:24;:::i;:::-;26266:3;26259:37;26194:108;;:::o;26308:179::-;26377:10;26398:46;26440:3;26432:6;26398:46;:::i;:::-;26476:4;26471:3;26467:14;26453:28;;26308:179;;;;:::o;26493:113::-;26563:4;26595;26590:3;26586:14;26578:22;;26493:113;;;:::o;26642:732::-;26761:3;26790:54;26838:5;26790:54;:::i;:::-;26860:86;26939:6;26934:3;26860:86;:::i;:::-;26853:93;;26970:56;27020:5;26970:56;:::i;:::-;27049:7;27080:1;27065:284;27090:6;27087:1;27084:13;27065:284;;;27166:6;27160:13;27193:63;27252:3;27237:13;27193:63;:::i;:::-;27186:70;;27279:60;27332:6;27279:60;:::i;:::-;27269:70;;27125:224;27112:1;27109;27105:9;27100:14;;27065:284;;;27069:14;27365:3;27358:10;;26766:608;;;26642:732;;;;:::o;27380:831::-;27643:4;27681:3;27670:9;27666:19;27658:27;;27695:71;27763:1;27752:9;27748:17;27739:6;27695:71;:::i;:::-;27776:80;27852:2;27841:9;27837:18;27828:6;27776:80;:::i;:::-;27903:9;27897:4;27893:20;27888:2;27877:9;27873:18;27866:48;27931:108;28034:4;28025:6;27931:108;:::i;:::-;27923:116;;28049:72;28117:2;28106:9;28102:18;28093:6;28049:72;:::i;:::-;28131:73;28199:3;28188:9;28184:19;28175:6;28131:73;:::i;:::-;27380:831;;;;;;;;:::o

Swarm Source

ipfs://91423a0988f73a048779d80b51cce41c9e4ccddc21c65ffdd8d756d0c8864385
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.