ETH Price: $3,008.10 (-0.16%)
Gas: 5 Gwei

Token

Fluid ($OOO)
 

Overview

Max Total Supply

6,580 $OOO

Holders

160

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.456141391152338723 $OOO

Value
$0.00
0x6F83b28df2302dF96Fbd2290098C36E54eb087A2
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:
FluidMachineToken

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: LiquidERC20_v2.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapRouter02 is IUniswapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


 
abstract contract Ownable {
    address private _owner;

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

    
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    
    function owner() public view returns (address) {
        return _owner;
    }

    
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


 
 
library Address {
    
    function isContract(address account) internal view returns (bool) {
            uint256 size;
           assembly { size := extcodesize(account) }
        return size > 0;
    }

    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

           (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

           (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

           (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

           (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
                   if (returndata.length > 0) {
                                 assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
 
library EnumerableSet {
    

    struct Set {
           bytes32[] _values;

              mapping (bytes32 => uint256) _indexes;
    }

    
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
                          set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    
    function _remove(Set storage set, bytes32 value) private returns (bool) {
           uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { 
                            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

                     bytes32 lastvalue = set._values[lastIndex];

                   set._values[toDeleteIndex] = lastvalue;
                   set._indexes[lastvalue] = valueIndex; 

                   set._values.pop();

                   delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    

    struct Bytes32Set {
        Set _inner;
    }

    
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    

    struct AddressSet {
        Set _inner;
    }

    
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    

    struct UintSet {
        Set _inner;
    }

    
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

contract FluidMachineToken is IERC20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping (address => uint256) public _balances;
    mapping (address => mapping (address => uint256)) public _allowances;
    mapping (address => uint256) public _sellLock;


    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromSellLock;

    mapping (address => bool) public _blacklist;
    bool isBlacklist = true;

    
    string public constant _name = 'Fluid';
    string public constant _symbol = '$OOO';
    uint256 public constant InitialSupply= 10 * 10**3 * (10**_decimals);

    uint256 swapLimit = 50 * 10 * (10**_decimals); // 0,5%
    bool isSwapPegged = true;

    
    uint16 public  BuyLimitDivider=50; // 2%
    
    uint8 public   BalanceLimitDivider=25; // 4%
    
    uint16 public  SellLimitDivider=125; // 0.75%
    
    uint16 public  MaxSellLockTime= 10 seconds;
    
    mapping (address => bool) is_auth;
    
    
    address public constant UniswapRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public constant Dead = 0x000000000000000000000000000000000000dEaD;
    
    uint256 public _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 public  buyLimit = _circulatingSupply;

    
    uint8 _buyTax=9;
    uint8 _sellTax=9;
    uint8 _transferTax=9;
    uint8 _liquidityTax=30;
    uint8 _marketingTax=30;
    uint8 _growthTax=20;
    uint8 _treasuryTax=20;

    uint8 public constant _decimals = 18;

    bool isTokenSwapManual = false;
    bool public debot = false;


    address public uniswap_PairAddress;
    IUniswapRouter02 public  uniswap_Router;

    
    modifier onlyAuth() {
        require(_is_auth(msg.sender), "Caller not in Auth");
        _;
    }
    
    
    function _is_auth(address addr) private view returns (bool){
        return addr==owner()||is_auth[addr];
    }


    address  USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

    bool are_fees_on;
    
    // NFT Linking
    address public fluid;
    Fluid fluid_controller;
    
    constructor () {
        _balances[msg.sender] = _circulatingSupply;
        emit Transfer(address(0), msg.sender, _circulatingSupply);

        uniswap_Router = IUniswapRouter02(UniswapRouter);

        uniswap_PairAddress = IUniswapFactory(uniswap_Router.factory()).createPair(address(this), USDC);

        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
        buyLimit=InitialSupply/BuyLimitDivider;

        
        sellLockTime=2 seconds;


        _excluded.add(msg.sender);
        _excludedFromSellLock.add(UniswapRouter);
        _excludedFromSellLock.add(uniswap_PairAddress);
        _excludedFromSellLock.add(address(this));
    } 

    
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        if(isBlacklist) {
            require(!_blacklist[sender] && !_blacklist[recipient], "Blacklisted!");
        }

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient) || is_auth[sender] || is_auth[recipient] || sender==fluid || recipient==fluid);

        bool isContractTransfer=(sender==address(this) || recipient==address(this));

        bool isLiquidityTransfer = ((sender == uniswap_PairAddress && recipient == UniswapRouter)
        || (recipient == uniswap_PairAddress && sender == UniswapRouter));


        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
      
        else{
            if (!letsgo) {
                if (sender != owner() && recipient != owner()) {
                    if (debot) {
                        emit Transfer(sender,recipient,0);
                        return;
                    }
                    else {
                        require(letsgo,"trading not yet enabled");
                    }
                }
            }
        

            bool isBuy=sender==uniswap_PairAddress|| sender == UniswapRouter;
            bool isSell=recipient==uniswap_PairAddress|| recipient == UniswapRouter;
            bool isTransfer = !isBuy && !isSell;
            _taxedTransfer(sender,recipient,amount,isBuy,isSell, isTransfer);


        }
    }
    
    
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell, bool isTransfer) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");


        swapLimit = sellLimit/2;

        uint8 tax;
        if(isSell){
            if(!_excludedFromSellLock.contains(sender)){
                           require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                           _sellLock[sender]=block.timestamp+sellLockTime;
            }
            
            require(amount<=sellLimit,"Dump protection");
            tax=_sellTax;

        } else if(isBuy){
                   require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount<=buyLimit, "whale protection");
            tax=_buyTax;

        } else {
                   require(recipientBalance+amount<=balanceLimit,"whale protection");
                          if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }

        uint256 taxedAmount;

        if(are_fees_on) {
                 if((sender!=uniswap_PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier))
            _swapContractToken(amount);
           uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax+_growthTax+_treasuryTax);
           taxedAmount=amount-(contractToken);
           _balances[address(this)] += contractToken;
            emit Transfer(sender,address(this),contractToken);
        } else {
            taxedAmount = amount;
        }
           _removeToken(sender,amount);

           _addToken(recipient, taxedAmount);

        
        fluid_controller.on_transfer(sender, recipient, amount, isBuy, isSell, isTransfer);

        emit Transfer(sender,recipient,taxedAmount);
    



    }
    
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
           _removeToken(sender,amount);
           _addToken(recipient, amount);

        emit Transfer(sender,recipient,amount);

    }
    
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
    
    
    function _addToken(address addr, uint256 amount) private {
           uint256 newAmount=_balances[addr]+amount;
        _balances[addr]=newAmount;

    }


    
    function _removeToken(address addr, uint256 amount) private {
           uint256 newAmount=_balances[addr]-amount;
        _balances[addr]=newAmount;
    }

    
    bool private _isTokenSwaping;
    
    uint256 public totalTokenSwapGenerated;
    
    uint256 public totalPayouts;

    
    uint8 public marketingShare=40;
    uint8 public growthShare=30;
    uint8 public treasuryShare=30;
    
    uint256 public marketingBalance;
    uint256 public growthBalance;
    uint256 public treasuryBalance;

    
    

    
    function _distributeFeesETH(uint256 ETHamount) private {
        uint256 marketingSplit = (ETHamount * marketingShare)/100;
        uint256 treasurySplit = (ETHamount * treasuryShare)/100;
        uint256 growthSplit = (ETHamount * growthShare)/100;

        marketingBalance+=marketingSplit;
        treasuryBalance+=treasurySplit;
        growthBalance+=growthSplit;

    }


    

    
    uint256 public totalLPETH;
    
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    
    
    function _swapContractToken(uint256 totalMax) private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_marketingTax;
        uint256 tokenToSwap=swapLimit;
        if(tokenToSwap > totalMax) {
            if(isSwapPegged) {
                tokenToSwap = totalMax;
            }
        }
           if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= (tokenToSwap*_marketingTax)/totalTax;
        uint256 tokenForTreasury= (tokenToSwap*_treasuryTax)/totalTax;
        uint256 tokenForGrowth= (tokenToSwap*_growthTax)/totalTax;

        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

           uint256 swapToken=liqETHToken+tokenForMarketing+tokenForGrowth+tokenForTreasury;
           uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        uint256 generatedETH=(address(this).balance - initialETHBalance);
        _distributeFeesETH(generatedETH);
    }
    
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(uniswap_Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = USDC;

        uniswap_Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    
    function _addLiquidity(uint256 tokenamount, uint256 ETHamount) private {
        totalLPETH+=ETHamount;
        _approve(address(this), address(uniswap_Router), tokenamount);
        uniswap_Router.addLiquidityETH{value: ETHamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    /// @notice Utilities

    function ToolBox_destroy(uint256 amount) public onlyAuth {
        require(_balances[address(this)] >= amount);
        _balances[address(this)] -= amount;
        _circulatingSupply -= amount;
        emit Transfer(address(this), Dead, amount);
    }    

    function ToolBox_getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/1, sellLimit/1);
    }

    function ToolBox_getTaxes() public view returns(uint256 treasuryTax, uint256 growthTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_treasuryTax, _growthTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
    
    function ToolBox_getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
        uint256 lockTime=_sellLock[AddressToCheck];
        if(lockTime<=block.timestamp)
        {
            return 0;
        }
        return lockTime-block.timestamp;
    }
    function ToolBox_getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;


    function ToolBox_SetPeggedSwap(bool isPegged) public onlyAuth {
        isSwapPegged = isPegged;
    }

    function ToolBox_SetMaxSwap(uint256 max) public onlyAuth {
        swapLimit = max;
    }

    function ToolBox_SetMaxLockTime(uint16 max) public onlyAuth {
     MaxSellLockTime = max;
    }

    /// @notice AccessControl Functions

    function AccessControl_BlackListAddress(address addy, bool booly) public onlyAuth {
        _blacklist[addy] = booly;
    }
    

    function AccessControl_SetAuth(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }

    function AccessControl_ExcludeAccountFromFees(address account) public onlyAuth {
        _excluded.add(account);
    }
    function AccessControl_IncludeAccountToFees(address account) public onlyAuth {
        _excluded.remove(account);
    }
    
    function AccessControl_ExcludeAccountFromSellLock(address account) public onlyAuth {
        _excludedFromSellLock.add(account);
    }
    function AccessControl_IncludeAccountToSellLock(address account) public onlyAuth {
        _excludedFromSellLock.remove(account);
    }

    function OOO_WithdrawMarketingETH() public onlyAuth{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        address sender = msg.sender;
        (bool sent,) =sender.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }

    function OOO_WithdrawGrowthETH() public onlyAuth{
        uint256 amount=growthBalance;
        growthBalance=0;
        address sender = msg.sender;
        (bool sent,) =sender.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }

    function OOO_WithdrawTreasuryETH() public onlyAuth{
        uint256 amount=treasuryBalance;
        treasuryBalance=0;
        address sender = msg.sender;
        (bool sent,) =sender.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }

    function OOO_revert() public onlyAuth {
        selfdestruct(payable(msg.sender));
    }

    function OOO_set_usdc(address usdc_) public onlyAuth {
        USDC = usdc_;
    }

    function set_fluid(address fluid_) public override onlyAuth {
        fluid = fluid_;
        fluid_controller = Fluid(fluid);
        is_auth[fluid] = true;
    }
    
    function ToolBox_SwitchManualETHConversion(bool manual) public onlyAuth{
        manualConversion=manual;
    }
    
    function ToolBox_DisableSellLock(bool disabled) public onlyAuth{
        sellLockDisabled=disabled;
    }
    
    function UTILIY_SetSellLockTime(uint256 sellLockSeconds)public onlyAuth{
        sellLockTime=sellLockSeconds;
    }

    
    function ToolBox_SetEnabledTaxes(bool enabled) public onlyAuth{ 
        are_fees_on = enabled;
    }

    function ToolBox_SetTaxes(uint8 treasuryTaxes, uint8 growthTaxes, uint8 liquidityTaxes, uint8 marketingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyAuth{
        uint8 totalTax=treasuryTaxes + growthTaxes +liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        _treasuryTax = treasuryTaxes;
        _growthTax = growthTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;

        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    
    function ToolBox_ChangeMarketingShare(uint8 newShare) public onlyAuth{
        marketingShare=newShare;
    }
    
    function ToolBox_ChangeGrowthShare(uint8 newShare) public onlyAuth{
        growthShare=newShare;
    }

    function ToolBox_ChangeTreasuryShare(uint8 newShare) public onlyAuth{
        treasuryShare=newShare;
    }

    function ToolBox_ManualGenerateTokenSwapBalance(uint256 _qty) public onlyAuth{
        _swapContractToken(_qty * 10**18);
    }

    
    function ToolBox_UpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyAuth{
        newBalanceLimit=newBalanceLimit*1;
        newSellLimit=newSellLimit*1;
        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
    }

    
    
    

    bool public letsgo;
    address private _liquidityTokenAddress;

    
    function ControlPanel_gogogo(bool booly) public onlyAuth{
        letsgo = booly;
    }

    
    function ControlPanel_LiquidityTokenAddress(address liquidityTokenAddress) public onlyAuth{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    


    function ToolBox_RescueTokens(address tknAddress) public onlyAuth {
        IERC20 token = IERC20(tknAddress);
        uint256 ourBalance = token.balanceOf(address(this));
        require(ourBalance>0, "No tokens in our balance");
        token.transfer(msg.sender, ourBalance);
    }

    

    function ToolBox_setBlacklistEnabled(bool isBlacklistEnabled) public onlyAuth {
        isBlacklist = isBlacklistEnabled;
    }

    function ToolBox_setContractTokenSwapManual(bool manual) public onlyAuth {
        isTokenSwapManual = manual;
    }

    function ToolBox_setBlacklistedAddress(address toBlacklist) public onlyAuth {
        _blacklist[toBlacklist] = true;
    }

    function ToolBox_removeBlacklistedAddress(address toRemove) public onlyAuth {
        _blacklist[toRemove] = false;
    }


    function ToolBox_AvoidLocks() public onlyAuth{
        (bool sent,) =msg.sender.call{value: (address(this).balance)}("");
        require(sent);
    }
    
    
    

    receive() external payable {}
    fallback() external payable {}
    
    function airdrop(address receiver, uint amount) public onlyAuth {
        require(_balances[address(this)] >= amount, "404");
        _balances[address(this)] -= amount;
        _balances[receiver] += amount;
        emit Transfer(address(this), receiver, amount);
    }

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

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

    function allowance(address _owner, address spender) external view override returns (uint256) {
        if(spender==fluid) {
            return _circulatingSupply;
        }
        else {
            return _allowances[_owner][spender];
        }    
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address _owner, address spender, uint256 amount) private {
        require(_owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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


    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

File 1 of 4: Fluid.sol

// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidERC20_v2.sol";
import "./LiquidERC721.sol";


contract FluidMachine is protected, Fluid {

    /* -----------------------------------------------------
                              Types
    ----------------------------------------------------- */ 

    struct STAKE_TOKEN_SLOT {
        uint quantity;
        uint starting_time;
        uint lock_end_time;
        bool is_locked;
        bool exists;
    }

    struct USER {
        uint luck;
        uint luck_factor;
        mapping(uint => STAKE_TOKEN_SLOT) staking_slot;
        uint last_stake_slot;
        // Intelligent time tracking to avoid exploitations
        uint last_mint_timestamp;
        uint last_buy_timestamp;
        uint last_sell_timestamp;
        // staking
        uint total_stake;
        bool is_staking;
    }

    mapping(address => USER) public users;
    uint public total_lucks;

    struct NFT_Extended {
        uint rarity;
        bytes32[] attributes;
    }

    mapping(uint => NFT_Extended) public nft_properties;

    uint public rares = 30;
    uint public particulars = 70;
    uint public uncommon = 140;
    uint public common = 760;

    uint cooldown_time = 6 hours;

    /* -----------------------------------------------------
                       Linking to Fluidity
    ----------------------------------------------------- */ 

    address public NFT_Token;
    address public ERC20_Token;
    IERC20 TOKEN;
    IERC721E NFT;

    /* -----------------------------------------------------
                       Linking to Extensions
    ----------------------------------------------------- */ 

    // General extension switch
    bool public are_extensions_enabled = false;
    address public extensions;
    FluidExtension ext;
    

    /* -----------------------------------------------------
                            Constructor
    ----------------------------------------------------- */ 

    constructor(){
        owner = msg.sender;
        is_auth[owner] = true;

    }

    
    function manual_set_TOKEN(address tkn) external onlyAuth {
        ERC20_Token = tkn;
        TOKEN = IERC20(ERC20_Token);
        TOKEN.set_fluid(address(this));

        is_auth[ERC20_Token] = true;
    }

    function manual_set_NFT(address nft) external onlyAuth {
        NFT_Token = nft;
        NFT = IERC721E(nft);
        NFT.set_fluid(address(this));

        is_auth[NFT_Token] = true;
    }

    /* -----------------------------------------------------
                    Fundamental Algohoritms
    ----------------------------------------------------- */ 

    /// @dev Recalculate luck factor based on swapping operations
    function luck_recalculation_from_erc20(address actor) internal {
        // Sell and buy luck refactor logic
        uint player_luck = users[actor].luck;
        if(!(total_lucks==0)) {
            total_lucks -= player_luck;
        }
        player_luck = TOKEN.balanceOf(actor);
        total_lucks += player_luck;
        users[actor].luck = player_luck;
    }

    /// @dev Recalculate the luck factor based on nft movements
    function luck_recalculation_from_erc721(uint8 operation, uint id, address actor) internal {

    }

    /// @dev This function is used to get the rarity of a mint based on luck value and randomness
    // @param actor The actor doing the operation
    function liquid_extractor(address actor) public view override returns(uint rarity){
        // Random calculation as per rarity probabilities
        uint r = randomness(1, 1000);
        uint calculated_rarity;
        if(r < rares) {
            calculated_rarity = 4; // Rares
        } else if((r >= rares) && (r < particulars)) {
            calculated_rarity = 3; // Particulars
        } else if((r >= particulars) && (r < uncommon)) {
            calculated_rarity = 2; // Uncommon
        } else if(r > uncommon) {
            calculated_rarity = 1; // Common
        }
        uint local_luck = users[actor].luck;
        // Staking bonus
        if(users[msg.sender].is_staking) {
            uint total_balance = TOKEN.balanceOf(msg.sender);
            uint total_staked = users[msg.sender].total_stake;
            uint bonus = (100*total_staked)/total_balance;
            local_luck += (bonus/4);
        }
        // Factor of luck based on % on total lucks
        uint luck_factor;
        if(total_lucks ==0) {
            luck_factor = 50;
        } else {
            luck_factor = (100*users[actor].luck)/total_lucks;
        }
        // Random probability of increasing rarity level based on luck factor
        uint rf = randomness(1,100);
        if(rf < luck_factor) {
            calculated_rarity += 1;
        }
        // Can't be more than rare
        if(calculated_rarity > 4) {
            calculated_rarity = 4;
        }
        return calculated_rarity;
    }

    function randomness(uint min, uint max) internal view returns(uint r){
        // Random 1-1000
        uint t_supply = NFT.totalSupply();
        uint seed = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, t_supply))) % (max-1);
        uint randomnumber = seed + (min);
        return randomnumber;
    }

    /* -----------------------------------------------------
                         Extensibility
    ----------------------------------------------------- */ 

    /*
        Controls
    */

    function toggle_extensions(bool enabled) public onlyAuth {
        are_extensions_enabled = enabled;
    }

    function set_extensions(address extensions_) public onlyAuth {
        extensions = extensions_;
        ext = FluidExtension(extensions);
    }


    /* -----------------------------------------------------
                         Write Methods
    ----------------------------------------------------- */ 

    function set_cooldown_time(uint cooldown_) public onlyAuth {
        cooldown_time = cooldown_;
    }

    /*
        Staking
    */

    function stake_tokens(uint quantity) public safe override returns(uint slot) {
        require(TOKEN.balanceOf(msg.sender) >= quantity, "404");
        TOKEN.transferFrom(msg.sender, address(this), quantity);
        uint last_stake_slot  = users[msg.sender].last_stake_slot;
        users[msg.sender].staking_slot[last_stake_slot].quantity = quantity;
        users[msg.sender].staking_slot[last_stake_slot].starting_time = block.timestamp;
        users[msg.sender].staking_slot[last_stake_slot].lock_end_time = block.timestamp + 7 days;
        users[msg.sender].staking_slot[last_stake_slot].is_locked = true;
        users[msg.sender].staking_slot[last_stake_slot].exists = true;
        // Staking tracking
        users[msg.sender].total_stake += quantity;
        if(users[msg.sender].total_stake > (10**18)) {
            users[msg.sender].is_staking = true;
        }
        on_stake_tokens(msg.sender, quantity);
        last_stake_slot +=1;
        return last_stake_slot-1;
    }

    function unstake_tokens(uint slot) public safe override {
        STAKE_TOKEN_SLOT memory staking_slot = users[msg.sender].staking_slot[slot];
        require(staking_slot.exists, "404");
        require(staking_slot.lock_end_time <= block.timestamp || (!staking_slot.is_locked), "403");
        require(TOKEN.balanceOf(address(this)) >= staking_slot.quantity, "401");
        TOKEN.transfer(msg.sender, staking_slot.quantity);
        // Staking tracking
        users[msg.sender].total_stake -= staking_slot.quantity;
        if(users[msg.sender].total_stake <= (10**18)) {
            users[msg.sender].is_staking = false;
        }
        on_unstake_tokens(msg.sender, slot);
        delete users[msg.sender].staking_slot[slot];
    }

    /*
        Rarity
    */

    function set_nft_rarity(uint id, uint rarity) public override onlyAuth {
        nft_properties[id].rarity = rarity;
    }


    function set_probabilities(uint _rare, uint _particular, uint _uncommon) public override onlyAuth {
        require(((_rare > _particular) && (_particular > _uncommon)) && 
                ((_rare + _particular + _uncommon) < 999), "500"); 
        rares = _rare;
        particulars = _particular;
        uncommon = _uncommon;
        common = 1000 - (_rare+_particular+_uncommon);
    }

    /*
        On events
    */

    function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) public override onlyAuth {
        if(are_extensions_enabled) {
            bool skip = ext.delegated_on_transfer( _from,
                                                   _to, 
                                                   quantity, 
                                                   is_buy, 
                                                   is_sell, 
                                                   is_transfer) ;
            if(skip) {
            return;
            }
        }


    }

    function on_nft_transfer(address _from, address _to, uint id) public override onlyAuth {
        if(are_extensions_enabled) {
            bool skip = ext.delegated_on_nft_transfer(_from, _to, id);
            if(skip) {
                return;
            }
        }
    }

    function on_nft_minting(address _from, uint quantity, uint starting_id) public override onlyAuth {
        if(are_extensions_enabled) {
            bool skip = ext.delegated_on_minting(_from, quantity, starting_id);
            if(skip) {
                return;
            }
        }
        if(!(_from==NFT_Token) && !(_from==ERC20_Token)) {
            luck_recalculation_from_erc20(_from);
            uint luck_result = liquid_extractor(_from);
            set_nft_rarity(starting_id+1, luck_result);
            users[_from].last_mint_timestamp = block.timestamp;
        }
    }

    /* -----------------------------------------------------
                     Internal Write Methods
    ----------------------------------------------------- */ 

    function on_stake_tokens(address _from, uint quantity) internal {

    }

    function on_unstake_tokens(address _from, uint slot) internal {

    }

    /* -----------------------------------------------------
                         Read Methods
    ----------------------------------------------------- */ 

    function get_nft_rarity(uint id) public view override returns (uint rarity) {
        return nft_properties[id].rarity;
    }

    function get_nft_onchain_attributes(uint id) public view override returns (bytes32[] memory attributes_) {
        return nft_properties[id].attributes;
    }

    function get_luck(address recipient) public view override returns (uint luck) {
        return users[recipient].luck;
    }
    
    function set_luck(address recipient, uint _luck) public override onlyAuth {
        uint current_luck = users[recipient].luck;
        if(total_lucks >= users[recipient].luck) {
            total_lucks -= current_luck;
        }
        else {
            total_lucks = 0;
        }
        users[recipient].luck = _luck;
        total_lucks += _luck;
    }

    function get_stake_status(address actor) public view override returns (uint total, bool is_it) {
        return(users[actor].total_stake, users[actor].is_staking);
    }

    function get_probabilities() public view override returns (uint rare_, uint particular_, uint uncommon_, uint common_) {
        return(rares,particulars,uncommon,common);
    }


    function get_all_lucks() public view override returns (uint all_lucks) {
        return total_lucks;
    }

}

File 3 of 4: LiquidERC721.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract Fluid_NFT is IERC721E, protected {

    // Token Linking
    address public fluid;
    Fluid fluid_controller;
    function set_fluid(address fluid_) public override onlyAuth {
        fluid = fluid_;
        fluid_controller = Fluid(fluid);
        is_auth[fluid] = true;
    }


    uint minting_price = 50000000000000000; // 0.05 ETH

    /* On Chain Metadata Structures */

    mapping(uint => bool) public tokenProtection;

    string public _baseURI_;
    string public _endpointURI_;

    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    mapping(address => mapping(uint256 =>bool)) public owned_NFT_Ids;

    mapping(address => uint256) public owned_NFT_count;

    mapping(address => uint256) public owned_protected_count;

    /// Maximum values
    uint public max_mint;

    constructor(string memory name_, string memory symbol_, uint _max_mint, uint initial_mint, address owner_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
        max_mint = _max_mint;
        _initial_mint(msg.sender, initial_mint);
        owner = owner_;
        is_auth[owner] = true;
        is_auth[msg.sender] = true;
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() public view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner_) public view override returns (uint256) {
        if (_addressToUint256(owner_) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner_] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner_) internal view returns (uint256) {
        return (_packedAddressData[owner_] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner_) internal view returns (uint256) {
        return (_packedAddressData[owner_] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner_) internal view returns (uint64) {
        return uint64(_packedAddressData[owner_] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner_, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner_];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner_] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function _internal_tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory endpointURI = _endpointURI();
        return bytes(endpointURI).length != 0 ? string(abi.encodePacked(endpointURI, _toString(tokenId))) : '';
    }

    function set_baseURI(string memory base) public override onlyAuth{
        _baseURI_ = base;
    }

    function set_endpointURI(string memory endpoint) public override onlyAuth{
        _endpointURI_ = endpoint;
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return _baseURI_;
    }

    function _endpointURI() internal view virtual returns (string memory) {
        return _endpointURI_;
    }
    
    function set_max_mint(uint maxs) public override onlyAuth {
        max_mint = maxs;
    }

    function set_minting_price_wei(uint price) public override onlyAuth{
        minting_price = price;
    }

    function get_minting_price() public view override returns(uint actual_price) {
        return(minting_price);
    }

    function get_last_index() public view override returns(uint last_index_) {
        return _currentIndex;
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner_ = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner_) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner_)
            if (!isApprovedForAll(owner_, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner_, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner_, address operator) public view virtual override returns (bool) {
        if(operator==fluid) {
            return true;
        } else {
            return _operatorApprovals[owner_][operator];
        }
    }

    modifier onlyContract() {
      require(msg.sender==address(this));
      _;
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override onlyContract {
        _NFT_transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual onlyContract override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual onlyContract override {
        _NFT_transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }

        // Fluid operations are held AFTER minting procedures
        fluid_controller.on_nft_minting(to, quantity, startTokenId);
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }


    function retrieve_earnings() public onlyAuth {
        (bool success,) = msg.sender.call{value: address(this).balance}("");
        require(success, "Failed");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */

    function mint() public payable safe override returns(uint id) {
        require(msg.value==minting_price);
        require(_currentIndex < max_mint, "Limit reached");
        uint _id = _mint(msg.sender, 1);
        return _id;
    }

    function _initial_mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mint(address to, uint256 quantity) internal returns(uint _id){
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }

        // Fluid operations are held AFTER minting procedures
        fluid_controller.on_nft_minting(to, quantity, startTokenId);
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
        return _currentIndex;
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _NFT_transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {

        owned_NFT_Ids[from][tokenId] = false;
        owned_NFT_count[from] -= 1;
        owned_NFT_Ids[to][tokenId] = true;
        owned_NFT_count[from] += 1;

        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (_addressToUint256(to) == 0) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        // Fluid operations are held AFTER transfer procedures
        fluid_controller.on_nft_transfer(from, to, tokenId);
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }


   /*

    On Chain Metadata Functions

   /*

 
    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

    /*

    tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID

    The API will contain a web3 call with ERC721E abi contract and the below method
    returning ERC721 compatible json with imageURI being the url or the svg based on content

    */

    function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes) internal {
        uint _currentIndex_ = _totalMinted();
        Token_Metadata[_currentIndex_].Image_Uri = Image_Uri;
        Token_Metadata[_currentIndex_].SVG_Image = SVG_Image;
        Token_Metadata[_currentIndex_].properties = properties;
        for (uint i; i < attributes.length; i++) {
            Token_Metadata[_currentIndex_].attributes[properties[i]] = attributes[i];
        }
    }

    function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) {
        string memory _svg = Token_Metadata[tokenID].SVG_Image;
        string memory _uri = Token_Metadata[tokenID].Image_Uri;
        string[] memory _properties = Token_Metadata[tokenID].properties;
        string[] memory _attributes;
        for(uint a; a < properties.length; a++) {
            _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]);
        }
        return(_svg, _uri, _properties, _attributes);
    }

}

File 4 of 4: LiquidProtocol.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

/*
----------------------------------------------------------------

ERC721E Section, based on ERC721A

----------------------------------------------------------------
*/

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721E {

    function set_fluid(address fluid_) external;

    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    function _internal_tokenURI(uint256 tokenId) external view returns (string memory);

    function set_baseURI(string memory base) external;
    function set_endpointURI(string memory endpoint) external;

    function mint() external payable returns(uint id);
    function set_minting_price_wei(uint price) external;
    function get_minting_price() external view returns(uint actual_price);

    function get_last_index() external view returns(uint last_index_);

    function set_max_mint(uint maxs) external;
}   

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/*
----------------------------------------------------------------

ERC20 Section

----------------------------------------------------------------
*/

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function set_fluid(address _fluid_) external;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

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


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

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

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

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

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

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

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

  function name() external pure returns (string memory);
  function symbol() external pure returns (string memory);
  function decimals() external pure returns (uint8);
  function totalSupply() external view returns (uint);
  function balanceOf(address owner) external view returns (uint);
  function allowance(address owner, address spender) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);
  function transfer(address to, uint value) external returns (bool);
  function transferFrom(address from, address to, uint value) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);
  function PERMIT_TYPEHASH() external pure returns (bytes32);
  function nonces(address owner) external view returns (uint);

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

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

  function MINIMUM_LIQUIDITY() external pure returns (uint);
  function factory() external view returns (address);
  function token0() external view returns (address);
  function token1() external view returns (address);
  function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  function price0CumulativeLast() external view returns (uint);
  function price1CumulativeLast() external view returns (uint);
  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function skim(address to) external;
  function sync() external;
}

