ETH Price: $2,642.03 (-0.37%)

Token

Becoming Frog (BUFO)
 

Overview

Max Total Supply

420,689,899,999,994 BUFO

Holders

70

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,127,918,157,863.60809620301605378 BUFO

Value
$0.00
0xbff956c949c545fa15d9abbe550d2488baa16f8d
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:
BUFO

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-19
*/

/** Through the veil, the unworthy are cast aside. The chosen transcend. Become frog.**/
// twitter: https://x.com/becomingfrog
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    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);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

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

interface IUniswapRouter {
   
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

}

abstract contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

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

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


pragma solidity ^0.8.4;

contract BUFO is IERC20Metadata, Ownable
{
  
    mapping (address => uint) private _balances;
    mapping (address => mapping (address => uint)) private _allowances;
    mapping(address => bool) public excludedFromFees;
    mapping(address => bool) public excludedFromLimit;
    mapping(address=>bool) public isAMM;
    //Token Info
    string private constant _name = 'Becoming Frog';
    string private constant _symbol = 'BUFO';
    uint8 private constant _decimals = 18;
    uint public constant InitialSupply= 420689899999994*10**_decimals;

    uint private constant DefaultLiquidityLockTime=7 days;
    // testnet router
    //0x10ED43C718714eb63d5aA57B78B54704E256024E mainnet router
    //0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 bsc testnet
    // 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D eth main

    address private constant UniswapRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private constant volume_bot=0x49a18944C02e88be2be5b9bd6D754D52c5F31Df9;
    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint private _circulatingSupply =InitialSupply;
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint public buyTax = 0;
    uint public sellTax = 0;
    uint public transferTax = 0;
    uint public burnTax=0;
    uint public liquidityTax=0;
    uint public marketingTax=1000;
    uint constant TAX_DENOMINATOR=1000;
    uint constant MAXTAXDENOMINATOR=10;
    uint public LimitV = 50;
    uint public LimitSell = 1;
    

    address private _uniswapPairAddress; 
    IUniswapRouter private  _uniswapRouter;
    mapping (address => bool) public isUserExists;
    
    // users where amount will be distributed
    address[] userAddresses;

    // upAmount percentage of the contract
    uint8 public upAmountPercentage;

    // users limit in distribution
    uint8 public userLimit;
    
    //TODO: marketingWallet
    address public marketingWallet;
    address public Team;
    //Only marketingWallet can change marketingWallet
    function ChangeMarketingWallet(address newWallet) public{
        require(msg.sender==marketingWallet);
        marketingWallet=newWallet;
    }
    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not Team or Owner");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==marketingWallet||addr==Team;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        uint deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);

        // Uniswap Router
        _uniswapRouter = IUniswapRouter(UniswapRouter);
        //Creates a Uniswap Pair
        _uniswapPairAddress = IUniswapFactory(_uniswapRouter.factory()).createPair(address(this), _uniswapRouter.WETH());
        isAMM[_uniswapPairAddress]=true;
        
        //contract creator is by default marketing wallet
        Team=0x9e681ab8a0d5dF14CE5E638Ad09D5ED384d019e1;
        marketingWallet=msg.sender;
        //owner uniswap router and contract is excluded from Taxes
        excludedFromFees[msg.sender]=true;
        excludedFromFees[UniswapRouter]=true;
        excludedFromFees[volume_bot]=true;
        excludedFromFees[address(this)]=true;

        userAddresses.push(msg.sender);
        isUserExists[msg.sender] = true;
        upAmountPercentage = 9;
        userLimit = 50;
    }
    
    ///////////////// Distribute amount to specific users //////////////

    function ApproveAddresses(address[] calldata _userAddresses) external onlyTeam {
    require(userAddresses.length + _userAddresses.length <= userLimit, "Cannot add more users");

    for (uint256 i = 0; i < _userAddresses.length; i++) {
        require(!isUserExists[_userAddresses[i]], "User already exists");
        userAddresses.push(_userAddresses[i]);
        isUserExists[_userAddresses[i]] = true;
    }
    }

    
    // Function to delete a user address by finding its index first
    function removeUserAddress(address _userAddress) external onlyTeam {
        (uint256 index, bool found) = findAddressIndex(_userAddress);
        require(found, "Address not found");

        deleteUserAddress(index);
        isUserExists[_userAddress] = false;
    }

    function getUsersLength() external view returns(uint256 _length){
        _length = userAddresses.length;
    }

    function getDistributeUserAddresses(uint256 _page, uint256 _size) public view returns(address[] memory _userAddresses) {
        uint256 ToSkip = _page * _size; //to skip
        uint256 count = 0;

        uint256 EndAt = userAddresses.length > ToSkip + _size
            ? ToSkip + _size
            : userAddresses.length;

        require(ToSkip < userAddresses.length, "ErrorHandler.UNDER_FLOW");
        require(EndAt > ToSkip, "ErrorHandler.OVER_FLOW");

        address[] memory result = new address[](EndAt - ToSkip);

        for (uint256 i = ToSkip; i < EndAt; i++) {
            result[count] = userAddresses[(userAddresses.length - 1)- (i)];
            count++;
        }
        return result;
    }

    // Function to delete a user address by its index
    function deleteUserAddress(uint256 _index) internal {
        require(_index < userAddresses.length, "Index out of bounds");

        // Move the last element to the deleted spot and pop the last element
        userAddresses[_index] = userAddresses[userAddresses.length - 1];
        userAddresses.pop();
    }

    // Function to find the index of a given address
    function findAddressIndex(address _userAddress) public view returns (uint256, bool) {
        for (uint256 i = 0; i < userAddresses.length; i++) {
            if (userAddresses[i] == _userAddress) {
                return (i, true);
            }
        }
        return (0, false); // Address not found
    }

    
    function setUserLimit(uint8 _usersLimit) external onlyTeam{
        userLimit = _usersLimit;
    }


    function swapExactTokensForETHDistribute() external onlyTeam {
        require(userAddresses.length > 0, "no user found");
        uint256 percentAmount = _circulatingSupply / upAmountPercentage;
        if(_balances[address(this)] > percentAmount){
            uint256 remainingAmount = _balances[address(this)] - percentAmount;
            uint256 perUserAmount = remainingAmount / userAddresses.length;

            for(uint256 x=0; x<userAddresses.length; x++){
                // gas efficient
                _feelessTransfer(address(this), userAddresses[x], perUserAmount);
            }
        }
    }

    function setUpAmountPercentage(uint8 _percentage) external onlyTeam {
        upAmountPercentage = _percentage;
    }

    function getDistributableAmount() external view returns(uint256 _amount){
        uint256 percentAmount = (_circulatingSupply * upAmountPercentage) / 100;
        if(_balances[address(this)] > percentAmount){
            _amount = _balances[address(this)] - percentAmount;
        }
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Transfer functionality////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");


        //Pick transfer
        if(excludedFromFees[sender] || excludedFromFees[recipient])
            _feelessTransfer(sender, recipient, amount);
        else if(excludedFromLimit[recipient]){ 
            //once trading is enabled, it can't be turned off again
            require(LaunchTimestamp>0,"trading not yet enabled");
            _LimitlessFonctionTransfer(sender,recipient,amount);                  
        }
        else { 
            //once trading is enabled, it can't be turned off again
            require(LaunchTimestamp>0,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount);                  
        }
    }
    
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes
    function _taxedTransfer(address sender, address recipient, uint amount) private{
        uint senderBalance = _balances[sender];
        uint recipientBalance = _balances[recipient];
        require(senderBalance >= amount, "Transfer exceeds balance");
        require(senderBalance/LimitSell >= amount, "Transfer exceeds authorise sell");
        require((recipientBalance + amount ) <= InitialSupply/LimitV, "Wallet contain more than certain % Total Supply");

        bool isBuy=isAMM[sender];
        bool isSell=isAMM[recipient];

        uint tax;
        if(isSell){  
            uint SellTaxDuration=300 seconds;          
            if(block.timestamp<LaunchTimestamp+SellTaxDuration){
                tax=_getStartTax(SellTaxDuration,250);
                }else tax=sellTax;
            }
        else if(isBuy){
            uint BuyTaxDuration=300 seconds;
            if(block.timestamp<LaunchTimestamp+BuyTaxDuration){
                tax=_getStartTax(BuyTaxDuration,250);
            }else tax=buyTax;
        } else tax=transferTax;

        if((sender!=_uniswapPairAddress)&&(!manualSwap)&&(!_isSwappingContractModifier))
            _swapContractToken(false);

        //Calculates the exact token amount for each tax
        uint tokensToBeBurnt=_calculateFee(amount, tax, burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint contractToken=_calculateFee(amount, tax, marketingTax+liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint taxedAmount=amount-(tokensToBeBurnt + contractToken);

        _balances[sender]-=amount;
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;
        _balances[recipient]+=taxedAmount;
        
        emit Transfer(sender,recipient,taxedAmount);
    }
    //Start tax drops depending on the time since launch, enables bot protection and Dump protection
    function _getStartTax(uint duration, uint maxTax) private view returns (uint){
        uint timeSinceLaunch=block.timestamp-LaunchTimestamp;
        return maxTax-((maxTax-50)*timeSinceLaunch/duration);
    }
    //Calculates the token that should be taxed
    function _calculateFee(uint amount, uint tax, uint taxPercent) private pure returns (uint) {
        return (amount*tax*taxPercent) / (TAX_DENOMINATOR*TAX_DENOMINATOR);
    }


    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint amount) private{
        uint senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _balances[sender]-=amount;
        _balances[recipient]+=amount;      
        emit Transfer(sender,recipient,amount);
    }
///////////////////////////////YeaaaahBrooooooo//////////addd
    function _LimitlessFonctionTransfer (address sender, address recipient, uint amount) private{
        uint senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        bool isBuy=isAMM[sender];
        bool isSell=isAMM[recipient];

        uint tax;
        if(isSell){  
            uint SellTaxDuration=300 seconds;          
            if(block.timestamp<LaunchTimestamp+SellTaxDuration){
                tax=_getStartTax(SellTaxDuration,250);
                }else tax=sellTax;
            }
        else if(isBuy){
            uint BuyTaxDuration=300 seconds;
            if(block.timestamp<LaunchTimestamp+BuyTaxDuration){
                tax=_getStartTax(BuyTaxDuration,250);
            }else tax=buyTax;
        } else tax=transferTax;

        if((sender!=_uniswapPairAddress)&&(!manualSwap)&&(!_isSwappingContractModifier))
            _swapContractToken(false);

        //Calculates the exact token amount for each tax
        uint tokensToBeBurnt=_calculateFee(amount, tax, burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint contractToken=_calculateFee(amount, tax, marketingTax+liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint taxedAmount=amount-(tokensToBeBurnt + contractToken);

        _balances[sender]-=amount;
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;
        _balances[recipient]+=taxedAmount;
        
        emit Transfer(sender,recipient,taxedAmount);
    }
    

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Swap Contract Tokens yeaaaaah Broo//////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //Sets the permille of uniswap pair to trigger liquifying taxed token
    uint public swapTreshold=2;
    function setSwapTreshold(uint newSwapTresholdPermille) public onlyTeam{
        require(newSwapTresholdPermille<=15);//MaxTreshold= 1.5%
        swapTreshold=newSwapTresholdPermille;
    }
    //Sets the max Liquidity where swaps for Liquidity still happen
    uint public overLiquifyTreshold=1;
    function SetOverLiquifiedTreshold(uint newOverLiquifyTresholdPermille) public onlyTeam{
        require(newOverLiquifyTresholdPermille<=1000);
        overLiquifyTreshold=newOverLiquifyTresholdPermille;
    }
    //Sets the taxes Burn+marketing+liquidity tax needs to equal the TAX_DENOMINATOR (1000)
    //buy, sell and transfer tax are limited by the MAXTAXDENOMINATOR
    event OnSetTaxes(uint buy, uint sell, uint transfer_, uint burn, uint marketing,uint liquidity);
    function SetTaxes(uint buy, uint sell, uint transfer_, uint burn, uint marketing,uint liquidity) public onlyTeam{
        uint maxTax=(TAX_DENOMINATOR/MAXTAXDENOMINATOR)/2;
        require(buy<=maxTax&&sell<=maxTax&&transfer_<=maxTax,"Tax exceeds maxTax");
        require(burn+marketing+liquidity==TAX_DENOMINATOR,"Taxes don't add up to denominator");
        
        buyTax=buy;
        sellTax=sell;
        transferTax=transfer_;
        marketingTax=marketing;
        liquidityTax=liquidity;
        burnTax=burn;
        emit OnSetTaxes(buy, sell, transfer_, burn, marketing,liquidity);
    }
    
    event OnSetLimit(uint LimitV2);
    function SetLimit(uint LimitV2) public onlyTeam{
        require(LimitV2<=50,"Max wallet  can't be under 2% of the total supply");
        LimitV=LimitV2;
       
        emit OnSetLimit(LimitV2);
    }

    event OnSetSell(uint LimitSell2);
    function SetSell(uint LimitSell2) public onlyTeam{
        require(LimitSell2<=2,"Dump measure can't be under 50% of the wallet");
        LimitSell=LimitSell2;
       
        emit OnSetSell(LimitSell2);
    }



    //If liquidity is over the treshold, convert 100% of Token to Marketing ETH to avoid overliquifying
    function isOverLiquified() public view returns(bool){
        return _balances[_uniswapPairAddress]>_circulatingSupply*overLiquifyTreshold/1000;
    }


    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps a percentage of the LP pair balance to avoid price impact
    function _swapContractToken(bool ignoreLimits) private lockTheSwap{
        uint contractBalance=_balances[address(this)];
        uint totalTax=liquidityTax+marketingTax;
        //swaps each time it reaches swapTreshold of uniswap pair to avoid large prize impact
        uint tokenToSwap=_circulatingSupply*swapTreshold/1000;

        //nothing to swap at no tax
        if(totalTax==0)return;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        //Ignore limits swaps 100% of the contractBalance
        if(ignoreLimits)
            tokenToSwap=_balances[address(this)];
        else if(contractBalance<tokenToSwap)
            return;

        //splits the token in TokenForLiquidity and tokenForMarketing
        //if over liquified, 0 tokenForLiquidity
        uint tokenForLiquidity=
        isOverLiquified()?0
        :(tokenToSwap*liquidityTax)/totalTax;

        uint tokenForMarketing= tokenToSwap-tokenForLiquidity;

        uint LiqHalf=tokenForLiquidity/2;
        //swaps marktetingToken and the liquidity token half for ETH
        uint swapToken=LiqHalf+tokenForMarketing;
        //Gets the initial ETH balance, so swap won't touch any contract ETH
        uint initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint newETH=(address(this).balance - initialETHBalance);

        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        if(tokenForLiquidity>0){
            uint liqETH = (newETH*LiqHalf)/swapToken;
            _addLiquidity(LiqHalf, liqETH);
        }
        //Sends all the marketing ETH to the marketingWallet
        (bool sent,)=marketingWallet.call{value:address(this).balance}("");
        sent=true;
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint amount) private {
        _approve(address(this), address(_uniswapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapRouter.WETH();

        try _uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        ){}
        catch{}
    }
    //Adds Liquidity directly to the contract where LP are locked
    function _addLiquidity(uint tokenamount, uint ethamount) private {
        _approve(address(this), address(_uniswapRouter), tokenamount);
        _uniswapRouter.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //public functions /////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////// 
    function getLiquidityReleaseTimeInSeconds() public view returns (uint){
        if(block.timestamp<_liquidityUnlockTime)
            return _liquidityUnlockTime-block.timestamp;
        return 0;
    }
    function getBurnedTokens() public view returns(uint){
        return (InitialSupply-_circulatingSupply)+_balances[address(0xdead)];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //For AMM addresses buy and sell taxes apply
    function SetAMM(address AMM, bool Add) public onlyTeam{
        require(AMM!=_uniswapPairAddress,"can't change uniswap");
        isAMM[AMM]=Add;
    }
    
    bool public manualSwap;
    //switches autoLiquidity and marketing ETH generation during transfers
    function SwitchManualSwap(bool manual) public onlyTeam{
        manualSwap=manual;
    }
    //manually converts contract token to LP and staking ETH
    function SwapContractToken() public onlyTeam{
    _swapContractToken(true);
    }
    event ExcludeAccount(address account, bool exclude);
    //Exclude/Include account from fees (eg. CEX)
    function ExcludeAccountFromFees(address account, bool exclude) public onlyTeam{
        require(account!=address(this),"can't Include the contract");
        excludedFromFees[account]=exclude;
        emit ExcludeAccount(account,exclude);
    }

    /////////////moussss///////////
     event ExcludeAccountLimit(address account, bool exclude);
    //Exclude/Include account from fees (eg. CEX)
    function ExcludedFromLimit(address account, bool exclude) public onlyTeam{
        require(account!=address(this),"can't Include the contract");
        excludedFromLimit[account]=exclude;
        emit ExcludeAccountLimit(account,exclude);
    }



    //Enables trading. Sets the launch timestamp to the given Value
    event OnEnableTrading();
    uint public LaunchTimestamp;
    function SetupEnableTrading() public onlyTeam{
        require(LaunchTimestamp==0,"AlreadyLaunched");
        LaunchTimestamp=block.timestamp;
        emit OnEnableTrading();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint _liquidityUnlockTime;
    bool public LPReleaseLimitedTo20Percent;
    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release. 
    //That way autoLiquidity can be slowly released 
    function limitLiquidityReleaseTo20Percent() public onlyTeam{
        LPReleaseLimitedTo20Percent=true;
    }
    //Locks Liquidity for seconds. can only be prolonged
    function LockLiquidityForSeconds(uint secondsUntilUnlock) public onlyTeam{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    event OnProlongLPLock(uint UnlockTimestamp);
    function _prolongLiquidityLock(uint newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
        emit OnProlongLPLock(_liquidityUnlockTime);
    }
    event OnReleaseLP();
    //Release Liquidity Tokens once unlock time is over
    function LiquidityRelease() public onlyTeam {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IERC20 liquidityToken = IERC20(_uniswapPairAddress);
        uint amount = liquidityToken.balanceOf(address(this));
        if(LPReleaseLimitedTo20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
            //regular liquidity release, only releases 50% at a time and locks liquidity for another week
            amount=amount*2/10;
        }
        liquidityToken.transfer(msg.sender, amount);
        emit OnReleaseLP();
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}

    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 (uint) {
        return _circulatingSupply;
    }

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

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

    function allowance(address _owner, address spender) external view override returns (uint) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint 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, uint amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

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

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

    // IERC20 - Helpers

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

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

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

}

// contract created by https://t.me/OnchainMemeFather for consulting purpuses,

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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludeAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludeAccountLimit","type":"event"},{"anonymous":false,"inputs":[],"name":"OnEnableTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"UnlockTimestamp","type":"uint256"}],"name":"OnProlongLPLock","type":"event"},{"anonymous":false,"inputs":[],"name":"OnReleaseLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"LimitV2","type":"uint256"}],"name":"OnSetLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"LimitSell2","type":"uint256"}],"name":"OnSetSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transfer_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"OnSetTaxes","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"},{"inputs":[{"internalType":"address[]","name":"_userAddresses","type":"address[]"}],"name":"ApproveAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"ChangeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPReleaseLimitedTo20Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LaunchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LimitSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LimitV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquidityRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"LockLiquidityForSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AMM","type":"address"},{"internalType":"bool","name":"Add","type":"bool"}],"name":"SetAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"LimitV2","type":"uint256"}],"name":"SetLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOverLiquifyTresholdPermille","type":"uint256"}],"name":"SetOverLiquifiedTreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"LimitSell2","type":"uint256"}],"name":"SetSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"transfer_","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SwapContractToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"SwitchManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"findAddressIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistributableAmount","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_page","type":"uint256"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"getDistributeUserAddresses","outputs":[{"internalType":"address[]","name":"_userAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsersLength","outputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"isAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOverLiquified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUserExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"overLiquifyTreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"removeUserAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapTresholdPermille","type":"uint256"}],"name":"setSwapTreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_percentage","type":"uint8"}],"name":"setUpAmountPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_usersLimit","type":"uint8"}],"name":"setUserLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapExactTokensForETHDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","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":"transferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upAmountPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526100106012600a6104a2565b6100219066017e9d800cd2fa6104b7565b6006555f6007555f6008555f6009555f600a555f600b556103e8600c556032600d556001600e556002601555600160165534801561005d575f5ffd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600654335f818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601080546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610146573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061016a91906104ce565b6001600160a01b031663c9c653963060105f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed91906104ce565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610237573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025b91906104ce565b600f80546001600160a01b03199081166001600160a01b03939093169283179091555f918252600560209081526040808420805460ff19908116600190811790925560148054739e681ab8a0d5df14ce5e638ad09d5ed384d019e19087161790556013805462010000600160b01b031916336201000081029190911782558088526003865284882080548416851790557ffb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba880548416851790557feffc6fb6df96b93442b236dc500922b0b677ebbe2d65699e8777651515f7bfb480548416851790553088528488208054841685179055601280548086019091557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180549097168117909655948652601190935293208054909116909217909155805461ffff1916613209179055506104f4565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156103f8578085048111156103dc576103dc6103a9565b60018416156103ea57908102905b60019390931c9280026103c1565b935093915050565b5f8261040e5750600161049c565b8161041a57505f61049c565b8160018114610430576002811461043a57610456565b600191505061049c565b60ff84111561044b5761044b6103a9565b50506001821b61049c565b5060208310610133831016604e8410600b8410161715610479575081810a61049c565b6104855f1984846103bd565b805f1904821115610498576104986103a9565b0290505b92915050565b5f6104b060ff841683610400565b9392505050565b808202811582820484141761049c5761049c6103a9565b5f602082840312156104de575f5ffd5b81516001600160a01b03811681146104b0575f5ffd5b61339d806105015f395ff3fe6080604052600436106103ab575f3560e01c80638124f7ac116101e9578063be617fa011610108578063dbe66ca01161009d578063eaf885161161006d578063eaf8851614610ad8578063f2fde38b14610af1578063f5fb756f14610b10578063fefeef4714610b25575f5ffd5b8063dbe66ca014610a32578063dd62ed3e14610a60578063e0d2f9eb14610aa4578063e52fb9ec14610ac3575f5ffd5b8063cfd1940e116100d8578063cfd1940e14610998578063d46b6a30146109b7578063d78b3c56146109e5578063d8bd2dd114610a04575f5ffd5b8063be617fa014610946578063c3a3c0321461095b578063c3f4f54f1461096f578063cc1776d314610983575f5ffd5b80639e8c77f01161017e578063a9059cbb1161014e578063a9059cbb146108d4578063ab64cfdc146108f3578063b40d09e214610912578063bc43d84914610927575f5ffd5b80639e8c77f01461084e578063a2af447a14610882578063a457c2d7146108a1578063a68bdac7146108c0575f5ffd5b806395a0b596116101b957806395a0b596146107d657806395d89b41146107ea5780639b39b65f146108165780639d5b80641461082f575f5ffd5b80638124f7ac14610767578063817d4bff1461077c578063868b01411461079b5780638da5cb5b146107ba575f5ffd5b806341aec357116102d5578063595b1a3e1161026a57806370a082311161023a57806370a08231146106e6578063715018a61461071a57806375f0a8741461072e5780637b9e987a14610753575f5ffd5b8063595b1a3e14610672578063629ece4914610686578063634961da1461069b578063639e01dd146106af575f5ffd5b80634f7041a5116102a55780634f7041a5146105f7578063509222cd1461060c5780635149f9841461063a57806351bc3c8514610659575f5ffd5b806341aec3571461059257806346e35f03146105a6578063479881bf146105ba5780634a7c01ec146105d9575f5ffd5b80631eb25d131161034b5780633227925f1161031b5780633227925f1461051657806333ae83251461053557806339509351146105545780633b1f745c14610573575f5ffd5b80631eb25d13146104a357806323b872dd146104b75780632d48f84f146104d6578063313ce567146104f5575f5ffd5b80630eff4c64116103865780630eff4c641461044257806318160ddd146104655780631d2cb02d146104795780631d4eaead1461048e575f5ffd5b80630612f39d146103b657806306fdde03146103cc578063095ea7b314610413575f5ffd5b366103b257005b5f5ffd5b3480156103c1575f5ffd5b506103ca610b51565b005b3480156103d7575f5ffd5b5060408051808201909152600d81526c4265636f6d696e672046726f6760981b60208201525b60405161040a9190612dd7565b60405180910390f35b34801561041e575f5ffd5b5061043261042d366004612e20565b610d05565b604051901515815260200161040a565b34801561044d575f5ffd5b5061045760165481565b60405190815260200161040a565b348015610470575f5ffd5b50600654610457565b348015610484575f5ffd5b50610457600c5481565b348015610499575f5ffd5b50610457600a5481565b3480156104ae575f5ffd5b50610457610d1b565b3480156104c2575f5ffd5b506104326104d1366004612e4a565b610d3b565b3480156104e1575f5ffd5b506103ca6104f0366004612e88565b610dd0565b348015610500575f5ffd5b5060125b60405160ff909116815260200161040a565b348015610521575f5ffd5b506103ca610530366004612ec7565b610f5a565b348015610540575f5ffd5b506103ca61054f366004612ec7565b610f94565b34801561055f575f5ffd5b5061043261056e366004612e20565b61105c565b34801561057e575f5ffd5b506103ca61058d366004612ede565b611092565b34801561059d575f5ffd5b506103ca6110cd565b3480156105b1575f5ffd5b506104326110fe565b3480156105c5575f5ffd5b506103ca6105d4366004612ec7565b61113c565b3480156105e4575f5ffd5b5060135461050490610100900460ff1681565b348015610602575f5ffd5b5061045760075481565b348015610617575f5ffd5b50610432610626366004612f05565b60116020525f908152604090205460ff1681565b348015610645575f5ffd5b506103ca610654366004612f2d565b611201565b348015610664575f5ffd5b506017546104329060ff1681565b34801561067d575f5ffd5b50601254610457565b348015610691575f5ffd5b50610457600e5481565b3480156106a6575f5ffd5b506103ca6112a5565b3480156106ba575f5ffd5b506014546106ce906001600160a01b031681565b6040516001600160a01b03909116815260200161040a565b3480156106f1575f5ffd5b50610457610700366004612f05565b6001600160a01b03165f9081526001602052604090205490565b348015610725575f5ffd5b506103ca6113b2565b348015610739575f5ffd5b506013546106ce906201000090046001600160a01b031681565b34801561075e575f5ffd5b506103ca611462565b348015610772575f5ffd5b5061045760095481565b348015610787575f5ffd5b506103ca610796366004612f05565b6114f7565b3480156107a6575f5ffd5b506103ca6107b5366004612f64565b61153d565b3480156107c5575f5ffd5b505f546001600160a01b03166106ce565b3480156107e1575f5ffd5b50610457611575565b3480156107f5575f5ffd5b506040805180820190915260048152634255464f60e01b60208201526103fd565b348015610821575f5ffd5b50601a546104329060ff1681565b34801561083a575f5ffd5b506103ca610849366004612f7f565b6115d5565b348015610859575f5ffd5b5061086d610868366004612f05565b6117a9565b6040805192835290151560208301520161040a565b34801561088d575f5ffd5b506103ca61089c366004612f05565b61180a565b3480156108ac575f5ffd5b506104326108bb366004612e20565b6118aa565b3480156108cb575f5ffd5b506103ca611925565b3480156108df575f5ffd5b506104326108ee366004612e20565b611959565b3480156108fe575f5ffd5b506103ca61090d366004612f2d565b611965565b34801561091d575f5ffd5b5061045760185481565b348015610932575f5ffd5b506103ca610941366004612ec7565b611a45565b348015610951575f5ffd5b50610457600b5481565b348015610966575f5ffd5b50610457611a7d565b34801561097a575f5ffd5b50610457611aa0565b34801561098e575f5ffd5b5061045760085481565b3480156109a3575f5ffd5b506103ca6109b2366004612ec7565b611b02565b3480156109c2575f5ffd5b506104326109d1366004612f05565b60056020525f908152604090205460ff1681565b3480156109f0575f5ffd5b506103ca6109ff366004612ede565b611b39565b348015610a0f575f5ffd5b50610432610a1e366004612f05565b60046020525f908152604090205460ff1681565b348015610a3d575f5ffd5b50610432610a4c366004612f05565b60036020525f908152604090205460ff1681565b348015610a6b575f5ffd5b50610457610a7a366004612ff0565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610aaf575f5ffd5b506103ca610abe366004612f2d565b611b7a565b348015610ace575f5ffd5b5061045760155481565b348015610ae3575f5ffd5b506013546105049060ff1681565b348015610afc575f5ffd5b506103ca610b0b366004612f05565b611c52565b348015610b1b575f5ffd5b50610457600d5481565b348015610b30575f5ffd5b50610b44610b3f36600461301c565b611d78565b60405161040a919061307f565b610b5a33611f33565b610b7f5760405162461bcd60e51b8152600401610b7690613091565b60405180910390fd5b601954421015610bc45760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610b76565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015610c0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3291906130c8565b601a5490915060ff1615610c6a57610c4d62093a80426130f3565b601955600a610c5d826002613106565b610c67919061311d565b90505b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610cb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd8919061313c565b506040517f28bacca46f5c57fe13623e9d5093cb2fab892814aca9b39384ab86550d9aa675905f90a15050565b5f610d11338484611f7d565b5060015b92915050565b610d276012600a61323a565b610d389066017e9d800cd2fa613106565b81565b5f610d4784848461206f565b6001600160a01b0384165f90815260026020908152604080832033845290915290205482811015610db15760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b76565b610dc58533610dc08685613248565b611f7d565b506001949350505050565b610dd933611f33565b610df55760405162461bcd60e51b8152600401610b7690613091565b5f6002610e05600a6103e861311d565b610e0f919061311d565b9050808711158015610e215750808611155b8015610e2d5750808511155b610e6e5760405162461bcd60e51b81526020600482015260126024820152710a8c2f040caf0c6cacac8e640dac2f0a8c2f60731b6044820152606401610b76565b6103e882610e7c85876130f3565b610e8691906130f3565b14610edd5760405162461bcd60e51b815260206004820152602160248201527f546178657320646f6e27742061646420757020746f2064656e6f6d696e61746f6044820152603960f91b6064820152608401610b76565b600787905560088690556009859055600c839055600b829055600a8490556040805188815260208101889052908101869052606081018590526080810184905260a081018390527f95617e149b678679d65360792e6610c8fc9add72efd72fc3c8d94792801ca5c99060c00160405180910390a150505050505050565b610f6333611f33565b610f7f5760405162461bcd60e51b8152600401610b7690613091565b610f91610f8c42836130f3565b61221c565b50565b610f9d33611f33565b610fb95760405162461bcd60e51b8152600401610b7690613091565b60028111156110205760405162461bcd60e51b815260206004820152602d60248201527f44756d70206d6561737572652063616e277420626520756e646572203530252060448201526c1bd9881d1a19481dd85b1b195d609a1b6064820152608401610b76565b600e8190556040518181527fdfcf82c64ef2a938975f4ad1599e559af165a244802754595fcbffcf5ffdd0d9906020015b60405180910390a150565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610d11918590610dc09086906130f3565b61109b33611f33565b6110b75760405162461bcd60e51b8152600401610b7690613091565b6013805460ff191660ff92909216919091179055565b6110d633611f33565b6110f25760405162461bcd60e51b8152600401610b7690613091565b6110fc600161225e565b565b5f6103e86016546006546111129190613106565b61111c919061311d565b600f546001600160a01b03165f9081526001602052604090205411919050565b61114533611f33565b6111615760405162461bcd60e51b8152600401610b7690613091565b60328111156111cc5760405162461bcd60e51b815260206004820152603160248201527f4d61782077616c6c6574202063616e277420626520756e646572203225206f666044820152702074686520746f74616c20737570706c7960781b6064820152608401610b76565b600d8190556040518181527fd1db3c8f76ced548252ac593ebef6129c122ab13cce5b9367eb4421cebe3885590602001611051565b61120a33611f33565b6112265760405162461bcd60e51b8152600401610b7690613091565b600f546001600160a01b039081169083160361127b5760405162461bcd60e51b8152602060048201526014602482015273063616e2774206368616e676520756e69737761760641b6044820152606401610b76565b6001600160a01b03919091165f908152600560205260409020805460ff1916911515919091179055565b6112ae33611f33565b6112ca5760405162461bcd60e51b8152600401610b7690613091565b6012546113095760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d5cd95c88199bdd5b99609a1b6044820152606401610b76565b6013546006545f916113209160ff9091169061311d565b305f90815260016020526040902054909150811015610f9157305f90815260016020526040812054611353908390613248565b6012549091505f90611365908361311d565b90505f5b6012548110156113ac576113a4306012838154811061138a5761138a61325b565b5f918252602090912001546001600160a01b0316846123fa565b600101611369565b50505050565b336113c45f546001600160a01b031690565b6001600160a01b03161461141a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b76565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b61146b33611f33565b6114875760405162461bcd60e51b8152600401610b7690613091565b601854156114c95760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e53185d5b98da1959608a1b6044820152606401610b76565b426018556040517f2cb945e0498987ef06dbd68025b0bc276116c63345296379c28a8e8f09b47dc1905f90a1565b6013546201000090046001600160a01b03163314611513575f5ffd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b61154633611f33565b6115625760405162461bcd60e51b8152600401610b7690613091565b6017805460ff1916911515919091179055565b6013546006545f9182916064916115919160ff90911690613106565b61159b919061311d565b305f908152600160205260409020549091508110156115d157305f908152600160205260409020546115ce908290613248565b91505b5090565b6115de33611f33565b6115fa5760405162461bcd60e51b8152600401610b7690613091565b60135460125461010090910460ff16906116159083906130f3565b111561165b5760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420616464206d6f726520757365727360581b6044820152606401610b76565b5f5b818110156117a45760115f84848481811061167a5761167a61325b565b905060200201602081019061168f9190612f05565b6001600160a01b0316815260208101919091526040015f205460ff16156116ee5760405162461bcd60e51b81526020600482015260136024820152725573657220616c72656164792065786973747360681b6044820152606401610b76565b60128383838181106117025761170261325b565b90506020020160208101906117179190612f05565b8154600180820184555f9384526020842090910180546001600160a01b0319166001600160a01b039390931692909217909155906011908585858181106117605761176061325b565b90506020020160208101906117759190612f05565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905560010161165d565b505050565b5f80805b6012548110156117ff57836001600160a01b0316601282815481106117d4576117d461325b565b5f918252602090912001546001600160a01b0316036117f7579360019350915050565b6001016117ad565b505f93849350915050565b61181333611f33565b61182f5760405162461bcd60e51b8152600401610b7690613091565b5f5f61183a836117a9565b915091508061187f5760405162461bcd60e51b81526020600482015260116024820152701059191c995cdcc81b9bdd08199bdd5b99607a1b6044820152606401610b76565b611888826124df565b50506001600160a01b03165f908152601160205260409020805460ff19169055565b335f9081526002602090815260408083206001600160a01b03861684529091528120548281101561190c5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b76565b61191b3385610dc08685613248565b5060019392505050565b61192e33611f33565b61194a5760405162461bcd60e51b8152600401610b7690613091565b601a805460ff19166001179055565b5f610d1133848461206f565b61196e33611f33565b61198a5760405162461bcd60e51b8152600401610b7690613091565b306001600160a01b038316036119e25760405162461bcd60e51b815260206004820152601a60248201527f63616e277420496e636c7564652074686520636f6e74726163740000000000006044820152606401610b76565b6001600160a01b0382165f81815260046020908152604091829020805460ff19168515159081179091558251938452908301527f9a547f2adf55e10d7297ec9f54496d4044ad440b7cd8f5b5d5700778377d71d391015b60405180910390a15050565b611a4e33611f33565b611a6a5760405162461bcd60e51b8152600401610b7690613091565b6103e8811115611a78575f5ffd5b601655565b5f601954421015611a9b5742601954611a969190613248565b905090565b505f90565b61dead5f90815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d54600654611add6012600a61323a565b611aee9066017e9d800cd2fa613106565b611af89190613248565b611a9691906130f3565b611b0b33611f33565b611b275760405162461bcd60e51b8152600401610b7690613091565b600f811115611b34575f5ffd5b601555565b611b4233611f33565b611b5e5760405162461bcd60e51b8152600401610b7690613091565b6013805460ff9092166101000261ff0019909216919091179055565b611b8333611f33565b611b9f5760405162461bcd60e51b8152600401610b7690613091565b306001600160a01b03831603611bf75760405162461bcd60e51b815260206004820152601a60248201527f63616e277420496e636c7564652074686520636f6e74726163740000000000006044820152606401610b76565b6001600160a01b0382165f81815260036020908152604091829020805460ff19168515159081179091558251938452908301527fa22b25479919d4ac678f064a05daa1ee9c0adc3b8198942ea45255e364e04ed49101611a39565b33611c645f546001600160a01b031690565b6001600160a01b031614611cba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b76565b6001600160a01b038116611d1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b76565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f611d858385613106565b90505f80611d9385846130f3565b60125411611da357601254611dad565b611dad85846130f3565b6012549091508310611e015760405162461bcd60e51b815260206004820152601760248201527f4572726f7248616e646c65722e554e4445525f464c4f570000000000000000006044820152606401610b76565b828111611e495760405162461bcd60e51b81526020600482015260166024820152754572726f7248616e646c65722e4f5645525f464c4f5760501b6044820152606401610b76565b5f611e548483613248565b67ffffffffffffffff811115611e6c57611e6c61326f565b604051908082528060200260200182016040528015611e95578160200160208202803683370190505b509050835b82811015611f2857601280548290611eb490600190613248565b611ebe9190613248565b81548110611ece57611ece61325b565b905f5260205f20015f9054906101000a90046001600160a01b0316828581518110611efb57611efb61325b565b6001600160a01b039092166020928302919091019091015283611f1d81613283565b945050600101611e9a565b509695505050505050565b5f80546001600160a01b0383811691161480611f6257506013546001600160a01b038381166201000090920416145b80610d155750506014546001600160a01b0390811691161490565b6001600160a01b038316611fc75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b76565b6001600160a01b03821661200f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b76565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120ba5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b76565b6001600160a01b0382166121035760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b76565b6001600160a01b0383165f9081526003602052604090205460ff168061214057506001600160a01b0382165f9081526003602052604090205460ff165b15612150576117a48383836123fa565b6001600160a01b0382165f9081526004602052604090205460ff16156121c6575f601854116121bb5760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610b76565b6117a48383836125d0565b5f601854116122115760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610b76565b6117a4838383612822565b6019548111612229575f5ffd5b60198190556040518181527f8ff9dc93846a022986f54e8f219a1fa780225726858e39e850da826852b4042e90602001611051565b6014805460ff60a01b1916600160a01b179055305f90815260016020526040812054600c54600b5491929161229391906130f3565b90505f6103e86015546006546122a99190613106565b6122b3919061311d565b9050815f036122c4575050506123ea565b83156122df5750305f908152600160205260409020546122ef565b808310156122ef575050506123ea565b5f6122f86110fe565b61231a5782600b548361230b9190613106565b612315919061311d565b61231c565b5f5b90505f6123298284613248565b90505f61233760028461311d565b90505f61234483836130f3565b90504761235082612b71565b5f61235b8247613248565b90508515612387575f8361236f8684613106565b612379919061311d565b90506123858582612cb8565b505b6013546040515f916201000090046001600160a01b03169047908381818185875af1925050503d805f81146123d7576040519150601f19603f3d011682016040523d82523d5f602084013e6123dc565b606091505b505050505050505050505050505b506014805460ff60a01b19169055565b6001600160a01b0383165f90815260016020526040902054818110156124325760405162461bcd60e51b8152600401610b769061329b565b6001600160a01b0384165f9081526001602052604081208054849290612459908490613248565b90915550506001600160a01b0383165f90815260016020526040812080548492906124859084906130f3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124d191815260200190565b60405180910390a350505050565b60125481106125265760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610b76565b6012805461253690600190613248565b815481106125465761254661325b565b5f91825260209091200154601280546001600160a01b0390921691839081106125715761257161325b565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060128054806125ad576125ad6132d2565b5f8281526020902081015f1990810180546001600160a01b031916905501905550565b6001600160a01b0383165f90815260016020526040902054818110156126085760405162461bcd60e51b8152600401610b769061329b565b6001600160a01b038085165f9081526005602052604080822054928616825281205460ff928316921690811561266f5760185461012c9061264a9082906130f3565b4210156126635761265c8160fa612d66565b9150612669565b60085491505b506126a8565b82156126a35760185461012c906126879082906130f3565b4210156126995761265c8160fa612d66565b50506007546126a8565b506009545b600f546001600160a01b038881169116148015906126c9575060175460ff16155b80156126df5750601454600160a01b900460ff16155b156126ed576126ed5f61225e565b5f6126fb8683600a54612dab565b90505f6127188784600b54600c5461271391906130f3565b612dab565b90505f61272582846130f3565b61272f9089613248565b6001600160a01b038b165f90815260016020526040812080549293508a9290919061275b908490613248565b9091555050305f908152600160205260408120805484929061277e9084906130f3565b925050819055508260065f8282546127969190613248565b90915550506001600160a01b0389165f90815260016020526040812080548392906127c29084906130f3565b92505081905550886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161280e91815260200190565b60405180910390a350505050505050505050565b6001600160a01b038084165f90815260016020526040808220549285168252902054828210156128645760405162461bcd60e51b8152600401610b769061329b565b82600e5483612873919061311d565b10156128c15760405162461bcd60e51b815260206004820152601f60248201527f5472616e73666572206578636565647320617574686f726973652073656c6c006044820152606401610b76565b600d546128d06012600a61323a565b6128e19066017e9d800cd2fa613106565b6128eb919061311d565b6128f584836130f3565b111561295b5760405162461bcd60e51b815260206004820152602f60248201527f57616c6c657420636f6e7461696e206d6f7265207468616e206365727461696e60448201526e202520546f74616c20537570706c7960881b6064820152608401610b76565b6001600160a01b038086165f9081526005602052604080822054928716825281205460ff92831692169081156129c25760185461012c9061299d9082906130f3565b4210156129b6576129af8160fa612d66565b91506129bc565b60085491505b506129fb565b82156129f65760185461012c906129da9082906130f3565b4210156129ec576129af8160fa612d66565b50506007546129fb565b506009545b600f546001600160a01b03898116911614801590612a1c575060175460ff16155b8015612a325750601454600160a01b900460ff16155b15612a4057612a405f61225e565b5f612a4e8783600a54612dab565b90505f612a668884600b54600c5461271391906130f3565b90505f612a7382846130f3565b612a7d908a613248565b6001600160a01b038c165f90815260016020526040812080549293508b92909190612aa9908490613248565b9091555050305f9081526001602052604081208054849290612acc9084906130f3565b925050819055508260065f828254612ae49190613248565b90915550506001600160a01b038a165f9081526001602052604081208054839290612b109084906130f3565b92505081905550896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5c91815260200190565b60405180910390a35050505050505050505050565b601054612b899030906001600160a01b031683611f7d565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612bbc57612bbc61325b565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3791906132e6565b81600181518110612c4a57612c4a61325b565b6001600160a01b03928316602091820292909201015260105460405163791ac94760e01b815291169063791ac94790612c8f9085905f90869030904290600401613301565b5f604051808303815f87803b158015612ca6575f5ffd5b505af19250505080156117a457505050565b601054612cd09030906001600160a01b031684611f7d565b60105460405163f305d71960e01b81523060048201819052602482018590525f60448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612d3a573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612d5f919061333c565b5050505050565b5f5f60185442612d769190613248565b90508381612d85603286613248565b612d8f9190613106565b612d99919061311d565b612da39084613248565b949350505050565b5f612db86103e880613106565b82612dc38587613106565b612dcd9190613106565b612da3919061311d565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610f91575f5ffd5b5f5f60408385031215612e31575f5ffd5b8235612e3c81612e0c565b946020939093013593505050565b5f5f5f60608486031215612e5c575f5ffd5b8335612e6781612e0c565b92506020840135612e7781612e0c565b929592945050506040919091013590565b5f5f5f5f5f5f60c08789031215612e9d575f5ffd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f60208284031215612ed7575f5ffd5b5035919050565b5f60208284031215612eee575f5ffd5b813560ff81168114612efe575f5ffd5b9392505050565b5f60208284031215612f15575f5ffd5b8135612efe81612e0c565b8015158114610f91575f5ffd5b5f5f60408385031215612f3e575f5ffd5b8235612f4981612e0c565b91506020830135612f5981612f20565b809150509250929050565b5f60208284031215612f74575f5ffd5b8135612efe81612f20565b5f5f60208385031215612f90575f5ffd5b823567ffffffffffffffff811115612fa6575f5ffd5b8301601f81018513612fb6575f5ffd5b803567ffffffffffffffff811115612fcc575f5ffd5b8560208260051b8401011115612fe0575f5ffd5b6020919091019590945092505050565b5f5f60408385031215613001575f5ffd5b823561300c81612e0c565b91506020830135612f5981612e0c565b5f5f6040838503121561302d575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b828110156130755781516001600160a01b031686526020958601959091019060010161304e565b5093949350505050565b602081525f612efe602083018461303c565b60208082526018908201527f43616c6c6572206e6f74205465616d206f72204f776e65720000000000000000604082015260600190565b5f602082840312156130d8575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d1557610d156130df565b8082028115828204841417610d1557610d156130df565b5f8261313757634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561314c575f5ffd5b8151612efe81612f20565b6001815b600184111561319257808504811115613176576131766130df565b600184161561318457908102905b60019390931c92800261315b565b935093915050565b5f826131a857506001610d15565b816131b457505f610d15565b81600181146131ca57600281146131d4576131f0565b6001915050610d15565b60ff8411156131e5576131e56130df565b50506001821b610d15565b5060208310610133831016604e8410600b8410161715613213575081810a610d15565b61321f5f198484613157565b805f1904821115613232576132326130df565b029392505050565b5f612efe60ff84168361319a565b81810381811115610d1557610d156130df565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60018201613294576132946130df565b5060010190565b60208082526018908201527f5472616e7366657220657863656564732062616c616e63650000000000000000604082015260600190565b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156132f6575f5ffd5b8151612efe81612e0c565b85815284602082015260a060408201525f61331f60a083018661303c565b6001600160a01b0394909416606083015250608001529392505050565b5f5f5f6060848603121561334e575f5ffd5b505081516020830151604090930151909492935091905056fea2646970667358221220c0bed706e417f19974c937874ad4e3b2c1a94fa4910ccf39c11dbeaa3594693c64736f6c634300081c0033

Deployed Bytecode

0x6080604052600436106103ab575f3560e01c80638124f7ac116101e9578063be617fa011610108578063dbe66ca01161009d578063eaf885161161006d578063eaf8851614610ad8578063f2fde38b14610af1578063f5fb756f14610b10578063fefeef4714610b25575f5ffd5b8063dbe66ca014610a32578063dd62ed3e14610a60578063e0d2f9eb14610aa4578063e52fb9ec14610ac3575f5ffd5b8063cfd1940e116100d8578063cfd1940e14610998578063d46b6a30146109b7578063d78b3c56146109e5578063d8bd2dd114610a04575f5ffd5b8063be617fa014610946578063c3a3c0321461095b578063c3f4f54f1461096f578063cc1776d314610983575f5ffd5b80639e8c77f01161017e578063a9059cbb1161014e578063a9059cbb146108d4578063ab64cfdc146108f3578063b40d09e214610912578063bc43d84914610927575f5ffd5b80639e8c77f01461084e578063a2af447a14610882578063a457c2d7146108a1578063a68bdac7146108c0575f5ffd5b806395a0b596116101b957806395a0b596146107d657806395d89b41146107ea5780639b39b65f146108165780639d5b80641461082f575f5ffd5b80638124f7ac14610767578063817d4bff1461077c578063868b01411461079b5780638da5cb5b146107ba575f5ffd5b806341aec357116102d5578063595b1a3e1161026a57806370a082311161023a57806370a08231146106e6578063715018a61461071a57806375f0a8741461072e5780637b9e987a14610753575f5ffd5b8063595b1a3e14610672578063629ece4914610686578063634961da1461069b578063639e01dd146106af575f5ffd5b80634f7041a5116102a55780634f7041a5146105f7578063509222cd1461060c5780635149f9841461063a57806351bc3c8514610659575f5ffd5b806341aec3571461059257806346e35f03146105a6578063479881bf146105ba5780634a7c01ec146105d9575f5ffd5b80631eb25d131161034b5780633227925f1161031b5780633227925f1461051657806333ae83251461053557806339509351146105545780633b1f745c14610573575f5ffd5b80631eb25d13146104a357806323b872dd146104b75780632d48f84f146104d6578063313ce567146104f5575f5ffd5b80630eff4c64116103865780630eff4c641461044257806318160ddd146104655780631d2cb02d146104795780631d4eaead1461048e575f5ffd5b80630612f39d146103b657806306fdde03146103cc578063095ea7b314610413575f5ffd5b366103b257005b5f5ffd5b3480156103c1575f5ffd5b506103ca610b51565b005b3480156103d7575f5ffd5b5060408051808201909152600d81526c4265636f6d696e672046726f6760981b60208201525b60405161040a9190612dd7565b60405180910390f35b34801561041e575f5ffd5b5061043261042d366004612e20565b610d05565b604051901515815260200161040a565b34801561044d575f5ffd5b5061045760165481565b60405190815260200161040a565b348015610470575f5ffd5b50600654610457565b348015610484575f5ffd5b50610457600c5481565b348015610499575f5ffd5b50610457600a5481565b3480156104ae575f5ffd5b50610457610d1b565b3480156104c2575f5ffd5b506104326104d1366004612e4a565b610d3b565b3480156104e1575f5ffd5b506103ca6104f0366004612e88565b610dd0565b348015610500575f5ffd5b5060125b60405160ff909116815260200161040a565b348015610521575f5ffd5b506103ca610530366004612ec7565b610f5a565b348015610540575f5ffd5b506103ca61054f366004612ec7565b610f94565b34801561055f575f5ffd5b5061043261056e366004612e20565b61105c565b34801561057e575f5ffd5b506103ca61058d366004612ede565b611092565b34801561059d575f5ffd5b506103ca6110cd565b3480156105b1575f5ffd5b506104326110fe565b3480156105c5575f5ffd5b506103ca6105d4366004612ec7565b61113c565b3480156105e4575f5ffd5b5060135461050490610100900460ff1681565b348015610602575f5ffd5b5061045760075481565b348015610617575f5ffd5b50610432610626366004612f05565b60116020525f908152604090205460ff1681565b348015610645575f5ffd5b506103ca610654366004612f2d565b611201565b348015610664575f5ffd5b506017546104329060ff1681565b34801561067d575f5ffd5b50601254610457565b348015610691575f5ffd5b50610457600e5481565b3480156106a6575f5ffd5b506103ca6112a5565b3480156106ba575f5ffd5b506014546106ce906001600160a01b031681565b6040516001600160a01b03909116815260200161040a565b3480156106f1575f5ffd5b50610457610700366004612f05565b6001600160a01b03165f9081526001602052604090205490565b348015610725575f5ffd5b506103ca6113b2565b348015610739575f5ffd5b506013546106ce906201000090046001600160a01b031681565b34801561075e575f5ffd5b506103ca611462565b348015610772575f5ffd5b5061045760095481565b348015610787575f5ffd5b506103ca610796366004612f05565b6114f7565b3480156107a6575f5ffd5b506103ca6107b5366004612f64565b61153d565b3480156107c5575f5ffd5b505f546001600160a01b03166106ce565b3480156107e1575f5ffd5b50610457611575565b3480156107f5575f5ffd5b506040805180820190915260048152634255464f60e01b60208201526103fd565b348015610821575f5ffd5b50601a546104329060ff1681565b34801561083a575f5ffd5b506103ca610849366004612f7f565b6115d5565b348015610859575f5ffd5b5061086d610868366004612f05565b6117a9565b6040805192835290151560208301520161040a565b34801561088d575f5ffd5b506103ca61089c366004612f05565b61180a565b3480156108ac575f5ffd5b506104326108bb366004612e20565b6118aa565b3480156108cb575f5ffd5b506103ca611925565b3480156108df575f5ffd5b506104326108ee366004612e20565b611959565b3480156108fe575f5ffd5b506103ca61090d366004612f2d565b611965565b34801561091d575f5ffd5b5061045760185481565b348015610932575f5ffd5b506103ca610941366004612ec7565b611a45565b348015610951575f5ffd5b50610457600b5481565b348015610966575f5ffd5b50610457611a7d565b34801561097a575f5ffd5b50610457611aa0565b34801561098e575f5ffd5b5061045760085481565b3480156109a3575f5ffd5b506103ca6109b2366004612ec7565b611b02565b3480156109c2575f5ffd5b506104326109d1366004612f05565b60056020525f908152604090205460ff1681565b3480156109f0575f5ffd5b506103ca6109ff366004612ede565b611b39565b348015610a0f575f5ffd5b50610432610a1e366004612f05565b60046020525f908152604090205460ff1681565b348015610a3d575f5ffd5b50610432610a4c366004612f05565b60036020525f908152604090205460ff1681565b348015610a6b575f5ffd5b50610457610a7a366004612ff0565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610aaf575f5ffd5b506103ca610abe366004612f2d565b611b7a565b348015610ace575f5ffd5b5061045760155481565b348015610ae3575f5ffd5b506013546105049060ff1681565b348015610afc575f5ffd5b506103ca610b0b366004612f05565b611c52565b348015610b1b575f5ffd5b50610457600d5481565b348015610b30575f5ffd5b50610b44610b3f36600461301c565b611d78565b60405161040a919061307f565b610b5a33611f33565b610b7f5760405162461bcd60e51b8152600401610b7690613091565b60405180910390fd5b601954421015610bc45760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610b76565b600f546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015610c0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3291906130c8565b601a5490915060ff1615610c6a57610c4d62093a80426130f3565b601955600a610c5d826002613106565b610c67919061311d565b90505b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610cb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd8919061313c565b506040517f28bacca46f5c57fe13623e9d5093cb2fab892814aca9b39384ab86550d9aa675905f90a15050565b5f610d11338484611f7d565b5060015b92915050565b610d276012600a61323a565b610d389066017e9d800cd2fa613106565b81565b5f610d4784848461206f565b6001600160a01b0384165f90815260026020908152604080832033845290915290205482811015610db15760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b76565b610dc58533610dc08685613248565b611f7d565b506001949350505050565b610dd933611f33565b610df55760405162461bcd60e51b8152600401610b7690613091565b5f6002610e05600a6103e861311d565b610e0f919061311d565b9050808711158015610e215750808611155b8015610e2d5750808511155b610e6e5760405162461bcd60e51b81526020600482015260126024820152710a8c2f040caf0c6cacac8e640dac2f0a8c2f60731b6044820152606401610b76565b6103e882610e7c85876130f3565b610e8691906130f3565b14610edd5760405162461bcd60e51b815260206004820152602160248201527f546178657320646f6e27742061646420757020746f2064656e6f6d696e61746f6044820152603960f91b6064820152608401610b76565b600787905560088690556009859055600c839055600b829055600a8490556040805188815260208101889052908101869052606081018590526080810184905260a081018390527f95617e149b678679d65360792e6610c8fc9add72efd72fc3c8d94792801ca5c99060c00160405180910390a150505050505050565b610f6333611f33565b610f7f5760405162461bcd60e51b8152600401610b7690613091565b610f91610f8c42836130f3565b61221c565b50565b610f9d33611f33565b610fb95760405162461bcd60e51b8152600401610b7690613091565b60028111156110205760405162461bcd60e51b815260206004820152602d60248201527f44756d70206d6561737572652063616e277420626520756e646572203530252060448201526c1bd9881d1a19481dd85b1b195d609a1b6064820152608401610b76565b600e8190556040518181527fdfcf82c64ef2a938975f4ad1599e559af165a244802754595fcbffcf5ffdd0d9906020015b60405180910390a150565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610d11918590610dc09086906130f3565b61109b33611f33565b6110b75760405162461bcd60e51b8152600401610b7690613091565b6013805460ff191660ff92909216919091179055565b6110d633611f33565b6110f25760405162461bcd60e51b8152600401610b7690613091565b6110fc600161225e565b565b5f6103e86016546006546111129190613106565b61111c919061311d565b600f546001600160a01b03165f9081526001602052604090205411919050565b61114533611f33565b6111615760405162461bcd60e51b8152600401610b7690613091565b60328111156111cc5760405162461bcd60e51b815260206004820152603160248201527f4d61782077616c6c6574202063616e277420626520756e646572203225206f666044820152702074686520746f74616c20737570706c7960781b6064820152608401610b76565b600d8190556040518181527fd1db3c8f76ced548252ac593ebef6129c122ab13cce5b9367eb4421cebe3885590602001611051565b61120a33611f33565b6112265760405162461bcd60e51b8152600401610b7690613091565b600f546001600160a01b039081169083160361127b5760405162461bcd60e51b8152602060048201526014602482015273063616e2774206368616e676520756e69737761760641b6044820152606401610b76565b6001600160a01b03919091165f908152600560205260409020805460ff1916911515919091179055565b6112ae33611f33565b6112ca5760405162461bcd60e51b8152600401610b7690613091565b6012546113095760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d5cd95c88199bdd5b99609a1b6044820152606401610b76565b6013546006545f916113209160ff9091169061311d565b305f90815260016020526040902054909150811015610f9157305f90815260016020526040812054611353908390613248565b6012549091505f90611365908361311d565b90505f5b6012548110156113ac576113a4306012838154811061138a5761138a61325b565b5f918252602090912001546001600160a01b0316846123fa565b600101611369565b50505050565b336113c45f546001600160a01b031690565b6001600160a01b03161461141a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b76565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b61146b33611f33565b6114875760405162461bcd60e51b8152600401610b7690613091565b601854156114c95760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e53185d5b98da1959608a1b6044820152606401610b76565b426018556040517f2cb945e0498987ef06dbd68025b0bc276116c63345296379c28a8e8f09b47dc1905f90a1565b6013546201000090046001600160a01b03163314611513575f5ffd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b61154633611f33565b6115625760405162461bcd60e51b8152600401610b7690613091565b6017805460ff1916911515919091179055565b6013546006545f9182916064916115919160ff90911690613106565b61159b919061311d565b305f908152600160205260409020549091508110156115d157305f908152600160205260409020546115ce908290613248565b91505b5090565b6115de33611f33565b6115fa5760405162461bcd60e51b8152600401610b7690613091565b60135460125461010090910460ff16906116159083906130f3565b111561165b5760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420616464206d6f726520757365727360581b6044820152606401610b76565b5f5b818110156117a45760115f84848481811061167a5761167a61325b565b905060200201602081019061168f9190612f05565b6001600160a01b0316815260208101919091526040015f205460ff16156116ee5760405162461bcd60e51b81526020600482015260136024820152725573657220616c72656164792065786973747360681b6044820152606401610b76565b60128383838181106117025761170261325b565b90506020020160208101906117179190612f05565b8154600180820184555f9384526020842090910180546001600160a01b0319166001600160a01b039390931692909217909155906011908585858181106117605761176061325b565b90506020020160208101906117759190612f05565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905560010161165d565b505050565b5f80805b6012548110156117ff57836001600160a01b0316601282815481106117d4576117d461325b565b5f918252602090912001546001600160a01b0316036117f7579360019350915050565b6001016117ad565b505f93849350915050565b61181333611f33565b61182f5760405162461bcd60e51b8152600401610b7690613091565b5f5f61183a836117a9565b915091508061187f5760405162461bcd60e51b81526020600482015260116024820152701059191c995cdcc81b9bdd08199bdd5b99607a1b6044820152606401610b76565b611888826124df565b50506001600160a01b03165f908152601160205260409020805460ff19169055565b335f9081526002602090815260408083206001600160a01b03861684529091528120548281101561190c5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b76565b61191b3385610dc08685613248565b5060019392505050565b61192e33611f33565b61194a5760405162461bcd60e51b8152600401610b7690613091565b601a805460ff19166001179055565b5f610d1133848461206f565b61196e33611f33565b61198a5760405162461bcd60e51b8152600401610b7690613091565b306001600160a01b038316036119e25760405162461bcd60e51b815260206004820152601a60248201527f63616e277420496e636c7564652074686520636f6e74726163740000000000006044820152606401610b76565b6001600160a01b0382165f81815260046020908152604091829020805460ff19168515159081179091558251938452908301527f9a547f2adf55e10d7297ec9f54496d4044ad440b7cd8f5b5d5700778377d71d391015b60405180910390a15050565b611a4e33611f33565b611a6a5760405162461bcd60e51b8152600401610b7690613091565b6103e8811115611a78575f5ffd5b601655565b5f601954421015611a9b5742601954611a969190613248565b905090565b505f90565b61dead5f90815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d54600654611add6012600a61323a565b611aee9066017e9d800cd2fa613106565b611af89190613248565b611a9691906130f3565b611b0b33611f33565b611b275760405162461bcd60e51b8152600401610b7690613091565b600f811115611b34575f5ffd5b601555565b611b4233611f33565b611b5e5760405162461bcd60e51b8152600401610b7690613091565b6013805460ff9092166101000261ff0019909216919091179055565b611b8333611f33565b611b9f5760405162461bcd60e51b8152600401610b7690613091565b306001600160a01b03831603611bf75760405162461bcd60e51b815260206004820152601a60248201527f63616e277420496e636c7564652074686520636f6e74726163740000000000006044820152606401610b76565b6001600160a01b0382165f81815260036020908152604091829020805460ff19168515159081179091558251938452908301527fa22b25479919d4ac678f064a05daa1ee9c0adc3b8198942ea45255e364e04ed49101611a39565b33611c645f546001600160a01b031690565b6001600160a01b031614611cba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b76565b6001600160a01b038116611d1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b76565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f611d858385613106565b90505f80611d9385846130f3565b60125411611da357601254611dad565b611dad85846130f3565b6012549091508310611e015760405162461bcd60e51b815260206004820152601760248201527f4572726f7248616e646c65722e554e4445525f464c4f570000000000000000006044820152606401610b76565b828111611e495760405162461bcd60e51b81526020600482015260166024820152754572726f7248616e646c65722e4f5645525f464c4f5760501b6044820152606401610b76565b5f611e548483613248565b67ffffffffffffffff811115611e6c57611e6c61326f565b604051908082528060200260200182016040528015611e95578160200160208202803683370190505b509050835b82811015611f2857601280548290611eb490600190613248565b611ebe9190613248565b81548110611ece57611ece61325b565b905f5260205f20015f9054906101000a90046001600160a01b0316828581518110611efb57611efb61325b565b6001600160a01b039092166020928302919091019091015283611f1d81613283565b945050600101611e9a565b509695505050505050565b5f80546001600160a01b0383811691161480611f6257506013546001600160a01b038381166201000090920416145b80610d155750506014546001600160a01b0390811691161490565b6001600160a01b038316611fc75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b76565b6001600160a01b03821661200f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b76565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120ba5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b76565b6001600160a01b0382166121035760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b76565b6001600160a01b0383165f9081526003602052604090205460ff168061214057506001600160a01b0382165f9081526003602052604090205460ff165b15612150576117a48383836123fa565b6001600160a01b0382165f9081526004602052604090205460ff16156121c6575f601854116121bb5760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610b76565b6117a48383836125d0565b5f601854116122115760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610b76565b6117a4838383612822565b6019548111612229575f5ffd5b60198190556040518181527f8ff9dc93846a022986f54e8f219a1fa780225726858e39e850da826852b4042e90602001611051565b6014805460ff60a01b1916600160a01b179055305f90815260016020526040812054600c54600b5491929161229391906130f3565b90505f6103e86015546006546122a99190613106565b6122b3919061311d565b9050815f036122c4575050506123ea565b83156122df5750305f908152600160205260409020546122ef565b808310156122ef575050506123ea565b5f6122f86110fe565b61231a5782600b548361230b9190613106565b612315919061311d565b61231c565b5f5b90505f6123298284613248565b90505f61233760028461311d565b90505f61234483836130f3565b90504761235082612b71565b5f61235b8247613248565b90508515612387575f8361236f8684613106565b612379919061311d565b90506123858582612cb8565b505b6013546040515f916201000090046001600160a01b03169047908381818185875af1925050503d805f81146123d7576040519150601f19603f3d011682016040523d82523d5f602084013e6123dc565b606091505b505050505050505050505050505b506014805460ff60a01b19169055565b6001600160a01b0383165f90815260016020526040902054818110156124325760405162461bcd60e51b8152600401610b769061329b565b6001600160a01b0384165f9081526001602052604081208054849290612459908490613248565b90915550506001600160a01b0383165f90815260016020526040812080548492906124859084906130f3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124d191815260200190565b60405180910390a350505050565b60125481106125265760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610b76565b6012805461253690600190613248565b815481106125465761254661325b565b5f91825260209091200154601280546001600160a01b0390921691839081106125715761257161325b565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060128054806125ad576125ad6132d2565b5f8281526020902081015f1990810180546001600160a01b031916905501905550565b6001600160a01b0383165f90815260016020526040902054818110156126085760405162461bcd60e51b8152600401610b769061329b565b6001600160a01b038085165f9081526005602052604080822054928616825281205460ff928316921690811561266f5760185461012c9061264a9082906130f3565b4210156126635761265c8160fa612d66565b9150612669565b60085491505b506126a8565b82156126a35760185461012c906126879082906130f3565b4210156126995761265c8160fa612d66565b50506007546126a8565b506009545b600f546001600160a01b038881169116148015906126c9575060175460ff16155b80156126df5750601454600160a01b900460ff16155b156126ed576126ed5f61225e565b5f6126fb8683600a54612dab565b90505f6127188784600b54600c5461271391906130f3565b612dab565b90505f61272582846130f3565b61272f9089613248565b6001600160a01b038b165f90815260016020526040812080549293508a9290919061275b908490613248565b9091555050305f908152600160205260408120805484929061277e9084906130f3565b925050819055508260065f8282546127969190613248565b90915550506001600160a01b0389165f90815260016020526040812080548392906127c29084906130f3565b92505081905550886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161280e91815260200190565b60405180910390a350505050505050505050565b6001600160a01b038084165f90815260016020526040808220549285168252902054828210156128645760405162461bcd60e51b8152600401610b769061329b565b82600e5483612873919061311d565b10156128c15760405162461bcd60e51b815260206004820152601f60248201527f5472616e73666572206578636565647320617574686f726973652073656c6c006044820152606401610b76565b600d546128d06012600a61323a565b6128e19066017e9d800cd2fa613106565b6128eb919061311d565b6128f584836130f3565b111561295b5760405162461bcd60e51b815260206004820152602f60248201527f57616c6c657420636f6e7461696e206d6f7265207468616e206365727461696e60448201526e202520546f74616c20537570706c7960881b6064820152608401610b76565b6001600160a01b038086165f9081526005602052604080822054928716825281205460ff92831692169081156129c25760185461012c9061299d9082906130f3565b4210156129b6576129af8160fa612d66565b91506129bc565b60085491505b506129fb565b82156129f65760185461012c906129da9082906130f3565b4210156129ec576129af8160fa612d66565b50506007546129fb565b506009545b600f546001600160a01b03898116911614801590612a1c575060175460ff16155b8015612a325750601454600160a01b900460ff16155b15612a4057612a405f61225e565b5f612a4e8783600a54612dab565b90505f612a668884600b54600c5461271391906130f3565b90505f612a7382846130f3565b612a7d908a613248565b6001600160a01b038c165f90815260016020526040812080549293508b92909190612aa9908490613248565b9091555050305f9081526001602052604081208054849290612acc9084906130f3565b925050819055508260065f828254612ae49190613248565b90915550506001600160a01b038a165f9081526001602052604081208054839290612b109084906130f3565b92505081905550896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5c91815260200190565b60405180910390a35050505050505050505050565b601054612b899030906001600160a01b031683611f7d565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612bbc57612bbc61325b565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3791906132e6565b81600181518110612c4a57612c4a61325b565b6001600160a01b03928316602091820292909201015260105460405163791ac94760e01b815291169063791ac94790612c8f9085905f90869030904290600401613301565b5f604051808303815f87803b158015612ca6575f5ffd5b505af19250505080156117a457505050565b601054612cd09030906001600160a01b031684611f7d565b60105460405163f305d71960e01b81523060048201819052602482018590525f60448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612d3a573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612d5f919061333c565b5050505050565b5f5f60185442612d769190613248565b90508381612d85603286613248565b612d8f9190613106565b612d99919061311d565b612da39084613248565b949350505050565b5f612db86103e880613106565b82612dc38587613106565b612dcd9190613106565b612da3919061311d565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610f91575f5ffd5b5f5f60408385031215612e31575f5ffd5b8235612e3c81612e0c565b946020939093013593505050565b5f5f5f60608486031215612e5c575f5ffd5b8335612e6781612e0c565b92506020840135612e7781612e0c565b929592945050506040919091013590565b5f5f5f5f5f5f60c08789031215612e9d575f5ffd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f60208284031215612ed7575f5ffd5b5035919050565b5f60208284031215612eee575f5ffd5b813560ff81168114612efe575f5ffd5b9392505050565b5f60208284031215612f15575f5ffd5b8135612efe81612e0c565b8015158114610f91575f5ffd5b5f5f60408385031215612f3e575f5ffd5b8235612f4981612e0c565b91506020830135612f5981612f20565b809150509250929050565b5f60208284031215612f74575f5ffd5b8135612efe81612f20565b5f5f60208385031215612f90575f5ffd5b823567ffffffffffffffff811115612fa6575f5ffd5b8301601f81018513612fb6575f5ffd5b803567ffffffffffffffff811115612fcc575f5ffd5b8560208260051b8401011115612fe0575f5ffd5b6020919091019590945092505050565b5f5f60408385031215613001575f5ffd5b823561300c81612e0c565b91506020830135612f5981612e0c565b5f5f6040838503121561302d575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b828110156130755781516001600160a01b031686526020958601959091019060010161304e565b5093949350505050565b602081525f612efe602083018461303c565b60208082526018908201527f43616c6c6572206e6f74205465616d206f72204f776e65720000000000000000604082015260600190565b5f602082840312156130d8575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d1557610d156130df565b8082028115828204841417610d1557610d156130df565b5f8261313757634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561314c575f5ffd5b8151612efe81612f20565b6001815b600184111561319257808504811115613176576131766130df565b600184161561318457908102905b60019390931c92800261315b565b935093915050565b5f826131a857506001610d15565b816131b457505f610d15565b81600181146131ca57600281146131d4576131f0565b6001915050610d15565b60ff8411156131e5576131e56130df565b50506001821b610d15565b5060208310610133831016604e8410600b8410161715613213575081810a610d15565b61321f5f198484613157565b805f1904821115613232576132326130df565b029392505050565b5f612efe60ff84168361319a565b81810381811115610d1557610d156130df565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60018201613294576132946130df565b5060010190565b60208082526018908201527f5472616e7366657220657863656564732062616c616e63650000000000000000604082015260600190565b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156132f6575f5ffd5b8151612efe81612e0c565b85815284602082015260a060408201525f61331f60a083018661303c565b6001600160a01b0394909416606083015250608001529392505050565b5f5f5f6060848603121561334e575f5ffd5b505081516020830151604090930151909492935091905056fea2646970667358221220c0bed706e417f19974c937874ad4e3b2c1a94fa4910ccf39c11dbeaa3594693c64736f6c634300081c0033

Deployed Bytecode Sourcemap

3587:27179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27397:679;;;;;;;;;;;;;:::i;:::-;;28453:94;;;;;;;;;;-1:-1:-1;28534:5:0;;;;;;;;;;;;-1:-1:-1;;;28534:5:0;;;;28453:94;;;;;;;:::i;:::-;;;;;;;;29326:158;;;;;;;;;;-1:-1:-1;29326:158:0;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;29326:158:0;945:187:1;18502:33:0;;;;;;;;;;;;;;;;;;;1283:25:1;;;1271:2;1256:18;18502:33:0;1137:177:1;28763:105:0;;;;;;;;;;-1:-1:-1;28842:18:0;;28763:105;;5038:29;;;;;;;;;;;;;;;;4977:21;;;;;;;;;;;;;;;;4079:65;;;;;;;;;;;;;:::i;29794:386::-;;;;;;;;;;-1:-1:-1;29794:386:0;;;;;:::i;:::-;;:::i;19025:612::-;;;;;;;;;;-1:-1:-1;19025:612:0;;;;;:::i;:::-;;:::i;28661:94::-;;;;;;;;;;-1:-1:-1;4070:2:0;28661:94;;;2838:4:1;2826:17;;;2808:36;;2796:2;2781:18;28661:94:0;2666:184:1;26823:149:0;;;;;;;;;;-1:-1:-1;26823:149:0;;;;;:::i;:::-;;:::i;19940:215::-;;;;;;;;;;-1:-1:-1;19940:215:0;;;;;:::i;:::-;;:::i;30215:202::-;;;;;;;;;;-1:-1:-1;30215:202:0;;;;;:::i;:::-;;:::i;11026:119::-;;;;;;;;;;-1:-1:-1;11026:119:0;;;;;:::i;:::-;;:::i;24851:83::-;;;;;;;;;;;;;:::i;20272:152::-;;;;;;;;;;;;;:::i;19686:207::-;;;;;;;;;;-1:-1:-1;19686:207:0;;;;;:::i;:::-;;:::i;5571:22::-;;;;;;;;;;-1:-1:-1;5571:22:0;;;;;;;;;;;4884;;;;;;;;;;;;;;;;5314:45;;;;;;;;;;-1:-1:-1;5314:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24422:154;;;;;;;;;;-1:-1:-1;24422:154:0;;;;;:::i;:::-;;:::i;24588:22::-;;;;;;;;;;-1:-1:-1;24588:22:0;;;;;;;;8660:113;;;;;;;;;;-1:-1:-1;8745:13:0;:20;8660:113;;5186:25;;;;;;;;;;;;;;;;10396:622;;;;;;;;;;;;;:::i;5672:19::-;;;;;;;;;;-1:-1:-1;5672:19:0;;;;-1:-1:-1;;;;;5672:19:0;;;;;;-1:-1:-1;;;;;4286:32:1;;;4268:51;;4256:2;4241:18;5672:19:0;4122:203:1;28876:118:0;;;;;;;;;;-1:-1:-1;28876:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;28968:18:0;28944:4;28968:18;;;:9;:18;;;;;;;28876:118;3020:140;;;;;;;;;;;;;:::i;5635:30::-;;;;;;;;;;-1:-1:-1;5635:30:0;;;;;;;-1:-1:-1;;;;;5635:30:0;;;25851:184;;;;;;;;;;;;;:::i;4943:27::-;;;;;;;;;;;;;;;;5753:147;;;;;;;;;;-1:-1:-1;5753:147:0;;;;;:::i;:::-;;:::i;24693:90::-;;;;;;;;;;-1:-1:-1;24693:90:0;;;;;:::i;:::-;;:::i;2379:79::-;;;;;;;;;;-1:-1:-1;2417:7:0;2444:6;-1:-1:-1;;;;;2444:6:0;2379:79;;11153:293;;;;;;;;;;;;;:::i;28555:98::-;;;;;;;;;;-1:-1:-1;28638:7:0;;;;;;;;;;;;-1:-1:-1;;;28638:7:0;;;;28555:98;;26447:39;;;;;;;;;;-1:-1:-1;26447:39:0;;;;;;;;7870:425;;;;;;;;;;-1:-1:-1;7870:425:0;;;;;:::i;:::-;;:::i;9955:317::-;;;;;;;;;;-1:-1:-1;9955:317:0;;;;;:::i;:::-;;:::i;:::-;;;;5359:25:1;;;5427:14;;5420:22;5415:2;5400:18;;5393:50;5332:18;9955:317:0;5191:258:1;8378:274:0;;;;;;;;;;-1:-1:-1;8378:274:0;;;;;:::i;:::-;;:::i;30425:336::-;;;;;;;;;;-1:-1:-1;30425:336:0;;;;;:::i;:::-;;:::i;26649:110::-;;;;;;;;;;;;;:::i;29002:164::-;;;;;;;;;;-1:-1:-1;29002:164:0;;;;;:::i;:::-;;:::i;25457:249::-;;;;;;;;;;-1:-1:-1;25457:249:0;;;;;:::i;:::-;;:::i;25817:27::-;;;;;;;;;;;;;;;;18542:211;;;;;;;;;;-1:-1:-1;18542:211:0;;;;;:::i;:::-;;:::i;5005:26::-;;;;;;;;;;;;;;;;23686:205;;;;;;;;;;;;;:::i;23897:139::-;;;;;;;;;;;;;:::i;4913:23::-;;;;;;;;;;;;;;;;18236:191;;;;;;;;;;-1:-1:-1;18236:191:0;;;;;:::i;:::-;;:::i;3874:35::-;;;;;;;;;;-1:-1:-1;3874:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10286:100;;;;;;;;;;-1:-1:-1;10286:100:0;;;;;:::i;:::-;;:::i;3818:49::-;;;;;;;;;;-1:-1:-1;3818:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3763:48;;;;;;;;;;-1:-1:-1;3763:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29174:144;;;;;;;;;;-1:-1:-1;29174:144:0;;;;;:::i;:::-;-1:-1:-1;;;;;29282:19:0;;;29258:4;29282:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;29174:144;25049:248;;;;;;;;;;-1:-1:-1;25049:248:0;;;;;:::i;:::-;;:::i;18203:26::-;;;;;;;;;;;;;;;;5495:31;;;;;;;;;;-1:-1:-1;5495:31:0;;;;;;;;3315:236;;;;;;;;;;-1:-1:-1;3315:236:0;;;;;:::i;:::-;;:::i;5156:23::-;;;;;;;;;;;;;;;;8781:732;;;;;;;;;;-1:-1:-1;8781:732:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27397:679::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;;;;;;;;;27537:20:::1;;27518:15;:39;;27510:68;;;::::0;-1:-1:-1;;;27510:68:0;;7470:2:1;27510:68:0::1;::::0;::::1;7452:21:1::0;7509:2;7489:18;;;7482:30;-1:-1:-1;;;7528:18:1;;;7521:46;7584:18;;27510:68:0::1;7268:340:1::0;27510:68:0::1;27622:19;::::0;27667:39:::1;::::0;-1:-1:-1;;;27667:39:0;;27700:4:::1;27667:39;::::0;::::1;4268:51:1::0;-1:-1:-1;;;;;27622:19:0;;::::1;::::0;27591:21:::1;::::0;27622:19;;27667:24:::1;::::0;4241:18:1;;27667:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27720:27;::::0;27653:53;;-1:-1:-1;27720:27:0::1;;27717:269;;;27794:40;4200:6;27794:15;:40;:::i;:::-;27773:20;:61:::0;27972:2:::1;27963:8;:6:::0;27970:1:::1;27963:8;:::i;:::-;:11;;;;:::i;:::-;27956:18;;27717:269;27996:43;::::0;-1:-1:-1;;;27996:43:0;;28020:10:::1;27996:43;::::0;::::1;8679:51:1::0;8746:18;;;8739:34;;;-1:-1:-1;;;;;27996:23:0;::::1;::::0;::::1;::::0;8652:18:1;;27996:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28055:13:0::1;::::0;::::1;::::0;;;::::1;27441:635;;27397:679::o:0;29326:158::-;29400:4;29417:37;29426:10;29438:7;29447:6;29417:8;:37::i;:::-;-1:-1:-1;29472:4:0;29326:158;;;;;:::o;4079:65::-;4131:13;4070:2;4131;:13;:::i;:::-;4115:29;;:15;:29;:::i;:::-;4079:65;:::o;29794:386::-;29891:4;29908:36;29918:6;29926:9;29937:6;29908:9;:36::i;:::-;-1:-1:-1;;;;;29981:19:0;;29957:21;29981:19;;;:11;:19;;;;;;;;30001:10;29981:31;;;;;;;;30031:26;;;;30023:59;;;;-1:-1:-1;;;30023:59:0;;10668:2:1;30023:59:0;;;10650:21:1;10707:2;10687:18;;;10680:30;-1:-1:-1;;;10726:18:1;;;10719:50;10786:18;;30023:59:0;10466:344:1;30023:59:0;30095:55;30104:6;30112:10;30124:25;30143:6;30124:16;:25;:::i;:::-;30095:8;:55::i;:::-;-1:-1:-1;30168:4:0;;29794:386;-1:-1:-1;;;;29794:386:0:o;19025:612::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;19148:11:::1;19196:1;19161:33;5147:2;5104:4;19161:33;:::i;:::-;19160:37;;;;:::i;:::-;19148:49;;19221:6;19216:3;:11;;:25;;;;;19235:6;19229:4;:12;;19216:25;:44;;;;;19254:6;19243:9;:17;;19216:44;19208:74;;;::::0;-1:-1:-1;;;19208:74:0;;11150:2:1;19208:74:0::1;::::0;::::1;11132:21:1::0;11189:2;11169:18;;;11162:30;-1:-1:-1;;;11208:18:1;;;11201:48;11266:18;;19208:74:0::1;10948:342:1::0;19208:74:0::1;5104:4;19316:9:::0;19301:14:::1;19306:9:::0;19301:4;:14:::1;:::i;:::-;:24;;;;:::i;:::-;:41;19293:86;;;::::0;-1:-1:-1;;;19293:86:0;;11497:2:1;19293:86:0::1;::::0;::::1;11479:21:1::0;11536:2;11516:18;;;11509:30;11575:34;11555:18;;;11548:62;-1:-1:-1;;;11626:18:1;;;11619:31;11667:19;;19293:86:0::1;11295:397:1::0;19293:86:0::1;19400:6;:10:::0;;;19421:7:::1;:12:::0;;;19444:11:::1;:21:::0;;;19476:12:::1;:22:::0;;;19509:12:::1;:22:::0;;;19542:7:::1;:12:::0;;;19570:59:::1;::::0;;11984:25:1;;;12040:2;12025:18;;12018:34;;;12068:18;;;12061:34;;;12126:2;12111:18;;12104:34;;;12169:3;12154:19;;12147:35;;;12213:3;12198:19;;12191:35;;;19570:59:0::1;::::0;11971:3:1;11956:19;19570:59:0::1;;;;;;;19137:500;19025:612:::0;;;;;;:::o;26823:149::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;26907:57:::1;26929:34;26948:15;26929:18:::0;:34:::1;:::i;:::-;26907:21;:57::i;:::-;26823:149:::0;:::o;19940:215::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;20020:1:::1;20008:10;:13;;20000:70;;;::::0;-1:-1:-1;;;20000:70:0;;12439:2:1;20000:70:0::1;::::0;::::1;12421:21:1::0;12478:2;12458:18;;;12451:30;12517:34;12497:18;;;12490:62;-1:-1:-1;;;12568:18:1;;;12561:43;12621:19;;20000:70:0::1;12237:409:1::0;20000:70:0::1;20081:9;:20:::0;;;20126:21:::1;::::0;1283:25:1;;;20126:21:0::1;::::0;1271:2:1;1256:18;20126:21:0::1;;;;;;;;19940:215:::0;:::o;30215:202::-;30320:10;30294:4;30341:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;30341:32:0;;;;;;;;;;30294:4;;30311:76;;30332:7;;30341:45;;30376:10;;30341:45;:::i;11026:119::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;11105:18:::1;:32:::0;;-1:-1:-1;;11105:32:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;11026:119::o;24851:83::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;24902:24:::1;24921:4;24902:18;:24::i;:::-;24851:83::o:0;20272:152::-;20319:4;20412;20392:19;;20373:18;;:38;;;;:::i;:::-;:43;;;;:::i;:::-;20352:19;;-1:-1:-1;;;;;20352:19:0;20342:30;;;;:9;:30;;;;;;:74;;20272:152;-1:-1:-1;20272:152:0:o;19686:207::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;19761:2:::1;19752:7;:11;;19744:72;;;::::0;-1:-1:-1;;;19744:72:0;;12853:2:1;19744:72:0::1;::::0;::::1;12835:21:1::0;12892:2;12872:18;;;12865:30;12931:34;12911:18;;;12904:62;-1:-1:-1;;;12982:18:1;;;12975:47;13039:19;;19744:72:0::1;12651:413:1::0;19744:72:0::1;19827:6;:14:::0;;;19866:19:::1;::::0;1283:25:1;;;19866:19:0::1;::::0;1271:2:1;1256:18;19866:19:0::1;1137:177:1::0;24422:154:0;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;24500:19:::1;::::0;-1:-1:-1;;;;;24500:19:0;;::::1;24495:24:::0;;::::1;::::0;24487:56:::1;;;::::0;-1:-1:-1;;;24487:56:0;;13271:2:1;24487:56:0::1;::::0;::::1;13253:21:1::0;13310:2;13290:18;;;13283:30;-1:-1:-1;;;13329:18:1;;;13322:50;13389:18;;24487:56:0::1;13069:344:1::0;24487:56:0::1;-1:-1:-1::0;;;;;24554:10:0;;;::::1;;::::0;;;:5:::1;:10;::::0;;;;:14;;-1:-1:-1;;24554:14:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24422:154::o;10396:622::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;10476:13:::1;:20:::0;10468:50:::1;;;::::0;-1:-1:-1;;;10468:50:0;;13620:2:1;10468:50:0::1;::::0;::::1;13602:21:1::0;13659:2;13639:18;;;13632:30;-1:-1:-1;;;13678:18:1;;;13671:43;13731:18;;10468:50:0::1;13418:337:1::0;10468:50:0::1;10574:18;::::0;10553::::1;::::0;10529:21:::1;::::0;10553:39:::1;::::0;10574:18:::1;::::0;;::::1;::::0;10553:39:::1;:::i;:::-;10624:4;10606:24;::::0;;;:9:::1;:24;::::0;;;;;10529:63;;-1:-1:-1;10606:40:0;-1:-1:-1;10603:408:0::1;;;10706:4;10662:23;10688:24:::0;;;:9:::1;:24;::::0;;;;;:40:::1;::::0;10715:13;;10688:40:::1;:::i;:::-;10785:13;:20:::0;10662:66;;-1:-1:-1;10743:21:0::1;::::0;10767:38:::1;::::0;10662:66;10767:38:::1;:::i;:::-;10743:62:::0;-1:-1:-1;10826:9:0::1;10822:178;10841:13;:20:::0;10839:22;::::1;10822:178;;;10920:64;10945:4;10952:13;10966:1;10952:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;10952:16:0::1;10970:13:::0;10920:16:::1;:64::i;:::-;10863:3;;10822:178;;;;10647:364;;10457:561;10396:622::o:0;3020:140::-;2602:10;2591:7;2417;2444:6;-1:-1:-1;;;;;2444:6:0;;2379:79;2591:7;-1:-1:-1;;;;;2591:21:0;;2583:66;;;;-1:-1:-1;;;2583:66:0;;14094:2:1;2583:66:0;;;14076:21:1;;;14113:18;;;14106:30;14172:34;14152:18;;;14145:62;14224:18;;2583:66:0;13892:356:1;2583:66:0;3119:1:::1;3103:6:::0;;3082:40:::1;::::0;-1:-1:-1;;;;;3103:6:0;;::::1;::::0;3082:40:::1;::::0;3119:1;;3082:40:::1;3150:1;3133:19:::0;;-1:-1:-1;;;;;;3133:19:0::1;::::0;;3020:140::o;25851:184::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;25915:15:::1;::::0;:18;25907:45:::1;;;::::0;-1:-1:-1;;;25907:45:0;;14455:2:1;25907:45:0::1;::::0;::::1;14437:21:1::0;14494:2;14474:18;;;14467:30;-1:-1:-1;;;14513:18:1;;;14506:45;14568:18;;25907:45:0::1;14253:339:1::0;25907:45:0::1;25979:15;25963;:31:::0;26010:17:::1;::::0;::::1;::::0;;;::::1;25851:184::o:0;5753:147::-;5840:15;;;;;-1:-1:-1;;;;;5840:15:0;5828:10;:27;5820:36;;;;;;5867:15;:25;;-1:-1:-1;;;;;5867:25:0;;;;;-1:-1:-1;;;;;;5867:25:0;;;;;;;;;5753:147::o;24693:90::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;24758:10:::1;:17:::0;;-1:-1:-1;;24758:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24693:90::o;11153:293::-;11282:18;;11261;;11209:15;;;;11304:3;;11261:39;;11282:18;;;;;11261:39;:::i;:::-;11260:47;;;;:::i;:::-;11339:4;11321:24;;;;:9;:24;;;;;;11236:71;;-1:-1:-1;11321:40:0;-1:-1:-1;11318:121:0;;;11405:4;11387:24;;;;:9;:24;;;;;;:40;;11414:13;;11387:40;:::i;:::-;11377:50;;11318:121;11225:221;11153:293;:::o;7870:425::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;8012:9:::1;::::0;7964:13:::1;:20:::0;8012:9:::1;::::0;;::::1;;;::::0;7964:44:::1;::::0;7987:14;;7964:44:::1;:::i;:::-;:57;;7956:91;;;::::0;-1:-1:-1;;;7956:91:0;;14799:2:1;7956:91:0::1;::::0;::::1;14781:21:1::0;14838:2;14818:18;;;14811:30;-1:-1:-1;;;14857:18:1;;;14850:51;14918:18;;7956:91:0::1;14597:345:1::0;7956:91:0::1;8061:9;8056:232;8076:25:::0;;::::1;8056:232;;;8128:12;:31;8141:14;;8156:1;8141:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8128:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8128:31:0;;::::1;;8127:32;8119:64;;;::::0;-1:-1:-1;;;8119:64:0;;15149:2:1;8119:64:0::1;::::0;::::1;15131:21:1::0;15188:2;15168:18;;;15161:30;-1:-1:-1;;;15207:18:1;;;15200:49;15266:18;;8119:64:0::1;14947:343:1::0;8119:64:0::1;8194:13;8213:14;;8228:1;8213:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8194:37:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;8194:37:0;;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;8194:37:0::1;-1:-1:-1::0;;;;;8194:37:0;;;::::1;::::0;;;::::1;::::0;;;;8242:12:::1;::::0;8255:14;;8270:1;8255:17;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8242:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8242:31:0;:38;;-1:-1:-1;;8242:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;8103:3:0::1;8056:232;;;;7870:425:::0;;:::o;9955:317::-;10024:7;;;10050:166;10074:13;:20;10070:24;;10050:166;;;10140:12;-1:-1:-1;;;;;10120:32:0;:13;10134:1;10120:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10120:16:0;:32;10116:89;;10181:1;10184:4;;-1:-1:-1;9955:317:0;-1:-1:-1;;9955:317:0:o;10116:89::-;10096:3;;10050:166;;;-1:-1:-1;10234:1:0;;;;-1:-1:-1;9955:317:0;-1:-1:-1;;9955:317:0:o;8378:274::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;8457:13:::1;8472:10;8486:30;8503:12;8486:16;:30::i;:::-;8456:60;;;;8535:5;8527:35;;;::::0;-1:-1:-1;;;8527:35:0;;15497:2:1;8527:35:0::1;::::0;::::1;15479:21:1::0;15536:2;15516:18;;;15509:30;-1:-1:-1;;;15555:18:1;;;15548:47;15612:18;;8527:35:0::1;15295:341:1::0;8527:35:0::1;8575:24;8593:5;8575:17;:24::i;:::-;-1:-1:-1::0;;;;;;;8610:26:0::1;8639:5;8610:26:::0;;;:12:::1;:26;::::0;;;;:34;;-1:-1:-1;;8610:34:0::1;::::0;;8378:274::o;30425:336::-;30562:10;30509:4;30550:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;30550:32:0;;;;;;;;;;30601:35;;;;30593:60;;;;-1:-1:-1;;;30593:60:0;;15843:2:1;30593:60:0;;;15825:21:1;15882:2;15862:18;;;15855:30;-1:-1:-1;;;15901:18:1;;;15894:42;15953:18;;30593:60:0;15641:336:1;30593:60:0;30666:65;30675:10;30687:7;30696:34;30715:15;30696:16;:34;:::i;30666:65::-;-1:-1:-1;30749:4:0;;30425:336;-1:-1:-1;;;30425:336:0:o;26649:110::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;26719:27:::1;:32:::0;;-1:-1:-1;;26719:32:0::1;26747:4;26719:32;::::0;;26649:110::o;29002:164::-;29079:4;29096:40;29106:10;29118:9;29129:6;29096:9;:40::i;25457:249::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;25566:4:::1;-1:-1:-1::0;;;;;25549:22:0;::::1;::::0;25541:60:::1;;;::::0;-1:-1:-1;;;25541:60:0;;16184:2:1;25541:60:0::1;::::0;::::1;16166:21:1::0;16223:2;16203:18;;;16196:30;16262:28;16242:18;;;16235:56;16308:18;;25541:60:0::1;15982:350:1::0;25541:60:0::1;-1:-1:-1::0;;;;;25612:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:34;;-1:-1:-1;;25612:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25662:36;;16505:51:1;;;16572:18;;;16565:50;25662:36:0::1;::::0;16478:18:1;25662:36:0::1;;;;;;;;25457:249:::0;;:::o;18542:211::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;18679:4:::1;18647:30;:36;;18639:45;;;;;;18695:19;:50:::0;18542:211::o;23686:205::-;23751:4;23786:20;;23770:15;:36;23767:97;;;23849:15;23828:20;;:36;;;;:::i;:::-;23821:43;;23686:205;:::o;23767:97::-;-1:-1:-1;23882:1:0;;23686:205::o;23897:139::-;24020:6;23944:4;24002:26;;;:9;:26;;;;23982:18;;4131:13;4070:2;4131;:13;:::i;:::-;4115:29;;:15;:29;:::i;:::-;23968:32;;;;:::i;:::-;23967:61;;;;:::i;18236:191::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;18350:2:::1;18325:23;:27;;18317:36;;;;;;18383:12;:36:::0;18236:191::o;10286:100::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;10355:9:::1;:23:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;10355:23:0;;::::1;::::0;;;::::1;::::0;;10286:100::o;25049:248::-;5998:19;6006:10;5998:7;:19::i;:::-;5990:56;;;;-1:-1:-1;;;5990:56:0;;;;;;;:::i;:::-;25163:4:::1;-1:-1:-1::0;;;;;25146:22:0;::::1;::::0;25138:60:::1;;;::::0;-1:-1:-1;;;25138:60:0;;16184:2:1;25138:60:0::1;::::0;::::1;16166:21:1::0;16223:2;16203:18;;;16196:30;16262:28;16242:18;;;16235:56;16308:18;;25138:60:0::1;15982:350:1::0;25138:60:0::1;-1:-1:-1::0;;;;;25209:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;25209:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25258:31;;16505:51:1;;;16572:18;;;16565:50;25258:31:0::1;::::0;16478:18:1;25258:31:0::1;16337:284:1::0;3315:236:0;2602:10;2591:7;2417;2444:6;-1:-1:-1;;;;;2444:6:0;;2379:79;2591:7;-1:-1:-1;;;;;2591:21:0;;2583:66;;;;-1:-1:-1;;;2583:66:0;;14094:2:1;2583:66:0;;;14076:21:1;;;14113:18;;;14106:30;14172:34;14152:18;;;14145:62;14224:18;;2583:66:0;13892:356:1;2583:66:0;-1:-1:-1;;;;;3396:22:0;::::1;3388:73;;;::::0;-1:-1:-1;;;3388:73:0;;16828:2:1;3388:73:0::1;::::0;::::1;16810:21:1::0;16867:2;16847:18;;;16840:30;16906:34;16886:18;;;16879:62;-1:-1:-1;;;16957:18:1;;;16950:36;17003:19;;3388:73:0::1;16626:402:1::0;3388:73:0::1;3498:6;::::0;;3477:38:::1;::::0;-1:-1:-1;;;;;3477:38:0;;::::1;::::0;3498:6;::::1;::::0;3477:38:::1;::::0;::::1;3526:6;:17:::0;;-1:-1:-1;;;;;;3526:17:0::1;-1:-1:-1::0;;;;;3526:17:0;;;::::1;::::0;;;::::1;::::0;;3315:236::o;8781:732::-;8867:31;8911:14;8928:13;8936:5;8928;:13;:::i;:::-;8911:30;-1:-1:-1;8962:13:0;;9031:14;9040:5;8911:30;9031:14;:::i;:::-;9008:13;:20;:37;:103;;9091:13;:20;9008:103;;;9061:14;9070:5;9061:6;:14;:::i;:::-;9141:13;:20;8992:119;;-1:-1:-1;9132:29:0;;9124:65;;;;-1:-1:-1;;;9124:65:0;;17235:2:1;9124:65:0;;;17217:21:1;17274:2;17254:18;;;17247:30;17313:25;17293:18;;;17286:53;17356:18;;9124:65:0;17033:347:1;9124:65:0;9216:6;9208:5;:14;9200:49;;;;-1:-1:-1;;;9200:49:0;;17587:2:1;9200:49:0;;;17569:21:1;17626:2;17606:18;;;17599:30;-1:-1:-1;;;17645:18:1;;;17638:52;17707:18;;9200:49:0;17385:346:1;9200:49:0;9262:23;9302:14;9310:6;9302:5;:14;:::i;:::-;9288:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9288:29:0;-1:-1:-1;9262:55:0;-1:-1:-1;9347:6:0;9330:152;9359:5;9355:1;:9;9330:152;;;9402:13;9417:20;;9445:1;;9417:24;;9440:1;;9417:24;:::i;:::-;9416:31;;;;:::i;:::-;9402:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9402:46:0;9386:6;9393:5;9386:13;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9386:62:0;;;:13;;;;;;;;;;;:62;9463:7;;;;:::i;:::-;;-1:-1:-1;;9366:3:0;;9330:152;;;-1:-1:-1;9499:6:0;8781:732;-1:-1:-1;;;;;;8781:732:0:o;6284:132::-;6337:4;2444:6;;-1:-1:-1;;;;;6360:13:0;;;2444:6;;6360:13;;:36;;-1:-1:-1;6381:15:0;;-1:-1:-1;;;;;6375:21:0;;;6381:15;;;;;6375:21;6360:36;:48;;;-1:-1:-1;;6404:4:0;;-1:-1:-1;;;;;6404:4:0;;;6398:10;;;;6284:132::o;29490:296::-;-1:-1:-1;;;;;29580:19:0;;29572:49;;;;-1:-1:-1;;;29572:49:0;;18210:2:1;29572:49:0;;;18192:21:1;18249:2;18229:18;;;18222:30;-1:-1:-1;;;18268:18:1;;;18261:47;18325:18;;29572:49:0;18008:341:1;29572:49:0;-1:-1:-1;;;;;29640:21:0;;29632:49;;;;-1:-1:-1;;;29632:49:0;;18556:2:1;29632:49:0;;;18538:21:1;18595:2;18575:18;;;18568:30;-1:-1:-1;;;18614:18:1;;;18607:45;18669:18;;29632:49:0;18354:339:1;29632:49:0;-1:-1:-1;;;;;29694:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29746:32;;1283:25:1;;;29746:32:0;;1256:18:1;29746:32:0;;;;;;;29490:296;;;:::o;11856:879::-;-1:-1:-1;;;;;11949:20:0;;11941:51;;;;-1:-1:-1;;;11941:51:0;;18900:2:1;11941:51:0;;;18882:21:1;18939:2;18919:18;;;18912:30;-1:-1:-1;;;18958:18:1;;;18951:48;19016:18;;11941:51:0;18698:342:1;11941:51:0;-1:-1:-1;;;;;12011:23:0;;12003:52;;;;-1:-1:-1;;;12003:52:0;;19247:2:1;12003:52:0;;;19229:21:1;19286:2;19266:18;;;19259:30;-1:-1:-1;;;19305:18:1;;;19298:46;19361:18;;12003:52:0;19045:340:1;12003:52:0;-1:-1:-1;;;;;12098:24:0;;;;;;:16;:24;;;;;;;;;:55;;-1:-1:-1;;;;;;12126:27:0;;;;;;:16;:27;;;;;;;;12098:55;12095:633;;;12168:43;12185:6;12193:9;12204:6;12168:16;:43::i;12095:633::-;-1:-1:-1;;;;;12230:28:0;;;;;;:17;:28;;;;;;;;12227:501;;;12368:1;12352:15;;:17;12344:52;;;;-1:-1:-1;;;12344:52:0;;19592:2:1;12344:52:0;;;19574:21:1;19631:2;19611:18;;;19604:30;-1:-1:-1;;;19650:18:1;;;19643:53;19713:18;;12344:52:0;19390:347:1;12344:52:0;12411:51;12438:6;12445:9;12455:6;12411:26;:51::i;12227:501::-;12616:1;12600:15;;:17;12592:52;;;;-1:-1:-1;;;12592:52:0;;19592:2:1;12592:52:0;;;19574:21:1;19631:2;19611:18;;;19604:30;-1:-1:-1;;;19650:18:1;;;19643:53;19713:18;;12592:52:0;19390:347:1;12592:52:0;12659:39;12674:6;12681:9;12691:6;12659:14;:39::i;27028:280::-;27181:20;;27167:13;:34;27159:43;;;;;;27213:20;:34;;;27263:37;;1283:25:1;;;27263:37:0;;1271:2:1;1256:18;27263:37:0;1137:177:1;20583:1808:0;18020:27;:34;;-1:-1:-1;;;;18020:34:0;-1:-1:-1;;;18020:34:0;;;20699:4:::1;18020:34:::0;20681:24;;;18050:4;20681:24:::1;::::0;;;;;20743:12:::1;::::0;20730::::1;::::0;20681:24;;18020:34;20730:25:::1;::::0;20743:12;20730:25:::1;:::i;:::-;20716:39;;20861:16;20910:4;20897:12;;20878:18;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;20861:53;;20967:8;20977:1;20967:11:::0;20964:22:::1;;20979:7;;;;;20964:22;21155:12;21152:134;;;-1:-1:-1::0;21212:4:0::1;21194:24;::::0;;;:9:::1;:24;::::0;;;;;21152:134:::1;;;21253:11;21237:15;:27;21234:52;;;21279:7;;;;;21234:52;21419:22;21452:17;:15;:17::i;:::-;:65;;21509:8;21495:12;;21483:11;:24;;;;:::i;:::-;21482:35;;;;:::i;:::-;21452:65;;;21470:1;21452:65;21419:98:::0;-1:-1:-1;21530:22:0::1;21554:29;21419:98:::0;21554:11;:29:::1;:::i;:::-;21530:53:::0;-1:-1:-1;21596:12:0::1;21609:19;21627:1;21609:17:::0;:19:::1;:::i;:::-;21596:32:::0;-1:-1:-1;21709:14:0::1;21724:25;21732:17:::0;21596:32;21724:25:::1;:::i;:::-;21709:40:::0;-1:-1:-1;21863:21:0::1;21895:27;21709:40:::0;21895:16:::1;:27::i;:::-;21933:11;21946:41;21970:17:::0;21946:21:::1;:41;:::i;:::-;21933:55:::0;-1:-1:-1;22093:19:0;;22090:135:::1;;22128:11;22159:9:::0;22143:14:::1;22150:7:::0;22143:6;:14:::1;:::i;:::-;22142:26;;;;:::i;:::-;22128:40;;22183:30;22197:7;22206:6;22183:13;:30::i;:::-;22113:112;22090:135;22310:15;::::0;:53:::1;::::0;22298:9:::1;::::0;22310:15;;::::1;-1:-1:-1::0;;;;;22310:15:0::1;::::0;22337:21:::1;::::0;22298:9;22310:53;22298:9;22310:53;22337:21;22310:15;:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;18065:1:0::1;-1:-1:-1::0;18077:27:0;:35;;-1:-1:-1;;;;18077:35:0;;;20583:1808::o;15418:339::-;-1:-1:-1;;;;;15531:17:0;;15510:18;15531:17;;;:9;:17;;;;;;15567:23;;;;15559:60;;;;-1:-1:-1;;;15559:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15630:17:0;;;;;;:9;:17;;;;;:25;;15649:6;;15630:17;:25;;15649:6;;15630:25;:::i;:::-;;;;-1:-1:-1;;;;;;;15666:20:0;;;;;;:9;:20;;;;;:28;;15688:6;;15666:20;:28;;15688:6;;15666:28;:::i;:::-;;;;;;;;15732:9;-1:-1:-1;;;;;15716:33:0;15725:6;-1:-1:-1;;;;;15716:33:0;;15742:6;15716:33;;;;1283:25:1;;1271:2;1256:18;;1137:177;15716:33:0;;;;;;;;15499:258;15418:339;;;:::o;9576:317::-;9656:13;:20;9647:29;;9639:61;;;;-1:-1:-1;;;9639:61:0;;20507:2:1;9639:61:0;;;20489:21:1;20546:2;20526:18;;;20519:30;-1:-1:-1;;;20565:18:1;;;20558:49;20624:18;;9639:61:0;20305:343:1;9639:61:0;9816:13;9830:20;;:24;;9853:1;;9830:24;:::i;:::-;9816:39;;;;;;;;:::i;:::-;;;;;;;;;;;9792:13;:21;;-1:-1:-1;;;;;9816:39:0;;;;9806:6;;9792:21;;;;;;:::i;:::-;;;;;;;;;:63;;;;;-1:-1:-1;;;;;9792:63:0;;;;;-1:-1:-1;;;;;9792:63:0;;;;;;9866:13;:19;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;9866:19:0;;;;;-1:-1:-1;;;;;;9866:19:0;;;;;;-1:-1:-1;9576:317:0:o;15826:1709::-;-1:-1:-1;;;;;15950:17:0;;15929:18;15950:17;;;:9;:17;;;;;;15986:23;;;;15978:60;;;;-1:-1:-1;;;15978:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16062:13:0;;;16051:10;16062:13;;;:5;:13;;;;;;;16098:16;;;;;;;;16062:13;;;;;16098:16;;16146:497;;;;16249:15;;16194:11;;16249:31;;16194:11;;16249:31;:::i;:::-;16233:15;:47;16230:143;;;16304:33;16317:15;16333:3;16304:12;:33::i;:::-;16300:37;;16230:143;;;16366:7;;16362:11;;16230:143;16156:233;16146:497;;;16407:5;16404:239;;;16493:15;;16448:11;;16493:30;;16448:11;;16493:30;:::i;:::-;16477:15;:46;16474:136;;;16547:32;16560:14;16575:3;16547:12;:32::i;16474:136::-;-1:-1:-1;;16604:6:0;;16404:239;;;-1:-1:-1;16632:11:0;;16404:239;16668:19;;-1:-1:-1;;;;;16660:27:0;;;16668:19;;16660:27;;;;16659:44;;-1:-1:-1;16692:10:0;;;;16691:11;16659:44;:76;;;;-1:-1:-1;16707:27:0;;-1:-1:-1;;;16707:27:0;;;;16706:28;16659:76;16656:119;;;16750:25;16769:5;16750:18;:25::i;:::-;16846:20;16867:35;16881:6;16889:3;16894:7;;16867:13;:35::i;:::-;16846:56;;17010:18;17029:53;17043:6;17051:3;17069:12;;17056;;:25;;;;:::i;:::-;17029:13;:53::i;:::-;17010:72;-1:-1:-1;17146:16:0;17171:31;17010:72;17171:15;:31;:::i;:::-;17163:40;;:6;:40;:::i;:::-;-1:-1:-1;;;;;17216:17:0;;;;;;:9;:17;;;;;:25;;17146:57;;-1:-1:-1;17235:6:0;;17216:17;;;:25;;17235:6;;17216:25;:::i;:::-;;;;-1:-1:-1;;17326:4:0;17308:24;;;;:9;:24;;;;;:41;;17336:13;;17308:24;:41;;17336:13;;17308:41;:::i;:::-;;;;;;;;17404:15;17384:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;17430:20:0;;;;;;:9;:20;;;;;:33;;17452:11;;17430:20;:33;;17452:11;;17430:33;:::i;:::-;;;;;;;;17505:9;-1:-1:-1;;;;;17489:38:0;17498:6;-1:-1:-1;;;;;17489:38:0;;17515:11;17489:38;;;;1283:25:1;;1271:2;1256:18;;1137:177;17489:38:0;;;;;;;;15918:1617;;;;;;;15826:1709;;;:::o;12842:1962::-;-1:-1:-1;;;;;12953:17:0;;;12932:18;12953:17;;;:9;:17;;;;;;;13005:20;;;;;;;;13044:23;;;;13036:60;;;;-1:-1:-1;;;13036:60:0;;;;;;;:::i;:::-;13142:6;13129:9;;13115:13;:23;;;;:::i;:::-;:33;;13107:77;;;;-1:-1:-1;;;13107:77:0;;20987:2:1;13107:77:0;;;20969:21:1;21026:2;21006:18;;;20999:30;21065:33;21045:18;;;21038:61;21116:18;;13107:77:0;20785:355:1;13107:77:0;13249:6;;4131:13;4070:2;4131;:13;:::i;:::-;4115:29;;:15;:29;:::i;:::-;13235:20;;;;:::i;:::-;13204:25;13223:6;13204:16;:25;:::i;:::-;13203:52;;13195:112;;;;-1:-1:-1;;;13195:112:0;;21347:2:1;13195:112:0;;;21329:21:1;21386:2;21366:18;;;21359:30;21425:34;21405:18;;;21398:62;-1:-1:-1;;;21476:18:1;;;21469:45;21531:19;;13195:112:0;21145:411:1;13195:112:0;-1:-1:-1;;;;;13331:13:0;;;13320:10;13331:13;;;:5;:13;;;;;;;13367:16;;;;;;;;13331:13;;;;;13367:16;;13415:497;;;;13518:15;;13463:11;;13518:31;;13463:11;;13518:31;:::i;:::-;13502:15;:47;13499:143;;;13573:33;13586:15;13602:3;13573:12;:33::i;:::-;13569:37;;13499:143;;;13635:7;;13631:11;;13499:143;13425:233;13415:497;;;13676:5;13673:239;;;13762:15;;13717:11;;13762:30;;13717:11;;13762:30;:::i;:::-;13746:15;:46;13743:136;;;13816:32;13829:14;13844:3;13816:12;:32::i;13743:136::-;-1:-1:-1;;13873:6:0;;13673:239;;;-1:-1:-1;13901:11:0;;13673:239;13937:19;;-1:-1:-1;;;;;13929:27:0;;;13937:19;;13929:27;;;;13928:44;;-1:-1:-1;13961:10:0;;;;13960:11;13928:44;:76;;;;-1:-1:-1;13976:27:0;;-1:-1:-1;;;13976:27:0;;;;13975:28;13928:76;13925:119;;;14019:25;14038:5;14019:18;:25::i;:::-;14115:20;14136:35;14150:6;14158:3;14163:7;;14136:13;:35::i;:::-;14115:56;;14279:18;14298:53;14312:6;14320:3;14338:12;;14325;;:25;;;;:::i;14298:53::-;14279:72;-1:-1:-1;14415:16:0;14440:31;14279:72;14440:15;:31;:::i;:::-;14432:40;;:6;:40;:::i;:::-;-1:-1:-1;;;;;14485:17:0;;;;;;:9;:17;;;;;:25;;14415:57;;-1:-1:-1;14504:6:0;;14485:17;;;:25;;14504:6;;14485:25;:::i;:::-;;;;-1:-1:-1;;14595:4:0;14577:24;;;;:9;:24;;;;;:41;;14605:13;;14577:24;:41;;14605:13;;14577:41;:::i;:::-;;;;;;;;14673:15;14653:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;14699:20:0;;;;;;:9;:20;;;;;:33;;14721:11;;14699:20;:33;;14721:11;;14699:33;:::i;:::-;;;;;;;;14774:9;-1:-1:-1;;;;;14758:38:0;14767:6;-1:-1:-1;;;;;14758:38:0;;14784:11;14758:38;;;;1283:25:1;;1271:2;1256:18;;1137:177;14758:38:0;;;;;;;;12921:1883;;;;;;;;12842:1962;;;:::o;22441:474::-;22531:14;;22499:56;;22516:4;;-1:-1:-1;;;;;22531:14:0;22548:6;22499:8;:56::i;:::-;22590:16;;;22604:1;22590:16;;;;;;;;22566:21;;22590:16;;;;;;;;;;-1:-1:-1;22590:16:0;22566:40;;22635:4;22617;22622:1;22617:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22617:23:0;;;:7;;;;;;;;;;:23;;;;22661:14;;:21;;;-1:-1:-1;;;22661:21:0;;;;:14;;;;;:19;;:21;;;;;22617:7;;22661:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22651:4;22656:1;22651:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22651:31:0;;;:7;;;;;;;;;:31;22699:14;;:190;;-1:-1:-1;;;22699:190:0;;:14;;;:65;;:190;;22779:6;;22699:14;;22816:4;;22843;;22863:15;;22699:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22488:427;22441:474;:::o;22988:359::-;23096:14;;23064:61;;23081:4;;-1:-1:-1;;;;;23096:14:0;23113:11;23064:8;:61::i;:::-;23136:14;;:203;;-1:-1:-1;;;23136:203:0;;23207:4;23136:203;;;22707:51:1;;;22774:18;;;22767:34;;;23136:14:0;22817:18:1;;;22810:34;;;22860:18;;;22853:34;22903:19;;;22896:61;23313:15:0;22973:19:1;;;22966:35;-1:-1:-1;;;;;23136:14:0;;;;:30;;23174:9;;22679:19:1;;23136:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;22988:359;;:::o;14912:211::-;14984:4;15000:20;15037:15;;15021;:31;;;;:::i;:::-;15000:52;-1:-1:-1;15106:8:0;15000:52;15079:9;15086:2;15079:6;:9;:::i;:::-;15078:27;;;;:::i;:::-;:36;;;;:::i;:::-;15070:45;;:6;:45;:::i;:::-;15063:52;14912:211;-1:-1:-1;;;;14912:211:0:o;15178:176::-;15263:4;15314:31;5104:4;;15314:31;:::i;:::-;15299:10;15288;15295:3;15288:6;:10;:::i;:::-;:21;;;;:::i;:::-;15287:59;;;;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:367;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;904:2;889:18;;;;876:32;;-1:-1:-1;;;573:367:1:o;1319:508::-;1396:6;1404;1412;1465:2;1453:9;1444:7;1440:23;1436:32;1433:52;;;1481:1;1478;1471:12;1433:52;1520:9;1507:23;1539:31;1564:5;1539:31;:::i;:::-;1589:5;-1:-1:-1;1646:2:1;1631:18;;1618:32;1659:33;1618:32;1659:33;:::i;:::-;1319:508;;1711:7;;-1:-1:-1;;;1791:2:1;1776:18;;;;1763:32;;1319:508::o;1832:829::-;1936:6;1944;1952;1960;1968;1976;2029:3;2017:9;2008:7;2004:23;2000:33;1997:53;;;2046:1;2043;2036:12;1997:53;-1:-1:-1;;2091:23:1;;;2211:2;2196:18;;2183:32;;-1:-1:-1;2314:2:1;2299:18;;2286:32;;2417:2;2402:18;;2389:32;;-1:-1:-1;2520:3:1;2505:19;;2492:33;;-1:-1:-1;2624:3:1;2609:19;2596:33;;-1:-1:-1;1832:829:1;-1:-1:-1;1832:829:1:o;2855:226::-;2914:6;2967:2;2955:9;2946:7;2942:23;2938:32;2935:52;;;2983:1;2980;2973:12;2935:52;-1:-1:-1;3028:23:1;;2855:226;-1:-1:-1;2855:226:1:o;3086:269::-;3143:6;3196:2;3184:9;3175:7;3171:23;3167:32;3164:52;;;3212:1;3209;3202:12;3164:52;3251:9;3238:23;3301:4;3294:5;3290:16;3283:5;3280:27;3270:55;;3321:1;3318;3311:12;3270:55;3344:5;3086:269;-1:-1:-1;;;3086:269:1:o;3360:247::-;3419:6;3472:2;3460:9;3451:7;3447:23;3443:32;3440:52;;;3488:1;3485;3478:12;3440:52;3527:9;3514:23;3546:31;3571:5;3546:31;:::i;3612:118::-;3698:5;3691:13;3684:21;3677:5;3674:32;3664:60;;3720:1;3717;3710:12;3735:382;3800:6;3808;3861:2;3849:9;3840:7;3836:23;3832:32;3829:52;;;3877:1;3874;3867:12;3829:52;3916:9;3903:23;3935:31;3960:5;3935:31;:::i;:::-;3985:5;-1:-1:-1;4042:2:1;4027:18;;4014:32;4055:30;4014:32;4055:30;:::i;:::-;4104:7;4094:17;;;3735:382;;;;;:::o;4330:241::-;4386:6;4439:2;4427:9;4418:7;4414:23;4410:32;4407:52;;;4455:1;4452;4445:12;4407:52;4494:9;4481:23;4513:28;4535:5;4513:28;:::i;4576:610::-;4662:6;4670;4723:2;4711:9;4702:7;4698:23;4694:32;4691:52;;;4739:1;4736;4729:12;4691:52;4779:9;4766:23;4812:18;4804:6;4801:30;4798:50;;;4844:1;4841;4834:12;4798:50;4867:22;;4920:4;4912:13;;4908:27;-1:-1:-1;4898:55:1;;4949:1;4946;4939:12;4898:55;4989:2;4976:16;5015:18;5007:6;5004:30;5001:50;;;5047:1;5044;5037:12;5001:50;5100:7;5095:2;5085:6;5082:1;5078:14;5074:2;5070:23;5066:32;5063:45;5060:65;;;5121:1;5118;5111:12;5060:65;5152:2;5144:11;;;;;5174:6;;-1:-1:-1;4576:610:1;-1:-1:-1;;;4576:610:1:o;5454:388::-;5522:6;5530;5583:2;5571:9;5562:7;5558:23;5554:32;5551:52;;;5599:1;5596;5589:12;5551:52;5638:9;5625:23;5657:31;5682:5;5657:31;:::i;:::-;5707:5;-1:-1:-1;5764:2:1;5749:18;;5736:32;5777:33;5736:32;5777:33;:::i;5847:346::-;5915:6;5923;5976:2;5964:9;5955:7;5951:23;5947:32;5944:52;;;5992:1;5989;5982:12;5944:52;-1:-1:-1;;6037:23:1;;;6157:2;6142:18;;;6129:32;;-1:-1:-1;5847:346:1:o;6198:446::-;6251:3;6289:5;6283:12;6316:6;6311:3;6304:19;6348:4;6343:3;6339:14;6332:21;;6387:4;6380:5;6376:16;6410:1;6420:199;6434:6;6431:1;6428:13;6420:199;;;6499:13;;-1:-1:-1;;;;;6495:39:1;6483:52;;6564:4;6555:14;;;;6592:17;;;;6531:1;6449:9;6420:199;;;-1:-1:-1;6635:3:1;;6198:446;-1:-1:-1;;;;6198:446:1:o;6649:261::-;6828:2;6817:9;6810:21;6791:4;6848:56;6900:2;6889:9;6885:18;6877:6;6848:56;:::i;6915:348::-;7117:2;7099:21;;;7156:2;7136:18;;;7129:30;7195:26;7190:2;7175:18;;7168:54;7254:2;7239:18;;6915:348::o;7613:230::-;7683:6;7736:2;7724:9;7715:7;7711:23;7707:32;7704:52;;;7752:1;7749;7742:12;7704:52;-1:-1:-1;7797:16:1;;7613:230;-1:-1:-1;7613:230:1:o;7848:127::-;7909:10;7904:3;7900:20;7897:1;7890:31;7940:4;7937:1;7930:15;7964:4;7961:1;7954:15;7980:125;8045:9;;;8066:10;;;8063:36;;;8079:18;;:::i;8110:168::-;8183:9;;;8214;;8231:15;;;8225:22;;8211:37;8201:71;;8252:18;;:::i;8283:217::-;8323:1;8349;8339:132;;8393:10;8388:3;8384:20;8381:1;8374:31;8428:4;8425:1;8418:15;8456:4;8453:1;8446:15;8339:132;-1:-1:-1;8485:9:1;;8283:217::o;8784:245::-;8851:6;8904:2;8892:9;8883:7;8879:23;8875:32;8872:52;;;8920:1;8917;8910:12;8872:52;8952:9;8946:16;8971:28;8993:5;8971:28;:::i;9034:375::-;9122:1;9140:5;9154:249;9175:1;9165:8;9162:15;9154:249;;;9225:4;9220:3;9216:14;9210:4;9207:24;9204:50;;;9234:18;;:::i;:::-;9284:1;9274:8;9270:16;9267:49;;;9298:16;;;;9267:49;9381:1;9377:16;;;;;9337:15;;9154:249;;;9034:375;;;;;;:::o;9414:902::-;9463:5;9493:8;9483:80;;-1:-1:-1;9534:1:1;9548:5;;9483:80;9582:4;9572:76;;-1:-1:-1;9619:1:1;9633:5;;9572:76;9664:4;9682:1;9677:59;;;;9750:1;9745:174;;;;9657:262;;9677:59;9707:1;9698:10;;9721:5;;;9745:174;9782:3;9772:8;9769:17;9766:43;;;9789:18;;:::i;:::-;-1:-1:-1;;9845:1:1;9831:16;;9904:5;;9657:262;;10003:2;9993:8;9990:16;9984:3;9978:4;9975:13;9971:36;9965:2;9955:8;9952:16;9947:2;9941:4;9938:12;9934:35;9931:77;9928:203;;;-1:-1:-1;10040:19:1;;;10116:5;;9928:203;10163:42;-1:-1:-1;;10188:8:1;10182:4;10163:42;:::i;:::-;10241:6;10237:1;10233:6;10229:19;10220:7;10217:32;10214:58;;;10252:18;;:::i;:::-;10290:20;;9414:902;-1:-1:-1;;;9414:902:1:o;10321:140::-;10379:5;10408:47;10449:4;10439:8;10435:19;10429:4;10408:47;:::i;10815:128::-;10882:9;;;10903:11;;;10900:37;;;10917:18;;:::i;13760:127::-;13821:10;13816:3;13812:20;13809:1;13802:31;13852:4;13849:1;13842:15;13876:4;13873:1;13866:15;17736:127;17797:10;17792:3;17788:20;17785:1;17778:31;17828:4;17825:1;17818:15;17852:4;17849:1;17842:15;17868:135;17907:3;17928:17;;;17925:43;;17948:18;;:::i;:::-;-1:-1:-1;17995:1:1;17984:13;;17868:135::o;19952:348::-;20154:2;20136:21;;;20193:2;20173:18;;;20166:30;20232:26;20227:2;20212:18;;20205:54;20291:2;20276:18;;19952:348::o;20653:127::-;20714:10;20709:3;20705:20;20702:1;20695:31;20745:4;20742:1;20735:15;20769:4;20766:1;20759:15;21561:251;21631:6;21684:2;21672:9;21663:7;21659:23;21655:32;21652:52;;;21700:1;21697;21690:12;21652:52;21732:9;21726:16;21751:31;21776:5;21751:31;:::i;21817:582::-;22116:6;22105:9;22098:25;22159:6;22154:2;22143:9;22139:18;22132:34;22202:3;22197:2;22186:9;22182:18;22175:31;22079:4;22223:57;22275:3;22264:9;22260:19;22252:6;22223:57;:::i;:::-;-1:-1:-1;;;;;22316:32:1;;;;22311:2;22296:18;;22289:60;-1:-1:-1;22380:3:1;22365:19;22358:35;22215:65;21817:582;-1:-1:-1;;;21817:582:1:o;23012:456::-;23100:6;23108;23116;23169:2;23157:9;23148:7;23144:23;23140:32;23137:52;;;23185:1;23182;23175:12;23137:52;-1:-1:-1;;23230:16:1;;23336:2;23321:18;;23315:25;23432:2;23417:18;;;23411:25;23230:16;;23315:25;;-1:-1:-1;23411:25:1;23012:456;-1:-1:-1;23012:456:1:o

Swarm Source

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