ETH Price: $3,366.54 (-2.26%)
Gas: 2 Gwei

Token

MARBLEPRIX7 (MARBLEX7)
 

Overview

Max Total Supply

500,000,000 MARBLEX7

Holders

145

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,706,250 MARBLEX7

Value
$0.00
0xfeaa3b8579d18d1cac9cfdc9f8bc965fc311394a
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:
MarblePrix

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-24
*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
 pragma solidity 0.8.16;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }
}

contract Ownable is Context {
    address private _owner;

    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() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

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

contract MarblePrix is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public developmentAddress;
    address public marketingAddress;
    address public liquidityAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyDevelopmentFee;
    uint256 public buyLiquidityFee;
    uint256 public buyMarketingFee;

    uint256 public sellTotalFees;
    uint256 public sellDevelopmentFee;
    uint256 public sellLiquidityFee;
    uint256 public sellMarketingFee;

    uint256 public tokensForDevelopment;
    uint256 public tokensForLiquidity;
    uint256 public tokensForMarketing;

    uint256 public lpWithdrawRequestTimestamp;
    uint256 public lpWithdrawRequestDuration = 30 days;
    bool public lpWithdrawRequestPending;
    uint256 public lpPercToWithDraw;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading();
    event RemovedLimits();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedDevelopmentAddress(address indexed newWallet);

    event UpdatedMarketingAddress(address indexed newWallet);

    event UpdatedLiquidityAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TransferForeignToken(address token, uint256 amount);

    event RequestedLPWithdraw();
    event WithdrewLPForMigration();
    event CanceledLpWithdrawRequest();

    constructor() ERC20("MARBLEPRIX7", "MARBLEX7") {
        
        address newOwner = msg.sender; // can leave alone if owner is deployer.
        
        IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506

        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
 
        uint256 totalSupply = 5 * 1e8 * 1e18;
        
        maxBuyAmount = totalSupply * 10 / 1000;
        maxSellAmount = totalSupply * 10 / 1000;
        maxWalletAmount = totalSupply * 10 / 1000;
        swapTokensAtAmount = totalSupply * 25 / 100000; // 0.025% swap amount

        buyDevelopmentFee = 300;
        buyLiquidityFee = 10000;
        buyMarketingFee = 800;
        buyTotalFees = buyDevelopmentFee + buyLiquidityFee + buyMarketingFee;

        sellDevelopmentFee = 300;
        sellLiquidityFee = 100;
        sellMarketingFee = 800;
        sellTotalFees = sellDevelopmentFee + sellLiquidityFee + sellMarketingFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        developmentAddress = address(newOwner);
        marketingAddress = address(newOwner);
        liquidityAddress = address(newOwner);
        
        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        emit EnabledTrading();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        emit RemovedLimits();
    }
    
   
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }
    
    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }
    
    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set max wallet amount lower than 0.5%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "arrays must be the same length");
        require(wallets.length < 200, "Can only airdrop 200 wallets per txn due to gas limits"); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input.
        for(uint256 i = 0; i < wallets.length; i++){
            address wallet = wallets[i];
            uint256 amount = amountsInTokens[i]*1e18;
            _transfer(msg.sender, wallet, amount);
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        
        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(uint256 _developmentFee, uint256 _liquidityFee, uint256 _marketingFee) external onlyOwner {
        buyDevelopmentFee = _developmentFee;
        buyLiquidityFee = _liquidityFee;
        buyMarketingFee = _marketingFee;
        buyTotalFees = buyDevelopmentFee + buyLiquidityFee + buyMarketingFee;
        require(buyTotalFees <= 1500, "Must keep fees at 15% or less");
    }

    function updateSellFees(uint256 _developmentFee, uint256 _liquidityFee, uint256 _marketingFee) external onlyOwner {
        sellDevelopmentFee = _developmentFee;
        sellLiquidityFee = _liquidityFee;
        sellMarketingFee = _marketingFee;
        sellTotalFees = sellDevelopmentFee + sellLiquidityFee + sellMarketingFee;
        require(sellTotalFees <= 1500, "Must keep fees at 15% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");
        
        
        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }
                
                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number - 4 && _holderLastTransferTimestamp[to] < block.number - 4, "_transfer:: Transfer Delay enabled.  Try again later.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                        require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        uint256 penaltyAmount = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // bot/sniper penalty.  Tokens get transferred to marketing wallet to allow potential refund.
            if(tradingActiveBlock >= block.number + 1 && automatedMarketMakerPairs[from]){
                penaltyAmount = amount * 99 / 100;
                super._transfer(from, developmentAddress, penaltyAmount);
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /10000;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForDevelopment += fees * sellDevelopmentFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees / 10000;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDevelopment += fees * buyDevelopmentFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees + penaltyAmount;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(liquidityAddress),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForDevelopment + tokensForMarketing;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        
        swapTokensForEth(contractBalance - liquidityTokens); 
        
        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForDevelopment = ethBalance * tokensForDevelopment / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForMarketing = ethBalance * tokensForMarketing / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForDevelopment + ethForMarketing;
            
        tokensForLiquidity = 0;
        tokensForDevelopment = 0;
        tokensForMarketing = 0;
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(marketingAddress).call{value: ethForMarketing}("");

        (success,) = address(developmentAddress).call{value: address(this).balance}("");
    }

    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function setDevelopmentAddress(address _developmentAddress) external onlyOwner {
        require(_developmentAddress != address(0), "_developmentAddress address cannot be 0");
        developmentAddress = payable(_developmentAddress);
        emit UpdatedDevelopmentAddress(_developmentAddress);
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        require(_marketingAddress != address(0), "_marketingAddress address cannot be 0");
        marketingAddress = payable(_marketingAddress);
        emit UpdatedMarketingAddress(_marketingAddress);
    }

     function setLiquidityAddress(address _liquidityAddress) external onlyOwner {
        require(_liquidityAddress != address(0), "address cannot be 0");
        liquidityAddress = payable(_liquidityAddress);
        emit UpdatedLiquidityAddress(_liquidityAddress);
    }

    function requestToWithdrawLP(uint256 percToWithdraw) external onlyOwner {
        require(!lpWithdrawRequestPending, "Cannot request again until first request is over.");
        require(percToWithdraw <= 100 && percToWithdraw > 0, "Need to set between 1-100%");
        lpWithdrawRequestTimestamp = block.timestamp;
        lpWithdrawRequestPending = true;
        lpPercToWithDraw = percToWithdraw;
        emit RequestedLPWithdraw();
    }

    function nextAvailableLpWithdrawDate() public view returns (uint256){
        if(lpWithdrawRequestPending){
            return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
        }
        else {
            return 0;  // 0 means no open requests
        }
    }

    function withdrawRequestedLP() external onlyOwner {
        require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
        lpWithdrawRequestTimestamp = 0;
        lpWithdrawRequestPending = false;

        uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
        
        lpPercToWithDraw = 0;

        IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw);
    }

    function cancelLPWithdrawRequest() external onlyOwner {
        lpWithdrawRequestPending = false;
        lpPercToWithDraw = 0;
        lpWithdrawRequestTimestamp = 0;
        emit CanceledLpWithdrawRequest();
    }
}

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":[],"name":"CanceledLpWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestedLPWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedDevelopmentAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedLiquidityAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedMarketingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[],"name":"WithdrewLPForMigration","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInTokens","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelLPWithdrawRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percToWithdraw","type":"uint256"}],"name":"requestToWithdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentAddress","type":"address"}],"name":"setDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600e55600f805462ffffff191660019081179091556011805460ff1916909117905562278d00601e553480156200003c57600080fd5b506040518060400160405280600b81526020016a4d4152424c45505249583760a81b815250604051806040016040528060088152602001674d4152424c45583760c01b81525081600390816200009391906200082b565b506004620000a282826200082b565b5050506000620000b76200042360201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062004421833981519152908290a35033737a250d5630b4cf539739df2c5dacb4c659f2488d6200011781600162000427565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001889190620008f7565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fc9190620008f7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002709190620008f7565b6001600160a01b031660a08190526200028b9060016200048a565b6b019d971e4fe8401e740000006103e8620002a882600a6200093f565b620002b4919062000961565b6006556103e8620002c782600a6200093f565b620002d3919062000961565b6007556103e8620002e682600a6200093f565b620002f2919062000961565b600855620186a0620003068260196200093f565b62000312919062000961565b600a5561012c601381905561271060148190556103206015819055916200033a919062000984565b62000346919062000984565b60125561012c6017819055606460188190556103206019819055916200036d919062000984565b62000379919062000984565b6016556200038983600162000427565b6200039630600162000427565b620003a561dead600162000427565b620003b2836001620004f6565b620003bf306001620004f6565b620003ce61dead6001620004f6565b600b80546001600160a01b0385166001600160a01b03199182168117909255600c8054821683179055600d805490911690911790556200040f8382620005a4565b6200041a8362000689565b505050620009a0565b3390565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055620004ba828262000427565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005455760405162461bcd60e51b815260206004820181905260248201526000805160206200440183398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005fc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200053c565b806002600082825462000610919062000984565b90915550506001600160a01b038216600090815260208190526040812080548392906200063f90849062000984565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620006d45760405162461bcd60e51b815260206004820181905260248201526000805160206200440183398151915260448201526064016200053c565b6001600160a01b0381166200073b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200053c565b6005546040516001600160a01b038084169216906000805160206200442183398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007b157607f821691505b602082108103620007d257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200082657600081815260208120601f850160051c81016020861015620008015750805b601f850160051c820191505b8181101562000822578281556001016200080d565b5050505b505050565b81516001600160401b0381111562000847576200084762000786565b6200085f816200085884546200079c565b84620007d8565b602080601f8311600181146200089757600084156200087e5750858301515b600019600386901b1c1916600185901b17855562000822565b600085815260208120601f198616915b82811015620008c857888601518255948401946001909101908401620008a7565b5085821015620008e75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200090a57600080fd5b81516001600160a01b03811681146200092257600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156200095c576200095c62000929565b500290565b6000826200097f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200099a576200099a62000929565b92915050565b60805160a0516139ee62000a1360003960008181610632015281816112b401528181611428015281816114d3015281816119ce01526125e60152600081816104b1015281816125a90152818161318b0152818161324401528181613280015281816132fa015261336201526139ee6000f3fe6080604052600436106103e85760003560e01c806388e765ff11610208578063c18bc19511610118578063e884f260116100ab578063f11a24d31161007a578063f11a24d314610b57578063f2fde38b14610b6d578063f5648a4f14610b8d578063f637434214610ba2578063fd361d0e14610bb857600080fd5b8063e884f26014610b00578063ee40166e14610b15578063ee44b44e14610b2b578063ef8700e514610b4157600080fd5b8063d85ba063116100e7578063d85ba06314610a6e578063dc3f0d0f14610a84578063dd62ed3e14610aa4578063e2f4560514610aea57600080fd5b8063c18bc195146109ff578063c7c61e2c14610a1f578063c876d0b914610a34578063d257b34f14610a4e57600080fd5b8063a5ece9411161019b578063b62496f51161016a578063b62496f514610950578063bbc0c74214610980578063befd2fac1461099f578063c0246668146109bf578063c17b5b8c146109df57600080fd5b8063a5ece941146108e4578063a9059cbb14610904578063aa4bde2814610924578063b20414111461093a57600080fd5b806392136913116101d7578063921369131461087957806395d89b411461088f5780639a7a23d6146108a4578063a457c2d7146108c457600080fd5b806388e765ff146108105780638a8c523c146108265780638da5cb5b1461083b578063906e9dd01461085957600080fd5b806349bd5a5e11610303578063712c298511610296578063763cef4911610265578063763cef491461078f578063783102eb146107a45780637bce5a04146107ba5780638095d564146107d05780638366e79a146107f057600080fd5b8063712c298514610730578063715018a614610745578063751039fc1461075a5780637571336a1461076f57600080fd5b806366d602ae116102d257806366d602ae146106ae5780636a486a8e146106c45780636ddd1713146106da57806370a08231146106fa57600080fd5b806349bd5a5e146106205780634a62bb6514610654578063525fa81f1461066e578063638b1b141461068e57600080fd5b80631f3fed8f1161037b5780632be32b611161034a5780632be32b61146105a4578063313ce567146105c45780633221c93f146105e0578063395093511461060057600080fd5b80631f3fed8f1461052c5780632307b4411461054257806323b872dd1461056457806329b1c15c1461058457600080fd5b80631694505e116103b75780631694505e1461049f57806318160ddd146104eb57806318a94cf1146105005780631a8145bb1461051657600080fd5b8063058054c9146103f457806306fdde031461041d578063095ea7b31461043f57806310d5de531461046f57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601d5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bd2565b60405161041491906133da565b34801561044b57600080fd5b5061045f61045a366004613440565b610c64565b6040519015158152602001610414565b34801561047b57600080fd5b5061045f61048a36600461346c565b60226020526000908152604090205460ff1681565b3480156104ab57600080fd5b506104d37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610414565b3480156104f757600080fd5b5060025461040a565b34801561050c57600080fd5b5061040a60175481565b34801561052257600080fd5b5061040a601b5481565b34801561053857600080fd5b5061040a601c5481565b34801561054e57600080fd5b5061056261055d366004613566565b610c7b565b005b34801561057057600080fd5b5061045f61057f366004613628565b610def565b34801561059057600080fd5b5061056261059f36600461346c565b610e99565b3480156105b057600080fd5b506105626105bf366004613669565b610f72565b3480156105d057600080fd5b5060405160128152602001610414565b3480156105ec57600080fd5b50600d546104d3906001600160a01b031681565b34801561060c57600080fd5b5061045f61061b366004613440565b61107f565b34801561062c57600080fd5b506104d37f000000000000000000000000000000000000000000000000000000000000000081565b34801561066057600080fd5b50600f5461045f9060ff1681565b34801561067a57600080fd5b5061056261068936600461346c565b6110bb565b34801561069a57600080fd5b50600b546104d3906001600160a01b031681565b3480156106ba57600080fd5b5061040a60075481565b3480156106d057600080fd5b5061040a60165481565b3480156106e657600080fd5b50600f5461045f9062010000900460ff1681565b34801561070657600080fd5b5061040a61071536600461346c565b6001600160a01b031660009081526020819052604090205490565b34801561073c57600080fd5b5061040a61117b565b34801561075157600080fd5b506105626111a4565b34801561076657600080fd5b50610562611218565b34801561077b57600080fd5b5061056261078a366004613690565b611283565b34801561079b57600080fd5b5061056261136e565b3480156107b057600080fd5b5061040a60205481565b3480156107c657600080fd5b5061040a60155481565b3480156107dc57600080fd5b506105626107eb3660046136c9565b61154c565b3480156107fc57600080fd5b5061045f61080b3660046136f5565b6115f0565b34801561081c57600080fd5b5061040a60065481565b34801561083257600080fd5b506105626117f9565b34801561084757600080fd5b506005546001600160a01b03166104d3565b34801561086557600080fd5b5061056261087436600461346c565b6118bb565b34801561088557600080fd5b5061040a60195481565b34801561089b57600080fd5b50610432611993565b3480156108b057600080fd5b506105626108bf366004613690565b6119a2565b3480156108d057600080fd5b5061045f6108df366004613440565b611a7d565b3480156108f057600080fd5b50600c546104d3906001600160a01b031681565b34801561091057600080fd5b5061045f61091f366004613440565b611b16565b34801561093057600080fd5b5061040a60085481565b34801561094657600080fd5b5061040a60135481565b34801561095c57600080fd5b5061045f61096b36600461346c565b60236020526000908152604090205460ff1681565b34801561098c57600080fd5b50600f5461045f90610100900460ff1681565b3480156109ab57600080fd5b506105626109ba366004613669565b611b23565b3480156109cb57600080fd5b506105626109da366004613690565b611c59565b3480156109eb57600080fd5b506105626109fa3660046136c9565b611ce2565b348015610a0b57600080fd5b50610562610a1a366004613669565b611d86565b348015610a2b57600080fd5b50610562611e8f565b348015610a4057600080fd5b5060115461045f9060ff1681565b348015610a5a57600080fd5b50610562610a69366004613669565b611ef8565b348015610a7a57600080fd5b5061040a60125481565b348015610a9057600080fd5b50610562610a9f366004613669565b612043565b348015610ab057600080fd5b5061040a610abf3660046136f5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610af657600080fd5b5061040a600a5481565b348015610b0c57600080fd5b5061056261214a565b348015610b2157600080fd5b5061040a600e5481565b348015610b3757600080fd5b5061040a601e5481565b348015610b4d57600080fd5b5061040a601a5481565b348015610b6357600080fd5b5061040a60145481565b348015610b7957600080fd5b50610562610b8836600461346c565b612180565b348015610b9957600080fd5b5061056261226b565b348015610bae57600080fd5b5061040a60185481565b348015610bc457600080fd5b50601f5461045f9060ff1681565b606060038054610be190613723565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613723565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c713384846122e2565b5060015b92915050565b6005546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610ca59061375d565b60405180910390fd5b8051825114610cff5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ca5565b60c8825110610d6f5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ca5565b60005b8251811015610dea576000838281518110610d8f57610d8f613792565b602002602001015190506000838381518110610dad57610dad613792565b6020026020010151670de0b6b3a7640000610dc891906137be565b9050610dd5338383612406565b50508080610de2906137dd565b915050610d72565b505050565b6000610dfc848484612406565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ca5565b610e8e85338584036122e2565b506001949350505050565b6005546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b038116610f295760405162461bcd60e51b815260206004820152602760248201527f5f646576656c6f706d656e744164647265737320616464726573732063616e6e60448201526606f7420626520360cc1b6064820152608401610ca5565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517e9301a7a046a65d0304006b0bfee72798e7e8c804b21a3d33e0838d87680e9d90600090a250565b6005546001600160a01b03163314610f9c5760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e8610fb160025490565b610fbc9060016137be565b610fc691906137f6565b610fd091906137f6565b8110156110315760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610ca5565b61104381670de0b6b3a76400006137be565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c719185906110b6908690613818565b6122e2565b6005546001600160a01b031633146110e55760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0381166111315760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610ca5565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b601f5460009060ff161561119e57601e54601d546111999190613818565b905090565b50600090565b6005546001600160a01b031633146111ce5760405162461bcd60e51b8152600401610ca59061375d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112425760405162461bcd60e51b8152600401610ca59061375d565b600f805460ff199081169091556011805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112ad5760405162461bcd60e51b8152600401610ca59061375d565b80611343577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036113435760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ca5565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113985760405162461bcd60e51b8152600401610ca59061375d565b6113a061117b565b42101580156113b6575060006113b461117b565b115b6113fb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ca5565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149b919061382b565b6114a591906137be565b6114af91906137f6565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115489190613844565b5050565b6005546001600160a01b031633146115765760405162461bcd60e51b8152600401610ca59061375d565b601383905560148290556015819055806115908385613818565b61159a9190613818565b60128190556105dc1015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ca5565b6005546000906001600160a01b0316331461161d5760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0383166116735760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ca5565b306001600160a01b038416036116cb5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610ca5565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611712573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611736919061382b565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190613844565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146118235760405162461bcd60e51b8152600401610ca59061375d565b600f54610100900460ff161561187b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ca5565b600f805462ffff0019166201010017905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b6005546001600160a01b031633146118e55760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0381166119495760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610ca5565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610be190613723565b6005546001600160a01b031633146119cc5760405162461bcd60e51b8152600401610ca59061375d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611a735760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ca5565b6115488282612d07565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611aff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ca5565b611b0c33858584036122e2565b5060019392505050565b6000610c71338484612406565b6005546001600160a01b03163314611b4d5760405162461bcd60e51b8152600401610ca59061375d565b601f5460ff1615611bba5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ca5565b60648111158015611bcb5750600081115b611c175760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ca5565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611c835760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610ca59061375d565b60178390556018829055601981905580611d268385613818565b611d309190613818565b60168190556105dc1015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ca5565b6005546001600160a01b03163314611db05760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e8611dc560025490565b611dd09060056137be565b611dda91906137f6565b611de491906137f6565b811015611e485760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ca5565b611e5a81670de0b6b3a76400006137be565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611074565b6005546001600160a01b03163314611eb95760405162461bcd60e51b8152600401610ca59061375d565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6005546001600160a01b03163314611f225760405162461bcd60e51b8152600401610ca59061375d565b620186a0611f2f60025490565b611f3a9060016137be565b611f4491906137f6565b811015611fb15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ca5565b6103e8611fbd60025490565b611fc89060016137be565b611fd291906137f6565b81111561203e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ca5565b600a55565b6005546001600160a01b0316331461206d5760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e861208260025490565b61208d9060016137be565b61209791906137f6565b6120a191906137f6565b8110156121035760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610ca5565b61211581670de0b6b3a76400006137be565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611074565b6005546001600160a01b031633146121745760405162461bcd60e51b8152600401610ca59061375d565b6011805460ff19169055565b6005546001600160a01b031633146121aa5760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b03811661220f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146122955760405162461bcd60e51b8152600401610ca59061375d565b604051600090339047908381818185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b50505050565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca5565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ca5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242c5760405162461bcd60e51b8152600401610ca590613861565b6001600160a01b0382166124525760405162461bcd60e51b8152600401610ca5906138a6565b600081116124a25760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ca5565b600f5460ff1615612976576005546001600160a01b038481169116148015906124d957506005546001600160a01b03838116911614155b80156124ed57506001600160a01b03821615155b801561250457506001600160a01b03821661dead14155b1561297657600f54610100900460ff1661259c576001600160a01b03831660009081526021602052604090205460ff168061255757506001600160a01b03821660009081526021602052604090205460ff165b61259c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ca5565b60115460ff16156126f8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561261b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156126f85761262b6004436138e9565b32600090815260106020526040902054108015612669575061264e6004436138e9565b6001600160a01b038316600090815260106020526040902054105b6126d35760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ca5565b3260009081526010602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526023602052604090205460ff16801561273957506001600160a01b03821660009081526022602052604090205460ff16155b15612815576006548111156127a15760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ca5565b6008546001600160a01b0383166000908152602081905260409020546127c79083613818565b11156128105760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b612976565b6001600160a01b03821660009081526023602052604090205460ff16801561285657506001600160a01b03831660009081526022602052604090205460ff16155b156128c0576007548111156128105760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ca5565b6001600160a01b03821660009081526022602052604090205460ff1615801561290257506001600160a01b03831660009081526022602052604090205460ff16155b15612976576008546001600160a01b03831660009081526020819052604090205461292d9083613818565b11156129765760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b30600090815260208190526040902054600a54811080159081906129a25750600f5462010000900460ff165b80156129b1575060095460ff16155b80156129d657506001600160a01b03851660009081526023602052604090205460ff16155b80156129fb57506001600160a01b03851660009081526021602052604090205460ff16155b8015612a2057506001600160a01b03841660009081526021602052604090205460ff16155b15612a45576009805460ff19166001179055612a3a612d71565b6009805460ff191690555b6001600160a01b03851660009081526021602052604090205460019060ff1680612a8757506001600160a01b03851660009081526021602052604090205460ff165b15612a90575060005b6000808215612cf257612aa4436001613818565b600e5410158015612acd57506001600160a01b03881660009081526023602052604090205460ff165b15612b09576064612adf8760636137be565b612ae991906137f6565b600b54909150612b049089906001600160a01b031683612f7c565b612cca565b6001600160a01b03871660009081526023602052604090205460ff168015612b3357506000601654115b15612bec5761271060165487612b4991906137be565b612b5391906137f6565b915060165460185483612b6691906137be565b612b7091906137f6565b601b6000828254612b819190613818565b9091555050601654601754612b9690846137be565b612ba091906137f6565b601a6000828254612bb19190613818565b9091555050601654601954612bc690846137be565b612bd091906137f6565b601c6000828254612be19190613818565b90915550612cca9050565b6001600160a01b03881660009081526023602052604090205460ff168015612c1657506000601254115b15612cca5761271060125487612c2c91906137be565b612c3691906137f6565b915060125460145483612c4991906137be565b612c5391906137f6565b601b6000828254612c649190613818565b9091555050601254601354612c7990846137be565b612c8391906137f6565b601a6000828254612c949190613818565b9091555050601254601554612ca990846137be565b612cb391906137f6565b601c6000828254612cc49190613818565b90915550505b8115612cdb57612cdb883084612f7c565b612ce58183613818565b612cef90876138e9565b95505b612cfd888888612f7c565b5050505050505050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055612d3582826130d1565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601c54601a54601b54612d989190613818565b612da29190613818565b9050811580612daf575080155b15612db8575050565b600a8054612dc5916137be565b821115612ddc57600a8054612dd9916137be565b91505b600080600283601b5486612df091906137be565b612dfa91906137f6565b612e0491906137f6565b9050612e18612e1382866138e9565b613134565b601b5447908190600090612e2e906002906137f6565b612e3890876138e9565b601a54612e4590856137be565b612e4f91906137f6565b905060006002601b54612e6291906137f6565b612e6c90886138e9565b601c54612e7990866137be565b612e8391906137f6565b9050612e8f8183613818565b612e9990846138e9565b6000601b819055601a819055601c5592508415801590612eb95750600083115b15612ec857612ec885846132f4565b600c546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612f15576040519150601f19603f3d011682016040523d82523d6000602084013e612f1a565b606091505b5050600b546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114612f6a576040519150601f19603f3d011682016040523d82523d6000602084013e612f6f565b606091505b5050505050505050505050565b6001600160a01b038316612fa25760405162461bcd60e51b8152600401610ca590613861565b6001600160a01b038216612fc85760405162461bcd60e51b8152600401610ca5906138a6565b6001600160a01b038316600090815260208190526040902054818110156130405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ca5565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613077908490613818565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c391815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316957613169613792565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320b91906138fc565b8160018151811061321e5761321e613792565b60200260200101906001600160a01b031690816001600160a01b031681525050613269307f0000000000000000000000000000000000000000000000000000000000000000846122e2565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906132be908590600090869030904290600401613919565b600060405180830381600087803b1580156132d857600080fd5b505af11580156132ec573d6000803e3d6000fd5b505050505050565b61331f307f0000000000000000000000000000000000000000000000000000000000000000846122e2565b600d5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af11580156133ae573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133d3919061398a565b5050505050565b600060208083528351808285015260005b81811015613407578581018301518582016040015282016133eb565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461343d57600080fd5b50565b6000806040838503121561345357600080fd5b823561345e81613428565b946020939093013593505050565b60006020828403121561347e57600080fd5b813561348981613428565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134cf576134cf613490565b604052919050565b600067ffffffffffffffff8211156134f1576134f1613490565b5060051b60200190565b600082601f83011261350c57600080fd5b8135602061352161351c836134d7565b6134a6565b82815260059290921b8401810191818101908684111561354057600080fd5b8286015b8481101561355b5780358352918301918301613544565b509695505050505050565b6000806040838503121561357957600080fd5b823567ffffffffffffffff8082111561359157600080fd5b818501915085601f8301126135a557600080fd5b813560206135b561351c836134d7565b82815260059290921b840181019181810190898411156135d457600080fd5b948201945b838610156135fb5785356135ec81613428565b825294820194908201906135d9565b9650508601359250508082111561361157600080fd5b5061361e858286016134fb565b9150509250929050565b60008060006060848603121561363d57600080fd5b833561364881613428565b9250602084013561365881613428565b929592945050506040919091013590565b60006020828403121561367b57600080fd5b5035919050565b801515811461343d57600080fd5b600080604083850312156136a357600080fd5b82356136ae81613428565b915060208301356136be81613682565b809150509250929050565b6000806000606084860312156136de57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561370857600080fd5b823561371381613428565b915060208301356136be81613428565b600181811c9082168061373757607f821691505b60208210810361375757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137d8576137d86137a8565b500290565b6000600182016137ef576137ef6137a8565b5060010190565b60008261381357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c7557610c756137a8565b60006020828403121561383d57600080fd5b5051919050565b60006020828403121561385657600080fd5b815161348981613682565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610c7557610c756137a8565b60006020828403121561390e57600080fd5b815161348981613428565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139695784516001600160a01b031683529383019391830191600101613944565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561399f57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220654e97b0a8d30d4c2718bfabc963d95f9d52f855afe884ddda60ea2b69f80ff264736f6c634300081000334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103e85760003560e01c806388e765ff11610208578063c18bc19511610118578063e884f260116100ab578063f11a24d31161007a578063f11a24d314610b57578063f2fde38b14610b6d578063f5648a4f14610b8d578063f637434214610ba2578063fd361d0e14610bb857600080fd5b8063e884f26014610b00578063ee40166e14610b15578063ee44b44e14610b2b578063ef8700e514610b4157600080fd5b8063d85ba063116100e7578063d85ba06314610a6e578063dc3f0d0f14610a84578063dd62ed3e14610aa4578063e2f4560514610aea57600080fd5b8063c18bc195146109ff578063c7c61e2c14610a1f578063c876d0b914610a34578063d257b34f14610a4e57600080fd5b8063a5ece9411161019b578063b62496f51161016a578063b62496f514610950578063bbc0c74214610980578063befd2fac1461099f578063c0246668146109bf578063c17b5b8c146109df57600080fd5b8063a5ece941146108e4578063a9059cbb14610904578063aa4bde2814610924578063b20414111461093a57600080fd5b806392136913116101d7578063921369131461087957806395d89b411461088f5780639a7a23d6146108a4578063a457c2d7146108c457600080fd5b806388e765ff146108105780638a8c523c146108265780638da5cb5b1461083b578063906e9dd01461085957600080fd5b806349bd5a5e11610303578063712c298511610296578063763cef4911610265578063763cef491461078f578063783102eb146107a45780637bce5a04146107ba5780638095d564146107d05780638366e79a146107f057600080fd5b8063712c298514610730578063715018a614610745578063751039fc1461075a5780637571336a1461076f57600080fd5b806366d602ae116102d257806366d602ae146106ae5780636a486a8e146106c45780636ddd1713146106da57806370a08231146106fa57600080fd5b806349bd5a5e146106205780634a62bb6514610654578063525fa81f1461066e578063638b1b141461068e57600080fd5b80631f3fed8f1161037b5780632be32b611161034a5780632be32b61146105a4578063313ce567146105c45780633221c93f146105e0578063395093511461060057600080fd5b80631f3fed8f1461052c5780632307b4411461054257806323b872dd1461056457806329b1c15c1461058457600080fd5b80631694505e116103b75780631694505e1461049f57806318160ddd146104eb57806318a94cf1146105005780631a8145bb1461051657600080fd5b8063058054c9146103f457806306fdde031461041d578063095ea7b31461043f57806310d5de531461046f57600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061040a601d5481565b6040519081526020015b60405180910390f35b34801561042957600080fd5b50610432610bd2565b60405161041491906133da565b34801561044b57600080fd5b5061045f61045a366004613440565b610c64565b6040519015158152602001610414565b34801561047b57600080fd5b5061045f61048a36600461346c565b60226020526000908152604090205460ff1681565b3480156104ab57600080fd5b506104d37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610414565b3480156104f757600080fd5b5060025461040a565b34801561050c57600080fd5b5061040a60175481565b34801561052257600080fd5b5061040a601b5481565b34801561053857600080fd5b5061040a601c5481565b34801561054e57600080fd5b5061056261055d366004613566565b610c7b565b005b34801561057057600080fd5b5061045f61057f366004613628565b610def565b34801561059057600080fd5b5061056261059f36600461346c565b610e99565b3480156105b057600080fd5b506105626105bf366004613669565b610f72565b3480156105d057600080fd5b5060405160128152602001610414565b3480156105ec57600080fd5b50600d546104d3906001600160a01b031681565b34801561060c57600080fd5b5061045f61061b366004613440565b61107f565b34801561062c57600080fd5b506104d37f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff81565b34801561066057600080fd5b50600f5461045f9060ff1681565b34801561067a57600080fd5b5061056261068936600461346c565b6110bb565b34801561069a57600080fd5b50600b546104d3906001600160a01b031681565b3480156106ba57600080fd5b5061040a60075481565b3480156106d057600080fd5b5061040a60165481565b3480156106e657600080fd5b50600f5461045f9062010000900460ff1681565b34801561070657600080fd5b5061040a61071536600461346c565b6001600160a01b031660009081526020819052604090205490565b34801561073c57600080fd5b5061040a61117b565b34801561075157600080fd5b506105626111a4565b34801561076657600080fd5b50610562611218565b34801561077b57600080fd5b5061056261078a366004613690565b611283565b34801561079b57600080fd5b5061056261136e565b3480156107b057600080fd5b5061040a60205481565b3480156107c657600080fd5b5061040a60155481565b3480156107dc57600080fd5b506105626107eb3660046136c9565b61154c565b3480156107fc57600080fd5b5061045f61080b3660046136f5565b6115f0565b34801561081c57600080fd5b5061040a60065481565b34801561083257600080fd5b506105626117f9565b34801561084757600080fd5b506005546001600160a01b03166104d3565b34801561086557600080fd5b5061056261087436600461346c565b6118bb565b34801561088557600080fd5b5061040a60195481565b34801561089b57600080fd5b50610432611993565b3480156108b057600080fd5b506105626108bf366004613690565b6119a2565b3480156108d057600080fd5b5061045f6108df366004613440565b611a7d565b3480156108f057600080fd5b50600c546104d3906001600160a01b031681565b34801561091057600080fd5b5061045f61091f366004613440565b611b16565b34801561093057600080fd5b5061040a60085481565b34801561094657600080fd5b5061040a60135481565b34801561095c57600080fd5b5061045f61096b36600461346c565b60236020526000908152604090205460ff1681565b34801561098c57600080fd5b50600f5461045f90610100900460ff1681565b3480156109ab57600080fd5b506105626109ba366004613669565b611b23565b3480156109cb57600080fd5b506105626109da366004613690565b611c59565b3480156109eb57600080fd5b506105626109fa3660046136c9565b611ce2565b348015610a0b57600080fd5b50610562610a1a366004613669565b611d86565b348015610a2b57600080fd5b50610562611e8f565b348015610a4057600080fd5b5060115461045f9060ff1681565b348015610a5a57600080fd5b50610562610a69366004613669565b611ef8565b348015610a7a57600080fd5b5061040a60125481565b348015610a9057600080fd5b50610562610a9f366004613669565b612043565b348015610ab057600080fd5b5061040a610abf3660046136f5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610af657600080fd5b5061040a600a5481565b348015610b0c57600080fd5b5061056261214a565b348015610b2157600080fd5b5061040a600e5481565b348015610b3757600080fd5b5061040a601e5481565b348015610b4d57600080fd5b5061040a601a5481565b348015610b6357600080fd5b5061040a60145481565b348015610b7957600080fd5b50610562610b8836600461346c565b612180565b348015610b9957600080fd5b5061056261226b565b348015610bae57600080fd5b5061040a60185481565b348015610bc457600080fd5b50601f5461045f9060ff1681565b606060038054610be190613723565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0d90613723565b8015610c5a5780601f10610c2f57610100808354040283529160200191610c5a565b820191906000526020600020905b815481529060010190602001808311610c3d57829003601f168201915b5050505050905090565b6000610c713384846122e2565b5060015b92915050565b6005546001600160a01b03163314610cae5760405162461bcd60e51b8152600401610ca59061375d565b60405180910390fd5b8051825114610cff5760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610ca5565b60c8825110610d6f5760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203230302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610ca5565b60005b8251811015610dea576000838281518110610d8f57610d8f613792565b602002602001015190506000838381518110610dad57610dad613792565b6020026020010151670de0b6b3a7640000610dc891906137be565b9050610dd5338383612406565b50508080610de2906137dd565b915050610d72565b505050565b6000610dfc848484612406565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ca5565b610e8e85338584036122e2565b506001949350505050565b6005546001600160a01b03163314610ec35760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b038116610f295760405162461bcd60e51b815260206004820152602760248201527f5f646576656c6f706d656e744164647265737320616464726573732063616e6e60448201526606f7420626520360cc1b6064820152608401610ca5565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517e9301a7a046a65d0304006b0bfee72798e7e8c804b21a3d33e0838d87680e9d90600090a250565b6005546001600160a01b03163314610f9c5760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e8610fb160025490565b610fbc9060016137be565b610fc691906137f6565b610fd091906137f6565b8110156110315760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b6064820152608401610ca5565b61104381670de0b6b3a76400006137be565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c719185906110b6908690613818565b6122e2565b6005546001600160a01b031633146110e55760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0381166111315760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610ca5565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f217742673c85d2f459a37c99960c860122cdadf529374b41418d2718cae7726f90600090a250565b601f5460009060ff161561119e57601e54601d546111999190613818565b905090565b50600090565b6005546001600160a01b031633146111ce5760405162461bcd60e51b8152600401610ca59061375d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112425760405162461bcd60e51b8152600401610ca59061375d565b600f805460ff199081169091556011805490911690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112ad5760405162461bcd60e51b8152600401610ca59061375d565b80611343577f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff6001600160a01b0316826001600160a01b0316036113435760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610ca5565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113985760405162461bcd60e51b8152600401610ca59061375d565b6113a061117b565b42101580156113b6575060006113b461117b565b115b6113fb5760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ca5565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff6001600160a01b0316906370a0823190602401602060405180830381865afa158015611477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149b919061382b565b6114a591906137be565b6114af91906137f6565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff6001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115489190613844565b5050565b6005546001600160a01b031633146115765760405162461bcd60e51b8152600401610ca59061375d565b601383905560148290556015819055806115908385613818565b61159a9190613818565b60128190556105dc1015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ca5565b6005546000906001600160a01b0316331461161d5760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0383166116735760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ca5565b306001600160a01b038416036116cb5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610ca5565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611712573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611736919061382b565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190613844565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b031633146118235760405162461bcd60e51b8152600401610ca59061375d565b600f54610100900460ff161561187b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610ca5565b600f805462ffff0019166201010017905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b6005546001600160a01b031633146118e55760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b0381166119495760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610ca5565b600c80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610be190613723565b6005546001600160a01b031633146119cc5760405162461bcd60e51b8152600401610ca59061375d565b7f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff6001600160a01b0316826001600160a01b031603611a735760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ca5565b6115488282612d07565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611aff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ca5565b611b0c33858584036122e2565b5060019392505050565b6000610c71338484612406565b6005546001600160a01b03163314611b4d5760405162461bcd60e51b8152600401610ca59061375d565b601f5460ff1615611bba5760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ca5565b60648111158015611bcb5750600081115b611c175760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ca5565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611c835760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610ca59061375d565b60178390556018829055601981905580611d268385613818565b611d309190613818565b60168190556105dc1015610dea5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610ca5565b6005546001600160a01b03163314611db05760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e8611dc560025490565b611dd09060056137be565b611dda91906137f6565b611de491906137f6565b811015611e485760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610ca5565b611e5a81670de0b6b3a76400006137be565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001611074565b6005546001600160a01b03163314611eb95760405162461bcd60e51b8152600401610ca59061375d565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6005546001600160a01b03163314611f225760405162461bcd60e51b8152600401610ca59061375d565b620186a0611f2f60025490565b611f3a9060016137be565b611f4491906137f6565b811015611fb15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ca5565b6103e8611fbd60025490565b611fc89060016137be565b611fd291906137f6565b81111561203e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610ca5565b600a55565b6005546001600160a01b0316331461206d5760405162461bcd60e51b8152600401610ca59061375d565b670de0b6b3a76400006103e861208260025490565b61208d9060016137be565b61209791906137f6565b6120a191906137f6565b8110156121035760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b6064820152608401610ca5565b61211581670de0b6b3a76400006137be565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001611074565b6005546001600160a01b031633146121745760405162461bcd60e51b8152600401610ca59061375d565b6011805460ff19169055565b6005546001600160a01b031633146121aa5760405162461bcd60e51b8152600401610ca59061375d565b6001600160a01b03811661220f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146122955760405162461bcd60e51b8152600401610ca59061375d565b604051600090339047908381818185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b50505050565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ca5565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ca5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242c5760405162461bcd60e51b8152600401610ca590613861565b6001600160a01b0382166124525760405162461bcd60e51b8152600401610ca5906138a6565b600081116124a25760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ca5565b600f5460ff1615612976576005546001600160a01b038481169116148015906124d957506005546001600160a01b03838116911614155b80156124ed57506001600160a01b03821615155b801561250457506001600160a01b03821661dead14155b1561297657600f54610100900460ff1661259c576001600160a01b03831660009081526021602052604090205460ff168061255757506001600160a01b03821660009081526021602052604090205460ff165b61259c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ca5565b60115460ff16156126f8577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03161415801561261b57507f0000000000000000000000007874f1958f98ada4033ecdf8c3c14c8a6338cfff6001600160a01b0316826001600160a01b031614155b156126f85761262b6004436138e9565b32600090815260106020526040902054108015612669575061264e6004436138e9565b6001600160a01b038316600090815260106020526040902054105b6126d35760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610ca5565b3260009081526010602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526023602052604090205460ff16801561273957506001600160a01b03821660009081526022602052604090205460ff16155b15612815576006548111156127a15760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610ca5565b6008546001600160a01b0383166000908152602081905260409020546127c79083613818565b11156128105760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b612976565b6001600160a01b03821660009081526023602052604090205460ff16801561285657506001600160a01b03831660009081526022602052604090205460ff16155b156128c0576007548111156128105760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610ca5565b6001600160a01b03821660009081526022602052604090205460ff1615801561290257506001600160a01b03831660009081526022602052604090205460ff16155b15612976576008546001600160a01b03831660009081526020819052604090205461292d9083613818565b11156129765760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610ca5565b30600090815260208190526040902054600a54811080159081906129a25750600f5462010000900460ff165b80156129b1575060095460ff16155b80156129d657506001600160a01b03851660009081526023602052604090205460ff16155b80156129fb57506001600160a01b03851660009081526021602052604090205460ff16155b8015612a2057506001600160a01b03841660009081526021602052604090205460ff16155b15612a45576009805460ff19166001179055612a3a612d71565b6009805460ff191690555b6001600160a01b03851660009081526021602052604090205460019060ff1680612a8757506001600160a01b03851660009081526021602052604090205460ff165b15612a90575060005b6000808215612cf257612aa4436001613818565b600e5410158015612acd57506001600160a01b03881660009081526023602052604090205460ff165b15612b09576064612adf8760636137be565b612ae991906137f6565b600b54909150612b049089906001600160a01b031683612f7c565b612cca565b6001600160a01b03871660009081526023602052604090205460ff168015612b3357506000601654115b15612bec5761271060165487612b4991906137be565b612b5391906137f6565b915060165460185483612b6691906137be565b612b7091906137f6565b601b6000828254612b819190613818565b9091555050601654601754612b9690846137be565b612ba091906137f6565b601a6000828254612bb19190613818565b9091555050601654601954612bc690846137be565b612bd091906137f6565b601c6000828254612be19190613818565b90915550612cca9050565b6001600160a01b03881660009081526023602052604090205460ff168015612c1657506000601254115b15612cca5761271060125487612c2c91906137be565b612c3691906137f6565b915060125460145483612c4991906137be565b612c5391906137f6565b601b6000828254612c649190613818565b9091555050601254601354612c7990846137be565b612c8391906137f6565b601a6000828254612c949190613818565b9091555050601254601554612ca990846137be565b612cb391906137f6565b601c6000828254612cc49190613818565b90915550505b8115612cdb57612cdb883084612f7c565b612ce58183613818565b612cef90876138e9565b95505b612cfd888888612f7c565b5050505050505050565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055612d3582826130d1565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3060009081526020819052604081205490506000601c54601a54601b54612d989190613818565b612da29190613818565b9050811580612daf575080155b15612db8575050565b600a8054612dc5916137be565b821115612ddc57600a8054612dd9916137be565b91505b600080600283601b5486612df091906137be565b612dfa91906137f6565b612e0491906137f6565b9050612e18612e1382866138e9565b613134565b601b5447908190600090612e2e906002906137f6565b612e3890876138e9565b601a54612e4590856137be565b612e4f91906137f6565b905060006002601b54612e6291906137f6565b612e6c90886138e9565b601c54612e7990866137be565b612e8391906137f6565b9050612e8f8183613818565b612e9990846138e9565b6000601b819055601a819055601c5592508415801590612eb95750600083115b15612ec857612ec885846132f4565b600c546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612f15576040519150601f19603f3d011682016040523d82523d6000602084013e612f1a565b606091505b5050600b546040519197506001600160a01b0316904790600081818185875af1925050503d8060008114612f6a576040519150601f19603f3d011682016040523d82523d6000602084013e612f6f565b606091505b5050505050505050505050565b6001600160a01b038316612fa25760405162461bcd60e51b8152600401610ca590613861565b6001600160a01b038216612fc85760405162461bcd60e51b8152600401610ca5906138a6565b6001600160a01b038316600090815260208190526040902054818110156130405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ca5565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613077908490613818565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130c391815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260226020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316957613169613792565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320b91906138fc565b8160018151811061321e5761321e613792565b60200260200101906001600160a01b031690816001600160a01b031681525050613269307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122e2565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906132be908590600090869030904290600401613919565b600060405180830381600087803b1580156132d857600080fd5b505af11580156132ec573d6000803e3d6000fd5b505050505050565b61331f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122e2565b600d5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af11580156133ae573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133d3919061398a565b5050505050565b600060208083528351808285015260005b81811015613407578581018301518582016040015282016133eb565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461343d57600080fd5b50565b6000806040838503121561345357600080fd5b823561345e81613428565b946020939093013593505050565b60006020828403121561347e57600080fd5b813561348981613428565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134cf576134cf613490565b604052919050565b600067ffffffffffffffff8211156134f1576134f1613490565b5060051b60200190565b600082601f83011261350c57600080fd5b8135602061352161351c836134d7565b6134a6565b82815260059290921b8401810191818101908684111561354057600080fd5b8286015b8481101561355b5780358352918301918301613544565b509695505050505050565b6000806040838503121561357957600080fd5b823567ffffffffffffffff8082111561359157600080fd5b818501915085601f8301126135a557600080fd5b813560206135b561351c836134d7565b82815260059290921b840181019181810190898411156135d457600080fd5b948201945b838610156135fb5785356135ec81613428565b825294820194908201906135d9565b9650508601359250508082111561361157600080fd5b5061361e858286016134fb565b9150509250929050565b60008060006060848603121561363d57600080fd5b833561364881613428565b9250602084013561365881613428565b929592945050506040919091013590565b60006020828403121561367b57600080fd5b5035919050565b801515811461343d57600080fd5b600080604083850312156136a357600080fd5b82356136ae81613428565b915060208301356136be81613682565b809150509250929050565b6000806000606084860312156136de57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561370857600080fd5b823561371381613428565b915060208301356136be81613428565b600181811c9082168061373757607f821691505b60208210810361375757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137d8576137d86137a8565b500290565b6000600182016137ef576137ef6137a8565b5060010190565b60008261381357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c7557610c756137a8565b60006020828403121561383d57600080fd5b5051919050565b60006020828403121561385657600080fd5b815161348981613682565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610c7557610c756137a8565b60006020828403121561390e57600080fd5b815161348981613428565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139695784516001600160a01b031683529383019391830191600101613944565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561399f57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220654e97b0a8d30d4c2718bfabc963d95f9d52f855afe884ddda60ea2b69f80ff264736f6c63430008100033