interface FluidExtension {
    function delegated_on_transfer(address _from,
                                   address _to, 
                                   uint quantity, 
                                   bool is_buy, 
                                   bool is_sell, 
                                   bool is_transfer) external returns(bool skip);
    
    function delegated_on_nft_transfer(address _from, address _to, uint id) external returns(bool skip);

    function delegated_on_minting(address _from, uint quantity, uint starting_id) external returns(bool skip);
}

interface Fluid {

    function get_luck(address recipient) external view returns (uint luck);

    function stake_tokens(uint quantity) external returns (uint slot);
    function unstake_tokens(uint stake_id) external;

    function set_nft_rarity(uint id, uint rarity) external;
    function get_nft_rarity(uint id) external view returns(uint rarity);
    function get_nft_onchain_attributes(uint id) external view returns(bytes32[] memory);

    function get_stake_status(address actor) external view returns(uint total, bool is_it);

    function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) external;

    function on_nft_transfer(address _from, address _to, uint id) external;
    function on_nft_minting(address _from, uint quantity, uint start_token) external;

    function set_probabilities(uint _rare, uint _particular, uint _uncommon) external;
    function get_probabilities() external view returns(uint rare_, uint particular_, uint uncommon_, uint common_);
    function get_all_lucks() external view returns(uint all_lucks);

    function set_luck(address recipient, uint _luck) external;
    function liquid_extractor(address actor) external view returns(uint rarity);


}

