ETH Price: $2,655.60 (+1.42%)

Token

Black Friday Shib (BFSHIB)
 

Overview

Max Total Supply

1,000,000,000,000 BFSHIB

Holders

99

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
4,813,618,584.255435197 BFSHIB

Value
$0.00
0x27514b6538b141854C91Eb0698BCAF6f3CEC5B36
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:
BlackFridayShibToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 4: BlackFridayShib.sol
/**
 * 
 * $BFSHIB - BLACK FRIDAY SHIB TOKEN
 *
 * 
 * 
 * 💻 Website: https://blackfridayshib.com/
 * 💬 Telegram: https://t.me/BlackFridayShibToken
 * 
 * 
 * 
 * 
 * 
 * ██████╗░██╗░░░░░░█████╗░░█████╗░██╗░░██╗  ███████╗██████╗░██╗██████╗░░█████╗░██╗░░░██╗
 * ██╔══██╗██║░░░░░██╔══██╗██╔══██╗██║░██╔╝  ██╔════╝██╔══██╗██║██╔══██╗██╔══██╗╚██╗░██╔╝
 * ██████╦╝██║░░░░░███████║██║░░╚═╝█████═╝░  █████╗░░██████╔╝██║██║░░██║███████║░╚████╔╝░
 * ██╔══██╗██║░░░░░██╔══██║██║░░██╗██╔═██╗░  ██╔══╝░░██╔══██╗██║██║░░██║██╔══██║░░╚██╔╝░░
 * ██████╦╝███████╗██║░░██║╚█████╔╝██║░╚██╗  ██║░░░░░██║░░██║██║██████╔╝██║░░██║░░░██║░░░
 * ╚═════╝░╚══════╝╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝  ╚═╝░░░░░╚═╝░░╚═╝╚═╝╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░
 * 
 * ░██████╗██╗░░██╗██╗██████╗
 * ██╔════╝██║░░██║██║██╔══██╗
 * ╚█████╗░███████║██║██████╦╝
 * ░╚═══██╗██╔══██║██║██╔══██╗
 * ██████╔╝██║░░██║██║██████╦╝
 * ╚═════╝░╚═╝░░╚═╝╚═╝╚═════╝
 * 
 *  AUTOMATED. RANDOMIZED. ASYNCHRONOUS.
 *
 * BLACK FRIDAY SHIB Token integrates with Chainlink to create a automated, randomised way to give deals.
 *
 * Tokenomics:
 * 
 * $BFSHIB is is the Latest ERC-20 Token on the theme of Black Friday powered by Chainlink
 * 
 * Everyone loves discounts and sales during the black friday season.
 * But why wait for it once every year? When you can get it every hour?
 * 
 * Black Friday Shib integrates with the oracle provider CHAINLINK which,
 * through ChainLink VRF, makes verifiable randomness possible on chain
 *
 * Based on the random number generated, BFSHIB can toggle between below modes affecting the buy taxes.
 *
 * HAPPY HOURS MODE 
 * - BUY tax can vary between 2% and 10% based on the price impact of the buy
 * - Bigger buys = Lower BUY tax
 * 
 * FLASH SALE MODE 
 * - BUY tax can vary between 5% and 8% based on the random number generated 
 *
 * STEAL DEAL MODE 
 * - BUY tax reduced to 5% 
 * 
 * NORMAL MODE 
 * - BUY tax is 10%
 *
 * Redistribution - 10% of all collected fees
 * Sells have an ANTI-DUMP Tokenomics where your SELL tax is proportional to the price impact of the sell
 * Early buyers and snipers advantage will be limited.
 * 
 * 
 * 
 * SPDX-License-Identifier: UNLICENSED 
 * 
*/

pragma solidity ^0.8.4;

import "./VRFConsumerBase.sol";

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

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);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if(a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

}  

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

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

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

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

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

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

contract BlackFridayShibToken is Context, IERC20, Ownable, VRFConsumerBase {
    using SafeMath for uint256;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _bots;
    mapping (address => User) private trader;
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1e12 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    string private constant _name = unicode"Black Friday Shib";
    string private constant _symbol = unicode"BFSHIB";
    uint8 private constant _decimals = 9;
    uint256 private _taxFee = 1;
    uint256 private _teamFee = 6;
    uint256 public buyTaxRandomNumber = 10;
    uint256 private _launchTime;
    uint256 private _modeExpiryTime = 0;
    uint256 private _previousTaxFee = _taxFee;
    uint256 private _previousteamFee = _teamFee;
    uint256 private _maxBuyAmount;
    address payable private _FeeAddress;
    address payable private _marketingWalletAddress;
    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen = false;
    string private mode = "NORMAL";
    bool private _cooldownEnabled = true;
    bool private _communityMode = false;
    bool private inSwap = false;
    uint256 private _launchBlock = 0;
    uint256 private buyLimitEnd;
    uint256 private _snipers = 0;
    uint256 private _impactMultiplier = 1000;

    bytes32 internal keyHash;
    uint256 internal linkFee;
    // how many multiples of the linkFee should the contract aim to hold
    uint256 internal MIN_LINK_FEES_TO_HOLD = 2;
    uint256 internal MAX_LINK_FEES_TO_HOLD = 5;

    // random number generation
    uint256 public randomNumber; // for debugging
    bytes32 public lastRequestId;
    uint256 public lastRequestAt;

    event SwapETHForTokens(
        uint256 amountIn,
        address[] path
    );

    struct User {
        uint256 buyCD;
        bool exists;
    }

    event MaxBuyAmountUpdated(uint _maxBuyAmount);
    event CooldownEnabledUpdated(bool _cooldown);
    event FeeMultiplierUpdated(uint _multiplier);
    event FeeRateUpdated(uint _rate);

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }



    constructor () VRFConsumerBase(
            0xf0d54349aDdcf704F77AE15b96510dEA15cb7952, //VRFCoordinator
            0x514910771AF9Ca656af840dff83E8264EcF986CA  // LINK Token
        ) {
        _FeeAddress = payable(0x5d878c527e292CD3FaF750dcE3035E46B778E634);
        _marketingWalletAddress = payable(0x5d878c527e292CD3FaF750dcE3035E46B778E634);
        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_FeeAddress] = true;
        _isExcludedFromFee[_marketingWalletAddress] = true;
        _isExcludedFromFee[address(0xf0d54349aDdcf704F77AE15b96510dEA15cb7952)] = true; //chainlink VRFCoordinator
        keyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
        linkFee = 2 * 10 ** 18;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function snipersTaxed() public view returns (uint256) {
        return _snipers;
    }

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function removeAllFee() private {
        if(_taxFee == 0 && _teamFee == 0) return;
        _previousTaxFee = _taxFee;
        _previousteamFee = _teamFee;
        _taxFee = 0;
        _teamFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _teamFee = _previousteamFee;
    }

    function whichMode() public view returns (string memory) {
        if (block.timestamp > _modeExpiryTime) {
            return "NORMAL";
        }
        return mode;
    }
    

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if(from != owner() && to != owner()) {
            
            require(!_bots[from] && !_bots[to]);
            
            if(!trader[msg.sender].exists) {
                trader[msg.sender] = User(0,true);
            }
            uint256 totalFee = 10;
            // buy
            if(from == uniswapV2Pair && to != address(uniswapV2Router) && !_isExcludedFromFee[to]) {
                require(tradingOpen, "Trading not yet enabled.");

                if(block.number < _launchBlock + 2) {
                    totalFee = 75;
                    _snipers++;
                } else if(block.timestamp > _launchTime + (2 minutes)) {
                    if (block.timestamp > _modeExpiryTime) {
                        mode = "NORMAL";
                        totalFee = 10;
                    } else if (keccak256(abi.encodePacked(mode)) == keccak256(abi.encodePacked("STEAL_DEALS"))) {
                        totalFee = 5 + 1;
                    } else if (keccak256(abi.encodePacked(mode)) == keccak256(abi.encodePacked("HAPPY_HOURS"))) {
                        uint256 amountImpactMultiplier = amount.mul(_impactMultiplier);
                        uint256 priceImpact = amountImpactMultiplier.div(balanceOf(uniswapV2Pair).add(amount));
                        if (priceImpact >= 40) {
                            totalFee = 2;
                        } else if (priceImpact >= 30) {
                            totalFee = 4;
                        } else if (priceImpact >=20) {
                            totalFee = 6;
                        } else if (priceImpact >= 10) {
                            totalFee = 8;
                        } else {
                            totalFee = 10;
                        }
                        totalFee++;
                    } else {
                        totalFee = buyTaxRandomNumber + 1;
                    }
                } else if (block.timestamp > _launchTime + (1 minutes)) {
                    totalFee = 20;
                } else {
                    totalFee = 40;
                } 
                
                _taxFee = (totalFee).div(10);
                _teamFee = (totalFee.mul(9)).div(10);
                
                if(_cooldownEnabled) {
                    if(buyLimitEnd > block.timestamp) {
                        require(amount <= _maxBuyAmount);
                        require(trader[to].buyCD < block.timestamp, "Your buy cooldown has not expired.");
                        trader[to].buyCD = block.timestamp + (45 seconds);
                    }
                }
            }
            uint256 contractTokenBalance = balanceOf(address(this));

            // sell
            if(!inSwap && from != uniswapV2Pair && tradingOpen) {

                //price impact based sell tax
                uint256 amountImpactMultiplier = amount.mul(_impactMultiplier);
                uint256 priceImpact = amountImpactMultiplier.div(balanceOf(uniswapV2Pair).add(amount));
                _taxFee = 1;
                
                if (priceImpact <= 10) {
                    totalFee = 10;
                } else if (priceImpact >= 40) {
                    totalFee = 40;
                } else if (priceImpact.mod(2) != 0) {
                    totalFee = ++priceImpact;
                } else {
                    totalFee = priceImpact;
                }
                
                _teamFee = totalFee.sub(_taxFee);

                //To limit big dumps by the contract before the sells
                if(contractTokenBalance > 0) {
                    if(contractTokenBalance > balanceOf(uniswapV2Pair).mul(5).div(100)) {
                        contractTokenBalance = balanceOf(uniswapV2Pair).mul(5).div(100);
                    }
                    swapTokensForEth(contractTokenBalance);
                }

                if (LINK.balanceOf(address(this)) < linkFee * MIN_LINK_FEES_TO_HOLD) {
                    swapEthForLink();
                }
                requestBuybackRandomNumber();

                uint256 contractETHBalance = address(this).balance;
                if(contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
            }
        }
        bool takeFee = true;

        if(_isExcludedFromFee[from] || _isExcludedFromFee[to] || _communityMode){
            takeFee = false;
        }
        
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapEthForLink() private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(0x514910771AF9Ca656af840dff83E8264EcF986CA); 
       

        uint256 ethAmount = uniswapV2Router.getAmountsIn(MAX_LINK_FEES_TO_HOLD * linkFee - LINK.balanceOf(address(this)), path)[0];

        if (address(this).balance > ethAmount) {
            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
                0, // accept any amount of Tokens
                path,
                address(this), 
                block.timestamp.add(300)
            );

            emit SwapETHForTokens(ethAmount, path);
        }
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        randomNumber = uint256(keccak256(abi.encode(randomness, requestId))) % 100 + 1;

        if (randomNumber > 80) {
            mode = "HAPPY_HOURS";
        } else if (randomNumber > 50) {
            mode = "FLASH_SALE";
            buyTaxRandomNumber = randomNumber.div(10);
        } else if (randomNumber > 25) {
            mode = "STEAL_DEALS";
        } else {
            mode = "NORMAL";
        }
        _modeExpiryTime = block.timestamp + 15 minutes;
        lastRequestId = 0;
    }

    function requestBuybackRandomNumber()  private  {
        if (lastRequestId != 0 && block.timestamp < (lastRequestAt + 59 minutes)) return;

        if (LINK.balanceOf(address(this)) > linkFee) {
            lastRequestId = requestRandomness(keyHash, linkFee);
            lastRequestAt = block.timestamp;
        }
    }

    function sendETHToFee(uint256 amount) private {
        _FeeAddress.transfer(amount.div(2));
        _marketingWalletAddress.transfer(amount.div(2));
    }
    
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        _transferStandard(sender, recipient, amount);
        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); 

        _takeTeam(tTeam);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getTValues(tAmount, _taxFee, _teamFee);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tTeam, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tTeam);
    }

    function _getTValues(uint256 tAmount, uint256 taxFee, uint256 TeamFee) private pure returns (uint256, uint256, uint256) {
        uint256 tFee = tAmount.mul(taxFee).div(100);
        uint256 tTeam = tAmount.mul(TeamFee).div(100);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tTeam);
        return (tTransferAmount, tFee, tTeam);
    }

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

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if(rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tTeam, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTeam = tTeam.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rTeam);
        return (rAmount, rTransferAmount, rFee);
    }

    function _takeTeam(uint256 tTeam) private {
        uint256 currentRate =  _getRate();
        uint256 rTeam = tTeam.mul(currentRate);

        _rOwned[address(this)] = _rOwned[address(this)].add(rTeam);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    receive() external payable {}
    
    function openTrading() external onlyOwner() {
        require(!tradingOpen,"trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        _maxBuyAmount = 5000000000 * 10**9;
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
        tradingOpen = true;
        buyLimitEnd = block.timestamp + (90 seconds);
        _launchTime = block.timestamp;
        _launchBlock = block.number;
        lastRequestAt = block.timestamp;
    }

    function setMarketingWallet (address payable marketingWalletAddress) external {
        require(_msgSender() == _FeeAddress);
        _isExcludedFromFee[_marketingWalletAddress] = false;
        _marketingWalletAddress = marketingWalletAddress;
        _isExcludedFromFee[marketingWalletAddress] = true;
    }
    
    function excludeFromFee (address payable ad) external {
        require(_msgSender() == _FeeAddress);
        _isExcludedFromFee[ad] = true;
    }
    
    function includeToFee (address payable ad) external {
        require(_msgSender() == _FeeAddress);
        _isExcludedFromFee[ad] = false;
    }
    
    function setBots(address[] memory bots_) public onlyOwner {
        if (block.timestamp < _launchTime + (20 minutes)) {
            for (uint i = 0; i < bots_.length; i++) {
                if (bots_[i] != uniswapV2Pair && bots_[i] != address(uniswapV2Router)) {
                    _bots[bots_[i]] = true;
                }
            }
        }
    }
    
    function delBot(address notbot) public onlyOwner {
        _bots[notbot] = false;
    }
    
    function isBot(address ad) public view returns (bool) {
        return _bots[ad];
    }
    
    function setCooldownEnabled(bool onoff) external onlyOwner() {
        _cooldownEnabled = onoff;
        emit CooldownEnabledUpdated(_cooldownEnabled);
    }

    function thisBalance() public view returns (uint) {
        return balanceOf(address(this));
    }

    function cooldownEnabled() public view returns (bool) {
        return _cooldownEnabled;
    }

    function timeToBuy(address buyer) public view returns (uint) {
        return block.timestamp - trader[buyer].buyCD;
    }
    
    function amountInPool() public view returns (uint) {
        return balanceOf(uniswapV2Pair);
    }
}

File 2 of 4: LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

  function transfer(
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

}


File 3 of 4: VRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./LinkTokenInterface.sol";

import "./VRFRequestIDBase.sol";

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 constant private USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}


