ETH Price: $3,353.55 (-2.39%)
Gas: 6.36 Gwei

Token

sGE (sGE)
 

Overview

Max Total Supply

363,063,855.881272295140421513 sGE

Holders

218

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,726,362.408685076494856365 sGE

Value
$0.00
0x67f8bf2c521af007328b74c8ae7416badc512357
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenesisAutoCompoundStaking

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : GenesisStaking.sol
// Website: https://genesisdao.io/
// X: https://x.com/0xGenesisDAO
// Discord: https://discord.gg/genesisdao


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//                                         &                                       
//                           (&&&&&&&&&&&&&&&&&&&&&&&&&&&*                         
//                      &&&&&&&&&&&&&&&&&&&&&@,,@@@@&&&&&&&&&&&                    
//                  &&&&&&&&&&&&&&&&&&&&&,,,,,,,,,*@@@&&&&&&&&&&&&&                
//               &&&&&&&&&&&&&&&&&&&&,,,,,,,,,,,@@@@@@@&&&&&&&&&&&&&&&             
//            &&&&&&&&&&&&&&&&&@,,,,,,,,,,,@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&          
//          &&&&&&&&&&&&&&@,,,,,,,,,,,*@@@@@@@@@@&&&&&&&&&@,,,,,#@@@@&&&&&&        
//        &&&&&&&&&&&&#,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&&*,,,,,,,,,,,,@@@@&&&&&&      
//       &&&&&&&&&@..,,.,,,,,@@@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,,,,,,@@@@&&&&&&&     
//     #&&&&&&&&&&@..,,,,,%@@@@@@@@&&&&&&&&&@,,,,,,,,,,,,@@,,,,,,,,@@@@&&&&&&&&    
//    &&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&&..,,,,,,,,,,@@@@@@@@,,,,,,,@@@@&&&&&&&&&&  
//   &&&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&@..,,,,,@@@@@@@@@@@@@,,,,,,,@@@@&&&&&&&&&&* 
//   &&&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&@@@@@@@@@@@@@@&&&&&&@,,,,,,,@@@@&&&&&&&&&&& 
//  &&&&&&&&&&&&&&@..,,,,@@@@@@&&&&&&&&&&&&@@@@@@&&&&&&&&&&@@,,,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@@@@@@@@//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&&@@@/**,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*@@@@@@@@@&&&&&&&&&&&&&
// &&&&&&&&&&&&&&&@.....,.,,@@@@@@@@@@@@@@@@@@@@@@@@@@&&%@@@@@@/*,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/**,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@,,,,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@&&&&&&&&&@,,,,,@@@@&&&&&&&&&@,,,,,,,@@@@&&&&&&&&&&&&
//   &&&&&&&&&&&&&@....,,,,@@@@&&&&&,,,,,,,,,,,,@@@@&&&&&&&@,,,,,,,@@@@&&&&&&&&&&& 
//   &&&&&&&&&&&&&@....,,,,@@@@,,,,,,,,,,,,,,@@@@@@@&&&&&&&@,,,,,,,@@@@&&&&&&&&&&* 
//    &&&&&&&&&&&&@....,,,,,,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&,,,,,,,,@@@@&&&&&&&&&&  
//     /&&&&&&&&&&@....,,,,,,,,,,,@@@@@@@@@@@@&&&&&&&&@,,,,,,,,,,,,@@@@&&&&&&&&    
//       &&&&&&&&&@@....,,,,,@@@@@@@@@@@@&&&&&&&&&,,,,,,,,,,,,,@@@@@@@@&&&&&&&     
//        &&&&&&&&&@@@@@@@@@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&      
//          &&&&&&&&&&@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&&&&        
//            &&&&&&&&&&&&&&&&&&&&&&..,,,,,,,,,,(@@@@@@@@@@&&&&&&&&&&&&&&          
//               &&&&&&&&&&&&&&&&&@...,,,,,,@@@@@@@@@@&&&&&&&&&&&&&&&&             
//                  &&&&&&&&&&&&&&@@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&                
//                      &&&&&&&&&&&&@@@@@@@@@&&&&&&&&&&&&&&&&&&                    
//                           *&&&&&&&&&&&&&&&&&&&&&&&&&&& 

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "hardhat/console.sol";

interface IERC20MintableBurnable is IERC20 {
    function mint(address account, uint256 amount) external;
    function burn(uint256 amount) external;
}