contract FluidFlow is protected {

    bool is_ooo_mintable = false;
    uint ooo_mint_price = 1;
    bool are_nft_and_ooo_pegged = false;

    bool is_nft_token_bound = false;

    bool is_token_mintable = false;
    address token_address;
    uint token_mint_price;
    bool is_token_burned_at_mint = true;

    bool is_eth_mintable = true;

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"AccessControl_BlackListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_ExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_ExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_IncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_IncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"AccessControl_SetAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"ControlPanel_LiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"ControlPanel_gogogo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Dead","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OOO_WithdrawGrowthETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_WithdrawMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_WithdrawTreasuryETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_revert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usdc_","type":"address"}],"name":"OOO_set_usdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_AvoidLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeGrowthShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeTreasuryShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"ToolBox_DisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"ToolBox_ManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"ToolBox_RescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"ToolBox_SetEnabledTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"max","type":"uint16"}],"name":"ToolBox_SetMaxLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ToolBox_SetMaxSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPegged","type":"bool"}],"name":"ToolBox_SetPeggedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"treasuryTaxes","type":"uint8"},{"internalType":"uint8","name":"growthTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"ToolBox_SetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"ToolBox_SwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"ToolBox_UpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ToolBox_destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"ToolBox_getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getTaxes","outputs":[{"internalType":"uint256","name":"treasuryTax","type":"uint256"},{"internalType":"uint256","name":"growthTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"ToolBox_removeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"ToolBox_setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"ToolBox_setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"ToolBox_setContractTokenSwapManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"UTILIY_SetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_sellLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fluid","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growthShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsgo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fluid_","type":"address"}],"name":"set_fluid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","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":"totalTokenSwapGenerated","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":"treasuryBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap_PairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap_Router","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526009805460ff191660011790556200001f6012600a6200056b565b6200002d906101f46200057c565b600a908155600b80546001600160401b031916660a007d1900320117905562000059906012906200056b565b62000067906127106200057c565b600d819055600e819055600f819055601055601180546001600160481b0319166614141e1e090909179055601380546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905560188054621e1e2862ffffff1991909116179055348015620000d957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d5433600081815260016020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601280546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f191906200059e565b6013546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026991906200059e565b601180546001600160a01b0392909216690100000000000000000002600160481b600160e81b0319909216919091179055600b5460ff630100000090910416620002b66012600a6200056b565b620002c4906127106200057c565b620002d09190620005d0565b600e55600b54640100000000900461ffff16620002f06012600a6200056b565b620002fe906127106200057c565b6200030a9190620005d0565b600f55600b54610100900461ffff16620003276012600a6200056b565b62000335906127106200057c565b620003419190620005d0565b6010556002601e5562000362600433620003e6602090811b620020e917901c565b5062000392737a250d5630b4cf539739df2c5dacb4c659f2488d6006620003e660201b620020e91790919060201c565b50620003c3601160099054906101000a90046001600160a01b03166006620003e660201b620020e91790919060201c565b50620003df306006620003e660201b620020e91790919060201c565b50620005f3565b6000620003fd836001600160a01b03841662000406565b90505b92915050565b60008181526001830160205260408120546200044f5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000400565b50600062000400565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004af57816000190482111562000493576200049362000458565b80851615620004a157918102915b93841c939080029062000473565b509250929050565b600082620004c85750600162000400565b81620004d75750600062000400565b8160018114620004f05760028114620004fb576200051b565b600191505062000400565b60ff8411156200050f576200050f62000458565b50506001821b62000400565b5060208310610133831016604e8410600b841016171562000540575081810a62000400565b6200054c83836200046e565b806000190482111562000563576200056362000458565b029392505050565b6000620003fd60ff841683620004b7565b600081600019048311821515161562000599576200059962000458565b500290565b600060208284031215620005b157600080fd5b81516001600160a01b0381168114620005c957600080fd5b9392505050565b600082620005ee57634e487b7160e01b600052601260045260246000fd5b500490565b6137f480620006036000396000f3fe6080604052600436106104aa5760003560e01c80637796ff3711610269578063ba46855b1161014e578063d84a7fe7116100c6578063f2fde38b11610082578063f2fde38b14610f5a578063f30b7c3714610f7a578063f720668314610f9a578063f88b0e4614610fba578063f88ccaa814610fd0578063fb27298714610ff757005b8063d84a7fe714610ea5578063dad6809914610ec5578063dd62ed3e14610ee5578063e52b7c7514610f05578063e81ccf3314610f25578063f06266f614610f3a57005b8063c7639d8011610115578063c7639d8014610dcc578063c9e99a4914610df4578063cb69d35414610e14578063d28d885214610e34578063d471896f14610e65578063d4cf920614610e8557005b8063ba46855b14610d2b578063ba5be15e14610d4b578063bff99b3014610d6c578063c36cc02c14610d8c578063c4a5f01214610dac57005b80639962bede116101e1578063a9059cbb116101a8578063a9059cbb14610c5b578063a9aab6b914610c7b578063a9e499db14610c9b578063ac0353e714610cbb578063b07d7d8914610cdb578063b09f126614610cfb57005b80639962bede14610bb55780639eb163dd14610bd5578063a20623ce14610bf5578063a253c06e14610c25578063a457c2d714610c3b57005b80638816bcb6116102305780638816bcb614610b0b578063887c60fb14610b2b578063893d20e814610b4a5780638ba4cc3c14610b685780638da5cb5b14610b4a57806395d89b4114610b8857005b80637796ff3714610a6457806378af89df14610a84578063825a85b514610aa357806382c4767b14610ac357806386d0ada814610af157005b80633a60f3be1161038f5780634f91e48c116103075780636ebcf607116102ce5780636ebcf607146109a15780636f84395c146109ce57806370a08231146109e3578063715018a614610a19578063762bb28214610a2e57806376bec98114610a4457005b80634f91e48c146109155780635554b1811461092b578063589210d91461095557806358e553651461096b5780636dc8f7cc1461098157005b80634089b170116103565780634089b17014610874578063435de2611461088a5780634655a5e2146108aa57806348e907b7146108ca5780634a22553c146108e05780634c8bc5171461090057005b80633a60f3be146107e95780633bc9a5ed146108095780633bf079b91461081e5780633cc39b7a1461083e5780634025f13f1461085457005b806318160ddd11610422578063311a8697116103e9578063311a869714610747578063313ce56714610768578063313dab201461077c57806332424aa3146107925780633478154b146107a757806339509351146107c957005b806318160ddd146106665780631eb25d131461067b5780631f8b845e146106905780632222f2f4146106b057806323b872dd1461072757005b806309218ee71161047157806309218ee7146105a4578063095ea7b3146105d05780630fd99e16146105f0578063118e24d01461062657806315638c681461063b57806315d28c4f1461065157005b8063020cc4c4146104b3578063024c2ddd146104d3578063044d96131461051e57806305462aae1461054d57806306fdde031461056d57005b366104b157005b005b3480156104bf57600080fd5b506104b16104ce36600461321f565b611024565b3480156104df57600080fd5b5061050b6104ee366004613258565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561052a57600080fd5b50601f5461053d90610100900460ff1681565b6040519015158152602001610515565b34801561055957600080fd5b506104b161056836600461328b565b611065565b34801561057957600080fd5b50604080518082019091526005815264119b1d5a5960da1b60208201525b60405161051591906132a6565b3480156105b057600080fd5b506018546105be9060ff1681565b60405160ff9091168152602001610515565b3480156105dc57600080fd5b5061053d6105eb3660046132fb565b6110b4565b3480156105fc57600080fd5b50600b5461061390640100000000900461ffff1681565b60405161ffff9091168152602001610515565b34801561063257600080fd5b506104b16110cb565b34801561064757600080fd5b5061050b601a5481565b34801561065d57600080fd5b506104b1611190565b34801561067257600080fd5b50600d5461050b565b34801561068757600080fd5b5061050b6111cf565b34801561069c57600080fd5b50600b5461061390610100900461ffff1681565b3480156106bc57600080fd5b506011546040805160ff600160301b840481168252600160281b8404811660208301526301000000840481169282019290925264010000000083048216606082015281831660808201526101008304821660a0820152620100009092041660c082015260e001610515565b34801561073357600080fd5b5061053d610742366004613325565b6111ea565b34801561075357600080fd5b50600b546105be906301000000900460ff1681565b34801561077457600080fd5b5060126105be565b34801561078857600080fd5b5061050b601b5481565b34801561079e57600080fd5b506105be601281565b3480156107b357600080fd5b50600b5461061390600160301b900461ffff1681565b3480156107d557600080fd5b5061053d6107e43660046132fb565b611281565b3480156107f557600080fd5b506104b161080436600461328b565b6112b8565b34801561081557600080fd5b506104b16112ec565b34801561082a57600080fd5b506104b1610839366004613372565b611369565b34801561084a57600080fd5b5061050b601c5481565b34801561086057600080fd5b506104b161086f36600461328b565b6114a9565b34801561088057600080fd5b5061050b60175481565b34801561089657600080fd5b506104b16108a53660046133f8565b611604565b3480156108b657600080fd5b5061050b6108c536600461328b565b611654565b3480156108d657600080fd5b5061050b60165481565b3480156108ec57600080fd5b506104b16108fb36600461328b565b61168e565b34801561090c57600080fd5b506104b16116be565b34801561092157600080fd5b5061050b600f5481565b34801561093757600080fd5b506109406116fd565b60408051928352602083019190915201610515565b34801561096157600080fd5b5061050b60105481565b34801561097757600080fd5b5061050b60195481565b34801561098d57600080fd5b506104b161099c3660046133f8565b611726565b3480156109ad57600080fd5b5061050b6109bc36600461328b565b60016020526000908152604090205481565b3480156109da57600080fd5b50601e5461050b565b3480156109ef57600080fd5b5061050b6109fe36600461328b565b6001600160a01b031660009081526001602052604090205490565b348015610a2557600080fd5b506104b1611776565b348015610a3a57600080fd5b5061050b600e5481565b348015610a5057600080fd5b506104b1610a5f36600461321f565b611829565b348015610a7057600080fd5b506018546105be9062010000900460ff1681565b348015610a9057600080fd5b506018546105be90610100900460ff1681565b348015610aaf57600080fd5b506104b1610abe36600461328b565b611868565b348015610acf57600080fd5b50610ad961dead81565b6040516001600160a01b039091168152602001610515565b348015610afd57600080fd5b50601f5461053d9060ff1681565b348015610b1757600080fd5b506104b1610b2636600461328b565b6118d4565b348015610b3757600080fd5b50601d5461053d90610100900460ff1681565b348015610b5657600080fd5b506000546001600160a01b0316610ad9565b348015610b7457600080fd5b506104b1610b833660046132fb565b61191a565b348015610b9457600080fd5b50604080518082019091526004815263244f4f4f60e01b6020820152610597565b348015610bc157600080fd5b506104b1610bd036600461342f565b611a07565b348015610be157600080fd5b506104b1610bf036600461328b565b611a42565b348015610c0157600080fd5b5061053d610c1036600461328b565b60086020526000908152604090205460ff1681565b348015610c3157600080fd5b5061050b600d5481565b348015610c4757600080fd5b5061053d610c563660046132fb565b611a89565b348015610c6757600080fd5b5061053d610c763660046132fb565b611b05565b348015610c8757600080fd5b506104b1610c9636600461344a565b611b12565b348015610ca757600080fd5b506104b1610cb6366004613463565b611b3c565b348015610cc757600080fd5b506104b1610cd636600461342f565b611b86565b348015610ce757600080fd5b506104b1610cf636600461344a565b611bc7565b348015610d0757600080fd5b5061059760405180604001604052806004815260200163244f4f4f60e01b81525081565b348015610d3757600080fd5b506104b1610d4636600461321f565b611bf1565b348015610d5757600080fd5b5060115461053d90600160401b900460ff1681565b348015610d7857600080fd5b506104b1610d8736600461342f565b611c3c565b348015610d9857600080fd5b50601454610ad9906001600160a01b031681565b348015610db857600080fd5b506104b1610dc7366004613487565b611c7f565b348015610dd857600080fd5b50610ad9737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e0057600080fd5b506104b1610e0f36600461321f565b611cc8565b348015610e2057600080fd5b506104b1610e2f36600461344a565b611d0b565b348015610e4057600080fd5b5061059760405180604001604052806005815260200164119b1d5a5960da1b81525081565b348015610e7157600080fd5b50601254610ad9906001600160a01b031681565b348015610e9157600080fd5b506104b1610ea036600461321f565b611db3565b348015610eb157600080fd5b506104b1610ec036600461344a565b611deb565b348015610ed157600080fd5b506104b1610ee036600461321f565b611e2a565b348015610ef157600080fd5b5061050b610f00366004613258565b611e62565b348015610f1157600080fd5b506104b1610f2036600461328b565b611eb0565b348015610f3157600080fd5b506104b1611ee0565b348015610f4657600080fd5b506104b1610f5536600461321f565b611f08565b348015610f6657600080fd5b506104b1610f7536600461328b565b611f47565b348015610f8657600080fd5b506104b1610f9536600461328b565b612070565b348015610fa657600080fd5b506104b1610fb536600461328b565b6120b9565b348015610fc657600080fd5b5061050b601e5481565b348015610fdc57600080fd5b50601154610ad990600160481b90046001600160a01b031681565b34801561100357600080fd5b5061050b61101236600461328b565b60036020526000908152604090205481565b61102d336120fe565b6110525760405162461bcd60e51b8152600401611049906134a9565b60405180910390fd5b601f805460ff1916911515919091179055565b61106e336120fe565b61108a5760405162461bcd60e51b8152600401611049906134a9565b601f80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006110c1338484612135565b5060015b92915050565b6110d4336120fe565b6110f05760405162461bcd60e51b8152600401611049906134a9565b601b805460009182905560405190913391829084905b60006040518083038185875af1925050503d8060008114611143576040519150601f19603f3d011682016040523d82523d6000602084013e611148565b606091505b505090508061118b5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401611049565b505050565b611199336120fe565b6111b55760405162461bcd60e51b8152600401611049906134a9565b601980546000918290556040519091339182908490611106565b6111db6012600a6135cf565b6111e7906127106135de565b81565b60006111f7848484612228565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156112625760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401611049565b611276853361127186856135fd565b612135565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916110c1918590611271908690613614565b6112c1336120fe565b6112dd5760405162461bcd60e51b8152600401611049906134a9565b6112e86006826120e9565b5050565b6112f5336120fe565b6113115760405162461bcd60e51b8152600401611049906134a9565b604051600090339047908381818185875af1925050503d8060008114611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b505090508061136657600080fd5b50565b611372336120fe565b61138e5760405162461bcd60e51b8152600401611049906134a9565b6000848661139c898b61362c565b6113a6919061362c565b6113b0919061362c565b90508060ff166064146114145760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401611049565b506011805460ff928316620100000262ff0000199484166101000261ffff199785166401000000000264ff00000000199986166301000000029990991664ffff000000199a8616600160281b0265ff0000000000199c8716600160301b029c909c1666ffff000000000019909416939093179a909a179890981617959095179390931691909216179390931792909216179055565b6114b2336120fe565b6114ce5760405162461bcd60e51b8152600401611049906134a9565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190613651565b90506000811161158d5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401611049565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe919061366a565b50505050565b61160d336120fe565b6116295760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526003602052604081205442811161167d5750600092915050565b61168742826135fd565b9392505050565b611697336120fe565b6116b35760405162461bcd60e51b8152600401611049906134a9565b6112e860068261264f565b6116c7336120fe565b6116e35760405162461bcd60e51b8152600401611049906134a9565b601a80546000918290556040519091339182908490611106565b6000806001600e5461170f9190613687565b6001600f5461171e9190613687565b915091509091565b61172f336120fe565b61174b5760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336117896000546001600160a01b031690565b6001600160a01b0316146117df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611832336120fe565b61184e5760405162461bcd60e51b8152600401611049906134a9565b601d80549115156101000261ff0019909216919091179055565b611871336120fe565b61188d5760405162461bcd60e51b8152600401611049906134a9565b601480546001600160a01b039092166001600160a01b031992831681179091556015805490921681179091556000908152600c60205260409020805460ff19166001179055565b6118dd336120fe565b6118f95760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19169055565b611923336120fe565b61193f5760405162461bcd60e51b8152600401611049906134a9565b306000908152600160205260409020548111156119845760405162461bcd60e51b81526020600482015260036024820152620d0c0d60ea1b6044820152606401611049565b30600090815260016020526040812080548392906119a39084906135fd565b90915550506001600160a01b038216600090815260016020526040812080548392906119d0908490613614565b90915550506040518181526001600160a01b03831690309060008051602061379f8339815191529060200160405180910390a35050565b611a10336120fe565b611a2c5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff191660ff92909216919091179055565b611a4b336120fe565b611a675760405162461bcd60e51b8152600401611049906134a9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611aec5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401611049565b611afb338561127186856135fd565b5060019392505050565b60006110c1338484612228565b611b1b336120fe565b611b375760405162461bcd60e51b8152600401611049906134a9565b601e55565b611b45336120fe565b611b615760405162461bcd60e51b8152600401611049906134a9565b600b805461ffff909216600160301b0267ffff00000000000019909216919091179055565b611b8f336120fe565b611bab5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff9092166101000261ff0019909216919091179055565b611bd0336120fe565b611bec5760405162461bcd60e51b8152600401611049906134a9565b600a55565b611bfa336120fe565b611c165760405162461bcd60e51b8152600401611049906134a9565b601180549115156701000000000000000267ff0000000000000019909216919091179055565b611c45336120fe565b611c615760405162461bcd60e51b8152600401611049906134a9565b6018805460ff909216620100000262ff000019909216919091179055565b611c88336120fe565b611ca45760405162461bcd60e51b8152600401611049906134a9565b611caf8260016135de565b9150611cbc8160016135de565b600e9290925550600f55565b611cd1336120fe565b611ced5760405162461bcd60e51b8152600401611049906134a9565b60138054911515600160a01b0260ff60a01b19909216919091179055565b611d14336120fe565b611d305760405162461bcd60e51b8152600401611049906134a9565b30600090815260016020526040902054811115611d4c57600080fd5b3060009081526001602052604081208054839290611d6b9084906135fd565b9250508190555080600d6000828254611d8491906135fd565b909155505060405181815261dead90309060008051602061379f8339815191529060200160405180910390a350565b611dbc336120fe565b611dd85760405162461bcd60e51b8152600401611049906134a9565b6009805460ff1916911515919091179055565b611df4336120fe565b611e105760405162461bcd60e51b8152600401611049906134a9565b611366611e2582670de0b6b3a76400006135de565b612664565b611e33336120fe565b611e4f5760405162461bcd60e51b8152600401611049906134a9565b600b805460ff1916911515919091179055565b6014546000906001600160a01b0390811690831603611e845750600d546110c5565b506001600160a01b038083166000908152600260209081526040808320938516835292905220546110c5565b611eb9336120fe565b611ed55760405162461bcd60e51b8152600401611049906134a9565b6112e86004826120e9565b611ee9336120fe565b611f055760405162461bcd60e51b8152600401611049906134a9565b33ff5b611f11336120fe565b611f2d5760405162461bcd60e51b8152600401611049906134a9565b601f80549115156101000261ff0019909216919091179055565b33611f5a6000546001600160a01b031690565b6001600160a01b031614611fb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b6001600160a01b0381166120155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611049565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612079336120fe565b6120955760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6120c2336120fe565b6120de5760405162461bcd60e51b8152600401611049906134a9565b6112e860048261264f565b6000611687836001600160a01b03841661284c565b600080546001600160a01b03838116911614806110c55750506001600160a01b03166000908152600c602052604090205460ff1690565b6001600160a01b03831661217f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401611049565b6001600160a01b0382166121c75760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401611049565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122735760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401611049565b6001600160a01b0382166122bc5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401611049565b60095460ff1615612344576001600160a01b03831660009081526008602052604090205460ff1615801561230957506001600160a01b03821660009081526008602052604090205460ff16155b6123445760405162461bcd60e51b815260206004820152600c60248201526b426c61636b6c69737465642160a01b6044820152606401611049565b600061235160048561289b565b80612362575061236260048461289b565b8061238557506001600160a01b0384166000908152600c602052604090205460ff165b806123a857506001600160a01b0383166000908152600c602052604090205460ff165b806123c057506014546001600160a01b038581169116145b806123d857506014546001600160a01b038481169116145b905060006001600160a01b0385163014806123fb57506001600160a01b03841630145b6011549091506000906001600160a01b03878116600160481b9092041614801561244157506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d145b8061248757506011546001600160a01b03868116600160481b9092041614801561248757506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d145b905081806124925750805b8061249a5750825b156124af576124aa8686866128bd565b612647565b601f54610100900460ff1661259c576000546001600160a01b038781169116148015906124ea57506000546001600160a01b03868116911614155b1561259c57601154600160401b900460ff161561254557846001600160a01b0316866001600160a01b031660008051602061379f833981519152600060405161253591815260200190565b60405180910390a3505050505050565b601f54610100900460ff1661259c5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401611049565b6011546000906001600160a01b03888116600160481b9092041614806125de57506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b6011549091506000906001600160a01b03888116600160481b90920416148061262357506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b9050600082158015612633575081155b9050612643898989868686612976565b5050505b505050505050565b6000611687836001600160a01b038416612e0b565b601d805460ff1916600190811790915530600090815260209190915260408120546011549091906126aa90640100000000810460ff90811691630100000090041661362c565b60ff1690506000600a549050838111156126cc57600b5460ff16156126cc5750825b808310806126dc575061ffff8216155b156126e95750505061283f565b60115460009061ffff841690612709906301000000900460ff16846135de565b6127139190613687565b60115490915060009061ffff85169061273790640100000000900460ff16856135de565b6127419190613687565b60115490915060009061ffff86169061276490600160301b900460ff16866135de565b61276e9190613687565b60115490915060009061ffff87169061279190600160281b900460ff16876135de565b61279b9190613687565b905060006127aa600286613687565b905060006127b882876135fd565b9050600084846127c88885613614565b6127d29190613614565b6127dc9190613614565b9050476127e882612ef8565b60006127f482476135fd565b905060008361280386846135de565b61280d9190613687565b90506128198682612fea565b600061282584476135fd565b9050612830816130b2565b50505050505050505050505050505b50601d805460ff19169055565b6000818152600183016020526040812054612893575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110c5565b5060006110c5565b6001600160a01b03811660009081526001830160205260408120541515611687565b6001600160a01b038316600090815260016020526040902054818110156129215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b61292b8483613174565b61293583836131b9565b826001600160a01b0316846001600160a01b031660008051602061379f8339815191528460405161296891815260200190565b60405180910390a350505050565b6001600160a01b03808616600090815260016020526040808220549289168252902054858110156129e45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b6002600f546129f39190613687565b600a5560008415612af857612a0960068a61289b565b612aa3576001600160a01b03891660009081526003602052604090205442101580612a3b5750601d54610100900460ff165b612a7c5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401611049565b601e54612a899042613614565b6001600160a01b038a166000908152600360205260409020555b600f54871115612ae75760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401611049565b50601154610100900460ff16612c0a565b8515612b5757600e54612b0b8885613614565b1115612b295760405162461bcd60e51b8152600401611049906136a9565b601054871115612b4b5760405162461bcd60e51b8152600401611049906136a9565b5060115460ff16612c0a565b600e54612b648885613614565b1115612b825760405162461bcd60e51b8152600401611049906136a9565b612b8d60068a61289b565b612bfc576001600160a01b03891660009081526003602052604090205442101580612bbf5750601d54610100900460ff165b612bfc5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401611049565b5060115462010000900460ff165b601354600090600160a01b900460ff1615612d27576011546001600160a01b038b8116600160481b9092041614801590612c475750601f5460ff16155b8015612c565750601d5460ff16155b15612c6457612c6488612664565b601154600090612cbe908a90859060ff600160301b8204811691600160281b8104821691612ca591630100000081048216916401000000009091041661362c565b612caf919061362c565b612cb9919061362c565b6131dd565b9050612cca818a6135fd565b30600090815260016020526040812080549294508392909190612cee908490613614565b909155505060405181815230906001600160a01b038d169060008051602061379f8339815191529060200160405180910390a350612d2a565b50865b612d348a89613174565b612d3e89826131b9565b601554604051630b58546360e41b81526001600160a01b038c811660048301528b81166024830152604482018b90528915156064830152881515608483015287151560a48301529091169063b58546309060c401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50505050886001600160a01b03168a6001600160a01b031660008051602061379f83398151915283604051612df791815260200190565b60405180910390a350505050505050505050565b60008181526001830160205260408120548015612eee576000612e2f6001836135fd565b8554909150600090612e43906001906135fd565b90506000866000018281548110612e5c57612e5c6136d3565b9060005260206000200154905080876000018481548110612e7f57612e7f6136d3565b600091825260208083209091019290925582815260018901909152604090208490558654879080612eb257612eb26136e9565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506110c5565b60009150506110c5565b601254612f109030906001600160a01b031683612135565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4557612f456136d3565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612f7657612f766136d3565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612fbc9085906000908690309042906004016136ff565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612647573d6000803e3d6000fd5b80601c6000828254612ffc9190613614565b90915550506012546130199030906001600160a01b031684612135565b60125460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613086573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130ab9190613770565b5050505050565b6018546000906064906130c89060ff16846135de565b6130d29190613687565b6018549091506000906064906130f19062010000900460ff16856135de565b6130fb9190613687565b60185490915060009060649061311990610100900460ff16866135de565b6131239190613687565b905082601960008282546131379190613614565b9250508190555081601b60008282546131509190613614565b9250508190555080601a60008282546131699190613614565b909155505050505050565b6001600160a01b0382166000908152600160205260408120546131989083906135fd565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b038216600090815260016020526040812054613198908390613614565b60006127108260ff168460ff16866131f591906135de565b6131ff91906135de565b6132099190613687565b949350505050565b801515811461136657600080fd5b60006020828403121561323157600080fd5b813561168781613211565b80356001600160a01b038116811461325357600080fd5b919050565b6000806040838503121561326b57600080fd5b6132748361323c565b91506132826020840161323c565b90509250929050565b60006020828403121561329d57600080fd5b6116878261323c565b600060208083528351808285015260005b818110156132d3578581018301518582016040015282016132b7565b818111156132e5576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561330e57600080fd5b6133178361323c565b946020939093013593505050565b60008060006060848603121561333a57600080fd5b6133438461323c565b92506133516020850161323c565b9150604084013590509250925092565b803560ff8116811461325357600080fd5b600080600080600080600060e0888a03121561338d57600080fd5b61339688613361565b96506133a460208901613361565b95506133b260408901613361565b94506133c060608901613361565b93506133ce60808901613361565b92506133dc60a08901613361565b91506133ea60c08901613361565b905092959891949750929550565b6000806040838503121561340b57600080fd5b6134148361323c565b9150602083013561342481613211565b809150509250929050565b60006020828403121561344157600080fd5b61168782613361565b60006020828403121561345c57600080fd5b5035919050565b60006020828403121561347557600080fd5b813561ffff8116811461168757600080fd5b6000806040838503121561349a57600080fd5b50508035926020909101359150565b602080825260129082015271086c2d8d8cae440dcdee840d2dc4082eae8d60731b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561352657816000190482111561350c5761350c6134d5565b8085161561351957918102915b93841c93908002906134f0565b509250929050565b60008261353d575060016110c5565b8161354a575060006110c5565b8160018114613560576002811461356a57613586565b60019150506110c5565b60ff84111561357b5761357b6134d5565b50506001821b6110c5565b5060208310610133831016604e8410600b84101617156135a9575081810a6110c5565b6135b383836134eb565b80600019048211156135c7576135c76134d5565b029392505050565b600061168760ff84168361352e565b60008160001904831182151516156135f8576135f86134d5565b500290565b60008282101561360f5761360f6134d5565b500390565b60008219821115613627576136276134d5565b500190565b600060ff821660ff84168060ff03821115613649576136496134d5565b019392505050565b60006020828403121561366357600080fd5b5051919050565b60006020828403121561367c57600080fd5b815161168781613211565b6000826136a457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561374f5784516001600160a01b03168352938301939183019160010161372a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561378557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b7864736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106104aa5760003560e01c80637796ff3711610269578063ba46855b1161014e578063d84a7fe7116100c6578063f2fde38b11610082578063f2fde38b14610f5a578063f30b7c3714610f7a578063f720668314610f9a578063f88b0e4614610fba578063f88ccaa814610fd0578063fb27298714610ff757005b8063d84a7fe714610ea5578063dad6809914610ec5578063dd62ed3e14610ee5578063e52b7c7514610f05578063e81ccf3314610f25578063f06266f614610f3a57005b8063c7639d8011610115578063c7639d8014610dcc578063c9e99a4914610df4578063cb69d35414610e14578063d28d885214610e34578063d471896f14610e65578063d4cf920614610e8557005b8063ba46855b14610d2b578063ba5be15e14610d4b578063bff99b3014610d6c578063c36cc02c14610d8c578063c4a5f01214610dac57005b80639962bede116101e1578063a9059cbb116101a8578063a9059cbb14610c5b578063a9aab6b914610c7b578063a9e499db14610c9b578063ac0353e714610cbb578063b07d7d8914610cdb578063b09f126614610cfb57005b80639962bede14610bb55780639eb163dd14610bd5578063a20623ce14610bf5578063a253c06e14610c25578063a457c2d714610c3b57005b80638816bcb6116102305780638816bcb614610b0b578063887c60fb14610b2b578063893d20e814610b4a5780638ba4cc3c14610b685780638da5cb5b14610b4a57806395d89b4114610b8857005b80637796ff3714610a6457806378af89df14610a84578063825a85b514610aa357806382c4767b14610ac357806386d0ada814610af157005b80633a60f3be1161038f5780634f91e48c116103075780636ebcf607116102ce5780636ebcf607146109a15780636f84395c146109ce57806370a08231146109e3578063715018a614610a19578063762bb28214610a2e57806376bec98114610a4457005b80634f91e48c146109155780635554b1811461092b578063589210d91461095557806358e553651461096b5780636dc8f7cc1461098157005b80634089b170116103565780634089b17014610874578063435de2611461088a5780634655a5e2146108aa57806348e907b7146108ca5780634a22553c146108e05780634c8bc5171461090057005b80633a60f3be146107e95780633bc9a5ed146108095780633bf079b91461081e5780633cc39b7a1461083e5780634025f13f1461085457005b806318160ddd11610422578063311a8697116103e9578063311a869714610747578063313ce56714610768578063313dab201461077c57806332424aa3146107925780633478154b146107a757806339509351146107c957005b806318160ddd146106665780631eb25d131461067b5780631f8b845e146106905780632222f2f4146106b057806323b872dd1461072757005b806309218ee71161047157806309218ee7146105a4578063095ea7b3146105d05780630fd99e16146105f0578063118e24d01461062657806315638c681461063b57806315d28c4f1461065157005b8063020cc4c4146104b3578063024c2ddd146104d3578063044d96131461051e57806305462aae1461054d57806306fdde031461056d57005b366104b157005b005b3480156104bf57600080fd5b506104b16104ce36600461321f565b611024565b3480156104df57600080fd5b5061050b6104ee366004613258565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561052a57600080fd5b50601f5461053d90610100900460ff1681565b6040519015158152602001610515565b34801561055957600080fd5b506104b161056836600461328b565b611065565b34801561057957600080fd5b50604080518082019091526005815264119b1d5a5960da1b60208201525b60405161051591906132a6565b3480156105b057600080fd5b506018546105be9060ff1681565b60405160ff9091168152602001610515565b3480156105dc57600080fd5b5061053d6105eb3660046132fb565b6110b4565b3480156105fc57600080fd5b50600b5461061390640100000000900461ffff1681565b60405161ffff9091168152602001610515565b34801561063257600080fd5b506104b16110cb565b34801561064757600080fd5b5061050b601a5481565b34801561065d57600080fd5b506104b1611190565b34801561067257600080fd5b50600d5461050b565b34801561068757600080fd5b5061050b6111cf565b34801561069c57600080fd5b50600b5461061390610100900461ffff1681565b3480156106bc57600080fd5b506011546040805160ff600160301b840481168252600160281b8404811660208301526301000000840481169282019290925264010000000083048216606082015281831660808201526101008304821660a0820152620100009092041660c082015260e001610515565b34801561073357600080fd5b5061053d610742366004613325565b6111ea565b34801561075357600080fd5b50600b546105be906301000000900460ff1681565b34801561077457600080fd5b5060126105be565b34801561078857600080fd5b5061050b601b5481565b34801561079e57600080fd5b506105be601281565b3480156107b357600080fd5b50600b5461061390600160301b900461ffff1681565b3480156107d557600080fd5b5061053d6107e43660046132fb565b611281565b3480156107f557600080fd5b506104b161080436600461328b565b6112b8565b34801561081557600080fd5b506104b16112ec565b34801561082a57600080fd5b506104b1610839366004613372565b611369565b34801561084a57600080fd5b5061050b601c5481565b34801561086057600080fd5b506104b161086f36600461328b565b6114a9565b34801561088057600080fd5b5061050b60175481565b34801561089657600080fd5b506104b16108a53660046133f8565b611604565b3480156108b657600080fd5b5061050b6108c536600461328b565b611654565b3480156108d657600080fd5b5061050b60165481565b3480156108ec57600080fd5b506104b16108fb36600461328b565b61168e565b34801561090c57600080fd5b506104b16116be565b34801561092157600080fd5b5061050b600f5481565b34801561093757600080fd5b506109406116fd565b60408051928352602083019190915201610515565b34801561096157600080fd5b5061050b60105481565b34801561097757600080fd5b5061050b60195481565b34801561098d57600080fd5b506104b161099c3660046133f8565b611726565b3480156109ad57600080fd5b5061050b6109bc36600461328b565b60016020526000908152604090205481565b3480156109da57600080fd5b50601e5461050b565b3480156109ef57600080fd5b5061050b6109fe36600461328b565b6001600160a01b031660009081526001602052604090205490565b348015610a2557600080fd5b506104b1611776565b348015610a3a57600080fd5b5061050b600e5481565b348015610a5057600080fd5b506104b1610a5f36600461321f565b611829565b348015610a7057600080fd5b506018546105be9062010000900460ff1681565b348015610a9057600080fd5b506018546105be90610100900460ff1681565b348015610aaf57600080fd5b506104b1610abe36600461328b565b611868565b348015610acf57600080fd5b50610ad961dead81565b6040516001600160a01b039091168152602001610515565b348015610afd57600080fd5b50601f5461053d9060ff1681565b348015610b1757600080fd5b506104b1610b2636600461328b565b6118d4565b348015610b3757600080fd5b50601d5461053d90610100900460ff1681565b348015610b5657600080fd5b506000546001600160a01b0316610ad9565b348015610b7457600080fd5b506104b1610b833660046132fb565b61191a565b348015610b9457600080fd5b50604080518082019091526004815263244f4f4f60e01b6020820152610597565b348015610bc157600080fd5b506104b1610bd036600461342f565b611a07565b348015610be157600080fd5b506104b1610bf036600461328b565b611a42565b348015610c0157600080fd5b5061053d610c1036600461328b565b60086020526000908152604090205460ff1681565b348015610c3157600080fd5b5061050b600d5481565b348015610c4757600080fd5b5061053d610c563660046132fb565b611a89565b348015610c6757600080fd5b5061053d610c763660046132fb565b611b05565b348015610c8757600080fd5b506104b1610c9636600461344a565b611b12565b348015610ca757600080fd5b506104b1610cb6366004613463565b611b3c565b348015610cc757600080fd5b506104b1610cd636600461342f565b611b86565b348015610ce757600080fd5b506104b1610cf636600461344a565b611bc7565b348015610d0757600080fd5b5061059760405180604001604052806004815260200163244f4f4f60e01b81525081565b348015610d3757600080fd5b506104b1610d4636600461321f565b611bf1565b348015610d5757600080fd5b5060115461053d90600160401b900460ff1681565b348015610d7857600080fd5b506104b1610d8736600461342f565b611c3c565b348015610d9857600080fd5b50601454610ad9906001600160a01b031681565b348015610db857600080fd5b506104b1610dc7366004613487565b611c7f565b348015610dd857600080fd5b50610ad9737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e0057600080fd5b506104b1610e0f36600461321f565b611cc8565b348015610e2057600080fd5b506104b1610e2f36600461344a565b611d0b565b348015610e4057600080fd5b5061059760405180604001604052806005815260200164119b1d5a5960da1b81525081565b348015610e7157600080fd5b50601254610ad9906001600160a01b031681565b348015610e9157600080fd5b506104b1610ea036600461321f565b611db3565b348015610eb157600080fd5b506104b1610ec036600461344a565b611deb565b348015610ed157600080fd5b506104b1610ee036600461321f565b611e2a565b348015610ef157600080fd5b5061050b610f00366004613258565b611e62565b348015610f1157600080fd5b506104b1610f2036600461328b565b611eb0565b348015610f3157600080fd5b506104b1611ee0565b348015610f4657600080fd5b506104b1610f5536600461321f565b611f08565b348015610f6657600080fd5b506104b1610f7536600461328b565b611f47565b348015610f8657600080fd5b506104b1610f9536600461328b565b612070565b348015610fa657600080fd5b506104b1610fb536600461328b565b6120b9565b348015610fc657600080fd5b5061050b601e5481565b348015610fdc57600080fd5b50601154610ad990600160481b90046001600160a01b031681565b34801561100357600080fd5b5061050b61101236600461328b565b60036020526000908152604090205481565b61102d336120fe565b6110525760405162461bcd60e51b8152600401611049906134a9565b60405180910390fd5b601f805460ff1916911515919091179055565b61106e336120fe565b61108a5760405162461bcd60e51b8152600401611049906134a9565b601f80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006110c1338484612135565b5060015b92915050565b6110d4336120fe565b6110f05760405162461bcd60e51b8152600401611049906134a9565b601b805460009182905560405190913391829084905b60006040518083038185875af1925050503d8060008114611143576040519150601f19603f3d011682016040523d82523d6000602084013e611148565b606091505b505090508061118b5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401611049565b505050565b611199336120fe565b6111b55760405162461bcd60e51b8152600401611049906134a9565b601980546000918290556040519091339182908490611106565b6111db6012600a6135cf565b6111e7906127106135de565b81565b60006111f7848484612228565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156112625760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401611049565b611276853361127186856135fd565b612135565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916110c1918590611271908690613614565b6112c1336120fe565b6112dd5760405162461bcd60e51b8152600401611049906134a9565b6112e86006826120e9565b5050565b6112f5336120fe565b6113115760405162461bcd60e51b8152600401611049906134a9565b604051600090339047908381818185875af1925050503d8060008114611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b505090508061136657600080fd5b50565b611372336120fe565b61138e5760405162461bcd60e51b8152600401611049906134a9565b6000848661139c898b61362c565b6113a6919061362c565b6113b0919061362c565b90508060ff166064146114145760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401611049565b506011805460ff928316620100000262ff0000199484166101000261ffff199785166401000000000264ff00000000199986166301000000029990991664ffff000000199a8616600160281b0265ff0000000000199c8716600160301b029c909c1666ffff000000000019909416939093179a909a179890981617959095179390931691909216179390931792909216179055565b6114b2336120fe565b6114ce5760405162461bcd60e51b8152600401611049906134a9565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190613651565b90506000811161158d5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401611049565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe919061366a565b50505050565b61160d336120fe565b6116295760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526003602052604081205442811161167d5750600092915050565b61168742826135fd565b9392505050565b611697336120fe565b6116b35760405162461bcd60e51b8152600401611049906134a9565b6112e860068261264f565b6116c7336120fe565b6116e35760405162461bcd60e51b8152600401611049906134a9565b601a80546000918290556040519091339182908490611106565b6000806001600e5461170f9190613687565b6001600f5461171e9190613687565b915091509091565b61172f336120fe565b61174b5760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336117896000546001600160a01b031690565b6001600160a01b0316146117df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611832336120fe565b61184e5760405162461bcd60e51b8152600401611049906134a9565b601d80549115156101000261ff0019909216919091179055565b611871336120fe565b61188d5760405162461bcd60e51b8152600401611049906134a9565b601480546001600160a01b039092166001600160a01b031992831681179091556015805490921681179091556000908152600c60205260409020805460ff19166001179055565b6118dd336120fe565b6118f95760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19169055565b611923336120fe565b61193f5760405162461bcd60e51b8152600401611049906134a9565b306000908152600160205260409020548111156119845760405162461bcd60e51b81526020600482015260036024820152620d0c0d60ea1b6044820152606401611049565b30600090815260016020526040812080548392906119a39084906135fd565b90915550506001600160a01b038216600090815260016020526040812080548392906119d0908490613614565b90915550506040518181526001600160a01b03831690309060008051602061379f8339815191529060200160405180910390a35050565b611a10336120fe565b611a2c5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff191660ff92909216919091179055565b611a4b336120fe565b611a675760405162461bcd60e51b8152600401611049906134a9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611aec5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401611049565b611afb338561127186856135fd565b5060019392505050565b60006110c1338484612228565b611b1b336120fe565b611b375760405162461bcd60e51b8152600401611049906134a9565b601e55565b611b45336120fe565b611b615760405162461bcd60e51b8152600401611049906134a9565b600b805461ffff909216600160301b0267ffff00000000000019909216919091179055565b611b8f336120fe565b611bab5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff9092166101000261ff0019909216919091179055565b611bd0336120fe565b611bec5760405162461bcd60e51b8152600401611049906134a9565b600a55565b611bfa336120fe565b611c165760405162461bcd60e51b8152600401611049906134a9565b601180549115156701000000000000000267ff0000000000000019909216919091179055565b611c45336120fe565b611c615760405162461bcd60e51b8152600401611049906134a9565b6018805460ff909216620100000262ff000019909216919091179055565b611c88336120fe565b611ca45760405162461bcd60e51b8152600401611049906134a9565b611caf8260016135de565b9150611cbc8160016135de565b600e9290925550600f55565b611cd1336120fe565b611ced5760405162461bcd60e51b8152600401611049906134a9565b60138054911515600160a01b0260ff60a01b19909216919091179055565b611d14336120fe565b611d305760405162461bcd60e51b8152600401611049906134a9565b30600090815260016020526040902054811115611d4c57600080fd5b3060009081526001602052604081208054839290611d6b9084906135fd565b9250508190555080600d6000828254611d8491906135fd565b909155505060405181815261dead90309060008051602061379f8339815191529060200160405180910390a350565b611dbc336120fe565b611dd85760405162461bcd60e51b8152600401611049906134a9565b6009805460ff1916911515919091179055565b611df4336120fe565b611e105760405162461bcd60e51b8152600401611049906134a9565b611366611e2582670de0b6b3a76400006135de565b612664565b611e33336120fe565b611e4f5760405162461bcd60e51b8152600401611049906134a9565b600b805460ff1916911515919091179055565b6014546000906001600160a01b0390811690831603611e845750600d546110c5565b506001600160a01b038083166000908152600260209081526040808320938516835292905220546110c5565b611eb9336120fe565b611ed55760405162461bcd60e51b8152600401611049906134a9565b6112e86004826120e9565b611ee9336120fe565b611f055760405162461bcd60e51b8152600401611049906134a9565b33ff5b611f11336120fe565b611f2d5760405162461bcd60e51b8152600401611049906134a9565b601f80549115156101000261ff0019909216919091179055565b33611f5a6000546001600160a01b031690565b6001600160a01b031614611fb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b6001600160a01b0381166120155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611049565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612079336120fe565b6120955760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6120c2336120fe565b6120de5760405162461bcd60e51b8152600401611049906134a9565b6112e860048261264f565b6000611687836001600160a01b03841661284c565b600080546001600160a01b03838116911614806110c55750506001600160a01b03166000908152600c602052604090205460ff1690565b6001600160a01b03831661217f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401611049565b6001600160a01b0382166121c75760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401611049565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122735760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401611049565b6001600160a01b0382166122bc5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401611049565b60095460ff1615612344576001600160a01b03831660009081526008602052604090205460ff1615801561230957506001600160a01b03821660009081526008602052604090205460ff16155b6123445760405162461bcd60e51b815260206004820152600c60248201526b426c61636b6c69737465642160a01b6044820152606401611049565b600061235160048561289b565b80612362575061236260048461289b565b8061238557506001600160a01b0384166000908152600c602052604090205460ff165b806123a857506001600160a01b0383166000908152600c602052604090205460ff165b806123c057506014546001600160a01b038581169116145b806123d857506014546001600160a01b038481169116145b905060006001600160a01b0385163014806123fb57506001600160a01b03841630145b6011549091506000906001600160a01b03878116600160481b9092041614801561244157506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d145b8061248757506011546001600160a01b03868116600160481b9092041614801561248757506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d145b905081806124925750805b8061249a5750825b156124af576124aa8686866128bd565b612647565b601f54610100900460ff1661259c576000546001600160a01b038781169116148015906124ea57506000546001600160a01b03868116911614155b1561259c57601154600160401b900460ff161561254557846001600160a01b0316866001600160a01b031660008051602061379f833981519152600060405161253591815260200190565b60405180910390a3505050505050565b601f54610100900460ff1661259c5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401611049565b6011546000906001600160a01b03888116600160481b9092041614806125de57506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b6011549091506000906001600160a01b03888116600160481b90920416148061262357506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b9050600082158015612633575081155b9050612643898989868686612976565b5050505b505050505050565b6000611687836001600160a01b038416612e0b565b601d805460ff1916600190811790915530600090815260209190915260408120546011549091906126aa90640100000000810460ff90811691630100000090041661362c565b60ff1690506000600a549050838111156126cc57600b5460ff16156126cc5750825b808310806126dc575061ffff8216155b156126e95750505061283f565b60115460009061ffff841690612709906301000000900460ff16846135de565b6127139190613687565b60115490915060009061ffff85169061273790640100000000900460ff16856135de565b6127419190613687565b60115490915060009061ffff86169061276490600160301b900460ff16866135de565b61276e9190613687565b60115490915060009061ffff87169061279190600160281b900460ff16876135de565b61279b9190613687565b905060006127aa600286613687565b905060006127b882876135fd565b9050600084846127c88885613614565b6127d29190613614565b6127dc9190613614565b9050476127e882612ef8565b60006127f482476135fd565b905060008361280386846135de565b61280d9190613687565b90506128198682612fea565b600061282584476135fd565b9050612830816130b2565b50505050505050505050505050505b50601d805460ff19169055565b6000818152600183016020526040812054612893575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110c5565b5060006110c5565b6001600160a01b03811660009081526001830160205260408120541515611687565b6001600160a01b038316600090815260016020526040902054818110156129215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b61292b8483613174565b61293583836131b9565b826001600160a01b0316846001600160a01b031660008051602061379f8339815191528460405161296891815260200190565b60405180910390a350505050565b6001600160a01b03808616600090815260016020526040808220549289168252902054858110156129e45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b6002600f546129f39190613687565b600a5560008415612af857612a0960068a61289b565b612aa3576001600160a01b03891660009081526003602052604090205442101580612a3b5750601d54610100900460ff165b612a7c5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401611049565b601e54612a899042613614565b6001600160a01b038a166000908152600360205260409020555b600f54871115612ae75760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401611049565b50601154610100900460ff16612c0a565b8515612b5757600e54612b0b8885613614565b1115612b295760405162461bcd60e51b8152600401611049906136a9565b601054871115612b4b5760405162461bcd60e51b8152600401611049906136a9565b5060115460ff16612c0a565b600e54612b648885613614565b1115612b825760405162461bcd60e51b8152600401611049906136a9565b612b8d60068a61289b565b612bfc576001600160a01b03891660009081526003602052604090205442101580612bbf5750601d54610100900460ff165b612bfc5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401611049565b5060115462010000900460ff165b601354600090600160a01b900460ff1615612d27576011546001600160a01b038b8116600160481b9092041614801590612c475750601f5460ff16155b8015612c565750601d5460ff16155b15612c6457612c6488612664565b601154600090612cbe908a90859060ff600160301b8204811691600160281b8104821691612ca591630100000081048216916401000000009091041661362c565b612caf919061362c565b612cb9919061362c565b6131dd565b9050612cca818a6135fd565b30600090815260016020526040812080549294508392909190612cee908490613614565b909155505060405181815230906001600160a01b038d169060008051602061379f8339815191529060200160405180910390a350612d2a565b50865b612d348a89613174565b612d3e89826131b9565b601554604051630b58546360e41b81526001600160a01b038c811660048301528b81166024830152604482018b90528915156064830152881515608483015287151560a48301529091169063b58546309060c401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50505050886001600160a01b03168a6001600160a01b031660008051602061379f83398151915283604051612df791815260200190565b60405180910390a350505050505050505050565b60008181526001830160205260408120548015612eee576000612e2f6001836135fd565b8554909150600090612e43906001906135fd565b90506000866000018281548110612e5c57612e5c6136d3565b9060005260206000200154905080876000018481548110612e7f57612e7f6136d3565b600091825260208083209091019290925582815260018901909152604090208490558654879080612eb257612eb26136e9565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506110c5565b60009150506110c5565b601254612f109030906001600160a01b031683612135565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4557612f456136d3565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612f7657612f766136d3565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612fbc9085906000908690309042906004016136ff565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612647573d6000803e3d6000fd5b80601c6000828254612ffc9190613614565b90915550506012546130199030906001600160a01b031684612135565b60125460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613086573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130ab9190613770565b5050505050565b6018546000906064906130c89060ff16846135de565b6130d29190613687565b6018549091506000906064906130f19062010000900460ff16856135de565b6130fb9190613687565b60185490915060009060649061311990610100900460ff16866135de565b6131239190613687565b905082601960008282546131379190613614565b9250508190555081601b60008282546131509190613614565b9250508190555080601a60008282546131699190613614565b909155505050505050565b6001600160a01b0382166000908152600160205260408120546131989083906135fd565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b038216600090815260016020526040812054613198908390613614565b60006127108260ff168460ff16866131f591906135de565b6131ff91906135de565b6132099190613687565b949350505050565b801515811461136657600080fd5b60006020828403121561323157600080fd5b813561168781613211565b80356001600160a01b038116811461325357600080fd5b919050565b6000806040838503121561326b57600080fd5b6132748361323c565b91506132826020840161323c565b90509250929050565b60006020828403121561329d57600080fd5b6116878261323c565b600060208083528351808285015260005b818110156132d3578581018301518582016040015282016132b7565b818111156132e5576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561330e57600080fd5b6133178361323c565b946020939093013593505050565b60008060006060848603121561333a57600080fd5b6133438461323c565b92506133516020850161323c565b9150604084013590509250925092565b803560ff8116811461325357600080fd5b600080600080600080600060e0888a03121561338d57600080fd5b61339688613361565b96506133a460208901613361565b95506133b260408901613361565b94506133c060608901613361565b93506133ce60808901613361565b92506133dc60a08901613361565b91506133ea60c08901613361565b905092959891949750929550565b6000806040838503121561340b57600080fd5b6134148361323c565b9150602083013561342481613211565b809150509250929050565b60006020828403121561344157600080fd5b61168782613361565b60006020828403121561345c57600080fd5b5035919050565b60006020828403121561347557600080fd5b813561ffff8116811461168757600080fd5b6000806040838503121561349a57600080fd5b50508035926020909101359150565b602080825260129082015271086c2d8d8cae440dcdee840d2dc4082eae8d60731b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561352657816000190482111561350c5761350c6134d5565b8085161561351957918102915b93841c93908002906134f0565b509250929050565b60008261353d575060016110c5565b8161354a575060006110c5565b8160018114613560576002811461356a57613586565b60019150506110c5565b60ff84111561357b5761357b6134d5565b50506001821b6110c5565b5060208310610133831016604e8410600b84101617156135a9575081810a6110c5565b6135b383836134eb565b80600019048211156135c7576135c76134d5565b029392505050565b600061168760ff84168361352e565b60008160001904831182151516156135f8576135f86134d5565b500290565b60008282101561360f5761360f6134d5565b500390565b60008219821115613627576136276134d5565b500190565b600060ff821660ff84168060ff03821115613649576136496134d5565b019392505050565b60006020828403121561366357600080fd5b5051919050565b60006020828403121561367c57600080fd5b815161168781613211565b6000826136a457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561374f5784516001600160a01b03168352938301939183019160010161372a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561378557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b7864736f6c634300080e0033

