false
true
0

Contract Address Details

0x8357aA9070dc7d8d154Da74561CEc58cA30c41C3

Token
Dumb Amplifier (DAMP)
Creator
0xe90c5c–ef45fa at 0x6e7abe–4c5cf0
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
442 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26318049
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TokenAmp




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




Optimization runs
100
EVM Version
default




Verified at
2025-02-15T02:53:05.076475Z

Constructor Arguments

0x0000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000200000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000d0600000000000000000000000000000000000000000004d3419d96192e48b4000000000000000000000000000052957c71f8b873f62ca939aceb75e86bfbb77fee000000000000000000000000e65112d2f120c8cb23adc80d8e8122c0c8b7ff8d000000000000000000000000000000000000000000000000000000000000000e44756d6220416d706c6966696572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444414d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb390000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab
              

contracts/TokenAmp.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 TokenAmp 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);
    IRelayer public RELAYER;
    address public MAIN_TOKEN;

    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,
        address _mainToken
    ) {
        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;
        MAIN_TOKEN = _mainToken;
        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] = MAIN_TOKEN;

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

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

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

        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 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 TokenAmp.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":"address","name":"_mainToken","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":"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":"address","name":"","internalType":"address"}],"name":"MAIN_TOKEN","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":"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":"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

0x60808060405234620006e75762003fd9803803809162000020828562000c27565b8339810190808203916101c08312620006e757815160208301519093906001600160401b038111620006e757826200005a91850162000c4b565b9260408101519360ff85168503620006e75760608201516001600160401b038111620006e757846200008e91840162000c4b565b946200009d6080840162000cc2565b60a08401519096906001600160401b038111620006e75784019580601f88011215620006e7578651966001600160401b03881162000a58578760051b9060405198620000ed602084018b62000c27565b89526020808a0192820101928311620006e757602001905b82821062000c0c5750505060806200012060c0860162000cd7565b9560df190112620006e75760405190608082016001600160401b0381118382101762000a58576040526200015760e0860162000cd7565b825262000168610100860162000cd7565b60208301526200017c610120860162000cd7565b604083015262000190610140860162000cd7565b606083015261016085015192620001ba6101a0620001b2610180890162000cc2565b970162000cc2565b948960206000543360018060a01b0319821617600055600460405180948193339060018060a01b031660008051602062003f99833981519152600080a3600a805460ff19169055601580546001600160a01b0319166001600160a01b0392909216918217905563c45a015560e01b82525afa908115620006f55760009162000bca575b50601680546001600160a01b0319166001600160a01b03928316179055306000818152601160209081526040808320948f16808452948252918290206000199081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a360155460405163ef8ef56f60e01b815290602090829060049082906001600160a01b03165afa908115620006f55760009162000b83575b5060405163095ea7b360e01b81526001600160a01b03808d1660048301526000196024830152909160209183916044918391600091165af18015620006f55762000b5f575b508051906001600160401b03821162000a5857600454600181811c9116801562000b54575b602082101462000a3757601f811162000aee575b50602090601f831160011462000a7a5760ff9392916000918362000a6e575b50508160011b916000199060031b1c1916176004555b1660ff19600554161760055580519060018060401b03821162000a585760065490600182811c9216801562000a4d575b602083101462000a375781601f849311620009d6575b50602090601f831160011462000958576000926200094c575b50508160011b916000199060031b1c1916176006555b876003558715620009365787600019061980600b5533600052600d6020526040600020553060005260136020526040600020600160ff19825416179055336000526040600020600160ff1982541617905560018060a01b0387166000526040600020600160ff19825416179055600460018060a01b0360165416602060018060a01b03601554166040519384809263ef8ef56f60e01b82525afa918215620006f557600092620008e8575b506040516364e329cb60e11b81523060048201526001600160a01b039092166024830152602090829081600081604481015b03925af1908115620006f557600091620008a6575b506001600160a01b03908116600090815260126020908152604091829020805460ff19166001179055601554915163ef8ef56f60e01b815292909183916004918391165afa8015620006f55760009062000862575b6200055a915062000d01565b60005b86518110156200077c576001600160a01b036200057b828962000d82565b5116156200073757600060206001600160a01b036200059b848b62000d82565b5160405163095ea7b360e01b81526001600160a01b038d16600482015284196024820152938492604492849291165af18015620006f55762000701575b5060165460009060209062000632906001600160a01b0390811690620005ff868d62000d82565b516040516364e329cb60e11b815230600482015291166001600160a01b0316602482015293849283919082906044820190565b03925af1908115620006f557600091620006ae575b506001600160a01b039081166000908152601260205260409020805460ff1916600117905562000685906200067d838a62000d82565b511662000d01565b600019811462000698576001016200055d565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011620006ec575b81620006cc6020938362000c27565b81010312620006e757620006e09062000cc2565b3862000647565b600080fd5b3d9150620006bd565b6040513d6000823e3d90fd5b620007279060203d6020116200072f575b6200071e818362000c27565b81019062000ce7565b5038620005d8565b503d62000712565b60405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606490fd5b508760405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a36040519433600060008051602062003f998339815191528180a361ffff80911661ffff196007541617600755815116906008549163ffff0000602083015160101b169067ffff000000000000606065ffff00000000604086015160201b1694015160301b169360018060401b0319161717171760085560095560018060a01b031660018060a01b0319600254161760025560018060a01b031660018060a01b03196001541617600155613201908162000d988239f35b506020813d6020116200089d575b816200087f6020938362000c27565b81010312620006e757620008976200055a9162000cc2565b6200054e565b3d915062000870565b90506020813d602011620008df575b81620008c46020938362000c27565b81010312620006e757620008d89062000cc2565b38620004f9565b3d9150620008b5565b91506020823d6020116200092d575b81620009066020938362000c27565b81010312620006e757620004e46020916200092360009462000cc2565b93509150620004b2565b3d9150620008f7565b634e487b7160e01b600052601260045260246000fd5b015190503880620003f1565b60066000908152935060008051602062003fb983398151915291905b601f1984168510620009ba576001945083601f19811610620009a0575b505050811b0160065562000407565b015160001960f88460031b161c1916905538808062000991565b8181015183556020948501946001909301929091019062000974565b600660005290915060008051602062003fb9833981519152601f840160051c81016020851062000a2f575b90849392915b601f830160051c8201811062000a1f575050620003d8565b6000815585945060010162000a07565b508062000a01565b634e487b7160e01b600052602260045260246000fd5b91607f1691620003c2565b634e487b7160e01b600052604160045260246000fd5b0151905038806200037c565b90600460005260206000209160005b601f198516811062000ad5575091839160019360ff9695601f1981161062000abb575b505050811b0160045562000392565b015160001960f88460031b161c1916905538808062000aac565b9192602060018192868501518155019401920162000a89565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c81016020851062000b4c575b601f830160051c8201811062000b3f5750506200035d565b6000815560010162000b27565b508062000b27565b90607f169062000349565b62000b7b9060203d6020116200072f576200071e818362000c27565b503862000324565b90506020813d60201162000bc1575b8162000ba16020938362000c27565b81010312620006e757602062000bb960009262000cc2565b9150620002df565b3d915062000b92565b90506020813d60201162000c03575b8162000be86020938362000c27565b81010312620006e75762000bfc9062000cc2565b386200023d565b3d915062000bd9565b6020809162000c1b8462000cc2565b81520191019062000105565b601f909101601f19168101906001600160401b0382119082101762000a5857604052565b919080601f84011215620006e7578251906001600160401b03821162000a58576040519160209162000c87601f8301601f191684018562000c27565b818452828287010111620006e75760005b81811062000cae57508260009394955001015290565b858101830151848201840152820162000c98565b51906001600160a01b0382168203620006e757565b519061ffff82168203620006e757565b90816020910312620006e757518015158103620006e75790565b6014546801000000000000000081101562000a5857600181018060145581101562000d6c5760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b03909216919091179055565b634e487b7160e01b600052603260045260246000fd5b805182101562000d6c5760209160051b01019056fe608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b6671461198a5750806306fdde03146118e4578063095ea7b31461186b57806318160ddd1461184d57806323b872dd146117c65780632483e7151461179d57806325b65893146117745780632d838119146117565780632dd310001461172d578063313ce5671461170c57806332fe7b26146116e35780633685d4191461159a5780634e6fd6c41461157d57806352390c021461144e5780635342acb41461140f57806355b6ed5c146102b15780635c38693d146113ec5780635c9a05b8146113ad57806365a807df1461137457806370a0823114611349578063715018a6146112f05780638da5cb5b146112c757806395d89b41146111d25780639af1d35a146111b0578063a4e6668f14611155578063a9059cbb14611124578063aaf5eb6814611107578063b068d56e146110c3578063b3e03f7414610328578063d830678614610302578063dd62ed3e146102b1578063ef422a181461025b5763f2fde38b14610195573861000f565b34610256576020366003190112610256576101ae611a53565b6101b6611b32565b6001600160a01b03908116908115610202576000548260018060a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b600080fd5b3461025657604036600319011261025657610274611a53565b602435908115158092036102565761028a611b32565b60018060a01b0316600052601360205260406000209060ff80198354169116179055600080f35b34610256576040366003190112610256576102ca611a53565b6102d2611a69565b9060018060a01b038091166000526011602052604060002091166000526020526020604060002054604051908152f35b3461025657600036600319011261025657602060ff60165460a01c166040519015158152f35b60603660031901126102565767ffffffffffffffff60243581811161025657610355903690600401611acb565b906044359081116102565761036e903690600401611acb565b610376611b32565b601454825180821490816110b8575b501561107a576103be9060405161039b816119b9565b60118152700e0c2d2e4a8ded6cadce65cd8cadccee8d607b1b602082015261306e565b6103f482516040516103cf816119b9565b60138152720e8ded6cadc82dadeeadce8e65cd8cadccee8d606b1b602082015261306e565b61042e8151604051610405816119b9565b60178152760e0c2d2e4a8ded6cadc82dadeeadce8e65cd8cadccee8d604b1b602082015261306e565b60015b601454811015610da05761048761044782611ab0565b90549060405191610457836119b9565b600d83526c70616972546f6b656e735b695d60981b602084015260039190911b1c6001600160a01b0316906130b3565b61049081611ab0565b905460039190911b1c6001600160a01b031615610d63576016546104fc906020906001600160a01b03166104c384611ab0565b905460405163e6a4390560e01b815230600482015260039290921b1c6001600160a01b0316602482015292839190829081906044820190565b03915afa908115610b9a57600091610d34575b5061053681604051610520816119b9565b60048152633830b4b960e11b60208201526130b3565b6001600160a01b03811615610cf95760018060a01b03811660005260126020526000806105ba6105d060ff60408420541660405190610574826119b9565b601582527469734c6971756964697479506169725b706169725d60581b602083015260405193849263c3b5563560e01b6020850152604060248501526064840190611a13565b901515604483015203601f1981018352826119f1565b6020815191016a636f6e736f6c652e6c6f675afa506001600160a01b031660009081526012602052604090205460ff1615610cb45761060f8184612571565b51151580610ca1575b15610c5c5761065861062a8285612571565b51604051610637816119b9565b600f81526e746f6b656e416d6f756e74735b695d60881b602082015261306e565b6106976106658284612571565b51604051610672816119b9565b601381527270616972546f6b656e416d6f756e74735b695d60681b602082015261306e565b6107686106a48285612571565b51604051906106b2826119d5565b610704602f918284527f5472616e7366657272696e6720544849535f544f4b454e2066726f6d206d736760208501526e2e73656e64657220746f207468697360881b938460408201523090339061314e565b6107196107118588612571565b513033611d50565b6107238486612571565b519160405191610732836119d5565b82527f5472616e7366657272696e6720504149525f544f4b454e2066726f6d206d7367602083015260408201523090339061314e565b6000602061077583611ab0565b905460039190911b1c6001600160a01b031660646107938587612571565b5160405194859384926323b872dd60e01b845233600485015230602485015260448401525af18015610b9a57610c24575b5061081b6107d182611ab0565b905460405160039290921b1c6001600160a01b0316906107f0816119b9565b601981527820b23234b733903634b8bab4b234ba3c903337b9103830b4b960391b60208201526130b3565b30600052601160205260406000209060018060a01b03601554169182600052602052610877604060002054604051610852816119b9565b60138152721d1a1a5cc81d1bdad95b88185c1c1c9bdd985b606a1b602082015261306e565b6108b361088330612fdf565b60405161088f816119b9565b60128152717468697320746f6b656e2062616c616e636560701b602082015261306e565b6108f06108c08286612571565b516040516108cd816119b9565b60118152701d1a1a5cc81d1bdad95b88185b5bdd5b9d607a1b602082015261306e565b6108f981611ab0565b9054604051636eb1769f60e11b81523060048201526001600160a01b03858116602483015290926020928492604492849260039190911b1c165afa8015610b9a57600090610bf0575b6109789150604051610953816119b9565b60138152721c185a5c881d1bdad95b88185c1c1c9bdd985b606a1b602082015261306e565b6024602061098583611ab0565b90546040516370a0823160e01b81523060048201529384929091839160031b1c6001600160a01b03165afa8015610b9a57600090610bbc575b6109f391506040516109cf816119b9565b60128152717061697220746f6b656e2062616c616e636560701b602082015261306e565b610a30610a008285612571565b51604051610a0d816119b9565b60118152701c185a5c881d1bdad95b88185b5bdd5b9d607a1b602082015261306e565b610a3981611ab0565b905460039190911b1c6001600160a01b0316610a558286612571565b51610a608386612571565b5193610a6c8488612571565b5192605f918483810204831485151715610ba657610a8a8689612571565b51908184810204841482151715610ba657610e1042014211610ba657606484600093826101049760609a6040519d8e9b8c9a62e8e33760e81b8c523060048d015260248c015260448b0152838a015202046084870152020460a484015261dead60c4840152610e10420160e48401525af1918215610b9a57610b6692610b6b575b50610b61610b1882611ab0565b905460405160039290921b1c6001600160a01b031690610b37816119b9565b601881527720b23232b2103634b8bab4b234ba3c903337b9103830b4b960411b60208201526130b3565b611b8a565b610431565b610b8c9060603d606011610b93575b610b8481836119f1565b81019061260f565b5050610b0b565b503d610b7a565b6040513d6000823e3d90fd5b634e487b7160e01b600052601160045260246000fd5b506020813d602011610be8575b81610bd6602093836119f1565b81010312610256576109f390516109be565b3d9150610bc9565b506020813d602011610c1c575b81610c0a602093836119f1565b81010312610256576109789051610942565b3d9150610bfd565b6020813d602011610c54575b81610c3d602093836119f1565b8101031261025657518015150361025657836107c4565b3d9150610c30565b60405162461bcd60e51b815260206004820152601e60248201527f416d6f756e7473206d7573742062652067726561746572207468616e203000006044820152606490fd5b50610cac8183612571565b511515610618565b60405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527214185a5c88191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b610d56915060203d602011610d5c575b610d4e81836119f1565b8101906125f0565b8461050f565b503d610d44565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b6004358015611029573415610fd15760165460155460405163ef8ef56f60e01b81526001600160a01b03928316916020908290600490829087165afa8015610b9a57610e2592602092600092610fb2575b5060405163e6a4390560e01b81523060048201526001600160a01b0390921660248301529092839190829081906044820190565b03915afa8015610b9a578291600091610f93575b50168015610f4e57600052601260205260ff6040600020541615610efa57610e62823033611d50565b60155416605f8202828104605f03610ba657605f3402348104605f03610ba657610e1042014211610ba6576064936060938560c493604051978896879563f305d71960e01b8752306004880152602487015204604485015204606483015261dead6084830152610e10420160a483015234905af18015610b9a57610ee257005b61001b9060603d606011610b9357610b8481836119f1565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420612072656769737465726564206e6174697665206c697175696469746044820152653c903830b4b960d11b6064820152608490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4e6174697665207061697220646f6573206e6f742065786973740000000000006044820152606490fd5b610fac915060203d602011610d5c57610d4e81836119f1565b84610e39565b610fca919250833d8511610d5c57610d4e81836119f1565b9086610df1565b60405162461bcd60e51b815260206004820152602a60248201527f4e617469766520746f6b656e20616d6f756e74206d75737420626520677265616044820152690746572207468616e20360b41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606490fd5b905082511484610385565b346102565760003660031901126102565760806008546040519061ffff908181168352818160101c166020840152818160201c16604084015260301c166060820152f35b346102565760003660031901126102565760206040516127108152f35b346102565760403660031901126102565761114a611140611a53565b6024359033611d50565b602060405160018152f35b34610256576020366003190112610256576004356014548110156102565760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657602061ffff60075416604051908152f35b3461025657600036600319011261025657604051600060065490600182811c918184169182156112bd575b60209485851084146112a7578587948686529182600014611287575050600114611247575b5061122f925003836119f1565b611243604051928284938452830190611a13565b0390f35b849150600660005281600020906000915b85831061126f57505061122f935082010185611222565b80548389018501528794508693909201918101611258565b60ff19168582015261122f95151560051b85010192508791506112229050565b634e487b7160e01b600052602260045260246000fd5b92607f16926111fd565b34610256576000366003190112610256576000546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657611309611b32565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025657602036600319011261025657602061136c611367611a53565b612fdf565b604051908152f35b34610256576020366003190112610256576004358015158091036102565761139a611b32565b60ff8019600a5416911617600a55600080f35b34610256576020366003190112610256576001600160a01b036113ce611a53565b166000526012602052602060ff604060002054166040519015158152f35b3461025657600036600319011261025657602060ff600a54166040519015158152f35b34610256576020366003190112610256576001600160a01b03611430611a53565b166000526013602052602060ff604060002054166040519015158152f35b346102565760208060031936011261025657611468611a53565b90611471611b32565b6001600160a01b0382166000818152600f8352604090205460ff16611538579081600f92600052600d8252604060002054611516575b50526040600020805460ff1916600117905560105490600160401b821015611500576114dc82600161001b9401601055611a7f565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b634e487b7160e01b600052604160045260246000fd5b611524604060002054611bc6565b90600052600e8252604060002055836114a7565b60405162461bcd60e51b815260048101839052601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606490fd5b3461025657600036600319011261025657602060405161dead8152f35b3461025657602080600319360112610256576115b4611a53565b906115bd611b32565b60018060a01b038092169081600052600f9182825260ff60406000205416156116a45760005b60108054908183101561001b578691846115fc85611a7f565b949054600395861b1c161461161c5750505061161790611b8a565b6115e3565b60009795929796939491961994858201918211610ba6576114dc8761164361165094611a7f565b9054908c1b1c1691611a7f565b600052600e81526000604081205552604060002060ff1981541690558254801561168e57019261167f84611a7f565b8154921b9290921b1916905555005b634e487b7160e01b600052603160045260246000fd5b60405162461bcd60e51b81526004810183905260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b6044820152606490fd5b34610256576000366003190112610256576015546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657602060ff60055416604051908152f35b34610256576000366003190112610256576016546040516001600160a01b039091168152602090f35b3461025657602036600319011261025657602061136c600435611bc6565b34610256576000366003190112610256576002546040516001600160a01b039091168152602090f35b34610256576000366003190112610256576001546040516001600160a01b039091168152602090f35b346102565760603660031901126102565761114a6117e2611a53565b6117ea611a69565b6044359160018060a01b03811680600052601160205260406000203360005260205260001960406000205403611821575b50611d50565b60005260116020526040600020336000526020526040600020611845848254611b99565b90558461181b565b34610256576000366003190112610256576020600354604051908152f35b3461025657604036600319011261025657611884611a53565b60243533600052601160205260406000209160018060a01b03169182600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461025657600036600319011261025657604051600060045490600182811c91818416918215611980575b60209485851084146112a7578587948686529182600014611287575050600114611940575061122f925003836119f1565b849150600460005281600020906000915b85831061196857505061122f935082010185611222565b80548389018501528794508693909201918101611951565b92607f169261190f565b34610256576000366003190112610256576020906009548152f35b67ffffffffffffffff811161150057604052565b6040810190811067ffffffffffffffff82111761150057604052565b6060810190811067ffffffffffffffff82111761150057604052565b90601f8019910116810190811067ffffffffffffffff82111761150057604052565b919082519283825260005b848110611a3f575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611a1e565b600435906001600160a01b038216820361025657565b602435906001600160a01b038216820361025657565b601054811015611a9a57601060005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601454811015611a9a57601460005260206000200190600090565b9080601f830112156102565781359067ffffffffffffffff8211611500578160051b60405193602093611b00858401876119f1565b85528380860192820101928311610256578301905b828210611b23575050505090565b81358152908301908301611b15565b6000546001600160a01b03163303611b4657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000198114610ba65760010190565b91908203918211610ba657565b8115611bb0570490565b634e487b7160e01b600052601260045260246000fd5b600b548111611be757611be490611bde611bde611c3f565b90611ba6565b90565b60405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608490fd5b600b54908160038054938491600090601054905b818310611c7a57505050611c678282611ba6565b8310611c735750509190565b9350919050565b9091959496611c8887611a7f565b989060018060a01b03998a915490851b1c16600052600d986020918a835260409a818c60002054118015611d2b575b611d1c57611d0f9383611cfa611cf48e9f958f9e9f95611d159a988c611cde600e99611a7f565b9054911b1c166000528552866000205490611b99565b9c611a7f565b905490891b1c16600052526000205490611b99565b97611b8a565b9190611c53565b50959950959750505050505050565b5082611d368c611a7f565b905490881b1c16600052600e8452848c6000205411611cb7565b6001600160a01b039081169182156122f057169182156122b057801561225957611d7930612fdf565b60095411158061224d575b80612234575b80612224575b6121ca575b600092828452602092601384526000805160206131ac8339815191528460ff9483826040998a89818320541615806121b8575b15998a61216e575b848352600f84528082842054168061215e575b15611f54575093611e6b611e8092611e4287691d08195e18db1d59195960b21b600e995191611e11836119d5565b602a83527f5472616e7366657272696e672066726f6d206578636c7564656420746f206e6f8984015282015261301f565b8d611e97611e4f85612375565b9c9596949e939f929d919a909b848b52838352898b2054611b99565b9289525285872055600d8d5284862054611b99565b8d8552600d8c52838520558d845282842054612335565b918c8152600d8a52205580611f45575b5080611f36575b5080611f27575b5080611f17575b50508751908152a35b611ecd575050565b73466565732073657420746f2070726576696f757360601b611f00925191611ef4836119b9565b6014835282015261301f565b60075461ffff8160101c169061ffff191617600755565b611f2091612342565b3880611ebc565b611f30906124d1565b38611eb5565b611f3f90612446565b38611eae565b611f4e906124d1565b38611ea7565b84839492959352808585205416158061214f575b15612091575050908291611fcf611fea95611fca6120229651611f8a816119d5565b602a81527f5472616e7366657272696e672066726f6d206e6f74206578636c7564656420748a820152691bc8195e18db1d59195960b21b8782015261301f565b612375565b98959299949a939b919690978652600d8d5284862054611b99565b8d8552600d8c52838520558d8452600e8b528d61200a8b85872054612335565b908552600e8c5283852055600d8b5282842054612335565b918c8152600d8a52205580612082575b5080612073575b5080612064575b5080612054575b50508751908152a3611ec5565b61205d91612342565b3880612047565b61206d906124d1565b38612040565b61207c90612446565b38612039565b61208b906124d1565b38612032565b82849395929452808284205416908161213f575b50156120fe5793611e6b611fea926120f1600e97516120c3816119b9565b601f81527f5472616e7366657272696e672066726f6d20626f7468206578636c75646564008782015261301f565b8d612022611e4f85612375565b915061202292611fcf611e8095611fca8551612119816119b9565b6015815274151c985b9cd9995c9c9a5b99c81cdd185b99185c99605a1b8a82015261301f565b90508983528183205416386120a5565b50898452808585205416611f68565b5089835280828420541615611de3565b60075463ffff00008160101b169063ffffffff1916176007556121b38251612195816119b9565b600d81526c0466565732073657420746f203609c1b8682015261301f565b611dd0565b50508781528a89818320541615611dc8565b6121fa6040516121d9816119b9565b600f81526e50726f63657373696e67206665657360881b602082015261301f565b6016805460ff60a01b19908116600160a01b1790915561221861262a565b60165416601655611d95565b5060ff60165460a01c1615611d90565b5081600052601260205260ff6040600020541615611d8a565b5060ff600a5416611d84565b60405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608490fd5b60405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b91908201809211610ba657565b9061235261235d92600b54611b99565b600b55600c54612335565b600c55565b81810292918115918404141715610ba657565b906127109161ffff928061238d856007541684612362565b04600854916123d2816123a5888660301c1685612362565b0492826123b7898760101c1683612362565b0497836123c9828860201c1684612362565b04951690612362565b04946123ef866123ea856123ea856123ea888b611b99565b611b99565b926124056123fe611bde611c3f565b8096612362565b96612443886123ea6124178988612362565b986123ea6124258289612362565b6123ea8c61243d612436868c612362565b958a612362565b96611b99565b96565b61245a612454611bde611c3f565b82612362565b906000805160206131ac83398151915261dead92600090848252602091600d835261248a60409283832054612335565b868252600d845282822055600f835260ff82822054166124af575b50519283523392a3565b600e8352816124c18682842054612335565b91878152600e85522055386124a5565b6124df612454611bde611c3f565b90600091308352602092600d84526124fc60409283832054612335565b308252600d855282822055600f845260ff8282205416612532575b50519081526000805160206131ac83398151915230923392a3565b600e8452816125448482842054612335565b91308152600e8652205538612517565b805115611a9a5760200190565b805160011015611a9a5760400190565b8051821015611a9a5760209160051b010190565b91909493929460a0830190835260209060008285015260a0604085015282518091528160c0850193019160005b8281106125d35750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016125b2565b9081602091031261025657516001600160a01b03811681036102565790565b90816060910312610256578051916040602083015192015190565b61263330612fdf565b906000918015612fda5760085461ffff808216816126518286612362565b9360101c1601818111612fc6579161266e916126a2931690611ba6565b80926123ea82604051612680816119b9565b601081526f189d5e505b99109d5c9b905b5bdd5b9d60821b602082015261306e565b906126d4826040516126b3816119b9565b600f81526e1b1a5c5d5a591a5d1e505b5bdd5b9d608a1b602082015261306e565b80612e34575b5080151580612e29575b6126ed57509050565b6014546126f991611ba6565b61272881604051612709816119b9565b600d81526c30b6b7bab73a2832b92830b4b960991b602082015261306e565b825b601454811015612e235761273d81611ab0565b60018060a01b0391549060031b1c16906127788260405161275d816119b9565b60098152683830b4b92a37b5b2b760b91b60208201526130b3565b6127a8604051612787816119b9565b600a8152691a185b19905b5bdd5b9d60b21b60208201528460011c9061306e565b60155460405163ef8ef56f60e01b81526001600160a01b0390911690602081600481855afa908115612a78578791612e04575b506001600160a01b03168303612a83575060405191506127fa826119d5565b6002825260403660208401373061281083612554565b5260155460405163ef8ef56f60e01b81526001600160a01b039091169290602081600481875afa908115612a78578791612a59575b5061284f82612561565b6001600160a01b03909116905260405161289a9061286c816119b9565b60178152760e6eec2e0e0d2dcce40d0c2d8cc82dadeeadce8408aa89604b1b60208201528560011c9061306e565b610e10420192834211612a4557908187923b15612a415784839187836128dc956040519687958694859363791ac94760e01b8552309160011c60048601612585565b03925af18015612a3657612a1e575b50506129296040516128fc816119b9565b60168152750e6eec2e0e0cac840d0c2d8cc82dadeeadce8408aa8960531b60208201528460011c9061306e565b61295e604051612938816119b9565b60148152730c2c8c8d2dcce40d8d2e2ead2c8d2e8f2408aa8960631b602082015261301f565b60018060a01b036015541647906040519363f305d71960e01b85523060048601528560011c602486015287604486015287606486015261dead608486015260a48501528360c48160609485945af1928315612a13576129f2936129f7575b5050610b616040516129cd816119b9565b60138152720c2c8c8cac840d8d2e2ead2c8d2e8f2408aa89606b1b602082015261301f565b61272a565b81612a0d92903d10610b9357610b8481836119f1565b506129bc565b6040513d88823e3d90fd5b612a27906119a5565b612a325784386128eb565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b612a72915060203d602011610d5c57610d4e81836119f1565b38612845565b6040513d89823e3d90fd5b604051612a8f816119d5565b60028152604036602083013730612aa582612554565b5283612ab082612561565b52612aea604051612ac0816119b9565b60138152721cddd85c1c1a5b99c81a185b19905b5bdd5b9d606a1b60208201528660011c9061306e565b6001546001600160a01b03169042610e10810110612df05790829188933b15612dec57612b3c92849283899360405196879586948593635c11d79560e01b8552610e1042019260011c60048601612585565b03925af18015612a3657612dd8575b5050612b85604051612b5c816119b9565b60128152711cddd85c1c1959081a185b19905b5bdd5b9d60721b60208201528460011c9061306e565b60015460405186916001600160a01b031690612bdb90612ba4816119b9565b602081527f7472616e73666572696e672066726f6d2072656c6179657220746f207468697360208201528660011c9083309161314e565b803b15612dd4578180916024604051809481936373b6656f60e01b83528960048401525af18015612a3657612dc0575b5050612c35604051612c1c816119b9565b60078152661c995b185e595960ca1b602082015261301f565b6040516370a0823160e01b81523060048201528590602081602481875afa908115612a36578291612d8b575b50612c9481604051612c72816119b9565b601081526f70616972546f6b656e42616c616e636560801b602082015261306e565b612ccb81604051612ca4816119b9565b601081526f616464696e67206c697175696469747960801b60208201528760011c90613103565b60018060a01b03601554166040519462e8e33760e81b865230600487015260248601528560011c60448601528160648601528260848601528260a486015261dead60c4860152610e10420160e4860152846101048160609586945af1918215612a78576129f294610b6193612d6f575b5050604051612d49816119b9565b600f81526e6164646564206c697175696469747960881b60208201528560011c90613103565b81612d8592903d10610b9357610b8481836119f1565b50612d3b565b9150506020813d602011612db8575b81612da7602093836119f1565b810103126102565785905138612c61565b3d9150612d9a565b612dc9906119a5565b612a32578438612c0b565b5080fd5b612de1906119a5565b612a32578438612b4b565b8380fd5b634e487b7160e01b88526011600452602488fd5b612e1d915060203d602011610d5c57610d4e81836119f1565b386127db565b50509050565b5060145415156126e4565b604051612e40816119d5565b600281526020810190604036833730612e5882612554565b526002546001600160a01b0392908316612e7183612561565b52612ead84604051612e82816119b9565b60198152781cddd85c1c1a5b99c8189d5e505b99109d5c9b905b5bdd5b9d603a1b602082015261306e565b826015541691610e10420190814211612fb257833b15612fae579188939160405195869463791ac94760e01b865260a486019089600488015287602488015260a060448801525180915260c48601939187905b828210612f8d5750505050838092869261dead6064840152608483015203925af18015612f8257612f6d575b50612f6790604051612f3d816119b9565b60188152771cddd85c1c195908189d5e505b99109d5c9b905b5bdd5b9d60421b602082015261306e565b386126da565b93612f7b612f6792956119a5565b9390612f2c565b6040513d87823e3d90fd5b8351811686528d985089975060209586019590930192600190910190612f00565b8880fd5b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b86526011600452602486fd5b509050565b6001600160a01b03166000908152600f602052604090205460ff1661301157600d602052611be4604060002054611bc6565b600e60205260406000205490565b6000809160405161305b8161304d602082019463104c13eb60e21b8652602060248401526044830190611a13565b03601f1981018352826119f1565b51906a636f6e736f6c652e6c6f675afa50565b60009190829161305b604051809261309f6020830195632d839cb360e21b8752604060248501526064840190611a13565b90604483015203601f1981018352826119f1565b60009190829161305b60405180926130e4602083019563319af33360e01b8752604060248501526064840190611a13565b6001600160a01b0391909116604483015203601f1981018352826119f1565b6000929161305b8493604051928391613135602084019663ca47c4eb60e01b8852606060248601526084850190611a13565b916044840152606483015203601f1981018352826119f1565b909261305b60009485946040519384926131816020850197638ef3f39960e01b89526080602487015260a4860190611a13565b6001600160a01b03918216604486015292166064840152608483015203601f1981018352826119f156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202ae6da19965d7b9d6f5fd2e83405cf20b7ec8423b682b8a9706bfecc8c54706a64736f6c634300081100338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000200000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000d0600000000000000000000000000000000000000000004d3419d96192e48b4000000000000000000000000000052957c71f8b873f62ca939aceb75e86bfbb77fee000000000000000000000000e65112d2f120c8cb23adc80d8e8122c0c8b7ff8d000000000000000000000000000000000000000000000000000000000000000e44756d6220416d706c6966696572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444414d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb390000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab

Deployed ByteCode

0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630445b6671461198a5750806306fdde03146118e4578063095ea7b31461186b57806318160ddd1461184d57806323b872dd146117c65780632483e7151461179d57806325b65893146117745780632d838119146117565780632dd310001461172d578063313ce5671461170c57806332fe7b26146116e35780633685d4191461159a5780634e6fd6c41461157d57806352390c021461144e5780635342acb41461140f57806355b6ed5c146102b15780635c38693d146113ec5780635c9a05b8146113ad57806365a807df1461137457806370a0823114611349578063715018a6146112f05780638da5cb5b146112c757806395d89b41146111d25780639af1d35a146111b0578063a4e6668f14611155578063a9059cbb14611124578063aaf5eb6814611107578063b068d56e146110c3578063b3e03f7414610328578063d830678614610302578063dd62ed3e146102b1578063ef422a181461025b5763f2fde38b14610195573861000f565b34610256576020366003190112610256576101ae611a53565b6101b6611b32565b6001600160a01b03908116908115610202576000548260018060a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b600080fd5b3461025657604036600319011261025657610274611a53565b602435908115158092036102565761028a611b32565b60018060a01b0316600052601360205260406000209060ff80198354169116179055600080f35b34610256576040366003190112610256576102ca611a53565b6102d2611a69565b9060018060a01b038091166000526011602052604060002091166000526020526020604060002054604051908152f35b3461025657600036600319011261025657602060ff60165460a01c166040519015158152f35b60603660031901126102565767ffffffffffffffff60243581811161025657610355903690600401611acb565b906044359081116102565761036e903690600401611acb565b610376611b32565b601454825180821490816110b8575b501561107a576103be9060405161039b816119b9565b60118152700e0c2d2e4a8ded6cadce65cd8cadccee8d607b1b602082015261306e565b6103f482516040516103cf816119b9565b60138152720e8ded6cadc82dadeeadce8e65cd8cadccee8d606b1b602082015261306e565b61042e8151604051610405816119b9565b60178152760e0c2d2e4a8ded6cadc82dadeeadce8e65cd8cadccee8d604b1b602082015261306e565b60015b601454811015610da05761048761044782611ab0565b90549060405191610457836119b9565b600d83526c70616972546f6b656e735b695d60981b602084015260039190911b1c6001600160a01b0316906130b3565b61049081611ab0565b905460039190911b1c6001600160a01b031615610d63576016546104fc906020906001600160a01b03166104c384611ab0565b905460405163e6a4390560e01b815230600482015260039290921b1c6001600160a01b0316602482015292839190829081906044820190565b03915afa908115610b9a57600091610d34575b5061053681604051610520816119b9565b60048152633830b4b960e11b60208201526130b3565b6001600160a01b03811615610cf95760018060a01b03811660005260126020526000806105ba6105d060ff60408420541660405190610574826119b9565b601582527469734c6971756964697479506169725b706169725d60581b602083015260405193849263c3b5563560e01b6020850152604060248501526064840190611a13565b901515604483015203601f1981018352826119f1565b6020815191016a636f6e736f6c652e6c6f675afa506001600160a01b031660009081526012602052604090205460ff1615610cb45761060f8184612571565b51151580610ca1575b15610c5c5761065861062a8285612571565b51604051610637816119b9565b600f81526e746f6b656e416d6f756e74735b695d60881b602082015261306e565b6106976106658284612571565b51604051610672816119b9565b601381527270616972546f6b656e416d6f756e74735b695d60681b602082015261306e565b6107686106a48285612571565b51604051906106b2826119d5565b610704602f918284527f5472616e7366657272696e6720544849535f544f4b454e2066726f6d206d736760208501526e2e73656e64657220746f207468697360881b938460408201523090339061314e565b6107196107118588612571565b513033611d50565b6107238486612571565b519160405191610732836119d5565b82527f5472616e7366657272696e6720504149525f544f4b454e2066726f6d206d7367602083015260408201523090339061314e565b6000602061077583611ab0565b905460039190911b1c6001600160a01b031660646107938587612571565b5160405194859384926323b872dd60e01b845233600485015230602485015260448401525af18015610b9a57610c24575b5061081b6107d182611ab0565b905460405160039290921b1c6001600160a01b0316906107f0816119b9565b601981527820b23234b733903634b8bab4b234ba3c903337b9103830b4b960391b60208201526130b3565b30600052601160205260406000209060018060a01b03601554169182600052602052610877604060002054604051610852816119b9565b60138152721d1a1a5cc81d1bdad95b88185c1c1c9bdd985b606a1b602082015261306e565b6108b361088330612fdf565b60405161088f816119b9565b60128152717468697320746f6b656e2062616c616e636560701b602082015261306e565b6108f06108c08286612571565b516040516108cd816119b9565b60118152701d1a1a5cc81d1bdad95b88185b5bdd5b9d607a1b602082015261306e565b6108f981611ab0565b9054604051636eb1769f60e11b81523060048201526001600160a01b03858116602483015290926020928492604492849260039190911b1c165afa8015610b9a57600090610bf0575b6109789150604051610953816119b9565b60138152721c185a5c881d1bdad95b88185c1c1c9bdd985b606a1b602082015261306e565b6024602061098583611ab0565b90546040516370a0823160e01b81523060048201529384929091839160031b1c6001600160a01b03165afa8015610b9a57600090610bbc575b6109f391506040516109cf816119b9565b60128152717061697220746f6b656e2062616c616e636560701b602082015261306e565b610a30610a008285612571565b51604051610a0d816119b9565b60118152701c185a5c881d1bdad95b88185b5bdd5b9d607a1b602082015261306e565b610a3981611ab0565b905460039190911b1c6001600160a01b0316610a558286612571565b51610a608386612571565b5193610a6c8488612571565b5192605f918483810204831485151715610ba657610a8a8689612571565b51908184810204841482151715610ba657610e1042014211610ba657606484600093826101049760609a6040519d8e9b8c9a62e8e33760e81b8c523060048d015260248c015260448b0152838a015202046084870152020460a484015261dead60c4840152610e10420160e48401525af1918215610b9a57610b6692610b6b575b50610b61610b1882611ab0565b905460405160039290921b1c6001600160a01b031690610b37816119b9565b601881527720b23232b2103634b8bab4b234ba3c903337b9103830b4b960411b60208201526130b3565b611b8a565b610431565b610b8c9060603d606011610b93575b610b8481836119f1565b81019061260f565b5050610b0b565b503d610b7a565b6040513d6000823e3d90fd5b634e487b7160e01b600052601160045260246000fd5b506020813d602011610be8575b81610bd6602093836119f1565b81010312610256576109f390516109be565b3d9150610bc9565b506020813d602011610c1c575b81610c0a602093836119f1565b81010312610256576109789051610942565b3d9150610bfd565b6020813d602011610c54575b81610c3d602093836119f1565b8101031261025657518015150361025657836107c4565b3d9150610c30565b60405162461bcd60e51b815260206004820152601e60248201527f416d6f756e7473206d7573742062652067726561746572207468616e203000006044820152606490fd5b50610cac8183612571565b511515610618565b60405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606490fd5b60405162461bcd60e51b815260206004820152601360248201527214185a5c88191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b610d56915060203d602011610d5c575b610d4e81836119f1565b8101906125f0565b8461050f565b503d610d44565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b6004358015611029573415610fd15760165460155460405163ef8ef56f60e01b81526001600160a01b03928316916020908290600490829087165afa8015610b9a57610e2592602092600092610fb2575b5060405163e6a4390560e01b81523060048201526001600160a01b0390921660248301529092839190829081906044820190565b03915afa8015610b9a578291600091610f93575b50168015610f4e57600052601260205260ff6040600020541615610efa57610e62823033611d50565b60155416605f8202828104605f03610ba657605f3402348104605f03610ba657610e1042014211610ba6576064936060938560c493604051978896879563f305d71960e01b8752306004880152602487015204604485015204606483015261dead6084830152610e10420160a483015234905af18015610b9a57610ee257005b61001b9060603d606011610b9357610b8481836119f1565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420612072656769737465726564206e6174697665206c697175696469746044820152653c903830b4b960d11b6064820152608490fd5b60405162461bcd60e51b815260206004820152601a60248201527f4e6174697665207061697220646f6573206e6f742065786973740000000000006044820152606490fd5b610fac915060203d602011610d5c57610d4e81836119f1565b84610e39565b610fca919250833d8511610d5c57610d4e81836119f1565b9086610df1565b60405162461bcd60e51b815260206004820152602a60248201527f4e617469766520746f6b656e20616d6f756e74206d75737420626520677265616044820152690746572207468616e20360b41b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608490fd5b60405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606490fd5b905082511484610385565b346102565760003660031901126102565760806008546040519061ffff908181168352818160101c166020840152818160201c16604084015260301c166060820152f35b346102565760003660031901126102565760206040516127108152f35b346102565760403660031901126102565761114a611140611a53565b6024359033611d50565b602060405160018152f35b34610256576020366003190112610256576004356014548110156102565760146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec01546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657602061ffff60075416604051908152f35b3461025657600036600319011261025657604051600060065490600182811c918184169182156112bd575b60209485851084146112a7578587948686529182600014611287575050600114611247575b5061122f925003836119f1565b611243604051928284938452830190611a13565b0390f35b849150600660005281600020906000915b85831061126f57505061122f935082010185611222565b80548389018501528794508693909201918101611258565b60ff19168582015261122f95151560051b85010192508791506112229050565b634e487b7160e01b600052602260045260246000fd5b92607f16926111fd565b34610256576000366003190112610256576000546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657611309611b32565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461025657602036600319011261025657602061136c611367611a53565b612fdf565b604051908152f35b34610256576020366003190112610256576004358015158091036102565761139a611b32565b60ff8019600a5416911617600a55600080f35b34610256576020366003190112610256576001600160a01b036113ce611a53565b166000526012602052602060ff604060002054166040519015158152f35b3461025657600036600319011261025657602060ff600a54166040519015158152f35b34610256576020366003190112610256576001600160a01b03611430611a53565b166000526013602052602060ff604060002054166040519015158152f35b346102565760208060031936011261025657611468611a53565b90611471611b32565b6001600160a01b0382166000818152600f8352604090205460ff16611538579081600f92600052600d8252604060002054611516575b50526040600020805460ff1916600117905560105490600160401b821015611500576114dc82600161001b9401601055611a7f565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b634e487b7160e01b600052604160045260246000fd5b611524604060002054611bc6565b90600052600e8252604060002055836114a7565b60405162461bcd60e51b815260048101839052601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606490fd5b3461025657600036600319011261025657602060405161dead8152f35b3461025657602080600319360112610256576115b4611a53565b906115bd611b32565b60018060a01b038092169081600052600f9182825260ff60406000205416156116a45760005b60108054908183101561001b578691846115fc85611a7f565b949054600395861b1c161461161c5750505061161790611b8a565b6115e3565b60009795929796939491961994858201918211610ba6576114dc8761164361165094611a7f565b9054908c1b1c1691611a7f565b600052600e81526000604081205552604060002060ff1981541690558254801561168e57019261167f84611a7f565b8154921b9290921b1916905555005b634e487b7160e01b600052603160045260246000fd5b60405162461bcd60e51b81526004810183905260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b6044820152606490fd5b34610256576000366003190112610256576015546040516001600160a01b039091168152602090f35b3461025657600036600319011261025657602060ff60055416604051908152f35b34610256576000366003190112610256576016546040516001600160a01b039091168152602090f35b3461025657602036600319011261025657602061136c600435611bc6565b34610256576000366003190112610256576002546040516001600160a01b039091168152602090f35b34610256576000366003190112610256576001546040516001600160a01b039091168152602090f35b346102565760603660031901126102565761114a6117e2611a53565b6117ea611a69565b6044359160018060a01b03811680600052601160205260406000203360005260205260001960406000205403611821575b50611d50565b60005260116020526040600020336000526020526040600020611845848254611b99565b90558461181b565b34610256576000366003190112610256576020600354604051908152f35b3461025657604036600319011261025657611884611a53565b60243533600052601160205260406000209160018060a01b03169182600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461025657600036600319011261025657604051600060045490600182811c91818416918215611980575b60209485851084146112a7578587948686529182600014611287575050600114611940575061122f925003836119f1565b849150600460005281600020906000915b85831061196857505061122f935082010185611222565b80548389018501528794508693909201918101611951565b92607f169261190f565b34610256576000366003190112610256576020906009548152f35b67ffffffffffffffff811161150057604052565b6040810190811067ffffffffffffffff82111761150057604052565b6060810190811067ffffffffffffffff82111761150057604052565b90601f8019910116810190811067ffffffffffffffff82111761150057604052565b919082519283825260005b848110611a3f575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611a1e565b600435906001600160a01b038216820361025657565b602435906001600160a01b038216820361025657565b601054811015611a9a57601060005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b601454811015611a9a57601460005260206000200190600090565b9080601f830112156102565781359067ffffffffffffffff8211611500578160051b60405193602093611b00858401876119f1565b85528380860192820101928311610256578301905b828210611b23575050505090565b81358152908301908301611b15565b6000546001600160a01b03163303611b4657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000198114610ba65760010190565b91908203918211610ba657565b8115611bb0570490565b634e487b7160e01b600052601260045260246000fd5b600b548111611be757611be490611bde611bde611c3f565b90611ba6565b90565b60405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608490fd5b600b54908160038054938491600090601054905b818310611c7a57505050611c678282611ba6565b8310611c735750509190565b9350919050565b9091959496611c8887611a7f565b989060018060a01b03998a915490851b1c16600052600d986020918a835260409a818c60002054118015611d2b575b611d1c57611d0f9383611cfa611cf48e9f958f9e9f95611d159a988c611cde600e99611a7f565b9054911b1c166000528552866000205490611b99565b9c611a7f565b905490891b1c16600052526000205490611b99565b97611b8a565b9190611c53565b50959950959750505050505050565b5082611d368c611a7f565b905490881b1c16600052600e8452848c6000205411611cb7565b6001600160a01b039081169182156122f057169182156122b057801561225957611d7930612fdf565b60095411158061224d575b80612234575b80612224575b6121ca575b600092828452602092601384526000805160206131ac8339815191528460ff9483826040998a89818320541615806121b8575b15998a61216e575b848352600f84528082842054168061215e575b15611f54575093611e6b611e8092611e4287691d08195e18db1d59195960b21b600e995191611e11836119d5565b602a83527f5472616e7366657272696e672066726f6d206578636c7564656420746f206e6f8984015282015261301f565b8d611e97611e4f85612375565b9c9596949e939f929d919a909b848b52838352898b2054611b99565b9289525285872055600d8d5284862054611b99565b8d8552600d8c52838520558d845282842054612335565b918c8152600d8a52205580611f45575b5080611f36575b5080611f27575b5080611f17575b50508751908152a35b611ecd575050565b73466565732073657420746f2070726576696f757360601b611f00925191611ef4836119b9565b6014835282015261301f565b60075461ffff8160101c169061ffff191617600755565b611f2091612342565b3880611ebc565b611f30906124d1565b38611eb5565b611f3f90612446565b38611eae565b611f4e906124d1565b38611ea7565b84839492959352808585205416158061214f575b15612091575050908291611fcf611fea95611fca6120229651611f8a816119d5565b602a81527f5472616e7366657272696e672066726f6d206e6f74206578636c7564656420748a820152691bc8195e18db1d59195960b21b8782015261301f565b612375565b98959299949a939b919690978652600d8d5284862054611b99565b8d8552600d8c52838520558d8452600e8b528d61200a8b85872054612335565b908552600e8c5283852055600d8b5282842054612335565b918c8152600d8a52205580612082575b5080612073575b5080612064575b5080612054575b50508751908152a3611ec5565b61205d91612342565b3880612047565b61206d906124d1565b38612040565b61207c90612446565b38612039565b61208b906124d1565b38612032565b82849395929452808284205416908161213f575b50156120fe5793611e6b611fea926120f1600e97516120c3816119b9565b601f81527f5472616e7366657272696e672066726f6d20626f7468206578636c75646564008782015261301f565b8d612022611e4f85612375565b915061202292611fcf611e8095611fca8551612119816119b9565b6015815274151c985b9cd9995c9c9a5b99c81cdd185b99185c99605a1b8a82015261301f565b90508983528183205416386120a5565b50898452808585205416611f68565b5089835280828420541615611de3565b60075463ffff00008160101b169063ffffffff1916176007556121b38251612195816119b9565b600d81526c0466565732073657420746f203609c1b8682015261301f565b611dd0565b50508781528a89818320541615611dc8565b6121fa6040516121d9816119b9565b600f81526e50726f63657373696e67206665657360881b602082015261301f565b6016805460ff60a01b19908116600160a01b1790915561221861262a565b60165416601655611d95565b5060ff60165460a01c1615611d90565b5081600052601260205260ff6040600020541615611d8a565b5060ff600a5416611d84565b60405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608490fd5b60405162461bcd60e51b81526020600482015260186024820152775472616e7366657220746f207a65726f206164647265737360401b6044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b91908201809211610ba657565b9061235261235d92600b54611b99565b600b55600c54612335565b600c55565b81810292918115918404141715610ba657565b906127109161ffff928061238d856007541684612362565b04600854916123d2816123a5888660301c1685612362565b0492826123b7898760101c1683612362565b0497836123c9828860201c1684612362565b04951690612362565b04946123ef866123ea856123ea856123ea888b611b99565b611b99565b926124056123fe611bde611c3f565b8096612362565b96612443886123ea6124178988612362565b986123ea6124258289612362565b6123ea8c61243d612436868c612362565b958a612362565b96611b99565b96565b61245a612454611bde611c3f565b82612362565b906000805160206131ac83398151915261dead92600090848252602091600d835261248a60409283832054612335565b868252600d845282822055600f835260ff82822054166124af575b50519283523392a3565b600e8352816124c18682842054612335565b91878152600e85522055386124a5565b6124df612454611bde611c3f565b90600091308352602092600d84526124fc60409283832054612335565b308252600d855282822055600f845260ff8282205416612532575b50519081526000805160206131ac83398151915230923392a3565b600e8452816125448482842054612335565b91308152600e8652205538612517565b805115611a9a5760200190565b805160011015611a9a5760400190565b8051821015611a9a5760209160051b010190565b91909493929460a0830190835260209060008285015260a0604085015282518091528160c0850193019160005b8281106125d35750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016125b2565b9081602091031261025657516001600160a01b03811681036102565790565b90816060910312610256578051916040602083015192015190565b61263330612fdf565b906000918015612fda5760085461ffff808216816126518286612362565b9360101c1601818111612fc6579161266e916126a2931690611ba6565b80926123ea82604051612680816119b9565b601081526f189d5e505b99109d5c9b905b5bdd5b9d60821b602082015261306e565b906126d4826040516126b3816119b9565b600f81526e1b1a5c5d5a591a5d1e505b5bdd5b9d608a1b602082015261306e565b80612e34575b5080151580612e29575b6126ed57509050565b6014546126f991611ba6565b61272881604051612709816119b9565b600d81526c30b6b7bab73a2832b92830b4b960991b602082015261306e565b825b601454811015612e235761273d81611ab0565b60018060a01b0391549060031b1c16906127788260405161275d816119b9565b60098152683830b4b92a37b5b2b760b91b60208201526130b3565b6127a8604051612787816119b9565b600a8152691a185b19905b5bdd5b9d60b21b60208201528460011c9061306e565b60155460405163ef8ef56f60e01b81526001600160a01b0390911690602081600481855afa908115612a78578791612e04575b506001600160a01b03168303612a83575060405191506127fa826119d5565b6002825260403660208401373061281083612554565b5260155460405163ef8ef56f60e01b81526001600160a01b039091169290602081600481875afa908115612a78578791612a59575b5061284f82612561565b6001600160a01b03909116905260405161289a9061286c816119b9565b60178152760e6eec2e0e0d2dcce40d0c2d8cc82dadeeadce8408aa89604b1b60208201528560011c9061306e565b610e10420192834211612a4557908187923b15612a415784839187836128dc956040519687958694859363791ac94760e01b8552309160011c60048601612585565b03925af18015612a3657612a1e575b50506129296040516128fc816119b9565b60168152750e6eec2e0e0cac840d0c2d8cc82dadeeadce8408aa8960531b60208201528460011c9061306e565b61295e604051612938816119b9565b60148152730c2c8c8d2dcce40d8d2e2ead2c8d2e8f2408aa8960631b602082015261301f565b60018060a01b036015541647906040519363f305d71960e01b85523060048601528560011c602486015287604486015287606486015261dead608486015260a48501528360c48160609485945af1928315612a13576129f2936129f7575b5050610b616040516129cd816119b9565b60138152720c2c8c8cac840d8d2e2ead2c8d2e8f2408aa89606b1b602082015261301f565b61272a565b81612a0d92903d10610b9357610b8481836119f1565b506129bc565b6040513d88823e3d90fd5b612a27906119a5565b612a325784386128eb565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b612a72915060203d602011610d5c57610d4e81836119f1565b38612845565b6040513d89823e3d90fd5b604051612a8f816119d5565b60028152604036602083013730612aa582612554565b5283612ab082612561565b52612aea604051612ac0816119b9565b60138152721cddd85c1c1a5b99c81a185b19905b5bdd5b9d606a1b60208201528660011c9061306e565b6001546001600160a01b03169042610e10810110612df05790829188933b15612dec57612b3c92849283899360405196879586948593635c11d79560e01b8552610e1042019260011c60048601612585565b03925af18015612a3657612dd8575b5050612b85604051612b5c816119b9565b60128152711cddd85c1c1959081a185b19905b5bdd5b9d60721b60208201528460011c9061306e565b60015460405186916001600160a01b031690612bdb90612ba4816119b9565b602081527f7472616e73666572696e672066726f6d2072656c6179657220746f207468697360208201528660011c9083309161314e565b803b15612dd4578180916024604051809481936373b6656f60e01b83528960048401525af18015612a3657612dc0575b5050612c35604051612c1c816119b9565b60078152661c995b185e595960ca1b602082015261301f565b6040516370a0823160e01b81523060048201528590602081602481875afa908115612a36578291612d8b575b50612c9481604051612c72816119b9565b601081526f70616972546f6b656e42616c616e636560801b602082015261306e565b612ccb81604051612ca4816119b9565b601081526f616464696e67206c697175696469747960801b60208201528760011c90613103565b60018060a01b03601554166040519462e8e33760e81b865230600487015260248601528560011c60448601528160648601528260848601528260a486015261dead60c4860152610e10420160e4860152846101048160609586945af1918215612a78576129f294610b6193612d6f575b5050604051612d49816119b9565b600f81526e6164646564206c697175696469747960881b60208201528560011c90613103565b81612d8592903d10610b9357610b8481836119f1565b50612d3b565b9150506020813d602011612db8575b81612da7602093836119f1565b810103126102565785905138612c61565b3d9150612d9a565b612dc9906119a5565b612a32578438612c0b565b5080fd5b612de1906119a5565b612a32578438612b4b565b8380fd5b634e487b7160e01b88526011600452602488fd5b612e1d915060203d602011610d5c57610d4e81836119f1565b386127db565b50509050565b5060145415156126e4565b604051612e40816119d5565b600281526020810190604036833730612e5882612554565b526002546001600160a01b0392908316612e7183612561565b52612ead84604051612e82816119b9565b60198152781cddd85c1c1a5b99c8189d5e505b99109d5c9b905b5bdd5b9d603a1b602082015261306e565b826015541691610e10420190814211612fb257833b15612fae579188939160405195869463791ac94760e01b865260a486019089600488015287602488015260a060448801525180915260c48601939187905b828210612f8d5750505050838092869261dead6064840152608483015203925af18015612f8257612f6d575b50612f6790604051612f3d816119b9565b60188152771cddd85c1c195908189d5e505b99109d5c9b905b5bdd5b9d60421b602082015261306e565b386126da565b93612f7b612f6792956119a5565b9390612f2c565b6040513d87823e3d90fd5b8351811686528d985089975060209586019590930192600190910190612f00565b8880fd5b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b86526011600452602486fd5b509050565b6001600160a01b03166000908152600f602052604090205460ff1661301157600d602052611be4604060002054611bc6565b600e60205260406000205490565b6000809160405161305b8161304d602082019463104c13eb60e21b8652602060248401526044830190611a13565b03601f1981018352826119f1565b51906a636f6e736f6c652e6c6f675afa50565b60009190829161305b604051809261309f6020830195632d839cb360e21b8752604060248501526064840190611a13565b90604483015203601f1981018352826119f1565b60009190829161305b60405180926130e4602083019563319af33360e01b8752604060248501526064840190611a13565b6001600160a01b0391909116604483015203601f1981018352826119f1565b6000929161305b8493604051928391613135602084019663ca47c4eb60e01b8852606060248601526084850190611a13565b916044840152606483015203601f1981018352826119f1565b909261305b60009485946040519384926131816020850197638ef3f39960e01b89526080602487015260a4860190611a13565b6001600160a01b03918216604486015292166064840152608483015203601f1981018352826119f156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202ae6da19965d7b9d6f5fd2e83405cf20b7ec8423b682b8a9706bfecc8c54706a64736f6c63430008110033