contract GenesisAutoCompoundStaking is IERC20, Ownable {
    uint256 private constant MAX_UINT256 = type(uint256).max;
    uint256 private constant SCALE = 1e18;
    uint256 private constant ONE_YEAR = 365 days;

    uint256 private constant MAX_STAKE_TAX = 1500; // 15%
    uint256 private constant MAX_UNSTAKE_TAX = 1500; // 15%
    uint256 private constant PERCENTAGE_BASE = 10000; // 100%

    string public name = "sGE";
    string public symbol = "sGE";
    uint8 public decimals = 18;

    address public baseToken;
    address public liquidityPool;
    address public treasury;

    uint256 public fixedAPR = 50 ether;
    uint256 public dynamicAPRMinCap = 30 ether;
    uint256 public dynamicAPRMaxCap = 70 ether;
    uint256 public dynamicAPRConstant = 1 ether;
    uint256 public rebaseInterval = 8 hours;
    uint256 public stakeTax = 0;
    uint256 public unstakeTax = 750;

    uint256 public stakeStartTime;
    uint256 public lastRebaseTime;

    uint256 public totalGons;
    uint256 public totalSupplyTokens;
    uint256 public gonsPerFragment = 1e7;

    uint256 public initialMaxSupply;
    uint256 public maxSupply;
    uint256 public maxGons;

    uint256 public warmupPeriod;

    bool private _baseTokenSet = false;

    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) public stakeTimes;

    event Mint(address indexed wallet, uint256 amount, uint256 gonsAdded, uint256 gonsPerFragment, uint256 newTotalSupply);
    event Burn(address indexed wallet, uint256 amount, uint256 gonsRemoved, uint256 gonsPerFragment, uint256 newTotalSupply);
    event Stake(address indexed user, uint256 amount, uint256 taxAmount, uint256 mintedTokens);
    event Unstake(address indexed user, uint256 amount, uint256 taxAmount, uint256 returnedTokens);
    event Rebase(
        uint256 fixedAPR, 
        uint256 dynamicAPR, 
        uint256 rebaseAPR, 
        uint256 lastRebaseTime, 
        uint256 rebaseCount, 
        uint256 maxSupply, 
        uint256 supplyDelta,
        uint256 gonsPerFragment,
        uint256 currentSupply
    );

    event BaseTokenSet(address indexed baseToken);
    event LiquidityPoolSet(address indexed liquidityPool);
    event APRParamsSet(uint256 fixedAPR, uint256 dynamicAPRMinCap, uint256 dynamicAPRMaxCap, uint256 dynamicAPRConstant);
    event RebaseIntervalSet(uint256 rebaseInterval);
    event StakeTaxSet(uint256 stakeTax);
    event UnstakeTaxSet(uint256 unstakeTax);
    event StakeStartTimeSet(uint256 stakeStartTime);
    event TreasurySet(address indexed treasury);

    constructor(
        address _baseToken, 
        address _liquidityPool, 
        address _treasury,
        uint256 _stakeStartTime
    ) Ownable(msg.sender) {
        baseToken = _baseToken;
        liquidityPool = _liquidityPool;
        treasury = _treasury;
        stakeStartTime = _stakeStartTime;

        maxSupply = IERC20MintableBurnable(baseToken).totalSupply() + 1 ether;
        initialMaxSupply = maxSupply;
        maxGons = MAX_UINT256 - (MAX_UINT256 % maxSupply);
        gonsPerFragment = maxGons / maxSupply;
        _mint(address(this), 1 ether);

        warmupPeriod = 60;

        emit BaseTokenSet(_baseToken);
        emit LiquidityPoolSet(_liquidityPool);
        emit TreasurySet(_treasury);
        emit StakeStartTimeSet(_stakeStartTime);
    }

    function setBaseToken(address _baseToken) external onlyOwner {
        require(_baseTokenSet == false, "Base token can only be set once, and is immutable afterwards");
        baseToken = _baseToken;
        emit BaseTokenSet(_baseToken);
    }

    function setLiquidityPool(address _liquidityPool) external onlyOwner {
        liquidityPool = _liquidityPool;
        emit LiquidityPoolSet(_liquidityPool);
    }

    function setAprParameters(
        uint256 _fixedAPR,
        uint256 _dynamicAPRMinCap,
        uint256 _dynamicAPRMaxCap,
        uint256 _dynamicAPRConstant
    ) external onlyOwner {
        require(_dynamicAPRMinCap <= _dynamicAPRMaxCap, "Min cap higher than max cap");
        fixedAPR = _fixedAPR;
        dynamicAPRMinCap = _dynamicAPRMinCap;
        dynamicAPRMaxCap = _dynamicAPRMaxCap;
        dynamicAPRConstant = _dynamicAPRConstant;

        emit APRParamsSet(_fixedAPR, _dynamicAPRMinCap, _dynamicAPRMaxCap, _dynamicAPRConstant);
    }

    function setRebaseInterval(uint256 _rebaseInterval) external onlyOwner {
        rebaseInterval = _rebaseInterval;
        emit RebaseIntervalSet(_rebaseInterval);
    }

    function setTreasury(address _treasury) external onlyOwner {
        treasury = _treasury;
        emit TreasurySet(_treasury);
    }

    function setStakeStartTime(uint256 _stakeStartTime) external onlyOwner {
        require(block.timestamp < stakeStartTime, "Staking already started");
        stakeStartTime = _stakeStartTime;
        emit StakeStartTimeSet(_stakeStartTime);
    }

    function setWarmupPeriod(uint256 _warmupPeriod) external onlyOwner {
        require(_warmupPeriod >= 0, "Warmup period too low");
        require(_warmupPeriod <= 1 days, "Warmup period too high");
        warmupPeriod = _warmupPeriod;
    }

    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        uint256 gonsToAdd = amount * gonsPerFragment;
        totalGons += gonsToAdd;
        totalSupplyTokens += amount;
        _gonBalances[account] += gonsToAdd;

        emit Mint(account, amount, gonsToAdd, gonsPerFragment, totalSupplyTokens);

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

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 gonsToRemove = amount * gonsPerFragment;
        totalGons -= gonsToRemove;
        totalSupplyTokens -= amount;
        _gonBalances[account] -= gonsToRemove;

        emit Burn(account, amount, gonsToRemove, gonsPerFragment, totalSupplyTokens);

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

    function rebase() public {
        if (block.timestamp < stakeStartTime) return;

        uint256 timeToUse = lastRebaseTime > 0 ? lastRebaseTime : stakeStartTime;
        uint256 rebaseCount = (block.timestamp - timeToUse) / rebaseInterval;
        if (rebaseCount == 0) return;

        uint256 fixedApr = getFixedAPR();
        uint256 dynamicApr = getDynamicAPR();
        uint256 finalApr = fixedApr + dynamicApr;

        uint256 intervalsPerYear = ONE_YEAR / rebaseInterval;
        uint256 intervalAPR = finalApr / intervalsPerYear;
        uint256 supplyDelta = (maxSupply * intervalAPR * rebaseCount) / SCALE / 100;

        if (supplyDelta == 0) {
            lastRebaseTime = timeToUse + rebaseInterval * rebaseCount;
            return;
        }

        maxSupply += supplyDelta;
        gonsPerFragment = maxGons / maxSupply;

        totalSupplyTokens = totalGons / gonsPerFragment; 
        lastRebaseTime = timeToUse + rebaseInterval * rebaseCount;

        emit Rebase(
            fixedApr, 
            dynamicApr, 
            intervalAPR, 
            timeToUse, 
            rebaseCount, 
            maxSupply,
            supplyDelta,
            gonsPerFragment,
            totalSupplyTokens 
        );
    }

    function stake(uint256 amount) external {
        rebase();

        require(IERC20(baseToken).transferFrom(msg.sender, address(this), amount), "Transfer failed");

        uint256 taxAmount = (amount * stakeTax) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        IERC20MintableBurnable(baseToken).burn(netAmount);
        if (taxAmount > 0) {
            IERC20(baseToken).transfer(treasury, taxAmount);
        }

        _mint(msg.sender, netAmount);

        if (warmupPeriod > 0) {
            stakeTimes[msg.sender] = block.timestamp;
        }
        
        emit Stake(msg.sender, amount, taxAmount, netAmount);
    }

    function unstake(uint256 amount) external {
        require(block.timestamp - stakeTimes[msg.sender] >= warmupPeriod, "Warmup period not over");

        rebase();

        uint256 gonsToRemove = amount * gonsPerFragment;
        require(_gonBalances[msg.sender] >= gonsToRemove, "Insufficient balance");

        _burn(msg.sender, amount);
        IERC20MintableBurnable(baseToken).mint(address(this), amount);

        uint256 taxAmount = (amount * unstakeTax) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        IERC20(baseToken).transfer(msg.sender, netAmount);
        if (taxAmount > 0) {
            IERC20(baseToken).transfer(treasury, taxAmount);
        }

        emit Unstake(msg.sender, amount, taxAmount, netAmount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(_gonBalances[sender] >= amount * gonsPerFragment, "ERC20: transfer amount exceeds balance");
        require(sender == address(0) || recipient != address(this), "ERC20: transfer to staking contract");

        rebase();

        uint256 taxAmount = ((0 + 0) * amount) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        uint256 gonsToTransfer = netAmount * gonsPerFragment;
        uint256 gonsTaxAmount = taxAmount * gonsPerFragment;

        _gonBalances[sender] -= (gonsToTransfer + gonsTaxAmount);
        _gonBalances[recipient] += gonsToTransfer;
        if (gonsTaxAmount > 0) {
            _gonBalances[treasury] += gonsTaxAmount;
        }

        emit Transfer(sender, recipient, netAmount);
    }

    function getFixedAPR() public view returns (uint256) {
        return fixedAPR;
    }

    function getDynamicAPR() public view returns (uint256) {
        uint256 totalStaked = totalSupplyTokens;
        uint256 lpBalance = IERC20(baseToken).balanceOf(liquidityPool);

        if (lpBalance <= 0) {
            revert("LP balance zero");
        }
        if (dynamicAPRConstant <= 0) {
            revert("Dynamic APR constant zero");
        }

        uint256 ratio = (totalStaked * SCALE) / lpBalance;

        if (ratio > 10 * SCALE) {
            ratio = 10 * SCALE;
        }

        uint256 scaledRatio = (ratio * dynamicAPRConstant) / SCALE;
        uint256 logInput = SCALE + scaledRatio;

        uint256 logValue = log10(logInput);

        uint256 apyValue = dynamicAPRMaxCap -
            ((dynamicAPRMaxCap - dynamicAPRMinCap) * logValue) /
            log10(dynamicAPRConstant * 10);

        if (apyValue < dynamicAPRMinCap) {
            apyValue = dynamicAPRMinCap;
        }

        return apyValue;
    }

    function getFinalAPR() public view returns (uint256) {
        return getFixedAPR() + getDynamicAPR();
    }

    function log10(uint256 x) internal view returns (uint256) {
        if (x <= 0) {
            revert("Log zero");
        }
        uint256 result = 0;
        while (x >= 10 * SCALE) {
            x /= 10;
            result += SCALE;
        }
        for (uint8 i = 0; i < 18; ++i) {
            x = (x * x) / SCALE;
            if (x >= 10 * SCALE) {
                x /= 10;
                result += SCALE / (2 ** (i + 1));
            }
        }
        return result;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _gonBalances[account] / gonsPerFragment;
    }

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, currentAllowance - amount);

        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function timeTillNextRebase() public view returns (uint256) {
        if (block.timestamp < stakeStartTime) {
            return stakeStartTime - block.timestamp;
        }
        return rebaseInterval - ((block.timestamp - stakeStartTime) % rebaseInterval);
    }

    function totalTokensAtNextRebase() public view returns (uint256) {
        uint256 fixedApr = getFixedAPR();
        uint256 dynamicApr = getDynamicAPR();
        uint256 finalApr = fixedApr + dynamicApr;

        uint256 timeToUse = lastRebaseTime > 0 ? lastRebaseTime : stakeStartTime;
        if (timeToUse > block.timestamp) return 0;
        uint256 rebaseCount = (block.timestamp - timeToUse) / rebaseInterval;
        if (rebaseCount == 0) rebaseCount = 1;

        uint256 intervalsPerYear = ONE_YEAR / rebaseInterval;
        uint256 intervalAPR = finalApr / intervalsPerYear;
        uint256 supplyDelta = (totalSupplyTokens * intervalAPR * rebaseCount) / SCALE / 100;

        return supplyDelta;
    }

    function tokensForAddressAtNextRebase(address account) public view returns (uint256) {
        uint256 supplyDelta = totalTokensAtNextRebase();
        uint256 userBalance = balanceOf(account);
        uint256 userShare = (userBalance * SCALE) / totalSupplyTokens;

        return (supplyDelta * userShare) / SCALE / 100;
    }

    function tokensDeductedForUnstaking(uint256 amount) public view returns (uint256) {
        uint256 taxAmount = (amount * unstakeTax) / PERCENTAGE_BASE;
        return taxAmount;
    }

    function tokensDeductedForStaking(uint256 amount) public view returns (uint256) {
        uint256 taxAmount = (amount * stakeTax) / PERCENTAGE_BASE;
        return taxAmount;
    }

    function index() public view returns (uint256) {
        return balanceOf(address(this));
    }

    function totalTokensRewarded() public view returns (uint256) {
        return maxSupply - initialMaxSupply;
    }

    function emergencyWithdraw(address token, address to, uint256 amount) external onlyOwner {
        require(token != address(this), "Cannot withdraw staking token");
        IERC20(token).transfer(to, amount);
    }
    
    function emergencyEthWithdraw(address to, uint256 amount) external onlyOwner {
        payable(to).transfer(amount);
    }
}