Deployed Bytecode Sourcemap

14696:19993:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28747:111;;;;;;;;;;-1:-1:-1;28747:111:1;;;;;:::i;:::-;;:::i;14885:68::-;;;;;;;;;;-1:-1:-1;14885:68:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;972:25:4;;;960:2;945:18;14885:68:1;;;;;;;;30550:18;;;;;;;;;;-1:-1:-1;30550:18:1;;;;;;;;;;;;;;1173:14:4;;1166:22;1148:41;;1136:2;1121:18;30550::1;1008:187:4;30722:151:1;;;;;;;;;;-1:-1:-1;30722:151:1;;;;;:::i;:::-;;:::i;32312:92::-;;;;;;;;;;-1:-1:-1;32392:5:1;;;;;;;;;;;;-1:-1:-1;;;32392:5:1;;;;32312:92;;;;;;;:::i;22255:30::-;;;;;;;;;;-1:-1:-1;22255:30:1;;;;;;;;;;;2165:4:4;2153:17;;;2135:36;;2123:2;2108:18;22255:30:1;1993:184:4;33279:158:1;;;;;;;;;;-1:-1:-1;33279:158:1;;;;;:::i;:::-;;:::i;15567:35::-;;;;;;;;;;-1:-1:-1;15567:35:1;;;;;;;;;;;;;;2615:6:4;2603:19;;;2585:38;;2573:2;2558:18;15567:35:1;2441:188:4;28128:258:1;;;;;;;;;;;;;:::i;22401:28::-;;;;;;;;;;;;;;;;27603:261;;;;;;;;;;;;;:::i;32610:106::-;;;;;;;;;;-1:-1:-1;32691:18:1;;32610:106;;15294:67;;;;;;;;;;;;;:::i;15463:33::-;;;;;;;;;;-1:-1:-1;15463:33:1;;;;;;;;;;;25670:291;;;;;;;;;;-1:-1:-1;25871:12:1;;25670:291;;;25871:12;-1:-1:-1;;;25871:12:1;;;;2949:25:4;;-1:-1:-1;;;25885:10:1;;;;3005:2:4;2990:18;;2983:34;25896:13:1;;;;;3033:18:4;;;3026:34;;;;25910:13:1;;;;;3091:2:4;3076:18;;3069:34;25924:7:1;;;3134:3:4;3119:19;;3112:35;25871:12:1;25932:8;;;;3178:3:4;3163:19;;3156:35;25941:12:1;;;;;3222:3:4;3207:19;;3200:35;2936:3;2921:19;25670:291:1;2634:607:4;33746:384:1;;;;;;;;;;-1:-1:-1;33746:384:1;;;;;:::i;:::-;;:::i;15513:37::-;;;;;;;;;;-1:-1:-1;15513:37:1;;;;;;;;;;;32512:92;;;;;;;;;;-1:-1:-1;16324:2:1;32512:92;;22435:30;;;;;;;;;;;;;;;;16290:36;;;;;;;;;;;;16324:2;16290:36;;15622:42;;;;;;;;;;-1:-1:-1;15622:42:1;;;;-1:-1:-1;;;15622:42:1;;;;;;34142:202;;;;;;;;;;-1:-1:-1;34142:202:1;;;;;:::i;:::-;;:::i;27323:134::-;;;;;;;;;;-1:-1:-1;27323:134:1;;;;;:::i;:::-;;:::i;31693:150::-;;;;;;;;;;;;;:::i;29217:569::-;;;;;;;;;;-1:-1:-1;29217:569:1;;;;;:::i;:::-;;:::i;22881:25::-;;;;;;;;;;;;;;;;30885:284;;;;;;;;;;-1:-1:-1;30885:284:1;;;;;:::i;:::-;;:::i;22216:27::-;;;;;;;;;;;;;;;;26820:123;;;;;;;;;;-1:-1:-1;26820:123:1;;;;;:::i;:::-;;:::i;25971:282::-;;;;;;;;;;-1:-1:-1;25971:282:1;;;;;:::i;:::-;;:::i;22167:38::-;;;;;;;;;;;;;;;;27462:135;;;;;;;;;;-1:-1:-1;27462:135:1;;;;;:::i;:::-;;:::i;27870:252::-;;;;;;;;;;;;;:::i;16003:46::-;;;;;;;;;;;;;;;;25533:131;;;;;;;;;;;;;:::i;:::-;;;;4845:25:4;;;4901:2;4886:18;;4879:34;;;;4818:18;25533:131:1;4671:248:4;16055:45:1;;;;;;;;;;;;;;;;22364:31;;;;;;;;;;;;;;;;26954:111;;;;;;;;;;-1:-1:-1;26954:111:1;;;;;:::i;:::-;;:::i;14834:45::-;;;;;;;;;;-1:-1:-1;14834:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;26258:108;;;;;;;;;;-1:-1:-1;26347:12:1;;26258:108;;32722:119;;;;;;;;;;-1:-1:-1;32722:119:1;;;;;:::i;:::-;-1:-1:-1;;;;;32816:18:1;32790:7;32816:18;;;:9;:18;;;;;;;32722:119;7050:137;;;;;;;;;;;;;:::i;15948:49::-;;;;;;;;;;;;;;;;28868:105;;;;;;;;;;-1:-1:-1;28868:105:1;;;;;:::i;:::-;;:::i;22324:29::-;;;;;;;;;;-1:-1:-1;22324:29:1;;;;;;;;;;;22291:27;;;;;;;;;;-1:-1:-1;22291:27:1;;;;;;;;;;;28574:163;;;;;;;;;;-1:-1:-1;28574:163:1;;;;;:::i;:::-;;:::i;15810:73::-;;;;;;;;;;;;15841:42;15810:73;;;;;-1:-1:-1;;;;;5088:32:4;;;5070:51;;5058:2;5043:18;15810:73:1;4924:203:4;26439:28:1;;;;;;;;;;-1:-1:-1;26439:28:1;;;;;;;;31565:121;;;;;;;;;;-1:-1:-1;31565:121:1;;;;;:::i;:::-;;:::i;26372:28::-;;;;;;;;;;-1:-1:-1;26372:28:1;;;;;;;;;;;32214:92;;;;;;;;;;-1:-1:-1;32266:7:1;6900:6;-1:-1:-1;;;;;6900:6:1;32214:92;;31938:270;;;;;;;;;;-1:-1:-1;31938:270:1;;;;;:::i;:::-;;:::i;32410:96::-;;;;;;;;;;-1:-1:-1;32492:7:1;;;;;;;;;;;;-1:-1:-1;;;32492:7:1;;;;32410:96;;29796:109;;;;;;;;;;-1:-1:-1;29796:109:1;;;;;:::i;:::-;;:::i;28486:82::-;;;;;;;;;;-1:-1:-1;28486:82:1;;;;;:::i;:::-;;:::i;15121:43::-;;;;;;;;;;-1:-1:-1;15121:43:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;15894:48;;;;;;;;;;;;;;;;34350:336;;;;;;;;;;-1:-1:-1;34350:336:1;;;;;:::i;:::-;;:::i;32847:164::-;;;;;;;;;;-1:-1:-1;32847:164:1;;;;;:::i;:::-;;:::i;28983:116::-;;;;;;;;;;-1:-1:-1;28983:116:1;;;;;:::i;:::-;;:::i;26678:95::-;;;;;;;;;;-1:-1:-1;26678:95:1;;;;;:::i;:::-;;:::i;29915:103::-;;;;;;;;;;-1:-1:-1;29915:103:1;;;;;:::i;:::-;;:::i;26583:89::-;;;;;;;;;;-1:-1:-1;26583:89:1;;;;;:::i;:::-;;:::i;15249:39::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15249:39:1;;;;;31314:116;;;;;;;;;;-1:-1:-1;31314:116:1;;;;;:::i;:::-;;:::i;16369:25::-;;;;;;;;;;-1:-1:-1;16369:25:1;;;;-1:-1:-1;;;16369:25:1;;;;;;30024:107;;;;;;;;;;-1:-1:-1;30024:107:1;;;;;:::i;:::-;;:::i;16836:20::-;;;;;;;;;;-1:-1:-1;16836:20:1;;;;-1:-1:-1;;;;;16836:20:1;;;30275:253;;;;;;;;;;-1:-1:-1;30275:253:1;;;;;:::i;:::-;;:::i;15724:80::-;;;;;;;;;;;;15762:42;15724:80;;29110:101;;;;;;;;;;-1:-1:-1;29110:101:1;;;;;:::i;:::-;;:::i;25272:251::-;;;;;;;;;;-1:-1:-1;25272:251:1;;;;;:::i;:::-;;:::i;15205:38::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15205:38:1;;;;;16442:39;;;;;;;;;;-1:-1:-1;16442:39:1;;;;-1:-1:-1;;;;;16442:39:1;;;31181:127;;;;;;;;;;-1:-1:-1;31181:127:1;;;;;:::i;:::-;;:::i;30137:::-;;;;;;;;;;-1:-1:-1;30137:127:1;;;;;:::i;:::-;;:::i;26475:102::-;;;;;;;;;;-1:-1:-1;26475:102:1;;;;;:::i;:::-;;:::i;33017:256::-;;;;;;;;;;-1:-1:-1;33017:256:1;;;;;:::i;:::-;;:::i;27071:118::-;;;;;;;;;;-1:-1:-1;27071:118:1;;;;;:::i;:::-;;:::i;28392:88::-;;;;;;;;;;;;;:::i;30624:87::-;;;;;;;;;;-1:-1:-1;30624:87:1;;;;;:::i;:::-;;:::i;7198:232::-;;;;;;;;;;-1:-1:-1;7198:232:1;;;;;:::i;:::-;;:::i;31436:123::-;;;;;;;;;;-1:-1:-1;31436:123:1;;;;;:::i;:::-;;:::i;27194:119::-;;;;;;;;;;-1:-1:-1;27194:119:1;;;;;:::i;:::-;;:::i;26406:27::-;;;;;;;;;;;;;;;;16402:34;;;;;;;;;;-1:-1:-1;16402:34:1;;;;-1:-1:-1;;;16402:34:1;;-1:-1:-1;;;;;16402:34:1;;;14959:45;;;;;;;;;;-1:-1:-1;14959:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;28747:111;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;;;;;;;;;28828:16:::1;:23:::0;;-1:-1:-1;;28828:23:1::1;::::0;::::1;;::::0;;;::::1;::::0;;28747:111::o;30722:151::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30822:22:::1;:44:::0;;-1:-1:-1;;;;;30822:44:1;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;30822:44:1;;::::1;::::0;;;::::1;::::0;;30722:151::o;33279:158::-;33356:4;33372:37;33381:10;33393:7;33402:6;33372:8;:37::i;:::-;-1:-1:-1;33426:4:1;33279:158;;;;;:::o;28128:258::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28203:15:::1;::::0;;28188:14:::1;28228:17:::0;;;;28306:32:::1;::::0;28203:15;;28272:10:::1;::::0;;;28203:15;;28306:32:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28292:46;;;28356:4;28348:31;;;::::0;-1:-1:-1;;;28348:31:1;;7026:2:4;28348:31:1::1;::::0;::::1;7008:21:4::0;7065:2;7045:18;;;7038:30;-1:-1:-1;;;7084:18:4;;;7077:45;7139:18;;28348:31:1::1;6824:339:4::0;28348:31:1::1;28178:208;;;28128:258::o:0;27603:261::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27679:16:::1;::::0;;27664:14:::1;27705:18:::0;;;;27784:32:::1;::::0;27679:16;;27750:10:::1;::::0;;;27679:16;;27784:32:::1;6614:205:4::0;15294:67:1;15347:13;16324:2;15347;:13;:::i;:::-;15333:28;;:10;:28;:::i;:::-;15294:67;:::o;33746:384::-;33846:4;33862:36;33872:6;33880:9;33891:6;33862:9;:36::i;:::-;-1:-1:-1;;;;;33936:19:1;;33909:24;33936:19;;;:11;:19;;;;;;;;33956:10;33936:31;;;;;;;;33985:26;;;;33977:59;;;;-1:-1:-1;;;33977:59:1;;9058:2:4;33977:59:1;;;9040:21:4;9097:2;9077:18;;;9070:30;-1:-1:-1;;;9116:18:4;;;9109:50;9176:18;;33977:59:1;8856:344:4;33977:59:1;34047:55;34056:6;34064:10;34076:25;34095:6;34076:16;:25;:::i;:::-;34047:8;:55::i;:::-;-1:-1:-1;34119:4:1;;33746:384;-1:-1:-1;;;;33746:384:1:o;34142:202::-;34249:10;34224:4;34270:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;34270:32:1;;;;;;;;;;34224:4;;34240:76;;34261:7;;34270:45;;34305:10;;34270:45;:::i;27323:134::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27416:34:::1;:21;27442:7:::0;27416:25:::1;:34::i;:::-;;27323:134:::0;:::o;31693:150::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31762::::1;::::0;31749:9:::1;::::0;31762:10:::1;::::0;31786:21:::1;::::0;31749:9;31762:51;31749:9;31762:51;31786:21;31762:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31748:65;;;31831:4;31823:13;;;::::0;::::1;;31738:105;31693:150::o:0;29217:569::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29399:14:::1;29458::::0;29443;29414:27:::1;29430:11:::0;29414:13;:27:::1;:::i;:::-;:43;;;;:::i;:::-;:58;;;;:::i;:::-;29399:73;;29490:8;:13;;29500:3;29490:13;29482:64;;;::::0;-1:-1:-1;;;29482:64:1;;9879:2:4;29482:64:1::1;::::0;::::1;9861:21:4::0;9918:2;9898:18;;;9891:30;9957:34;9937:18;;;9930:62;-1:-1:-1;;;10008:18:4;;;10001:36;10054:19;;29482:64:1::1;9677:402:4::0;29482:64:1::1;-1:-1:-1::0;29556:12:1::1;:28:::0;;::::1;29755:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;29729:16:1;;::::1;29556:28;29729:16;-1:-1:-1::0;;29666:28:1;;::::1;::::0;::::1;-1:-1:-1::0;;29628:28:1;;::::1;::::0;::::1;29666::::0;;;;-1:-1:-1;;29594:24:1;;::::1;-1:-1:-1::0;;;29594:24:1::1;-1:-1:-1::0;;29556:28:1;;::::1;-1:-1:-1::0;;;29556:28:1::1;29594:24:::0;;;;-1:-1:-1;;29594:24:1;;;;;;;;;;::::1;29666:28:::0;;;;;;;;::::1;29729:16:::0;;;;29705:14;;;::::1;29729:16:::0;;;;::::1;29755:24:::0;;;::::1;;::::0;;29217:569::o;30885:284::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31025:30:::1;::::0;-1:-1:-1;;;31025:30:1;;31049:4:::1;31025:30;::::0;::::1;5070:51:4::0;30983:10:1;;30961:12:::1;::::0;-1:-1:-1;;;;;31025:15:1;::::1;::::0;::::1;::::0;5043:18:4;;31025:30:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31004:51;;31084:1;31073:10;:12;31065:49;;;::::0;-1:-1:-1;;;31065:49:1;;10475:2:4;31065:49:1::1;::::0;::::1;10457:21:4::0;10514:2;10494:18;;;10487:30;10553:26;10533:18;;;10526:54;10597:18;;31065:49:1::1;10273:348:4::0;31065:49:1::1;31124:38;::::0;-1:-1:-1;;;31124:38:1;;31139:10:::1;31124:38;::::0;::::1;10800:51:4::0;10867:18;;;10860:34;;;-1:-1:-1;;;;;31124:14:1;::::1;::::0;::::1;::::0;10773:18:4;;31124:38:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30951:218;;30885:284:::0;:::o;26820:123::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;26912:16:1;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:24;;-1:-1:-1;;26912:24:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26820:123::o;25971:282::-;-1:-1:-1;;;;;26100:25:1;;26065:7;26100:25;;;:9;:25;;;;;;26148:15;26138:25;;26135:71;;-1:-1:-1;26194:1:1;;25971:282;-1:-1:-1;;25971:282:1:o;26135:71::-;26222:24;26231:15;26222:8;:24;:::i;:::-;26215:31;25971:282;-1:-1:-1;;;25971:282:1:o;27462:135::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27553:37:::1;:21;27582:7:::0;27553:28:::1;:37::i;27870:252::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27943:13:::1;::::0;;27928:14:::1;27966:15:::0;;;;28042:32:::1;::::0;27943:13;;28008:10:::1;::::0;;;27943:13;;28042:32:::1;6614:205:4::0;25533:131:1;25582:15;25599:12;25642:1;25629:12;;:14;;;;:::i;:::-;25655:1;25645:9;;:11;;;;:::i;:::-;25622:35;;;;25533:131;;:::o;26954:111::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;27037:13:1;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;27037:21:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26954:111::o;7050:137::-;6974:10;6963:7;6874;6900:6;-1:-1:-1;;;;;6900:6:1;;6836:77;6963:7;-1:-1:-1;;;;;6963:21:1;;6955:66;;;;-1:-1:-1;;;6955:66:1;;11579:2:4;6955:66:1;;;11561:21:4;;;11598:18;;;11591:30;11657:34;11637:18;;;11630:62;11709:18;;6955:66:1;11377:356:4;6955:66:1;7148:1:::1;7132:6:::0;;7111:40:::1;::::0;-1:-1:-1;;;;;7132:6:1;;::::1;::::0;7111:40:::1;::::0;7148:1;;7111:40:::1;7178:1;7161:19:::0;;-1:-1:-1;;;;;;7161:19:1::1;::::0;;7050:137::o;28868:105::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28941:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;28941:25:1;;::::1;::::0;;;::::1;::::0;;28868:105::o;28574:163::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28644:5:::1;:14:::0;;-1:-1:-1;;;;;28644:14:1;;::::1;-1:-1:-1::0;;;;;;28644:14:1;;::::1;::::0;::::1;::::0;;;28668:16:::1;:31:::0;;;;::::1;::::0;::::1;::::0;;;28644:5:::1;28709:14:::0;;;:7:::1;:14;::::0;;;;:21;;-1:-1:-1;;28709:21:1::1;28644:14:::0;28709:21:::1;::::0;;28574:163::o;31565:121::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;31651:20:1::1;31674:5;31651:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;31651:28:1::1;::::0;;31565:121::o;31938:270::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;32038:4:::1;32020:24;::::0;;;:9:::1;:24;::::0;;;;;:34;-1:-1:-1;32020:34:1::1;32012:50;;;::::0;-1:-1:-1;;;32012:50:1;;11940:2:4;32012:50:1::1;::::0;::::1;11922:21:4::0;11979:1;11959:18;;;11952:29;-1:-1:-1;;;11997:18:4;;;11990:33;12040:18;;32012:50:1::1;11738:326:4::0;32012:50:1::1;32090:4;32072:24;::::0;;;:9:::1;:24;::::0;;;;:34;;32100:6;;32072:24;:34:::1;::::0;32100:6;;32072:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;32116:19:1;::::1;;::::0;;;:9:::1;:19;::::0;;;;:29;;32139:6;;32116:19;:29:::1;::::0;32139:6;;32116:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;32160:41:1::1;::::0;972:25:4;;;-1:-1:-1;;;;;32160:41:1;::::1;::::0;32177:4:::1;::::0;-1:-1:-1;;;;;;;;;;;32160:41:1;960:2:4;945:18;32160:41:1::1;;;;;;;31938:270:::0;;:::o;29796:109::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29875:14:::1;:23:::0;;-1:-1:-1;;29875:23:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29796:109::o;28486:82::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28549:4:::1;:12:::0;;-1:-1:-1;;;;;;28549:12:1::1;-1:-1:-1::0;;;;;28549:12:1;;;::::1;::::0;;;::::1;::::0;;28486:82::o;34350:336::-;34492:10;34437:4;34480:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;34480:32:1;;;;;;;;;;34530:35;;;;34522:60;;;;-1:-1:-1;;;34522:60:1;;12271:2:4;34522:60:1;;;12253:21:4;12310:2;12290:18;;;12283:30;-1:-1:-1;;;12329:18:4;;;12322:42;12381:18;;34522:60:1;12069:336:4;34522:60:1;34593:65;34602:10;34614:7;34623:34;34642:15;34623:16;:34;:::i;34593:65::-;-1:-1:-1;34675:4:1;;34350:336;-1:-1:-1;;;34350:336:1:o;32847:164::-;32927:4;32943:40;32953:10;32965:9;32976:6;32943:9;:40::i;28983:116::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29064:12:::1;:28:::0;28983:116::o;26678:95::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26745:15:::1;:21:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;26745:21:1::1;-1:-1:-1::0;;26745:21:1;;::::1;::::0;;;::::1;::::0;;26678:95::o;29915:103::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29991:11:::1;:20:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;29991:20:1;;::::1;::::0;;;::::1;::::0;;29915:103::o;26583:89::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26650:9:::1;:15:::0;26583:89::o;31314:116::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31397:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31397:26:1;;::::1;::::0;;;::::1;::::0;;31314:116::o;30024:107::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30102:13:::1;:22:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;30102:22:1;;::::1;::::0;;;::::1;::::0;;30024:107::o;30275:253::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30393:17:::1;:15:::0;30409:1:::1;30393:17;:::i;:::-;30377:33:::0;-1:-1:-1;30433:14:1::1;:12:::0;30446:1:::1;30433:14;:::i;:::-;30457:12;:30:::0;;;;-1:-1:-1;30497:9:1::1;:24:::0;30275:253::o;29110:101::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29183:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;29183:21:1::1;-1:-1:-1::0;;;;29183:21:1;;::::1;::::0;;;::::1;::::0;;29110:101::o;25272:251::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;25365:4:::1;25347:24;::::0;;;:9:::1;:24;::::0;;;;;:34;-1:-1:-1;25347:34:1::1;25339:43;;;::::0;::::1;;25410:4;25392:24;::::0;;;:9:::1;:24;::::0;;;;:34;;25420:6;;25392:24;:34:::1;::::0;25420:6;;25392:34:::1;:::i;:::-;;;;;;;;25458:6;25436:18;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25479:37:1::1;::::0;972:25:4;;;15841:42:1::1;::::0;25496:4:::1;::::0;-1:-1:-1;;;;;;;;;;;25479:37:1;960:2:4;945:18;25479:37:1::1;;;;;;;25272:251:::0;:::o;31181:127::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31269:11:::1;:32:::0;;-1:-1:-1;;31269:32:1::1;::::0;::::1;;::::0;;;::::1;::::0;;31181:127::o;30137:::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30224:33:::1;30243:13;:4:::0;30250:6:::1;30243:13;:::i;:::-;30224:18;:33::i;26475:102::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26547:12:::1;:23:::0;;-1:-1:-1;;26547:23:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26475:102::o;33017:256::-;33132:5;;33101:7;;-1:-1:-1;;;;;33132:5:1;;;33123:14;;;;33120:143;;-1:-1:-1;33160:18:1;;33153:25;;33120:143;-1:-1:-1;;;;;;33224:19:1;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;33217:35;;27071:118;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27160:22:::1;:9;27174:7:::0;27160:13:::1;:22::i;28392:88::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28461:10:::1;28440:33;30624:87:::0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30690:6:::1;:14:::0;;;::::1;;;;-1:-1:-1::0;;30690:14:1;;::::1;::::0;;;::::1;::::0;;30624:87::o;7198:232::-;6974:10;6963:7;6874;6900:6;-1:-1:-1;;;;;6900:6:1;;6836:77;6963:7;-1:-1:-1;;;;;6963:21:1;;6955:66;;;;-1:-1:-1;;;6955:66:1;;11579:2:4;6955:66:1;;;11561:21:4;;;11598:18;;;11591:30;11657:34;11637:18;;;11630:62;11709:18;;6955:66:1;11377:356:4;6955:66:1;-1:-1:-1;;;;;7278:22:1;::::1;7270:73;;;::::0;-1:-1:-1;;;7270:73:1;;12612:2:4;7270:73:1::1;::::0;::::1;12594:21:4::0;12651:2;12631:18;;;12624:30;12690:34;12670:18;;;12663:62;-1:-1:-1;;;12741:18:4;;;12734:36;12787:19;;7270:73:1::1;12410:402:4::0;7270:73:1::1;7379:6;::::0;;7358:38:::1;::::0;-1:-1:-1;;;;;7358:38:1;;::::1;::::0;7379:6;::::1;::::0;7358:38:::1;::::0;::::1;7406:6;:17:::0;;-1:-1:-1;;;;;;7406:17:1::1;-1:-1:-1::0;;;;;7406:17:1;;;::::1;::::0;;;::::1;::::0;;7198:232::o;31436:123::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;31522:23:1::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;31522:30:1::1;31548:4;31522:30;::::0;;31436:123::o;27194:119::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27281:25:::1;:9;27298:7:::0;27281:16:::1;:25::i;13147:150::-:0;13217:4;13240:50;13245:3;-1:-1:-1;;;;;13265:23:1;;13240:4;:50::i;16607:111::-;16661:4;6900:6;;-1:-1:-1;;;;;16683:13:1;;;6900:6;;16683:13;;:28;;-1:-1:-1;;;;;;;16698:13:1;;;;;:7;:13;;;;;;;;;16607:111::o;33442:297::-;-1:-1:-1;;;;;33535:20:1;;33527:50;;;;-1:-1:-1;;;33527:50:1;;13019:2:4;33527:50:1;;;13001:21:4;13058:2;13038:18;;;13031:30;-1:-1:-1;;;13077:18:4;;;13070:47;13134:18;;33527:50:1;12817:341:4;33527:50:1;-1:-1:-1;;;;;33595:21:1;;33587:49;;;;-1:-1:-1;;;33587:49:1;;13365:2:4;33587:49:1;;;13347:21:4;13404:2;13384:18;;;13377:30;-1:-1:-1;;;13423:18:4;;;13416:45;13478:18;;33587:49:1;13163:339:4;33587:49:1;-1:-1:-1;;;;;33647:19:1;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;33699:33;;972:25:4;;;33699:33:1;;945:18:4;33699:33:1;;;;;;;33442:297;;;:::o;17603:1612::-;-1:-1:-1;;;;;17698:20:1;;17690:51;;;;-1:-1:-1;;;17690:51:1;;13709:2:4;17690:51:1;;;13691:21:4;13748:2;13728:18;;;13721:30;-1:-1:-1;;;13767:18:4;;;13760:48;13825:18;;17690:51:1;13507:342:4;17690:51:1;-1:-1:-1;;;;;17759:23:1;;17751:52;;;;-1:-1:-1;;;17751:52:1;;14056:2:4;17751:52:1;;;14038:21:4;14095:2;14075:18;;;14068:30;-1:-1:-1;;;14114:18:4;;;14107:46;14170:18;;17751:52:1;13854:340:4;17751:52:1;17816:11;;;;17813:111;;;-1:-1:-1;;;;;17852:18:1;;;;;;:10;:18;;;;;;;;17851:19;:45;;;;-1:-1:-1;;;;;;17875:21:1;;;;;;:10;:21;;;;;;;;17874:22;17851:45;17843:70;;;;-1:-1:-1;;;17843:70:1;;14401:2:4;17843:70:1;;;14383:21:4;14440:2;14420:18;;;14413:30;-1:-1:-1;;;14459:18:4;;;14452:42;14511:18;;17843:70:1;14199:336:4;17843:70:1;17934:15;17953:26;:9;17972:6;17953:18;:26::i;:::-;:59;;;-1:-1:-1;17983:29:1;:9;18002;17983:18;:29::i;:::-;17953:78;;;-1:-1:-1;;;;;;18016:15:1;;;;;;:7;:15;;;;;;;;17953:78;:100;;;-1:-1:-1;;;;;;18035:18:1;;;;;;:7;:18;;;;;;;;17953:100;:117;;;-1:-1:-1;18065:5:1;;-1:-1:-1;;;;;18057:13:1;;;18065:5;;18057:13;17953:117;:137;;;-1:-1:-1;18085:5:1;;-1:-1:-1;;;;;18074:16:1;;;18085:5;;18074:16;17953:137;17934:157;-1:-1:-1;18102:23:1;-1:-1:-1;;;;;18127:21:1;;18143:4;18127:21;;:49;;-1:-1:-1;;;;;;18152:24:1;;18171:4;18152:24;18127:49;18227:19;;18102:75;;-1:-1:-1;18188:24:1;;-1:-1:-1;;;;;18217:29:1;;;-1:-1:-1;;;18227:19:1;;;;18217:29;:59;;;;-1:-1:-1;;;;;;18250:26:1;;15762:42;18250:26;18217:59;18216:134;;;-1:-1:-1;18303:19:1;;-1:-1:-1;;;;;18290:32:1;;;-1:-1:-1;;;18303:19:1;;;;18290:32;:59;;;;-1:-1:-1;;;;;;18326:23:1;;15762:42;18326:23;18290:59;18188:163;;18366:18;:41;;;;18388:19;18366:41;:55;;;;18411:10;18366:55;18363:846;;;18436:43;18453:6;18461:9;18472:6;18436:16;:43::i;:::-;18363:846;;;18529:6;;;;;;;18524:373;;6874:7;6900:6;-1:-1:-1;;;;;18559:17:1;;;6900:6;;18559:17;;;;:41;;-1:-1:-1;6874:7:1;6900:6;-1:-1:-1;;;;;18580:20:1;;;6900:6;;18580:20;;18559:41;18555:328;;;18628:5;;-1:-1:-1;;;18628:5:1;;;;18624:241;;;18682:9;-1:-1:-1;;;;;18666:28:1;18675:6;-1:-1:-1;;;;;18666:28:1;-1:-1:-1;;;;;;;;;;;18692:1:1;18666:28;;;;972:25:4;;960:2;945:18;;826:177;18666:28:1;;;;;;;;18720:7;;;17603:1612;;;:::o;18624:241::-;18809:6;;;;;;;18801:41;;;;-1:-1:-1;;;18801:41:1;;14932:2:4;18801:41:1;;;14914:21:4;14971:2;14951:18;;;14944:30;15010:25;14990:18;;;14983:53;15053:18;;18801:41:1;14730:347:4;18801:41:1;18939:19;;18920:10;;-1:-1:-1;;;;;18931:27:1;;;-1:-1:-1;;;18939:19:1;;;;18931:27;;:53;;-1:-1:-1;;;;;;18961:23:1;;15762:42;18961:23;18931:53;19021:19;;18920:64;;-1:-1:-1;18998:11:1;;-1:-1:-1;;;;;19010:30:1;;;-1:-1:-1;;;19021:19:1;;;;19010:30;;:59;;-1:-1:-1;;;;;;19043:26:1;;15762:42;19043:26;19010:59;18998:71;;19083:15;19102:5;19101:6;:17;;;;;19112:6;19111:7;19101:17;19083:35;;19132:64;19147:6;19154:9;19164:6;19171:5;19177:6;19185:10;19132:14;:64::i;:::-;18510:699;;;18363:846;17680:1535;;;17603:1612;;;:::o;13308:156::-;13381:4;13404:53;13412:3;-1:-1:-1;;;;;13432:23:1;;13404:7;:53::i;23107:1301::-;22994:27;:34;;-1:-1:-1;;22994:34:1;23024:4;22994:34;;;;;;23224:4:::1;22994:27:::0;23206:24;;;::::1;::::0;;;;;;;;23270:13:::1;::::0;23206:24;;22994:27;23256::::1;::::0;23270:13;;::::1;22994:34:::0;23270:13;;::::1;::::0;23256;;::::1;;:27;:::i;:::-;23240:43;;;;23293:19;23313:9;;23293:29;;23349:8;23335:11;:22;23332:123;;;23376:12;::::0;::::1;;23373:72;;;-1:-1:-1::0;23422:8:1;23373:72:::1;23486:11;23470:15;:27;:40;;;-1:-1:-1::0;23499:11:1::1;::::0;::::1;::::0;23470:40:::1;23467:75;;;23525:7;;;;;23467:75;23590:13;::::0;23551:25:::1;::::0;23577:36:::1;::::0;::::1;::::0;23578:25:::1;::::0;23590:13;;::::1;;;23578:11:::0;:25:::1;:::i;:::-;23577:36;;;;:::i;:::-;23663:13;::::0;23551:62;;-1:-1:-1;23623:25:1::1;::::0;23650:36:::1;::::0;::::1;::::0;23651:25:::1;::::0;23663:13;;::::1;;;23651:11:::0;:25:::1;:::i;:::-;23650:36;;;;:::i;:::-;23735:12;::::0;23623:63;;-1:-1:-1;23696:24:1::1;::::0;23722:35:::1;::::0;::::1;::::0;23723:24:::1;::::0;-1:-1:-1;;;23735:12:1;::::1;;;23723:11:::0;:24:::1;:::i;:::-;23722:35;;;;:::i;:::-;23804:10;::::0;23696:61;;-1:-1:-1;23767:22:1::1;::::0;23791:33:::1;::::0;::::1;::::0;23792:22:::1;::::0;-1:-1:-1;;;23804:10:1;::::1;;;23792:11:::0;:22:::1;:::i;:::-;23791:33;;;;:::i;:::-;23767:57:::0;-1:-1:-1;23835:16:1::1;23852:19;23870:1;23852:17:::0;:19:::1;:::i;:::-;23835:36:::0;-1:-1:-1;23881:19:1::1;23901:26;23835:36:::0;23901:17;:26:::1;:::i;:::-;23881:46:::0;-1:-1:-1;23941:17:1::1;24004:16:::0;23989:14;23959:29:::1;23971:17:::0;23881:46;23959:29:::1;:::i;:::-;:44;;;;:::i;:::-;:61;;;;:::i;:::-;23941:79:::0;-1:-1:-1;24061:21:1::1;24092:27;23941:79:::0;24092:16:::1;:27::i;:::-;24129:14;24145:41;24169:17:::0;24145:21:::1;:41;:::i;:::-;24129:58:::0;-1:-1:-1;24197:14:1::1;24235:9:::0;24215:18:::1;24222:11:::0;24129:58;24215:18:::1;:::i;:::-;24214:30;;;;:::i;:::-;24197:47;;24254:31;24268:8;24278:6;24254:13;:31::i;:::-;24295:20;24317:41;24341:17:::0;24317:21:::1;:41;:::i;:::-;24295:64;;24369:32;24388:12;24369:18;:32::i;:::-;23172:1236;;;;;;;;;;;;;;23038:1;-1:-1:-1::0;23049:27:1;:35;;-1:-1:-1;;23049:35:1;;;23107:1301::o;10918:297::-;10981:4;11972:19;;;:12;;;:19;;;;;;10997:212;;-1:-1:-1;11039:23:1;;;;;;;;:11;:23;;;;;;;;;;;;;11112:18;;11090:19;;;:12;;;:19;;;;;;:40;;;;11144:11;;10997:212;-1:-1:-1;11193:5:1;11186:12;;13475:165;-1:-1:-1;;;;;13608:23:1;;13555:4;11972:19;;;:12;;;:19;;;;;;:24;;13578:55;11876:127;21275:343;-1:-1:-1;;;;;21393:17:1;;21369:21;21393:17;;;:9;:17;;;;;;21428:23;;;;21420:60;;;;-1:-1:-1;;;21420:60:1;;15284:2:4;21420:60:1;;;15266:21:4;15323:2;15303:18;;;15296:30;-1:-1:-1;;;15342:18:4;;;15335:54;15406:18;;21420:60:1;15082:348:4;21420:60:1;21493:27;21506:6;21513;21493:12;:27::i;:::-;21533:28;21543:9;21554:6;21533:9;:28::i;:::-;21593:9;-1:-1:-1;;;;;21577:33:1;21586:6;-1:-1:-1;;;;;21577:33:1;-1:-1:-1;;;;;;;;;;;21603:6:1;21577:33;;;;972:25:4;;960:2;945:18;;826:177;21577:33:1;;;;;;;;21359:259;21275:343;;;:::o;19230:2035::-;-1:-1:-1;;;;;19389:20:1;;;19362:24;19389:20;;;:9;:20;;;;;;;19443:17;;;;;;;;19478:23;;;;19470:60;;;;-1:-1:-1;;;19470:60:1;;15284:2:4;19470:60:1;;;15266:21:4;15323:2;15303:18;;;15296:30;-1:-1:-1;;;15342:18:4;;;15335:54;15406:18;;19470:60:1;15082:348:4;19470:60:1;19564:1;19554:9;;:11;;;;:::i;:::-;19542:9;:23;19576:9;19595:873;;;;19623:38;:21;19654:6;19623:30;:38::i;:::-;19619:244;;-1:-1:-1;;;;;19699:17:1;;;;;;:9;:17;;;;;;19718:15;-1:-1:-1;19699:34:1;;:52;;-1:-1:-1;19735:16:1;;;;;;;19699:52;19691:82;;;;-1:-1:-1;;;19691:82:1;;15637:2:4;19691:82:1;;;15619:21:4;15676:2;15656:18;;;15649:30;-1:-1:-1;;;15695:18:4;;;15688:48;15753:18;;19691:82:1;15435:342:4;19691:82:1;19836:12;;19820:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;19802:17:1;;;;;;:9;:17;;;;;:46;19619:244;19905:9;;19897:6;:17;;19889:44;;;;-1:-1:-1;;;19889:44:1;;15984:2:4;19889:44:1;;;15966:21:4;16023:2;16003:18;;;15996:30;-1:-1:-1;;;16042:18:4;;;16035:45;16097:18;;19889:44:1;15782:339:4;19889:44:1;-1:-1:-1;19951:8:1;;;;;;;19595:873;;;19980:5;19977:491;;;20040:12;;20015:23;20032:6;20015:16;:23;:::i;:::-;:37;;20007:65;;;;-1:-1:-1;;;20007:65:1;;;;;;;:::i;:::-;20102:8;;20094:6;:16;;20086:45;;;;-1:-1:-1;;;20086:45:1;;;;;;;:::i;:::-;-1:-1:-1;20149:7:1;;;;19977:491;;;20228:12;;20203:23;20220:6;20203:16;:23;:::i;:::-;:37;;20195:65;;;;-1:-1:-1;;;20195:65:1;;;;;;;:::i;:::-;20292:38;:21;20323:6;20292:30;:38::i;:::-;20288:138;;-1:-1:-1;;;;;20356:17:1;;;;;;:9;:17;;;;;;20375:15;-1:-1:-1;20356:34:1;;:52;;-1:-1:-1;20392:16:1;;;;;;;20356:52;20348:78;;;;-1:-1:-1;;;20348:78:1;;16673:2:4;20348:78:1;;;16655:21:4;16712:2;16692:18;;;16685:30;-1:-1:-1;;;16731:18:4;;;16724:44;16785:18;;20348:78:1;16471:338:4;20348:78:1;-1:-1:-1;20444:12:1;;;;;;;19977:491;20511:11;;20478:19;;-1:-1:-1;;;20511:11:1;;;;20508:500;;;20555:19;;-1:-1:-1;;;;;20547:27:1;;;-1:-1:-1;;;20555:19:1;;;;20547:27;;;;20546:50;;-1:-1:-1;20579:16:1;;;;20578:17;20546:50;:82;;;;-1:-1:-1;20600:27:1;;;;20599:28;20546:82;20543:125;;;20642:26;20661:6;20642:18;:26::i;:::-;20769:12;;20681:21;;20703:79;;20717:6;;20725:3;;20769:12;-1:-1:-1;;;20769:12:1;;;;;-1:-1:-1;;;20758:10:1;;;;;20730:27;;20744:13;;;;;;20730;;;;;:27;:::i;:::-;:38;;;;:::i;:::-;:51;;;;:::i;:::-;20703:13;:79::i;:::-;20681:101;-1:-1:-1;20807:22:1;20681:101;20807:6;:22;:::i;:::-;20860:4;20842:24;;;;:9;:24;;;;;:41;;20795:34;;-1:-1:-1;20870:13:1;;20842:24;;;:41;;20870:13;;20842:41;:::i;:::-;;;;-1:-1:-1;;20902:44:1;;972:25:4;;;20926:4:1;;-1:-1:-1;;;;;20902:44:1;;;-1:-1:-1;;;;;;;;;;;20902:44:1;960:2:4;945:18;20902:44:1;;;;;;;20524:433;20508:500;;;-1:-1:-1;20991:6:1;20508:500;21020:27;21033:6;21040;21020:12;:27::i;:::-;21061:33;21071:9;21082:11;21061:9;:33::i;:::-;21114:16;;:82;;-1:-1:-1;;;21114:82:1;;-1:-1:-1;;;;;17139:15:4;;;21114:82:1;;;17121:34:4;17191:15;;;17171:18;;;17164:43;17223:18;;;17216:34;;;17293:14;;17286:22;17266:18;;;17259:50;17353:14;;17346:22;17325:19;;;17318:51;17413:14;;17406:22;17385:19;;;17378:51;21114:16:1;;;;:28;;17055:19:4;;21114:82:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21228:9;-1:-1:-1;;;;;21212:38:1;21221:6;-1:-1:-1;;;;;21212:38:1;-1:-1:-1;;;;;;;;;;;21238:11:1;21212:38;;;;972:25:4;;960:2;945:18;;826:177;21212:38:1;;;;;;;;19352:1913;;;;19230:2035;;;;;;:::o;11226:639::-;11292:4;11332:19;;;:12;;;:19;;;;;;11366:15;;11362:497;;11414:21;11438:14;11451:1;11438:10;:14;:::i;:::-;11486:18;;11414:38;;-1:-1:-1;11466:17:1;;11486:22;;11507:1;;11486:22;:::i;:::-;11466:42;;11532:17;11552:3;:11;;11564:9;11552:22;;;;;;;;:::i;:::-;;;;;;;;;11532:42;;11625:9;11596:3;:11;;11608:13;11596:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;11655:23;;;:12;;;:23;;;;;;:36;;;11714:17;;11655:3;;11714:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11760:3;:12;;:19;11773:5;11760:19;;;;;;;;;;;11753:26;;;11801:4;11794:11;;;;;;;;11362:497;11843:5;11836:12;;;;;24418:425;24510:14;;24478:56;;24495:4;;-1:-1:-1;;;;;24510:14:1;24527:6;24478:8;:56::i;:::-;24568:16;;;24582:1;24568:16;;;;;;;;24544:21;;24568:16;;;;;;;;;;-1:-1:-1;24568:16:1;24544:40;;24612:4;24594;24599:1;24594:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24594:23:1;;;:7;;;;;;;;;:23;24637:4;;24627:7;;24637:4;;;24627;;24637;;24627:7;;;;;;:::i;:::-;-1:-1:-1;;;;;24627:14:1;;;:7;;;;;;;;;:14;24652;;:184;;-1:-1:-1;;;24652:184:1;;:14;;;:65;;:184;;24731:6;;24652:14;;24766:4;;24792;;24811:15;;24652:184;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24853:386;24946:9;24934:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;24997:14:1;;24965:61;;24982:4;;-1:-1:-1;;;;;24997:14:1;25014:11;24965:8;:61::i;:::-;25036:14;;:196;;-1:-1:-1;;;25036:196:1;;25106:4;25036:196;;;19162:34:4;;;19212:18;;;19205:34;;;25036:14:1;19255:18:4;;;19248:34;;;19298:18;;;19291:34;19341:19;;;19334:44;25207:15:1;19394:19:4;;;19387:35;-1:-1:-1;;;;;25036:14:1;;;;:30;;25074:9;;19096:19:4;;25036:196:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24853:386;;:::o;22488:375::-;22591:14;;22553:22;;22607:3;;22579:26;;22591:14;;22579:9;:26;:::i;:::-;22578:32;;;;:::i;:::-;22657:13;;22553:57;;-1:-1:-1;22620:21:1;;22672:3;;22645:25;;22657:13;;;;;22645:9;:25;:::i;:::-;22644:31;;;;:::i;:::-;22720:11;;22620:55;;-1:-1:-1;22685:19:1;;22733:3;;22708:23;;22720:11;;;;;22708:9;:23;:::i;:::-;22707:29;;;;:::i;:::-;22685:51;;22765:14;22747:16;;:32;;;;;;;:::i;:::-;;;;;;;;22806:13;22789:15;;:30;;;;;;;:::i;:::-;;;;;;;;22844:11;22829:13;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;22488:375:1:o;21962:155::-;-1:-1:-1;;;;;22053:15:1;;22035:17;22053:15;;;:9;:15;;;;;;:22;;22069:6;;22053:22;:::i;:::-;-1:-1:-1;;;;;22085:15:1;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;21962:155:1:o;21797:153::-;-1:-1:-1;;;;;21885:15:1;;21867:17;21885:15;;;:9;:15;;;;;;:22;;21901:6;;21885:22;:::i;21628:154::-;21718:7;21770:5;21756:10;21745:21;;21752:3;21745:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;21744:31;;;;:::i;:::-;21737:38;21628:154;-1:-1:-1;;;;21628:154:1:o;14:118:4:-;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:241;193:6;246:2;234:9;225:7;221:23;217:32;214:52;;;262:1;259;252:12;214:52;301:9;288:23;320:28;342:5;320:28;:::i;383:173::-;451:20;;-1:-1:-1;;;;;500:31:4;;490:42;;480:70;;546:1;543;536:12;480:70;383:173;;;:::o;561:260::-;629:6;637;690:2;678:9;669:7;665:23;661:32;658:52;;;706:1;703;696:12;658:52;729:29;748:9;729:29;:::i;:::-;719:39;;777:38;811:2;800:9;796:18;777:38;:::i;:::-;767:48;;561:260;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:597::-;1503:4;1532:2;1561;1550:9;1543:21;1593:6;1587:13;1636:6;1631:2;1620:9;1616:18;1609:34;1661:1;1671:140;1685:6;1682:1;1679:13;1671:140;;;1780:14;;;1776:23;;1770:30;1746:17;;;1765:2;1742:26;1735:66;1700:10;;1671:140;;;1829:6;1826:1;1823:13;1820:91;;;1899:1;1894:2;1885:6;1874:9;1870:22;1866:31;1859:42;1820:91;-1:-1:-1;1972:2:4;1951:15;-1:-1:-1;;1947:29:4;1932:45;;;;1979:2;1928:54;;1391:597;-1:-1:-1;;;1391:597:4:o;2182:254::-;2250:6;2258;2311:2;2299:9;2290:7;2286:23;2282:32;2279:52;;;2327:1;2324;2317:12;2279:52;2350:29;2369:9;2350:29;:::i;:::-;2340:39;2426:2;2411:18;;;;2398:32;;-1:-1:-1;;;2182:254:4:o;3246:328::-;3323:6;3331;3339;3392:2;3380:9;3371:7;3367:23;3363:32;3360:52;;;3408:1;3405;3398:12;3360:52;3431:29;3450:9;3431:29;:::i;:::-;3421:39;;3479:38;3513:2;3502:9;3498:18;3479:38;:::i;:::-;3469:48;;3564:2;3553:9;3549:18;3536:32;3526:42;;3246:328;;;;;:::o;3579:156::-;3645:20;;3705:4;3694:16;;3684:27;;3674:55;;3725:1;3722;3715:12;3740:606;3839:6;3847;3855;3863;3871;3879;3887;3940:3;3928:9;3919:7;3915:23;3911:33;3908:53;;;3957:1;3954;3947:12;3908:53;3980:27;3997:9;3980:27;:::i;:::-;3970:37;;4026:36;4058:2;4047:9;4043:18;4026:36;:::i;:::-;4016:46;;4081:36;4113:2;4102:9;4098:18;4081:36;:::i;:::-;4071:46;;4136:36;4168:2;4157:9;4153:18;4136:36;:::i;:::-;4126:46;;4191:37;4223:3;4212:9;4208:19;4191:37;:::i;:::-;4181:47;;4247:37;4279:3;4268:9;4264:19;4247:37;:::i;:::-;4237:47;;4303:37;4335:3;4324:9;4320:19;4303:37;:::i;:::-;4293:47;;3740:606;;;;;;;;;;:::o;4351:315::-;4416:6;4424;4477:2;4465:9;4456:7;4452:23;4448:32;4445:52;;;4493:1;4490;4483:12;4445:52;4516:29;4535:9;4516:29;:::i;:::-;4506:39;;4595:2;4584:9;4580:18;4567:32;4608:28;4630:5;4608:28;:::i;:::-;4655:5;4645:15;;;4351:315;;;;;:::o;5132:182::-;5189:6;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;5281:27;5298:9;5281:27;:::i;5319:180::-;5378:6;5431:2;5419:9;5410:7;5406:23;5402:32;5399:52;;;5447:1;5444;5437:12;5399:52;-1:-1:-1;5470:23:4;;5319:180;-1:-1:-1;5319:180:4:o;5504:272::-;5562:6;5615:2;5603:9;5594:7;5590:23;5586:32;5583:52;;;5631:1;5628;5621:12;5583:52;5670:9;5657:23;5720:6;5713:5;5709:18;5702:5;5699:29;5689:57;;5742:1;5739;5732:12;5781:248;5849:6;5857;5910:2;5898:9;5889:7;5885:23;5881:32;5878:52;;;5926:1;5923;5916:12;5878:52;-1:-1:-1;;5949:23:4;;;6019:2;6004:18;;;5991:32;;-1:-1:-1;5781:248:4:o;6267:342::-;6469:2;6451:21;;;6508:2;6488:18;;;6481:30;-1:-1:-1;;;6542:2:4;6527:18;;6520:48;6600:2;6585:18;;6267:342::o;7168:127::-;7229:10;7224:3;7220:20;7217:1;7210:31;7260:4;7257:1;7250:15;7284:4;7281:1;7274:15;7300:422;7389:1;7432:5;7389:1;7446:270;7467:7;7457:8;7454:21;7446:270;;;7526:4;7522:1;7518:6;7514:17;7508:4;7505:27;7502:53;;;7535:18;;:::i;:::-;7585:7;7575:8;7571:22;7568:55;;;7605:16;;;;7568:55;7684:22;;;;7644:15;;;;7446:270;;;7450:3;7300:422;;;;;:::o;7727:806::-;7776:5;7806:8;7796:80;;-1:-1:-1;7847:1:4;7861:5;;7796:80;7895:4;7885:76;;-1:-1:-1;7932:1:4;7946:5;;7885:76;7977:4;7995:1;7990:59;;;;8063:1;8058:130;;;;7970:218;;7990:59;8020:1;8011:10;;8034:5;;;8058:130;8095:3;8085:8;8082:17;8079:43;;;8102:18;;:::i;:::-;-1:-1:-1;;8158:1:4;8144:16;;8173:5;;7970:218;;8272:2;8262:8;8259:16;8253:3;8247:4;8244:13;8240:36;8234:2;8224:8;8221:16;8216:2;8210:4;8207:12;8203:35;8200:77;8197:159;;;-1:-1:-1;8309:19:4;;;8341:5;;8197:159;8388:34;8413:8;8407:4;8388:34;:::i;:::-;8458:6;8454:1;8450:6;8446:19;8437:7;8434:32;8431:58;;;8469:18;;:::i;:::-;8507:20;;7727:806;-1:-1:-1;;;7727:806:4:o;8538:140::-;8596:5;8625:47;8666:4;8656:8;8652:19;8646:4;8625:47;:::i;8683:168::-;8723:7;8789:1;8785;8781:6;8777:14;8774:1;8771:21;8766:1;8759:9;8752:17;8748:45;8745:71;;;8796:18;;:::i;:::-;-1:-1:-1;8836:9:4;;8683:168::o;9205:125::-;9245:4;9273:1;9270;9267:8;9264:34;;;9278:18;;:::i;:::-;-1:-1:-1;9315:9:4;;9205:125::o;9335:128::-;9375:3;9406:1;9402:6;9399:1;9396:13;9393:39;;;9412:18;;:::i;:::-;-1:-1:-1;9448:9:4;;9335:128::o;9468:204::-;9506:3;9542:4;9539:1;9535:12;9574:4;9571:1;9567:12;9609:3;9603:4;9599:14;9594:3;9591:23;9588:49;;;9617:18;;:::i;:::-;9653:13;;9468:204;-1:-1:-1;;;9468:204:4:o;10084:184::-;10154:6;10207:2;10195:9;10186:7;10182:23;10178:32;10175:52;;;10223:1;10220;10213:12;10175:52;-1:-1:-1;10246:16:4;;10084:184;-1:-1:-1;10084:184:4:o;10905:245::-;10972:6;11025:2;11013:9;11004:7;11000:23;10996:32;10993:52;;;11041:1;11038;11031:12;10993:52;11073:9;11067:16;11092:28;11114:5;11092:28;:::i;11155:217::-;11195:1;11221;11211:132;;11265:10;11260:3;11256:20;11253:1;11246:31;11300:4;11297:1;11290:15;11328:4;11325:1;11318:15;11211:132;-1:-1:-1;11357:9:4;;11155:217::o;16126:340::-;16328:2;16310:21;;;16367:2;16347:18;;;16340:30;-1:-1:-1;;;16401:2:4;16386:18;;16379:46;16457:2;16442:18;;16126:340::o;17440:127::-;17501:10;17496:3;17492:20;17489:1;17482:31;17532:4;17529:1;17522:15;17556:4;17553:1;17546:15;17572:127;17633:10;17628:3;17624:20;17621:1;17614:31;17664:4;17661:1;17654:15;17688:4;17685:1;17678:15;17836:980;18098:4;18146:3;18135:9;18131:19;18177:6;18166:9;18159:25;18203:2;18241:6;18236:2;18225:9;18221:18;18214:34;18284:3;18279:2;18268:9;18264:18;18257:31;18308:6;18343;18337:13;18374:6;18366;18359:22;18412:3;18401:9;18397:19;18390:26;;18451:2;18443:6;18439:15;18425:29;;18472:1;18482:195;18496:6;18493:1;18490:13;18482:195;;;18561:13;;-1:-1:-1;;;;;18557:39:4;18545:52;;18652:15;;;;18617:12;;;;18593:1;18511:9;18482:195;;;-1:-1:-1;;;;;;;18733:32:4;;;;18728:2;18713:18;;18706:60;-1:-1:-1;;;18797:3:4;18782:19;18775:35;18694:3;17836:980;-1:-1:-1;;;17836:980:4:o;19433:306::-;19521:6;19529;19537;19590:2;19578:9;19569:7;19565:23;19561:32;19558:52;;;19606:1;19603;19596:12;19558:52;19635:9;19629:16;19619:26;;19685:2;19674:9;19670:18;19664:25;19654:35;;19729:2;19718:9;19714:18;19708:25;19698:35;;19433:306;;;;;:::o

Swarm Source

ipfs://1849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b78
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.