false
true
0

Contract Address Details

0xF2Da3942616880E52e841E5C504B5A9Fba23FFF0

Token
NEXION (NEON)
Creator
0x4718cc–d384f6 at 0x1e8cd9–3f5dcf
Balance
2,047,386.694362929854052665 PLS ( )
Tokens
Fetching tokens...
Transactions
6,132 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25860559
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
NEON




Optimization enabled
true
Compiler version
v0.8.20+commit.a1b79de6




Optimization runs
200
EVM Version
paris




Verified at
2025-01-03T18:34:59.113827Z

Constructor Arguments

0x00000000000000000000000000149ef1a0a41083bc3996d026a7c0f32fc5cb73

Arg [0] (address) : 0x00149ef1a0a41083bc3996d026a7c0f32fc5cb73

              

Contract source code

// Sources flattened with hardhat v2.22.17 https://hardhat.org

// File contracts/NEON.sol

// File: neon/contracts/IPulseX.sol



 pragma solidity ^0.8.20;

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

interface IPulseXRouter {
    function factory() external pure returns (address);
    
    function WPLS() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (
        uint amountA,
        uint amountB,
        uint liquidity
    );
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
  uint amountIn,
  uint amountOutMin,
  address[] calldata path,
  address to,
  uint deadline
) external;
    function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to,uint deadline) external returns (uint amountETH);
    function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
    function getAmountsOut(uint amountIn, address[] memory path) external returns (uint[] memory amounts);
    function getAmountOut(uint256 amount, uint112 reserve0, uint112 reserve1) external returns (uint256 amounts);
}

interface PulseXPair {
    function token0() external pure returns (address);
    function token1() external pure returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}


// File: neon/contracts/SafeMath.sol



pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

// File: forge-std/console.sol


pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _sendLogPayload(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal view {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }

    function logUint(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function logString(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function log(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    }

    function log(uint p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
    }

    function log(uint p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    }

    function log(uint p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
    }

    function log(string memory p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    }

    function log(bool p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
    }

    function log(address p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    }

    function log(uint p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    }

    function log(uint p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    }

    function log(uint p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    }

    function log(uint p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    }

    function log(uint p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    }

    function log(uint p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    }

    function log(uint p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    }

    function log(uint p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    }

    function log(uint p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    }

    function log(uint p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    }

    function log(uint p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    }

    function log(bool p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    }

    function log(bool p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    }

    function log(bool p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    }

    function log(address p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    }

    function log(address p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    }

    function log(address p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


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

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

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

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

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

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

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

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

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

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

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

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

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

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

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

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

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

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

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

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// File: neon/contracts/NEONVault.sol


pragma solidity ^0.8.20;




contract NEONVault {

    uint64 constant DISTRIBUTION_FROM_THE_VAULT = 0.2e18; // 20%
    NEON immutable neon;
    address immutable auction;
    uint256 constant WAD = 1e18;
    error TheVault__OnlyAuction();

    constructor(address _auction, address _neon) {
        auction = _auction;
        neon = NEON(payable(_neon));
    }

    modifier onlyAuction() {
        _onlyAuction();
        _;
    }

    function emitForAuction() external onlyAuction returns (uint256 emitted) {
        uint256 balanceOf = neon.balanceOf(address(this));
        emitted = wmul_0(balanceOf, DISTRIBUTION_FROM_THE_VAULT);
        neon.transfer(msg.sender, emitted);
    }

    /**
     * @notice Burns whole NEON of vault. Burn cause your mom is ugly
     */
    function burnitAll() external onlyAuction {
        uint256  amount= neon.balanceOf(address(this));
        neon.transfer(0x0000000000000000000000000000000000000369, amount);
    }

    /**
     * @notice Yes you heard it.
     */
    function _onlyAuction() internal view {
        if (msg.sender != auction) revert TheVault__OnlyAuction();
    }

      /**
     * @notice Copied from other contract, idk why they simple stuff so hard
     */

    function wmul_0(uint256 x, uint256 y) pure internal returns (uint256 z) {
    assembly ("memory-safe") {
        if mul(y, gt(x, div(not(0), y))) {
            mstore(0x00, 0xc4c5d7f5)
            revert(0x1c, 0x04)
        }
        z := div(mul(x, y), WAD)
    }
}

}
// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/interfaces/IERC1363.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;



/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

// File: neon/contracts/Constants.sol


pragma solidity ^0.8.0;




// import "hardhat/console.sol";

abstract contract Constants {
    
    address internal PULSEX_V2 = 0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02;//v1    
    address internal SWAP_FACTORY = 0x1715a3E4A142d8b698131108995174F37aEBA10D;//v1
    
    address internal PULSEX_V2_V2 = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;//v2
    address internal SWAP_FACTORY_v2 = 0x29eA7545DEf87022BAdc76323F373EA1e707C523;//v2
    address internal DAI = 0xefD766cCb38EaF1dfd701853BFCe31359239F305; 
    address internal DAIPLSLP = 0xE56043671df55dE5CDf8459710433C10324DE0aE;
    address internal PLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27; 

    address internal INC = 0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d; 
    address internal mc = 0xB2Ca4A66d3e57a5a9A12043B6bAD28249fE302d4;
    address internal teamwallet = 0x6406CA5C3813B0825B9424f9bB0C1979DCef68BD;
    address internal HEX = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;
    address internal PLSX = 0x95B303987A60C71504D99Aa1b13B4DA07b0790ab;
    address internal PDAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address internal ATROPA = 0xCc78A0acDF847A2C1714D2A925bB4477df5d48a6;
}

// File: neon/contracts/NEONAuction.sol


pragma solidity ^0.8.20;









library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata
    ) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}



library Time {
    function blockTs() internal view returns (uint32 ts) {
        assembly {
            ts := timestamp()
        }
    }

    function dayCountByT(uint32 t) internal pure returns (uint32 dayCount) {
        assembly {
            let adjustedTime := sub(t, 50400)
            dayCount := div(adjustedTime, 86400)
        }
    }

    function daysSince(uint32 t) public view returns (uint32 daysPassed) {
        assembly {
            let currentTime := timestamp()
            daysPassed := div(sub(currentTime, t), 86400)
        }
    }

    function hoursSince(uint32 t) public view returns (uint32 hoursPassed) {
        assembly {
            let currentTime := timestamp()
            hoursPassed := div(sub(currentTime, t), 3600)
        }
    }
}

abstract contract Errors {
    error Address0();
    error Amount0();
    error Expired();

    modifier notAmount0(uint256 a) {
        _notAmount0(a);
        _;
    }

    modifier notExpired(uint32 _deadline) {
        if (block.timestamp > _deadline) revert Expired();
        _;
    }

    modifier notAddress0(address a) {
        _notAddress0(a);
        _;
    }

    function _notAddress0(address a) internal pure {
        if (a == address(0)) revert Address0();
    }

    function _notAmount0(uint256 a) internal pure {
        if (a == 0) revert Amount0();
    }
}

struct DailyStatistic {
    uint128 neonEmitted;
    uint128 pulseDeposited;
    uint256 entries;
}


contract NEONAuction is Ownable(msg.sender), Errors, Constants {
    using SafeERC20 for ERC20;
    using SafeERC20 for INEON;

    INEON immutable NEON;
    address public bnb;
    uint32 public immutable startTimestamp;
    IStaking public LPStaking;
    address genesis_wallet =
        address(0x6406CA5C3813B0825B9424f9bB0C1979DCef68BD);
    address constant BURN_WALLET =
        address(0x0000000000000000000000000000000000000369);
    address liquidity_wallet =
        address(0xA04f1f7661fDa0C5872A41c77fCcDc335e248b2B);
    address public raffle_wallet;
    address public farm;
    
    uint256 public totalEntries;
    uint64 constant BNB = 0.5e18;
    uint64 constant FARM = 0.25e18;
    uint64 constant LP_NEON = 0.18e18;
    uint64 constant LP_WALLET = 0.03e18;
    uint64 constant GENESIS = 0.03e18;
    uint64 constant RAFFLE_GAME_POT = 0.01e18; // 1%
    uint96 public INITIAL_PLS_FOR_LIQ = 4_000_000 ether;
    uint96 constant INITIAL_NEON_FOR_LIQ = 5_000_000 ether;
    uint256 constant WAD = 1e18;

    bool hasLP;
    IPulseXRouter public pulseXRouter = IPulseXRouter(address(PULSEX_V2_V2));

    NEONVault public theVault;
    mapping(address => mapping(uint32 day => uint256 amount)) public depositOf;
    mapping(uint32 day => DailyStatistic) public dailyStats;
    uint256 public totalPulseDeposited;

    event UserDeposit(
        address indexed user,
        uint256 indexed amount,
        uint32 indexed day,
        uint256 timestamp
    );
    event UserClaimed(
        address indexed user,
        uint256 indexed neonAmount,
        uint32 indexed day,
        uint256 depositAmount,
        uint256 timestamp
    );
    event InitializeLiquiditySuccess();
    event InitializeLiquidityFail();

    constructor(
        uint32 _startTimestamp,
        address _neon,
        address _raffle_wallet
    ) {//21190257
        NEON = INEON(_neon);
        startTimestamp = uint32(1735848375);
        raffle_wallet = _raffle_wallet;
        NEON.approve(address(pulseXRouter), 2 ** 256 - 1);
    }

    receive() external payable {}

    function migrateUser(address _user, uint256 amount) public onlyOwner {
        uint32 daySinceStart = Time.daysSince(startTimestamp) + 1;
        DailyStatistic storage stats = dailyStats[daySinceStart];
        depositOf[_user][daySinceStart] += amount;

        stats.pulseDeposited += uint128(amount);
        totalPulseDeposited += uint128(amount);

        if(depositOf[_user][daySinceStart]==0){
            stats.entries++;
            totalEntries++;
        }
        emit UserDeposit(_user, amount, daySinceStart, block.timestamp);
    }
//000000000000000000
    /**
     * @notice Deposit into Auction
     */
    function deposit() external payable notAmount0(msg.value) {
        _updateAuction();
        uint32 daySinceStart = Time.daysSince(startTimestamp) + 1;
        DailyStatistic storage stats = dailyStats[daySinceStart];
        
        if(depositOf[msg.sender][daySinceStart]==0){
            stats.entries++;
            totalEntries++;
        }
        _distribute(msg.value);

        depositOf[msg.sender][daySinceStart] += msg.value;
        stats.pulseDeposited += uint128(msg.value);
        totalPulseDeposited += uint128(msg.value);

        emit UserDeposit(msg.sender, msg.value, daySinceStart, block.timestamp);
    }

    /**
     * @notice Claims NEON tokens
     * @param _day day to claim for.
     */
    function claim(uint32 _day) public {
        uint32 daySinceStart = Time.daysSince(startTimestamp) + 1;
        if (_day == daySinceStart) revert("Claimable only the next day");

        uint256 toClaim = amountToClaim(msg.sender, _day);
        if (toClaim == 0) return;

        emit UserClaimed(
            msg.sender,
            toClaim,
            _day,
            depositOf[msg.sender][_day],
            block.timestamp
        );

        NEON.safeTransfer(msg.sender, toClaim);

        depositOf[msg.sender][_day] = 0;
    }

    /**
     * @notice Claims NEON tokens for many days
     * @param _days days to claim for.
     */
    function batchClaim(uint32[] calldata _days) external {
        uint256 lengthis=_days.length;
        for (uint256 i; i < lengthis ; ++i) {
            claim(_days[i]);

        }
    }

    /**
     * @notice Shows the total amount a user can claim
     * @param _user that is claiming
     * @param _days days to claim for
     */
    function batchClaimableAmount(
        address _user,
        uint32[] calldata _days
    ) public view returns (uint256 toClaim) {
          uint256 lengthis=_days.length;
        for (uint256 i; i < lengthis; ++i) {
            toClaim += amountToClaim(_user, _days[i]);
        }
    }

  /**
     * @notice Shows the amount a user can claim
     * @param _user that is claiming
     * @param _day day to claim for
     */
    function amountToClaim(
        address _user,
        uint32 _day
    ) public view returns (uint256 toClaim) {
        uint256 depositAmount = depositOf[_user][_day];
        DailyStatistic memory stats = dailyStats[_day];
        if (stats.pulseDeposited == 0) return 0;
        return (depositAmount * stats.neonEmitted) / stats.pulseDeposited;
    }


    function _addLiquidityToNeonPulsePool() internal {
        if (hasLP) revert("Liquidity already added");

        if (payable(address(this)).balance < INITIAL_PLS_FOR_LIQ) {
            revert("Not enough pulse for liquidity");
        }
        NEON.emitForLp();
        try
            pulseXRouter.addLiquidityETH{value: INITIAL_PLS_FOR_LIQ}(
                address(NEON),
                INITIAL_NEON_FOR_LIQ,
                0,
                0,
                address(this),
                block.timestamp + 200
            )
        {
            hasLP = true;
            emit InitializeLiquiditySuccess();
        } catch {
            emit InitializeLiquidityFail();
        }
    }

    function _addLiquidityToNeonPulsePoolWithSwap(uint256 _toNEONLP) internal {
        address[] memory path = new address[](2);

        path[0] = pulseXRouter.WPLS();
        path[1] = address(NEON);

        uint[] memory amounts = pulseXRouter.swapExactETHForTokens{
            value: _toNEONLP / 2
        }(0, path, address(this), block.timestamp + 600);

        pulseXRouter.addLiquidityETH{value: _toNEONLP - _toNEONLP / 2}(
            address(NEON),
            amounts[1],
            0,
            0,
            address(this),
            block.timestamp + 200
        );
    }

    function _distribute(uint256 _amount) internal {
        uint256 pulse = payable(address(this)).balance;
        if (!hasLP) {
            if (pulse <= INITIAL_PLS_FOR_LIQ) {
                return;
            } else {
                _amount = uint192(pulse - INITIAL_PLS_FOR_LIQ);
                _addLiquidityToNeonPulsePool();
            }
        }

        uint256 toBnB = wmul_0(_amount, BNB);
        uint256 toFarm = wmul_0(_amount, FARM);
        uint256 toLP = wmul_0(_amount, LP_NEON);
        uint256 toNEONLP = wmul_0(_amount, LP_WALLET);
        uint256 toGenesis = wmul_0(_amount, GENESIS);
        uint256 toRaffleGame = wmul_0(_amount, RAFFLE_GAME_POT);

        payable(address(bnb)).call{value: toBnB}("");
        payable(address(farm)).call{value: toFarm}("");
        _addLiquidityToNeonPulsePoolWithSwap(toLP);
        payable(address(liquidity_wallet)).call{value: toNEONLP}("");
        payable(address(genesis_wallet)).call{value: toGenesis}("");
        payable(address(raffle_wallet)).call{value: toRaffleGame}("");
    }

    function _updateAuction() internal {
        uint32 daySinceStart = Time.daysSince(startTimestamp) + 1;

        if (dailyStats[daySinceStart].neonEmitted != 0) return;

        if (daySinceStart > 10 && NEON.balanceOf(address(theVault)) == 0)
            revert("Treasury is empty");

        uint256 emitted = daySinceStart <= 10
            ? NEON.emitForAuction()
            : theVault.emitForAuction();

        dailyStats[daySinceStart].neonEmitted = uint128(emitted);
    }


    function wmul_0(uint256 x, uint256 y) internal pure returns (uint256 z) {
        assembly ("memory-safe") {
            // Equivalent to `require(y == 0 || x <= type(uint256).max / y)`.
            if mul(y, gt(x, div(not(0), y))) {
                // Store the function selector of `Math__mul_overflow()`.
                mstore(0x00, 0xc4c5d7f5)

                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            z := div(mul(x, y), WAD)
        }
    }

    function reduce(uint96 _INITIAL_PLS_FOR_LIQ) external onlyOwner {
        INITIAL_PLS_FOR_LIQ = _INITIAL_PLS_FOR_LIQ;
    }

    // owner only functions

    function setTheVault(address _theVault) external onlyOwner {
        theVault = NEONVault(_theVault);
    }

    function setTheRaffle(address _raffle_wallet) external onlyOwner {
        raffle_wallet = _raffle_wallet;
    }

    function setBuyAndBurn(address _bnb) external onlyOwner {
        bnb = _bnb;
    }

    function set_Genesis(address _genesis_wallet) external onlyOwner {
        genesis_wallet = _genesis_wallet;
    }

    function setLProvider(address _liquidity_wallet) external onlyOwner {
        liquidity_wallet = _liquidity_wallet;
    }

    function setFarm(address _farm) external onlyOwner {
        farm = _farm;
    }
    function addLiquidityToNEONPulsePool() external onlyOwner {
        _addLiquidityToNeonPulsePool();
    }

    function burnitAll() public onlyOwner {
        theVault.burnitAll();
    }

    function claimLPRewards(address _pool) public payable onlyOwner {
        uint256 initPLS = address(this).balance;
        uint256 initNEON = NEON.balanceOf(address(this));

        LPStaking.claimReward(_pool);

        uint256 finalPLS = address(this).balance;
        uint256 finalNEON = NEON.balanceOf(address(this));
        
        payable(address(liquidity_wallet)).call{value: finalPLS - initPLS}("");
        NEON.safeTransfer(liquidity_wallet, finalNEON - initNEON);
    }

    function setLPStakingAddress(address newAddress) external onlyOwner {
        LPStaking = IStaking(newAddress);
    }
}

// File: neon/contracts/NEONBuynBurn.sol


pragma solidity ^0.8.20;






interface iFarm {
    function processTransfer() external payable;
}

contract NEONBuynBurn is ReentrancyGuard, Constants, Ownable(msg.sender) {
    address public immutable burnWallet =
        address(0x0000000000000000000000000000000000000369);
    address private NEON;
    address public theVaultAddress;
    IPulseXRouter public pulseXRouter;
    address public farm;
    uint256 public buyAndBurnInterval;
    uint256 public capPerSwap;

    uint256 public _lastBuyAndBurnCallTime;
    address public _owner;

    uint256 public _totalCollectedFunds;
    uint256 public _collectedFunds;

    event BoughtAndBurntSuccess(uint256 amount);
    event BoughtAndBurntFailed(uint256 amount);

    event PLSReceived(address sender, uint256 amount);

    modifier onlyAfterInterval() {
        require(
            block.timestamp >= _lastBuyAndBurnCallTime + buyAndBurnInterval,
            "Buy and burn can only be performed after the minimum interval"
        );
        _;
    }

    constructor(address theVault, address _NEON) {
        pulseXRouter = IPulseXRouter(address(PULSEX_V2_V2));
        NEON = _NEON;
        theVaultAddress = theVault;
        buyAndBurnInterval = 60 minutes;
        capPerSwap = 600_000 ether;
    }

    receive() external payable {
        _collectedFunds += msg.value;
        _totalCollectedFunds += msg.value;
        emit PLSReceived(msg.sender, msg.value);
    }

    fallback() external payable {
        _collectedFunds += msg.value;
        _totalCollectedFunds += msg.value;
        emit PLSReceived(msg.sender, msg.value);
    }

    function setNEON(address contractAddress) external onlyOwner {
        require(contractAddress != address(0), "cannot be a zero address");
        NEON = contractAddress;
    }

    function setVaultAddress(address contractAddress) external onlyOwner {
        require(contractAddress != address(0), "cannot be a zero address");
        theVaultAddress = contractAddress;
    }

    function setRouter(address routerAddress) external onlyOwner {
        require(routerAddress != address(0), "cannot be a zero address");
        pulseXRouter = IPulseXRouter(address(routerAddress));
    }

    function buyAndBurn() public nonReentrant onlyAfterInterval {
        require(address(this).balance >= capPerSwap, "Insufficient PLS ");

        swapPLSForNEON();
        _lastBuyAndBurnCallTime = block.timestamp;
        iFarm(farm).processTransfer();
    }

    function swapPLSForNEON() private {
        IERC20 neon = IERC20(address(NEON));

        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(NEON);

        try
            pulseXRouter.swapExactETHForTokens{value: (capPerSwap * 90) / 100}(
                0,
                path,
                address(this),
                block.timestamp + 600
            )
        returns (uint256[] memory amounts) {
            uint256 out = amounts[1];
            uint256 toVaultNBurn = (out * 0.5e18) / 1e18;
            neon.transfer(theVaultAddress, toVaultNBurn);
            neon.transfer(burnWallet, toVaultNBurn);
            (bool success, ) = payable(address(farm)).call{
                value: capPerSwap - (capPerSwap * 90) / 100
            }("");
            require(success, "bb failed");

            emit BoughtAndBurntSuccess(toVaultNBurn);
        } catch {
            emit BoughtAndBurntFailed(capPerSwap);
        }
    }

    function setFarm(address _farm) external onlyOwner {
        farm = _farm;
    }

    function setCapPerSwap(uint256 cap) public onlyOwner {
        require(
            cap >= 100_000 ether && cap <= 1_000_000_000 ether,
            "Cap wrong"
        );
        capPerSwap = cap;
    }

    function setInterval(uint256 interval) public onlyOwner {
        require(
            interval >= 1 minutes && interval <= 5 hours,
            "Interval not between 1m and 5h"
        );
        buyAndBurnInterval = interval;
    }
}

// File: neon/contracts/NEON.sol


pragma solidity ^0.8.20;











interface IStaking {
    function updatePool(uint256 amount) external;
  function claimReward(address pool) external ;
    function updatePoolNEON(uint256 amount) external;

    function stake(address LPPool, uint256 amount, address staker) external;

    function process(uint256 gas) external;
}

interface INEON is IERC20 {
    function auction() external view returns (NEONAuction);

    function pool() external view returns (address);

    function theVault() external view returns (NEONVault);

    function burn(uint256 amount) external;

    function emitForAuction() external returns (uint256 emitted);

    function emitForLp() external returns (uint256 emitted);
}

contract NEON is ERC20, Ownable, ReentrancyGuard, Constants {
    using SafeMath for uint256;

    address public constant DEAD_WALLET =
        address(0x0000000000000000000000000000000000000369);
    uint96 constant AUCTION_EMIT = 90_000_000 ether;
    uint96 constant INITIAL_NEON_FOR_LIQ = 5_000_000 ether;
    IPulseXRouter public pulseXRouter = IPulseXRouter(address(PULSEX_V2_V2));
    NEONAuction public auction;
    NEONVault public theVault;
    error TheVault__OnlyAuction();

    address payable public buyAndBurnAddress;
    address public NEONPLSPair;
    uint256 public burnFee = 200;
    uint256 public LPProviderFeePLS = 200;
    uint256 public LPProviderFeeNEON = 200;
    uint256 public swapThreshold;
    uint256 public processGas;
    IStaking public LPStaking;
    address[] public pairs;

    bool private swapping;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isLiquidityPair;

    modifier onlyAuction() {
        _onlyAuction();
        _;
    }

    event SwapAndDistributeFees(uint256 tokensSwapped, uint256 plsReceived);
    event SwapThresholdUpdated(uint256 amount);
    event AccountExcludeFromFee(address account, bool status);
    event LPStakingAddressAdded(address newAddress);
    event ProcessGasUpdated(uint256 newGas);
    constructor(address _staking) ERC20("NEXION", "NEON") Ownable(msg.sender) { 

    
        _mint(msg.sender, 25_000_000 ether); // 10m marketing, 15m team
        _mint(_staking, 35_000_000 ether); // 35m to Staking

        NEONPLSPair = IPulseXFactory(pulseXRouter.factory()).createPair(
            address(this),
            pulseXRouter.WPLS()
        );
        pairs.push(NEONPLSPair);
        pairs.push(
            IPulseXFactory(pulseXRouter.factory()).createPair(
                address(this),
                (Constants.HEX)
            )
        );
        pairs.push(
            IPulseXFactory(pulseXRouter.factory()).createPair(
                address(this),
                (Constants.PLSX)
            )
        );
        pairs.push(
            IPulseXFactory(pulseXRouter.factory()).createPair(
                address(this),
                (Constants.INC)
            )
        );
        pairs.push(
            IPulseXFactory(pulseXRouter.factory()).createPair(
                address(this),
                (Constants.PDAI)
            )
        );
        pairs.push(
            IPulseXFactory(pulseXRouter.factory()).createPair(
                address(this),
                (Constants.ATROPA)
            )
        );

        for (uint256 i; i < pairs.length; i++) {
            isLiquidityPair[pairs[i]] = true;
        }

        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[_staking] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[buyAndBurnAddress] = true;

        swapThreshold = 1_000_000 ether;
        processGas = 250000;
    }

    function getpairsLength() public view returns (uint256) {
        return pairs.length;
    }

    function _onlyAuction() internal view {
        if (msg.sender != address(auction)) revert TheVault__OnlyAuction();
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

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

        if (
            canSwap &&
            !swapping &&
            sender != address(this) &&
            isLiquidityPair[recipient]
        ) {
            swapping = true;
            swapAndDistributeFees(swapThreshold);
            swapping = false;
        }

        bool takeFee = !isExcludedFromFee[sender] &&
            !isExcludedFromFee[recipient];

        if (takeFee) {
            console.log("takeFee", amount, sender, recipient);
            uint256 burnAmount = amount.mul(burnFee).div(10000);
            uint256 lpProviderAmountPLS = amount.mul(LPProviderFeePLS).div(
                10000
            );
            uint256 lpProviderAmountNEON = amount.mul(LPProviderFeeNEON).div(
                10000
            );

            super._transfer(sender, DEAD_WALLET, burnAmount );
            super._transfer(sender, address(this), lpProviderAmountPLS);
            super._transfer(sender, address(LPStaking), lpProviderAmountNEON);
            LPStaking.updatePoolNEON(lpProviderAmountNEON);

            amount = amount.sub(burnAmount).sub(lpProviderAmountPLS).sub(
                lpProviderAmountNEON
            );
        }

        super._transfer(sender, recipient, amount);

        try LPStaking.process(processGas) {} catch {}
    }

    function swapAndDistributeFees(uint256 tokenAmount) private {
        uint256 initialBalance = address(this).balance;

        swapTokensForPLS(tokenAmount);

        uint256 plsReceived = address(this).balance.sub(initialBalance);

        (bool success, ) = address(LPStaking).call{value: plsReceived}("");
        require(success, "Failed to send PLS to staking address");
        LPStaking.updatePool(plsReceived);

        emit SwapAndDistributeFees(tokenAmount, plsReceived);
    }

    function swapTokensForPLS(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pulseXRouter.WPLS();

        _approve(address(this), address(pulseXRouter), tokenAmount);

        pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidityETH(uint256 _amount) external payable {

        _transfer(msg.sender, address(this), _amount);
        _approve(address(this), address(pulseXRouter), _amount);

        (, , uint256 liquidity) = pulseXRouter.addLiquidityETH{value: msg.value}(address(this), _amount, 0, 0, msg.sender, block.timestamp);
        LPStaking.stake(address(NEONPLSPair), liquidity, msg.sender);
    }

    function addLiquidity(
        address pair,
        uint256 token0Amount,
        uint256 token1Amount
    ) external {
        require(isLiquidityPair[pair], "Liquidity pair is not correct");

        address token0 = PulseXPair(pair).token0();
        address token1 = PulseXPair(pair).token1();

        uint256 token0Balance = IERC20(token0).balanceOf(address(this));
        uint256 token1Balance = IERC20(token1).balanceOf(address(this));

        IERC20(token0).transferFrom(msg.sender, address(this), token0Amount);
        IERC20(token1).transferFrom(msg.sender, address(this), token1Amount);

        uint256 token0NewBalance = IERC20(token0).balanceOf(address(this)) -
            token0Balance;
        uint256 token1NewBalance = IERC20(token1).balanceOf(address(this)) -
            token1Balance;

        IERC20(token0).approve(address(pulseXRouter), token0NewBalance);
        IERC20(token1).approve(address(pulseXRouter), token1NewBalance);

        (, , uint256 liquidity) = pulseXRouter.addLiquidity(
            token0,
            token1,
            token0NewBalance,
            token1NewBalance,
            0,
            0,
            msg.sender,
            block.timestamp
        );

        LPStaking.stake(pair, liquidity, msg.sender);
    }

    function removeLiquidity(address pair, uint256 liquidity) external {
        require(isLiquidityPair[pair], "Liquidity pair is not correct");

        address token0 = PulseXPair(pair).token0();
        address token1 = PulseXPair(pair).token1();

        IERC20(pair).transferFrom(msg.sender, address(this), liquidity);
        IERC20(pair).approve(address(pulseXRouter), liquidity);

        bool wasExcluded = isExcludedFromFee[msg.sender];
        if (!wasExcluded) {
            isExcludedFromFee[msg.sender] = true;
        }

        pulseXRouter.removeLiquidity(
            token0,
            token1,
            liquidity,
            0,
            0,
            msg.sender,
            block.timestamp
        );

        if (!wasExcluded) {
            isExcludedFromFee[msg.sender] = false;
        }
    }

    function removeLiquidityETH(address pair, uint256 liquidity) external {
        require(isLiquidityPair[pair], "Liquidity pair is not correct");

        IERC20(pair).transferFrom(msg.sender, address(this), liquidity);
        IERC20(pair).approve(address(pulseXRouter), liquidity);

        bool wasExcluded = isExcludedFromFee[msg.sender];
        if (!wasExcluded) {
            isExcludedFromFee[msg.sender] = true;
        }

        pulseXRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            liquidity,
            0,
            0,
            msg.sender,
            block.timestamp
        );

        if (!wasExcluded) {
            isExcludedFromFee[msg.sender] = false;
        }
    }

    function setSwapThreshold(uint256 amount) external onlyOwner {
        require(amount > 0, "Threshold must be greater than 0");
        swapThreshold = amount;
        emit SwapThresholdUpdated(amount);
    }

    function setProcessGas(uint256 gas) external onlyOwner {
        processGas = gas;
        emit ProcessGasUpdated(gas);
    }

    function setFees(
        uint256 _burnFee,
        uint256 _LPProviderFeePLS,
        uint256 _LPProviderFeeNEON
    ) external onlyOwner {
        require(
            _burnFee.add(_LPProviderFeePLS).add(_LPProviderFeeNEON) <= 1000,
            "Total fee cannot exceed 10%"
        );
        burnFee = _burnFee;
        LPProviderFeePLS = _LPProviderFeePLS;
        LPProviderFeeNEON = _LPProviderFeeNEON;
    }

    function setExcludedFromFee(
        address account,
        bool excluded
    ) external onlyOwner {
        isExcludedFromFee[account] = excluded;
        emit AccountExcludeFromFee(account, excluded);
    }

    function setBuyAndBurn(address payable newAddress) external onlyOwner {
        isExcludedFromFee[newAddress] = true;
        buyAndBurnAddress = newAddress;
    }

    function setLPStakingAddress(address newAddress) external onlyOwner {
        LPStaking = IStaking(newAddress);
        isExcludedFromFee[address(LPStaking)] = true;
        emit LPStakingAddressAdded(newAddress);
    }

    function getPrice(address token) public view returns (uint256) {
        address pairAddress = NEONPLSPair;
        PulseXPair pair = PulseXPair(pairAddress);
        (uint112 reserve0, uint112 reserve1, ) = pair.getReserves();
        if (reserve0 == 0) return 0;

        address token0 = pair.token0();

        uint256 tokenReserve;
        uint256 wplsReserve;

        if (token == token0) {
            tokenReserve = uint256(reserve0);
            wplsReserve = uint256(reserve1);
        } else {
            tokenReserve = uint256(reserve1);
            wplsReserve = uint256(reserve0);
        }

        return wplsReserve.mul(1 ether).div(tokenReserve);
    }

    receive() external payable {}

    fallback() external payable {}

    function setNEONAuction(address _NEONAuction) external onlyOwner {
        auction = NEONAuction(payable(_NEONAuction));
        theVault = auction.theVault();
    }

    function emitForAuction() external onlyAuction returns (uint256 emitted) {
        emitted = AUCTION_EMIT;
        _mint(address(auction), emitted);
    }

    function emitForLp() external onlyAuction returns (uint256 emitted) {
        emitted = INITIAL_NEON_FOR_LIQ;
        _mint(address(auction), emitted);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_staking","internalType":"address"}]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]},{"type":"error","name":"TheVault__OnlyAuction","inputs":[]},{"type":"event","name":"AccountExcludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LPStakingAddressAdded","inputs":[{"type":"address","name":"newAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ProcessGasUpdated","inputs":[{"type":"uint256","name":"newGas","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndDistributeFees","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsReceived","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapThresholdUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD_WALLET","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"LPProviderFeeNEON","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"LPProviderFeePLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"LPStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"NEONPLSPair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addLiquidity","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"token0Amount","internalType":"uint256"},{"type":"uint256","name":"token1Amount","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"addLiquidityETH","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract NEONAuction"}],"name":"auction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"buyAndBurnAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"emitted","internalType":"uint256"}],"name":"emitForAuction","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"emitted","internalType":"uint256"}],"name":"emitForLp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPrice","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getpairsLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLiquidityPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pairs","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"processGas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLiquidity","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLiquidityETH","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyAndBurn","inputs":[{"type":"address","name":"newAddress","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"excluded","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_burnFee","internalType":"uint256"},{"type":"uint256","name":"_LPProviderFeePLS","internalType":"uint256"},{"type":"uint256","name":"_LPProviderFeeNEON","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLPStakingAddress","inputs":[{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNEONAuction","inputs":[{"type":"address","name":"_NEONAuction","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setProcessGas","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapThreshold","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract NEONVault"}],"name":"theVault","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6080604052600780546001600160a01b03199081167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0217909155600880548216731715a3e4a142d8b698131108995174f37aeba10d17905560098054821673165c3410fc91ef562c50559f7d2289febed552d9908117909155600a805483167329ea7545def87022badc76323f373ea1e707c523179055600b8054831673efd766ccb38eaf1dfd701853bfce31359239f305179055600c8054831673e56043671df55de5cdf8459710433c10324de0ae179055600d8054831673a1077a294dde1b09bb078844df40758a5d0f9a27179055600e80548316732fa878ab3f87cc1c9737fc071108f904c0b0c95d179055600f8054831673b2ca4a66d3e57a5a9a12043b6bad28249fe302d4179055601080548316736406ca5c3813b0825b9424f9bb0c1979dcef68bd179055601180548316732b591e99afe9f32eaa6214f7b7629768c40eeb391790556012805483167395b303987a60c71504d99aa1b13b4da07b0790ab179055601380548316736b175474e89094c44da98b954eedeac495271d0f17905560148054831673cc78a0acdf847a2c1714d2a925bb4477df5d48a61790556015805490921617905560c8601a819055601b819055601c55348015620001dc57600080fd5b506040516200381e3803806200381e833981016040819052620001ff9162000c92565b33604051806040016040528060068152602001652722ac24a7a760d11b815250604051806040016040528060048152602001632722a7a760e11b81525081600390816200024d919062000d69565b5060046200025c828262000d69565b5050506001600160a01b0381166200028f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200029a8162000acf565b506001600655620002b7336a14adf4b7320334b900000062000b21565b620002ce816a1cf389cd46047d0300000062000b21565b601560009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000348919062000c92565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d1919062000c92565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200041f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000445919062000c92565b601980546001600160a01b039283166001600160a01b031991821681179092556020805460018101825560008290527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb01805490921690921790556015546040805163c45a015560e01b815290519293919091169163c45a01559160048082019286929091908290030181865afa158015620004e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200050b919062000c92565b6011546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156200055d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000583919062000c92565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556015546040805163c45a015560e01b81529051919092169163c45a015591600480830192869291908290030181865afa158015620005f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000619919062000c92565b6012546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156200066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000691919062000c92565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556015546040805163c45a015560e01b81529051919092169163c45a015591600480830192869291908290030181865afa15801562000701573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000727919062000c92565b600e546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000779573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200079f919062000c92565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556015546040805163c45a015560e01b81529051919092169163c45a015591600480830192869291908290030181865afa1580156200080f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000835919062000c92565b6013546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008ad919062000c92565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556015546040805163c45a015560e01b81529051919092169163c45a015591600480830192869291908290030181865afa1580156200091d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000943919062000c92565b6014546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000995573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009bb919062000c92565b81546001810183556000928352602083200180546001600160a01b0319166001600160a01b03929092169190911790555b60205481101562000a5c576001602360006020848154811062000a135762000a1362000e35565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790558062000a538162000e61565b915050620009ec565b50336000908152602260205260408082208054600160ff1991821681179092556001600160a01b0394851684528284208054821683179055308452828420805482168317905560185490941683529120805490921617905569d3c21bcecceda1000000601d556203d090601e5562000e99565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821662000b4d5760405163ec442f0560e01b81526000600482015260240162000286565b62000b5b6000838362000b5f565b5050565b6001600160a01b03831662000b8e57806002600082825462000b82919062000e7d565b9091555062000c029050565b6001600160a01b0383166000908152602081905260409020548181101562000be35760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000286565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821662000c205760028054829003905562000c3f565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c8591815260200190565b60405180910390a3505050565b60006020828403121562000ca557600080fd5b81516001600160a01b038116811462000cbd57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000cef57607f821691505b60208210810362000d1057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d6457600081815260208120601f850160051c8101602086101562000d3f5750805b601f850160051c820191505b8181101562000d605782815560010162000d4b565b5050505b505050565b81516001600160401b0381111562000d855762000d8562000cc4565b62000d9d8162000d96845462000cda565b8462000d16565b602080601f83116001811462000dd5576000841562000dbc5750858301515b600019600386901b1c1916600185901b17855562000d60565b600085815260208120601f198616915b8281101562000e065788860151825594840194600190910190840162000de5565b508582101562000e255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000e765762000e7662000e4b565b5060010190565b8082018082111562000e935762000e9362000e4b565b92915050565b6129758062000ea96000396000f3fe60806040526004361061023d5760003560e01c8063715018a61161012d578063a3f0c0de116100b0578063cec10c1111610077578063cec10c11146106ca578063d06d04cc146106ea578063dd62ed3e146106fd578063e087b86414610743578063f2fde38b14610758578063fce589d81461077857005b8063a3f0c0de1461062a578063a4731cdc1461064a578063a9059cbb1461066a578063aec9b6f41461068a578063b91ac788146106aa57005b80638da5cb5b116100f45780638da5cb5b146105a157806395d89b41146105bf5780639d0014b1146105d4578063a01c3483146105f4578063a201ccf61461060a57005b8063715018a61461051657806372583bc71461052b57806377e4fb6b1461054b5780637d9f6db51461056157806387d5979a1461058157005b806336d4d031116101c057806355776b771161018757806355776b771461043a5780635c9a05b81461045a5780636612e66f1461048a57806366c23442146104aa578063689d91d7146104ca57806370a08231146104e057005b806336d4d0311461037d5780633ef3b9ca1461039d578063412ac4a0146103b257806341976e09146103ea5780635342acb41461040a57005b8063129bd67a11610204578063129bd67a146102f757806318160ddd146103175780631faa362c1461032c57806323b872dd14610341578063313ce5671461036157005b80630445b6671461024657806306fdde031461026f578063095ea7b3146102915780630e7f6d54146102c1578063110df09f146102e157005b3661024457005b005b34801561025257600080fd5b5061025c601d5481565b6040519081526020015b60405180910390f35b34801561027b57600080fd5b5061028461078e565b6040516102669190612488565b34801561029d57600080fd5b506102b16102ac3660046124b0565b610820565b6040519015158152602001610266565b3480156102cd57600080fd5b506102446102dc3660046124dc565b61083a565b3480156102ed57600080fd5b5061025c601b5481565b34801561030357600080fd5b506102446103123660046124b0565b610879565b34801561032357600080fd5b5060025461025c565b34801561033857600080fd5b5061025c610a7a565b34801561034d57600080fd5b506102b161035c3660046124f9565b610aab565b34801561036d57600080fd5b5060405160128152602001610266565b34801561038957600080fd5b506102446103983660046124dc565b610acf565b3480156103a957600080fd5b5060205461025c565b3480156103be57600080fd5b506018546103d2906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b3480156103f657600080fd5b5061025c6104053660046124dc565b610b46565b34801561041657600080fd5b506102b16104253660046124dc565b60226020526000908152604090205460ff1681565b34801561044657600080fd5b5061024461045536600461253a565b610caf565b34801561046657600080fd5b506102b16104753660046124dc565b60236020526000908152604090205460ff1681565b34801561049657600080fd5b506102446104a536600461257d565b611278565b3480156104b657600080fd5b506102446104c53660046124dc565b6112e3565b3480156104d657600080fd5b5061025c601c5481565b3480156104ec57600080fd5b5061025c6104fb3660046124dc565b6001600160a01b031660009081526020819052604090205490565b34801561052257600080fd5b5061024461138b565b34801561053757600080fd5b506019546103d2906001600160a01b031681565b34801561055757600080fd5b5061025c601e5481565b34801561056d57600080fd5b506016546103d2906001600160a01b031681565b34801561058d57600080fd5b506017546103d2906001600160a01b031681565b3480156105ad57600080fd5b506005546001600160a01b03166103d2565b3480156105cb57600080fd5b5061028461139f565b3480156105e057600080fd5b506102446105ef3660046125b6565b6113ae565b34801561060057600080fd5b506103d261036981565b34801561061657600080fd5b506102446106253660046124b0565b61143b565b34801561063657600080fd5b506102446106453660046125b6565b61171d565b34801561065657600080fd5b50601f546103d2906001600160a01b031681565b34801561067657600080fd5b506102b16106853660046124b0565b61175a565b34801561069657600080fd5b506015546103d2906001600160a01b031681565b3480156106b657600080fd5b506103d26106c53660046125b6565b611768565b3480156106d657600080fd5b506102446106e53660046125cf565b611792565b6102446106f83660046125b6565b61180d565b34801561070957600080fd5b5061025c6107183660046125fb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561074f57600080fd5b5061025c611927565b34801561076457600080fd5b506102446107733660046124dc565b611955565b34801561078457600080fd5b5061025c601a5481565b60606003805461079d90612629565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990612629565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b60003361082e818585611993565b60019150505b92915050565b6108426119a0565b6001600160a01b03166000818152602260205260409020805460ff19166001179055601880546001600160a01b0319169091179055565b6001600160a01b03821660009081526023602052604090205460ff166108ba5760405162461bcd60e51b81526004016108b190612663565b60405180910390fd5b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906108ea9033903090869060040161269a565b6020604051808303816000875af1158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d91906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a591906126be565b503360009081526022602052604090205460ff16806109d957336000908152602260205260409020805460ff191660011790555b60155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610a1490309086906000908190339042906004016126db565b6020604051808303816000875af1158015610a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a579190612716565b5080610a7557336000908152602260205260409020805460ff191690555b505050565b6000610a846119cd565b506016546a0422ca8b0a00a42500000090610aa8906001600160a01b0316826119f8565b90565b600033610ab9858285611a32565b610ac4858585611ab0565b506001949350505050565b610ad76119a0565b601f80546001600160a01b0319166001600160a01b038316908117909155600081815260226020908152604091829020805460ff1916600117905590519182527f749d41f0ee5297c1358d920a96cca563eb514cac372accb8d8e4cf8e642a077891015b60405180910390a150565b60195460408051630240bc6b60e21b815290516000926001600160a01b0316918291849182918491630902f1ac9160048083019260609291908290030181865afa158015610b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbc919061274b565b5091509150816001600160701b0316600003610bde5750600095945050505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c42919061279b565b9050600080826001600160a01b0316896001600160a01b031603610c755750506001600160701b03808416908316610c86565b50506001600160701b038083169084165b610ca282610c9c83670de0b6b3a7640000611e63565b90611e76565b9998505050505050505050565b6001600160a01b03831660009081526023602052604090205460ff16610ce75760405162461bcd60e51b81526004016108b190612663565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b919061279b565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db1919061279b565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190612716565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d9190612716565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd90610ec090339030908b9060040161269a565b6020604051808303816000875af1158015610edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0391906126be565b506040516323b872dd60e01b81526001600160a01b038416906323b872dd90610f3490339030908a9060040161269a565b6020604051808303816000875af1158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7791906126be565b506040516370a0823160e01b815230600482015260009083906001600160a01b038716906370a0823190602401602060405180830381865afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190612716565b610fef91906127ce565b6040516370a0823160e01b815230600482015290915060009083906001600160a01b038716906370a0823190602401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190612716565b61106991906127ce565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291925087169063095ea7b3906044016020604051808303816000875af11580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529086169063095ea7b3906044016020604051808303816000875af1158015611136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115a91906126be565b5060155460405162e8e33760e81b81526001600160a01b0388811660048301528781166024830152604482018590526064820184905260006084830181905260a483018190523360c48401524260e484015292169063e8e3370090610104016060604051808303816000875af11580156111d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fc91906127e1565b601f5460405163294091cd60e01b81526001600160a01b038f81166004830152602482018490523360448301529295509116925063294091cd9150606401600060405180830381600087803b15801561125457600080fd5b505af1158015611268573d6000803e3d6000fd5b5050505050505050505050505050565b6112806119a0565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b910160405180910390a15050565b6112eb6119a0565b601680546001600160a01b0319166001600160a01b038316908117909155604080516343eacbcd60e11b815290516387d5979a916004808201926020929091908290030181865afa158015611344573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611368919061279b565b601780546001600160a01b0319166001600160a01b039290921691909117905550565b6113936119a0565b61139d6000611e82565b565b60606004805461079d90612629565b6113b66119a0565b600081116114065760405162461bcd60e51b815260206004820181905260248201527f5468726573686f6c64206d7573742062652067726561746572207468616e203060448201526064016108b1565b601d8190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647690602001610b3b565b6001600160a01b03821660009081526023602052604090205460ff166114735760405162461bcd60e51b81526004016108b190612663565b6000826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d7919061279b565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153d919061279b565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906115709033903090889060040161269a565b6020604051808303816000875af115801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b3906044016020604051808303816000875af1158015611607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162b91906126be565b503360009081526022602052604090205460ff168061165f57336000908152602260205260409020805460ff191660011790555b601554604051635d5155ef60e11b81526001600160a01b03858116600483015284811660248301526044820187905260006064830181905260848301523360a48301524260c48301529091169063baa2abde9060e40160408051808303816000875af11580156116d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f7919061280f565b50508061171657336000908152602260205260409020805460ff191690555b5050505050565b6117256119a0565b601e8190556040518181527f98fdd0b3c9bfe51a45c9afea7b77ebe06c52550d2783a24ef9c7415bbfcd023d90602001610b3b565b60003361082e818585611ab0565b6020818154811061177857600080fd5b6000918252602090912001546001600160a01b0316905081565b61179a6119a0565b6103e86117b1826117ab8686611ed4565b90611ed4565b11156117ff5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c206665652063616e6e6f742065786365656420313025000000000060448201526064016108b1565b601a92909255601b55601c55565b611818333083611ab0565b6015546118309030906001600160a01b031683611993565b60155460405163f305d71960e01b81526000916001600160a01b03169063f305d71990349061186d903090879087908190339042906004016126db565b60606040518083038185885af115801561188b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118b091906127e1565b601f5460195460405163294091cd60e01b81526001600160a01b0391821660048201526024810184905233604482015292955016925063294091cd91506064015b600060405180830381600087803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b505050505050565b60006119316119cd565b506016546a4a723dc6b40b8a9a00000090610aa8906001600160a01b0316826119f8565b61195d6119a0565b6001600160a01b03811661198757604051631e4fbdf760e01b8152600060048201526024016108b1565b61199081611e82565b50565b610a758383836001611ee0565b6005546001600160a01b0316331461139d5760405163118cdaa760e01b81523360048201526024016108b1565b6016546001600160a01b0316331461139d576040516355e9b77b60e01b815260040160405180910390fd5b6001600160a01b038216611a225760405163ec442f0560e01b8152600060048201526024016108b1565b611a2e60008383611fb5565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611aaa5781811015611a9b57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108b1565b611aaa84848484036000611ee0565b50505050565b6001600160a01b038316611b145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108b1565b6001600160a01b038216611b765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108b1565b60008111611bd85760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108b1565b30600090815260208190526040902054601d5481108015908190611bff575060215460ff16155b8015611c1457506001600160a01b0385163014155b8015611c3857506001600160a01b03841660009081526023602052604090205460ff165b15611c61576021805460ff19166001179055601d54611c56906120df565b6021805460ff191690555b6001600160a01b03851660009081526022602052604081205460ff16158015611ca357506001600160a01b03851660009081526022602052604090205460ff16155b90508015611de857611cd66040518060400160405280600781526020016674616b6546656560c81b815250858888612249565b6000611cf3612710610c9c601a5488611e6390919063ffffffff16565b90506000611d12612710610c9c601b5489611e6390919063ffffffff16565b90506000611d31612710610c9c601c548a611e6390919063ffffffff16565b9050611d408961036985612292565b611d4b893084612292565b601f54611d63908a906001600160a01b031683612292565b601f5460405163afaa1faf60e01b8152600481018390526001600160a01b039091169063afaa1faf90602401600060405180830381600087803b158015611da957600080fd5b505af1158015611dbd573d6000803e3d6000fd5b50505050611de281611ddc84611ddc878c6122f190919063ffffffff16565b906122f1565b96505050505b611df3868686612292565b601f54601e546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611e2b9160040190815260200190565b600060405180830381600087803b158015611e4557600080fd5b505af1925050508015611e56575060015b1561191f57505050505050565b6000611e6f8284612833565b9392505050565b6000611e6f828461284a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611e6f828461286c565b6001600160a01b038416611f0a5760405163e602df0560e01b8152600060048201526024016108b1565b6001600160a01b038316611f3457604051634a1406b160e11b8152600060048201526024016108b1565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611aaa57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611fa791815260200190565b60405180910390a350505050565b6001600160a01b038316611fe0578060026000828254611fd5919061286c565b909155506120529050565b6001600160a01b038316600090815260208190526040902054818110156120335760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108b1565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661206e5760028054829003905561208d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120d291815260200190565b60405180910390a3505050565b476120e9826122fd565b60006120f547836122f1565b601f546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612147576040519150601f19603f3d011682016040523d82523d6000602084013e61214c565b606091505b50509050806121ab5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f2073656e6420504c5320746f207374616b696e67206164604482015264647265737360d81b60648201526084016108b1565b601f546040516328f582d360e11b8152600481018490526001600160a01b03909116906351eb05a690602401600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b505060408051878152602081018690527f86002d5678c47eb0087a60fbe86c0041568d30ac5942e2677143b6dcf22c10fa935001905060405180910390a150505050565b611aaa84848484604051602401612263949392919061287f565b60408051601f198184030181529190526020810180516001600160e01b031663eac8928160e01b179052612421565b6001600160a01b0383166122bc57604051634b637e8f60e11b8152600060048201526024016108b1565b6001600160a01b0382166122e65760405163ec442f0560e01b8152600060048201526024016108b1565b610a75838383611fb5565b6000611e6f82846127ce565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612332576123326128b8565b6001600160a01b039283166020918202929092018101919091526015546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af919061279b565b816001815181106123c2576123c26128b8565b6001600160a01b0392831660209182029290920101526015546123e89130911684611993565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac947906118f19085906000908690309042906004016128ce565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000815180845260005b818110156124685760208185018101518683018201520161244c565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611e6f6020830184612442565b6001600160a01b038116811461199057600080fd5b600080604083850312156124c357600080fd5b82356124ce8161249b565b946020939093013593505050565b6000602082840312156124ee57600080fd5b8135611e6f8161249b565b60008060006060848603121561250e57600080fd5b83356125198161249b565b925060208401356125298161249b565b929592945050506040919091013590565b60008060006060848603121561254f57600080fd5b833561255a8161249b565b95602085013595506040909401359392505050565b801515811461199057600080fd5b6000806040838503121561259057600080fd5b823561259b8161249b565b915060208301356125ab8161256f565b809150509250929050565b6000602082840312156125c857600080fd5b5035919050565b6000806000606084860312156125e457600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561260e57600080fd5b82356126198161249b565b915060208301356125ab8161249b565b600181811c9082168061263d57607f821691505b60208210810361265d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601d908201527f4c69717569646974792070616972206973206e6f7420636f7272656374000000604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602082840312156126d057600080fd5b8151611e6f8161256f565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60006020828403121561272857600080fd5b5051919050565b80516001600160701b038116811461274657600080fd5b919050565b60008060006060848603121561276057600080fd5b6127698461272f565b92506127776020850161272f565b9150604084015163ffffffff8116811461279057600080fd5b809150509250925092565b6000602082840312156127ad57600080fd5b8151611e6f8161249b565b634e487b7160e01b600052601160045260246000fd5b81810381811115610834576108346127b8565b6000806000606084860312156127f657600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561282257600080fd5b505080516020909101519092909150565b8082028115828204841417610834576108346127b8565b60008261286757634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610834576108346127b8565b6080815260006128926080830187612442565b6020830195909552506001600160a01b0392831660408201529116606090910152919050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561291e5784516001600160a01b0316835293830193918301916001016128f9565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d14a62cd4c1d8d3cc039202aa96e49df0489cb2a159d980ddef3007b31a692b264736f6c6343000814003300000000000000000000000000149ef1a0a41083bc3996d026a7c0f32fc5cb73

Deployed ByteCode

0x60806040526004361061023d5760003560e01c8063715018a61161012d578063a3f0c0de116100b0578063cec10c1111610077578063cec10c11146106ca578063d06d04cc146106ea578063dd62ed3e146106fd578063e087b86414610743578063f2fde38b14610758578063fce589d81461077857005b8063a3f0c0de1461062a578063a4731cdc1461064a578063a9059cbb1461066a578063aec9b6f41461068a578063b91ac788146106aa57005b80638da5cb5b116100f45780638da5cb5b146105a157806395d89b41146105bf5780639d0014b1146105d4578063a01c3483146105f4578063a201ccf61461060a57005b8063715018a61461051657806372583bc71461052b57806377e4fb6b1461054b5780637d9f6db51461056157806387d5979a1461058157005b806336d4d031116101c057806355776b771161018757806355776b771461043a5780635c9a05b81461045a5780636612e66f1461048a57806366c23442146104aa578063689d91d7146104ca57806370a08231146104e057005b806336d4d0311461037d5780633ef3b9ca1461039d578063412ac4a0146103b257806341976e09146103ea5780635342acb41461040a57005b8063129bd67a11610204578063129bd67a146102f757806318160ddd146103175780631faa362c1461032c57806323b872dd14610341578063313ce5671461036157005b80630445b6671461024657806306fdde031461026f578063095ea7b3146102915780630e7f6d54146102c1578063110df09f146102e157005b3661024457005b005b34801561025257600080fd5b5061025c601d5481565b6040519081526020015b60405180910390f35b34801561027b57600080fd5b5061028461078e565b6040516102669190612488565b34801561029d57600080fd5b506102b16102ac3660046124b0565b610820565b6040519015158152602001610266565b3480156102cd57600080fd5b506102446102dc3660046124dc565b61083a565b3480156102ed57600080fd5b5061025c601b5481565b34801561030357600080fd5b506102446103123660046124b0565b610879565b34801561032357600080fd5b5060025461025c565b34801561033857600080fd5b5061025c610a7a565b34801561034d57600080fd5b506102b161035c3660046124f9565b610aab565b34801561036d57600080fd5b5060405160128152602001610266565b34801561038957600080fd5b506102446103983660046124dc565b610acf565b3480156103a957600080fd5b5060205461025c565b3480156103be57600080fd5b506018546103d2906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b3480156103f657600080fd5b5061025c6104053660046124dc565b610b46565b34801561041657600080fd5b506102b16104253660046124dc565b60226020526000908152604090205460ff1681565b34801561044657600080fd5b5061024461045536600461253a565b610caf565b34801561046657600080fd5b506102b16104753660046124dc565b60236020526000908152604090205460ff1681565b34801561049657600080fd5b506102446104a536600461257d565b611278565b3480156104b657600080fd5b506102446104c53660046124dc565b6112e3565b3480156104d657600080fd5b5061025c601c5481565b3480156104ec57600080fd5b5061025c6104fb3660046124dc565b6001600160a01b031660009081526020819052604090205490565b34801561052257600080fd5b5061024461138b565b34801561053757600080fd5b506019546103d2906001600160a01b031681565b34801561055757600080fd5b5061025c601e5481565b34801561056d57600080fd5b506016546103d2906001600160a01b031681565b34801561058d57600080fd5b506017546103d2906001600160a01b031681565b3480156105ad57600080fd5b506005546001600160a01b03166103d2565b3480156105cb57600080fd5b5061028461139f565b3480156105e057600080fd5b506102446105ef3660046125b6565b6113ae565b34801561060057600080fd5b506103d261036981565b34801561061657600080fd5b506102446106253660046124b0565b61143b565b34801561063657600080fd5b506102446106453660046125b6565b61171d565b34801561065657600080fd5b50601f546103d2906001600160a01b031681565b34801561067657600080fd5b506102b16106853660046124b0565b61175a565b34801561069657600080fd5b506015546103d2906001600160a01b031681565b3480156106b657600080fd5b506103d26106c53660046125b6565b611768565b3480156106d657600080fd5b506102446106e53660046125cf565b611792565b6102446106f83660046125b6565b61180d565b34801561070957600080fd5b5061025c6107183660046125fb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561074f57600080fd5b5061025c611927565b34801561076457600080fd5b506102446107733660046124dc565b611955565b34801561078457600080fd5b5061025c601a5481565b60606003805461079d90612629565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990612629565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b60003361082e818585611993565b60019150505b92915050565b6108426119a0565b6001600160a01b03166000818152602260205260409020805460ff19166001179055601880546001600160a01b0319169091179055565b6001600160a01b03821660009081526023602052604090205460ff166108ba5760405162461bcd60e51b81526004016108b190612663565b60405180910390fd5b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906108ea9033903090869060040161269a565b6020604051808303816000875af1158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d91906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a591906126be565b503360009081526022602052604090205460ff16806109d957336000908152602260205260409020805460ff191660011790555b60155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610a1490309086906000908190339042906004016126db565b6020604051808303816000875af1158015610a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a579190612716565b5080610a7557336000908152602260205260409020805460ff191690555b505050565b6000610a846119cd565b506016546a0422ca8b0a00a42500000090610aa8906001600160a01b0316826119f8565b90565b600033610ab9858285611a32565b610ac4858585611ab0565b506001949350505050565b610ad76119a0565b601f80546001600160a01b0319166001600160a01b038316908117909155600081815260226020908152604091829020805460ff1916600117905590519182527f749d41f0ee5297c1358d920a96cca563eb514cac372accb8d8e4cf8e642a077891015b60405180910390a150565b60195460408051630240bc6b60e21b815290516000926001600160a01b0316918291849182918491630902f1ac9160048083019260609291908290030181865afa158015610b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbc919061274b565b5091509150816001600160701b0316600003610bde5750600095945050505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c42919061279b565b9050600080826001600160a01b0316896001600160a01b031603610c755750506001600160701b03808416908316610c86565b50506001600160701b038083169084165b610ca282610c9c83670de0b6b3a7640000611e63565b90611e76565b9998505050505050505050565b6001600160a01b03831660009081526023602052604090205460ff16610ce75760405162461bcd60e51b81526004016108b190612663565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b919061279b565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db1919061279b565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190612716565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d9190612716565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd90610ec090339030908b9060040161269a565b6020604051808303816000875af1158015610edf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0391906126be565b506040516323b872dd60e01b81526001600160a01b038416906323b872dd90610f3490339030908a9060040161269a565b6020604051808303816000875af1158015610f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7791906126be565b506040516370a0823160e01b815230600482015260009083906001600160a01b038716906370a0823190602401602060405180830381865afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190612716565b610fef91906127ce565b6040516370a0823160e01b815230600482015290915060009083906001600160a01b038716906370a0823190602401602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190612716565b61106991906127ce565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291925087169063095ea7b3906044016020604051808303816000875af11580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529086169063095ea7b3906044016020604051808303816000875af1158015611136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115a91906126be565b5060155460405162e8e33760e81b81526001600160a01b0388811660048301528781166024830152604482018590526064820184905260006084830181905260a483018190523360c48401524260e484015292169063e8e3370090610104016060604051808303816000875af11580156111d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fc91906127e1565b601f5460405163294091cd60e01b81526001600160a01b038f81166004830152602482018490523360448301529295509116925063294091cd9150606401600060405180830381600087803b15801561125457600080fd5b505af1158015611268573d6000803e3d6000fd5b5050505050505050505050505050565b6112806119a0565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b910160405180910390a15050565b6112eb6119a0565b601680546001600160a01b0319166001600160a01b038316908117909155604080516343eacbcd60e11b815290516387d5979a916004808201926020929091908290030181865afa158015611344573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611368919061279b565b601780546001600160a01b0319166001600160a01b039290921691909117905550565b6113936119a0565b61139d6000611e82565b565b60606004805461079d90612629565b6113b66119a0565b600081116114065760405162461bcd60e51b815260206004820181905260248201527f5468726573686f6c64206d7573742062652067726561746572207468616e203060448201526064016108b1565b601d8190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647690602001610b3b565b6001600160a01b03821660009081526023602052604090205460ff166114735760405162461bcd60e51b81526004016108b190612663565b6000826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d7919061279b565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153d919061279b565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906115709033903090889060040161269a565b6020604051808303816000875af115801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906126be565b5060155460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b3906044016020604051808303816000875af1158015611607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162b91906126be565b503360009081526022602052604090205460ff168061165f57336000908152602260205260409020805460ff191660011790555b601554604051635d5155ef60e11b81526001600160a01b03858116600483015284811660248301526044820187905260006064830181905260848301523360a48301524260c48301529091169063baa2abde9060e40160408051808303816000875af11580156116d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f7919061280f565b50508061171657336000908152602260205260409020805460ff191690555b5050505050565b6117256119a0565b601e8190556040518181527f98fdd0b3c9bfe51a45c9afea7b77ebe06c52550d2783a24ef9c7415bbfcd023d90602001610b3b565b60003361082e818585611ab0565b6020818154811061177857600080fd5b6000918252602090912001546001600160a01b0316905081565b61179a6119a0565b6103e86117b1826117ab8686611ed4565b90611ed4565b11156117ff5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c206665652063616e6e6f742065786365656420313025000000000060448201526064016108b1565b601a92909255601b55601c55565b611818333083611ab0565b6015546118309030906001600160a01b031683611993565b60155460405163f305d71960e01b81526000916001600160a01b03169063f305d71990349061186d903090879087908190339042906004016126db565b60606040518083038185885af115801561188b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118b091906127e1565b601f5460195460405163294091cd60e01b81526001600160a01b0391821660048201526024810184905233604482015292955016925063294091cd91506064015b600060405180830381600087803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b505050505050565b60006119316119cd565b506016546a4a723dc6b40b8a9a00000090610aa8906001600160a01b0316826119f8565b61195d6119a0565b6001600160a01b03811661198757604051631e4fbdf760e01b8152600060048201526024016108b1565b61199081611e82565b50565b610a758383836001611ee0565b6005546001600160a01b0316331461139d5760405163118cdaa760e01b81523360048201526024016108b1565b6016546001600160a01b0316331461139d576040516355e9b77b60e01b815260040160405180910390fd5b6001600160a01b038216611a225760405163ec442f0560e01b8152600060048201526024016108b1565b611a2e60008383611fb5565b5050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611aaa5781811015611a9b57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108b1565b611aaa84848484036000611ee0565b50505050565b6001600160a01b038316611b145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108b1565b6001600160a01b038216611b765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108b1565b60008111611bd85760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108b1565b30600090815260208190526040902054601d5481108015908190611bff575060215460ff16155b8015611c1457506001600160a01b0385163014155b8015611c3857506001600160a01b03841660009081526023602052604090205460ff165b15611c61576021805460ff19166001179055601d54611c56906120df565b6021805460ff191690555b6001600160a01b03851660009081526022602052604081205460ff16158015611ca357506001600160a01b03851660009081526022602052604090205460ff16155b90508015611de857611cd66040518060400160405280600781526020016674616b6546656560c81b815250858888612249565b6000611cf3612710610c9c601a5488611e6390919063ffffffff16565b90506000611d12612710610c9c601b5489611e6390919063ffffffff16565b90506000611d31612710610c9c601c548a611e6390919063ffffffff16565b9050611d408961036985612292565b611d4b893084612292565b601f54611d63908a906001600160a01b031683612292565b601f5460405163afaa1faf60e01b8152600481018390526001600160a01b039091169063afaa1faf90602401600060405180830381600087803b158015611da957600080fd5b505af1158015611dbd573d6000803e3d6000fd5b50505050611de281611ddc84611ddc878c6122f190919063ffffffff16565b906122f1565b96505050505b611df3868686612292565b601f54601e546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611e2b9160040190815260200190565b600060405180830381600087803b158015611e4557600080fd5b505af1925050508015611e56575060015b1561191f57505050505050565b6000611e6f8284612833565b9392505050565b6000611e6f828461284a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611e6f828461286c565b6001600160a01b038416611f0a5760405163e602df0560e01b8152600060048201526024016108b1565b6001600160a01b038316611f3457604051634a1406b160e11b8152600060048201526024016108b1565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611aaa57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611fa791815260200190565b60405180910390a350505050565b6001600160a01b038316611fe0578060026000828254611fd5919061286c565b909155506120529050565b6001600160a01b038316600090815260208190526040902054818110156120335760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108b1565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661206e5760028054829003905561208d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120d291815260200190565b60405180910390a3505050565b476120e9826122fd565b60006120f547836122f1565b601f546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612147576040519150601f19603f3d011682016040523d82523d6000602084013e61214c565b606091505b50509050806121ab5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f2073656e6420504c5320746f207374616b696e67206164604482015264647265737360d81b60648201526084016108b1565b601f546040516328f582d360e11b8152600481018490526001600160a01b03909116906351eb05a690602401600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b505060408051878152602081018690527f86002d5678c47eb0087a60fbe86c0041568d30ac5942e2677143b6dcf22c10fa935001905060405180910390a150505050565b611aaa84848484604051602401612263949392919061287f565b60408051601f198184030181529190526020810180516001600160e01b031663eac8928160e01b179052612421565b6001600160a01b0383166122bc57604051634b637e8f60e11b8152600060048201526024016108b1565b6001600160a01b0382166122e65760405163ec442f0560e01b8152600060048201526024016108b1565b610a75838383611fb5565b6000611e6f82846127ce565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612332576123326128b8565b6001600160a01b039283166020918202929092018101919091526015546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af919061279b565b816001815181106123c2576123c26128b8565b6001600160a01b0392831660209182029290920101526015546123e89130911684611993565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac947906118f19085906000908690309042906004016128ce565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000815180845260005b818110156124685760208185018101518683018201520161244c565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611e6f6020830184612442565b6001600160a01b038116811461199057600080fd5b600080604083850312156124c357600080fd5b82356124ce8161249b565b946020939093013593505050565b6000602082840312156124ee57600080fd5b8135611e6f8161249b565b60008060006060848603121561250e57600080fd5b83356125198161249b565b925060208401356125298161249b565b929592945050506040919091013590565b60008060006060848603121561254f57600080fd5b833561255a8161249b565b95602085013595506040909401359392505050565b801515811461199057600080fd5b6000806040838503121561259057600080fd5b823561259b8161249b565b915060208301356125ab8161256f565b809150509250929050565b6000602082840312156125c857600080fd5b5035919050565b6000806000606084860312156125e457600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561260e57600080fd5b82356126198161249b565b915060208301356125ab8161249b565b600181811c9082168061263d57607f821691505b60208210810361265d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601d908201527f4c69717569646974792070616972206973206e6f7420636f7272656374000000604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602082840312156126d057600080fd5b8151611e6f8161256f565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60006020828403121561272857600080fd5b5051919050565b80516001600160701b038116811461274657600080fd5b919050565b60008060006060848603121561276057600080fd5b6127698461272f565b92506127776020850161272f565b9150604084015163ffffffff8116811461279057600080fd5b809150509250925092565b6000602082840312156127ad57600080fd5b8151611e6f8161249b565b634e487b7160e01b600052601160045260246000fd5b81810381811115610834576108346127b8565b6000806000606084860312156127f657600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561282257600080fd5b505080516020909101519092909150565b8082028115828204841417610834576108346127b8565b60008261286757634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610834576108346127b8565b6080815260006128926080830187612442565b6020830195909552506001600160a01b0392831660408201529116606090910152919050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561291e5784516001600160a01b0316835293830193918301916001016128f9565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d14a62cd4c1d8d3cc039202aa96e49df0489cb2a159d980ddef3007b31a692b264736f6c63430008140033