false
true
0

Contract Address Details

0xe65112d2f120c8cb23ADC80D8E8122c0c8b7fF8D

Token
DumbMoney (DUMB)
Creator
0xe90c5c–ef45fa at 0x057996–983a67
Balance
109,533,651.56934228776820615 PLS ( )
Tokens
Fetching tokens...
Transactions
1,079 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26102777
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Token




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
100
EVM Version
default




Verified at
2025-02-15T02:49:08.103374Z

Constructor Arguments

0x00000000000000000000000000000000000000005a790ea17ace06a96000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000006830000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000002d3c8750bd670354b00000000000000000000000000000052957c71f8b873f62ca939aceb75e86bfbb77fee000000000000000000000000000000000000000000000000000000000000000944756d624d6f6e65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444554d420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000cc78a0acdf847a2c1714d2a925bb4477df5d48a60000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb390000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab
              

contracts/Token.sol

/* SPDX-License-Identifier: UNLICENSED */

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "hardhat/console.sol";

interface IPulseXV2Router is IUniswapV2Router02 {
    function WPLS() external view returns (address);
}

interface IRelayer {
    function relay(address token) external;
}

contract Token is IERC20, Ownable {
    struct FeesDistribution {
        uint16 buyAndBurn;
        uint16 liquidity;
        uint16 burn;
        uint16 reflection;
    }

    address public constant DEAD_ADDRESS =
        address(0x000000000000000000000000000000000000dEaD);
    uint256 public constant PRECISION = 10000;
    uint256 private constant MAX = ~uint256(0);
    uint256 public constant BUY_AND_BURN_COOLDOWN = 11 hours;
    IRelayer public RELAYER;

    uint256 public lastBuyAndBurnTime;

    uint256 public override totalSupply;

    string public name;
    uint8 public decimals;
    string public symbol;

    uint16 public fees;
    uint16 private _previousFees;

    FeesDistribution public feesDistribution;

    uint256 public swapThreshold;

    bool public executeSwapsActive = false;

    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

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

    address[] public pairTokens;

    IPulseXV2Router public ROUTER;
    IUniswapV2Factory public FACTORY;
    bool public inSwap;

    modifier inSwapLock() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor(
        uint256 _initialAmount,
        string memory _tokenName,
        uint8 _decimalUnits,
        string memory _tokenSymbol,
        address _router,
        address[] memory _erc20Tokens,
        uint16 _fees,
        FeesDistribution memory _feesDistribution,
        uint256 _swapThreshold,
        address _relayerAddress
    ) {
        ROUTER = IPulseXV2Router(_router);
        FACTORY = IUniswapV2Factory(ROUTER.factory());

        _approve(address(this), _router, type(uint256).max);
        IERC20(ROUTER.WPLS()).approve(_router, type(uint256).max);

        name = _tokenName;
        decimals = _decimalUnits;
        symbol = _tokenSymbol;
        totalSupply = _initialAmount;
        _rTotal = (MAX - (MAX % totalSupply));
        _rOwned[_msgSender()] = _rTotal;

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[_router] = true;

        address nativePair = FACTORY.createPair(address(this), ROUTER.WPLS());
        isLiquidityPair[nativePair] = true;
        pairTokens.push(ROUTER.WPLS());

        for (uint i = 0; i < _erc20Tokens.length; i++) {
            require(_erc20Tokens[i] != address(0), "Invalid token address");

            IERC20(_erc20Tokens[i]).approve(_router, type(uint256).max);

            address pair = FACTORY.createPair(address(this), _erc20Tokens[i]);
            isLiquidityPair[pair] = true;
            pairTokens.push(_erc20Tokens[i]);
        }

        emit Transfer(address(0), _msgSender(), _initialAmount);
        emit OwnershipTransferred(address(0), _msgSender());

        fees = _fees;
        feesDistribution = _feesDistribution;
        swapThreshold = _swapThreshold;
        RELAYER = IRelayer(_relayerAddress);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = totalSupply;

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, totalSupply);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / totalSupply) return (_rTotal, totalSupply);
        return (rSupply, tSupply);
    }

    function _getValues(
        uint256 tAmount
    )
        private
        view
        returns (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tBurn,
            uint256 tBuyAndBurn
        )
    {
        uint256 toBeTaxed = (tAmount * fees) / PRECISION;

        tFee = (toBeTaxed * feesDistribution.reflection) / PRECISION;
        tLiquidity = (toBeTaxed * feesDistribution.liquidity) / PRECISION;
        tBurn = (toBeTaxed * feesDistribution.burn) / PRECISION;
        tBuyAndBurn = (toBeTaxed * feesDistribution.buyAndBurn) / PRECISION;
        tTransferAmount = tAmount - tFee - tLiquidity - tBurn - tBuyAndBurn;

        uint256 currentRate = _getRate();
        rAmount = tAmount * currentRate;
        rFee = tFee * currentRate;
        uint256 rLiquidity = tLiquidity * currentRate;
        uint256 rBurn = tBurn * currentRate;
        uint256 rBuyAndBurn = tBuyAndBurn * currentRate;
        rTransferAmount = rAmount - rFee - rLiquidity - rBurn - rBuyAndBurn;
    }

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function tokenFromReflection(
        uint256 rAmount
    ) public view returns (uint256) {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tBurn,
            uint256 tBuyAndBurn
        ) = _getValues(tAmount);

        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;

        if (tLiquidity > 0) {
            _takeLiquidity(tLiquidity);
        }
        if (tBurn > 0) {
            _takeBurn(tBurn);
        }
        if (tBuyAndBurn > 0) {
            _takeBuyAndBurn(tBuyAndBurn);
        }
        if (tFee > 0) {
            _reflectFee(rFee, tFee);
        }

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tBurn,
            uint256 tBuyAndBurn
        ) = _getValues(tAmount);

        _rOwned[sender] = _rOwned[sender] - rAmount;
        _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;

        if (tLiquidity > 0) {
            _takeLiquidity(tLiquidity);
        }
        if (tBurn > 0) {
            _takeBurn(tBurn);
        }
        if (tBuyAndBurn > 0) {
            _takeBuyAndBurn(tBuyAndBurn);
        }
        if (tFee > 0) {
            _reflectFee(rFee, tFee);
        }

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tBurn,
            uint256 tBuyAndBurn
        ) = _getValues(tAmount);

        _tOwned[sender] = _tOwned[sender] - tAmount;
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;

        if (tLiquidity > 0) {
            _takeLiquidity(tLiquidity);
        }
        if (tBurn > 0) {
            _takeBurn(tBurn);
        }
        if (tBuyAndBurn > 0) {
            _takeBuyAndBurn(tBuyAndBurn);
        }
        if (tFee > 0) {
            _reflectFee(rFee, tFee);
        }

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tBurn,
            uint256 tBuyAndBurn
        ) = _getValues(tAmount);

        _tOwned[sender] = _tOwned[sender] - tAmount;
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;

        if (tLiquidity > 0) {
            _takeLiquidity(tLiquidity);
        }
        if (tBurn > 0) {
            _takeBurn(tBurn);
        }
        if (tBuyAndBurn > 0) {
            _takeBuyAndBurn(tBuyAndBurn);
        }
        if (tFee > 0) {
            _reflectFee(rFee, tFee);
        }

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeBurn(uint256 tBurn) private {
        uint256 currentRate = _getRate();
        uint256 rBurn = tBurn * currentRate;
        _rOwned[DEAD_ADDRESS] = _rOwned[DEAD_ADDRESS] + rBurn;
        if (_isExcluded[DEAD_ADDRESS]) {
            _tOwned[DEAD_ADDRESS] = _tOwned[DEAD_ADDRESS] + tBurn;
        }
        emit Transfer(_msgSender(), DEAD_ADDRESS, tBurn);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if (_isExcluded[address(this)]) {
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        }
        emit Transfer(_msgSender(), address(this), tLiquidity);
    }

    function _takeBuyAndBurn(uint256 tBuyAndBurn) private {
        uint256 currentRate = _getRate();
        uint256 rBuyAndBurn = tBuyAndBurn * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rBuyAndBurn;
        if (_isExcluded[address(this)]) {
            _tOwned[address(this)] = _tOwned[address(this)] + tBuyAndBurn;
        }
        emit Transfer(_msgSender(), address(this), tBuyAndBurn);
    }

    function _transfer(address _from, address _to, uint256 _value) internal {
        require(_from != address(0), "Transfer from zero address");
        require(_to != address(0), "Transfer to zero address");
        require(_value > 0, "Transfer amount must be greater than zero");

        if (
            balanceOf(address(this)) >= swapThreshold &&
            executeSwapsActive &&
            !isLiquidityPair[_from] &&
            !inSwap
        ) {
            console.log("Processing fees");
            _processFees();
        }

        bool takeFee = !isExcludedFromFee[_from] && !isExcludedFromFee[_to];

        if (!takeFee) {
            _previousFees = fees;
            fees = 0;
            console.log("Fees set to 0");
        }

        if (_isExcluded[_from] && !_isExcluded[_to]) {
            console.log("Transferring from excluded to not excluded");
            _transferFromExcluded(_from, _to, _value);
        } else if (!_isExcluded[_from] && _isExcluded[_to]) {
            console.log("Transferring from not excluded to excluded");
            _transferToExcluded(_from, _to, _value);
        } else if (_isExcluded[_from] && _isExcluded[_to]) {
            console.log("Transferring from both excluded");
            _transferBothExcluded(_from, _to, _value);
        } else {
            console.log("Transferring standard");
            _transferStandard(_from, _to, _value);
        }

        if (!takeFee) {
            console.log("Fees set to previous");
            fees = _previousFees;
        }
    }

    function _processFees() internal inSwapLock {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance == 0) return;

        uint256 buyAndBurnAmount = (contractTokenBalance *
            feesDistribution.buyAndBurn) /
            (feesDistribution.buyAndBurn + feesDistribution.liquidity);

        console.log("buyAndBurnAmount", buyAndBurnAmount);
        uint256 liquidityAmount = contractTokenBalance - buyAndBurnAmount;
        console.log("liquidityAmount", liquidityAmount);

        if (buyAndBurnAmount > 0) {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = ROUTER.WPLS();

            console.log("swapping buyAndBurnAmount", buyAndBurnAmount);

            ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
                buyAndBurnAmount,
                0,
                path,
                address(this),
                block.timestamp + 3600
            );

            console.log("swapped buyAndBurnAmount", buyAndBurnAmount);
        }

        if (block.timestamp >= lastBuyAndBurnTime + BUY_AND_BURN_COOLDOWN) {
            console.log("buying and burning");

            uint256 ethBalance = address(this).balance;
            if (ethBalance > 0) {
                console.log("ethBalance", ethBalance);

                uint256 buyAmount = ethBalance / 10;
                if (buyAmount > 0) {
                    console.log("buying", buyAmount);
                    address[] memory path = new address[](2);
                    path[0] = ROUTER.WPLS();
                    path[1] = address(this);

                    console.log("swapping buyAmount", buyAmount);

                    ROUTER.swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: buyAmount
                    }(0, path, DEAD_ADDRESS, block.timestamp + 3600);
                    lastBuyAndBurnTime = block.timestamp;
                    console.log("bought and burned", buyAmount);
                }
            }
        }

        if (liquidityAmount > 0 && pairTokens.length > 0) {
            uint256 amountPerPair = liquidityAmount / pairTokens.length;
            console.log("amountPerPair", amountPerPair);
            for (uint i = 0; i < pairTokens.length; i++) {
                address pairToken = pairTokens[i];
                console.log("pairToken", pairToken);
                uint256 halfAmount = amountPerPair / 2;
                console.log("halfAmount", halfAmount);
                if (pairToken == ROUTER.WPLS()) {
                    address[] memory path = new address[](2);
                    path[0] = address(this);
                    path[1] = ROUTER.WPLS();

                    console.log("swapping halfAmount ETH", halfAmount);

                    ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
                        halfAmount,
                        0,
                        path,
                        address(this),
                        block.timestamp + 3600
                    );

                    console.log("swapped halfAmount ETH", halfAmount);

                    console.log("adding liquidity ETH");

                    ROUTER.addLiquidityETH{value: address(this).balance}(
                        address(this),
                        halfAmount,
                        0,
                        0,
                        DEAD_ADDRESS,
                        block.timestamp + 3600
                    );

                    console.log("added liquidity ETH");
                } else {
                    address[] memory path = new address[](2);
                    path[0] = address(this);
                    path[1] = pairToken;

                    console.log("swapping halfAmount", halfAmount);

                    ROUTER
                        .swapExactTokensForTokensSupportingFeeOnTransferTokens(
                            halfAmount,
                            0,
                            path,
                            address(RELAYER),
                            block.timestamp + 3600
                        );

                    console.log("swapped halfAmount", halfAmount);

                    console.log(
                        "transfering from relayer to this",
                        address(RELAYER),
                        address(this),
                        halfAmount
                    );

                    RELAYER.relay(pairToken);

                    console.log("relayed");

                    uint256 pairTokenBalance = IERC20(pairToken).balanceOf(
                        address(this)
                    );
                    console.log("pairTokenBalance", pairTokenBalance);

                    console.log(
                        "adding liquidity",
                        halfAmount,
                        pairTokenBalance
                    );

                    ROUTER.addLiquidity(
                        address(this),
                        pairToken,
                        halfAmount,
                        pairTokenBalance,
                        0,
                        0,
                        DEAD_ADDRESS,
                        block.timestamp + 3600
                    );

                    console.log(
                        "added liquidity",
                        halfAmount,
                        pairTokenBalance
                    );
                }
            }
        }
    }

    function transfer(
        address _to,
        uint256 _value
    ) public override returns (bool success) {
        _transfer(_msgSender(), _to, _value);
        return true;
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) public override returns (bool success) {
        address spender = _msgSender();
        if (allowances[_from][spender] != type(uint256).max) {
            allowances[_from][spender] -= _value;
        }
        _transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function approve(
        address _spender,
        uint256 _value
    ) public override returns (bool success) {
        _approve(_msgSender(), _spender, _value);
        return true;
    }

    function _approve(
        address _sender,
        address _spender,
        uint256 _value
    ) internal returns (bool success) {
        allowances[_sender][_spender] = _value;
        emit Approval(_sender, _spender, _value);
        return true;
    }

    function allowance(
        address _owner,
        address _spender
    ) public view override returns (uint256 remaining) {
        return allowances[_owner][_spender];
    }

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

    function setExecuteSwapsActive(
        bool _executeSwapsActive
    ) external onlyOwner {
        executeSwapsActive = _executeSwapsActive;
    }

    function addPairToken(address pairToken) external onlyOwner {
        require(pairToken != address(0), "Invalid token address");

        IERC20(pairToken).approve(address(ROUTER), type(uint256).max);

        address pair = FACTORY.createPair(address(this), pairToken);
        isLiquidityPair[pair] = true;
        pairTokens.push(pairToken);
    }

    function addLiquidity(
        uint256 tokenAmount,
        uint256[] memory tokenAmounts,
        uint256[] memory pairTokenAmounts
    ) external payable onlyOwner {
        _addLiquidityForTokens(tokenAmounts, pairTokenAmounts);
        _addLiquidityNative(tokenAmount);
    }

    function _addLiquidityForTokens(
        uint256[] memory tokenAmounts,
        uint256[] memory pairTokenAmounts
    ) internal {
        require(
            pairTokens.length == tokenAmounts.length &&
                tokenAmounts.length == pairTokenAmounts.length,
            "Arrays length mismatch"
        );

        console.log("pairTokens.length", pairTokens.length);
        console.log("tokenAmounts.length", tokenAmounts.length);
        console.log("pairTokenAmounts.length", pairTokenAmounts.length);

        for (uint i = 1; i < pairTokens.length; i++) {
            console.log("pairTokens[i]", pairTokens[i]);
            require(pairTokens[i] != address(0), "Invalid token address");

            address pair = FACTORY.getPair(address(this), pairTokens[i]);
            console.log("pair", pair);
            require(pair != address(0), "Pair does not exist");
            console.log("isLiquidityPair[pair]", isLiquidityPair[pair]);
            require(isLiquidityPair[pair], "Not a registered liquidity pair");

            require(
                tokenAmounts[i] > 0 && pairTokenAmounts[i] > 0,
                "Amounts must be greater than 0"
            );

            console.log("tokenAmounts[i]", tokenAmounts[i]);
            console.log("pairTokenAmounts[i]", pairTokenAmounts[i]);

            console.log(
                "Transferring THIS_TOKEN from msg.sender to this",
                _msgSender(),
                address(this),
                tokenAmounts[i]
            );

            _transfer(_msgSender(), address(this), tokenAmounts[i]);

            console.log(
                "Transferring PAIR_TOKEN from msg.sender to this",
                _msgSender(),
                address(this),
                pairTokenAmounts[i]
            );

            IERC20(pairTokens[i]).transferFrom(
                _msgSender(),
                address(this),
                pairTokenAmounts[i]
            );

            console.log("Adding liquidity for pair", pairTokens[i]);

            console.log(
                "this token approval",
                allowances[address(this)][address(ROUTER)]
            );

            console.log("this token balance", balanceOf(address(this)));

            console.log("this token amount", tokenAmounts[i]);

            console.log(
                "pair token approval",
                IERC20(pairTokens[i]).allowance(address(this), address(ROUTER))
            );

            console.log(
                "pair token balance",
                IERC20(pairTokens[i]).balanceOf(address(this))
            );

            console.log("pair token amount", pairTokenAmounts[i]);

            ROUTER.addLiquidity(
                address(this),
                pairTokens[i],
                tokenAmounts[i],
                pairTokenAmounts[i],
                (tokenAmounts[i] * 95) / 100,
                (pairTokenAmounts[i] * 95) / 100,
                DEAD_ADDRESS,
                block.timestamp + 3600
            );

            console.log("Added liquidity for pair", pairTokens[i]);
        }
    }

    function _addLiquidityNative(uint256 tokenAmount) internal {
        require(tokenAmount > 0, "Token amount must be greater than 0");
        require(msg.value > 0, "Native token amount must be greater than 0");

        address pair = FACTORY.getPair(address(this), ROUTER.WPLS());
        require(pair != address(0), "Native pair does not exist");
        require(
            isLiquidityPair[pair],
            "Not a registered native liquidity pair"
        );

        _transfer(_msgSender(), address(this), tokenAmount);

        ROUTER.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            (tokenAmount * 95) / 100,
            (msg.value * 95) / 100,
            DEAD_ADDRESS,
            block.timestamp + 3600
        );
    }

    receive() external payable {}
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