File 4 of 4: VRFRequestIDBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

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":"bool","name":"_cooldown","type":"bool"}],"name":"CooldownEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"FeeMultiplierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"FeeRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxBuyAmount","type":"uint256"}],"name":"MaxBuyAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountInPool","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":"buyTaxRandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"ad","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"ad","type":"address"}],"name":"includeToFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRequestAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRequestId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingWalletAddress","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snipersTaxed","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":"thisBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"}],"name":"timeToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":[],"name":"whichMode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526200001b683635c9adc5dea00000600019620003a6565b620000299060001962000345565b6009556001600b8190556006600c819055600a600d556000600f5560109190915560118190556016805460ff60a01b1916905560408051808201909152818152651393d493505360d21b60209091019081526200008a91601791906200029f565b506018805462ffffff1916600117905560006019819055601b556103e8601c556002601f556005602055348015620000c157600080fd5b50600080546001600160a01b03191633908117825560405173f0d54349addcf704f77ae15b96510dea15cb79529273514910771af9ca656af840dff83e8264ecf986ca92918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350606091821b6001600160601b031990811660a052911b1660805260138054735d878c527e292cd3faf750dce3035e46b778e6346001600160a01b031991821681178355601480549092161781556009543360008181526003602090815260408083209490945581546001600160a01b03908116835260068252848320805460ff199081166001908117909255308552868520805482168317905597548216845285842080548916821790559554168252838220805487168617905573f0d54349addcf704f77ae15b96510dea15cb795282527ffd283a492b53e4bff1ac7e0a25603a448b84d2cf0b850c12bede3e637517d79280549096169094179094557faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445601d55671bc16d674ec80000601e559051683635c9adc5dea0000081529092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620003c7565b828054620002ad9062000369565b90600052602060002090601f016020900481019282620002d157600085556200031c565b82601f10620002ec57805160ff19168380011785556200031c565b828001600101855582156200031c579182015b828111156200031c578251825591602001919060010190620002ff565b506200032a9291506200032e565b5090565b5b808211156200032a57600081556001016200032f565b6000828210156200036457634e487b7160e01b81526011600452602481fd5b500390565b600181811c908216806200037e57607f821691505b60208210811415620003a057634e487b7160e01b600052602260045260246000fd5b50919050565b600082620003c257634e487b7160e01b81526012600452602481fd5b500690565b60805160601c60a05160601c612f416200040f6000396000818161089401526123d80152600081816117bc01528181611f99015281816121cd01526123a90152612f416000f3fe6080604052600436106101d15760003560e01c8063715018a6116100f7578063b515566a11610095578063db92dbb611610064578063db92dbb61461053a578063dd62ed3e1461054f578063e02b489d14610595578063fc2a88c3146105ab57600080fd5b8063b515566a146104cf578063c9567bf9146104ef578063ccbac9f514610504578063cf0848f71461051a57600080fd5b806395d89b41116100d157806395d89b411461045357806396a0aab714610482578063a9059cbb14610497578063a985ceef146104b757600080fd5b8063715018a6146103f65780638da5cb5b1461040b57806394985ddd1461043357600080fd5b80633bbac5791161016f5780635932ead11161013e5780635932ead1146103765780635d098b381461039657806368a3a6a5146103b657806370a08231146103d657600080fd5b80633bbac579146102f25780633d75af991461032b578063437823ec1461034057806345be726e1461036057600080fd5b806323b872dd116101ab57806323b872dd1461027f578063273123b71461029f57806327f3a72a146102c1578063313ce567146102d657600080fd5b806306fdde03146101dd578063095ea7b31461022957806318160ddd1461025957600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b50604080518082019091526011815270213630b1b590233934b230bc9029b434b160791b60208201525b6040516102209190612cc0565b60405180910390f35b34801561023557600080fd5b5061024961024436600461294a565b6105c1565b6040519015158152602001610220565b34801561026557600080fd5b50683635c9adc5dea000005b604051908152602001610220565b34801561028b57600080fd5b5061024961029a36600461290a565b6105d8565b3480156102ab57600080fd5b506102bf6102ba36600461289a565b610641565b005b3480156102cd57600080fd5b50610271610695565b3480156102e257600080fd5b5060405160098152602001610220565b3480156102fe57600080fd5b5061024961030d36600461289a565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561033757600080fd5b50601b54610271565b34801561034c57600080fd5b506102bf61035b36600461289a565b6106a5565b34801561036c57600080fd5b50610271600d5481565b34801561038257600080fd5b506102bf610391366004612a9d565b6106e9565b3480156103a257600080fd5b506102bf6103b136600461289a565b610760565b3480156103c257600080fd5b506102716103d136600461289a565b6107d0565b3480156103e257600080fd5b506102716103f136600461289a565b6107f3565b34801561040257600080fd5b506102bf610815565b34801561041757600080fd5b506000546040516001600160a01b039091168152602001610220565b34801561043f57600080fd5b506102bf61044e366004612ad5565b610889565b34801561045f57600080fd5b50604080518082019091526006815265212329a424a160d11b6020820152610213565b34801561048e57600080fd5b5061021361090f565b3480156104a357600080fd5b506102496104b236600461294a565b6109cc565b3480156104c357600080fd5b5060185460ff16610249565b3480156104db57600080fd5b506102bf6104ea366004612975565b6109d9565b3480156104fb57600080fd5b506102bf610b35565b34801561051057600080fd5b5061027160215481565b34801561052657600080fd5b506102bf61053536600461289a565b610f12565b34801561054657600080fd5b50610271610f53565b34801561055b57600080fd5b5061027161056a3660046128d2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156105a157600080fd5b5061027160235481565b3480156105b757600080fd5b5061027160225481565b60006105ce338484610f6b565b5060015b92915050565b60006105e584848461108f565b610637843361063285604051806060016040528060288152602001612ee4602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906118da565b610f6b565b5060019392505050565b6000546001600160a01b031633146106745760405162461bcd60e51b815260040161066b90612cd3565b60405180910390fd5b6001600160a01b03166000908152600760205260409020805460ff19169055565b60006106a0306107f3565b905090565b6013546001600160a01b0316336001600160a01b0316146106c557600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000546001600160a01b031633146107135760405162461bcd60e51b815260040161066b90612cd3565b6018805460ff191682151590811790915560405160ff909116151581527f0d63187a8abb5b4d1bb562e1163897386b0a88ee72e0799dd105bd0fd6f287069060200160405180910390a150565b6013546001600160a01b0316336001600160a01b03161461078057600080fd5b601480546001600160a01b03908116600090815260066020526040808220805460ff1990811690915584546001600160a01b03191695909316948517909355928352912080549091166001179055565b6001600160a01b0381166000908152600860205260408120546105d29042612dfd565b6001600160a01b0381166000908152600360205260408120546105d290611914565b6000546001600160a01b0316331461083f5760405162461bcd60e51b815260040161066b90612cd3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109015760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604482015260640161066b565b61090b8282611998565b5050565b6060600f5442111561093c57506040805180820190915260068152651393d493505360d21b602082015290565b6017805461094990612e14565b80601f016020809104026020016040519081016040528092919081815260200182805461097590612e14565b80156109c25780601f10610997576101008083540402835291602001916109c2565b820191906000526020600020905b8154815290600101906020018083116109a557829003601f168201915b5050505050905090565b60006105ce33848461108f565b6000546001600160a01b03163314610a035760405162461bcd60e51b815260040161066b90612cd3565b600e54610a12906104b0612db2565b421015610b325760005b815181101561090b5760165482516001600160a01b0390911690839083908110610a5657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614158015610ab5575060155482516001600160a01b0390911690839083908110610aa157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b15610b2057600160076000848481518110610ae057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610b2a81612e4f565b915050610a1c565b50565b6000546001600160a01b03163314610b5f5760405162461bcd60e51b815260040161066b90612cd3565b601654600160a01b900460ff1615610bb95760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161066b565b601580546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155610bf63082683635c9adc5dea00000610f6b565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2f57600080fd5b505afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6791906128b6565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610caf57600080fd5b505afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce791906128b6565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d2f57600080fd5b505af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906128b6565b601680546001600160a01b0319166001600160a01b039283161790556015541663f305d7194730610d97816107f3565b600080610dac6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e489190612b0e565b5050674563918244f400006012555060165460155460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015610ea857600080fd5b505af1158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190612ab9565b506016805460ff60a01b1916600160a01b179055610eff42605a612db2565b601a555042600e81905543601955602355565b6013546001600160a01b0316336001600160a01b031614610f3257600080fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b6016546000906106a0906001600160a01b03166107f3565b6001600160a01b038316610fcd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161066b565b6001600160a01b03821661102e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161066b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161066b565b6001600160a01b0382166111555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161066b565b600081116111b75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161066b565b6000546001600160a01b038481169116148015906111e357506000546001600160a01b03838116911614155b1561186b576001600160a01b03831660009081526007602052604090205460ff1615801561122a57506001600160a01b03821660009081526007602052604090205460ff16155b61123357600080fd5b3360009081526008602052604090206001015460ff16611289576040805180820182526000808252600160208084018281523384526008909152939091209151825591519101805460ff19169115159190911790555b601654600a906001600160a01b0385811691161480156112b757506015546001600160a01b03848116911614155b80156112dc57506001600160a01b03831660009081526006602052604090205460ff16155b1561164657601654600160a01b900460ff1661133a5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604482015260640161066b565b601954611348906002612db2565b43101561136c5750601b8054604b91600061136283612e4f565b9190505550611564565b600e5461137a906078612db2565b42111561154357600f544211156113c257604080518082019091526006808252651393d493505360d21b60209092019182526113b891601791612801565b50600a9050611564565b6040516a535445414c5f4445414c5360a81b6020820152602b016040516020818303038152906040528051906020012060176040516020016114049190612bc9565b60405160208183030381529060405280519060200120141561142857506006611564565b6040516a48415050595f484f55525360a81b6020820152602b0160405160208183030381529060405280519060200120601760405160200161146a9190612bc9565b60405160208183030381529060405280519060200120141561152e57600061149d601c5484611af390919063ffffffff16565b6016549091506000906114cf906114c89086906114c2906001600160a01b03166107f3565b90611b72565b8390611bd1565b9050602881106114e2576002925061151a565b601e81106114f3576004925061151a565b60148110611504576006925061151a565b600a8110611515576008925061151a565b600a92505b8261152481612e4f565b9350505050611564565b600d5461153c906001612db2565b9050611564565b600e5461155190603c612db2565b42111561156057506014611564565b5060285b61156f81600a611bd1565b600b55611588600a611582836009611af3565b90611bd1565b600c5560185460ff16156116465742601a541115611646576012548211156115af57600080fd5b6001600160a01b03831660009081526008602052604090205442116116215760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b606482015260840161066b565b61162c42602d612db2565b6001600160a01b0384166000908152600860205260409020555b6000611651306107f3565b60185490915062010000900460ff1615801561167b57506016546001600160a01b03868116911614155b80156116905750601654600160a01b900460ff165b156118685760006116ac601c5485611af390919063ffffffff16565b6016549091506000906116d1906114c89087906114c2906001600160a01b03166107f3565b6001600b559050600a81116116e957600a9350611721565b602881106116fa5760289350611721565b611705816002611c13565b1561171d5761171381612e4f565b9050809350611721565b8093505b600b5461172f908590611c55565b600c55821561179757601654611761906064906115829060059061175b906001600160a01b03166107f3565b90611af3565b83111561178e5760165461178b906064906115829060059061175b906001600160a01b03166107f3565b92505b61179783611c97565b601f54601e546117a79190612dde565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561180657600080fd5b505afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190612af6565b101561184c5761184c611e39565b611854612190565b478015611864576118644761226d565b5050505b50505b6001600160a01b03831660009081526006602052604090205460019060ff16806118ad57506001600160a01b03831660009081526006602052604090205460ff165b806118bf5750601854610100900460ff165b156118c8575060005b6118d4848484846122f2565b50505050565b600081848411156118fe5760405162461bcd60e51b815260040161066b9190612cc0565b50600061190b8486612dfd565b95945050505050565b600060095482111561197b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161066b565b6000611985612320565b90506119918382611bd1565b9392505050565b604080516020808201849052818301859052825180830384018152606090920190925280519101206119cc90606490612e6a565b6119d7906001612db2565b602181905560501015611a1c5760408051808201909152600b8082526a48415050595f484f55525360a81b6020909201918252611a1691601791612801565b50611adb565b60326021541115611a6f5760408051808201909152600a80825269464c4153485f53414c4560b01b6020909201918252611a5891601791612801565b50602154611a6790600a611bd1565b600d55611adb565b60196021541115611aac5760408051808201909152600b8082526a535445414c5f4445414c5360a81b6020909201918252611a1691601791612801565b604080518082019091526006808252651393d493505360d21b6020909201918252611ad991601791612801565b505b611ae742610384612db2565b600f5550506000602255565b600082611b02575060006105d2565b6000611b0e8385612dde565b905082611b1b8583612dca565b146119915760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161066b565b600080611b7f8385612db2565b9050838110156119915760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161066b565b600061199183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612343565b600061199183836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250612371565b600061199183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118da565b6018805462ff00001916620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611ceb57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7791906128b6565b81600181518110611d9857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601554611dbe9130911684610f6b565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac94790611df7908590600090869030904290600401612d21565b600060405180830381600087803b158015611e1157600080fd5b505af1158015611e25573d6000803e3d6000fd5b50506018805462ff00001916905550505050565b6018805462ff00001916620100001790556040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015611eaf57600080fd5b505afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee791906128b6565b81600081518110611f0857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505073514910771af9ca656af840dff83e8264ecf986ca81600181518110611f5e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526015546040516370a0823160e01b815230600482015260009291821691631f00ca74917f0000000000000000000000000000000000000000000000000000000000000000909116906370a082319060240160206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120159190612af6565b601e546020546120259190612dde565b61202f9190612dfd565b846040518363ffffffff1660e01b815260040161204d929190612d08565b60006040518083038186803b15801561206557600080fd5b505afa158015612079573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120a19190810190612a16565b6000815181106120c157634e487b7160e01b600052603260045260246000fd5b6020026020010151905080471115612180576015546001600160a01b031663b6f9de9582600085306120f54261012c611b72565b6040518663ffffffff1660e01b81526004016121149493929190612c8b565b6000604051808303818588803b15801561212d57600080fd5b505af1158015612141573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248183604051612177929190612d08565b60405180910390a15b50506018805462ff000019169055565b602254158015906121ae57506023546121ab90610dd4612db2565b42105b156121b557565b601e546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561221757600080fd5b505afa15801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190612af6565b111561226b57612263601d54601e546123a5565b602255426023555b565b6013546001600160a01b03166108fc612287836002611bd1565b6040518115909202916000818181858888f193505050501580156122af573d6000803e3d6000fd5b506014546001600160a01b03166108fc6122ca836002611bd1565b6040518115909202916000818181858888f1935050505015801561090b573d6000803e3d6000fd5b806122ff576122ff612530565b61230a84848461255e565b806118d4576118d4601054600b55601154600c55565b600080600061232d612655565b909250905061233c8282611bd1565b9250505090565b600081836123645760405162461bcd60e51b815260040161066b9190612cc0565b50600061190b8486612dca565b600081836123925760405162461bcd60e51b815260040161066b9190612cc0565b5061239d8385612e6a565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612415929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161244293929190612c64565b602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190612ab9565b50600083815260026020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526124f0906001612db2565b60008581526002602052604090205561239d8482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b600b541580156125405750600c54155b1561254757565b600b8054601055600c805460115560009182905555565b60008060008060008061257087612697565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506125a29087611c55565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546125d19086611b72565b6001600160a01b0389166000908152600360205260409020556125f3816126f4565b6125fd848361273e565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161264291815260200190565b60405180910390a3505050505050505050565b6009546000908190683635c9adc5dea000006126718282611bd1565b82101561268e57505060095492683635c9adc5dea0000092509050565b90939092509050565b60008060008060008060008060006126b48a600b54600c54612762565b92509250925060006126c4612320565b905060008060006126d78e8787876127b1565b919e509c509a509598509396509194505050505091939550919395565b60006126fe612320565b9050600061270c8383611af3565b306000908152600360205260409020549091506127299082611b72565b30600090815260036020526040902055505050565b60095461274b9083611c55565b600955600a5461275b9082611b72565b600a555050565b600080808061277660646115828989611af3565b9050600061278960646115828a89611af3565b905060006127a18261279b8b86611c55565b90611c55565b9992985090965090945050505050565b60008080806127c08886611af3565b905060006127ce8887611af3565b905060006127dc8888611af3565b905060006127ee8261279b8686611c55565b939b939a50919850919650505050505050565b82805461280d90612e14565b90600052602060002090601f01602090048101928261282f5760008555612875565b82601f1061284857805160ff1916838001178555612875565b82800160010185558215612875579182015b8281111561287557825182559160200191906001019061285a565b50612881929150612885565b5090565b5b808211156128815760008155600101612886565b6000602082840312156128ab578081fd5b813561199181612ec0565b6000602082840312156128c7578081fd5b815161199181612ec0565b600080604083850312156128e4578081fd5b82356128ef81612ec0565b915060208301356128ff81612ec0565b809150509250929050565b60008060006060848603121561291e578081fd5b833561292981612ec0565b9250602084013561293981612ec0565b929592945050506040919091013590565b6000806040838503121561295c578182fd5b823561296781612ec0565b946020939093013593505050565b60006020808385031215612987578182fd5b823567ffffffffffffffff81111561299d578283fd5b8301601f810185136129ad578283fd5b80356129c06129bb82612d8e565b612d5d565b80828252848201915084840188868560051b87010111156129df578687fd5b8694505b83851015612a0a5780356129f681612ec0565b8352600194909401939185019185016129e3565b50979650505050505050565b60006020808385031215612a28578182fd5b825167ffffffffffffffff811115612a3e578283fd5b8301601f81018513612a4e578283fd5b8051612a5c6129bb82612d8e565b80828252848201915084840188868560051b8701011115612a7b578687fd5b8694505b83851015612a0a578051835260019490940193918501918501612a7f565b600060208284031215612aae578081fd5b813561199181612ed5565b600060208284031215612aca578081fd5b815161199181612ed5565b60008060408385031215612ae7578182fd5b50508035926020909101359150565b600060208284031215612b07578081fd5b5051919050565b600080600060608486031215612b22578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612b735781516001600160a01b031687529582019590820190600101612b4e565b509495945050505050565b60008151808452815b81811015612ba357602081850181015186830182015201612b87565b81811115612bb45782602083870101525b50601f01601f19169290920160200192915050565b600080835482600182811c915080831680612be557607f831692505b6020808410821415612c0557634e487b7160e01b87526022600452602487fd5b818015612c195760018114612c2a57612c56565b60ff19861689528489019650612c56565b60008a815260209020885b86811015612c4e5781548b820152908501908301612c35565b505084890196505b509498975050505050505050565b60018060a01b038416815282602082015260606040820152600061190b6060830184612b7e565b848152608060208201526000612ca46080830186612b3b565b6001600160a01b03949094166040830152506060015292915050565b6020815260006119916020830184612b7e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061239d6040830184612b3b565b85815284602082015260a060408201526000612d4060a0830186612b3b565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612d8657612d86612eaa565b604052919050565b600067ffffffffffffffff821115612da857612da8612eaa565b5060051b60200190565b60008219821115612dc557612dc5612e7e565b500190565b600082612dd957612dd9612e94565b500490565b6000816000190483118215151615612df857612df8612e7e565b500290565b600082821015612e0f57612e0f612e7e565b500390565b600181811c90821680612e2857607f821691505b60208210811415612e4957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6357612e63612e7e565b5060010190565b600082612e7957612e79612e94565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b3257600080fd5b8015158114610b3257600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220b1cf1703334985c2981a19ae2b4b90dc530c0662231f9b5efab3de7b74abbe4d64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101d15760003560e01c8063715018a6116100f7578063b515566a11610095578063db92dbb611610064578063db92dbb61461053a578063dd62ed3e1461054f578063e02b489d14610595578063fc2a88c3146105ab57600080fd5b8063b515566a146104cf578063c9567bf9146104ef578063ccbac9f514610504578063cf0848f71461051a57600080fd5b806395d89b41116100d157806395d89b411461045357806396a0aab714610482578063a9059cbb14610497578063a985ceef146104b757600080fd5b8063715018a6146103f65780638da5cb5b1461040b57806394985ddd1461043357600080fd5b80633bbac5791161016f5780635932ead11161013e5780635932ead1146103765780635d098b381461039657806368a3a6a5146103b657806370a08231146103d657600080fd5b80633bbac579146102f25780633d75af991461032b578063437823ec1461034057806345be726e1461036057600080fd5b806323b872dd116101ab57806323b872dd1461027f578063273123b71461029f57806327f3a72a146102c1578063313ce567146102d657600080fd5b806306fdde03146101dd578063095ea7b31461022957806318160ddd1461025957600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b50604080518082019091526011815270213630b1b590233934b230bc9029b434b160791b60208201525b6040516102209190612cc0565b60405180910390f35b34801561023557600080fd5b5061024961024436600461294a565b6105c1565b6040519015158152602001610220565b34801561026557600080fd5b50683635c9adc5dea000005b604051908152602001610220565b34801561028b57600080fd5b5061024961029a36600461290a565b6105d8565b3480156102ab57600080fd5b506102bf6102ba36600461289a565b610641565b005b3480156102cd57600080fd5b50610271610695565b3480156102e257600080fd5b5060405160098152602001610220565b3480156102fe57600080fd5b5061024961030d36600461289a565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561033757600080fd5b50601b54610271565b34801561034c57600080fd5b506102bf61035b36600461289a565b6106a5565b34801561036c57600080fd5b50610271600d5481565b34801561038257600080fd5b506102bf610391366004612a9d565b6106e9565b3480156103a257600080fd5b506102bf6103b136600461289a565b610760565b3480156103c257600080fd5b506102716103d136600461289a565b6107d0565b3480156103e257600080fd5b506102716103f136600461289a565b6107f3565b34801561040257600080fd5b506102bf610815565b34801561041757600080fd5b506000546040516001600160a01b039091168152602001610220565b34801561043f57600080fd5b506102bf61044e366004612ad5565b610889565b34801561045f57600080fd5b50604080518082019091526006815265212329a424a160d11b6020820152610213565b34801561048e57600080fd5b5061021361090f565b3480156104a357600080fd5b506102496104b236600461294a565b6109cc565b3480156104c357600080fd5b5060185460ff16610249565b3480156104db57600080fd5b506102bf6104ea366004612975565b6109d9565b3480156104fb57600080fd5b506102bf610b35565b34801561051057600080fd5b5061027160215481565b34801561052657600080fd5b506102bf61053536600461289a565b610f12565b34801561054657600080fd5b50610271610f53565b34801561055b57600080fd5b5061027161056a3660046128d2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156105a157600080fd5b5061027160235481565b3480156105b757600080fd5b5061027160225481565b60006105ce338484610f6b565b5060015b92915050565b60006105e584848461108f565b610637843361063285604051806060016040528060288152602001612ee4602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906118da565b610f6b565b5060019392505050565b6000546001600160a01b031633146106745760405162461bcd60e51b815260040161066b90612cd3565b60405180910390fd5b6001600160a01b03166000908152600760205260409020805460ff19169055565b60006106a0306107f3565b905090565b6013546001600160a01b0316336001600160a01b0316146106c557600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000546001600160a01b031633146107135760405162461bcd60e51b815260040161066b90612cd3565b6018805460ff191682151590811790915560405160ff909116151581527f0d63187a8abb5b4d1bb562e1163897386b0a88ee72e0799dd105bd0fd6f287069060200160405180910390a150565b6013546001600160a01b0316336001600160a01b03161461078057600080fd5b601480546001600160a01b03908116600090815260066020526040808220805460ff1990811690915584546001600160a01b03191695909316948517909355928352912080549091166001179055565b6001600160a01b0381166000908152600860205260408120546105d29042612dfd565b6001600160a01b0381166000908152600360205260408120546105d290611914565b6000546001600160a01b0316331461083f5760405162461bcd60e51b815260040161066b90612cd3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336001600160a01b037f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146109015760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604482015260640161066b565b61090b8282611998565b5050565b6060600f5442111561093c57506040805180820190915260068152651393d493505360d21b602082015290565b6017805461094990612e14565b80601f016020809104026020016040519081016040528092919081815260200182805461097590612e14565b80156109c25780601f10610997576101008083540402835291602001916109c2565b820191906000526020600020905b8154815290600101906020018083116109a557829003601f168201915b5050505050905090565b60006105ce33848461108f565b6000546001600160a01b03163314610a035760405162461bcd60e51b815260040161066b90612cd3565b600e54610a12906104b0612db2565b421015610b325760005b815181101561090b5760165482516001600160a01b0390911690839083908110610a5657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614158015610ab5575060155482516001600160a01b0390911690839083908110610aa157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b15610b2057600160076000848481518110610ae057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610b2a81612e4f565b915050610a1c565b50565b6000546001600160a01b03163314610b5f5760405162461bcd60e51b815260040161066b90612cd3565b601654600160a01b900460ff1615610bb95760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161066b565b601580546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155610bf63082683635c9adc5dea00000610f6b565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2f57600080fd5b505afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6791906128b6565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610caf57600080fd5b505afa158015610cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce791906128b6565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d2f57600080fd5b505af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906128b6565b601680546001600160a01b0319166001600160a01b039283161790556015541663f305d7194730610d97816107f3565b600080610dac6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e489190612b0e565b5050674563918244f400006012555060165460155460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015610ea857600080fd5b505af1158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190612ab9565b506016805460ff60a01b1916600160a01b179055610eff42605a612db2565b601a555042600e81905543601955602355565b6013546001600160a01b0316336001600160a01b031614610f3257600080fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b6016546000906106a0906001600160a01b03166107f3565b6001600160a01b038316610fcd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161066b565b6001600160a01b03821661102e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161066b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166110f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161066b565b6001600160a01b0382166111555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161066b565b600081116111b75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161066b565b6000546001600160a01b038481169116148015906111e357506000546001600160a01b03838116911614155b1561186b576001600160a01b03831660009081526007602052604090205460ff1615801561122a57506001600160a01b03821660009081526007602052604090205460ff16155b61123357600080fd5b3360009081526008602052604090206001015460ff16611289576040805180820182526000808252600160208084018281523384526008909152939091209151825591519101805460ff19169115159190911790555b601654600a906001600160a01b0385811691161480156112b757506015546001600160a01b03848116911614155b80156112dc57506001600160a01b03831660009081526006602052604090205460ff16155b1561164657601654600160a01b900460ff1661133a5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604482015260640161066b565b601954611348906002612db2565b43101561136c5750601b8054604b91600061136283612e4f565b9190505550611564565b600e5461137a906078612db2565b42111561154357600f544211156113c257604080518082019091526006808252651393d493505360d21b60209092019182526113b891601791612801565b50600a9050611564565b6040516a535445414c5f4445414c5360a81b6020820152602b016040516020818303038152906040528051906020012060176040516020016114049190612bc9565b60405160208183030381529060405280519060200120141561142857506006611564565b6040516a48415050595f484f55525360a81b6020820152602b0160405160208183030381529060405280519060200120601760405160200161146a9190612bc9565b60405160208183030381529060405280519060200120141561152e57600061149d601c5484611af390919063ffffffff16565b6016549091506000906114cf906114c89086906114c2906001600160a01b03166107f3565b90611b72565b8390611bd1565b9050602881106114e2576002925061151a565b601e81106114f3576004925061151a565b60148110611504576006925061151a565b600a8110611515576008925061151a565b600a92505b8261152481612e4f565b9350505050611564565b600d5461153c906001612db2565b9050611564565b600e5461155190603c612db2565b42111561156057506014611564565b5060285b61156f81600a611bd1565b600b55611588600a611582836009611af3565b90611bd1565b600c5560185460ff16156116465742601a541115611646576012548211156115af57600080fd5b6001600160a01b03831660009081526008602052604090205442116116215760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b606482015260840161066b565b61162c42602d612db2565b6001600160a01b0384166000908152600860205260409020555b6000611651306107f3565b60185490915062010000900460ff1615801561167b57506016546001600160a01b03868116911614155b80156116905750601654600160a01b900460ff165b156118685760006116ac601c5485611af390919063ffffffff16565b6016549091506000906116d1906114c89087906114c2906001600160a01b03166107f3565b6001600b559050600a81116116e957600a9350611721565b602881106116fa5760289350611721565b611705816002611c13565b1561171d5761171381612e4f565b9050809350611721565b8093505b600b5461172f908590611c55565b600c55821561179757601654611761906064906115829060059061175b906001600160a01b03166107f3565b90611af3565b83111561178e5760165461178b906064906115829060059061175b906001600160a01b03166107f3565b92505b61179783611c97565b601f54601e546117a79190612dde565b6040516370a0823160e01b81523060048201527f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316906370a082319060240160206040518083038186803b15801561180657600080fd5b505afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190612af6565b101561184c5761184c611e39565b611854612190565b478015611864576118644761226d565b5050505b50505b6001600160a01b03831660009081526006602052604090205460019060ff16806118ad57506001600160a01b03831660009081526006602052604090205460ff165b806118bf5750601854610100900460ff165b156118c8575060005b6118d4848484846122f2565b50505050565b600081848411156118fe5760405162461bcd60e51b815260040161066b9190612cc0565b50600061190b8486612dfd565b95945050505050565b600060095482111561197b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161066b565b6000611985612320565b90506119918382611bd1565b9392505050565b604080516020808201849052818301859052825180830384018152606090920190925280519101206119cc90606490612e6a565b6119d7906001612db2565b602181905560501015611a1c5760408051808201909152600b8082526a48415050595f484f55525360a81b6020909201918252611a1691601791612801565b50611adb565b60326021541115611a6f5760408051808201909152600a80825269464c4153485f53414c4560b01b6020909201918252611a5891601791612801565b50602154611a6790600a611bd1565b600d55611adb565b60196021541115611aac5760408051808201909152600b8082526a535445414c5f4445414c5360a81b6020909201918252611a1691601791612801565b604080518082019091526006808252651393d493505360d21b6020909201918252611ad991601791612801565b505b611ae742610384612db2565b600f5550506000602255565b600082611b02575060006105d2565b6000611b0e8385612dde565b905082611b1b8583612dca565b146119915760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161066b565b600080611b7f8385612db2565b9050838110156119915760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161066b565b600061199183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612343565b600061199183836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250612371565b600061199183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118da565b6018805462ff00001916620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611ceb57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7791906128b6565b81600181518110611d9857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601554611dbe9130911684610f6b565b60155460405163791ac94760e01b81526001600160a01b039091169063791ac94790611df7908590600090869030904290600401612d21565b600060405180830381600087803b158015611e1157600080fd5b505af1158015611e25573d6000803e3d6000fd5b50506018805462ff00001916905550505050565b6018805462ff00001916620100001790556040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015611eaf57600080fd5b505afa158015611ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee791906128b6565b81600081518110611f0857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505073514910771af9ca656af840dff83e8264ecf986ca81600181518110611f5e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526015546040516370a0823160e01b815230600482015260009291821691631f00ca74917f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca909116906370a082319060240160206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120159190612af6565b601e546020546120259190612dde565b61202f9190612dfd565b846040518363ffffffff1660e01b815260040161204d929190612d08565b60006040518083038186803b15801561206557600080fd5b505afa158015612079573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120a19190810190612a16565b6000815181106120c157634e487b7160e01b600052603260045260246000fd5b6020026020010151905080471115612180576015546001600160a01b031663b6f9de9582600085306120f54261012c611b72565b6040518663ffffffff1660e01b81526004016121149493929190612c8b565b6000604051808303818588803b15801561212d57600080fd5b505af1158015612141573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248183604051612177929190612d08565b60405180910390a15b50506018805462ff000019169055565b602254158015906121ae57506023546121ab90610dd4612db2565b42105b156121b557565b601e546040516370a0823160e01b81523060048201527f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316906370a082319060240160206040518083038186803b15801561221757600080fd5b505afa15801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190612af6565b111561226b57612263601d54601e546123a5565b602255426023555b565b6013546001600160a01b03166108fc612287836002611bd1565b6040518115909202916000818181858888f193505050501580156122af573d6000803e3d6000fd5b506014546001600160a01b03166108fc6122ca836002611bd1565b6040518115909202916000818181858888f1935050505015801561090b573d6000803e3d6000fd5b806122ff576122ff612530565b61230a84848461255e565b806118d4576118d4601054600b55601154600c55565b600080600061232d612655565b909250905061233c8282611bd1565b9250505090565b600081836123645760405162461bcd60e51b815260040161066b9190612cc0565b50600061190b8486612dca565b600081836123925760405162461bcd60e51b815260040161066b9190612cc0565b5061239d8385612e6a565b949350505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001612415929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161244293929190612c64565b602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190612ab9565b50600083815260026020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526124f0906001612db2565b60008581526002602052604090205561239d8482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b600b541580156125405750600c54155b1561254757565b600b8054601055600c805460115560009182905555565b60008060008060008061257087612697565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506125a29087611c55565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546125d19086611b72565b6001600160a01b0389166000908152600360205260409020556125f3816126f4565b6125fd848361273e565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161264291815260200190565b60405180910390a3505050505050505050565b6009546000908190683635c9adc5dea000006126718282611bd1565b82101561268e57505060095492683635c9adc5dea0000092509050565b90939092509050565b60008060008060008060008060006126b48a600b54600c54612762565b92509250925060006126c4612320565b905060008060006126d78e8787876127b1565b919e509c509a509598509396509194505050505091939550919395565b60006126fe612320565b9050600061270c8383611af3565b306000908152600360205260409020549091506127299082611b72565b30600090815260036020526040902055505050565b60095461274b9083611c55565b600955600a5461275b9082611b72565b600a555050565b600080808061277660646115828989611af3565b9050600061278960646115828a89611af3565b905060006127a18261279b8b86611c55565b90611c55565b9992985090965090945050505050565b60008080806127c08886611af3565b905060006127ce8887611af3565b905060006127dc8888611af3565b905060006127ee8261279b8686611c55565b939b939a50919850919650505050505050565b82805461280d90612e14565b90600052602060002090601f01602090048101928261282f5760008555612875565b82601f1061284857805160ff1916838001178555612875565b82800160010185558215612875579182015b8281111561287557825182559160200191906001019061285a565b50612881929150612885565b5090565b5b808211156128815760008155600101612886565b6000602082840312156128ab578081fd5b813561199181612ec0565b6000602082840312156128c7578081fd5b815161199181612ec0565b600080604083850312156128e4578081fd5b82356128ef81612ec0565b915060208301356128ff81612ec0565b809150509250929050565b60008060006060848603121561291e578081fd5b833561292981612ec0565b9250602084013561293981612ec0565b929592945050506040919091013590565b6000806040838503121561295c578182fd5b823561296781612ec0565b946020939093013593505050565b60006020808385031215612987578182fd5b823567ffffffffffffffff81111561299d578283fd5b8301601f810185136129ad578283fd5b80356129c06129bb82612d8e565b612d5d565b80828252848201915084840188868560051b87010111156129df578687fd5b8694505b83851015612a0a5780356129f681612ec0565b8352600194909401939185019185016129e3565b50979650505050505050565b60006020808385031215612a28578182fd5b825167ffffffffffffffff811115612a3e578283fd5b8301601f81018513612a4e578283fd5b8051612a5c6129bb82612d8e565b80828252848201915084840188868560051b8701011115612a7b578687fd5b8694505b83851015612a0a578051835260019490940193918501918501612a7f565b600060208284031215612aae578081fd5b813561199181612ed5565b600060208284031215612aca578081fd5b815161199181612ed5565b60008060408385031215612ae7578182fd5b50508035926020909101359150565b600060208284031215612b07578081fd5b5051919050565b600080600060608486031215612b22578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612b735781516001600160a01b031687529582019590820190600101612b4e565b509495945050505050565b60008151808452815b81811015612ba357602081850181015186830182015201612b87565b81811115612bb45782602083870101525b50601f01601f19169290920160200192915050565b600080835482600182811c915080831680612be557607f831692505b6020808410821415612c0557634e487b7160e01b87526022600452602487fd5b818015612c195760018114612c2a57612c56565b60ff19861689528489019650612c56565b60008a815260209020885b86811015612c4e5781548b820152908501908301612c35565b505084890196505b509498975050505050505050565b60018060a01b038416815282602082015260606040820152600061190b6060830184612b7e565b848152608060208201526000612ca46080830186612b3b565b6001600160a01b03949094166040830152506060015292915050565b6020815260006119916020830184612b7e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061239d6040830184612b3b565b85815284602082015260a060408201526000612d4060a0830186612b3b565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612d8657612d86612eaa565b604052919050565b600067ffffffffffffffff821115612da857612da8612eaa565b5060051b60200190565b60008219821115612dc557612dc5612e7e565b500190565b600082612dd957612dd9612e94565b500490565b6000816000190483118215151615612df857612df8612e7e565b500290565b600082821015612e0f57612e0f612e7e565b500390565b600181811c90821680612e2857607f821691505b60208210811415612e4957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6357612e63612e7e565b5060010190565b600082612e7957612e79612e94565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b3257600080fd5b8015158114610b3257600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220b1cf1703334985c2981a19ae2b4b90dc530c0662231f9b5efab3de7b74abbe4d64736f6c63430008040033