Deployed Bytecode Sourcemap

9440:19441:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10736:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;10736:41:0;;;;;;;;4078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4992:169::-;;;;;;;;;;-1:-1:-1;4992:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;4992:169:0;1205:187:1;11069:64:0;;;;;;;;;;-1:-1:-1;11069:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9595:43;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1831:32:1;;;1813:51;;1801:2;1786:18;9595:43:0;1649:221:1;4399:108:0;;;;;;;;;;-1:-1:-1;4487:12:0;;4399:108;;10494:33;;;;;;;;;;;;;;;;10654;;;;;;;;;;;;;;;;10694;;;;;;;;;;;;;;;;16366:617;;;;;;;;;;-1:-1:-1;16366:617:0;;;;;:::i;:::-;;:::i;:::-;;5169:492;;;;;;;;;;-1:-1:-1;5169:492:0;;;;;:::i;:::-;;:::i;26513:305::-;;;;;;;;;;-1:-1:-1;26513:305:0;;;;;:::i;:::-;;:::i;14876:269::-;;;;;;;;;;-1:-1:-1;14876:269:0;;;;;:::i;:::-;;:::i;4298:93::-;;;;;;;;;;-1:-1:-1;4298:93:0;;4381:2;5150:36:1;;5138:2;5123:18;4298:93:0;5008:184:1;9840:31:0;;;;;;;;;;-1:-1:-1;9840:31:0;;;;-1:-1:-1;;;;;9840:31:0;;;5669:215;;;;;;;;;;-1:-1:-1;5669:215:0;;;;;:::i;:::-;;:::i;9645:38::-;;;;;;;;;;;;;;;9959:33;;;;;;;;;;-1:-1:-1;9959:33:0;;;;;;;;27124:271;;;;;;;;;;-1:-1:-1;27124:271:0;;;;;:::i;:::-;;:::i;9762:33::-;;;;;;;;;;-1:-1:-1;9762:33:0;;;;-1:-1:-1;;;;;9762:33:0;;;9521:28;;;;;;;;;;;;;;;;10459;;;;;;;;;;;;;;;;10039:31;;;;;;;;;;-1:-1:-1;10039:31:0;;;;;;;;;;;4515:127;;;;;;;;;;-1:-1:-1;4515:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;4616:18:0;4589:7;4616:18;;;;;;;;;;;;4515:127;27860:281;;;;;;;;;;;;;:::i;8159:150::-;;;;;;;;;;;;;:::i;14542:154::-;;;;;;;;;;;;;:::i;16995:267::-;;;;;;;;;;-1:-1:-1;16995:267:0;;;;;:::i;:::-;;:::i;28149:501::-;;;;;;;;;;;;;:::i;10884:31::-;;;;;;;;;;;;;;;;10420:30;;;;;;;;;;;;;;;;17780:403;;;;;;;;;;-1:-1:-1;17780:403:0;;;;;:::i;:::-;;:::i;25819:456::-;;;;;;;;;;-1:-1:-1;25819:456:0;;;;;:::i;:::-;;:::i;9487:27::-;;;;;;;;;;;;;;;;14237:249;;;;;;;;;;;;;:::i;7945:79::-;;;;;;;;;;-1:-1:-1;8010:6:0;;-1:-1:-1;;;;;8010:6:0;7945:79;;26826:289;;;;;;;;;;-1:-1:-1;26826:289:0;;;;;:::i;:::-;;:::i;10572:31::-;;;;;;;;;;;;;;;;4186:104;;;;;;;;;;;;;:::i;17270:246::-;;;;;;;;;;-1:-1:-1;17270:246:0;;;;;:::i;:::-;;:::i;5892:413::-;;;;;;;;;;-1:-1:-1;5892:413:0;;;;;:::i;:::-;;:::i;9802:31::-;;;;;;;;;;-1:-1:-1;9802:31:0;;;;-1:-1:-1;;;;;9802:31:0;;;4650:175;;;;;;;;;;-1:-1:-1;4650:175:0;;;;;:::i;:::-;;:::i;9556:30::-;;;;;;;;;;;;;;;;10344:32;;;;;;;;;;;;;;;;11291:58;;;;;;;;;;-1:-1:-1;11291:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9999:33;;;;;;;;;;-1:-1:-1;9999:33:0;;;;;;;;;;;27403:449;;;;;;;;;;-1:-1:-1;27403:449:0;;;;;:::i;:::-;;:::i;18611:182::-;;;;;;;;;;-1:-1:-1;18611:182:0;;;;;:::i;:::-;;:::i;18191:412::-;;;;;;;;;;-1:-1:-1;18191:412:0;;;;;:::i;:::-;;:::i;15439:284::-;;;;;;;;;;-1:-1:-1;15439:284:0;;;;;:::i;:::-;;:::i;28658:220::-;;;;;;;;;;;;;:::i;10262:39::-;;;;;;;;;;-1:-1:-1;10262:39:0;;;;;;;;15793:346;;;;;;;;;;-1:-1:-1;15793:346:0;;;;;:::i;:::-;;:::i;10310:27::-;;;;;;;;;;;;;;;;15157:274;;;;;;;;;;-1:-1:-1;15157:274:0;;;;;:::i;:::-;;:::i;4833:151::-;;;;;;;;;;-1:-1:-1;4833:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;4949:18:0;;;4922:7;4949:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4833:151;9720:33;;;;;;;;;;;;;;;;14766:98;;;;;;;;;;;;;:::i;9880:37::-;;;;;;;;;;;;;;;;10784:50;;;;;;;;;;;;;;;;10612:35;;;;;;;;;;;;;;;;10383:30;;;;;;;;;;;;;;;;8317:244;;;;;;;;;;-1:-1:-1;8317:244:0;;;;;:::i;:::-;;:::i;26345:160::-;;;;;;;;;;;;;:::i;10534:31::-;;;;;;;;;;;;;;;;10841:36;;;;;;;;;;-1:-1:-1;10841:36:0;;;;;;;;4078:100;4132:13;4165:5;4158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4078:100;:::o;4992:169::-;5075:4;5092:39;307:10;5115:7;5124:6;5092:8;:39::i;:::-;-1:-1:-1;5149:4:0;4992:169;;;;;:::o;16366:617::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;;;;;;;;;16508:15:::1;:22;16490:7;:14;:40;16482:83;;;::::0;-1:-1:-1;;;16482:83:0;;7577:2:1;16482:83:0::1;::::0;::::1;7559:21:1::0;7616:2;7596:18;;;7589:30;7655:32;7635:18;;;7628:60;7705:18;;16482:83:0::1;7375:354:1::0;16482:83:0::1;16601:3;16584:7;:14;:20;16576:87;;;::::0;-1:-1:-1;;;16576:87:0;;7936:2:1;16576:87:0::1;::::0;::::1;7918:21:1::0;7975:2;7955:18;;;7948:30;8014:34;7994:18;;;7987:62;-1:-1:-1;;;8065:18:1;;;8058:52;8127:19;;16576:87:0::1;7734:418:1::0;16576:87:0::1;16776:9;16772:204;16795:7;:14;16791:1;:18;16772:204;;;16830:14;16847:7;16855:1;16847:10;;;;;;;;:::i;:::-;;;;;;;16830:27;;16872:14;16889:15;16905:1;16889:18;;;;;;;;:::i;:::-;;;;;;;16908:4;16889:23;;;;:::i;:::-;16872:40;;16927:37;16937:10;16949:6;16957;16927:9;:37::i;:::-;16815:161;;16811:3;;;;;:::i;:::-;;;;16772:204;;;;16366:617:::0;;:::o;5169:492::-;5309:4;5326:36;5336:6;5344:9;5355:6;5326:9;:36::i;:::-;-1:-1:-1;;;;;5402:19:0;;5375:24;5402:19;;;:11;:19;;;;;;;;307:10;5402:33;;;;;;;;5454:26;;;;5446:79;;;;-1:-1:-1;;;5446:79:0;;8936:2:1;5446:79:0;;;8918:21:1;8975:2;8955:18;;;8948:30;9014:34;8994:18;;;8987:62;-1:-1:-1;;;9065:18:1;;;9058:38;9113:19;;5446:79:0;8734:404:1;5446:79:0;5561:57;5570:6;307:10;5611:6;5592:16;:25;5561:8;:57::i;:::-;-1:-1:-1;5649:4:0;;5169:492;-1:-1:-1;;;;5169:492:0:o;26513:305::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26611:33:0;::::1;26603:85;;;::::0;-1:-1:-1;;;26603:85:0;;9345:2:1;26603:85:0::1;::::0;::::1;9327:21:1::0;9384:2;9364:18;;;9357:30;9423:34;9403:18;;;9396:62;-1:-1:-1;;;9474:18:1;;;9467:37;9521:19;;26603:85:0::1;9143:403:1::0;26603:85:0::1;26699:18;:49:::0;;-1:-1:-1;;;;;;26699:49:0::1;-1:-1:-1::0;;;;;26699:49:0;::::1;::::0;;::::1;::::0;;;26764:46:::1;::::0;::::1;::::0;-1:-1:-1;;26764:46:0::1;26513:305:::0;:::o;14876:269::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14995:4:::1;14989;14969:13;4487:12:::0;;;4399:108;14969:13:::1;:17;::::0;14985:1:::1;14969:17;:::i;:::-;:24;;;;:::i;:::-;14968:31;;;;:::i;:::-;14958:6;:41;;14950:95;;;::::0;-1:-1:-1;;;14950:95:0;;9975:2:1;14950:95:0::1;::::0;::::1;9957:21:1::0;10014:2;9994:18;;;9987:30;10053:34;10033:18;;;10026:62;-1:-1:-1;;;10104:18:1;;;10097:39;10153:19;;14950:95:0::1;9773:405:1::0;14950:95:0::1;15071:17;:6:::0;15081::::1;15071:17;:::i;:::-;15056:12;:32:::0;;;15104:33:::1;::::0;160:25:1;;;15104:33:0::1;::::0;148:2:1;133:18;15104:33:0::1;;;;;;;;14876:269:::0;:::o;5669:215::-;307:10;5757:4;5806:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5806:34:0;;;;;;;;;;5757:4;;5774:80;;5797:7;;5806:47;;5843:10;;5806:47;:::i;:::-;5774:8;:80::i;27124:271::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27218:31:0;::::1;27210:63;;;::::0;-1:-1:-1;;;27210:63:0;;10515:2:1;27210:63:0::1;::::0;::::1;10497:21:1::0;10554:2;10534:18;;;10527:30;-1:-1:-1;;;10573:18:1;;;10566:49;10632:18;;27210:63:0::1;10313:343:1::0;27210:63:0::1;27284:16;:45:::0;;-1:-1:-1;;;;;;27284:45:0::1;-1:-1:-1::0;;;;;27284:45:0;::::1;::::0;;::::1;::::0;;;27345:42:::1;::::0;::::1;::::0;-1:-1:-1;;27345:42:0::1;27124:271:::0;:::o;27860:281::-;27942:24;;27920:7;;27942:24;;27939:195;;;28018:25;;27989:26;;:54;;;;:::i;:::-;27982:61;;27860:281;:::o;27939:195::-;-1:-1:-1;28092:1:0;;27860:281::o;8159:150::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;8252:6:::1;::::0;8231:40:::1;::::0;8268:1:::1;::::0;-1:-1:-1;;;;;8252:6:0::1;::::0;8231:40:::1;::::0;8268:1;;8231:40:::1;8282:6;:19:::0;;-1:-1:-1;;;;;;8282:19:0::1;::::0;;8159:150::o;14542:154::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14596:14:::1;:22:::0;;-1:-1:-1;;14596:22:0;;::::1;::::0;;;14629:20:::1;:28:::0;;;;::::1;::::0;;14673:15:::1;::::0;::::1;::::0;14613:5:::1;::::0;14673:15:::1;14542:154::o:0;16995:267::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17091:4:::1;17087:111;;17129:13;-1:-1:-1::0;;;;;17119:23:0::1;:6;-1:-1:-1::0;;;;;17119:23:0::1;::::0;17111:75:::1;;;::::0;-1:-1:-1;;;17111:75:0;;10863:2:1;17111:75:0::1;::::0;::::1;10845:21:1::0;10902:2;10882:18;;;10875:30;10941:34;10921:18;;;10914:62;-1:-1:-1;;;10992:18:1;;;10985:37;11039:19;;17111:75:0::1;10661:403:1::0;17111:75:0::1;-1:-1:-1::0;;;;;17208:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;17208:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;16995:267::o;28149:501::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;28237:29:::1;:27;:29::i;:::-;28218:15;:48;;:85;;;;;28302:1;28270:29;:27;:29::i;:::-;:33;28218:85;28210:120;;;::::0;-1:-1:-1;;;28210:120:0;;11271:2:1;28210:120:0::1;::::0;::::1;11253:21:1::0;11310:2;11290:18;;;11283:30;-1:-1:-1;;;11329:18:1;;;11322:52;11391:18;;28210:120:0::1;11069:346:1::0;28210:120:0::1;28370:1;28341:26;:30:::0;;;28382:24:::1;:32:::0;;-1:-1:-1;;28382:32:0::1;::::0;;28509:16:::1;::::0;28451:55:::1;::::0;-1:-1:-1;;;28451:55:0;;28500:4:::1;28451:55;::::0;::::1;1813:51:1::0;28528:3:0::1;::::0;28509:16;28466:13:::1;-1:-1:-1::0;;;;;28451:40:0::1;::::0;::::1;::::0;1786:18:1;;28451:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;;;:::i;:::-;28571:1;28552:16;:20:::0;28585:57:::1;::::0;-1:-1:-1;;;28585:57:0;;28616:10:::1;28585:57;::::0;::::1;11783:51:1::0;11850:18;;;11843:34;;;28427:104:0;;-1:-1:-1;28592:13:0::1;-1:-1:-1::0;;;;;28585:30:0::1;::::0;::::1;::::0;11756:18:1;;28585:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28199:451;28149:501::o:0;17780:403::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17904:17:::1;:35:::0;;;17950:15:::1;:31:::0;;;17992:15:::1;:31:::0;;;18010:13;18049:35:::1;17968:13:::0;17924:15;18049:35:::1;:::i;:::-;:53;;;;:::i;:::-;18034:12;:68:::0;;;18137:4:::1;-1:-1:-1::0;18121:20:0::1;18113:62;;;::::0;-1:-1:-1;;;18113:62:0;;12340:2:1;18113:62:0::1;::::0;::::1;12322:21:1::0;12379:2;12359:18;;;12352:30;12418:31;12398:18;;;12391:59;12467:18;;18113:62:0::1;12138:353:1::0;25819:456:0;8072:6;;25906:10;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25937:20:0;::::1;25929:59;;;::::0;-1:-1:-1;;;25929:59:0;;12698:2:1;25929:59:0::1;::::0;::::1;12680:21:1::0;12737:2;12717:18;;;12710:30;12776:28;12756:18;;;12749:56;12822:18;;25929:59:0::1;12496:350:1::0;25929:59:0::1;26025:4;-1:-1:-1::0;;;;;26007:23:0;::::1;::::0;25999:64:::1;;;::::0;-1:-1:-1;;;25999:64:0;;13053:2:1;25999:64:0::1;::::0;::::1;13035:21:1::0;13092:2;13072:18;;;13065:30;13131;13111:18;;;13104:58;13179:18;;25999:64:0::1;12851:352:1::0;25999:64:0::1;26101:39;::::0;-1:-1:-1;;;26101:39:0;;26134:4:::1;26101:39;::::0;::::1;1813:51:1::0;26074:24:0::1;::::0;-1:-1:-1;;;;;26101:24:0;::::1;::::0;::::1;::::0;1786:18:1;;26101:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26159:46;::::0;-1:-1:-1;;;26159:46:0;;-1:-1:-1;;;;;11801:32:1;;;26159:46:0::1;::::0;::::1;11783:51:1::0;11850:18;;;11843:34;;;26074:66:0;;-1:-1:-1;26159:23:0;;::::1;::::0;::::1;::::0;11756:18:1;;26159:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26221;::::0;;-1:-1:-1;;;;;11801:32:1;;11783:51;;11865:2;11850:18;;11843:34;;;26151:54:0;;-1:-1:-1;26221:46:0::1;::::0;11756:18:1;26221:46:0::1;;;;;;;25918:357;25819:456:::0;;;;:::o;14237:249::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14301:13:::1;::::0;::::1;::::0;::::1;;;14300:14;14292:50;;;::::0;-1:-1:-1;;;14292:50:0;;13410:2:1;14292:50:0::1;::::0;::::1;13392:21:1::0;13449:2;13429:18;;;13422:30;13488:25;13468:18;;;13461:53;13531:18;;14292:50:0::1;13208:347:1::0;14292:50:0::1;14353:13;:20:::0;;-1:-1:-1;;14384:18:0;;;;;14434:12:::1;14413:18;:33:::0;14462:16:::1;::::0;::::1;::::0;-1:-1:-1;;14462:16:0::1;14237:249::o:0;26826:289::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26920:31:0;::::1;26912:81;;;::::0;-1:-1:-1;;;26912:81:0;;13762:2:1;26912:81:0::1;::::0;::::1;13744:21:1::0;13801:2;13781:18;;;13774:30;13840:34;13820:18;;;13813:62;-1:-1:-1;;;13891:18:1;;;13884:35;13936:19;;26912:81:0::1;13560:401:1::0;26912:81:0::1;27004:16;:45:::0;;-1:-1:-1;;;;;;27004:45:0::1;-1:-1:-1::0;;;;;27004:45:0;::::1;::::0;;::::1;::::0;;;27065:42:::1;::::0;::::1;::::0;-1:-1:-1;;27065:42:0::1;26826:289:::0;:::o;4186:104::-;4242:13;4275:7;4268:14;;;;;:::i;17270:246::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;17379:13:::1;-1:-1:-1::0;;;;;17371:21:0::1;:4;-1:-1:-1::0;;;;;17371:21:0::1;::::0;17363:91:::1;;;::::0;-1:-1:-1;;;17363:91:0;;14168:2:1;17363:91:0::1;::::0;::::1;14150:21:1::0;14207:2;14187:18;;;14180:30;14246:34;14226:18;;;14219:62;14317:27;14297:18;;;14290:55;14362:19;;17363:91:0::1;13966:421:1::0;17363:91:0::1;17467:41;17496:4;17502:5;17467:28;:41::i;5892:413::-:0;307:10;5985:4;6029:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6029:34:0;;;;;;;;;;6082:35;;;;6074:85;;;;-1:-1:-1;;;6074:85:0;;14594:2:1;6074:85:0;;;14576:21:1;14633:2;14613:18;;;14606:30;14672:34;14652:18;;;14645:62;-1:-1:-1;;;14723:18:1;;;14716:35;14768:19;;6074:85:0;14392:401:1;6074:85:0;6195:67;307:10;6218:7;6246:15;6227:16;:34;6195:8;:67::i;:::-;-1:-1:-1;6293:4:0;;5892:413;-1:-1:-1;;;5892:413:0:o;4650:175::-;4736:4;4753:42;307:10;4777:9;4788:6;4753:9;:42::i;27403:449::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;27495:24:::1;::::0;::::1;;27494:25;27486:87;;;::::0;-1:-1:-1;;;27486:87:0;;15000:2:1;27486:87:0::1;::::0;::::1;14982:21:1::0;15039:2;15019:18;;;15012:30;15078:34;15058:18;;;15051:62;-1:-1:-1;;;15129:18:1;;;15122:47;15186:19;;27486:87:0::1;14798:413:1::0;27486:87:0::1;27610:3;27592:14;:21;;:43;;;;;27634:1;27617:14;:18;27592:43;27584:82;;;::::0;-1:-1:-1;;;27584:82:0;;15418:2:1;27584:82:0::1;::::0;::::1;15400:21:1::0;15457:2;15437:18;;;15430:30;15496:28;15476:18;;;15469:56;15542:18;;27584:82:0::1;15216:350:1::0;27584:82:0::1;27706:15;27677:26;:44:::0;27732:24:::1;:31:::0;;-1:-1:-1;;27732:31:0::1;27759:4;27732:31;::::0;;27774:16:::1;:33:::0;;;27823:21:::1;::::0;::::1;::::0;27732:24:::1;::::0;27823:21:::1;27403:449:::0;:::o;18611:182::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18696:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;18696:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;18751:34;;1345:41:1;;;18751:34:0::1;::::0;1318:18:1;18751:34:0::1;;;;;;;18611:182:::0;;:::o;18191:412::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;18316:18:::1;:36:::0;;;18363:16:::1;:32:::0;;;18406:16:::1;:32:::0;;;18425:13;18465:37:::1;18382:13:::0;18337:15;18465:37:::1;:::i;:::-;:56;;;;:::i;:::-;18449:13;:72:::0;;;18557:4:::1;-1:-1:-1::0;18540:21:0::1;18532:63;;;::::0;-1:-1:-1;;;18532:63:0;;12340:2:1;18532:63:0::1;::::0;::::1;12322:21:1::0;12379:2;12359:18;;;12352:30;12418:31;12398:18;;;12391:59;12467:18;;18532:63:0::1;12138:353:1::0;15439:284:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15561:4:::1;15555;15535:13;4487:12:::0;;;4399:108;15535:13:::1;:17;::::0;15551:1:::1;15535:17;:::i;:::-;:24;;;;:::i;:::-;15534:31;;;;:::i;:::-;15524:6;:41;;15516:98;;;::::0;-1:-1:-1;;;15516:98:0;;15773:2:1;15516:98:0::1;::::0;::::1;15755:21:1::0;15812:2;15792:18;;;15785:30;15851:34;15831:18;;;15824:62;-1:-1:-1;;;15902:18:1;;;15895:42;15954:19;;15516:98:0::1;15571:408:1::0;15516:98:0::1;15643:17;:6:::0;15653::::1;15643:17;:::i;:::-;15625:15;:35:::0;;;15676:39:::1;::::0;160:25:1;;;15676:39:0::1;::::0;148:2:1;133:18;15676:39:0::1;14:177:1::0;28658:220:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;28723:24:::1;:32:::0;;-1:-1:-1;;28723:32:0::1;::::0;;28750:5:::1;28766:16;:20:::0;;;28797:26:::1;:30:::0;;;28843:27:::1;::::0;::::1;::::0;28750:5;28843:27:::1;28658:220::o:0;15793:346::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15916:6:::1;15896:13;4487:12:::0;;;4399:108;15896:13:::1;:17;::::0;15912:1:::1;15896:17;:::i;:::-;:26;;;;:::i;:::-;15883:9;:39;;15875:105;;;::::0;-1:-1:-1;;;15875:105:0;;16186:2:1;15875:105:0::1;::::0;::::1;16168:21:1::0;16225:2;16205:18;;;16198:30;16264:34;16244:18;;;16237:62;-1:-1:-1;;;16315:18:1;;;16308:51;16376:19;;15875:105:0::1;15984:417:1::0;15875:105:0::1;16031:4;16011:13;4487:12:::0;;;4399:108;16011:13:::1;:17;::::0;16027:1:::1;16011:17;:::i;:::-;:24;;;;:::i;:::-;15998:9;:37;;15990:102;;;::::0;-1:-1:-1;;;15990:102:0;;16608:2:1;15990:102:0::1;::::0;::::1;16590:21:1::0;16647:2;16627:18;;;16620:30;16686:34;16666:18;;;16659:62;-1:-1:-1;;;16737:18:1;;;16730:50;16797:19;;15990:102:0::1;16406:416:1::0;15990:102:0::1;16102:18;:30:::0;15793:346::o;15157:274::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;15277:4:::1;15271;15251:13;4487:12:::0;;;4399:108;15251:13:::1;:17;::::0;15267:1:::1;15251:17;:::i;:::-;:24;;;;:::i;:::-;15250:31;;;;:::i;:::-;15240:6;:41;;15232:96;;;::::0;-1:-1:-1;;;15232:96:0;;17029:2:1;15232:96:0::1;::::0;::::1;17011:21:1::0;17068:2;17048:18;;;17041:30;17107:34;17087:18;;;17080:62;-1:-1:-1;;;17158:18:1;;;17151:40;17208:19;;15232:96:0::1;16827:406:1::0;15232:96:0::1;15355:17;:6:::0;15365::::1;15355:17;:::i;:::-;15339:13;:33:::0;;;15388:35:::1;::::0;160:25:1;;;15388:35:0::1;::::0;148:2:1;133:18;15388:35:0::1;14:177:1::0;14766:98:0;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;14828:20:::1;:28:::0;;-1:-1:-1;;14828:28:0::1;::::0;;14766:98::o;8317:244::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8406:22:0;::::1;8398:73;;;::::0;-1:-1:-1;;;8398:73:0;;17440:2:1;8398:73:0::1;::::0;::::1;17422:21:1::0;17479:2;17459:18;;;17452:30;17518:34;17498:18;;;17491:62;-1:-1:-1;;;17569:18:1;;;17562:36;17615:19;;8398:73:0::1;17238:402:1::0;8398:73:0::1;8508:6;::::0;8487:38:::1;::::0;-1:-1:-1;;;;;8487:38:0;;::::1;::::0;8508:6:::1;::::0;8487:38:::1;::::0;8508:6:::1;::::0;8487:38:::1;8536:6;:17:::0;;-1:-1:-1;;;;;;8536:17:0::1;-1:-1:-1::0;;;;;8536:17:0;;;::::1;::::0;;;::::1;::::0;;8317:244::o;26345:160::-;8072:6;;-1:-1:-1;;;;;8072:6:0;307:10;8072:22;8064:67;;;;-1:-1:-1;;;8064:67:0;;;;;;;:::i;:::-;26439:58:::1;::::0;26403:12:::1;::::0;26447:10:::1;::::0;26471:21:::1;::::0;26403:12;26439:58;26403:12;26439:58;26471:21;26447:10;26439:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;26345:160:0:o;7234:380::-;-1:-1:-1;;;;;7370:19:0;;7362:68;;;;-1:-1:-1;;;7362:68:0;;18057:2:1;7362:68:0;;;18039:21:1;18096:2;18076:18;;;18069:30;18135:34;18115:18;;;18108:62;-1:-1:-1;;;18186:18:1;;;18179:34;18230:19;;7362:68:0;17855:400:1;7362:68:0;-1:-1:-1;;;;;7449:21:0;;7441:68;;;;-1:-1:-1;;;7441:68:0;;18462:2:1;7441:68:0;;;18444:21:1;18501:2;18481:18;;;18474:30;18540:34;18520:18;;;18513:62;-1:-1:-1;;;18591:18:1;;;18584:32;18633:19;;7441:68:0;18260:398:1;7441:68:0;-1:-1:-1;;;;;7522:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7574:32;;160:25:1;;;7574:32:0;;133:18:1;7574:32:0;;;;;;;7234:380;;;:::o;18801:4360::-;-1:-1:-1;;;;;18901:18:0;;18893:68;;;;-1:-1:-1;;;18893:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18980:16:0;;18972:64;;;;-1:-1:-1;;;18972:64:0;;;;;;;:::i;:::-;19064:1;19055:6;:10;19047:52;;;;-1:-1:-1;;;19047:52:0;;19675:2:1;19047:52:0;;;19657:21:1;19714:2;19694:18;;;19687:30;19753:31;19733:18;;;19726:59;19802:18;;19047:52:0;19473:353:1;19047:52:0;19133:14;;;;19130:1849;;;8010:6;;-1:-1:-1;;;;;19167:15:0;;;8010:6;;19167:15;;;;:32;;-1:-1:-1;8010:6:0;;-1:-1:-1;;;;;19186:13:0;;;8010:6;;19186:13;;19167:32;:52;;;;-1:-1:-1;;;;;;19203:16:0;;;;19167:52;:77;;;;-1:-1:-1;;;;;;19223:21:0;;19237:6;19223:21;;19167:77;19163:1805;;;19268:13;;;;;;;19264:148;;-1:-1:-1;;;;;19313:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;19342:23:0;;;;;;:19;:23;;;;;;;;19313:52;19305:87;;;;-1:-1:-1;;;19305:87:0;;20033:2:1;19305:87:0;;;20015:21:1;20072:2;20052:18;;;20045:30;-1:-1:-1;;;20091:18:1;;;20084:52;20153:18;;19305:87:0;19831:346:1;19305:87:0;19586:20;;;;19582:519;;;19648:15;-1:-1:-1;;;;;19634:30:0;:2;-1:-1:-1;;;;;19634:30:0;;;:62;;;;;19682:13;-1:-1:-1;;;;;19668:28:0;:2;-1:-1:-1;;;;;19668:28:0;;;19634:62;19630:452;;;19774:16;19789:1;19774:12;:16;:::i;:::-;19761:9;19732:39;;;;:28;:39;;;;;;:58;:113;;;;-1:-1:-1;19829:16:0;19844:1;19829:12;:16;:::i;:::-;-1:-1:-1;;;;;19794:32:0;;;;;;:28;:32;;;;;;:51;19732:113;19724:179;;;;-1:-1:-1;;;19724:179:0;;20517:2:1;19724:179:0;;;20499:21:1;20556:2;20536:18;;;20529:30;20595:34;20575:18;;;20568:62;-1:-1:-1;;;20646:18:1;;;20639:51;20707:19;;19724:179:0;20315:417:1;19724:179:0;19959:9;19930:39;;;;:28;:39;;;;;;19972:12;19930:54;;;;-1:-1:-1;;;;;20011:32:0;;;;;;:47;19630:452;-1:-1:-1;;;;;20170:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;20206:35:0;;;;;;:31;:35;;;;;;;;20205:36;20170:71;20166:787;;;20288:12;;20278:6;:22;;20270:75;;;;-1:-1:-1;;;20270:75:0;;20939:2:1;20270:75:0;;;20921:21:1;20978:2;20958:18;;;20951:30;21017:34;20997:18;;;20990:62;-1:-1:-1;;;21068:18:1;;;21061:38;21116:19;;20270:75:0;20737:404:1;20270:75:0;20406:15;;-1:-1:-1;;;;;4616:18:0;;4589:7;4616:18;;;;;;;;;;;20380:22;;:6;:22;:::i;:::-;:41;;20372:78;;;;-1:-1:-1;;;20372:78:0;;21348:2:1;20372:78:0;;;21330:21:1;21387:2;21367:18;;;21360:30;-1:-1:-1;;;21406:18:1;;;21399:54;21470:18;;20372:78:0;21146:348:1;20372:78:0;20166:787;;;-1:-1:-1;;;;;20527:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;20561:37:0;;;;;;:31;:37;;;;;;;;20560:38;20527:71;20523:430;;;20645:13;;20635:6;:23;;20627:78;;;;-1:-1:-1;;;20627:78:0;;21701:2:1;20627:78:0;;;21683:21:1;21740:2;21720:18;;;21713:30;21779:34;21759:18;;;21752:62;-1:-1:-1;;;21830:18:1;;;21823:40;21880:19;;20627:78:0;21499:406:1;20523:430:0;-1:-1:-1;;;;;20754:35:0;;;;;;:31;:35;;;;;;;;20753:36;:78;;;;-1:-1:-1;;;;;;20794:37:0;;;;;;:31;:37;;;;;;;;20793:38;20753:78;20749:204;;;20889:15;;-1:-1:-1;;;;;4616:18:0;;4589:7;4616:18;;;;;;;;;;;20863:22;;:6;:22;:::i;:::-;:41;;20855:78;;;;-1:-1:-1;;;20855:78:0;;21348:2:1;20855:78:0;;;21330:21:1;21387:2;21367:18;;;21360:30;-1:-1:-1;;;21406:18:1;;;21399:54;21470:18;;20855:78:0;21146:348:1;20855:78:0;21040:4;20991:28;4616:18;;;;;;;;;;;21106;;21082:42;;;;;;;21140:22;;-1:-1:-1;21151:11:0;;;;;;;21140:22;:35;;;;-1:-1:-1;21167:8:0;;;;21166:9;21140:35;:71;;;;-1:-1:-1;;;;;;21180:31:0;;;;;;:25;:31;;;;;;;;21179:32;21140:71;:101;;;;-1:-1:-1;;;;;;21216:25:0;;;;;;:19;:25;;;;;;;;21215:26;21140:101;:129;;;;-1:-1:-1;;;;;;21246:23:0;;;;;;:19;:23;;;;;;;;21245:24;21140:129;21137:236;;;21286:8;:15;;-1:-1:-1;;21286:15:0;21297:4;21286:15;;;21318:10;:8;:10::i;:::-;21345:8;:16;;-1:-1:-1;;21345:16:0;;;21137:236;-1:-1:-1;;;;;21503:25:0;;21385:12;21503:25;;;:19;:25;;;;;;21400:4;;21503:25;;;:52;;-1:-1:-1;;;;;;21532:23:0;;;;;;:19;:23;;;;;;;;21503:52;21500:99;;;-1:-1:-1;21582:5:0;21500:99;21619:12;21646:21;21759:7;21756:1352;;;21914:16;:12;21929:1;21914:16;:::i;:::-;21892:18;;:38;;:73;;;;-1:-1:-1;;;;;;21934:31:0;;;;;;:25;:31;;;;;;;;21892:73;21889:1034;;;22015:3;22001:11;:6;22010:2;22001:11;:::i;:::-;:17;;;;:::i;:::-;22059:18;;21985:33;;-1:-1:-1;22037:56:0;;22053:4;;-1:-1:-1;;;;;22059:18:0;21985:33;22037:15;:56::i;:::-;21889:1034;;;-1:-1:-1;;;;;22156:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;22205:1;22189:13;;:17;22156:50;22152:771;;;22257:5;22242:13;;22233:6;:22;;;;:::i;:::-;:29;;;;:::i;:::-;22226:36;;22329:13;;22310:16;;22303:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;22281:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22413:13:0;;22392:18;;22385:25;;:4;:25;:::i;:::-;:41;;;;:::i;:::-;22361:20;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;22493:13:0;;22474:16;;22467:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;22445:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;22152:771:0;;-1:-1:-1;22152:771:0;;-1:-1:-1;;;;;22567:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;22617:1;22602:12;;:16;22567:51;22564:359;;;22667:5;22652:12;;22643:6;:21;;;;:::i;:::-;:29;;;;:::i;:::-;22636:36;;22735:12;;22717:15;;22710:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;22688:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;22817:12:0;;22797:17;;22790:24;;:4;:24;:::i;:::-;:39;;;;:::i;:::-;22766:20;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;22895:12:0;;22877:15;;22870:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;22848:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;22564:359:0;22954:8;;22951:93;;22986:42;23002:4;23016;23023;22986:15;:42::i;:::-;23076:20;23083:13;23076:4;:20;:::i;:::-;23066:30;;;;:::i;:::-;;;21756:1352;23120:33;23136:4;23142:2;23146:6;23120:15;:33::i;:::-;18880:4281;;;;;18801:4360;;;:::o;17524:248::-;-1:-1:-1;;;;;17607:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;17607:39:0;;;;;;;17667;17607:31;:39;17667:26;:39::i;:::-;17724:40;;;;;;-1:-1:-1;;;;;17724:40:0;;;;;;;;17524:248;;:::o;24311:1500::-;24394:4;24350:23;4616:18;;;;;;;;;;;24350:50;;24411:25;24483:18;;24460:20;;24439:18;;:41;;;;:::i;:::-;:62;;;;:::i;:::-;24411:90;-1:-1:-1;24525:20:0;;;:46;;-1:-1:-1;24549:22:0;;24525:46;24522:60;;;24574:7;;24311:1500::o;24522:60::-;24615:18;;;:23;;;:::i;:::-;24597:15;:41;24594:113;;;24672:18;;;:23;;;:::i;:::-;24654:41;;24594:113;24719:12;24801:23;24886:1;24866:17;24845:18;;24827:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;24801:86;-1:-1:-1;24908:51:0;24925:33;24801:86;24925:15;:33;:::i;:::-;24908:16;:51::i;:::-;25169:18;;25002:21;;;;24981:18;;25169:20;;25188:1;;25169:20;:::i;:::-;25148:42;;:17;:42;:::i;:::-;25124:20;;25111:33;;:10;:33;:::i;:::-;:80;;;;:::i;:::-;25083:108;;25202:23;25303:1;25284:18;;:20;;;;:::i;:::-;25263:42;;:17;:42;:::i;:::-;25241:18;;25228:31;;:10;:31;:::i;:::-;:78;;;;:::i;:::-;25202:104;-1:-1:-1;25338:35:0;25202:104;25338:17;:35;:::i;:::-;25319:54;;;;:::i;:::-;25419:1;25398:18;:22;;;25431:20;:24;;;25466:18;:22;25319:54;-1:-1:-1;25512:19:0;;;;;:42;;;25553:1;25535:15;:19;25512:42;25509:119;;;25570:46;25583:15;25600;25570:12;:46::i;:::-;25661:16;;25653:58;;-1:-1:-1;;;;;25661:16:0;;;;25691:15;;25653:58;;;;25691:15;25661:16;25653:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25745:18:0;;25737:66;;25640:71;;-1:-1:-1;;;;;;25745:18:0;;25777:21;;25737:66;;;;25777:21;25745:18;25737:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24311:1500:0:o;6313:614::-;-1:-1:-1;;;;;6453:20:0;;6445:70;;;;-1:-1:-1;;;6445:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6534:23:0;;6526:71;;;;-1:-1:-1;;;6526:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6634:17:0;;6610:21;6634:17;;;;;;;;;;;6670:23;;;;6662:74;;;;-1:-1:-1;;;6662:74:0;;22112:2:1;6662:74:0;;;22094:21:1;22151:2;22131:18;;;22124:30;22190:34;22170:18;;;22163:62;-1:-1:-1;;;22241:18:1;;;22234:36;22287:19;;6662:74:0;21910:402:1;6662:74:0;-1:-1:-1;;;;;6772:17:0;;;:9;:17;;;;;;;;;;;6792:22;;;6772:42;;6836:20;;;;;;;;:30;;6808:6;;6772:9;6836:30;;6808:6;;6836:30;:::i;:::-;;;;;;;;6901:9;-1:-1:-1;;;;;6884:35:0;6893:6;-1:-1:-1;;;;;6884:35:0;;6912:6;6884:35;;;;160:25:1;;148:2;133:18;;14:177;6884:35:0;;;;;;;;6434:493;6313:614;;;:::o;16151:207::-;-1:-1:-1;;;;;16239:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;16239:52:0;;;;;;;;;;16307:43;;22485:51:1;;;22552:18;;;22545:50;16307:43:0;;22458:18:1;16307:43:0;;;;;;;16151:207;;:::o;23169:591::-;23321:16;;;23335:1;23321:16;;;;;;;;23297:21;;23321:16;;;;;;;;;;-1:-1:-1;23321:16:0;23297:40;;23366:4;23348;23353:1;23348:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;23348:23:0;;;-1:-1:-1;;;;;23348:23:0;;;;;23392:15;-1:-1:-1;;;;;23392:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23382:4;23387:1;23382:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;23382:32:0;;;-1:-1:-1;;;;;23382:32:0;;;;;23427:62;23444:4;23459:15;23477:11;23427:8;:62::i;:::-;23528:224;;-1:-1:-1;;;23528:224:0;;-1:-1:-1;;;;;23528:15:0;:66;;;;:224;;23609:11;;23635:1;;23679:4;;23706;;23726:15;;23528:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23224:536;23169:591;:::o;23772:531::-;23920:62;23937:4;23952:15;23970:11;23920:8;:62::i;:::-;24237:16;;24025:270;;-1:-1:-1;;;24025:270:0;;24097:4;24025:270;;;24188:34:1;24238:18;;;24231:34;;;24143:1:0;24281:18:1;;;24274:34;;;24324:18;;;24317:34;-1:-1:-1;;;;;24237:16:0;;;24367:19:1;;;24360:44;24269:15:0;24420:19:1;;;24413:35;24025:15:0;:31;;;;;;24064:9;;24122:19:1;;24025:270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;23772:531;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;804:70;749:131;:::o;885:315::-;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;:::-;1633:5;1397:247;-1:-1:-1;;;1397:247:1:o;1875:127::-;1936:10;1931:3;1927:20;1924:1;1917:31;1967:4;1964:1;1957:15;1991:4;1988:1;1981:15;2007:275;2078:2;2072:9;2143:2;2124:13;;-1:-1:-1;;2120:27:1;2108:40;;2178:18;2163:34;;2199:22;;;2160:62;2157:88;;;2225:18;;:::i;:::-;2261:2;2254:22;2007:275;;-1:-1:-1;2007:275:1:o;2287:183::-;2347:4;2380:18;2372:6;2369:30;2366:56;;;2402:18;;:::i;:::-;-1:-1:-1;2447:1:1;2443:14;2459:4;2439:25;;2287:183::o;2475:662::-;2529:5;2582:3;2575:4;2567:6;2563:17;2559:27;2549:55;;2600:1;2597;2590:12;2549:55;2636:6;2623:20;2662:4;2686:60;2702:43;2742:2;2702:43;:::i;:::-;2686:60;:::i;:::-;2780:15;;;2866:1;2862:10;;;;2850:23;;2846:32;;;2811:12;;;;2890:15;;;2887:35;;;2918:1;2915;2908:12;2887:35;2954:2;2946:6;2942:15;2966:142;2982:6;2977:3;2974:15;2966:142;;;3048:17;;3036:30;;3086:12;;;;2999;;2966:142;;;-1:-1:-1;3126:5:1;2475:662;-1:-1:-1;;;;;;2475:662:1:o;3142:1215::-;3260:6;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:52;;;3337:1;3334;3327:12;3289:52;3377:9;3364:23;3406:18;3447:2;3439:6;3436:14;3433:34;;;3463:1;3460;3453:12;3433:34;3501:6;3490:9;3486:22;3476:32;;3546:7;3539:4;3535:2;3531:13;3527:27;3517:55;;3568:1;3565;3558:12;3517:55;3604:2;3591:16;3626:4;3650:60;3666:43;3706:2;3666:43;:::i;3650:60::-;3744:15;;;3826:1;3822:10;;;;3814:19;;3810:28;;;3775:12;;;;3850:19;;;3847:39;;;3882:1;3879;3872:12;3847:39;3906:11;;;;3926:217;3942:6;3937:3;3934:15;3926:217;;;4022:3;4009:17;4039:31;4064:5;4039:31;:::i;:::-;4083:18;;3959:12;;;;4121;;;;3926:217;;;4162:5;-1:-1:-1;;4205:18:1;;4192:32;;-1:-1:-1;;4236:16:1;;;4233:36;;;4265:1;4262;4255:12;4233:36;;4288:63;4343:7;4332:8;4321:9;4317:24;4288:63;:::i;:::-;4278:73;;;3142:1215;;;;;:::o;4362:456::-;4439:6;4447;4455;4508:2;4496:9;4487:7;4483:23;4479:32;4476:52;;;4524:1;4521;4514:12;4476:52;4563:9;4550:23;4582:31;4607:5;4582:31;:::i;:::-;4632:5;-1:-1:-1;4689:2:1;4674:18;;4661:32;4702:33;4661:32;4702:33;:::i;:::-;4362:456;;4754:7;;-1:-1:-1;;;4808:2:1;4793:18;;;;4780:32;;4362:456::o;4823:180::-;4882:6;4935:2;4923:9;4914:7;4910:23;4906:32;4903:52;;;4951:1;4948;4941:12;4903:52;-1:-1:-1;4974:23:1;;4823:180;-1:-1:-1;4823:180:1:o;5405:118::-;5491:5;5484:13;5477:21;5470:5;5467:32;5457:60;;5513:1;5510;5503:12;5528:382;5593:6;5601;5654:2;5642:9;5633:7;5629:23;5625:32;5622:52;;;5670:1;5667;5660:12;5622:52;5709:9;5696:23;5728:31;5753:5;5728:31;:::i;:::-;5778:5;-1:-1:-1;5835:2:1;5820:18;;5807:32;5848:30;5807:32;5848:30;:::i;:::-;5897:7;5887:17;;;5528:382;;;;;:::o;5915:316::-;5992:6;6000;6008;6061:2;6049:9;6040:7;6036:23;6032:32;6029:52;;;6077:1;6074;6067:12;6029:52;-1:-1:-1;;6100:23:1;;;6170:2;6155:18;;6142:32;;-1:-1:-1;6221:2:1;6206:18;;;6193:32;;5915:316;-1:-1:-1;5915:316:1:o;6236:388::-;6304:6;6312;6365:2;6353:9;6344:7;6340:23;6336:32;6333:52;;;6381:1;6378;6371:12;6333:52;6420:9;6407:23;6439:31;6464:5;6439:31;:::i;:::-;6489:5;-1:-1:-1;6546:2:1;6531:18;;6518:32;6559:33;6518:32;6559:33;:::i;6629:380::-;6708:1;6704:12;;;;6751;;;6772:61;;6826:4;6818:6;6814:17;6804:27;;6772:61;6879:2;6871:6;6868:14;6848:18;6845:38;6842:161;;6925:10;6920:3;6916:20;6913:1;6906:31;6960:4;6957:1;6950:15;6988:4;6985:1;6978:15;6842:161;;6629:380;;;:::o;7014:356::-;7216:2;7198:21;;;7235:18;;;7228:30;7294:34;7289:2;7274:18;;7267:62;7361:2;7346:18;;7014:356::o;8157:127::-;8218:10;8213:3;8209:20;8206:1;8199:31;8249:4;8246:1;8239:15;8273:4;8270:1;8263:15;8289:127;8350:10;8345:3;8341:20;8338:1;8331:31;8381:4;8378:1;8371:15;8405:4;8402:1;8395:15;8421:168;8461:7;8527:1;8523;8519:6;8515:14;8512:1;8509:21;8504:1;8497:9;8490:17;8486:45;8483:71;;;8534:18;;:::i;:::-;-1:-1:-1;8574:9:1;;8421:168::o;8594:135::-;8633:3;8654:17;;;8651:43;;8674:18;;:::i;:::-;-1:-1:-1;8721:1:1;8710:13;;8594:135::o;9551:217::-;9591:1;9617;9607:132;;9661:10;9656:3;9652:20;9649:1;9642:31;9696:4;9693:1;9686:15;9724:4;9721:1;9714:15;9607:132;-1:-1:-1;9753:9:1;;9551:217::o;10183:125::-;10248:9;;;10269:10;;;10266:36;;;10282:18;;:::i;11420:184::-;11490:6;11543:2;11531:9;11522:7;11518:23;11514:32;11511:52;;;11559:1;11556;11549:12;11511:52;-1:-1:-1;11582:16:1;;11420:184;-1:-1:-1;11420:184:1:o;11888:245::-;11955:6;12008:2;11996:9;11987:7;11983:23;11979:32;11976:52;;;12024:1;12021;12014:12;11976:52;12056:9;12050:16;12075:28;12097:5;12075:28;:::i;18663:401::-;18865:2;18847:21;;;18904:2;18884:18;;;18877:30;18943:34;18938:2;18923:18;;18916:62;-1:-1:-1;;;19009:2:1;18994:18;;18987:35;19054:3;19039:19;;18663:401::o;19069:399::-;19271:2;19253:21;;;19310:2;19290:18;;;19283:30;19349:34;19344:2;19329:18;;19322:62;-1:-1:-1;;;19415:2:1;19400:18;;19393:33;19458:3;19443:19;;19069:399::o;20182:128::-;20249:9;;;20270:11;;;20267:37;;;20284:18;;:::i;22606:251::-;22676:6;22729:2;22717:9;22708:7;22704:23;22700:32;22697:52;;;22745:1;22742;22735:12;22697:52;22777:9;22771:16;22796:31;22821:5;22796:31;:::i;22862:980::-;23124:4;23172:3;23161:9;23157:19;23203:6;23192:9;23185:25;23229:2;23267:6;23262:2;23251:9;23247:18;23240:34;23310:3;23305:2;23294:9;23290:18;23283:31;23334:6;23369;23363:13;23400:6;23392;23385:22;23438:3;23427:9;23423:19;23416:26;;23477:2;23469:6;23465:15;23451:29;;23498:1;23508:195;23522:6;23519:1;23516:13;23508:195;;;23587:13;;-1:-1:-1;;;;;23583:39:1;23571:52;;23678:15;;;;23643:12;;;;23619:1;23537:9;23508:195;;;-1:-1:-1;;;;;;;23759:32:1;;;;23754:2;23739:18;;23732:60;-1:-1:-1;;;23823:3:1;23808:19;23801:35;23720:3;22862:980;-1:-1:-1;;;22862:980:1:o;24459:306::-;24547:6;24555;24563;24616:2;24604:9;24595:7;24591:23;24587:32;24584:52;;;24632:1;24629;24622:12;24584:52;24661:9;24655:16;24645:26;;24711:2;24700:9;24696:18;24690:25;24680:35;;24755:2;24744:9;24740:18;24734:25;24724:35;;24459:306;;;;;:::o

Swarm Source

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