@openzeppelin/contracts/interfaces/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/IERC20.sol";
          

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity >=0.5.0;

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

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

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

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

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS =
        0x000000000000000000636F6e736F6c652e6c6f67;

    function _sendLogPayloadImplementation(bytes memory payload) internal view {
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            pop(
                staticcall(
                    gas(),
                    consoleAddress,
                    add(payload, 32),
                    mload(payload),
                    0,
                    0
                )
            )
        }
    }

    function _castToPure(
      function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) pure fnOut) {
        assembly {
            fnOut := fnIn
        }
    }

    function _sendLogPayload(bytes memory payload) internal pure {
        _castToPure(_sendLogPayloadImplementation)(payload);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function log(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

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

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

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

    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

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

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

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

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

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

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
        _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 pure {
        _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 pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}
          

Compiler Settings

{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout"],"":["ast"]}},"optimizer":{"runs":100,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"uint256","name":"_initialAmount","internalType":"uint256"},{"type":"string","name":"_tokenName","internalType":"string"},{"type":"uint8","name":"_decimalUnits","internalType":"uint8"},{"type":"string","name":"_tokenSymbol","internalType":"string"},{"type":"address","name":"_router","internalType":"address"},{"type":"address[]","name":"_erc20Tokens","internalType":"address[]"},{"type":"uint16","name":"_fees","internalType":"uint16"},{"type":"tuple","name":"_feesDistribution","internalType":"struct Token.FeesDistribution","components":[{"type":"uint16","name":"buyAndBurn","internalType":"uint16"},{"type":"uint16","name":"liquidity","internalType":"uint16"},{"type":"uint16","name":"burn","internalType":"uint16"},{"type":"uint16","name":"reflection","internalType":"uint16"}]},{"type":"uint256","name":"_swapThreshold","internalType":"uint256"},{"type":"address","name":"_relayerAddress","internalType":"address"}]},{"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":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"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":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BUY_AND_BURN_COOLDOWN","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Factory"}],"name":"FACTORY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRelayer"}],"name":"RELAYER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXV2Router"}],"name":"ROUTER","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"addLiquidity","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"uint256[]","name":"tokenAmounts","internalType":"uint256[]"},{"type":"uint256[]","name":"pairTokenAmounts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPairToken","inputs":[{"type":"address","name":"pairToken","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"remaining","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowances","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"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":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"executeSwapsActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"fees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"buyAndBurn","internalType":"uint16"},{"type":"uint16","name":"liquidity","internalType":"uint16"},{"type":"uint16","name":"burn","internalType":"uint16"},{"type":"uint16","name":"reflection","internalType":"uint16"}],"name":"feesDistribution","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"inSwap","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"lastBuyAndBurnTime","inputs":[]},{"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":"pairTokens","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExecuteSwapsActive","inputs":[{"type":"bool","name":"_executeSwapsActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"excluded","internalType":"bool"}]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","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":"success","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

0x60808060405234620006dc576200433b803803809162000020828562000c04565b8339810190808203916101a08312620006dc57815160208301519093906001600160401b038111620006dc57826200005a91850162000c28565b60408401519360ff85168503620006dc5760608101516001600160401b038111620006dc57846200008d91830162000c28565b946200009c6080830162000c9f565b60a08301519096906001600160401b038111620006dc5783019580601f88011215620006dc578651966001600160401b03881162000a35578760051b9060405198620000ec602084018b62000c04565b89526020808a0192820101928311620006dc57602001905b82821062000be95750505060806200011f60c0850162000cb4565b9560df190112620006dc5760405191608083016001600160401b0381118482101762000a35576040526200015660e0850162000cb4565b835262000167610100850162000cb4565b60208401526200017b610120850162000cb4565b60408401526200018f610140850162000cb4565b6060840152620001a9610180610160860151950162000c9f565b60008054336001600160a01b03198216811783556040519398939290916001600160a01b031690600080516020620042fb8339815191529080a3600a805460ff19169055601580546001600160a01b0319166001600160a01b038c1690811790915563c45a015560e01b8252602090829060049082905afa908115620006ea5760009162000ba7575b50601680546001600160a01b0319166001600160a01b03928316179055306000818152601160209081526040808320948e16808452948252918290206000199081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a360155460405163ef8ef56f60e01b815290602090829060049082906001600160a01b03165afa908115620006ea5760009162000b60575b5060405163095ea7b360e01b81526001600160a01b03808c1660048301526000196024830152909160209183916044918391600091165af18015620006ea5762000b3c575b508051906001600160401b03821162000a3557600454600181811c9116801562000b31575b602082101462000a1457601f811162000acb575b50602090601f831160011462000a575760ff9392916000918362000a4b575b50508160011b916000199060031b1c1916176004555b1660ff19600554161760055580519060018060401b03821162000a355760065490600182811c9216801562000a2a575b602083101462000a145781601f849311620009b3575b50602090601f8311600114620009355760009262000929575b50508160011b916000199060031b1c1916176006555b866003558615620009135786600019061980600b5533600052600d6020526040600020553060005260136020526040600020600160ff19825416179055336000526040600020600160ff1982541617905560018060a01b0386166000526040600020600160ff19825416179055600460018060a01b0360165416602060018060a01b03601554166040519384809263ef8ef56f60e01b82525afa918215620006ea57600092620008c5575b506040516364e329cb60e11b81523060048201526001600160a01b039092166024830152602090829081600081604481015b03925af1908115620006ea5760009162000883575b506001600160a01b03908116600090815260126020908152604091829020805460ff19166001179055601554915163ef8ef56f60e01b815292909183916004918391165afa8015620006ea576000906200083f575b6200054f915062000cde565b60005b855181101562000771576001600160a01b0362000570828862000d5f565b5116156200072c57600060206001600160a01b0362000590848a62000d5f565b5160405163095ea7b360e01b81526001600160a01b038c16600482015284196024820152938492604492849291165af18015620006ea57620006f6575b5060165460009060209062000627906001600160a01b0390811690620005f4868c62000d5f565b516040516364e329cb60e11b815230600482015291166001600160a01b0316602482015293849283919082906044820190565b03925af1908115620006ea57600091620006a3575b506001600160a01b039081166000908152601260205260409020805460ff191660011790556200067a9062000672838962000d5f565b511662000cde565b60001981146200068d5760010162000552565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011620006e1575b81620006c16020938362000c04565b81010312620006dc57620006d59062000c9f565b386200063c565b600080fd5b3d9150620006b2565b6040513d6000823e3d90fd5b6200071c9060203d60201162000724575b62000713818362000c04565b81019062000cc4565b5038620005cd565b503d62000707565b60405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606490fd5b508660405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a360405193336000600080516020620042fb8339815191528180a361ffff80911661ffff196007541617600755815116906008549163ffff0000602083015160101b169067ffff000000000000606065ffff00000000604086015160201b1694015160301b169360018060401b0319161717171760085560095560018060a01b031660018060a01b03196001541617600155613586908162000d758239f35b506020813d6020116200087a575b816200085c6020938362000c04565b81010312620006dc57620008746200054f9162000c9f565b62000543565b3d91506200084d565b90506020813d602011620008bc575b81620008a16020938362000c04565b81010312620006dc57620008b59062000c9f565b38620004ee565b3d915062000892565b91506020823d6020116200090a575b81620008e36020938362000c04565b81010312620006dc57620004d96020916200090060009462000c9f565b93509150620004a7565b3d9150620008d4565b634e487b7160e01b600052601260045260246000fd5b015190503880620003e6565b6006600090815293506000805160206200431b83398151915291905b601f198416851062000997576001945083601f198116106200097d575b505050811b01600655620003fc565b015160001960f88460031b161c191690553880806200096e565b8181015183556020948501946001909301929091019062000951565b60066000529091506000805160206200431b833981519152601f840160051c81016020851062000a0c575b90849392915b601f830160051c82018110620009fc575050620003cd565b60008155859450600101620009e4565b5080620009de565b634e487b7160e01b600052602260045260246000fd5b91607f1691620003b7565b634e487b7160e01b600052604160045260246000fd5b01519050388062000371565b90600460005260206000209160005b601f198516811062000ab2575091839160019360ff9695601f1981161062000a98575b505050811b0160045562000387565b015160001960f88460031b161c1916905538808062000a89565b9192602060018192868501518155019401920162000a66565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c81016020851062000b29575b601f830160051c8201811062000b1c57505062000352565b6000815560010162000b04565b508062000b04565b90607f16906200033e565b62000b589060203d602011620007245762000713818362000c04565b503862000319565b90506020813d60201162000b9e575b8162000b7e6020938362000c04565b81010312620006dc57602062000b9660009262000c9f565b9150620002d4565b3d915062000b6f565b90506020813d60201162000be0575b8162000bc56020938362000c04565b81010312620006dc5762000bd99062000c9f565b3862000232565b3d915062000bb6565b6020809162000bf88462000c9f565b81520191019062000104565b601f909101601f19168101906001600160401b0382119082101762000a3557604052565b919080601f84011215620006dc578251906001600160401b03821162000a35576040519160209162000c64601f8301601f191684018562000c04565b818452828287010111620006dc5760005b81811062000c8b57508260009394955001015290565b858101830151848201840152820162000c75565b51906001600160a01b0382168203620006dc57565b519061ffff82168203620006dc57565b90816020910312620006dc57518015158103620006dc5790565b6014546801000000000000000081101562000a3557600181018060145581101562000d495760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b03909216919091179055565b634e487b7160e01b600052603260045260246000fd5b805182101562000d495760209160051b01019056fe608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b66714611a6f5750806306fdde03146119c9578063095ea7b3146119505780631141ece41461193357806318160ddd1461191557806323b872dd1461188e5780632483e715146118655780632d838119146118475780632dd310001461181e578063313ce567146117fd57806332fe7b26146117d45780633685d4191461168b5780634e6fd6c41461166e57806352390c02146115795780635342acb41461153a57806355b6ed5c146102e55780635c38693d146115175780635c9a05b8146114d857806365a807df1461149f57806370a0823114611474578063715018a61461141b5780638da5cb5b146113f257806395d89b41146112fd5780639af1d35a146112db578063a4e6668f14611280578063a9059cbb1461124f578063aaf5eb6814611232578063b068d56e146111ee578063b3e03f74146104e6578063c98e82181461035c578063d830678614610336578063dd62ed3e146102e5578063ef422a181461028f578063f2fde38b146101ce5763f99d7b9b146101ab573861000f565b346101c95760003660031901126101c9576020600254604051908152f35b600080fd5b346101c95760203660031901126101c9576101e7611b38565b6101ef611c17565b6001600160a01b0390811690811561023b576000548260018060a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101c95760403660031901126101c9576102a8611b38565b602435908115158092036101c9576102be611c17565b60018060a01b0316600052601360205260406000209060ff80198354169116179055600080f35b346101c95760403660031901126101c9576102fe611b38565b610306611b4e565b9060018060a01b038091166000526011602052604060002091166000526020526020604060002054604051908152f35b346101c95760003660031901126101c957602060ff60165460a01c166040519015158152f35b346101c9576020806003193601126101c957610376611b38565b9061037f611c17565b6001600160a01b039060008184841661039981151561332e565b60448560155416604051948593849263095ea7b360e01b84526004840152811960248401525af180156104ad576104b9575b508160165416918160405180946364e329cb60e11b8252816000816103f48a306004840161338a565b03925af180156104ad57601293600091610480575b5016600052526040600020600160ff1982541617905560145490600160401b82101561046a5761044282600161001b9401601455611b95565b9080546001600160a01b0360039390931b83811b80199092169390941690931b909216179055565b634e487b7160e01b600052604160045260246000fd5b6104a09150833d85116104a6575b6104988183611ad6565b81019061266a565b85610409565b503d61048e565b6040513d6000823e3d90fd5b6104d890823d84116104df575b6104d08183611ad6565b810190613372565b50836103cb565b503d6104c6565b60603660031901126101c95767ffffffffffffffff6024358181116101c957610513903690600401611bb0565b906044359081116101c95761052c903690600401611bb0565b610534611c17565b601454825180821490816111e3575b50156111a55761057c9060405161055981611a9e565b60118152700e0c2d2e4a8ded6cadce65cd8cadccee8d607b1b60208201526133f3565b6105b2825160405161058d81611a9e565b60138152720e8ded6cadc82dadeeadce8e65cd8cadccee8d606b1b60208201526133f3565b6105ec81516040516105c381611a9e565b60178152760e0c2d2e4a8ded6cadc82dadeeadce8e65cd8cadccee8d604b1b60208201526133f3565b60015b601454811015610ee25761064561060582611b95565b9054906040519161061583611a9e565b600d83526c70616972546f6b656e735b695d60981b602084015260039190911b1c6001600160a01b031690613438565b61066a61065182611b95565b905460039190911b1c6001600160a01b0316151561332e565b6016546106b5906020906001600160a01b031661068684611b95565b905460405163e6a4390560e01b815294859392849283929160031b1c6001600160a01b0316306004840161338a565b03915afa9081156104ad57600091610ec3575b506106ef816040516106d981611a9e565b60048152633830b4b960e11b6020820152613438565b6001600160a01b03811615610e885760018060a01b038116600052601260205260008061077361078960ff6040842054166040519061072d82611a9e565b601582527469734c6971756964697479506169725b706169725d60581b602083015260405193849263c3b5563560e01b6020850152604060248501526064840190611af8565b901515604483015203601f198101835282611ad6565b6020815191016a636f6e736f6c652e6c6f675afa506001600160a01b031660009081526012602052604090205460ff1615610e43576107c88184612656565b51151580610e30575b15610deb576108116107e38285612656565b516040516107f081611a9e565b600f81526e746f6b656e416d6f756e74735b695d60881b60208201526133f3565b61085061081e8284612656565b5160405161082b81611a9e565b601381527270616972546f6b656e416d6f756e74735b695d60681b60208201526133f3565b61092161085d8285612656565b516040519061086b82611aba565b6108bd602f918284527f5472616e7366657272696e6720544849535f544f4b454e2066726f6d206d736760208501526e2e73656e64657220746f207468697360881b93846040820152309033906134d3565b6108d26108ca8588612656565b513033611e35565b6108dc8486612656565b5191604051916108eb83611aba565b82527f5472616e7366657272696e6720504149525f544f4b454e2066726f6d206d736760208301526040820152309033906134d3565b6000602061092e83611b95565b905460039190911b1c6001600160a01b0316606461094c8587612656565b5160405194859384926323b872dd60e01b845233600485015230602485015260448401525af180156104ad57610dcc575b506109d461098a82611b95565b905460405160039290921b1c6001600160a01b0316906109a981611a9e565b601981527820b23234b733903634b8bab4b234ba3c903337b9103830b4b960391b6020820152613438565b30600052601160205260406000209060018060a01b03601554169182600052602052610a30604060002054604051610a0b81611a9e565b60138152721d1a1a5cc81d1bdad95b88185c1c1c9bdd985b606a1b60208201526133f3565b610a6c610a3c306132ee565b604051610a4881611a9e565b60128152717468697320746f6b656e2062616c616e636560701b60208201526133f3565b610aa9610a798286612656565b51604051610a8681611a9e565b60118152701d1a1a5cc81d1bdad95b88185b5bdd5b9d607a1b60208201526133f3565b610ab281611b95565b9054604051636eb1769f60e11b815291602091839160031b1c6001600160a01b03168180610ae488306004840161338a565b03915afa80156104ad57600090610d98575b610b2c9150604051610b0781611a9e565b60138152721c185a5c881d1bdad95b88185c1c1c9bdd985b606a1b60208201526133f3565b60246020610b3983611b95565b90546040516370a0823160e01b81523060048201529384929091839160031b1c6001600160a01b03165afa80156104ad57600090610d64575b610ba79150604051610b8381611a9e565b60128152717061697220746f6b656e2062616c616e636560701b60208201526133f3565b610be4610bb48285612656565b51604051610bc181611a9e565b60118152701c185a5c881d1bdad95b88185b5bdd5b9d607a1b60208201526133f3565b610bed81611b95565b905460039190911b1c6001600160a01b0316610c098286612656565b51610c148386612656565b5193610c208488612656565b5192605f918483810204831485151715610d4e57610c3e8689612656565b51908184810204841482151715610d4e57610e1042014211610d4e57606484600093826101049760609a6040519d8e9b8c9a62e8e33760e81b8c523060048d015260248c015260448b0152838a015202046084870152020460a484015261dead60c4840152610e10420160e48401525af19182156104ad57610d1a92610d1f575b50610d15610ccc82611b95565b905460405160039290921b1c6001600160a01b031690610ceb81611a9e565b601881527720b23232b2103634b8bab4b234ba3c903337b9103830b4b960411b6020820152613438565b611c6f565b6105ef565b610d409060603d606011610d47575b610d388183611ad6565b810190612700565b5050610cbf565b503d610d2e565b634e487b7160e01b600052601160045260246000fd5b506020813d602011610d90575b81610d7e60209383611ad6565b810103126101c957610ba79051610b72565b3d9150610d71565b506020813d602011610dc4575b81610db260209383611ad6565b810103126101c957610b2c9051610af6565b3d9150610da5565b610de49060203d6020116104df576104d08183611ad6565b508361097d565b60405162461bcd60e51b815260206004820152601e60248201527f416d6f756e7473206d7573742062652067726561746572207468616e203000006044820152606490fd5b50610e3b8183612656565b5115156107d1565b60405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527214185a5c88191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b610edc915060203d6020116104a6576104988183611ad6565b846106c8565b60043580156111545734156110fc5760165460155460405163ef8ef56f60e01b81526001600160a01b03928316916020908290600490829087165afa80156104ad57610f50926020926000926110dd575b50604051808095819463e6a4390560e01b8352306004840161338a565b03915afa80156104ad5782916000916110be575b5016801561107957600052601260205260ff604060002054161561102557610f8d823033611e35565b60155416605f8202828104605f03610d4e57605f3402348104605f03610d4e57610e1042014211610d4e576064936060938560c493604051978896879563f305d71960e01b8752306004880152602487015204604485015204606483015261dead6084830152610e10420160a483015234905af180156104ad5761100d57005b61001b9060603d606011610d4757610d388183611ad6565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420612072656769737465726564206e6174697665206c697175696469746044820152653c903830b4b960d11b6064820152608490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4e6174697665207061697220646f6573206e6f742065786973740000000000006044820152606490fd5b6110d7915060203d6020116104a6576104988183611ad6565b84610f64565b6110f5919250833d85116104a6576104988183611ad6565b9086610f33565b60405162461bcd60e51b815260206004820152602a60248201527f4e617469766520746f6b656e20616d6f756e74206d75737420626520677265616044820152690746572207468616e20360b41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606490fd5b905082511484610543565b346101c95760003660031901126101c95760806008546040519061ffff908181168352818160101c166020840152818160201c16604084015260301c166060820152f35b346101c95760003660031901126101c95760206040516127108152f35b346101c95760403660031901126101c95761127561126b611b38565b6024359033611e35565b602060405160018152f35b346101c95760203660031901126101c9576004356014548110156101c95760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957602061ffff60075416604051908152f35b346101c95760003660031901126101c957604051600060065490600182811c918184169182156113e8575b60209485851084146113d25785879486865291826000146113b2575050600114611372575b5061135a92500383611ad6565b61136e604051928284938452830190611af8565b0390f35b849150600660005281600020906000915b85831061139a57505061135a93508201018561134d565b80548389018501528794508693909201918101611383565b60ff19168582015261135a95151560051b850101925087915061134d9050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611328565b346101c95760003660031901126101c9576000546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957611434611c17565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101c95760203660031901126101c9576020611497611492611b38565b6132ee565b604051908152f35b346101c95760203660031901126101c9576004358015158091036101c9576114c5611c17565b60ff8019600a5416911617600a55600080f35b346101c95760203660031901126101c9576001600160a01b036114f9611b38565b166000526012602052602060ff604060002054166040519015158152f35b346101c95760003660031901126101c957602060ff600a54166040519015158152f35b346101c95760203660031901126101c9576001600160a01b0361155b611b38565b166000526013602052602060ff604060002054166040519015158152f35b346101c9576020806003193601126101c957611593611b38565b9061159c611c17565b6001600160a01b0382166000818152600f8352604090205460ff16611629579081600f92600052600d8252604060002054611607575b50526040600020805460ff1916600117905560105490600160401b82101561046a5761044282600161001b9401601055611b64565b611615604060002054611cab565b90600052600e8252604060002055836115d2565b60405162461bcd60e51b815260048101839052601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606490fd5b346101c95760003660031901126101c957602060405161dead8152f35b346101c9576020806003193601126101c9576116a5611b38565b906116ae611c17565b60018060a01b038092169081600052600f9182825260ff60406000205416156117955760005b60108054908183101561001b578691846116ed85611b64565b949054600395861b1c161461170d5750505061170890611c6f565b6116d4565b60009795929796939491961994858201918211610d4e576104428761173461174194611b64565b9054908c1b1c1691611b64565b600052600e81526000604081205552604060002060ff1981541690558254801561177f57019261177084611b64565b8154921b9290921b1916905555005b634e487b7160e01b600052603160045260246000fd5b60405162461bcd60e51b81526004810183905260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b6044820152606490fd5b346101c95760003660031901126101c9576015546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957602060ff60055416604051908152f35b346101c95760003660031901126101c9576016546040516001600160a01b039091168152602090f35b346101c95760203660031901126101c9576020611497600435611cab565b346101c95760003660031901126101c9576001546040516001600160a01b039091168152602090f35b346101c95760603660031901126101c9576112756118aa611b38565b6118b2611b4e565b6044359160018060a01b038116806000526011602052604060002033600052602052600019604060002054036118e9575b50611e35565b6000526011602052604060002033600052602052604060002061190d848254611c7e565b9055846118e3565b346101c95760003660031901126101c9576020600354604051908152f35b346101c95760003660031901126101c9576020604051619ab08152f35b346101c95760403660031901126101c957611969611b38565b60243533600052601160205260406000209160018060a01b03169182600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101c95760003660031901126101c957604051600060045490600182811c91818416918215611a65575b60209485851084146113d25785879486865291826000146113b2575050600114611a25575061135a92500383611ad6565b849150600460005281600020906000915b858310611a4d57505061135a93508201018561134d565b80548389018501528794508693909201918101611a36565b92607f16926119f4565b346101c95760003660031901126101c9576020906009548152f35b67ffffffffffffffff811161046a57604052565b6040810190811067ffffffffffffffff82111761046a57604052565b6060810190811067ffffffffffffffff82111761046a57604052565b90601f8019910116810190811067ffffffffffffffff82111761046a57604052565b919082519283825260005b848110611b24575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611b03565b600435906001600160a01b03821682036101c957565b602435906001600160a01b03821682036101c957565b601054811015611b7f57601060005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601454811015611b7f57601460005260206000200190600090565b9080601f830112156101c95781359067ffffffffffffffff821161046a578160051b60405193602093611be585840187611ad6565b855283808601928201019283116101c9578301905b828210611c08575050505090565b81358152908301908301611bfa565b6000546001600160a01b03163303611c2b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000198114610d4e5760010190565b91908203918211610d4e57565b8115611c95570490565b634e487b7160e01b600052601260045260246000fd5b600b548111611ccc57611cc990611cc3611cc3611d24565b90611c8b565b90565b60405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608490fd5b600b54908160038054938491600090601054905b818310611d5f57505050611d4c8282611c8b565b8310611d585750509190565b9350919050565b9091959496611d6d87611b64565b989060018060a01b03998a915490851b1c16600052600d986020918a835260409a818c60002054118015611e10575b611e0157611df49383611ddf611dd98e9f958f9e9f95611dfa9a988c611dc3600e99611b64565b9054911b1c166000528552866000205490611c7e565b9c611b64565b905490891b1c16600052526000205490611c7e565b97611c6f565b9190611d38565b50959950959750505050505050565b5082611e1b8c611b64565b905490881b1c16600052600e8452848c6000205411611d9c565b6001600160a01b039081169182156123d5571691821561239557801561233e57611e5e306132ee565b600954111580612332575b80612319575b80612309575b6122af575b600092828452602092601384526000805160206135318339815191528460ff9483826040998a898183205416158061229d575b15998a612253575b848352600f845280828420541680612243575b15612039575093611f50611f6592611f2787691d08195e18db1d59195960b21b600e995191611ef683611aba565b602a83527f5472616e7366657272696e672066726f6d206578636c7564656420746f206e6f898401528201526133a4565b8d611f7c611f348561245a565b9c9596949e939f929d919a909b848b52838352898b2054611c7e565b9289525285872055600d8d5284862054611c7e565b8d8552600d8c52838520558d84528284205461241a565b918c8152600d8a5220558061202a575b508061201b575b508061200c575b5080611ffc575b50508751908152a35b611fb2575050565b73466565732073657420746f2070726576696f757360601b611fe5925191611fd983611a9e565b601483528201526133a4565b60075461ffff8160101c169061ffff191617600755565b61200591612427565b3880611fa1565b612015906125b6565b38611f9a565b6120249061252b565b38611f93565b612033906125b6565b38611f8c565b848394929593528085852054161580612234575b156121765750509082916120b46120cf956120af612107965161206f81611aba565b602a81527f5472616e7366657272696e672066726f6d206e6f74206578636c7564656420748a820152691bc8195e18db1d59195960b21b878201526133a4565b61245a565b98959299949a939b919690978652600d8d5284862054611c7e565b8d8552600d8c52838520558d8452600e8b528d6120ef8b8587205461241a565b908552600e8c5283852055600d8b528284205461241a565b918c8152600d8a52205580612167575b5080612158575b5080612149575b5080612139575b50508751908152a3611faa565b61214291612427565b388061212c565b612152906125b6565b38612125565b6121619061252b565b3861211e565b612170906125b6565b38612117565b828493959294528082842054169081612224575b50156121e35793611f506120cf926121d6600e97516121a881611a9e565b601f81527f5472616e7366657272696e672066726f6d20626f7468206578636c7564656400878201526133a4565b8d612107611f348561245a565b9150612107926120b4611f65956120af85516121fe81611a9e565b6015815274151c985b9cd9995c9c9a5b99c81cdd185b99185c99605a1b8a8201526133a4565b905089835281832054163861218a565b5089845280858520541661204d565b5089835280828420541615611ec8565b60075463ffff00008160101b169063ffffffff191617600755612298825161227a81611a9e565b600d81526c0466565732073657420746f203609c1b868201526133a4565b611eb5565b50508781528a89818320541615611ead565b6122df6040516122be81611a9e565b600f81526e50726f63657373696e67206665657360881b60208201526133a4565b6016805460ff60a01b19908116600160a01b179091556122fd61271b565b60165416601655611e7a565b5060ff60165460a01c1615611e75565b5081600052601260205260ff6040600020541615611e6f565b5060ff600a5416611e69565b60405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608490fd5b60405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b91908201809211610d4e57565b9061243761244292600b54611c7e565b600b55600c5461241a565b600c55565b81810292918115918404141715610d4e57565b906127109161ffff9280612472856007541684612447565b04600854916124b78161248a888660301c1685612447565b04928261249c898760101c1683612447565b0497836124ae828860201c1684612447565b04951690612447565b04946124d4866124cf856124cf856124cf888b611c7e565b611c7e565b926124ea6124e3611cc3611d24565b8096612447565b96612528886124cf6124fc8988612447565b986124cf61250a8289612447565b6124cf8c61252261251b868c612447565b958a612447565b96611c7e565b96565b61253f612539611cc3611d24565b82612447565b9060008051602061353183398151915261dead92600090848252602091600d835261256f6040928383205461241a565b868252600d845282822055600f835260ff8282205416612594575b50519283523392a3565b600e8352816125a6868284205461241a565b91878152600e855220553861258a565b6125c4612539611cc3611d24565b90600091308352602092600d84526125e16040928383205461241a565b308252600d855282822055600f845260ff8282205416612617575b505190815260008051602061353183398151915230923392a3565b600e845281612629848284205461241a565b91308152600e86522055386125fc565b805115611b7f5760200190565b805160011015611b7f5760400190565b8051821015611b7f5760209160051b010190565b908160209103126101c957516001600160a01b03811681036101c95790565b90815180825260208080930193019160005b8281106126a9575050505090565b83516001600160a01b03168552938101939281019260010161269b565b906080926126ec919695949683526000602084015260a0604084015260a0830190612689565b6001600160a01b0390951660608201520152565b908160609103126101c9578051916040602083015192015190565b612724306132ee565b9060009180156132e95760085461ffff808216816127428286612447565b9360101c16018181116132d5579161275f91612793931690611c8b565b80926124cf8260405161277181611a9e565b601081526f189d5e505b99109d5c9b905b5bdd5b9d60821b60208201526133f3565b906127c5826040516127a481611a9e565b600f81526e1b1a5c5d5a591a5d1e505b5bdd5b9d608a1b60208201526133f3565b8061316a575b50600254619ab0810180911161315657421015612f3c575b80151580612f31575b6127f557509050565b60145461280191611c8b565b6128308160405161281181611a9e565b600d81526c30b6b7bab73a2832b92830b4b960991b60208201526133f3565b825b601454811015612f2b5761284581611b95565b60018060a01b0391549060031b1c16906128808260405161286581611a9e565b60098152683830b4b92a37b5b2b760b91b6020820152613438565b6128b060405161288f81611a9e565b600a8152691a185b19905b5bdd5b9d60b21b60208201528460011c906133f3565b60155460405163ef8ef56f60e01b81526001600160a01b0390911690602081600481855afa908115612b80578791612f0c575b506001600160a01b03168303612b8b5750604051915061290282611aba565b6002825260403660208401373061291883612639565b5260155460405163ef8ef56f60e01b81526001600160a01b039091169290602081600481875afa908115612b80578791612b61575b5061295782612646565b6001600160a01b0390911690526040516129a29061297481611a9e565b60178152760e6eec2e0e0d2dcce40d0c2d8cc82dadeeadce8408aa89604b1b60208201528560011c906133f3565b610e10420192834211612b4d57908187923b15612b495784839187836129e4956040519687958694859363791ac94760e01b8552309160011c600486016126c6565b03925af18015612b3e57612b26575b5050612a31604051612a0481611a9e565b60168152750e6eec2e0e0cac840d0c2d8cc82dadeeadce8408aa8960531b60208201528460011c906133f3565b612a66604051612a4081611a9e565b60148152730c2c8c8d2dcce40d8d2e2ead2c8d2e8f2408aa8960631b60208201526133a4565b60018060a01b036015541647906040519363f305d71960e01b85523060048601528560011c602486015287604486015287606486015261dead608486015260a48501528360c48160609485945af1928315612b1b57612afa93612aff575b5050610d15604051612ad581611a9e565b60138152720c2c8c8cac840d8d2e2ead2c8d2e8f2408aa89606b1b60208201526133a4565b612832565b81612b1592903d10610d4757610d388183611ad6565b50612ac4565b6040513d88823e3d90fd5b612b2f90611a8a565b612b3a5784386129f3565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b612b7a915060203d6020116104a6576104988183611ad6565b3861294d565b6040513d89823e3d90fd5b604051612b9781611aba565b60028152604036602083013730612bad82612639565b5283612bb882612646565b52612bf2604051612bc881611a9e565b60138152721cddd85c1c1a5b99c81a185b19905b5bdd5b9d606a1b60208201528660011c906133f3565b6001546001600160a01b03169042610e10810110612ef85790829188933b15612ef457612c4492849283899360405196879586948593635c11d79560e01b8552610e1042019260011c600486016126c6565b03925af18015612b3e57612ee0575b5050612c8d604051612c6481611a9e565b60128152711cddd85c1c1959081a185b19905b5bdd5b9d60721b60208201528460011c906133f3565b60015460405186916001600160a01b031690612ce390612cac81611a9e565b602081527f7472616e73666572696e672066726f6d2072656c6179657220746f207468697360208201528660011c908330916134d3565b803b15612edc578180916024604051809481936373b6656f60e01b83528960048401525af18015612b3e57612ec8575b5050612d3d604051612d2481611a9e565b60078152661c995b185e595960ca1b60208201526133a4565b6040516370a0823160e01b81523060048201528590602081602481875afa908115612b3e578291612e93575b50612d9c81604051612d7a81611a9e565b601081526f70616972546f6b656e42616c616e636560801b60208201526133f3565b612dd381604051612dac81611a9e565b601081526f616464696e67206c697175696469747960801b60208201528760011c90613488565b60018060a01b03601554166040519462e8e33760e81b865230600487015260248601528560011c60448601528160648601528260848601528260a486015261dead60c4860152610e10420160e4860152846101048160609586945af1918215612b8057612afa94610d1593612e77575b5050604051612e5181611a9e565b600f81526e6164646564206c697175696469747960881b60208201528560011c90613488565b81612e8d92903d10610d4757610d388183611ad6565b50612e43565b9150506020813d602011612ec0575b81612eaf60209383611ad6565b810103126101c95785905138612d69565b3d9150612ea2565b612ed190611a8a565b612b3a578438612d13565b5080fd5b612ee990611a8a565b612b3a578438612c53565b8380fd5b634e487b7160e01b88526011600452602488fd5b612f25915060203d6020116104a6576104988183611ad6565b386128e3565b50509050565b5060145415156127ec565b612f6f604051612f4b81611a9e565b6012815271627579696e6720616e64206275726e696e6760701b60208201526133a4565b4780612f7c575b506127e3565b80612faa600a92604051612f8f81611a9e565b8481526965746842616c616e636560b01b60208201526133f3565b048015612f7657612fd981604051612fc181611a9e565b6006815265627579696e6760d01b60208201526133f3565b604051612fe581611aba565b60028152604036602083013760155460405163ef8ef56f60e01b81526001600160a01b0391821691602082600481865afa91821561314b57889261312a575b5061302e84612639565b911690523061303c83612646565b526130718360405161304d81611a9e565b60128152711cddd85c1c1a5b99c8189d5e505b5bdd5b9d60721b60208201526133f3565b610e10420191824211612b4d5790869291813b15612ef45783916130ba918660405180968195829463b6f9de9560e01b8452886004850152608060248501526084840190612689565b9061dead6044840152606483015203925af18015612b3e57613116575b505061311090426002556040516130ed81611a9e565b6011815270189bdd59da1d08185b9908189d5c9b9959607a1b60208201526133f3565b38612f76565b61311f90611a8a565b612ef45783386130d7565b61314491925060203d6020116104a6576104988183611ad6565b9038613024565b6040513d8a823e3d90fd5b634e487b7160e01b84526011600452602484fd5b60405161317681611aba565b6002815260403660208301373061318c82612639565b5260155460405163ef8ef56f60e01b81526001600160a01b0391821691602082600481865afa91821561314b5788926132b4575b506131ca84612646565b91169052613209836040516131de81611a9e565b60198152781cddd85c1c1a5b99c8189d5e505b99109d5c9b905b5bdd5b9d603a1b60208201526133f3565b610e10420190814211612b4d57908187923b15612b4957613244938360405180968195829463791ac94760e01b845230908b600486016126c6565b03925af180156132a957613294575b5061328e9060405161326481611a9e565b60188152771cddd85c1c195908189d5e505b99109d5c9b905b5bdd5b9d60421b60208201526133f3565b386127cb565b936132a261328e9295611a8a565b9390613253565b6040513d87823e3d90fd5b6132ce91925060203d6020116104a6576104988183611ad6565b90386131c0565b634e487b7160e01b86526011600452602486fd5b509050565b6001600160a01b03166000908152600f602052604090205460ff1661332057600d602052611cc9604060002054611cab565b600e60205260406000205490565b1561333557565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b908160209103126101c9575180151581036101c95790565b6001600160a01b0391821681529116602082015260400190565b600080916040516133e0816133d2602082019463104c13eb60e21b8652602060248401526044830190611af8565b03601f198101835282611ad6565b51906a636f6e736f6c652e6c6f675afa50565b6000919082916133e060405180926134246020830195632d839cb360e21b8752604060248501526064840190611af8565b90604483015203601f198101835282611ad6565b6000919082916133e06040518092613469602083019563319af33360e01b8752604060248501526064840190611af8565b6001600160a01b0391909116604483015203601f198101835282611ad6565b600092916133e084936040519283916134ba602084019663ca47c4eb60e01b8852606060248601526084850190611af8565b916044840152606483015203601f198101835282611ad6565b90926133e060009485946040519384926135066020850197638ef3f39960e01b89526080602487015260a4860190611af8565b6001600160a01b03918216604486015292166064840152608483015203601f198101835282611ad656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220428cb63ef881da2b5b0d4d5992c5962573205d5ac0303e6b4a8b5466a50adbe264736f6c634300081100338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f00000000000000000000000000000000000000005a790ea17ace06a96000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000006830000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000002d3c8750bd670354b00000000000000000000000000000052957c71f8b873f62ca939aceb75e86bfbb77fee000000000000000000000000000000000000000000000000000000000000000944756d624d6f6e65790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444554d420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000cc78a0acdf847a2c1714d2a925bb4477df5d48a60000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb390000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab

Deployed ByteCode

0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b66714611a6f5750806306fdde03146119c9578063095ea7b3146119505780631141ece41461193357806318160ddd1461191557806323b872dd1461188e5780632483e715146118655780632d838119146118475780632dd310001461181e578063313ce567146117fd57806332fe7b26146117d45780633685d4191461168b5780634e6fd6c41461166e57806352390c02146115795780635342acb41461153a57806355b6ed5c146102e55780635c38693d146115175780635c9a05b8146114d857806365a807df1461149f57806370a0823114611474578063715018a61461141b5780638da5cb5b146113f257806395d89b41146112fd5780639af1d35a146112db578063a4e6668f14611280578063a9059cbb1461124f578063aaf5eb6814611232578063b068d56e146111ee578063b3e03f74146104e6578063c98e82181461035c578063d830678614610336578063dd62ed3e146102e5578063ef422a181461028f578063f2fde38b146101ce5763f99d7b9b146101ab573861000f565b346101c95760003660031901126101c9576020600254604051908152f35b600080fd5b346101c95760203660031901126101c9576101e7611b38565b6101ef611c17565b6001600160a01b0390811690811561023b576000548260018060a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101c95760403660031901126101c9576102a8611b38565b602435908115158092036101c9576102be611c17565b60018060a01b0316600052601360205260406000209060ff80198354169116179055600080f35b346101c95760403660031901126101c9576102fe611b38565b610306611b4e565b9060018060a01b038091166000526011602052604060002091166000526020526020604060002054604051908152f35b346101c95760003660031901126101c957602060ff60165460a01c166040519015158152f35b346101c9576020806003193601126101c957610376611b38565b9061037f611c17565b6001600160a01b039060008184841661039981151561332e565b60448560155416604051948593849263095ea7b360e01b84526004840152811960248401525af180156104ad576104b9575b508160165416918160405180946364e329cb60e11b8252816000816103f48a306004840161338a565b03925af180156104ad57601293600091610480575b5016600052526040600020600160ff1982541617905560145490600160401b82101561046a5761044282600161001b9401601455611b95565b9080546001600160a01b0360039390931b83811b80199092169390941690931b909216179055565b634e487b7160e01b600052604160045260246000fd5b6104a09150833d85116104a6575b6104988183611ad6565b81019061266a565b85610409565b503d61048e565b6040513d6000823e3d90fd5b6104d890823d84116104df575b6104d08183611ad6565b810190613372565b50836103cb565b503d6104c6565b60603660031901126101c95767ffffffffffffffff6024358181116101c957610513903690600401611bb0565b906044359081116101c95761052c903690600401611bb0565b610534611c17565b601454825180821490816111e3575b50156111a55761057c9060405161055981611a9e565b60118152700e0c2d2e4a8ded6cadce65cd8cadccee8d607b1b60208201526133f3565b6105b2825160405161058d81611a9e565b60138152720e8ded6cadc82dadeeadce8e65cd8cadccee8d606b1b60208201526133f3565b6105ec81516040516105c381611a9e565b60178152760e0c2d2e4a8ded6cadc82dadeeadce8e65cd8cadccee8d604b1b60208201526133f3565b60015b601454811015610ee25761064561060582611b95565b9054906040519161061583611a9e565b600d83526c70616972546f6b656e735b695d60981b602084015260039190911b1c6001600160a01b031690613438565b61066a61065182611b95565b905460039190911b1c6001600160a01b0316151561332e565b6016546106b5906020906001600160a01b031661068684611b95565b905460405163e6a4390560e01b815294859392849283929160031b1c6001600160a01b0316306004840161338a565b03915afa9081156104ad57600091610ec3575b506106ef816040516106d981611a9e565b60048152633830b4b960e11b6020820152613438565b6001600160a01b03811615610e885760018060a01b038116600052601260205260008061077361078960ff6040842054166040519061072d82611a9e565b601582527469734c6971756964697479506169725b706169725d60581b602083015260405193849263c3b5563560e01b6020850152604060248501526064840190611af8565b901515604483015203601f198101835282611ad6565b6020815191016a636f6e736f6c652e6c6f675afa506001600160a01b031660009081526012602052604090205460ff1615610e43576107c88184612656565b51151580610e30575b15610deb576108116107e38285612656565b516040516107f081611a9e565b600f81526e746f6b656e416d6f756e74735b695d60881b60208201526133f3565b61085061081e8284612656565b5160405161082b81611a9e565b601381527270616972546f6b656e416d6f756e74735b695d60681b60208201526133f3565b61092161085d8285612656565b516040519061086b82611aba565b6108bd602f918284527f5472616e7366657272696e6720544849535f544f4b454e2066726f6d206d736760208501526e2e73656e64657220746f207468697360881b93846040820152309033906134d3565b6108d26108ca8588612656565b513033611e35565b6108dc8486612656565b5191604051916108eb83611aba565b82527f5472616e7366657272696e6720504149525f544f4b454e2066726f6d206d736760208301526040820152309033906134d3565b6000602061092e83611b95565b905460039190911b1c6001600160a01b0316606461094c8587612656565b5160405194859384926323b872dd60e01b845233600485015230602485015260448401525af180156104ad57610dcc575b506109d461098a82611b95565b905460405160039290921b1c6001600160a01b0316906109a981611a9e565b601981527820b23234b733903634b8bab4b234ba3c903337b9103830b4b960391b6020820152613438565b30600052601160205260406000209060018060a01b03601554169182600052602052610a30604060002054604051610a0b81611a9e565b60138152721d1a1a5cc81d1bdad95b88185c1c1c9bdd985b606a1b60208201526133f3565b610a6c610a3c306132ee565b604051610a4881611a9e565b60128152717468697320746f6b656e2062616c616e636560701b60208201526133f3565b610aa9610a798286612656565b51604051610a8681611a9e565b60118152701d1a1a5cc81d1bdad95b88185b5bdd5b9d607a1b60208201526133f3565b610ab281611b95565b9054604051636eb1769f60e11b815291602091839160031b1c6001600160a01b03168180610ae488306004840161338a565b03915afa80156104ad57600090610d98575b610b2c9150604051610b0781611a9e565b60138152721c185a5c881d1bdad95b88185c1c1c9bdd985b606a1b60208201526133f3565b60246020610b3983611b95565b90546040516370a0823160e01b81523060048201529384929091839160031b1c6001600160a01b03165afa80156104ad57600090610d64575b610ba79150604051610b8381611a9e565b60128152717061697220746f6b656e2062616c616e636560701b60208201526133f3565b610be4610bb48285612656565b51604051610bc181611a9e565b60118152701c185a5c881d1bdad95b88185b5bdd5b9d607a1b60208201526133f3565b610bed81611b95565b905460039190911b1c6001600160a01b0316610c098286612656565b51610c148386612656565b5193610c208488612656565b5192605f918483810204831485151715610d4e57610c3e8689612656565b51908184810204841482151715610d4e57610e1042014211610d4e57606484600093826101049760609a6040519d8e9b8c9a62e8e33760e81b8c523060048d015260248c015260448b0152838a015202046084870152020460a484015261dead60c4840152610e10420160e48401525af19182156104ad57610d1a92610d1f575b50610d15610ccc82611b95565b905460405160039290921b1c6001600160a01b031690610ceb81611a9e565b601881527720b23232b2103634b8bab4b234ba3c903337b9103830b4b960411b6020820152613438565b611c6f565b6105ef565b610d409060603d606011610d47575b610d388183611ad6565b810190612700565b5050610cbf565b503d610d2e565b634e487b7160e01b600052601160045260246000fd5b506020813d602011610d90575b81610d7e60209383611ad6565b810103126101c957610ba79051610b72565b3d9150610d71565b506020813d602011610dc4575b81610db260209383611ad6565b810103126101c957610b2c9051610af6565b3d9150610da5565b610de49060203d6020116104df576104d08183611ad6565b508361097d565b60405162461bcd60e51b815260206004820152601e60248201527f416d6f756e7473206d7573742062652067726561746572207468616e203000006044820152606490fd5b50610e3b8183612656565b5115156107d1565b60405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527214185a5c88191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b610edc915060203d6020116104a6576104988183611ad6565b846106c8565b60043580156111545734156110fc5760165460155460405163ef8ef56f60e01b81526001600160a01b03928316916020908290600490829087165afa80156104ad57610f50926020926000926110dd575b50604051808095819463e6a4390560e01b8352306004840161338a565b03915afa80156104ad5782916000916110be575b5016801561107957600052601260205260ff604060002054161561102557610f8d823033611e35565b60155416605f8202828104605f03610d4e57605f3402348104605f03610d4e57610e1042014211610d4e576064936060938560c493604051978896879563f305d71960e01b8752306004880152602487015204604485015204606483015261dead6084830152610e10420160a483015234905af180156104ad5761100d57005b61001b9060603d606011610d4757610d388183611ad6565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420612072656769737465726564206e6174697665206c697175696469746044820152653c903830b4b960d11b6064820152608490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4e6174697665207061697220646f6573206e6f742065786973740000000000006044820152606490fd5b6110d7915060203d6020116104a6576104988183611ad6565b84610f64565b6110f5919250833d85116104a6576104988183611ad6565b9086610f33565b60405162461bcd60e51b815260206004820152602a60248201527f4e617469766520746f6b656e20616d6f756e74206d75737420626520677265616044820152690746572207468616e20360b41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606490fd5b905082511484610543565b346101c95760003660031901126101c95760806008546040519061ffff908181168352818160101c166020840152818160201c16604084015260301c166060820152f35b346101c95760003660031901126101c95760206040516127108152f35b346101c95760403660031901126101c95761127561126b611b38565b6024359033611e35565b602060405160018152f35b346101c95760203660031901126101c9576004356014548110156101c95760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957602061ffff60075416604051908152f35b346101c95760003660031901126101c957604051600060065490600182811c918184169182156113e8575b60209485851084146113d25785879486865291826000146113b2575050600114611372575b5061135a92500383611ad6565b61136e604051928284938452830190611af8565b0390f35b849150600660005281600020906000915b85831061139a57505061135a93508201018561134d565b80548389018501528794508693909201918101611383565b60ff19168582015261135a95151560051b850101925087915061134d9050565b634e487b7160e01b600052602260045260246000fd5b92607f1692611328565b346101c95760003660031901126101c9576000546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957611434611c17565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101c95760203660031901126101c9576020611497611492611b38565b6132ee565b604051908152f35b346101c95760203660031901126101c9576004358015158091036101c9576114c5611c17565b60ff8019600a5416911617600a55600080f35b346101c95760203660031901126101c9576001600160a01b036114f9611b38565b166000526012602052602060ff604060002054166040519015158152f35b346101c95760003660031901126101c957602060ff600a54166040519015158152f35b346101c95760203660031901126101c9576001600160a01b0361155b611b38565b166000526013602052602060ff604060002054166040519015158152f35b346101c9576020806003193601126101c957611593611b38565b9061159c611c17565b6001600160a01b0382166000818152600f8352604090205460ff16611629579081600f92600052600d8252604060002054611607575b50526040600020805460ff1916600117905560105490600160401b82101561046a5761044282600161001b9401601055611b64565b611615604060002054611cab565b90600052600e8252604060002055836115d2565b60405162461bcd60e51b815260048101839052601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606490fd5b346101c95760003660031901126101c957602060405161dead8152f35b346101c9576020806003193601126101c9576116a5611b38565b906116ae611c17565b60018060a01b038092169081600052600f9182825260ff60406000205416156117955760005b60108054908183101561001b578691846116ed85611b64565b949054600395861b1c161461170d5750505061170890611c6f565b6116d4565b60009795929796939491961994858201918211610d4e576104428761173461174194611b64565b9054908c1b1c1691611b64565b600052600e81526000604081205552604060002060ff1981541690558254801561177f57019261177084611b64565b8154921b9290921b1916905555005b634e487b7160e01b600052603160045260246000fd5b60405162461bcd60e51b81526004810183905260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b6044820152606490fd5b346101c95760003660031901126101c9576015546040516001600160a01b039091168152602090f35b346101c95760003660031901126101c957602060ff60055416604051908152f35b346101c95760003660031901126101c9576016546040516001600160a01b039091168152602090f35b346101c95760203660031901126101c9576020611497600435611cab565b346101c95760003660031901126101c9576001546040516001600160a01b039091168152602090f35b346101c95760603660031901126101c9576112756118aa611b38565b6118b2611b4e565b6044359160018060a01b038116806000526011602052604060002033600052602052600019604060002054036118e9575b50611e35565b6000526011602052604060002033600052602052604060002061190d848254611c7e565b9055846118e3565b346101c95760003660031901126101c9576020600354604051908152f35b346101c95760003660031901126101c9576020604051619ab08152f35b346101c95760403660031901126101c957611969611b38565b60243533600052601160205260406000209160018060a01b03169182600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101c95760003660031901126101c957604051600060045490600182811c91818416918215611a65575b60209485851084146113d25785879486865291826000146113b2575050600114611a25575061135a92500383611ad6565b849150600460005281600020906000915b858310611a4d57505061135a93508201018561134d565b80548389018501528794508693909201918101611a36565b92607f16926119f4565b346101c95760003660031901126101c9576020906009548152f35b67ffffffffffffffff811161046a57604052565b6040810190811067ffffffffffffffff82111761046a57604052565b6060810190811067ffffffffffffffff82111761046a57604052565b90601f8019910116810190811067ffffffffffffffff82111761046a57604052565b919082519283825260005b848110611b24575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611b03565b600435906001600160a01b03821682036101c957565b602435906001600160a01b03821682036101c957565b601054811015611b7f57601060005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601454811015611b7f57601460005260206000200190600090565b9080601f830112156101c95781359067ffffffffffffffff821161046a578160051b60405193602093611be585840187611ad6565b855283808601928201019283116101c9578301905b828210611c08575050505090565b81358152908301908301611bfa565b6000546001600160a01b03163303611c2b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000198114610d4e5760010190565b91908203918211610d4e57565b8115611c95570490565b634e487b7160e01b600052601260045260246000fd5b600b548111611ccc57611cc990611cc3611cc3611d24565b90611c8b565b90565b60405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608490fd5b600b54908160038054938491600090601054905b818310611d5f57505050611d4c8282611c8b565b8310611d585750509190565b9350919050565b9091959496611d6d87611b64565b989060018060a01b03998a915490851b1c16600052600d986020918a835260409a818c60002054118015611e10575b611e0157611df49383611ddf611dd98e9f958f9e9f95611dfa9a988c611dc3600e99611b64565b9054911b1c166000528552866000205490611c7e565b9c611b64565b905490891b1c16600052526000205490611c7e565b97611c6f565b9190611d38565b50959950959750505050505050565b5082611e1b8c611b64565b905490881b1c16600052600e8452848c6000205411611d9c565b6001600160a01b039081169182156123d5571691821561239557801561233e57611e5e306132ee565b600954111580612332575b80612319575b80612309575b6122af575b600092828452602092601384526000805160206135318339815191528460ff9483826040998a898183205416158061229d575b15998a612253575b848352600f845280828420541680612243575b15612039575093611f50611f6592611f2787691d08195e18db1d59195960b21b600e995191611ef683611aba565b602a83527f5472616e7366657272696e672066726f6d206578636c7564656420746f206e6f898401528201526133a4565b8d611f7c611f348561245a565b9c9596949e939f929d919a909b848b52838352898b2054611c7e565b9289525285872055600d8d5284862054611c7e565b8d8552600d8c52838520558d84528284205461241a565b918c8152600d8a5220558061202a575b508061201b575b508061200c575b5080611ffc575b50508751908152a35b611fb2575050565b73466565732073657420746f2070726576696f757360601b611fe5925191611fd983611a9e565b601483528201526133a4565b60075461ffff8160101c169061ffff191617600755565b61200591612427565b3880611fa1565b612015906125b6565b38611f9a565b6120249061252b565b38611f93565b612033906125b6565b38611f8c565b848394929593528085852054161580612234575b156121765750509082916120b46120cf956120af612107965161206f81611aba565b602a81527f5472616e7366657272696e672066726f6d206e6f74206578636c7564656420748a820152691bc8195e18db1d59195960b21b878201526133a4565b61245a565b98959299949a939b919690978652600d8d5284862054611c7e565b8d8552600d8c52838520558d8452600e8b528d6120ef8b8587205461241a565b908552600e8c5283852055600d8b528284205461241a565b918c8152600d8a52205580612167575b5080612158575b5080612149575b5080612139575b50508751908152a3611faa565b61214291612427565b388061212c565b612152906125b6565b38612125565b6121619061252b565b3861211e565b612170906125b6565b38612117565b828493959294528082842054169081612224575b50156121e35793611f506120cf926121d6600e97516121a881611a9e565b601f81527f5472616e7366657272696e672066726f6d20626f7468206578636c7564656400878201526133a4565b8d612107611f348561245a565b9150612107926120b4611f65956120af85516121fe81611a9e565b6015815274151c985b9cd9995c9c9a5b99c81cdd185b99185c99605a1b8a8201526133a4565b905089835281832054163861218a565b5089845280858520541661204d565b5089835280828420541615611ec8565b60075463ffff00008160101b169063ffffffff191617600755612298825161227a81611a9e565b600d81526c0466565732073657420746f203609c1b868201526133a4565b611eb5565b50508781528a89818320541615611ead565b6122df6040516122be81611a9e565b600f81526e50726f63657373696e67206665657360881b60208201526133a4565b6016805460ff60a01b19908116600160a01b179091556122fd61271b565b60165416601655611e7a565b5060ff60165460a01c1615611e75565b5081600052601260205260ff6040600020541615611e6f565b5060ff600a5416611e69565b60405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608490fd5b60405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b91908201809211610d4e57565b9061243761244292600b54611c7e565b600b55600c5461241a565b600c55565b81810292918115918404141715610d4e57565b906127109161ffff9280612472856007541684612447565b04600854916124b78161248a888660301c1685612447565b04928261249c898760101c1683612447565b0497836124ae828860201c1684612447565b04951690612447565b04946124d4866124cf856124cf856124cf888b611c7e565b611c7e565b926124ea6124e3611cc3611d24565b8096612447565b96612528886124cf6124fc8988612447565b986124cf61250a8289612447565b6124cf8c61252261251b868c612447565b958a612447565b96611c7e565b96565b61253f612539611cc3611d24565b82612447565b9060008051602061353183398151915261dead92600090848252602091600d835261256f6040928383205461241a565b868252600d845282822055600f835260ff8282205416612594575b50519283523392a3565b600e8352816125a6868284205461241a565b91878152600e855220553861258a565b6125c4612539611cc3611d24565b90600091308352602092600d84526125e16040928383205461241a565b308252600d855282822055600f845260ff8282205416612617575b505190815260008051602061353183398151915230923392a3565b600e845281612629848284205461241a565b91308152600e86522055386125fc565b805115611b7f5760200190565b805160011015611b7f5760400190565b8051821015611b7f5760209160051b010190565b908160209103126101c957516001600160a01b03811681036101c95790565b90815180825260208080930193019160005b8281106126a9575050505090565b83516001600160a01b03168552938101939281019260010161269b565b906080926126ec919695949683526000602084015260a0604084015260a0830190612689565b6001600160a01b0390951660608201520152565b908160609103126101c9578051916040602083015192015190565b612724306132ee565b9060009180156132e95760085461ffff808216816127428286612447565b9360101c16018181116132d5579161275f91612793931690611c8b565b80926124cf8260405161277181611a9e565b601081526f189d5e505b99109d5c9b905b5bdd5b9d60821b60208201526133f3565b906127c5826040516127a481611a9e565b600f81526e1b1a5c5d5a591a5d1e505b5bdd5b9d608a1b60208201526133f3565b8061316a575b50600254619ab0810180911161315657421015612f3c575b80151580612f31575b6127f557509050565b60145461280191611c8b565b6128308160405161281181611a9e565b600d81526c30b6b7bab73a2832b92830b4b960991b60208201526133f3565b825b601454811015612f2b5761284581611b95565b60018060a01b0391549060031b1c16906128808260405161286581611a9e565b60098152683830b4b92a37b5b2b760b91b6020820152613438565b6128b060405161288f81611a9e565b600a8152691a185b19905b5bdd5b9d60b21b60208201528460011c906133f3565b60155460405163ef8ef56f60e01b81526001600160a01b0390911690602081600481855afa908115612b80578791612f0c575b506001600160a01b03168303612b8b5750604051915061290282611aba565b6002825260403660208401373061291883612639565b5260155460405163ef8ef56f60e01b81526001600160a01b039091169290602081600481875afa908115612b80578791612b61575b5061295782612646565b6001600160a01b0390911690526040516129a29061297481611a9e565b60178152760e6eec2e0e0d2dcce40d0c2d8cc82dadeeadce8408aa89604b1b60208201528560011c906133f3565b610e10420192834211612b4d57908187923b15612b495784839187836129e4956040519687958694859363791ac94760e01b8552309160011c600486016126c6565b03925af18015612b3e57612b26575b5050612a31604051612a0481611a9e565b60168152750e6eec2e0e0cac840d0c2d8cc82dadeeadce8408aa8960531b60208201528460011c906133f3565b612a66604051612a4081611a9e565b60148152730c2c8c8d2dcce40d8d2e2ead2c8d2e8f2408aa8960631b60208201526133a4565b60018060a01b036015541647906040519363f305d71960e01b85523060048601528560011c602486015287604486015287606486015261dead608486015260a48501528360c48160609485945af1928315612b1b57612afa93612aff575b5050610d15604051612ad581611a9e565b60138152720c2c8c8cac840d8d2e2ead2c8d2e8f2408aa89606b1b60208201526133a4565b612832565b81612b1592903d10610d4757610d388183611ad6565b50612ac4565b6040513d88823e3d90fd5b612b2f90611a8a565b612b3a5784386129f3565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b612b7a915060203d6020116104a6576104988183611ad6565b3861294d565b6040513d89823e3d90fd5b604051612b9781611aba565b60028152604036602083013730612bad82612639565b5283612bb882612646565b52612bf2604051612bc881611a9e565b60138152721cddd85c1c1a5b99c81a185b19905b5bdd5b9d606a1b60208201528660011c906133f3565b6001546001600160a01b03169042610e10810110612ef85790829188933b15612ef457612c4492849283899360405196879586948593635c11d79560e01b8552610e1042019260011c600486016126c6565b03925af18015612b3e57612ee0575b5050612c8d604051612c6481611a9e565b60128152711cddd85c1c1959081a185b19905b5bdd5b9d60721b60208201528460011c906133f3565b60015460405186916001600160a01b031690612ce390612cac81611a9e565b602081527f7472616e73666572696e672066726f6d2072656c6179657220746f207468697360208201528660011c908330916134d3565b803b15612edc578180916024604051809481936373b6656f60e01b83528960048401525af18015612b3e57612ec8575b5050612d3d604051612d2481611a9e565b60078152661c995b185e595960ca1b60208201526133a4565b6040516370a0823160e01b81523060048201528590602081602481875afa908115612b3e578291612e93575b50612d9c81604051612d7a81611a9e565b601081526f70616972546f6b656e42616c616e636560801b60208201526133f3565b612dd381604051612dac81611a9e565b601081526f616464696e67206c697175696469747960801b60208201528760011c90613488565b60018060a01b03601554166040519462e8e33760e81b865230600487015260248601528560011c60448601528160648601528260848601528260a486015261dead60c4860152610e10420160e4860152846101048160609586945af1918215612b8057612afa94610d1593612e77575b5050604051612e5181611a9e565b600f81526e6164646564206c697175696469747960881b60208201528560011c90613488565b81612e8d92903d10610d4757610d388183611ad6565b50612e43565b9150506020813d602011612ec0575b81612eaf60209383611ad6565b810103126101c95785905138612d69565b3d9150612ea2565b612ed190611a8a565b612b3a578438612d13565b5080fd5b612ee990611a8a565b612b3a578438612c53565b8380fd5b634e487b7160e01b88526011600452602488fd5b612f25915060203d6020116104a6576104988183611ad6565b386128e3565b50509050565b5060145415156127ec565b612f6f604051612f4b81611a9e565b6012815271627579696e6720616e64206275726e696e6760701b60208201526133a4565b4780612f7c575b506127e3565b80612faa600a92604051612f8f81611a9e565b8481526965746842616c616e636560b01b60208201526133f3565b048015612f7657612fd981604051612fc181611a9e565b6006815265627579696e6760d01b60208201526133f3565b604051612fe581611aba565b60028152604036602083013760155460405163ef8ef56f60e01b81526001600160a01b0391821691602082600481865afa91821561314b57889261312a575b5061302e84612639565b911690523061303c83612646565b526130718360405161304d81611a9e565b60128152711cddd85c1c1a5b99c8189d5e505b5bdd5b9d60721b60208201526133f3565b610e10420191824211612b4d5790869291813b15612ef45783916130ba918660405180968195829463b6f9de9560e01b8452886004850152608060248501526084840190612689565b9061dead6044840152606483015203925af18015612b3e57613116575b505061311090426002556040516130ed81611a9e565b6011815270189bdd59da1d08185b9908189d5c9b9959607a1b60208201526133f3565b38612f76565b61311f90611a8a565b612ef45783386130d7565b61314491925060203d6020116104a6576104988183611ad6565b9038613024565b6040513d8a823e3d90fd5b634e487b7160e01b84526011600452602484fd5b60405161317681611aba565b6002815260403660208301373061318c82612639565b5260155460405163ef8ef56f60e01b81526001600160a01b0391821691602082600481865afa91821561314b5788926132b4575b506131ca84612646565b91169052613209836040516131de81611a9e565b60198152781cddd85c1c1a5b99c8189d5e505b99109d5c9b905b5bdd5b9d603a1b60208201526133f3565b610e10420190814211612b4d57908187923b15612b4957613244938360405180968195829463791ac94760e01b845230908b600486016126c6565b03925af180156132a957613294575b5061328e9060405161326481611a9e565b60188152771cddd85c1c195908189d5e505b99109d5c9b905b5bdd5b9d60421b60208201526133f3565b386127cb565b936132a261328e9295611a8a565b9390613253565b6040513d87823e3d90fd5b6132ce91925060203d6020116104a6576104988183611ad6565b90386131c0565b634e487b7160e01b86526011600452602486fd5b509050565b6001600160a01b03166000908152600f602052604090205460ff1661332057600d602052611cc9604060002054611cab565b600e60205260406000205490565b1561333557565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b908160209103126101c9575180151581036101c95790565b6001600160a01b0391821681529116602082015260400190565b600080916040516133e0816133d2602082019463104c13eb60e21b8652602060248401526044830190611af8565b03601f198101835282611ad6565b51906a636f6e736f6c652e6c6f675afa50565b6000919082916133e060405180926134246020830195632d839cb360e21b8752604060248501526064840190611af8565b90604483015203601f198101835282611ad6565b6000919082916133e06040518092613469602083019563319af33360e01b8752604060248501526064840190611af8565b6001600160a01b0391909116604483015203601f198101835282611ad6565b600092916133e084936040519283916134ba602084019663ca47c4eb60e01b8852606060248601526084850190611af8565b916044840152606483015203601f198101835282611ad6565b90926133e060009485946040519384926135066020850197638ef3f39960e01b89526080602487015260a4860190611af8565b6001600160a01b03918216604486015292166064840152608483015203601f198101835282611ad656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220428cb63ef881da2b5b0d4d5992c5962573205d5ac0303e6b4a8b5466a50adbe264736f6c63430008110033