Deployed Bytecode Sourcemap

11295:18419:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:81;;;;;;;;;;-1:-1:-1;14698:5:0;;;;;;;;;;;;-1:-1:-1;;;14698:5:0;;;;14629:81;;;;;;;:::i;:::-;;;;;;;;15544:158;;;;;;;;;;-1:-1:-1;15544:158:0;;;;;:::i;:::-;;:::i;:::-;;;10089:14:4;;10082:22;10064:41;;10052:2;10037:18;15544:158:0;10019:92:4;14894:93:0;;;;;;;;;;-1:-1:-1;11815:12:0;14894:93;;;10262:25:4;;;10250:2;10235:18;14894:93:0;10217:76:4;15708:309:0;;;;;;;;;;-1:-1:-1;15708:309:0;;;;;:::i;:::-;;:::i;28920:87::-;;;;;;;;;;-1:-1:-1;28920:87:0;;;;;:::i;:::-;;:::i;:::-;;29277:98;;;;;;;;;;;;;:::i;14807:81::-;;;;;;;;;;-1:-1:-1;14807:81:0;;12074:1;18239:36:4;;18227:2;18212:18;14807:81:0;18194:87:4;29017::0;;;;;;;;;;-1:-1:-1;29017:87:0;;;;;:::i;:::-;-1:-1:-1;;;;;29088:9:0;29065:4;29088:9;;;:5;:9;;;;;;;;;29017:87;14993:86;;;;;;;;;;-1:-1:-1;15064:8:0;;14993:86;;28245:146;;;;;;;;;;-1:-1:-1;28245:146:0;;;;;:::i;:::-;;:::i;12148:38::-;;;;;;;;;;;;;;;;29114:157;;;;;;;;;;-1:-1:-1;29114:157:0;;;;;:::i;:::-;;:::i;27926:309::-;;;;;;;;;;-1:-1:-1;27926:309:0;;;;;:::i;:::-;;:::i;29481:122::-;;;;;;;;;;-1:-1:-1;29481:122:0;;;;;:::i;:::-;;:::i;15085:136::-;;;;;;;;;;-1:-1:-1;15085:136:0;;;;;:::i;:::-;;:::i;6335:145::-;;;;;;;;;;;;;:::i;6130:77::-;;;;;;;;;;-1:-1:-1;6168:7:0;6194:6;6130:77;;-1:-1:-1;;;;;6194:6:0;;;8272:51:4;;8260:2;8245:18;6130:77:0;8227:102:4;9628:225:2;;;;;;;;;;-1:-1:-1;9628:225:2;;;;;:::i;:::-;;:::i;14716:85:0:-;;;;;;;;;;-1:-1:-1;14787:7:0;;;;;;;;;;;;-1:-1:-1;;;14787:7:0;;;;14716:85;;16611:173;;;;;;;;;;;;;:::i;15227:164::-;;;;;;;;;;-1:-1:-1;15227:164:0;;;;;:::i;:::-;;:::i;29381:94::-;;;;;;;;;;-1:-1:-1;29452:16:0;;;;29381:94;;28556:354;;;;;;;;;;-1:-1:-1;28556:354:0;;;;;:::i;:::-;;:::i;27005:915::-;;;;;;;;;;;;;:::i;13178:27::-;;;;;;;;;;;;;;;;28401:145;;;;;;;;;;-1:-1:-1;28401:145:0;;;;;:::i;:::-;;:::i;29613:99::-;;;;;;;;;;;;;:::i;15397:141::-;;;;;;;;;;-1:-1:-1;15397:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;15504:18:0;;;15478:7;15504:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15397:141;13262:28;;;;;;;;;;;;;;;;13228;;;;;;;;;;;;;;;;15544:158;15619:4;15635:39;3691:10;15658:7;15667:6;15635:8;:39::i;:::-;-1:-1:-1;15691:4:0;15544:158;;;;;:::o;15708:309::-;15806:4;15822:36;15832:6;15840:9;15851:6;15822:9;:36::i;:::-;15868:121;15877:6;3691:10;15899:89;15937:6;15899:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15899:19:0;;;;;;:11;:19;;;;;;;;3691:10;15899:33;;;;;;;;;;:37;:89::i;:::-;15868:8;:121::i;:::-;-1:-1:-1;16006:4:0;15708:309;;;;;:::o;28920:87::-;6252:6;;-1:-1:-1;;;;;6252:6:0;3691:10;6252:22;6244:67;;;;-1:-1:-1;;;6244:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;28979:13:0::1;28995:5;28979:13:::0;;;:5:::1;:13;::::0;;;;:21;;-1:-1:-1;;28979:21:0::1;::::0;;28920:87::o;29277:98::-;29321:4;29344:24;29362:4;29344:9;:24::i;:::-;29337:31;;29277:98;:::o;28245:146::-;28333:11;;-1:-1:-1;;;;;28333:11:0;3691:10;-1:-1:-1;;;;;28317:27:0;;28309:36;;;;;;-1:-1:-1;;;;;28355:22:0;;;;;:18;:22;;;;;:29;;-1:-1:-1;;28355:29:0;28380:4;28355:29;;;28245:146::o;29114:157::-;6252:6;;-1:-1:-1;;;;;6252:6:0;3691:10;6252:22;6244:67;;;;-1:-1:-1;;;6244:67:0;;;;;;;:::i;:::-;29185:16:::1;:24:::0;;-1:-1:-1;;29185:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29224:40:::1;::::0;29185:24:::1;29247:16:::0;;;10089:14:4;10082:22;10064:41;;29224:40:0::1;::::0;10052:2:4;10037:18;29224:40:0::1;;;;;;;29114:157:::0;:::o;27926:309::-;28038:11;;-1:-1:-1;;;;;28038:11:0;3691:10;-1:-1:-1;;;;;28022:27:0;;28014:36;;;;;;28079:23;;;-1:-1:-1;;;;;28079:23:0;;;28106:5;28060:43;;;:18;:43;;;;;;:51;;-1:-1:-1;;28060:51:0;;;;;;28121:48;;-1:-1:-1;;;;;;28121:48:0;;;;;;;;;;;28179:42;;;;;:49;;;;;-1:-1:-1;28179:49:0;;;27926:309::o;29481:122::-;-1:-1:-1;;;;;29577:13:0;;29536:4;29577:13;;;:6;:13;;;;;:19;29559:37;;:15;:37;:::i;15085:136::-;-1:-1:-1;;;;;15197:16:0;;15151:7;15197:16;;;:7;:16;;;;;;15177:37;;:19;:37::i;6335:145::-;6252:6;;-1:-1:-1;;;;;6252:6:0;3691:10;6252:22;6244:67;;;;-1:-1:-1;;;6244:67:0;;;;;;;:::i;:::-;6441:1:::1;6425:6:::0;;6404:40:::1;::::0;-1:-1:-1;;;;;6425:6:0;;::::1;::::0;6404:40:::1;::::0;6441:1;;6404:40:::1;6471:1;6454:19:::0;;-1:-1:-1;;;;;;6454:19:0::1;::::0;;6335:145::o;9628:225:2:-;9738:10;-1:-1:-1;;;;;9752:14:2;9738:28;;9730:72;;;;-1:-1:-1;;;9730:72:2;;15064:2:4;9730:72:2;;;15046:21:4;15103:2;15083:18;;;15076:30;15142:33;15122:18;;;15115:61;15193:18;;9730:72:2;15036:181:4;9730:72:2;9808:40;9826:9;9837:10;9808:17;:40::i;:::-;9628:225;;:::o;16611:173:0:-;16653:13;16700:15;;16682;:33;16678:79;;;-1:-1:-1;16731:15:0;;;;;;;;;;;;-1:-1:-1;;;16731:15:0;;;;;16611:173::o;16678:79::-;16773:4;16766:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16611:173;:::o;15227:164::-;15305:4;15321:42;3691:10;15345:9;15356:6;15321:9;:42::i;28556:354::-;6252:6;;-1:-1:-1;;;;;6252:6:0;3691:10;6252:22;6244:67;;;;-1:-1:-1;;;6244:67:0;;;;;;;:::i;:::-;28646:11:::1;::::0;:26:::1;::::0;28661:10:::1;28646:26;:::i;:::-;28628:15;:44;28624:280;;;28693:6;28688:206;28709:5;:12;28705:1;:16;28688:206;;;28762:13;::::0;28750:8;;-1:-1:-1;;;;;28762:13:0;;::::1;::::0;28750:5;;28756:1;;28750:8;::::1;;;-1:-1:-1::0;;;28750:8:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28750:25:0::1;;;:65;;;;-1:-1:-1::0;28799:15:0::1;::::0;28779:8;;-1:-1:-1;;;;;28799:15:0;;::::1;::::0;28779:5;;28785:1;;28779:8;::::1;;;-1:-1:-1::0;;;28779:8:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28779:36:0::1;;;28750:65;28746:134;;;28857:4;28839:5;:15;28845:5;28851:1;28845:8;;;;;;-1:-1:-1::0;;;28845:8:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;28839:15:0::1;-1:-1:-1::0;;;;;28839:15:0::1;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;28746:134;28723:3:::0;::::1;::::0;::::1;:::i;:::-;;;;28688:206;;28624:280;28556:354:::0;:::o;27005:915::-;6252:6;;-1:-1:-1;;;;;6252:6:0;3691:10;6252:22;6244:67;;;;-1:-1:-1;;;6244:67:0;;;;;;;:::i;:::-;27068:11:::1;::::0;-1:-1:-1;;;27068:11:0;::::1;;;27067:12;27059:47;;;::::0;-1:-1:-1;;;27059:47:0;;16235:2:4;27059:47:0::1;::::0;::::1;16217:21:4::0;16274:2;16254:18;;;16247:30;16313:25;16293:18;;;16286:53;16356:18;;27059:47:0::1;16207:173:4::0;27059:47:0::1;27226:15;:34:::0;;-1:-1:-1;;;;;;27226:34:0::1;27173:42;27226:34:::0;;::::1;::::0;;;27270:58:::1;27287:4;27173:42:::0;11815:12:::1;27270:8;:58::i;:::-;27372:16;-1:-1:-1::0;;;;;27372:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27354:56:0::1;;27419:4;27426:16;-1:-1:-1::0;;;;;27426:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27354:96;::::0;-1:-1:-1;;;;;;27354:96:0::1;::::0;;;;;;-1:-1:-1;;;;;8564:15:4;;;27354:96:0::1;::::0;::::1;8546:34:4::0;8616:15;;8596:18;;;8589:43;8481:18;;27354:96:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27338:13;:112:::0;;-1:-1:-1;;;;;;27338:112:0::1;-1:-1:-1::0;;;;;27338:112:0;;::::1;;::::0;;27460:15:::1;::::0;::::1;:31;27499:21;27530:4;27536:24;27530:4:::0;27536:9:::1;:24::i;:::-;27561:1;27563::::0;27565:7:::1;6168::::0;6194:6;-1:-1:-1;;;;;6194:6:0;;6130:77;27565:7:::1;27460:129;::::0;::::1;::::0;;;-1:-1:-1;;;;;;27460:129:0;;;-1:-1:-1;;;;;9671:15:4;;;27460:129:0::1;::::0;::::1;9653:34:4::0;9703:18;;;9696:34;;;;9746:18;;;9739:34;;;;9789:18;;;9782:34;9853:15;;;9832:19;;;9825:44;27573:15:0::1;9885:19:4::0;;;9878:35;9587:19;;27460:129:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;27615:18:0::1;27599:13;:34:::0;-1:-1:-1;27650:13:0::1;::::0;27681:15:::1;::::0;27643:71:::1;::::0;-1:-1:-1;;;27643:71:0;;-1:-1:-1;;;;;27681:15:0;;::::1;27643:71;::::0;::::1;8817:51:4::0;-1:-1:-1;;8884:18:4;;;8877:34;27650:13:0;::::1;::::0;27643:29:::1;::::0;8790:18:4;;27643:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27724:11:0::1;:18:::0;;-1:-1:-1;;;;27724:18:0::1;-1:-1:-1::0;;;27724:18:0::1;::::0;;27766:30:::1;:15;27785:10;27766:30;:::i;:::-;27752:11;:44:::0;-1:-1:-1;27820:15:0::1;27806:11;:29:::0;;;27860:12:::1;27845;:27:::0;27882:13:::1;:31:::0;27005:915::o;28401:145::-;28487:11;;-1:-1:-1;;;;;28487:11:0;3691:10;-1:-1:-1;;;;;28471:27:0;;28463:36;;;;;;-1:-1:-1;;;;;28509:22:0;28534:5;28509:22;;;:18;:22;;;;;:30;;-1:-1:-1;;28509:30:0;;;28401:145::o;29613:99::-;29691:13;;29658:4;;29681:24;;-1:-1:-1;;;;;29691:13:0;29681:9;:24::i;16795:330::-;-1:-1:-1;;;;;16887:19:0;;16879:68;;;;-1:-1:-1;;;16879:68:0;;15830:2:4;16879:68:0;;;15812:21:4;15869:2;15849:18;;;15842:30;15908:34;15888:18;;;15881:62;-1:-1:-1;;;15959:18:4;;;15952:34;16003:19;;16879:68:0;15802:226:4;16879:68:0;-1:-1:-1;;;;;16965:21:0;;16957:68;;;;-1:-1:-1;;;16957:68:0;;12729:2:4;16957:68:0;;;12711:21:4;12768:2;12748:18;;;12741:30;12807:34;12787:18;;;12780:62;-1:-1:-1;;;12858:18:4;;;12851:32;12900:19;;16957:68:0;12701:224:4;16957:68:0;-1:-1:-1;;;;;17035:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17086:32;;10262:25:4;;;17086:32:0;;10235:18:4;17086:32:0;;;;;;;16795:330;;;:::o;17135:4759::-;-1:-1:-1;;;;;17222:18:0;;17214:68;;;;-1:-1:-1;;;17214:68:0;;15424:2:4;17214:68:0;;;15406:21:4;15463:2;15443:18;;;15436:30;15502:34;15482:18;;;15475:62;-1:-1:-1;;;15553:18:4;;;15546:35;15598:19;;17214:68:0;15396:227:4;17214:68:0;-1:-1:-1;;;;;17300:16:0;;17292:64;;;;-1:-1:-1;;;17292:64:0;;11914:2:4;17292:64:0;;;11896:21:4;11953:2;11933:18;;;11926:30;11992:34;11972:18;;;11965:62;-1:-1:-1;;;12043:18:4;;;12036:33;12086:19;;17292:64:0;11886:225:4;17292:64:0;17383:1;17374:6;:10;17366:64;;;;-1:-1:-1;;;17366:64:0;;14654:2:4;17366:64:0;;;14636:21:4;14693:2;14673:18;;;14666:30;14732:34;14712:18;;;14705:62;-1:-1:-1;;;14783:18:4;;;14776:39;14832:19;;17366:64:0;14626:231:4;17366:64:0;6168:7;6194:6;-1:-1:-1;;;;;17444:15:0;;;6194:6;;17444:15;;;;:32;;-1:-1:-1;6168:7:0;6194:6;-1:-1:-1;;;;;17463:13:0;;;6194:6;;17463:13;;17444:32;17441:4239;;;-1:-1:-1;;;;;17514:11:0;;;;;;:5;:11;;;;;;;;17513:12;:26;;;;-1:-1:-1;;;;;;17530:9:0;;;;;;:5;:9;;;;;;;;17529:10;17513:26;17505:35;;;;;;17578:10;17571:18;;;;:6;:18;;;;;:25;;;;;17567:97;;17637:12;;;;;;;;-1:-1:-1;17637:12:0;;;17644:4;17637:12;;;;;;;17623:10;17616:18;;:6;:18;;;;;;;:33;;;;;;;;;;-1:-1:-1;;17616:33:0;;;;;;;;;;17567:97;17742:13;;17696:2;;-1:-1:-1;;;;;17734:21:0;;;17742:13;;17734:21;:55;;;;-1:-1:-1;17773:15:0;;-1:-1:-1;;;;;17759:30:0;;;17773:15;;17759:30;;17734:55;:82;;;;-1:-1:-1;;;;;;17794:22:0;;;;;;:18;:22;;;;;;;;17793:23;17734:82;17731:2303;;;17844:11;;-1:-1:-1;;;17844:11:0;;;;17836:48;;;;-1:-1:-1;;;17836:48:0;;16587:2:4;17836:48:0;;;16569:21:4;16626:2;16606:18;;;16599:30;16665:26;16645:18;;;16638:54;16709:18;;17836:48:0;16559:174:4;17836:48:0;17921:12;;:16;;17936:1;17921:16;:::i;:::-;17906:12;:31;17903:1607;;;-1:-1:-1;17996:8:0;:10;;17972:2;;17996:8;:10;;;:::i;:::-;;;;;;17903:1607;;;18052:11;;:25;;18067:9;18052:25;:::i;:::-;18034:15;:43;18031:1479;;;18123:15;;18105;:33;18101:1222;;;18166:15;;;;;;;;;;;;;-1:-1:-1;;;18166:15:0;;;;;;;;;:4;;:15;:::i;:::-;;18218:2;18207:13;;18031:1479;;18101:1222;18300:31;;-1:-1:-1;;;18300:31:0;;;7794:26:4;7836:12;;18300:31:0;;;;;;;;;;;;18290:42;;;;;;18280:4;18263:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;18253:33;;;;;;:79;18249:1074;;;-1:-1:-1;18371:5:0;18031:1479;;18249:1074;18456:31;;-1:-1:-1;;;18456:31:0;;;8061:26:4;8103:12;;18456:31:0;;;;;;;;;;;;18446:42;;;;;;18436:4;18419:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;18409:33;;;;;;:79;18405:918;;;18516:30;18549:29;18560:17;;18549:6;:10;;:29;;;;:::i;:::-;18663:13;;18516:62;;-1:-1:-1;18604:19:0;;18626:64;;18653:36;;18682:6;;18653:24;;-1:-1:-1;;;;;18663:13:0;18653:9;:24::i;:::-;:28;;:36::i;:::-;18626:22;;:26;:64::i;:::-;18604:86;;18735:2;18720:11;:17;18716:461;;18780:1;18769:12;;18716:461;;;18833:2;18818:11;:17;18814:363;;18878:1;18867:12;;18814:363;;;18930:2;18916:11;:16;18912:265;;18975:1;18964:12;;18912:265;;;19028:2;19013:11;:17;19009:168;;19073:1;19062:12;;19009:168;;;19148:2;19137:13;;19009:168;19202:10;;;;:::i;:::-;;;;18405:918;;18031:1479;;18405:918;19278:18;;:22;;19299:1;19278:22;:::i;:::-;19267:33;;18031:1479;;;19369:11;;:25;;19384:9;19369:25;:::i;:::-;19351:15;:43;19347:163;;;-1:-1:-1;19429:2:0;19347:163;;;-1:-1:-1;19489:2:0;19347:163;19555:18;19556:8;19570:2;19555:14;:18::i;:::-;19545:7;:28;19602:25;19624:2;19603:15;:8;19616:1;19603:12;:15::i;:::-;19602:21;;:25::i;:::-;19591:8;:36;19665:16;;;;19662:358;;;19722:15;19708:11;;:29;19705:297;;;19783:13;;19773:6;:23;;19765:32;;;;;;-1:-1:-1;;;;;19831:10:0;;;;;;:6;:10;;;;;:16;19850:15;-1:-1:-1;19823:81:0;;;;-1:-1:-1;;;19823:81:0;;13132:2:4;19823:81:0;;;13114:21:4;13171:2;13151:18;;;13144:30;13210:34;13190:18;;;13183:62;-1:-1:-1;;;13261:18:4;;;13254:32;13303:19;;19823:81:0;13104:224:4;19823:81:0;19949:30;:15;19968:10;19949:30;:::i;:::-;-1:-1:-1;;;;;19930:10:0;;;;;;:6;:10;;;;;:49;19705:297;20047:28;20078:24;20096:4;20078:9;:24::i;:::-;20141:6;;20047:55;;-1:-1:-1;20141:6:0;;;;;20140:7;:32;;;;-1:-1:-1;20159:13:0;;-1:-1:-1;;;;;20151:21:0;;;20159:13;;20151:21;;20140:32;:47;;;;-1:-1:-1;20176:11:0;;-1:-1:-1;;;20176:11:0;;;;20140:47;20137:1533;;;20254:30;20287:29;20298:17;;20287:6;:10;;:29;;;;:::i;:::-;20393:13;;20254:62;;-1:-1:-1;20334:19:0;;20356:64;;20383:36;;20412:6;;20383:24;;-1:-1:-1;;;;;20393:13:0;20383:9;:24::i;20356:64::-;20448:1;20438:7;:11;20334:86;-1:-1:-1;20503:2:0;20488:17;;20484:329;;20540:2;20529:13;;20484:329;;;20586:2;20571:11;:17;20567:246;;20623:2;20612:13;;20567:246;;;20654:18;:11;20670:1;20654:15;:18::i;:::-;:23;20650:163;;20712:13;;;:::i;:::-;;;;20701:24;;20650:163;;;20783:11;20772:22;;20650:163;20871:7;;20858:21;;:8;;:12;:21::i;:::-;20847:8;:32;20971:24;;20968:309;;21055:13;;21045:40;;21081:3;;21045:31;;21074:1;;21045:24;;-1:-1:-1;;;;;21055:13:0;21045:9;:24::i;:::-;:28;;:31::i;:40::-;21022:20;:63;21019:180;;;21146:13;;21136:40;;21172:3;;21136:31;;21165:1;;21136:24;;-1:-1:-1;;;;;21146:13:0;21136:9;:24::i;:40::-;21113:63;;21019:180;21220:38;21237:20;21220:16;:38::i;:::-;21341:21;;21331:7;;:31;;;;:::i;:::-;21299:29;;-1:-1:-1;;;21299:29:0;;21322:4;21299:29;;;8272:51:4;21299:4:0;-1:-1:-1;;;;;21299:14:0;;;;8245:18:4;;21299:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;21295:126;;;21386:16;:14;:16::i;:::-;21438:28;:26;:28::i;:::-;21514:21;21556:22;;21553:103;;21602:35;21615:21;21602:12;:35::i;:::-;20137:1533;;;;17441:4239;;;-1:-1:-1;;;;;21722:24:0;;21689:12;21722:24;;;:18;:24;;;;;;21704:4;;21722:24;;;:50;;-1:-1:-1;;;;;;21750:22:0;;;;;;:18;:22;;;;;;;;21722:50;:68;;;-1:-1:-1;21776:14:0;;;;;;;21722:68;21719:112;;;-1:-1:-1;21815:5:0;21719:112;21849:38;21864:4;21869:2;21872:6;21879:7;21849:14;:38::i;:::-;17135:4759;;;;:::o;4722:186::-;4808:7;4843:12;4835:6;;;;4827:29;;;;-1:-1:-1;;;4827:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4866:9:0;4878:5;4882:1;4878;:5;:::i;:::-;4866:17;4722:186;-1:-1:-1;;;;;4722:186:0:o;16023:250::-;16090:7;16128;;16117;:18;;16109:73;;;;-1:-1:-1;;;16109:73:0;;12318:2:4;16109:73:0;;;12300:21:4;12357:2;12337:18;;;12330:30;12396:34;12376:18;;;12369:62;-1:-1:-1;;;12447:18:4;;;12440:40;12497:19;;16109:73:0;12290:232:4;16109:73:0;16192:19;16215:10;:8;:10::i;:::-;16192:33;-1:-1:-1;16242:24:0;:7;16192:33;16242:11;:24::i;:::-;16235:31;16023:250;-1:-1:-1;;;16023:250:0:o;23112:588::-;23239:33;;;;;;;10472:25:4;;;10513:18;;;10506:34;;;23239:33:0;;;;;;;;;10445:18:4;;;;23239:33:0;;;23229:44;;;;;23221:59;;23277:3;;23221:59;:::i;:::-;:63;;23283:1;23221:63;:::i;:::-;23206:12;:78;;;23314:2;-1:-1:-1;23295:316:0;;;23332:20;;;;;;;;;;;;;-1:-1:-1;;;23332:20:0;;;;;;;;;:4;;:20;:::i;:::-;;23295:316;;;23388:2;23373:12;;:17;23369:242;;;23406:19;;;;;;;;;;;;;-1:-1:-1;;;23406:19:0;;;;;;;;;:4;;:19;:::i;:::-;-1:-1:-1;23460:12:0;;:20;;23477:2;23460:16;:20::i;:::-;23439:18;:41;23369:242;;;23516:2;23501:12;;:17;23497:114;;;23534:20;;;;;;;;;;;;;-1:-1:-1;;;23534:20:0;;;;;;;;;:4;;:20;:::i;23497:114::-;23585:15;;;;;;;;;;;;;-1:-1:-1;;;23585:15:0;;;;;;;;;:4;;:15;:::i;:::-;;23497:114;23638:28;:15;23656:10;23638:28;:::i;:::-;23620:15;:46;-1:-1:-1;;23692:1:0;23676:13;:17;23112:588::o;4914:238::-;4972:7;4994:6;4991:44;;-1:-1:-1;5023:1:0;5016:8;;4991:44;5044:9;5056:5;5060:1;5056;:5;:::i;:::-;5044:17;-1:-1:-1;5088:1:0;5079:5;5083:1;5044:17;5079:5;:::i;:::-;:10;5071:56;;;;-1:-1:-1;;;5071:56:0;;13891:2:4;5071:56:0;;;13873:21:4;13930:2;13910:18;;;13903:30;13969:34;13949:18;;;13942:62;-1:-1:-1;;;14020:18:4;;;14013:31;14061:19;;5071:56:0;13863:223:4;4401:175:0;4459:7;;4490:5;4494:1;4490;:5;:::i;:::-;4478:17;;4518:1;4513;:6;;4505:46;;;;-1:-1:-1;;;4505:46:0;;13535:2:4;4505:46:0;;;13517:21:4;13574:2;13554:18;;;13547:30;13613:29;13593:18;;;13586:57;13660:18;;4505:46:0;13507:177:4;5158:130:0;5216:7;5242:39;5246:1;5249;5242:39;;;;;;;;;;;;;;;;;:3;:39::i;5485:128::-;5543:7;5569:37;5573:1;5576;5569:37;;;;;;;;;;;;;;;;;:3;:37::i;4582:134::-;4640:7;4666:43;4670:1;4673;4666:43;;;;;;;;;;;;;;;;;:3;:43::i;21900:471::-;13672:6;:13;;-1:-1:-1;;13672:13:0;;;;;22001:16:::1;::::0;;13672:6;22001:16;;;;;::::1;::::0;;-1:-1:-1;;22001:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;22001:16:0::1;21977:40;;22045:4;22027;22032:1;22027:7;;;;;;-1:-1:-1::0;;;22027:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;22027:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;22070:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22070:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;22027:7;;22070:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22060:4;22065:1;22060:7;;;;;;-1:-1:-1::0;;;22060:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;22060:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;22134:15:::1;::::0;22102:62:::1;::::0;22119:4:::1;::::0;22134:15:::1;22152:11:::0;22102:8:::1;:62::i;:::-;22174:15;::::0;:190:::1;::::0;-1:-1:-1;;;22174:190:0;;-1:-1:-1;;;;;22174:15:0;;::::1;::::0;:66:::1;::::0;:190:::1;::::0;22254:11;;22174:15:::1;::::0;22294:4;;22320::::1;::::0;22339:15:::1;::::0;22174:190:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;13706:6:0;:14;;-1:-1:-1;;13706:14:0;;;-1:-1:-1;;;;21900:471:0:o;22377:729::-;13672:6;:13;;-1:-1:-1;;13672:13:0;;;;;22457:16:::1;::::0;;13672:6;22457:16;;;;;::::1;::::0;;-1:-1:-1;;22457:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;22493:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22493:22:0;;;;22433:40;;-1:-1:-1;;;;;;22493:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;22493:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22483:4;22488:1;22483:7;;;;;;-1:-1:-1::0;;;22483:7:0::1;;;;;;;;;;;;;;:32;-1:-1:-1::0;;;;;22483:32:0::1;;;-1:-1:-1::0;;;;;22483:32:0::1;;;::::0;::::1;22543:42;22525:4;22530:1;22525:7;;;;;;-1:-1:-1::0;;;22525:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;22525:61:0;;::::1;:7;::::0;;::::1;::::0;;;;;:61;22626:15:::1;::::0;22689:29:::1;::::0;-1:-1:-1;;;22689:29:0;;22712:4:::1;22689:29;::::0;::::1;8272:51:4::0;22606:17:0::1;::::0;22626:15;;::::1;::::0;:28:::1;::::0;22689:4:::1;:14:::0;;::::1;::::0;::::1;::::0;8245:18:4;;22689:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22679:7;;22655:21;;:31;;;;:::i;:::-;:63;;;;:::i;:::-;22720:4;22626:99;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;22626:99:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;22726:1;22626:102;;;;;;-1:-1:-1::0;;;22626:102:0::1;;;;;;;;;;;;;;;22606:122;;22767:9;22743:21;:33;22739:361;;;22792:15;::::0;-1:-1:-1;;;;;22792:15:0::1;:66;22866:9:::0;22792:15:::1;22944:4:::0;22974::::1;22998:24;:15;23018:3;22998:19;:24::i;:::-;22792:244;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23056:33;23073:9;23084:4;23056:33;;;;;;;:::i;:::-;;;;;;;;22739:361;-1:-1:-1::0;;13706:6:0;:14;;-1:-1:-1;;13706:14:0;;;22377:729::o;23706:321::-;23768:13;;:18;;;;:68;;-1:-1:-1;23809:13:0;;:26;;23825:10;23809:26;:::i;:::-;23790:15;:46;23768:68;23764:81;;;23706:321::o;23764:81::-;23891:7;;23859:29;;-1:-1:-1;;;23859:29:0;;23882:4;23859:29;;;8272:51:4;23859:4:0;-1:-1:-1;;;;;23859:14:0;;;;8245:18:4;;23859:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;23855:166;;;23930:35;23948:7;;23957;;23930:17;:35::i;:::-;23914:13;:51;23995:15;23979:13;:31;23855:166;23706:321::o;24033:155::-;24089:11;;-1:-1:-1;;;;;24089:11:0;:35;24110:13;:6;24121:1;24110:10;:13::i;:::-;24089:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24134:23:0;;-1:-1:-1;;;;;24134:23:0;:47;24167:13;:6;24178:1;24167:10;:13::i;:::-;24134:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24198:257;24309:7;24305:39;;24330:14;:12;:14::i;:::-;24354:44;24372:6;24380:9;24391:6;24354:17;:44::i;:::-;24412:7;24408:40;;24433:15;16546;;16536:7;:25;16582:16;;16571:8;:27;16493:112;25770:160;25811:7;25831:15;25848;25867:19;:17;:19::i;:::-;25830:56;;-1:-1:-1;25830:56:0;-1:-1:-1;25903:20:0;25830:56;;25903:11;:20::i;:::-;25896:27;;;;25770:160;:::o;5294:185::-;5380:7;5414:12;5407:5;5399:28;;;;-1:-1:-1;;;5399:28:0;;;;;;;;:::i;:::-;-1:-1:-1;5437:9:0;5449:5;5453:1;5449;:5;:::i;5619:163::-;5705:7;5740:12;5732:6;5724:29;;;;-1:-1:-1;;;5724:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5770:5:0;5774:1;5770;:5;:::i;:::-;5763:12;5619:163;-1:-1:-1;;;;5619:163:0:o;7741:1055:2:-;7845:17;7877:4;-1:-1:-1;;;;;7877:20:2;;7898:14;7914:4;7931:8;6598:1;7920:43;;;;;;;;10472:25:4;;;10528:2;10513:18;;10506:34;10460:2;10445:18;;10427:119;7920:43:2;;;;;;;;;;;;;7877:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8195:15:2;8279:16;;;:6;:16;;;;;;;;;1005:51:3;;;;;10782:25:4;;;10823:18;;;10816:34;;;8272:4:2;10866:18:4;;;10859:60;10935:18;;;;10928:34;;;1005:51:3;;;;;;;;;;10754:19:4;;;;1005:51:3;;;995:62;;;;;;;;;8726:16:2;;;;;;;:20;;8745:1;8726:20;:::i;:::-;8707:16;;;;:6;:16;;;;;:39;8759:32;8714:8;8783:7;1600:41:3;;;;;;;6389:19:4;;;;6424:12;;;6417:28;;;;1600:41:3;;;;;;;;;6461:12:4;;;;1600:41:3;;1590:52;;;;;;1443:204;16279::0;16324:7;;:12;:29;;;;-1:-1:-1;16340:8:0;;:13;16324:29;16321:41;;;16279:204::o;16321:41::-;16389:7;;;16371:15;:25;16425:8;;;16406:16;:27;-1:-1:-1;16443:11:0;;;;16464:12;16279:204::o;24461:482::-;24559:15;24576:23;24601:12;24615:23;24640:12;24654:13;24671:19;24682:7;24671:10;:19::i;:::-;-1:-1:-1;;;;;24718:15:0;;;;;;:7;:15;;;;;;24558:132;;-1:-1:-1;24558:132:0;;-1:-1:-1;24558:132:0;;-1:-1:-1;24558:132:0;-1:-1:-1;24558:132:0;-1:-1:-1;24558:132:0;-1:-1:-1;24718:28:0;;24558:132;24718:19;:28::i;:::-;-1:-1:-1;;;;;24700:15:0;;;;;;;:7;:15;;;;;;:46;;;;24777:18;;;;;;;:39;;24800:15;24777:22;:39::i;:::-;-1:-1:-1;;;;;24756:18:0;;;;;;:7;:18;;;;;:60;24828:16;24838:5;24828:9;:16::i;:::-;24854:23;24866:4;24872;24854:11;:23::i;:::-;24909:9;-1:-1:-1;;;;;24892:44:0;24901:6;-1:-1:-1;;;;;24892:44:0;;24920:15;24892:44;;;;10262:25:4;;10250:2;10235:18;;10217:76;24892:44:0;;;;;;;;24461:482;;;;;;;;;:::o;25936:250::-;26032:7;;25986;;;;11815:12;26097:20;26032:7;11815:12;26097:11;:20::i;:::-;26087:7;:30;26084:60;;;-1:-1:-1;;26127:7:0;;;11815:12;;-1:-1:-1;25936:250:0;-1:-1:-1;25936:250:0:o;26084:60::-;26162:7;;26171;;-1:-1:-1;25936:250:0;-1:-1:-1;25936:250:0:o;24949:463::-;25008:7;25017;25026;25035;25044;25053;25073:23;25098:12;25112:13;25129:39;25141:7;25150;;25159:8;;25129:11;:39::i;:::-;25072:96;;;;;;25178:19;25201:10;:8;:10::i;:::-;25178:33;;25222:15;25239:23;25264:12;25280:46;25292:7;25301:4;25307:5;25314:11;25280;:46::i;:::-;25221:105;;-1:-1:-1;25221:105:0;-1:-1:-1;25221:105:0;-1:-1:-1;25376:15:0;;-1:-1:-1;25393:4:0;;-1:-1:-1;25399:5:0;;-1:-1:-1;;;;;24949:463:0;;;;;;;:::o;26601:209::-;26653:19;26676:10;:8;:10::i;:::-;26653:33;-1:-1:-1;26696:13:0;26712:22;:5;26653:33;26712:9;:22::i;:::-;26786:4;26770:22;;;;:7;:22;;;;;;26696:38;;-1:-1:-1;26770:33:0;;26696:38;26770:26;:33::i;:::-;26761:4;26745:22;;;;:7;:22;;;;;:58;-1:-1:-1;;;26601:209:0:o;26816:144::-;26893:7;;:17;;26905:4;26893:11;:17::i;:::-;26883:7;:27;26933:10;;:20;;26948:4;26933:14;:20::i;:::-;26920:10;:33;-1:-1:-1;;26816:144:0:o;25418:346::-;25511:7;;;;25563:28;25587:3;25563:19;:7;25575:6;25563:11;:19::i;:28::-;25548:43;-1:-1:-1;25601:13:0;25617:29;25642:3;25617:20;:7;25629;25617:11;:20::i;:29::-;25601:45;-1:-1:-1;25656:23:0;25682:28;25601:45;25682:17;:7;25694:4;25682:11;:17::i;:::-;:21;;:28::i;:::-;25656:54;25745:4;;-1:-1:-1;25751:5:0;;-1:-1:-1;25418:346:0;;-1:-1:-1;;;;;25418:346:0:o;26192:403::-;26302:7;;;;26357:24;:7;26369:11;26357;:24::i;:::-;26339:42;-1:-1:-1;26391:12:0;26406:21;:4;26415:11;26406:8;:21::i;:::-;26391:36;-1:-1:-1;26437:13:0;26453:22;:5;26463:11;26453:9;:22::i;:::-;26437:38;-1:-1:-1;26485:23:0;26511:28;26437:38;26511:17;:7;26523:4;26511:11;:17::i;:28::-;26557:7;;;;-1:-1:-1;26583:4:0;;-1:-1:-1;26192:403:0;;-1:-1:-1;;;;;;;26192:403:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:257:4;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;812:398::-;880:6;888;941:2;929:9;920:7;916:23;912:32;909:2;;;962:6;954;947:22;909:2;1006:9;993:23;1025:31;1050:5;1025:31;:::i;:::-;1075:5;-1:-1:-1;1132:2:4;1117:18;;1104:32;1145:33;1104:32;1145:33;:::i;:::-;1197:7;1187:17;;;899:311;;;;;:::o;1215:466::-;1292:6;1300;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:2;;;1382:6;1374;1367:22;1329:2;1426:9;1413:23;1445:31;1470:5;1445:31;:::i;:::-;1495:5;-1:-1:-1;1552:2:4;1537:18;;1524:32;1565:33;1524:32;1565:33;:::i;:::-;1319:362;;1617:7;;-1:-1:-1;;;1671:2:4;1656:18;;;;1643:32;;1319:362::o;1686:325::-;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:2;;;1836:6;1828;1821:22;1783:2;1880:9;1867:23;1899:31;1924:5;1899:31;:::i;:::-;1949:5;2001:2;1986:18;;;;1973:32;;-1:-1:-1;;;1773:238:4:o;2016:1022::-;2100:6;2131:2;2174;2162:9;2153:7;2149:23;2145:32;2142:2;;;2195:6;2187;2180:22;2142:2;2240:9;2227:23;2273:18;2265:6;2262:30;2259:2;;;2310:6;2302;2295:22;2259:2;2338:22;;2391:4;2383:13;;2379:27;-1:-1:-1;2369:2:4;;2425:6;2417;2410:22;2369:2;2466;2453:16;2489:60;2505:43;2545:2;2505:43;:::i;:::-;2489:60;:::i;:::-;2571:3;2595:2;2590:3;2583:15;2623:2;2618:3;2614:12;2607:19;;2654:2;2650;2646:11;2702:7;2697:2;2691;2688:1;2684:10;2680:2;2676:19;2672:28;2669:41;2666:2;;;2728:6;2720;2713:22;2666:2;2755:6;2746:15;;2770:238;2784:2;2781:1;2778:9;2770:238;;;2855:3;2842:17;2872:31;2897:5;2872:31;:::i;:::-;2916:18;;2802:1;2795:9;;;;;2954:12;;;;2986;;2770:238;;;-1:-1:-1;3027:5:4;2111:927;-1:-1:-1;;;;;;;2111:927:4:o;3043:937::-;3138:6;3169:2;3212;3200:9;3191:7;3187:23;3183:32;3180:2;;;3233:6;3225;3218:22;3180:2;3271:9;3265:16;3304:18;3296:6;3293:30;3290:2;;;3341:6;3333;3326:22;3290:2;3369:22;;3422:4;3414:13;;3410:27;-1:-1:-1;3400:2:4;;3456:6;3448;3441:22;3400:2;3490;3484:9;3513:60;3529:43;3569:2;3529:43;:::i;3513:60::-;3595:3;3619:2;3614:3;3607:15;3647:2;3642:3;3638:12;3631:19;;3678:2;3674;3670:11;3726:7;3721:2;3715;3712:1;3708:10;3704:2;3700:19;3696:28;3693:41;3690:2;;;3752:6;3744;3737:22;3690:2;3779:6;3770:15;;3794:156;3808:2;3805:1;3802:9;3794:156;;;3865:10;;3853:23;;3826:1;3819:9;;;;;3896:12;;;;3928;;3794:156;;3985:251;4041:6;4094:2;4082:9;4073:7;4069:23;4065:32;4062:2;;;4115:6;4107;4100:22;4062:2;4159:9;4146:23;4178:28;4200:5;4178:28;:::i;4241:255::-;4308:6;4361:2;4349:9;4340:7;4336:23;4332:32;4329:2;;;4382:6;4374;4367:22;4329:2;4419:9;4413:16;4438:28;4460:5;4438:28;:::i;4501:258::-;4569:6;4577;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;4651:6;4643;4636:22;4598:2;-1:-1:-1;;4679:23:4;;;4749:2;4734:18;;;4721:32;;-1:-1:-1;4588:171:4:o;4764:194::-;4834:6;4887:2;4875:9;4866:7;4862:23;4858:32;4855:2;;;4908:6;4900;4893:22;4855:2;-1:-1:-1;4936:16:4;;4845:113;-1:-1:-1;4845:113:4:o;4963:316::-;5051:6;5059;5067;5120:2;5108:9;5099:7;5095:23;5091:32;5088:2;;;5141:6;5133;5126:22;5088:2;5175:9;5169:16;5159:26;;5225:2;5214:9;5210:18;5204:25;5194:35;;5269:2;5258:9;5254:18;5248:25;5238:35;;5078:201;;;;;:::o;5284:463::-;5337:3;5375:5;5369:12;5402:6;5397:3;5390:19;5428:4;5457:2;5452:3;5448:12;5441:19;;5494:2;5487:5;5483:14;5515:3;5527:195;5541:6;5538:1;5535:13;5527:195;;;5606:13;;-1:-1:-1;;;;;5602:39:4;5590:52;;5662:12;;;;5697:15;;;;5638:1;5556:9;5527:195;;;-1:-1:-1;5738:3:4;;5345:402;-1:-1:-1;;;;;5345:402:4:o;5752:475::-;5793:3;5831:5;5825:12;5858:6;5853:3;5846:19;5883:3;5895:162;5909:6;5906:1;5903:13;5895:162;;;5971:4;6027:13;;;6023:22;;6017:29;5999:11;;;5995:20;;5988:59;5924:12;5895:162;;;6075:6;6072:1;6069:13;6066:2;;;6141:3;6134:4;6125:6;6120:3;6116:16;6112:27;6105:40;6066:2;-1:-1:-1;6209:2:4;6188:15;-1:-1:-1;;6184:29:4;6175:39;;;;6216:4;6171:50;;5801:426;-1:-1:-1;;5801:426:4:o;6484:1103::-;6612:3;6641;6676:6;6670:13;6706:3;6728:1;6756:9;6752:2;6748:18;6738:28;;6816:2;6805:9;6801:18;6838;6828:2;;6882:4;6874:6;6870:17;6860:27;;6828:2;6908;6956;6948:6;6945:14;6925:18;6922:38;6919:2;;;-1:-1:-1;;;6983:33:4;;7039:4;7036:1;7029:15;7069:4;6990:3;7057:17;6919:2;7100:18;7127:104;;;;7245:1;7240:322;;;;7093:469;;7127:104;-1:-1:-1;;7160:24:4;;7148:37;;7205:16;;;;-1:-1:-1;7127:104:4;;7240:322;18801:4;18820:17;;;18870:4;18854:21;;7335:3;7351:165;7365:6;7362:1;7359:13;7351:165;;;7443:14;;7430:11;;;7423:35;7486:16;;;;7380:10;;7351:165;;;7355:3;;7545:6;7540:3;7536:16;7529:23;;7093:469;-1:-1:-1;7578:3:4;;6620:967;-1:-1:-1;;;;;;;;6620:967:4:o;8922:385::-;9154:1;9150;9145:3;9141:11;9137:19;9129:6;9125:32;9114:9;9107:51;9194:6;9189:2;9178:9;9174:18;9167:34;9237:2;9232;9221:9;9217:18;9210:30;9088:4;9257:44;9297:2;9286:9;9282:18;9274:6;9257:44;:::i;10973:510::-;11244:6;11233:9;11226:25;11287:3;11282:2;11271:9;11267:18;11260:31;11207:4;11308:57;11360:3;11349:9;11345:19;11337:6;11308:57;:::i;:::-;-1:-1:-1;;;;;11401:32:4;;;;11396:2;11381:18;;11374:60;-1:-1:-1;11465:2:4;11450:18;11443:34;11300:65;11216:267;-1:-1:-1;;11216:267:4:o;11488:219::-;11637:2;11626:9;11619:21;11600:4;11657:44;11697:2;11686:9;11682:18;11674:6;11657:44;:::i;14091:356::-;14293:2;14275:21;;;14312:18;;;14305:30;14371:34;14366:2;14351:18;;14344:62;14438:2;14423:18;;14265:182::o;16920:332::-;17127:6;17116:9;17109:25;17170:2;17165;17154:9;17150:18;17143:30;17090:4;17190:56;17242:2;17231:9;17227:18;17219:6;17190:56;:::i;17510:582::-;17809:6;17798:9;17791:25;17852:6;17847:2;17836:9;17832:18;17825:34;17895:3;17890:2;17879:9;17875:18;17868:31;17772:4;17916:57;17968:3;17957:9;17953:19;17945:6;17916:57;:::i;:::-;-1:-1:-1;;;;;18009:32:4;;;;18004:2;17989:18;;17982:60;-1:-1:-1;18073:3:4;18058:19;18051:35;17908:65;17781:311;-1:-1:-1;;;17781:311:4:o;18286:275::-;18357:2;18351:9;18422:2;18403:13;;-1:-1:-1;;18399:27:4;18387:40;;18457:18;18442:34;;18478:22;;;18439:62;18436:2;;;18504:18;;:::i;:::-;18540:2;18533:22;18331:230;;-1:-1:-1;18331:230:4:o;18566:183::-;18626:4;18659:18;18651:6;18648:30;18645:2;;;18681:18;;:::i;:::-;-1:-1:-1;18726:1:4;18722:14;18738:4;18718:25;;18635:114::o;18886:128::-;18926:3;18957:1;18953:6;18950:1;18947:13;18944:2;;;18963:18;;:::i;:::-;-1:-1:-1;18999:9:4;;18934:80::o;19019:120::-;19059:1;19085;19075:2;;19090:18;;:::i;:::-;-1:-1:-1;19124:9:4;;19065:74::o;19144:168::-;19184:7;19250:1;19246;19242:6;19238:14;19235:1;19232:21;19227:1;19220:9;19213:17;19209:45;19206:2;;;19257:18;;:::i;:::-;-1:-1:-1;19297:9:4;;19196:116::o;19317:125::-;19357:4;19385:1;19382;19379:8;19376:2;;;19390:18;;:::i;:::-;-1:-1:-1;19427:9:4;;19366:76::o;19447:380::-;19526:1;19522:12;;;;19569;;;19590:2;;19644:4;19636:6;19632:17;19622:27;;19590:2;19697;19689:6;19686:14;19666:18;19663:38;19660:2;;;19743:10;19738:3;19734:20;19731:1;19724:31;19778:4;19775:1;19768:15;19806:4;19803:1;19796:15;19660:2;;19502:325;;;:::o;19832:135::-;19871:3;-1:-1:-1;;19892:17:4;;19889:2;;;19912:18;;:::i;:::-;-1:-1:-1;19959:1:4;19948:13;;19879:88::o;19972:112::-;20004:1;20030;20020:2;;20035:18;;:::i;:::-;-1:-1:-1;20069:9:4;;20010:74::o;20089:127::-;20150:10;20145:3;20141:20;20138:1;20131:31;20181:4;20178:1;20171:15;20205:4;20202:1;20195:15;20221:127;20282:10;20277:3;20273:20;20270:1;20263:31;20313:4;20310:1;20303:15;20337:4;20334:1;20327:15;20353:127;20414:10;20409:3;20405:20;20402:1;20395:31;20445:4;20442:1;20435:15;20469:4;20466:1;20459:15;20485:131;-1:-1:-1;;;;;20560:31:4;;20550:42;;20540:2;;20606:1;20603;20596:12;20621:118;20707:5;20700:13;20693:21;20686:5;20683:32;20673:2;;20729:1;20726;20719:12

Swarm Source

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