File 2 of 5 : 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));
    }

}

File 3 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

File 4 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

File 5 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_stakeStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fixedAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRMinCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRMaxCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRConstant","type":"uint256"}],"name":"APRParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"}],"name":"BaseTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsRemoved","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityPool","type":"address"}],"name":"LiquidityPoolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fixedAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebaseAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRebaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebaseCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supplyDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSupply","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebaseInterval","type":"uint256"}],"name":"RebaseIntervalSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintedTokens","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stakeStartTime","type":"uint256"}],"name":"StakeStartTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stakeTax","type":"uint256"}],"name":"StakeTaxSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnedTokens","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unstakeTax","type":"uint256"}],"name":"UnstakeTaxSet","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRMaxCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRMinCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyEthWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fixedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDynamicAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFixedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gonsPerFragment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fixedAPR","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRMinCap","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRMaxCap","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRConstant","type":"uint256"}],"name":"setAprParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"setBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityPool","type":"address"}],"name":"setLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rebaseInterval","type":"uint256"}],"name":"setRebaseInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeStartTime","type":"uint256"}],"name":"setStakeStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_warmupPeriod","type":"uint256"}],"name":"setWarmupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeTillNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokensDeductedForStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokensDeductedForUnstaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokensForAddressAtNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensAtNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensRewarded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600381526020017f7347450000000000000000000000000000000000000000000000000000000000815250600190816100489190610990565b506040518060400160405280600381526020017f73474500000000000000000000000000000000000000000000000000000000008152506002908161008d9190610990565b50601260035f6101000a81548160ff021916908360ff1602179055506802b5e3af16b18800006006556801a055690d9db800006007556803cb71f51fc5580000600855670de0b6b3a7640000600955617080600a555f600b556102ee600c55629896806011555f60165f6101000a81548160ff021916908315150217905550348015610117575f80fd5b50604051614db2380380614db283398181016040528101906101399190610ae7565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101aa575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101a19190610b5a565b60405180910390fd5b6101b9816104d160201b60201c565b5083600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d81905550670de0b6b3a7640000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031a9190610b73565b6103249190610bcb565b6013819055506013546012819055506013547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6103619190610c2b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61038c9190610c5b565b6014819055506013546014546103a29190610c8e565b6011819055506103c030670de0b6b3a764000061059260201b60201c565b603c6015819055508373ffffffffffffffffffffffffffffffffffffffff167f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb37060405160405180910390a28273ffffffffffffffffffffffffffffffffffffffff167fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a60405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff167f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f60405160405180910390a27fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f75816040516104c09190610ccd565b60405180910390a150505050610de2565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f790610d40565b60405180910390fd5b5f6011548261060f9190610d5e565b905080600f5f8282546106229190610bcb565b925050819055508160105f82825461063a9190610bcb565b925050819055508060175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461068d9190610bcb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa666983836011546010546040516106e49493929190610d9f565b60405180910390a28273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107499190610ccd565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806107d157607f821691505b6020821081036107e4576107e361078d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026108467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261080b565b610850868361080b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61089461088f61088a84610868565b610871565b610868565b9050919050565b5f819050919050565b6108ad8361087a565b6108c16108b98261089b565b848454610817565b825550505050565b5f90565b6108d56108c9565b6108e08184846108a4565b505050565b5b81811015610903576108f85f826108cd565b6001810190506108e6565b5050565b601f82111561094857610919816107ea565b610922846107fc565b81016020851015610931578190505b61094561093d856107fc565b8301826108e5565b50505b505050565b5f82821c905092915050565b5f6109685f198460080261094d565b1980831691505092915050565b5f6109808383610959565b9150826002028217905092915050565b61099982610756565b67ffffffffffffffff8111156109b2576109b1610760565b5b6109bc82546107ba565b6109c7828285610907565b5f60209050601f8311600181146109f8575f84156109e6578287015190505b6109f08582610975565b865550610a57565b601f198416610a06866107ea565b5f5b82811015610a2d57848901518255600182019150602085019450602081019050610a08565b86831015610a4a5784890151610a46601f891682610959565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a8c82610a63565b9050919050565b610a9c81610a82565b8114610aa6575f80fd5b50565b5f81519050610ab781610a93565b92915050565b610ac681610868565b8114610ad0575f80fd5b50565b5f81519050610ae181610abd565b92915050565b5f805f8060808587031215610aff57610afe610a5f565b5b5f610b0c87828801610aa9565b9450506020610b1d87828801610aa9565b9350506040610b2e87828801610aa9565b9250506060610b3f87828801610ad3565b91505092959194509250565b610b5481610a82565b82525050565b5f602082019050610b6d5f830184610b4b565b92915050565b5f60208284031215610b8857610b87610a5f565b5b5f610b9584828501610ad3565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610bd582610868565b9150610be083610868565b9250828201905080821115610bf857610bf7610b9e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610c3582610868565b9150610c4083610868565b925082610c5057610c4f610bfe565b5b828206905092915050565b5f610c6582610868565b9150610c7083610868565b9250828203905081811115610c8857610c87610b9e565b5b92915050565b5f610c9882610868565b9150610ca383610868565b925082610cb357610cb2610bfe565b5b828204905092915050565b610cc781610868565b82525050565b5f602082019050610ce05f830184610cbe565b92915050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610d2a601f83610ce6565b9150610d3582610cf6565b602082019050919050565b5f6020820190508181035f830152610d5781610d1e565b9050919050565b5f610d6882610868565b9150610d7383610868565b9250828202610d8181610868565b91508282048414831517610d9857610d97610b9e565b5b5092915050565b5f608082019050610db25f830187610cbe565b610dbf6020830186610cbe565b610dcc6040830185610cbe565b610dd96060830184610cbe565b95945050505050565b613fc380610def5f395ff3fe608060405234801561000f575f80fd5b5060043610610340575f3560e01c80637419f190116101b6578063c4968c9a11610102578063dd62ed3e116100a0578063ecdd98be1161007a578063ecdd98be14610988578063ef037fb9146109a6578063f0f44260146109c2578063f2fde38b146109de57610340565b8063dd62ed3e1461091e578063deac361a1461094e578063e63ea4081461096c57610340565b8063cca1ef6e116100dc578063cca1ef6e14610896578063d5abeb01146108c6578063d5e1fc1f146108e4578063d9565b031461090057610340565b8063c4968c9a1461083e578063c55dae631461085c578063cc1b63d51461087a57610340565b806395d89b411161016f578063a85667c511610149578063a85667c5146107ca578063a9059cbb146107e6578063af14052c14610816578063be8edf5c1461082057610340565b806395d89b4114610760578063a4168bcf1461077e578063a694fc3a146107ae57610340565b80637419f190146106ae5780637ed8f653146106cc57806383e373b0146106ea57806389edeb74146107085780638bd1d033146107265780638da5cb5b1461074257610340565b80632e187a681161029057806351d4a5801161022e578063663dcdbc11610208578063663dcdbc14610638578063665a11ca1461065657806370a0823114610674578063715018a6146106a457610340565b806351d4a580146105de578063529bed7f146105fc57806361d027b31461061a57610340565b80634508a6cc1161026a5780634508a6cc1461055457806345885bfe146105845780634a7c4d18146105a25780634befa981146105c057610340565b80632e187a68146104fa57806330643c4114610518578063313ce5671461053657610340565b806316bb6c13116102fd5780631ad25ffb116102d75780631ad25ffb1461046057806323b872dd146104905780632986c0e5146104c05780632e17de78146104de57610340565b806316bb6c131461040857806318160ddd146104245780631924063e1461044257610340565b8063018770201461034457806306fdde0314610360578063095ea7b31461037e57806309bc773f146103ae5780630f336d48146103cc578063118ab4e1146103ea575b5f80fd5b61035e60048036038101906103599190612d51565b6109fa565b005b610368610a88565b6040516103759190612dec565b60405180910390f35b61039860048036038101906103939190612e3f565b610b14565b6040516103a59190612e97565b60405180910390f35b6103b6610b2a565b6040516103c39190612ebf565b60405180910390f35b6103d4610b30565b6040516103e19190612ebf565b60405180910390f35b6103f2610d81565b6040516103ff9190612ebf565b60405180910390f35b610422600480360381019061041d9190612d51565b610d87565b005b61042c610e6a565b6040516104399190612ebf565b60405180910390f35b61044a610e73565b6040516104579190612ebf565b60405180910390f35b61047a60048036038101906104759190612d51565b610e79565b6040516104879190612ebf565b60405180910390f35b6104aa60048036038101906104a59190612ed8565b610e8e565b6040516104b79190612e97565b60405180910390f35b6104c8610f7b565b6040516104d59190612ebf565b60405180910390f35b6104f860048036038101906104f39190612f28565b610f8a565b005b61050261132f565b60405161050f9190612ebf565b60405180910390f35b610520611335565b60405161052d9190612ebf565b60405180910390f35b61053e61133b565b60405161054b9190612f6e565b60405180910390f35b61056e60048036038101906105699190612f28565b61134d565b60405161057b9190612ebf565b60405180910390f35b61058c611375565b6040516105999190612ebf565b60405180910390f35b6105aa61137e565b6040516105b79190612ebf565b60405180910390f35b6105c8611384565b6040516105d59190612ebf565b60405180910390f35b6105e66113a4565b6040516105f39190612ebf565b60405180910390f35b6106046113aa565b6040516106119190612ebf565b60405180910390f35b6106226113f8565b60405161062f9190612f96565b60405180910390f35b61064061141d565b60405161064d9190612ebf565b60405180910390f35b61065e611433565b60405161066b9190612f96565b60405180910390f35b61068e60048036038101906106899190612d51565b611458565b60405161069b9190612ebf565b60405180910390f35b6106ac6114ab565b005b6106b66114be565b6040516106c39190612ebf565b60405180910390f35b6106d46114c4565b6040516106e19190612ebf565b60405180910390f35b6106f26114ca565b6040516106ff9190612ebf565b60405180910390f35b6107106114d0565b60405161071d9190612ebf565b60405180910390f35b610740600480360381019061073b9190612faf565b6114d6565b005b61074a611580565b6040516107579190612f96565b60405180910390f35b6107686115a7565b6040516107759190612dec565b60405180910390f35b61079860048036038101906107939190612f28565b611633565b6040516107a59190612ebf565b60405180910390f35b6107c860048036038101906107c39190612f28565b61165b565b005b6107e460048036038101906107df9190612f28565b61196c565b005b61080060048036038101906107fb9190612e3f565b611a07565b60405161080d9190612e97565b60405180910390f35b61081e611a1d565b005b610828611bda565b6040516108359190612ebf565b60405180910390f35b610846611cc2565b6040516108539190612ebf565b60405180910390f35b610864611cc8565b6040516108719190612f96565b60405180910390f35b610894600480360381019061088f9190612f28565b611cee565b005b6108b060048036038101906108ab9190612d51565b611d7b565b6040516108bd9190612ebf565b60405180910390f35b6108ce611dec565b6040516108db9190612ebf565b60405180910390f35b6108fe60048036038101906108f99190612e3f565b611df2565b005b610908611e42565b6040516109159190612ebf565b60405180910390f35b61093860048036038101906109339190613013565b611e48565b6040516109459190612ebf565b60405180910390f35b610956611eca565b6040516109639190612ebf565b60405180910390f35b61098660048036038101906109819190612ed8565b611ed0565b005b610990611fc7565b60405161099d9190612ebf565b60405180910390f35b6109c060048036038101906109bb9190612f28565b611fcd565b005b6109dc60048036038101906109d79190612d51565b612016565b005b6109f860048036038101906109f39190612d51565b6120a4565b005b610a02612128565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a60405160405180910390a250565b60018054610a959061307e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac19061307e565b8015610b0c5780601f10610ae357610100808354040283529160200191610b0c565b820191905f5260205f20905b815481529060010190602001808311610aef57829003601f168201915b505050505081565b5f610b203384846121af565b6001905092915050565b600b5481565b5f8060105490505f600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610bb49190612f96565b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf391906130c2565b90505f8111610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613137565b60405180910390fd5b5f60095411610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c729061319f565b60405180910390fd5b5f81670de0b6b3a764000084610c9191906131ea565b610c9b9190613258565b9050670de0b6b3a7640000600a610cb291906131ea565b811115610cd157670de0b6b3a7640000600a610cce91906131ea565b90505b5f670de0b6b3a764000060095483610ce991906131ea565b610cf39190613258565b90505f81670de0b6b3a7640000610d0a9190613288565b90505f610d1682612372565b90505f610d30600a600954610d2b91906131ea565b612372565b82600754600854610d4191906132bb565b610d4b91906131ea565b610d559190613258565b600854610d6291906132bb565b9050600754811015610d745760075490505b8097505050505050505090565b60065481565b610d8f612128565b5f151560165f9054906101000a900460ff16151514610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda9061335e565b60405180910390fd5b80600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb37060405160405180910390a250565b5f601054905090565b600e5481565b6019602052805f5260405f205f915090505481565b5f8060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906133ec565b60405180910390fd5b610f598585856124a4565b610f6f85338584610f6a91906132bb565b6121af565b60019150509392505050565b5f610f8530611458565b905090565b60155460195f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205442610fd691906132bb565b1015611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613454565b60405180910390fd5b61101f611a1d565b5f6011548261102e91906131ea565b90508060175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a7906134bc565b60405180910390fd5b6110ba33836128a3565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b81526004016111179291906134da565b5f604051808303815f87803b15801561112e575f80fd5b505af1158015611140573d5f803e3d5ffd5b505050505f612710600c548461115691906131ea565b6111609190613258565b90505f818461116f91906132bb565b9050600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111ce9291906134da565b6020604051808303815f875af11580156111ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120e919061352b565b505f8211156112d757600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016112959291906134da565b6020604051808303815f875af11580156112b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d5919061352b565b505b3373ffffffffffffffffffffffffffffffffffffffff167ffbd65cfd6de1493db337385c0712095397ecbd0504df64b861cdfceb80c7b42285848460405161132193929190613556565b60405180910390a250505050565b60105481565b60125481565b60035f9054906101000a900460ff1681565b5f80612710600c548461136091906131ea565b61136a9190613258565b905080915050919050565b5f600654905090565b60095481565b5f61138d610b30565b611395611375565b61139f9190613288565b905090565b60075481565b5f600d544210156113ca5742600d546113c391906132bb565b90506113f5565b600a54600d54426113db91906132bb565b6113e5919061358b565b600a546113f291906132bb565b90505b90565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60125460135461142e91906132bb565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60115460175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546114a49190613258565b9050919050565b6114b3612128565b6114bc5f612a67565b565b600d5481565b60115481565b600c5481565b600a5481565b6114de612128565b81831115611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890613605565b60405180910390fd5b836006819055508260078190555081600881905550806009819055507f56868216d91d6464abc5e886219763832e60a15138e4b9b39622e814215ccc7c848484846040516115729493929190613623565b60405180910390a150505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600280546115b49061307e565b80601f01602080910402602001604051908101604052809291908181526020018280546115e09061307e565b801561162b5780601f106116025761010080835404028352916020019161162b565b820191905f5260205f20905b81548152906001019060200180831161160e57829003601f168201915b505050505081565b5f80612710600b548461164691906131ea565b6116509190613258565b905080915050919050565b611663611a1d565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016116c293929190613666565b6020604051808303815f875af11580156116de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611702919061352b565b611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906136e5565b60405180910390fd5b5f612710600b548361175391906131ea565b61175d9190613258565b90505f818361176c91906132bb565b9050600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b81526004016117c99190612ebf565b5f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b505050505f8211156118be57600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161187c9291906134da565b6020604051808303815f875af1158015611898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bc919061352b565b505b6118c83382612b28565b5f6015541115611915574260195f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b3373ffffffffffffffffffffffffffffffffffffffff167ff556991011e831bcfac4f406d547e5e32cdd98267efab83935230d5f8d02c44684848460405161195f93929190613556565b60405180910390a2505050565b611974612128565b5f8110156119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae9061374d565b60405180910390fd5b620151808111156119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f4906137b5565b60405180910390fd5b8060158190555050565b5f611a133384846124a4565b6001905092915050565b600d544210611bd8575f80600e5411611a3857600d54611a3c565b600e545b90505f600a548242611a4e91906132bb565b611a589190613258565b90505f8103611a68575050611bd8565b5f611a71611375565b90505f611a7c610b30565b90505f8183611a8b9190613288565b90505f600a546301e13380611aa09190613258565b90505f8183611aaf9190613258565b90505f6064670de0b6b3a76400008884601354611acc91906131ea565b611ad691906131ea565b611ae09190613258565b611aea9190613258565b90505f8103611b1f5786600a54611b0191906131ea565b88611b0c9190613288565b600e819055505050505050505050611bd8565b8060135f828254611b309190613288565b92505081905550601354601454611b479190613258565b601181905550601154600f54611b5d9190613258565b60108190555086600a54611b7191906131ea565b88611b7c9190613288565b600e819055507f82ec6dc57ebf74c563b660545554cb4bb01fc6e3e89020f8f47dd324e64eeaf48686848b8b60135487601154601054604051611bc7999897969594939291906137d3565b60405180910390a150505050505050505b565b5f80611be4611375565b90505f611bef610b30565b90505f8183611bfe9190613288565b90505f80600e5411611c1257600d54611c16565b600e545b905042811115611c2c575f945050505050611cbf565b5f600a548242611c3c91906132bb565b611c469190613258565b90505f8103611c5457600190505b5f600a546301e13380611c679190613258565b90505f8185611c769190613258565b90505f6064670de0b6b3a76400008584601054611c9391906131ea565b611c9d91906131ea565b611ca79190613258565b611cb19190613258565b905080985050505050505050505b90565b60145481565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf6612128565b600d544210611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d31906138a8565b60405180910390fd5b80600d819055507fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f7581604051611d709190612ebf565b60405180910390a150565b5f80611d85611bda565b90505f611d9184611458565b90505f601054670de0b6b3a764000083611dab91906131ea565b611db59190613258565b90506064670de0b6b3a76400008285611dce91906131ea565b611dd89190613258565b611de29190613258565b9350505050919050565b60135481565b611dfa612128565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611e3d573d5f803e3d5ffd5b505050565b60085481565b5f60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60155481565b611ed8612128565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90613910565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611f819291906134da565b6020604051808303815f875af1158015611f9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc1919061352b565b50505050565b600f5481565b611fd5612128565b80600a819055507fa0df1b641bcb350bfc38973452497c08c1314b4788866ea2c6eaab659573df248160405161200b9190612ebf565b60405180910390a150565b61201e612128565b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f60405160405180910390a250565b6120ac612128565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361211c575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016121139190612f96565b60405180910390fd5b61212581612a67565b50565b612130612cec565b73ffffffffffffffffffffffffffffffffffffffff1661214e611580565b73ffffffffffffffffffffffffffffffffffffffff16146121ad57612171612cec565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121a49190612f96565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361221d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122149061399e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290613a2c565b60405180910390fd5b8060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123659190612ebf565b60405180910390a3505050565b5f8082116123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90613a94565b60405180910390fd5b5f5b670de0b6b3a7640000600a6123cc91906131ea565b83106123fc57600a836123df9190613258565b9250670de0b6b3a7640000816123f59190613288565b90506123b7565b5f5b60128160ff16101561249a57670de0b6b3a7640000848561241f91906131ea565b6124299190613258565b9350670de0b6b3a7640000600a61244091906131ea565b841061248f57600a846124539190613258565b93506001816124629190613ab2565b600261246e9190613c15565b670de0b6b3a76400006124819190613258565b8261248c9190613288565b91505b8060010190506123fe565b5080915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990613ccf565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257790613d5d565b60405180910390fd5b6011548161258e91906131ea565b60175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490613deb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061267357503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990613e79565b60405180910390fd5b6126ba611a1d565b5f612710825f6126ca91906131ea565b6126d49190613258565b90505f81836126e391906132bb565b90505f601154826126f491906131ea565b90505f6011548461270591906131ea565b905080826127139190613288565b60175f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461275e91906132bb565b925050819055508160175f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546127b19190613288565b925050819055505f811115612835578060175f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461282d9190613288565b925050819055505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516128929190612ebf565b60405180910390a350505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890613f07565b60405180910390fd5b5f6011548261292091906131ea565b905080600f5f82825461293391906132bb565b925050819055508160105f82825461294b91906132bb565b925050819055508060175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461299e91906132bb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f4d667732637549615f3cd28023b13380094dd975c0ac7c1b26916a8b1363b7ec83836011546010546040516129f59493929190613623565b60405180910390a25f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a5a9190612ebf565b60405180910390a3505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8d90613f6f565b60405180910390fd5b5f60115482612ba591906131ea565b905080600f5f828254612bb89190613288565b925050819055508160105f828254612bd09190613288565b925050819055508060175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612c239190613288565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66698383601154601054604051612c7a9493929190613623565b60405180910390a28273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612cdf9190612ebf565b60405180910390a3505050565b5f33905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d2082612cf7565b9050919050565b612d3081612d16565b8114612d3a575f80fd5b50565b5f81359050612d4b81612d27565b92915050565b5f60208284031215612d6657612d65612cf3565b5b5f612d7384828501612d3d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612dbe82612d7c565b612dc88185612d86565b9350612dd8818560208601612d96565b612de181612da4565b840191505092915050565b5f6020820190508181035f830152612e048184612db4565b905092915050565b5f819050919050565b612e1e81612e0c565b8114612e28575f80fd5b50565b5f81359050612e3981612e15565b92915050565b5f8060408385031215612e5557612e54612cf3565b5b5f612e6285828601612d3d565b9250506020612e7385828601612e2b565b9150509250929050565b5f8115159050919050565b612e9181612e7d565b82525050565b5f602082019050612eaa5f830184612e88565b92915050565b612eb981612e0c565b82525050565b5f602082019050612ed25f830184612eb0565b92915050565b5f805f60608486031215612eef57612eee612cf3565b5b5f612efc86828701612d3d565b9350506020612f0d86828701612d3d565b9250506040612f1e86828701612e2b565b9150509250925092565b5f60208284031215612f3d57612f3c612cf3565b5b5f612f4a84828501612e2b565b91505092915050565b5f60ff82169050919050565b612f6881612f53565b82525050565b5f602082019050612f815f830184612f5f565b92915050565b612f9081612d16565b82525050565b5f602082019050612fa95f830184612f87565b92915050565b5f805f8060808587031215612fc757612fc6612cf3565b5b5f612fd487828801612e2b565b9450506020612fe587828801612e2b565b9350506040612ff687828801612e2b565b925050606061300787828801612e2b565b91505092959194509250565b5f806040838503121561302957613028612cf3565b5b5f61303685828601612d3d565b925050602061304785828601612d3d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061309557607f821691505b6020821081036130a8576130a7613051565b5b50919050565b5f815190506130bc81612e15565b92915050565b5f602082840312156130d7576130d6612cf3565b5b5f6130e4848285016130ae565b91505092915050565b7f4c502062616c616e6365207a65726f00000000000000000000000000000000005f82015250565b5f613121600f83612d86565b915061312c826130ed565b602082019050919050565b5f6020820190508181035f83015261314e81613115565b9050919050565b7f44796e616d69632041505220636f6e7374616e74207a65726f000000000000005f82015250565b5f613189601983612d86565b915061319482613155565b602082019050919050565b5f6020820190508181035f8301526131b68161317d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6131f482612e0c565b91506131ff83612e0c565b925082820261320d81612e0c565b91508282048414831517613224576132236131bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61326282612e0c565b915061326d83612e0c565b92508261327d5761327c61322b565b5b828204905092915050565b5f61329282612e0c565b915061329d83612e0c565b92508282019050808211156132b5576132b46131bd565b5b92915050565b5f6132c582612e0c565b91506132d083612e0c565b92508282039050818111156132e8576132e76131bd565b5b92915050565b7f4261736520746f6b656e2063616e206f6e6c7920626520736574206f6e63652c5f8201527f20616e6420697320696d6d757461626c65206166746572776172647300000000602082015250565b5f613348603c83612d86565b9150613353826132ee565b604082019050919050565b5f6020820190508181035f8301526133758161333c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6133d6602883612d86565b91506133e18261337c565b604082019050919050565b5f6020820190508181035f830152613403816133ca565b9050919050565b7f5761726d757020706572696f64206e6f74206f766572000000000000000000005f82015250565b5f61343e601683612d86565b91506134498261340a565b602082019050919050565b5f6020820190508181035f83015261346b81613432565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f6134a6601483612d86565b91506134b182613472565b602082019050919050565b5f6020820190508181035f8301526134d38161349a565b9050919050565b5f6040820190506134ed5f830185612f87565b6134fa6020830184612eb0565b9392505050565b61350a81612e7d565b8114613514575f80fd5b50565b5f8151905061352581613501565b92915050565b5f602082840312156135405761353f612cf3565b5b5f61354d84828501613517565b91505092915050565b5f6060820190506135695f830186612eb0565b6135766020830185612eb0565b6135836040830184612eb0565b949350505050565b5f61359582612e0c565b91506135a083612e0c565b9250826135b0576135af61322b565b5b828206905092915050565b7f4d696e2063617020686967686572207468616e206d61782063617000000000005f82015250565b5f6135ef601b83612d86565b91506135fa826135bb565b602082019050919050565b5f6020820190508181035f83015261361c816135e3565b9050919050565b5f6080820190506136365f830187612eb0565b6136436020830186612eb0565b6136506040830185612eb0565b61365d6060830184612eb0565b95945050505050565b5f6060820190506136795f830186612f87565b6136866020830185612f87565b6136936040830184612eb0565b949350505050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f6136cf600f83612d86565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b9050919050565b7f5761726d757020706572696f6420746f6f206c6f7700000000000000000000005f82015250565b5f613737601583612d86565b915061374282613703565b602082019050919050565b5f6020820190508181035f8301526137648161372b565b9050919050565b7f5761726d757020706572696f6420746f6f2068696768000000000000000000005f82015250565b5f61379f601683612d86565b91506137aa8261376b565b602082019050919050565b5f6020820190508181035f8301526137cc81613793565b9050919050565b5f610120820190506137e75f83018c612eb0565b6137f4602083018b612eb0565b613801604083018a612eb0565b61380e6060830189612eb0565b61381b6080830188612eb0565b61382860a0830187612eb0565b61383560c0830186612eb0565b61384260e0830185612eb0565b613850610100830184612eb0565b9a9950505050505050505050565b7f5374616b696e6720616c726561647920737461727465640000000000000000005f82015250565b5f613892601783612d86565b915061389d8261385e565b602082019050919050565b5f6020820190508181035f8301526138bf81613886565b9050919050565b7f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000005f82015250565b5f6138fa601d83612d86565b9150613905826138c6565b602082019050919050565b5f6020820190508181035f830152613927816138ee565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613988602483612d86565b91506139938261392e565b604082019050919050565b5f6020820190508181035f8301526139b58161397c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a16602283612d86565b9150613a21826139bc565b604082019050919050565b5f6020820190508181035f830152613a4381613a0a565b9050919050565b7f4c6f67207a65726f0000000000000000000000000000000000000000000000005f82015250565b5f613a7e600883612d86565b9150613a8982613a4a565b602082019050919050565b5f6020820190508181035f830152613aab81613a72565b9050919050565b5f613abc82612f53565b9150613ac783612f53565b9250828201905060ff811115613ae057613adf6131bd565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115613b3b57808604811115613b1757613b166131bd565b5b6001851615613b265780820291505b8081029050613b3485613ae6565b9450613afb565b94509492505050565b5f82613b535760019050613c0e565b81613b60575f9050613c0e565b8160018114613b765760028114613b8057613baf565b6001915050613c0e565b60ff841115613b9257613b916131bd565b5b8360020a915084821115613ba957613ba86131bd565b5b50613c0e565b5060208310610133831016604e8410600b8410161715613be45782820a905083811115613bdf57613bde6131bd565b5b613c0e565b613bf18484846001613af2565b92509050818404811115613c0857613c076131bd565b5b81810290505b9392505050565b5f613c1f82612e0c565b9150613c2a83612f53565b9250613c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b44565b905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613cb9602583612d86565b9150613cc482613c5f565b604082019050919050565b5f6020820190508181035f830152613ce681613cad565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613d47602383612d86565b9150613d5282613ced565b604082019050919050565b5f6020820190508181035f830152613d7481613d3b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613dd5602683612d86565b9150613de082613d7b565b604082019050919050565b5f6020820190508181035f830152613e0281613dc9565b9050919050565b7f45524332303a207472616e7366657220746f207374616b696e6720636f6e74725f8201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b5f613e63602383612d86565b9150613e6e82613e09565b604082019050919050565b5f6020820190508181035f830152613e9081613e57565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ef1602183612d86565b9150613efc82613e97565b604082019050919050565b5f6020820190508181035f830152613f1e81613ee5565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f613f59601f83612d86565b9150613f6482613f25565b602082019050919050565b5f6020820190508181035f830152613f8681613f4d565b905091905056fea2646970667358221220c2a4ebe1bd43a907b84eeceb39a04708d899ed8acac68989755632cb618020f664736f6c634300081a00330000000000000000000000008888888888888e0ff220b240499e30430458e568000000000000000000000000ceb63072d4689cc1104a07f0c5392b9957a6ba8e00000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610340575f3560e01c80637419f190116101b6578063c4968c9a11610102578063dd62ed3e116100a0578063ecdd98be1161007a578063ecdd98be14610988578063ef037fb9146109a6578063f0f44260146109c2578063f2fde38b146109de57610340565b8063dd62ed3e1461091e578063deac361a1461094e578063e63ea4081461096c57610340565b8063cca1ef6e116100dc578063cca1ef6e14610896578063d5abeb01146108c6578063d5e1fc1f146108e4578063d9565b031461090057610340565b8063c4968c9a1461083e578063c55dae631461085c578063cc1b63d51461087a57610340565b806395d89b411161016f578063a85667c511610149578063a85667c5146107ca578063a9059cbb146107e6578063af14052c14610816578063be8edf5c1461082057610340565b806395d89b4114610760578063a4168bcf1461077e578063a694fc3a146107ae57610340565b80637419f190146106ae5780637ed8f653146106cc57806383e373b0146106ea57806389edeb74146107085780638bd1d033146107265780638da5cb5b1461074257610340565b80632e187a681161029057806351d4a5801161022e578063663dcdbc11610208578063663dcdbc14610638578063665a11ca1461065657806370a0823114610674578063715018a6146106a457610340565b806351d4a580146105de578063529bed7f146105fc57806361d027b31461061a57610340565b80634508a6cc1161026a5780634508a6cc1461055457806345885bfe146105845780634a7c4d18146105a25780634befa981146105c057610340565b80632e187a68146104fa57806330643c4114610518578063313ce5671461053657610340565b806316bb6c13116102fd5780631ad25ffb116102d75780631ad25ffb1461046057806323b872dd146104905780632986c0e5146104c05780632e17de78146104de57610340565b806316bb6c131461040857806318160ddd146104245780631924063e1461044257610340565b8063018770201461034457806306fdde0314610360578063095ea7b31461037e57806309bc773f146103ae5780630f336d48146103cc578063118ab4e1146103ea575b5f80fd5b61035e60048036038101906103599190612d51565b6109fa565b005b610368610a88565b6040516103759190612dec565b60405180910390f35b61039860048036038101906103939190612e3f565b610b14565b6040516103a59190612e97565b60405180910390f35b6103b6610b2a565b6040516103c39190612ebf565b60405180910390f35b6103d4610b30565b6040516103e19190612ebf565b60405180910390f35b6103f2610d81565b6040516103ff9190612ebf565b60405180910390f35b610422600480360381019061041d9190612d51565b610d87565b005b61042c610e6a565b6040516104399190612ebf565b60405180910390f35b61044a610e73565b6040516104579190612ebf565b60405180910390f35b61047a60048036038101906104759190612d51565b610e79565b6040516104879190612ebf565b60405180910390f35b6104aa60048036038101906104a59190612ed8565b610e8e565b6040516104b79190612e97565b60405180910390f35b6104c8610f7b565b6040516104d59190612ebf565b60405180910390f35b6104f860048036038101906104f39190612f28565b610f8a565b005b61050261132f565b60405161050f9190612ebf565b60405180910390f35b610520611335565b60405161052d9190612ebf565b60405180910390f35b61053e61133b565b60405161054b9190612f6e565b60405180910390f35b61056e60048036038101906105699190612f28565b61134d565b60405161057b9190612ebf565b60405180910390f35b61058c611375565b6040516105999190612ebf565b60405180910390f35b6105aa61137e565b6040516105b79190612ebf565b60405180910390f35b6105c8611384565b6040516105d59190612ebf565b60405180910390f35b6105e66113a4565b6040516105f39190612ebf565b60405180910390f35b6106046113aa565b6040516106119190612ebf565b60405180910390f35b6106226113f8565b60405161062f9190612f96565b60405180910390f35b61064061141d565b60405161064d9190612ebf565b60405180910390f35b61065e611433565b60405161066b9190612f96565b60405180910390f35b61068e60048036038101906106899190612d51565b611458565b60405161069b9190612ebf565b60405180910390f35b6106ac6114ab565b005b6106b66114be565b6040516106c39190612ebf565b60405180910390f35b6106d46114c4565b6040516106e19190612ebf565b60405180910390f35b6106f26114ca565b6040516106ff9190612ebf565b60405180910390f35b6107106114d0565b60405161071d9190612ebf565b60405180910390f35b610740600480360381019061073b9190612faf565b6114d6565b005b61074a611580565b6040516107579190612f96565b60405180910390f35b6107686115a7565b6040516107759190612dec565b60405180910390f35b61079860048036038101906107939190612f28565b611633565b6040516107a59190612ebf565b60405180910390f35b6107c860048036038101906107c39190612f28565b61165b565b005b6107e460048036038101906107df9190612f28565b61196c565b005b61080060048036038101906107fb9190612e3f565b611a07565b60405161080d9190612e97565b60405180910390f35b61081e611a1d565b005b610828611bda565b6040516108359190612ebf565b60405180910390f35b610846611cc2565b6040516108539190612ebf565b60405180910390f35b610864611cc8565b6040516108719190612f96565b60405180910390f35b610894600480360381019061088f9190612f28565b611cee565b005b6108b060048036038101906108ab9190612d51565b611d7b565b6040516108bd9190612ebf565b60405180910390f35b6108ce611dec565b6040516108db9190612ebf565b60405180910390f35b6108fe60048036038101906108f99190612e3f565b611df2565b005b610908611e42565b6040516109159190612ebf565b60405180910390f35b61093860048036038101906109339190613013565b611e48565b6040516109459190612ebf565b60405180910390f35b610956611eca565b6040516109639190612ebf565b60405180910390f35b61098660048036038101906109819190612ed8565b611ed0565b005b610990611fc7565b60405161099d9190612ebf565b60405180910390f35b6109c060048036038101906109bb9190612f28565b611fcd565b005b6109dc60048036038101906109d79190612d51565b612016565b005b6109f860048036038101906109f39190612d51565b6120a4565b005b610a02612128565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a60405160405180910390a250565b60018054610a959061307e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac19061307e565b8015610b0c5780601f10610ae357610100808354040283529160200191610b0c565b820191905f5260205f20905b815481529060010190602001808311610aef57829003601f168201915b505050505081565b5f610b203384846121af565b6001905092915050565b600b5481565b5f8060105490505f600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610bb49190612f96565b602060405180830381865afa158015610bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf391906130c2565b90505f8111610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613137565b60405180910390fd5b5f60095411610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c729061319f565b60405180910390fd5b5f81670de0b6b3a764000084610c9191906131ea565b610c9b9190613258565b9050670de0b6b3a7640000600a610cb291906131ea565b811115610cd157670de0b6b3a7640000600a610cce91906131ea565b90505b5f670de0b6b3a764000060095483610ce991906131ea565b610cf39190613258565b90505f81670de0b6b3a7640000610d0a9190613288565b90505f610d1682612372565b90505f610d30600a600954610d2b91906131ea565b612372565b82600754600854610d4191906132bb565b610d4b91906131ea565b610d559190613258565b600854610d6291906132bb565b9050600754811015610d745760075490505b8097505050505050505090565b60065481565b610d8f612128565b5f151560165f9054906101000a900460ff16151514610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda9061335e565b60405180910390fd5b80600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb37060405160405180910390a250565b5f601054905090565b600e5481565b6019602052805f5260405f205f915090505481565b5f8060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906133ec565b60405180910390fd5b610f598585856124a4565b610f6f85338584610f6a91906132bb565b6121af565b60019150509392505050565b5f610f8530611458565b905090565b60155460195f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205442610fd691906132bb565b1015611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613454565b60405180910390fd5b61101f611a1d565b5f6011548261102e91906131ea565b90508060175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a7906134bc565b60405180910390fd5b6110ba33836128a3565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b81526004016111179291906134da565b5f604051808303815f87803b15801561112e575f80fd5b505af1158015611140573d5f803e3d5ffd5b505050505f612710600c548461115691906131ea565b6111609190613258565b90505f818461116f91906132bb565b9050600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111ce9291906134da565b6020604051808303815f875af11580156111ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120e919061352b565b505f8211156112d757600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016112959291906134da565b6020604051808303815f875af11580156112b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d5919061352b565b505b3373ffffffffffffffffffffffffffffffffffffffff167ffbd65cfd6de1493db337385c0712095397ecbd0504df64b861cdfceb80c7b42285848460405161132193929190613556565b60405180910390a250505050565b60105481565b60125481565b60035f9054906101000a900460ff1681565b5f80612710600c548461136091906131ea565b61136a9190613258565b905080915050919050565b5f600654905090565b60095481565b5f61138d610b30565b611395611375565b61139f9190613288565b905090565b60075481565b5f600d544210156113ca5742600d546113c391906132bb565b90506113f5565b600a54600d54426113db91906132bb565b6113e5919061358b565b600a546113f291906132bb565b90505b90565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60125460135461142e91906132bb565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60115460175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546114a49190613258565b9050919050565b6114b3612128565b6114bc5f612a67565b565b600d5481565b60115481565b600c5481565b600a5481565b6114de612128565b81831115611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890613605565b60405180910390fd5b836006819055508260078190555081600881905550806009819055507f56868216d91d6464abc5e886219763832e60a15138e4b9b39622e814215ccc7c848484846040516115729493929190613623565b60405180910390a150505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600280546115b49061307e565b80601f01602080910402602001604051908101604052809291908181526020018280546115e09061307e565b801561162b5780601f106116025761010080835404028352916020019161162b565b820191905f5260205f20905b81548152906001019060200180831161160e57829003601f168201915b505050505081565b5f80612710600b548461164691906131ea565b6116509190613258565b905080915050919050565b611663611a1d565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016116c293929190613666565b6020604051808303815f875af11580156116de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611702919061352b565b611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906136e5565b60405180910390fd5b5f612710600b548361175391906131ea565b61175d9190613258565b90505f818361176c91906132bb565b9050600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b81526004016117c99190612ebf565b5f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b505050505f8211156118be57600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161187c9291906134da565b6020604051808303815f875af1158015611898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bc919061352b565b505b6118c83382612b28565b5f6015541115611915574260195f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b3373ffffffffffffffffffffffffffffffffffffffff167ff556991011e831bcfac4f406d547e5e32cdd98267efab83935230d5f8d02c44684848460405161195f93929190613556565b60405180910390a2505050565b611974612128565b5f8110156119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae9061374d565b60405180910390fd5b620151808111156119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f4906137b5565b60405180910390fd5b8060158190555050565b5f611a133384846124a4565b6001905092915050565b600d544210611bd8575f80600e5411611a3857600d54611a3c565b600e545b90505f600a548242611a4e91906132bb565b611a589190613258565b90505f8103611a68575050611bd8565b5f611a71611375565b90505f611a7c610b30565b90505f8183611a8b9190613288565b90505f600a546301e13380611aa09190613258565b90505f8183611aaf9190613258565b90505f6064670de0b6b3a76400008884601354611acc91906131ea565b611ad691906131ea565b611ae09190613258565b611aea9190613258565b90505f8103611b1f5786600a54611b0191906131ea565b88611b0c9190613288565b600e819055505050505050505050611bd8565b8060135f828254611b309190613288565b92505081905550601354601454611b479190613258565b601181905550601154600f54611b5d9190613258565b60108190555086600a54611b7191906131ea565b88611b7c9190613288565b600e819055507f82ec6dc57ebf74c563b660545554cb4bb01fc6e3e89020f8f47dd324e64eeaf48686848b8b60135487601154601054604051611bc7999897969594939291906137d3565b60405180910390a150505050505050505b565b5f80611be4611375565b90505f611bef610b30565b90505f8183611bfe9190613288565b90505f80600e5411611c1257600d54611c16565b600e545b905042811115611c2c575f945050505050611cbf565b5f600a548242611c3c91906132bb565b611c469190613258565b90505f8103611c5457600190505b5f600a546301e13380611c679190613258565b90505f8185611c769190613258565b90505f6064670de0b6b3a76400008584601054611c9391906131ea565b611c9d91906131ea565b611ca79190613258565b611cb19190613258565b905080985050505050505050505b90565b60145481565b600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf6612128565b600d544210611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d31906138a8565b60405180910390fd5b80600d819055507fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f7581604051611d709190612ebf565b60405180910390a150565b5f80611d85611bda565b90505f611d9184611458565b90505f601054670de0b6b3a764000083611dab91906131ea565b611db59190613258565b90506064670de0b6b3a76400008285611dce91906131ea565b611dd89190613258565b611de29190613258565b9350505050919050565b60135481565b611dfa612128565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611e3d573d5f803e3d5ffd5b505050565b60085481565b5f60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60155481565b611ed8612128565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90613910565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611f819291906134da565b6020604051808303815f875af1158015611f9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc1919061352b565b50505050565b600f5481565b611fd5612128565b80600a819055507fa0df1b641bcb350bfc38973452497c08c1314b4788866ea2c6eaab659573df248160405161200b9190612ebf565b60405180910390a150565b61201e612128565b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f60405160405180910390a250565b6120ac612128565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361211c575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016121139190612f96565b60405180910390fd5b61212581612a67565b50565b612130612cec565b73ffffffffffffffffffffffffffffffffffffffff1661214e611580565b73ffffffffffffffffffffffffffffffffffffffff16146121ad57612171612cec565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121a49190612f96565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361221d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122149061399e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290613a2c565b60405180910390fd5b8060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123659190612ebf565b60405180910390a3505050565b5f8082116123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90613a94565b60405180910390fd5b5f5b670de0b6b3a7640000600a6123cc91906131ea565b83106123fc57600a836123df9190613258565b9250670de0b6b3a7640000816123f59190613288565b90506123b7565b5f5b60128160ff16101561249a57670de0b6b3a7640000848561241f91906131ea565b6124299190613258565b9350670de0b6b3a7640000600a61244091906131ea565b841061248f57600a846124539190613258565b93506001816124629190613ab2565b600261246e9190613c15565b670de0b6b3a76400006124819190613258565b8261248c9190613288565b91505b8060010190506123fe565b5080915050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990613ccf565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257790613d5d565b60405180910390fd5b6011548161258e91906131ea565b60175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260490613deb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061267357503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990613e79565b60405180910390fd5b6126ba611a1d565b5f612710825f6126ca91906131ea565b6126d49190613258565b90505f81836126e391906132bb565b90505f601154826126f491906131ea565b90505f6011548461270591906131ea565b905080826127139190613288565b60175f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461275e91906132bb565b925050819055508160175f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546127b19190613288565b925050819055505f811115612835578060175f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461282d9190613288565b925050819055505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516128929190612ebf565b60405180910390a350505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290890613f07565b60405180910390fd5b5f6011548261292091906131ea565b905080600f5f82825461293391906132bb565b925050819055508160105f82825461294b91906132bb565b925050819055508060175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461299e91906132bb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f4d667732637549615f3cd28023b13380094dd975c0ac7c1b26916a8b1363b7ec83836011546010546040516129f59493929190613623565b60405180910390a25f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a5a9190612ebf565b60405180910390a3505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8d90613f6f565b60405180910390fd5b5f60115482612ba591906131ea565b905080600f5f828254612bb89190613288565b925050819055508160105f828254612bd09190613288565b925050819055508060175f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612c239190613288565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66698383601154601054604051612c7a9493929190613623565b60405180910390a28273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612cdf9190612ebf565b60405180910390a3505050565b5f33905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d2082612cf7565b9050919050565b612d3081612d16565b8114612d3a575f80fd5b50565b5f81359050612d4b81612d27565b92915050565b5f60208284031215612d6657612d65612cf3565b5b5f612d7384828501612d3d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612dbe82612d7c565b612dc88185612d86565b9350612dd8818560208601612d96565b612de181612da4565b840191505092915050565b5f6020820190508181035f830152612e048184612db4565b905092915050565b5f819050919050565b612e1e81612e0c565b8114612e28575f80fd5b50565b5f81359050612e3981612e15565b92915050565b5f8060408385031215612e5557612e54612cf3565b5b5f612e6285828601612d3d565b9250506020612e7385828601612e2b565b9150509250929050565b5f8115159050919050565b612e9181612e7d565b82525050565b5f602082019050612eaa5f830184612e88565b92915050565b612eb981612e0c565b82525050565b5f602082019050612ed25f830184612eb0565b92915050565b5f805f60608486031215612eef57612eee612cf3565b5b5f612efc86828701612d3d565b9350506020612f0d86828701612d3d565b9250506040612f1e86828701612e2b565b9150509250925092565b5f60208284031215612f3d57612f3c612cf3565b5b5f612f4a84828501612e2b565b91505092915050565b5f60ff82169050919050565b612f6881612f53565b82525050565b5f602082019050612f815f830184612f5f565b92915050565b612f9081612d16565b82525050565b5f602082019050612fa95f830184612f87565b92915050565b5f805f8060808587031215612fc757612fc6612cf3565b5b5f612fd487828801612e2b565b9450506020612fe587828801612e2b565b9350506040612ff687828801612e2b565b925050606061300787828801612e2b565b91505092959194509250565b5f806040838503121561302957613028612cf3565b5b5f61303685828601612d3d565b925050602061304785828601612d3d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061309557607f821691505b6020821081036130a8576130a7613051565b5b50919050565b5f815190506130bc81612e15565b92915050565b5f602082840312156130d7576130d6612cf3565b5b5f6130e4848285016130ae565b91505092915050565b7f4c502062616c616e6365207a65726f00000000000000000000000000000000005f82015250565b5f613121600f83612d86565b915061312c826130ed565b602082019050919050565b5f6020820190508181035f83015261314e81613115565b9050919050565b7f44796e616d69632041505220636f6e7374616e74207a65726f000000000000005f82015250565b5f613189601983612d86565b915061319482613155565b602082019050919050565b5f6020820190508181035f8301526131b68161317d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6131f482612e0c565b91506131ff83612e0c565b925082820261320d81612e0c565b91508282048414831517613224576132236131bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61326282612e0c565b915061326d83612e0c565b92508261327d5761327c61322b565b5b828204905092915050565b5f61329282612e0c565b915061329d83612e0c565b92508282019050808211156132b5576132b46131bd565b5b92915050565b5f6132c582612e0c565b91506132d083612e0c565b92508282039050818111156132e8576132e76131bd565b5b92915050565b7f4261736520746f6b656e2063616e206f6e6c7920626520736574206f6e63652c5f8201527f20616e6420697320696d6d757461626c65206166746572776172647300000000602082015250565b5f613348603c83612d86565b9150613353826132ee565b604082019050919050565b5f6020820190508181035f8301526133758161333c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6133d6602883612d86565b91506133e18261337c565b604082019050919050565b5f6020820190508181035f830152613403816133ca565b9050919050565b7f5761726d757020706572696f64206e6f74206f766572000000000000000000005f82015250565b5f61343e601683612d86565b91506134498261340a565b602082019050919050565b5f6020820190508181035f83015261346b81613432565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f6134a6601483612d86565b91506134b182613472565b602082019050919050565b5f6020820190508181035f8301526134d38161349a565b9050919050565b5f6040820190506134ed5f830185612f87565b6134fa6020830184612eb0565b9392505050565b61350a81612e7d565b8114613514575f80fd5b50565b5f8151905061352581613501565b92915050565b5f602082840312156135405761353f612cf3565b5b5f61354d84828501613517565b91505092915050565b5f6060820190506135695f830186612eb0565b6135766020830185612eb0565b6135836040830184612eb0565b949350505050565b5f61359582612e0c565b91506135a083612e0c565b9250826135b0576135af61322b565b5b828206905092915050565b7f4d696e2063617020686967686572207468616e206d61782063617000000000005f82015250565b5f6135ef601b83612d86565b91506135fa826135bb565b602082019050919050565b5f6020820190508181035f83015261361c816135e3565b9050919050565b5f6080820190506136365f830187612eb0565b6136436020830186612eb0565b6136506040830185612eb0565b61365d6060830184612eb0565b95945050505050565b5f6060820190506136795f830186612f87565b6136866020830185612f87565b6136936040830184612eb0565b949350505050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f6136cf600f83612d86565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b9050919050565b7f5761726d757020706572696f6420746f6f206c6f7700000000000000000000005f82015250565b5f613737601583612d86565b915061374282613703565b602082019050919050565b5f6020820190508181035f8301526137648161372b565b9050919050565b7f5761726d757020706572696f6420746f6f2068696768000000000000000000005f82015250565b5f61379f601683612d86565b91506137aa8261376b565b602082019050919050565b5f6020820190508181035f8301526137cc81613793565b9050919050565b5f610120820190506137e75f83018c612eb0565b6137f4602083018b612eb0565b613801604083018a612eb0565b61380e6060830189612eb0565b61381b6080830188612eb0565b61382860a0830187612eb0565b61383560c0830186612eb0565b61384260e0830185612eb0565b613850610100830184612eb0565b9a9950505050505050505050565b7f5374616b696e6720616c726561647920737461727465640000000000000000005f82015250565b5f613892601783612d86565b915061389d8261385e565b602082019050919050565b5f6020820190508181035f8301526138bf81613886565b9050919050565b7f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000005f82015250565b5f6138fa601d83612d86565b9150613905826138c6565b602082019050919050565b5f6020820190508181035f830152613927816138ee565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613988602483612d86565b91506139938261392e565b604082019050919050565b5f6020820190508181035f8301526139b58161397c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a16602283612d86565b9150613a21826139bc565b604082019050919050565b5f6020820190508181035f830152613a4381613a0a565b9050919050565b7f4c6f67207a65726f0000000000000000000000000000000000000000000000005f82015250565b5f613a7e600883612d86565b9150613a8982613a4a565b602082019050919050565b5f6020820190508181035f830152613aab81613a72565b9050919050565b5f613abc82612f53565b9150613ac783612f53565b9250828201905060ff811115613ae057613adf6131bd565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115613b3b57808604811115613b1757613b166131bd565b5b6001851615613b265780820291505b8081029050613b3485613ae6565b9450613afb565b94509492505050565b5f82613b535760019050613c0e565b81613b60575f9050613c0e565b8160018114613b765760028114613b8057613baf565b6001915050613c0e565b60ff841115613b9257613b916131bd565b5b8360020a915084821115613ba957613ba86131bd565b5b50613c0e565b5060208310610133831016604e8410600b8410161715613be45782820a905083811115613bdf57613bde6131bd565b5b613c0e565b613bf18484846001613af2565b92509050818404811115613c0857613c076131bd565b5b81810290505b9392505050565b5f613c1f82612e0c565b9150613c2a83612f53565b9250613c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b44565b905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613cb9602583612d86565b9150613cc482613c5f565b604082019050919050565b5f6020820190508181035f830152613ce681613cad565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613d47602383612d86565b9150613d5282613ced565b604082019050919050565b5f6020820190508181035f830152613d7481613d3b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613dd5602683612d86565b9150613de082613d7b565b604082019050919050565b5f6020820190508181035f830152613e0281613dc9565b9050919050565b7f45524332303a207472616e7366657220746f207374616b696e6720636f6e74725f8201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b5f613e63602383612d86565b9150613e6e82613e09565b604082019050919050565b5f6020820190508181035f830152613e9081613e57565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ef1602183612d86565b9150613efc82613e97565b604082019050919050565b5f6020820190508181035f830152613f1e81613ee5565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f613f59601f83612d86565b9150613f6482613f25565b602082019050919050565b5f6020820190508181035f830152613f8681613f4d565b905091905056fea2646970667358221220c2a4ebe1bd43a907b84eeceb39a04708d899ed8acac68989755632cb618020f664736f6c634300081a0033

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

0000000000000000000000008888888888888e0ff220b240499e30430458e568000000000000000000000000ceb63072d4689cc1104a07f0c5392b9957a6ba8e00000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseToken (address): 0x8888888888888e0Ff220b240499E30430458E568
Arg [1] : _liquidityPool (address): 0xCeB63072d4689CC1104a07f0C5392b9957A6ba8e
Arg [2] : _treasury (address): 0x31B6A4DCA90FABf29879143CA5bB2c10E8A11e4c
Arg [3] : _stakeStartTime (uint256): 0

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000008888888888888e0ff220b240499e30430458e568
Arg [1] : 000000000000000000000000ceb63072d4689cc1104a07f0c5392b9957a6ba8e
Arg [2] : 00000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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