S Price: $0.536623 (-9.40%)

Contract

0x20De307CF2B59495B9e6349e8a25788920C43Cf9

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Swap Proxy115201612025-03-04 1:56:482 days ago1741053408IN
0x20De307C...920C43Cf9
0 S0.0021344955
Approve115191462025-03-04 1:50:592 days ago1741053059IN
0x20De307C...920C43Cf9
0 S0.0032147966
Approve115189912025-03-04 1:50:052 days ago1741053005IN
0x20De307C...920C43Cf9
0 S0.0031003263.65
Add Initial Liqu...115188292025-03-04 1:49:142 days ago1741052954IN
0x20De307C...920C43Cf9
60 S0.0154564355
Initialize115187862025-03-04 1:48:592 days ago1741052939IN
0x20De307C...920C43Cf9
0 S0.1284657555
Set Swap Proxy115187622025-03-04 1:48:502 days ago1741052930IN
0x20De307C...920C43Cf9
0 S0.0032289955

Latest 1 internal transaction

Parent Transaction Hash Block From To
115188292025-03-04 1:49:142 days ago1741052954
0x20De307C...920C43Cf9
60 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-04
*/

/**
 *Submitted for verification at SonicScan.org on 2025-03-02
*/

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

// Slippage sabiti - %50 slippage toleransı
uint256 constant MAX_SLIPPAGE = 50;

// OpenZeppelin Contracts v5.0.1

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "R1");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism
 */
abstract contract Ownable {
    address private _owner;

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

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert("O1");
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O2");
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "O1");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    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 returns (string memory) {
        return _name;
    }

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

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

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

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

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

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

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

    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "T1");
        require(to != address(0), "T2");
        require(amount > 0, "T3");
        
        _beforeTokenTransfer(from, to, amount);
        
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "T4");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        
        emit Transfer(from, to, amount);
        
        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "E3");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "E4");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "E5");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    // Mevcut fonksiyonlar
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

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

    // Yeni eklenen fonksiyonlar
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    // WETH ile ilgili fonksiyonlar
    function swapExactTokensForWETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactWETHForETH(
        uint wethAmount,
        uint amountOutMin,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface IMetropolisFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

// Pair interface'ini de ekleyelim
interface IMetropolisPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

// SwapProxy interface
interface ISwapProxy {
    function sendETHToFarmer() external;
    function farmerContract() external view returns (address);
    function setFarmerContract(address farmerContract) external;
}

// FARMER Token Contract
contract FARMER is ERC20, ReentrancyGuard, Ownable {
    // Constants
    uint256 private constant TOTAL_SUPPLY = 1_000_000 * 10**18;
    uint256 private constant TAX_RATE = 5; // 5%
    uint256 private constant LIQUIDITY_TAX = 25; // 2.5%
    uint256 private constant AIRDROP_TAX = 25; // 2.5%
    uint256 private constant MIN_HOLDER_AMOUNT = 10 * 10**18; // 10 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 20 * 10**18; // 20 tokens minimum for processing (azaltıldı)
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;

    // Holder tracking
    mapping(address => bool) public isHolder;
    address[] public holders;

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event SwapFailed(string reason);
    event ProcessStarted(uint256 tokensForLiquidity, uint256 tokensForAirdrop);
    event SwapSuccessful(uint256 tokensSwapped, uint256 wethReceived);
    event TreasuryWalletUpdated(address oldTreasury, address newTreasury);
    event LiquidityAddFailed(string reason);
    event AirdropFailed(string reason);
    event ApprovalRefreshed(address token, address spender, uint256 amount);
    event WaitingForTreasuryTransfer(uint256 amount);
    event SwapProxySet(address indexed proxyAddress);
    event ManualSwapCompleted(uint256 tokenAmount, uint256 ethReceived);
    event ETHReceived(address indexed sender, uint256 amount);

    uint256 private _pendingLiquidityTokens;
    uint256 private _pendingAirdropTokens;
    bool private _initialized;
    bool private _inSwap;

    // Proxy kontrat adresi
    address public swapProxy;
    bool public swapProxySet;

    // Değişkenler
    bool public tradingEnabled;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromTradingRestriction;
    mapping(address => bool) private _isAllowedToSell;
    mapping(address => bool) private _isAllowedToBuy;

    constructor() ERC20("FARMER", "FARM") Ownable(msg.sender) {
        address _metropolisRouter = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3;
        address _metropolisFactory = 0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0;
        address _sonicToken = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
        address _treasuryWallet = 0x95503A306cD81e08c0c43C49FAae71165937d175;

        require(_metropolisRouter != address(0) && _metropolisFactory != address(0) && _sonicToken != address(0) && _treasuryWallet != address(0), "F1");

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = _treasuryWallet;

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "F2");
        _initialized = true;

        // Try to get existing pair first
        liquidityPair = metropolisFactory.getPair(address(this), sonicToken);
        
        // If pair doesn't exist, create it
        if (liquidityPair == address(0)) {
            liquidityPair = metropolisFactory.createPair(address(this), sonicToken);
        }
        
        require(liquidityPair != address(0), "F3");

        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        require(IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max), "F4");
        IERC20(sonicToken).approve(liquidityPair, type(uint256).max);
        IERC20(address(this)).approve(liquidityPair, type(uint256).max);
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (takeFee) {
            // Vergi hesapla
            uint256 taxAmount = amount * TAX_RATE / 100;
            
            if (taxAmount > 0) {
                // Vergiyi likidite ve airdrop için ayır
                uint256 liquidityTokens = taxAmount * LIQUIDITY_TAX / 100;
                uint256 airdropTokens = taxAmount * AIRDROP_TAX / 100;
                
                // Vergi miktarını ana miktardan düş
                uint256 transferAmount = amount - taxAmount;
                
                // Vergiyi kontrata aktar
                super._transfer(sender, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(sender, recipient, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Holder durumunu güncelle
                _updateHolder(sender, balanceOf(sender) >= MIN_HOLDER_AMOUNT);
                _updateHolder(recipient, balanceOf(recipient) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(sender, recipient, amount);
        
        // Holder durumunu güncelle
        _updateHolder(sender, balanceOf(sender) >= MIN_HOLDER_AMOUNT);
        _updateHolder(recipient, balanceOf(recipient) >= MIN_HOLDER_AMOUNT);
    }

    function _updateHolder(address account, bool isHolderStatus) private {
        if (account != liquidityPair && account != address(this)) {
            if (isHolderStatus && !isHolder[account]) {
                isHolder[account] = true;
                holders.push(account);
            } else if (!isHolderStatus && isHolder[account]) {
                isHolder[account] = false;
                
                // Remove from holders array
                for (uint256 i = 0; i < holders.length; i++) {
                    if (holders[i] == account) {
                        holders[i] = holders[holders.length - 1];
                        holders.pop();
                        break;
                    }
                }
            }
        }
    }

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (artırıldı)
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalTokensToSwap > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalTokensToSwap;
            tokensForLiquidity = tokensForLiquidity * ratio / 1e18;
            tokensForAirdrop = tokensForAirdrop * ratio / 1e18;
            totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= tokensForLiquidity;
            _pendingAirdropTokens -= tokensForAirdrop;
        } else {
            // Tüm bekleyen miktarları sıfırla
            _pendingLiquidityTokens = 0;
            _pendingAirdropTokens = 0;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Kontrat bakiyesini kontrol et
        uint256 contractBalance = IERC20(address(this)).balanceOf(address(this));
        if (contractBalance < totalTokensToSwap) {
            // Eğer kontrat bakiyesi yetersizse, işlemi iptal et ve bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            _inSwap = false;
            emit SwapFailed("Insufficient contract balance");
            return;
        }
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Process swap - ETH doğrudan kontrata gelecek
        uint256 ethReceived = _processSwap(totalTokensToSwap);
        
        if (ethReceived == 0) {
            // Eğer swap başarısız olursa, bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            _inSwap = false;
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            // Eğer ETH alınmadıysa, bekleyen miktarları geri ekle
            _pendingLiquidityTokens += tokensForLiquidity;
            _pendingAirdropTokens += tokensForAirdrop;
            emit SwapFailed("No ETH received from swap");
            _inSwap = false;
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 ethForAirdrop = actualEthReceived - ethForLiquidity;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
        
        _inSwap = false;
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        require(swapProxySet, "Swap proxy not set");
        
        // Daha küçük bir miktarla başla
        uint256 adjustedAmount = tokenAmount;
        if (adjustedAmount > 50 * 10**18) {
            adjustedAmount = 50 * 10**18; // Maksimum 50 token swap et
        }
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = metropolisRouter.WETH();
        
        // Swap işlemi için minimum çıktı miktarını hesapla
        // Daha yüksek slippage toleransı için minimum çıktı miktarını 0 olarak ayarlıyoruz
        uint256 minAmountOut = 0; // Minimum çıktı miktarı 0 olarak ayarlandı
        
        // Swap işleminden önce onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Gas limitini artır ve deadline'ı uzat
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // FARMER -> ETH swap işlemi - FeeOnTransfer fonksiyonu kullanıyoruz
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            adjustedAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // Swap başarılı oldu, proxy kontratın ETH'yi kontrata göndermesini iste
            try ISwapProxy(swapProxy).sendETHToFarmer() {
                // Kontratın ETH bakiyesini kontrol et
                uint256 contractEthBalance = address(this).balance;
                uint256 ethReceived = contractEthBalance - initialEthBalance;
                
                if (ethReceived > 0) {
                    emit SwapSuccessful(adjustedAmount, ethReceived);
                    
                    // Eğer orijinal miktardan daha az swap ettiyse ve başarılı olduysa, kalan miktarı da swap et
                    if (adjustedAmount < tokenAmount) {
                        uint256 remainingAmount = tokenAmount - adjustedAmount;
                        uint256 additionalEth = _processSwap(remainingAmount);
                        return ethReceived + additionalEth;
                    }
                    
                    return ethReceived;
                } else {
                    emit SwapFailed("No ETH received after proxy transfer");
                    return 0;
                }
            } catch Error(string memory reason) {
                emit SwapFailed(string(abi.encodePacked("Proxy ETH transfer failed: ", reason)));
                return 0;
            } catch {
                emit SwapFailed("Proxy ETH transfer failed: unknown error");
                return 0;
            }
        } catch Error(string memory reason) {
            // Hata mesajını kontrol et
            if (bytes(reason).length > 0) {
                // Eğer hata "E5" ise, daha küçük bir miktarla tekrar dene
                if (keccak256(bytes(reason)) == keccak256(bytes("E5"))) {
                    // Miktarı yarıya düşür ve tekrar dene
                    uint256 halfAmount = adjustedAmount / 2;
                    if (halfAmount > 0) {
                        emit SwapFailed("E5 error, retrying with half amount");
                        return _processSwap(halfAmount);
                    }
                }
            }
            emit SwapFailed(reason);
            return 0;
        } catch {
            // Bilinmeyen hata durumunda, daha küçük bir miktarla tekrar dene
            uint256 halfAmount = adjustedAmount / 2;
            if (halfAmount > 0 && halfAmount != adjustedAmount) {
                emit SwapFailed("Unknown swap error, retrying with half amount");
                return _processSwap(halfAmount);
            }
            emit SwapFailed("Unknown swap error");
            return 0;
        }
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // Bu fonksiyon artık kullanılmıyor, kaldırılabilir
        // Doğrudan _addLiquidity fonksiyonu kullanılıyor
    }

    // Likidite ekleme işlemi
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // Daha yüksek slippage toleransı için minimum miktarları düşür
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            address(this),
            block.timestamp + 3600 // Deadline'ı 1 saate çıkardık
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("E");
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        uint256 amountPerHolder = amount / holdersCount;
        if (amountPerHolder == 0) return;
        
        for (uint256 i = 0; i < holdersCount; i++) {
            address holder = holders[i];
            if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                // ETH'yi doğrudan holder'a gönder
                (bool success, ) = holder.call{value: amountPerHolder}("");
                if (!success) {
                    emit AirdropFailed("ETH transfer failed");
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }

    // Initial liquidity function with WSonic
    function addInitialLiquidityWithWSonic(uint256 tokenAmount, uint256 sonicAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // Tüm FARMER tokenlarını ETH ile likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokensAndETH() external payable onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

    function setRouter(address _router) external onlyOwner {
        require(_router != address(0), "IR");
        metropolisRouter = IMetropolisRouter(_router);
    }

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "CF");
        IERC20(_token).transfer(owner(), _amount);
    }

    // View functions for pending amounts
    function getPendingLiquidityTokens() external view returns (uint256) {
        return _pendingLiquidityTokens;
    }

    function getPendingAirdropTokens() external view returns (uint256) {
        return _pendingAirdropTokens;
    }

    // Manuel trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (artırıldı)
        uint256 totalPendingTokens = _pendingLiquidityTokens + _pendingAirdropTokens;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalPendingTokens > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalPendingTokens;
            uint256 processLiquidityTokens = _pendingLiquidityTokens * ratio / 1e18;
            uint256 processAirdropTokens = _pendingAirdropTokens * ratio / 1e18;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= processLiquidityTokens;
            _pendingAirdropTokens -= processAirdropTokens;
            
            // Geçici değişkenleri ayarla
            uint256 tempPendingLiquidityTokens = _pendingLiquidityTokens;
            uint256 tempPendingAirdropTokens = _pendingAirdropTokens;
            
            // Bekleyen miktarları sıfırla
            _pendingLiquidityTokens = processLiquidityTokens;
            _pendingAirdropTokens = processAirdropTokens;
            
            try this.processLiquidityAndAirdrop() {
                // İşlem başarılı
            } catch Error(string memory reason) {
                emit SwapFailed(reason);
                // Bekleyen miktarları geri yükle
                _pendingLiquidityTokens = tempPendingLiquidityTokens + processLiquidityTokens;
                _pendingAirdropTokens = tempPendingAirdropTokens + processAirdropTokens;
            } catch {
                emit SwapFailed("Unknown error in triggerProcessing");
                // Bekleyen miktarları geri yükle
                _pendingLiquidityTokens = tempPendingLiquidityTokens + processLiquidityTokens;
                _pendingAirdropTokens = tempPendingAirdropTokens + processAirdropTokens;
            }
        } else {
            // Normal işlemi başlat
            try this.processLiquidityAndAirdrop() {
                // İşlem başarılı
            } catch Error(string memory reason) {
                emit SwapFailed(reason);
            } catch {
                emit SwapFailed("Unknown error in triggerProcessing");
            }
        }
    }

    // Router için onayları yenile
    function refreshAllApprovals() external onlyOwner {
        // Router için onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Sonic token için onayları yenile
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {
            emit ApprovalRefreshed(sonicToken, address(metropolisRouter), type(uint256).max);
        } catch {}
        
        // Likidite çifti için onayları yenile
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(sonicToken, liquidityPair, type(uint256).max);
            } catch {}
            
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(address(this), liquidityPair, type(uint256).max);
            } catch {}
        }
    }

    // Manuel swap işlemi
    function manualSwap(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "Amount must be greater than 0");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient balance");
        require(swapProxySet, "Swap proxy not set");
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemi
        uint256 ethReceived = _processSwap(tokenAmount);
        
        // Swap sonucunu kontrol et
        if (ethReceived == 0) {
            revert("Swap failed, no ETH received");
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            revert("No ETH received from swap");
        }
        
        emit ManualSwapCompleted(tokenAmount, ethReceived);
    }

    // Treasury wallet'ı güncelleme fonksiyonu
    function setTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "ZA");
        
        address oldTreasury = treasuryWallet;
        treasuryWallet = newTreasuryWallet;
        
        emit TreasuryWalletUpdated(oldTreasury, newTreasuryWallet);
    }

    // Manuel likidite ve airdrop işlemi
    function manualLiquidityAndAirdrop(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "NT");
        require(IERC20(address(this)).balanceOf(address(this)) >= tokenAmount, "IB");
        require(swapProxySet, "Swap proxy not set");
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemini gerçekleştir
        uint256 ethReceived = _processSwap(tokenAmount);
        
        if (ethReceived == 0) {
            revert("Swap failed, no ETH received");
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            revert("No ETH received from swap");
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * LIQUIDITY_TAX / 100;
        uint256 ethForAirdrop = actualEthReceived * AIRDROP_TAX / 100;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokenAmount * LIQUIDITY_TAX / 100);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
    }

    // Kontratın ETH alabilmesi için receive fonksiyonu
    receive() external payable {
        // ETH alındığında event yayınla
        if (msg.value > 0) {
            emit ETHReceived(msg.sender, msg.value);
        }
    }

    // Set swap proxy address
    function setSwapProxy(address _swapProxy) external onlyOwner {
        require(_swapProxy != address(0), "Invalid address");
        
        // Proxy kontratın doğru olduğunu kontrol et
        try ISwapProxy(_swapProxy).farmerContract() returns (address farmerAddr) {
            // Eğer proxy kontratı zaten başka bir FARMER kontratına ayarlanmışsa ve bu kontrat değilse, hata ver
            if (farmerAddr != address(0) && farmerAddr != address(this)) {
                revert("Proxy already set to another contract");
            }
        } catch {
            // Eğer farmerContract fonksiyonu yoksa, bu doğru proxy kontratı değildir
            revert("Invalid proxy contract");
        }
        
        // Proxy kontratı ayarla
        swapProxy = _swapProxy;
        swapProxySet = true;
        
        // Proxy kontratına bu kontratı ayarla
        try ISwapProxy(_swapProxy).setFarmerContract(address(this)) {
            // Başarılı
        } catch Error(string memory reason) {
            // Hata durumunda event yayınla
            emit SwapFailed(string(abi.encodePacked("Failed to set farmer contract on proxy: ", reason)));
        } catch {
            // Bilinmeyen hata durumunda event yayınla
            emit SwapFailed("Unknown error setting farmer contract on proxy");
        }
        
        emit SwapProxySet(_swapProxy);
    }

    // Override _transfer function from ERC20
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "T1");
        require(to != address(0), "T2");
        require(amount > 0, "T3");
        
        // Kontrat içi işlemlerde vergi alma
        if (_inSwap) {
            super._transfer(from, to, amount);
            return;
        }
        
        // Exclude transfers from/to excluded addresses
        bool takeFee = !(_isExcludedFromFee[from] || _isExcludedFromFee[to]);
        
        // No fees for transfers to/from DEX pairs during initial liquidity provision
        if (!tradingEnabled && (from == liquidityPair || to == liquidityPair)) {
            takeFee = false;
        }
        
        // Check if trading is enabled for normal transfers
        if (tradingEnabled && !_isExcludedFromTradingRestriction[from] && !_isExcludedFromTradingRestriction[to]) {
            // If transfer is to the pair (selling) and trading is enabled, check if it's allowed
            if (to == liquidityPair) {
                require(_isAllowedToSell[from], "Not allowed to sell");
            }
            
            // If transfer is from the pair (buying) and trading is enabled, check if it's allowed
            if (from == liquidityPair) {
                require(_isAllowedToBuy[to], "Not allowed to buy");
            }
        }
        
        // Transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
        
        // Otomatik likidite ve airdrop işlemini tetikle
        // Sadece satış işlemlerinde ve fee alınan durumlarda
        if (takeFee && to == liquidityPair && !_inSwap && _pendingLiquidityTokens + _pendingAirdropTokens > 0) {
            // Bekleyen token miktarı belirli bir eşiği geçtiğinde işlemi tetikle
            uint256 threshold = 10 * 10**18; // 10 token eşiği
            
            if (_pendingLiquidityTokens + _pendingAirdropTokens >= threshold) {
                // Eğer bekleyen token miktarı çok büyükse, işlemi birkaç parçaya böl
                if (_pendingLiquidityTokens + _pendingAirdropTokens > 100 * 10**18) {
                    // Kontrat çağrısı yerine doğrudan fonksiyonu çağır
                    try this.processLiquidityAndAirdrop() {
                        // Başarılı
                    } catch {
                        // Hata durumunda sessizce devam et
                    }
                } else {
                    // Kontrat çağrısı yerine doğrudan fonksiyonu çağır
                    try this.processLiquidityAndAirdrop() {
                        // Başarılı
                    } catch {
                        // Hata durumunda sessizce devam et
                    }
                }
            }
        }
    }

    // Trading ile ilgili fonksiyonlar
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
    }
    
    function disableTrading() external onlyOwner {
        tradingEnabled = false;
    }
    
    function excludeFromFee(address account, bool excluded) external onlyOwner {
        _isExcludedFromFee[account] = excluded;
    }
    
    function excludeFromTradingRestriction(address account, bool excluded) external onlyOwner {
        _isExcludedFromTradingRestriction[account] = excluded;
    }
    
    function setAllowedToSell(address account, bool allowed) external onlyOwner {
        _isAllowedToSell[account] = allowed;
    }
    
    function setAllowedToBuy(address account, bool allowed) external onlyOwner {
        _isAllowedToBuy[account] = allowed;
    }
    
    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }
    
    function isExcludedFromTradingRestriction(address account) external view returns (bool) {
        return _isExcludedFromTradingRestriction[account];
    }
    
    function isAllowedToSell(address account) external view returns (bool) {
        return _isAllowedToSell[account];
    }
    
    function isAllowedToBuy(address account) external view returns (bool) {
        return _isAllowedToBuy[account];
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"AirdropFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApprovalRefreshed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"LiquidityAddFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSwapCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"}],"name":"SwapProxySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReceived","type":"uint256"}],"name":"SwapSuccessful","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":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaitingForTreasuryTransfer","type":"event"},{"inputs":[],"name":"addInitialLiquidityWithAllTokensAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithWSonic","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrading","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":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromTradingRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAllowedToBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAllowedToSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromTradingRestriction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metropolisFactory","outputs":[{"internalType":"contract IMetropolisFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisRouter","outputs":[{"internalType":"contract IMetropolisRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapProxy","type":"address"}],"name":"setSwapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxySet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b61463b80620004186000396000f3fe60806040526004361061028c5760003560e01c8063801b51d91161015a578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461085e578063e6efd91a14610866578063e85ceee814610886578063ed9cacfe146108bf578063f2fde38b146108d4578063fd7c9fab146108f457600080fd5b8063c0d7865514610768578063c84a705c14610788578063d4d7b19a146107a8578063d720a2a8146107d8578063dd62ed3e146107f8578063df8408fe1461083e57600080fd5b8063975b87e811610113578063975b87e81461068e578063a8602fea146106ae578063a9059cbb146106ce578063b70143c9146106ee578063b77e895c1461070e578063b9276e4b1461074757600080fd5b8063801b51d9146105f1578063808a5457146106115780638129fc1c146106315780638a8c523c146106465780638da5cb5b1461065b57806395d89b411461067957600080fd5b80634ada218b116101fe5780636a3c68fc116101b75780636a3c68fc146105125780636d62062a146105325780636ec4be901461056b57806370a08231146105915780637136982b146105c75780637ac84fc1146105dc57600080fd5b80634ada218b146104415780635342acb414610462578063573761981461049b5780635d76b04c146104bb5780635fe8e7cc146104d057806362b6327a146104f257600080fd5b806323b872dd1161025057806323b872dd146103785780632a11ced014610398578063313ce567146103d0578063397883d2146103ec578063461a3a95146104015780634626402b1461042157600080fd5b806306fdde03146102d457806308dee2b4146102ff578063095ea7b31461031e57806317700f011461034e57806318160ddd1461036357600080fd5b366102cf5734156102cd5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102e057600080fd5b506102e9610914565b6040516102f69190613f83565b60405180910390f35b34801561030b57600080fd5b50600e545b6040519081526020016102f6565b34801561032a57600080fd5b5061033e610339366004613fcb565b6109a6565b60405190151581526020016102f6565b34801561035a57600080fd5b506102cd6109c0565b34801561036f57600080fd5b50600254610310565b34801561038457600080fd5b5061033e610393366004613ff7565b6109d7565b3480156103a457600080fd5b506103b86103b3366004614038565b6109fb565b6040516001600160a01b0390911681526020016102f6565b3480156103dc57600080fd5b50604051601281526020016102f6565b3480156103f857600080fd5b506102cd610a25565b34801561040d57600080fd5b506009546103b8906001600160a01b031681565b34801561042d57600080fd5b50600b546103b8906001600160a01b031681565b34801561044d57600080fd5b5060105461033e90600160b81b900460ff1681565b34801561046e57600080fd5b5061033e61047d366004614051565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156104a757600080fd5b506102cd6104b6366004613fcb565b610d4c565b3480156104c757600080fd5b50600f54610310565b3480156104dc57600080fd5b506104e5610e18565b6040516102f691906140b9565b3480156104fe57600080fd5b506007546103b8906001600160a01b031681565b34801561051e57600080fd5b506102cd61052d3660046140da565b610e79565b34801561053e57600080fd5b5061033e61054d366004614051565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057757600080fd5b506010546103b8906201000090046001600160a01b031681565b34801561059d57600080fd5b506103106105ac366004614051565b6001600160a01b031660009081526020819052604090205490565b3480156105d357600080fd5b50600d54610310565b3480156105e857600080fd5b506102cd610eac565b3480156105fd57600080fd5b506102cd61060c3660046140da565b6112b4565b34801561061d57600080fd5b50600a546103b8906001600160a01b031681565b34801561063d57600080fd5b506102cd6112e7565b34801561065257600080fd5b506102cd61165d565b34801561066757600080fd5b506006546001600160a01b03166103b8565b34801561068557600080fd5b506102e961167a565b34801561069a57600080fd5b506102cd6106a9366004614113565b611689565b3480156106ba57600080fd5b506102cd6106c9366004614051565b611dcc565b3480156106da57600080fd5b5061033e6106e9366004613fcb565b611e69565b3480156106fa57600080fd5b506102cd610709366004614038565b611e77565b34801561071a57600080fd5b5061033e610729366004614051565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561075357600080fd5b5060105461033e90600160b01b900460ff1681565b34801561077457600080fd5b506102cd610783366004614051565b612034565b34801561079457600080fd5b506102cd6107a3366004614051565b612099565b3480156107b457600080fd5b5061033e6107c3366004614051565b600c6020526000908152604090205460ff1681565b3480156107e457600080fd5b506102cd6107f3366004614038565b61239e565b34801561080457600080fd5b50610310610813366004614135565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084a57600080fd5b506102cd6108593660046140da565b6125c6565b6102cd6125f9565b34801561087257600080fd5b506102cd6108813660046140da565b612847565b34801561089257600080fd5b5061033e6108a1366004614051565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cb57600080fd5b506102cd61287a565b3480156108e057600080fd5b506102cd6108ef366004614051565b612afe565b34801561090057600080fd5b506008546103b8906001600160a01b031681565b60606003805461092390614163565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90614163565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b6000336109b4818585612b4a565b60019150505b92915050565b6109c8612bfc565b6010805460ff60b81b19169055565b6000336109e5858285612c4a565b6109f0858585612cb2565b506001949350505050565b600d8181548110610a0b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a2d612bfc565b6000600e541180610a4057506000600f54115b610a765760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610aaa5760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a6d565b600f54600e5468056bc75e2d6310000091600091610ac891906141b3565b905081811115610c8157600081610ae784670de0b6b3a76400006141c6565b610af191906141dd565b90506000670de0b6b3a764000082600e54610b0c91906141c6565b610b1691906141dd565b90506000670de0b6b3a764000083600f54610b3191906141c6565b610b3b91906141dd565b905081600e6000828254610b4f91906141ff565b9250508190555080600f6000828254610b6891906141ff565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610bb757600080fd5b505af1925050508015610bc8575060015b610c7857610bd4614212565b806308c379a003610c385750610be8614269565b80610bf35750610c3a565b6000805160206145e683398151915281604051610c109190613f83565b60405180910390a1610c2285846141b3565b600e55610c2f84836141b3565b600f5550610c78565b505b6000805160206145e6833981519152604051610c55906142f3565b60405180910390a1610c6784836141b3565b600e55610c7483826141b3565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cbc57600080fd5b505af1925050508015610ccd575060015b610d4857610cd9614212565b806308c379a003610d225750610ced614269565b80610cf85750610d24565b6000805160206145e683398151915281604051610d159190613f83565b60405180910390a1505050565b505b6000805160206145e6833981519152604051610d3f906142f3565b60405180910390a15b5050565b610d54612bfc565b306001600160a01b03831603610d915760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a6d565b816001600160a01b031663a9059cbb610db26006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610dd0929190614335565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e13919061434e565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561099c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e52575050505050905090565b610e81612bfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610ece5760405162461bcd60e51b8152600401610a6d9061436b565b6002600555601054610100900460ff1615610f105760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a6d565b6010805461ff001916610100179055600e54600f5481158015610f31575080155b15610f485750506010805461ff00191690556112ad565b68056bc75e2d631000006000610f5e83856141b3565b90508181111561100a57600081610f7d84670de0b6b3a76400006141c6565b610f8791906141dd565b9050670de0b6b3a7640000610f9c82876141c6565b610fa691906141dd565b9450670de0b6b3a7640000610fbb82866141c6565b610fc591906141dd565b9350610fd184866141b3565b915084600e6000828254610fe591906141ff565b9250508190555083600f6000828254610ffe91906141ff565b90915550611015915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190614387565b9050818110156111555784600e60008282546110cc91906141b3565b9250508190555083600f60008282546110e591906141b3565b90915550506010805461ff00191690556040516000805160206145e683398151915290611143906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a150505050506112ad565b60075461116f9030906001600160a01b0316600019612b4a565b47600061117b8461308b565b9050806000036111cd5786600e600082825461119791906141b3565b9250508190555085600f60008282546111b091906141b3565b90915550506010805461ff0019169055506112ad95505050505050565b478281116112425787600e60008282546111e791906141b3565b9250508190555086600f600082825461120091906141b3565b90915550506040516000805160206145e683398151915290611221906143a0565b60405180910390a150506010805461ff0019169055506112ad945050505050565b600061124e84836141ff565b905060008661125d8b846141c6565b61126791906141dd565b9050600061127582846141ff565b9050811561128757611287828c6136ad565b80156112965761129681613873565b50506010805461ff00191690555050505050505050505b6001600555565b6112bc612bfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6112ef612bfc565b60105460ff16156113275760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a6d565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa91906143d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611466576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144591906143d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114a35760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a6d565b6007546114bd9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f59291169060001990600401614335565b6020604051808303816000875af1158015611514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611538919061434e565b6115695760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a6d565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115a19291169060001990600401614335565b6020604051808303816000875af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061434e565b50600a5460405163095ea7b360e01b8152309163095ea7b391611617916001600160a01b03169060001990600401614335565b6020604051808303816000875af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061434e565b50565b611665612bfc565b6010805460ff60b81b1916600160b81b179055565b60606004805461092390614163565b611691612bfc565b600082116116b15760405162461bcd60e51b8152600401610a6d906143f4565b600081116116e65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a6d565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117479190614387565b101561177a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614387565b10156118195760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a6d565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061184d90339030908690600401614410565b6020604051808303816000875af115801561186c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611890919061434e565b6118c15760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a6d565b6007546118d99030906001600160a01b031684612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261190f929116908590600401614335565b6020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611952919061434e565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611980426102586141b3565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611a18575060408051601f3d908101601f19168201909252611a1591810190614434565b60015b611ca057611a24614212565b806308c379a003611b675750611a38614269565b80611a435750611b69565b600754611a5c9030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611a9392911690600090600401614335565b6020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad6919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b099033908690600401614335565b6020604051808303816000875af1158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c919061434e565b508060405162461bcd60e51b8152600401610a6d9190613f83565b505b600754611b829030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bb992911690600090600401614335565b6020604051808303816000875af1158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611c2f9033908590600401614335565b6020604051808303816000875af1158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c72919061434e565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a6d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614387565b90508015610e135760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611d839033908590600401614335565b6020604051808303816000875af1158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc6919061434e565b50505050565b611dd4612bfc565b6001600160a01b038116611e0f5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a6d565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d3f565b6000336109b4818585612cb2565b611e7f612bfc565b600260055403611ea15760405162461bcd60e51b8152600401610a6d9061436b565b600260055580611ef35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a6d565b30600090815260208190526040902054811115611f495760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a6d565b601054600160b01b900460ff16611f725760405162461bcd60e51b8152600401610a6d90614462565b476000611f7e8361308b565b905080600003611fd05760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b47828111611ff05760405162461bcd60e51b8152600401610a6d906143a0565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b61203c612bfc565b6001600160a01b0381166120775760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a6d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6120a1612bfc565b6001600160a01b0381166120e95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a6d565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612143575060408051601f3d908101601f19168201909252612140918101906143d7565b60015b6121885760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a6d565b6001600160a01b038116158015906121a957506001600160a01b0381163014155b156122045760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a6d565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040516324872d5b60e21b815230600482015263921cb56c90602401600060405180830381600087803b15801561227457600080fd5b505af1925050508015612285575060015b61236757612291614212565b806308c379a0036122f857506122a5614269565b806122b057506122fa565b6000805160206145e6833981519152816040516020016122d0919061448e565b60408051601f19818403018152908290526122ea91613f83565b60405180910390a150612367565b505b6000805160206145e683398151915260405161235e906020808252602e908201527f556e6b6e6f776e206572726f722073657474696e67206661726d657220636f6e60408201526d7472616374206f6e2070726f787960901b606082015260800190565b60405180910390a15b6040516001600160a01b038216907f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6123a6612bfc565b6002600554036123c85760405162461bcd60e51b8152600401610a6d9061436b565b6002600555806123ea5760405162461bcd60e51b8152600401610a6d906143f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190614387565b101561247e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b601054600160b01b900460ff166124a75760405162461bcd60e51b8152600401610a6d90614462565b6007546124c19030906001600160a01b0316600019612b4a565b4760006124cd8361308b565b90508060000361251f5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b4782811161253f5760405162461bcd60e51b8152600401610a6d906143a0565b600061254b84836141ff565b90506000606461255c6019846141c6565b61256691906141dd565b9050600060646125776019856141c6565b61258191906141dd565b905081156125a9576125a982606461259a60198b6141c6565b6125a491906141dd565b6136ad565b80156125b8576125b881613873565b505060016005555050505050565b6125ce612bfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b612601612bfc565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126639190614387565b9050600081116126855760405162461bcd60e51b8152600401610a6d906143f4565b600034116126ba5760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a6d565b6007546126d29030906001600160a01b031683612b4a565b6007546001600160a01b031663f305d719343084600080336126f6426102586141b3565b6040518863ffffffff1660e01b8152600401612717969594939291906144e4565b60606040518083038185885af193505050508015612752575060408051601f3d908101601f1916820190925261274f91810190614434565b60015b6128095761275e614212565b806308c379a0036127c25750612772614269565b8061277d57506127c4565b6007546127969030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611b4c573d6000803e3d6000fd5b505b6007546127dd9030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611c72573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b61284f612bfc565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612882612bfc565b60075461289c9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926128d49291169060001990600401614335565b6020604051808303816000875af192505050801561290f575060408051601f3d908101601f1916820190925261290c9181019061434e565b60015b1561296557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261295c926001600160a01b039182169291169060001990614410565b60405180910390a15b600a546001600160a01b031615612afc57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129ae9291169060001990600401614335565b6020604051808303816000875af19250505080156129e9575060408051601f3d908101601f191682019092526129e69181019061434e565b60015b15612a3f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a36926001600160a01b039182169291169060001990614410565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612a71916001600160a01b03169060001990600401614335565b6020604051808303816000875af1925050508015612aac575060408051601f3d908101601f19168201909252612aa99181019061434e565b60015b15612afc5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612af39130916001600160a01b03169060001990614410565b60405180910390a15b565b612b06612bfc565b6001600160a01b038116612b415760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a6d565b61165a81613a20565b6001600160a01b03831615801590612b6a57506001600160a01b03821615155b612b9b5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33612c0f6006546001600160a01b031690565b6001600160a01b031614612afc5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a6d565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612ca55760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a6d565b611dc68484848403612b4a565b6001600160a01b038316612ced5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216612d285760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111612d5d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b601054610100900460ff1615612d7857610e13838383613a72565b6001600160a01b03831660009081526011602052604081205460ff1680612db757506001600160a01b03831660009081526011602052604090205460ff165b60105490159150600160b81b900460ff16158015612df95750600a546001600160a01b0385811691161480612df95750600a546001600160a01b038481169116145b15612e02575060005b601054600160b81b900460ff168015612e3457506001600160a01b03841660009081526012602052604090205460ff16155b8015612e5957506001600160a01b03831660009081526012602052604090205460ff16155b15612f4557600a546001600160a01b0390811690841603612ed2576001600160a01b03841660009081526013602052604090205460ff16612ed25760405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc81cd95b1b606a1b6044820152606401610a6d565b600a546001600160a01b0390811690851603612f45576001600160a01b03831660009081526014602052604090205460ff16612f455760405162461bcd60e51b81526020600482015260126024820152714e6f7420616c6c6f77656420746f2062757960701b6044820152606401610a6d565b612f5184848484613bd1565b808015612f6b5750600a546001600160a01b038481169116145b8015612f7f5750601054610100900460ff16155b8015612f9a57506000600f54600e54612f9891906141b3565b115b15611dc657600f54600e54678ac7230489e80000918291612fbb91906141b3565b106130845768056bc75e2d63100000600f54600e54612fda91906141b3565b111561303657306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561301b57600080fd5b505af192505050801561302c575060015b1561308457613084565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561307157600080fd5b505af1925050508015613082575060015b505b5050505050565b60008160000361309d57506000919050565b601054600160b01b900460ff166130c65760405162461bcd60e51b8152600401610a6d90614462565b816802b5e3af16b18800008111156130e457506802b5e3af16b18800005b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131195761311961451f565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319691906143d7565b816001815181106131a9576131a961451f565b6001600160a01b0392831660209182029290920101526007546000916131d491309116600019612b4a565b60006131e242610e106141b3565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261322b928a9289928b9262010000909104909116908990600401614535565b600060405180830381600087803b15801561324557600080fd5b505af1925050508015613256575060015b61347757613262614212565b806308c379a00361338f5750613276614269565b806132815750613391565b80511561335c57604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc40161335c5760006132db6002886141dd565b9050801561335a576000805160206145e683398151915260405161333c9060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161334d8161308b565b9998505050505050505050565b505b6000805160206145e6833981519152816040516133799190613f83565b60405180910390a1506000979650505050505050565b505b600061339e6002876141dd565b90506000811180156133b05750858114155b15613435576000805160206145e6833981519152604051613418906020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b60405180910390a16134298161308b565b98975050505050505050565b6000805160206145e6833981519152604051613379906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134c757600080fd5b505af19250505080156134d8575060015b6135b2576134e4614212565b806308c379a00361353d57506134f8614269565b80613503575061353f565b6000805160206145e6833981519152816040516020016135239190614571565b60408051601f198184030181529082905261337991613f83565b505b6000805160206145e683398151915260405161359d9060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060009695505050505050565b4760006135bf83836141ff565b9050801561363c5760408051888152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a188871015613429576000613614888b6141ff565b905060006136218261308b565b905061362d81846141b3565b9b9a5050505050505050505050565b6000805160206145e68339815191526040516136969060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a150600098975050505050505050565b600060646136bc6032826141ff565b6136c690846141c6565b6136d091906141dd565b9050600060646136e16032826141ff565b6136eb90866141c6565b6136f591906141dd565b6007549091506001600160a01b031663f305d71985308686868361371b42610e106141b3565b6040518863ffffffff1660e01b815260040161373c969594939291906144e4565b60606040518083038185885af193505050508015613777575060408051601f3d908101601f1916820190925261377491810190614434565b60015b61383157613783614212565b806308c379a0036137df5750613797614269565b806137a257506137e1565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137d19190613f83565b60405180910390a150611dc6565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613824906020808252600190820152604560f81b604082015260600190565b60405180910390a1611dc6565b505060408051858152602081018790527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150505050565b600d54801580613881575081155b1561388a575050565b600061389682846141dd565b9050806000036138a557505050565b60005b828110156139e1576000600d82815481106138c5576138c561451f565b6000918252602090912001546001600160a01b0316905080158015906138f457506001600160a01b0381163014155b801561390e5750600a546001600160a01b03828116911614155b156139ce576000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114613960576040519150601f19603f3d011682016040523d82523d6000602084013e613965565b606091505b50509050806139cc577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516139c390602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b50806139d9816145b6565b9150506138a8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613aad5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216613ae85760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111613b1d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b6001600160a01b03831660009081526020819052604090205481811015613b6b5760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a6d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611dc6565b8015613ced5760006064613be66005856141c6565b613bf091906141dd565b90508015613ceb5760006064613c076019846141c6565b613c1191906141dd565b905060006064613c226019856141c6565b613c2c91906141dd565b90506000613c3a84876141ff565b9050613c47883086613a72565b613c52888883613a72565b82600e6000828254613c6491906141b3565b9250508190555081600f6000828254613c7d91906141b3565b90915550613cb6905088678ac7230489e80000613caf826001600160a01b031660009081526020819052604090205490565b1015613d50565b613ce287678ac7230489e80000613caf8a6001600160a01b031660009081526020819052604090205490565b50505050611dc6565b505b613cf8848484613a72565b613d2484678ac7230489e80000613caf876001600160a01b031660009081526020819052604090205490565b611dc683678ac7230489e80000613caf866001600160a01b031660009081526020819052604090205490565b600a546001600160a01b03838116911614801590613d7757506001600160a01b0382163014155b15610d4857808015613da257506001600160a01b0382166000908152600c602052604090205460ff16155b15613e0e57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015613e3457506001600160a01b0382166000908152600c602052604090205460ff165b15610d48576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610e1357826001600160a01b0316600d8281548110613e8157613e8161451f565b6000918252602090912001546001600160a01b031603613f4d57600d8054613eab906001906141ff565b81548110613ebb57613ebb61451f565b600091825260209091200154600d80546001600160a01b039092169183908110613ee757613ee761451f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480613f2657613f266145cf565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80613f57816145b6565b915050613e5a565b60005b83811015613f7a578181015183820152602001613f62565b50506000910152565b6020815260008251806020840152613fa2816040850160208701613f5f565b601f01601f19169190910160400192915050565b6001600160a01b038116811461165a57600080fd5b60008060408385031215613fde57600080fd5b8235613fe981613fb6565b946020939093013593505050565b60008060006060848603121561400c57600080fd5b833561401781613fb6565b9250602084013561402781613fb6565b929592945050506040919091013590565b60006020828403121561404a57600080fd5b5035919050565b60006020828403121561406357600080fd5b813561406e81613fb6565b9392505050565b600081518084526020808501945080840160005b838110156140ae5781516001600160a01b031687529582019590820190600101614089565b509495945050505050565b60208152600061406e6020830184614075565b801515811461165a57600080fd5b600080604083850312156140ed57600080fd5b82356140f881613fb6565b91506020830135614108816140cc565b809150509250929050565b6000806040838503121561412657600080fd5b50508035926020909101359150565b6000806040838503121561414857600080fd5b823561415381613fb6565b9150602083013561410881613fb6565b600181811c9082168061417757607f821691505b60208210810361419757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba61419d565b80820281158282048414176109ba576109ba61419d565b6000826141fa57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109ba576109ba61419d565b600060033d111561422b5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561426257634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156142775790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156142a757505050505090565b82850191508151818111156142bf5750505050505090565b843d87010160208285010111156142d95750505050505090565b6142e86020828601018761422e565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561436057600080fd5b815161406e816140cc565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561439957600080fd5b5051919050565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6000602082840312156143e957600080fd5b815161406e81613fb6565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561444957600080fd5b8351925060208401519150604084015190509250925092565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b7f4661696c656420746f20736574206661726d657220636f6e7472616374206f6e815267010383937bc3c9d160c51b6020820152600082516144d7816028850160208701613f5f565b9190910160280192915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061455460a0830186614075565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516145a981601b850160208701613f5f565b91909101601b0192915050565b6000600182016145c8576145c861419d565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a264697066735822122006af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af3011864736f6c63430008110033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063801b51d91161015a578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461085e578063e6efd91a14610866578063e85ceee814610886578063ed9cacfe146108bf578063f2fde38b146108d4578063fd7c9fab146108f457600080fd5b8063c0d7865514610768578063c84a705c14610788578063d4d7b19a146107a8578063d720a2a8146107d8578063dd62ed3e146107f8578063df8408fe1461083e57600080fd5b8063975b87e811610113578063975b87e81461068e578063a8602fea146106ae578063a9059cbb146106ce578063b70143c9146106ee578063b77e895c1461070e578063b9276e4b1461074757600080fd5b8063801b51d9146105f1578063808a5457146106115780638129fc1c146106315780638a8c523c146106465780638da5cb5b1461065b57806395d89b411461067957600080fd5b80634ada218b116101fe5780636a3c68fc116101b75780636a3c68fc146105125780636d62062a146105325780636ec4be901461056b57806370a08231146105915780637136982b146105c75780637ac84fc1146105dc57600080fd5b80634ada218b146104415780635342acb414610462578063573761981461049b5780635d76b04c146104bb5780635fe8e7cc146104d057806362b6327a146104f257600080fd5b806323b872dd1161025057806323b872dd146103785780632a11ced014610398578063313ce567146103d0578063397883d2146103ec578063461a3a95146104015780634626402b1461042157600080fd5b806306fdde03146102d457806308dee2b4146102ff578063095ea7b31461031e57806317700f011461034e57806318160ddd1461036357600080fd5b366102cf5734156102cd5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102e057600080fd5b506102e9610914565b6040516102f69190613f83565b60405180910390f35b34801561030b57600080fd5b50600e545b6040519081526020016102f6565b34801561032a57600080fd5b5061033e610339366004613fcb565b6109a6565b60405190151581526020016102f6565b34801561035a57600080fd5b506102cd6109c0565b34801561036f57600080fd5b50600254610310565b34801561038457600080fd5b5061033e610393366004613ff7565b6109d7565b3480156103a457600080fd5b506103b86103b3366004614038565b6109fb565b6040516001600160a01b0390911681526020016102f6565b3480156103dc57600080fd5b50604051601281526020016102f6565b3480156103f857600080fd5b506102cd610a25565b34801561040d57600080fd5b506009546103b8906001600160a01b031681565b34801561042d57600080fd5b50600b546103b8906001600160a01b031681565b34801561044d57600080fd5b5060105461033e90600160b81b900460ff1681565b34801561046e57600080fd5b5061033e61047d366004614051565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156104a757600080fd5b506102cd6104b6366004613fcb565b610d4c565b3480156104c757600080fd5b50600f54610310565b3480156104dc57600080fd5b506104e5610e18565b6040516102f691906140b9565b3480156104fe57600080fd5b506007546103b8906001600160a01b031681565b34801561051e57600080fd5b506102cd61052d3660046140da565b610e79565b34801561053e57600080fd5b5061033e61054d366004614051565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057757600080fd5b506010546103b8906201000090046001600160a01b031681565b34801561059d57600080fd5b506103106105ac366004614051565b6001600160a01b031660009081526020819052604090205490565b3480156105d357600080fd5b50600d54610310565b3480156105e857600080fd5b506102cd610eac565b3480156105fd57600080fd5b506102cd61060c3660046140da565b6112b4565b34801561061d57600080fd5b50600a546103b8906001600160a01b031681565b34801561063d57600080fd5b506102cd6112e7565b34801561065257600080fd5b506102cd61165d565b34801561066757600080fd5b506006546001600160a01b03166103b8565b34801561068557600080fd5b506102e961167a565b34801561069a57600080fd5b506102cd6106a9366004614113565b611689565b3480156106ba57600080fd5b506102cd6106c9366004614051565b611dcc565b3480156106da57600080fd5b5061033e6106e9366004613fcb565b611e69565b3480156106fa57600080fd5b506102cd610709366004614038565b611e77565b34801561071a57600080fd5b5061033e610729366004614051565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561075357600080fd5b5060105461033e90600160b01b900460ff1681565b34801561077457600080fd5b506102cd610783366004614051565b612034565b34801561079457600080fd5b506102cd6107a3366004614051565b612099565b3480156107b457600080fd5b5061033e6107c3366004614051565b600c6020526000908152604090205460ff1681565b3480156107e457600080fd5b506102cd6107f3366004614038565b61239e565b34801561080457600080fd5b50610310610813366004614135565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084a57600080fd5b506102cd6108593660046140da565b6125c6565b6102cd6125f9565b34801561087257600080fd5b506102cd6108813660046140da565b612847565b34801561089257600080fd5b5061033e6108a1366004614051565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cb57600080fd5b506102cd61287a565b3480156108e057600080fd5b506102cd6108ef366004614051565b612afe565b34801561090057600080fd5b506008546103b8906001600160a01b031681565b60606003805461092390614163565b80601f016020809104026020016040519081016040528092919081815260200182805461094f90614163565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b6000336109b4818585612b4a565b60019150505b92915050565b6109c8612bfc565b6010805460ff60b81b19169055565b6000336109e5858285612c4a565b6109f0858585612cb2565b506001949350505050565b600d8181548110610a0b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a2d612bfc565b6000600e541180610a4057506000600f54115b610a765760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610aaa5760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a6d565b600f54600e5468056bc75e2d6310000091600091610ac891906141b3565b905081811115610c8157600081610ae784670de0b6b3a76400006141c6565b610af191906141dd565b90506000670de0b6b3a764000082600e54610b0c91906141c6565b610b1691906141dd565b90506000670de0b6b3a764000083600f54610b3191906141c6565b610b3b91906141dd565b905081600e6000828254610b4f91906141ff565b9250508190555080600f6000828254610b6891906141ff565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610bb757600080fd5b505af1925050508015610bc8575060015b610c7857610bd4614212565b806308c379a003610c385750610be8614269565b80610bf35750610c3a565b6000805160206145e683398151915281604051610c109190613f83565b60405180910390a1610c2285846141b3565b600e55610c2f84836141b3565b600f5550610c78565b505b6000805160206145e6833981519152604051610c55906142f3565b60405180910390a1610c6784836141b3565b600e55610c7483826141b3565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610cbc57600080fd5b505af1925050508015610ccd575060015b610d4857610cd9614212565b806308c379a003610d225750610ced614269565b80610cf85750610d24565b6000805160206145e683398151915281604051610d159190613f83565b60405180910390a1505050565b505b6000805160206145e6833981519152604051610d3f906142f3565b60405180910390a15b5050565b610d54612bfc565b306001600160a01b03831603610d915760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a6d565b816001600160a01b031663a9059cbb610db26006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610dd0929190614335565b6020604051808303816000875af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e13919061434e565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561099c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e52575050505050905090565b610e81612bfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610ece5760405162461bcd60e51b8152600401610a6d9061436b565b6002600555601054610100900460ff1615610f105760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a6d565b6010805461ff001916610100179055600e54600f5481158015610f31575080155b15610f485750506010805461ff00191690556112ad565b68056bc75e2d631000006000610f5e83856141b3565b90508181111561100a57600081610f7d84670de0b6b3a76400006141c6565b610f8791906141dd565b9050670de0b6b3a7640000610f9c82876141c6565b610fa691906141dd565b9450670de0b6b3a7640000610fbb82866141c6565b610fc591906141dd565b9350610fd184866141b3565b915084600e6000828254610fe591906141ff565b9250508190555083600f6000828254610ffe91906141ff565b90915550611015915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190614387565b9050818110156111555784600e60008282546110cc91906141b3565b9250508190555083600f60008282546110e591906141b3565b90915550506010805461ff00191690556040516000805160206145e683398151915290611143906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a150505050506112ad565b60075461116f9030906001600160a01b0316600019612b4a565b47600061117b8461308b565b9050806000036111cd5786600e600082825461119791906141b3565b9250508190555085600f60008282546111b091906141b3565b90915550506010805461ff0019169055506112ad95505050505050565b478281116112425787600e60008282546111e791906141b3565b9250508190555086600f600082825461120091906141b3565b90915550506040516000805160206145e683398151915290611221906143a0565b60405180910390a150506010805461ff0019169055506112ad945050505050565b600061124e84836141ff565b905060008661125d8b846141c6565b61126791906141dd565b9050600061127582846141ff565b9050811561128757611287828c6136ad565b80156112965761129681613873565b50506010805461ff00191690555050505050505050505b6001600555565b6112bc612bfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6112ef612bfc565b60105460ff16156113275760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a6d565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113aa91906143d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611466576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144591906143d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114a35760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a6d565b6007546114bd9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f59291169060001990600401614335565b6020604051808303816000875af1158015611514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611538919061434e565b6115695760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a6d565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115a19291169060001990600401614335565b6020604051808303816000875af11580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061434e565b50600a5460405163095ea7b360e01b8152309163095ea7b391611617916001600160a01b03169060001990600401614335565b6020604051808303816000875af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a919061434e565b50565b611665612bfc565b6010805460ff60b81b1916600160b81b179055565b60606004805461092390614163565b611691612bfc565b600082116116b15760405162461bcd60e51b8152600401610a6d906143f4565b600081116116e65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a6d565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117479190614387565b101561177a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614387565b10156118195760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a6d565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061184d90339030908690600401614410565b6020604051808303816000875af115801561186c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611890919061434e565b6118c15760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a6d565b6007546118d99030906001600160a01b031684612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261190f929116908590600401614335565b6020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611952919061434e565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611980426102586141b3565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611a18575060408051601f3d908101601f19168201909252611a1591810190614434565b60015b611ca057611a24614212565b806308c379a003611b675750611a38614269565b80611a435750611b69565b600754611a5c9030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611a9392911690600090600401614335565b6020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad6919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b099033908690600401614335565b6020604051808303816000875af1158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c919061434e565b508060405162461bcd60e51b8152600401610a6d9190613f83565b505b600754611b829030906001600160a01b03166000612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bb992911690600090600401614335565b6020604051808303816000875af1158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc919061434e565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611c2f9033908590600401614335565b6020604051808303816000875af1158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c72919061434e565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a6d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190614387565b90508015610e135760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611d839033908590600401614335565b6020604051808303816000875af1158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc6919061434e565b50505050565b611dd4612bfc565b6001600160a01b038116611e0f5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a6d565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d3f565b6000336109b4818585612cb2565b611e7f612bfc565b600260055403611ea15760405162461bcd60e51b8152600401610a6d9061436b565b600260055580611ef35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a6d565b30600090815260208190526040902054811115611f495760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a6d565b601054600160b01b900460ff16611f725760405162461bcd60e51b8152600401610a6d90614462565b476000611f7e8361308b565b905080600003611fd05760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b47828111611ff05760405162461bcd60e51b8152600401610a6d906143a0565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b61203c612bfc565b6001600160a01b0381166120775760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a6d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6120a1612bfc565b6001600160a01b0381166120e95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a6d565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612143575060408051601f3d908101601f19168201909252612140918101906143d7565b60015b6121885760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a6d565b6001600160a01b038116158015906121a957506001600160a01b0381163014155b156122045760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a6d565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040516324872d5b60e21b815230600482015263921cb56c90602401600060405180830381600087803b15801561227457600080fd5b505af1925050508015612285575060015b61236757612291614212565b806308c379a0036122f857506122a5614269565b806122b057506122fa565b6000805160206145e6833981519152816040516020016122d0919061448e565b60408051601f19818403018152908290526122ea91613f83565b60405180910390a150612367565b505b6000805160206145e683398151915260405161235e906020808252602e908201527f556e6b6e6f776e206572726f722073657474696e67206661726d657220636f6e60408201526d7472616374206f6e2070726f787960901b606082015260800190565b60405180910390a15b6040516001600160a01b038216907f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6123a6612bfc565b6002600554036123c85760405162461bcd60e51b8152600401610a6d9061436b565b6002600555806123ea5760405162461bcd60e51b8152600401610a6d906143f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244b9190614387565b101561247e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a6d565b601054600160b01b900460ff166124a75760405162461bcd60e51b8152600401610a6d90614462565b6007546124c19030906001600160a01b0316600019612b4a565b4760006124cd8361308b565b90508060000361251f5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610a6d565b4782811161253f5760405162461bcd60e51b8152600401610a6d906143a0565b600061254b84836141ff565b90506000606461255c6019846141c6565b61256691906141dd565b9050600060646125776019856141c6565b61258191906141dd565b905081156125a9576125a982606461259a60198b6141c6565b6125a491906141dd565b6136ad565b80156125b8576125b881613873565b505060016005555050505050565b6125ce612bfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b612601612bfc565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126639190614387565b9050600081116126855760405162461bcd60e51b8152600401610a6d906143f4565b600034116126ba5760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a6d565b6007546126d29030906001600160a01b031683612b4a565b6007546001600160a01b031663f305d719343084600080336126f6426102586141b3565b6040518863ffffffff1660e01b8152600401612717969594939291906144e4565b60606040518083038185885af193505050508015612752575060408051601f3d908101601f1916820190925261274f91810190614434565b60015b6128095761275e614212565b806308c379a0036127c25750612772614269565b8061277d57506127c4565b6007546127969030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611b4c573d6000803e3d6000fd5b505b6007546127dd9030906001600160a01b03166000612b4a565b60405133904780156108fc02916000818181858888f19350505050158015611c72573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b61284f612bfc565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612882612bfc565b60075461289c9030906001600160a01b0316600019612b4a565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926128d49291169060001990600401614335565b6020604051808303816000875af192505050801561290f575060408051601f3d908101601f1916820190925261290c9181019061434e565b60015b1561296557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261295c926001600160a01b039182169291169060001990614410565b60405180910390a15b600a546001600160a01b031615612afc57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129ae9291169060001990600401614335565b6020604051808303816000875af19250505080156129e9575060408051601f3d908101601f191682019092526129e69181019061434e565b60015b15612a3f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a36926001600160a01b039182169291169060001990614410565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612a71916001600160a01b03169060001990600401614335565b6020604051808303816000875af1925050508015612aac575060408051601f3d908101601f19168201909252612aa99181019061434e565b60015b15612afc5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612af39130916001600160a01b03169060001990614410565b60405180910390a15b565b612b06612bfc565b6001600160a01b038116612b415760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a6d565b61165a81613a20565b6001600160a01b03831615801590612b6a57506001600160a01b03821615155b612b9b5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a6d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33612c0f6006546001600160a01b031690565b6001600160a01b031614612afc5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a6d565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612ca55760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a6d565b611dc68484848403612b4a565b6001600160a01b038316612ced5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216612d285760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111612d5d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b601054610100900460ff1615612d7857610e13838383613a72565b6001600160a01b03831660009081526011602052604081205460ff1680612db757506001600160a01b03831660009081526011602052604090205460ff165b60105490159150600160b81b900460ff16158015612df95750600a546001600160a01b0385811691161480612df95750600a546001600160a01b038481169116145b15612e02575060005b601054600160b81b900460ff168015612e3457506001600160a01b03841660009081526012602052604090205460ff16155b8015612e5957506001600160a01b03831660009081526012602052604090205460ff16155b15612f4557600a546001600160a01b0390811690841603612ed2576001600160a01b03841660009081526013602052604090205460ff16612ed25760405162461bcd60e51b8152602060048201526013602482015272139bdd08185b1b1bddd959081d1bc81cd95b1b606a1b6044820152606401610a6d565b600a546001600160a01b0390811690851603612f45576001600160a01b03831660009081526014602052604090205460ff16612f455760405162461bcd60e51b81526020600482015260126024820152714e6f7420616c6c6f77656420746f2062757960701b6044820152606401610a6d565b612f5184848484613bd1565b808015612f6b5750600a546001600160a01b038481169116145b8015612f7f5750601054610100900460ff16155b8015612f9a57506000600f54600e54612f9891906141b3565b115b15611dc657600f54600e54678ac7230489e80000918291612fbb91906141b3565b106130845768056bc75e2d63100000600f54600e54612fda91906141b3565b111561303657306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561301b57600080fd5b505af192505050801561302c575060015b1561308457613084565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561307157600080fd5b505af1925050508015613082575060015b505b5050505050565b60008160000361309d57506000919050565b601054600160b01b900460ff166130c65760405162461bcd60e51b8152600401610a6d90614462565b816802b5e3af16b18800008111156130e457506802b5e3af16b18800005b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131195761311961451f565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319691906143d7565b816001815181106131a9576131a961451f565b6001600160a01b0392831660209182029290920101526007546000916131d491309116600019612b4a565b60006131e242610e106141b3565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261322b928a9289928b9262010000909104909116908990600401614535565b600060405180830381600087803b15801561324557600080fd5b505af1925050508015613256575060015b61347757613262614212565b806308c379a00361338f5750613276614269565b806132815750613391565b80511561335c57604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc40161335c5760006132db6002886141dd565b9050801561335a576000805160206145e683398151915260405161333c9060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161334d8161308b565b9998505050505050505050565b505b6000805160206145e6833981519152816040516133799190613f83565b60405180910390a1506000979650505050505050565b505b600061339e6002876141dd565b90506000811180156133b05750858114155b15613435576000805160206145e6833981519152604051613418906020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b60405180910390a16134298161308b565b98975050505050505050565b6000805160206145e6833981519152604051613379906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156134c757600080fd5b505af19250505080156134d8575060015b6135b2576134e4614212565b806308c379a00361353d57506134f8614269565b80613503575061353f565b6000805160206145e6833981519152816040516020016135239190614571565b60408051601f198184030181529082905261337991613f83565b505b6000805160206145e683398151915260405161359d9060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060009695505050505050565b4760006135bf83836141ff565b9050801561363c5760408051888152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a188871015613429576000613614888b6141ff565b905060006136218261308b565b905061362d81846141b3565b9b9a5050505050505050505050565b6000805160206145e68339815191526040516136969060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a150600098975050505050505050565b600060646136bc6032826141ff565b6136c690846141c6565b6136d091906141dd565b9050600060646136e16032826141ff565b6136eb90866141c6565b6136f591906141dd565b6007549091506001600160a01b031663f305d71985308686868361371b42610e106141b3565b6040518863ffffffff1660e01b815260040161373c969594939291906144e4565b60606040518083038185885af193505050508015613777575060408051601f3d908101601f1916820190925261377491810190614434565b60015b61383157613783614212565b806308c379a0036137df5750613797614269565b806137a257506137e1565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516137d19190613f83565b60405180910390a150611dc6565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613824906020808252600190820152604560f81b604082015260600190565b60405180910390a1611dc6565b505060408051858152602081018790527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150505050565b600d54801580613881575081155b1561388a575050565b600061389682846141dd565b9050806000036138a557505050565b60005b828110156139e1576000600d82815481106138c5576138c561451f565b6000918252602090912001546001600160a01b0316905080158015906138f457506001600160a01b0381163014155b801561390e5750600a546001600160a01b03828116911614155b156139ce576000816001600160a01b03168460405160006040518083038185875af1925050503d8060008114613960576040519150601f19603f3d011682016040523d82523d6000602084013e613965565b606091505b50509050806139cc577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516139c390602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b50806139d9816145b6565b9150506138a8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613aad5760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a6d565b6001600160a01b038216613ae85760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a6d565b60008111613b1d5760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a6d565b6001600160a01b03831660009081526020819052604090205481811015613b6b5760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a6d565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611dc6565b8015613ced5760006064613be66005856141c6565b613bf091906141dd565b90508015613ceb5760006064613c076019846141c6565b613c1191906141dd565b905060006064613c226019856141c6565b613c2c91906141dd565b90506000613c3a84876141ff565b9050613c47883086613a72565b613c52888883613a72565b82600e6000828254613c6491906141b3565b9250508190555081600f6000828254613c7d91906141b3565b90915550613cb6905088678ac7230489e80000613caf826001600160a01b031660009081526020819052604090205490565b1015613d50565b613ce287678ac7230489e80000613caf8a6001600160a01b031660009081526020819052604090205490565b50505050611dc6565b505b613cf8848484613a72565b613d2484678ac7230489e80000613caf876001600160a01b031660009081526020819052604090205490565b611dc683678ac7230489e80000613caf866001600160a01b031660009081526020819052604090205490565b600a546001600160a01b03838116911614801590613d7757506001600160a01b0382163014155b15610d4857808015613da257506001600160a01b0382166000908152600c602052604090205460ff16155b15613e0e57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015613e3457506001600160a01b0382166000908152600c602052604090205460ff165b15610d48576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610e1357826001600160a01b0316600d8281548110613e8157613e8161451f565b6000918252602090912001546001600160a01b031603613f4d57600d8054613eab906001906141ff565b81548110613ebb57613ebb61451f565b600091825260209091200154600d80546001600160a01b039092169183908110613ee757613ee761451f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480613f2657613f266145cf565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80613f57816145b6565b915050613e5a565b60005b83811015613f7a578181015183820152602001613f62565b50506000910152565b6020815260008251806020840152613fa2816040850160208701613f5f565b601f01601f19169190910160400192915050565b6001600160a01b038116811461165a57600080fd5b60008060408385031215613fde57600080fd5b8235613fe981613fb6565b946020939093013593505050565b60008060006060848603121561400c57600080fd5b833561401781613fb6565b9250602084013561402781613fb6565b929592945050506040919091013590565b60006020828403121561404a57600080fd5b5035919050565b60006020828403121561406357600080fd5b813561406e81613fb6565b9392505050565b600081518084526020808501945080840160005b838110156140ae5781516001600160a01b031687529582019590820190600101614089565b509495945050505050565b60208152600061406e6020830184614075565b801515811461165a57600080fd5b600080604083850312156140ed57600080fd5b82356140f881613fb6565b91506020830135614108816140cc565b809150509250929050565b6000806040838503121561412657600080fd5b50508035926020909101359150565b6000806040838503121561414857600080fd5b823561415381613fb6565b9150602083013561410881613fb6565b600181811c9082168061417757607f821691505b60208210810361419757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109ba576109ba61419d565b80820281158282048414176109ba576109ba61419d565b6000826141fa57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156109ba576109ba61419d565b600060033d111561422b5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561426257634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156142775790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156142a757505050505090565b82850191508151818111156142bf5750505050505090565b843d87010160208285010111156142d95750505050505090565b6142e86020828601018761422e565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561436057600080fd5b815161406e816140cc565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561439957600080fd5b5051919050565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6000602082840312156143e957600080fd5b815161406e81613fb6565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561444957600080fd5b8351925060208401519150604084015190509250925092565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b7f4661696c656420746f20736574206661726d657220636f6e7472616374206f6e815267010383937bc3c9d160c51b6020820152600082516144d7816028850160208701613f5f565b9190910160280192915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061455460a0830186614075565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516145a981601b850160208701613f5f565b91909101601b0192915050565b6000600182016145c8576145c861419d565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a264697066735822122006af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af3011864736f6c63430008110033

Deployed Bytecode Sourcemap

9589:33945:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37618:9;:13;37614:85;;37653:34;;37677:9;160:25:1;;37665:10:0;;37653:34;;148:2:1;133:18;37653:34:0;;;;;;;37614:85;9589:33945;;;;;2958:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30564:118;;;;;;;;;;-1:-1:-1;30651:23:0;;30564:118;;;160:25:1;;;148:2;133:18;30564:118:0;14:177:1;3825:190:0;;;;;;;;;;-1:-1:-1;3825:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3825:190:0;1308:187:1;42273:86:0;;;;;;;;;;;;;:::i;3252:99::-;;;;;;;;;;-1:-1:-1;3331:12:0;;3252:99;;4023:250;;;;;;;;;;-1:-1:-1;4023:250:0;;;;;:::i;:::-;;:::i;10589:24::-;;;;;;;;;;-1:-1:-1;10589:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10589:24:0;2146:203:1;3160:84:0;;;;;;;;;;-1:-1:-1;3160:84:0;;3234:2;2496:36:1;;2484:2;2469:18;3160:84:0;2354:184:1;30863:2580:0;;;;;;;;;;;;;:::i;10413:25::-;;;;;;;;;;-1:-1:-1;10413:25:0;;;;-1:-1:-1;;;;;10413:25:0;;;10480:29;;;;;;;;;;-1:-1:-1;10480:29:0;;;;-1:-1:-1;;;;;10480:29:0;;;11723:26;;;;;;;;;;-1:-1:-1;11723:26:0;;;;-1:-1:-1;;;11723:26:0;;;;;;42971:126;;;;;;;;;;-1:-1:-1;42971:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;43062:27:0;43038:4;43062:27;;;:18;:27;;;;;;;;;42971:126;30330:183;;;;;;;;;;-1:-1:-1;30330:183:0;;;;;:::i;:::-;;:::i;30690:114::-;;;;;;;;;;-1:-1:-1;30775:21:0;;30690:114;;26333:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10315:41::-;;;;;;;;;;-1:-1:-1;10315:41:0;;;;-1:-1:-1;;;;;10315:41:0;;;42831:128;;;;;;;;;;-1:-1:-1;42831:128:0;;;;;:::i;:::-;;:::i;43411:120::-;;;;;;;;;;-1:-1:-1;43411:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;43499:24:0;43475:4;43499:24;;;:15;:24;;;;;;;;;43411:120;11637:24;;;;;;;;;;-1:-1:-1;11637:24:0;;;;;;;-1:-1:-1;;;;;11637:24:0;;;3359:118;;;;;;;;;;-1:-1:-1;3359:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;26223:98;;;;;;;;;;-1:-1:-1;26299:7:0;:14;26223:98;;16145:3867;;;;;;;;;;;;;:::i;42515:162::-;;;;;;;;;;-1:-1:-1;42515:162:0;;;;;:::i;:::-;;:::i;10445:28::-;;;;;;;;;;-1:-1:-1;10445:28:0;;;;-1:-1:-1;;;;;10445:28:0;;;12810:836;;;;;;;;;;;;;:::i;42177:84::-;;;;;;;;;;;;;:::i;1946:87::-;;;;;;;;;;-1:-1:-1;2019:6:0;;-1:-1:-1;;;;;2019:6:0;1946:87;;3057:95;;;;;;;;;;;;;:::i;26484:2260::-;;;;;;;;;;-1:-1:-1;26484:2260:0;;;;;:::i;:::-;;:::i;35489:319::-;;;;;;;;;;-1:-1:-1;35489:319:0;;;;;:::i;:::-;;:::i;3485:182::-;;;;;;;;;;-1:-1:-1;3485:182:0;;;;;:::i;:::-;;:::i;34483:948::-;;;;;;;;;;-1:-1:-1;34483:948:0;;;;;:::i;:::-;;:::i;43277:122::-;;;;;;;;;;-1:-1:-1;43277:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;43366:25:0;43342:4;43366:25;;;:16;:25;;;;;;;;;43277:122;11668:24;;;;;;;;;;-1:-1:-1;11668:24:0;;;;-1:-1:-1;;;11668:24:0;;;;;;30156:166;;;;;;;;;;-1:-1:-1;30156:166:0;;;;;:::i;:::-;;:::i;37745:1415::-;;;;;;;;;;-1:-1:-1;37745:1415:0;;;;;:::i;:::-;;:::i;10542:40::-;;;;;;;;;;-1:-1:-1;10542:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35859:1603;;;;;;;;;;-1:-1:-1;35859:1603:0;;;;;:::i;:::-;;:::i;3675:142::-;;;;;;;;;;-1:-1:-1;3675:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3782:18:0;;;3755:7;3782:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3675:142;42371:132;;;;;;;;;;-1:-1:-1;42371:132:0;;;;;:::i;:::-;;:::i;28829:1319::-;;;:::i;42689:130::-;;;;;;;;;;-1:-1:-1;42689:130:0;;;;;:::i;:::-;;:::i;43109:156::-;;;;;;;;;;-1:-1:-1;43109:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;43215:42:0;43191:4;43215:42;;;:33;:42;;;;;;;;;43109:156;33489:958;;;;;;;;;;;;;:::i;2149:165::-;;;;;;;;;;-1:-1:-1;2149:165:0;;;;;:::i;:::-;;:::i;10363:43::-;;;;;;;;;;-1:-1:-1;10363:43:0;;;;-1:-1:-1;;;;;10363:43:0;;;2958:91;3003:13;3036:5;3029:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2958:91;:::o;3825:190::-;3899:4;3932:10;3953:32;3932:10;3969:7;3978:6;3953:8;:32::i;:::-;4003:4;3996:11;;;3825:190;;;;;:::o;42273:86::-;1905:13;:11;:13::i;:::-;42329:14:::1;:22:::0;;-1:-1:-1;;;;42329:22:0::1;::::0;;42273:86::o;4023:250::-;4111:4;4146:10;4167:38;4183:4;4146:10;4198:6;4167:15;:38::i;:::-;4216:27;4226:4;4232:2;4236:6;4216:9;:27::i;:::-;-1:-1:-1;4261:4:0;;4023:250;-1:-1:-1;;;;4023:250:0:o;10589:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10589:24:0;;-1:-1:-1;10589:24:0;:::o;30863:2580::-;1905:13;:11;:13::i;:::-;30956:1:::1;30930:23;;:27;:56;;;;30985:1;30961:21;;:25;30930:56;30922:71;;;::::0;-1:-1:-1;;;30922:71:0;;5737:2:1;30922:71:0::1;::::0;::::1;5719:21:1::0;5776:1;5756:18;;;5749:29;-1:-1:-1;;;5794:18:1;;;5787:32;5836:18;;30922:71:0::1;;;;;;;;;31012:7;:14:::0;31004:33:::1;;;::::0;-1:-1:-1;;;31004:33:0;;6067:2:1;31004:33:0::1;::::0;::::1;6049:21:1::0;6106:1;6086:18;;;6079:29;-1:-1:-1;;;6124:18:1;;;6117:32;6166:18;;31004:33:0::1;5865:325:1::0;31004:33:0::1;31261:21;::::0;31235:23:::1;::::0;31135:12:::1;::::0;31108:24:::1;::::0;31235:47:::1;::::0;31261:21;31235:47:::1;:::i;:::-;31206:76;;31417:16;31396:18;:37;31392:2044;;;31481:13;31523:18:::0;31497:23:::1;:16:::0;31516:4:::1;31497:23;:::i;:::-;:44;;;;:::i;:::-;31481:60;;31556:30;31623:4;31615:5;31589:23;;:31;;;;:::i;:::-;:38;;;;:::i;:::-;31556:71;;31642:28;31705:4;31697:5;31673:21;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;31642:67;;31812:22;31785:23;;:49;;;;;;;:::i;:::-;;;;;;;;31874:20;31849:21;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32006:23:0::1;::::0;;32079:21:::1;::::0;;32176:48;;;;32239:44;;;32316:33:::1;::::0;;-1:-1:-1;;;32316:33:0;;;;32006:23;;32079:21;32316:4:::1;::::0;:31:::1;::::0;:33:::1;::::0;;::::1;::::0;31969:34:::1;::::0;32316:33;;;;;;;31969:34;32316:4;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;32312:760;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;32476:6:0::1;32465:18;;;;;;:::i;:::-;;;;;;;;32581:51;32610:22:::0;32581:26;:51:::1;:::i;:::-;32555:23;:77:::0;32675:47:::1;32702:20:::0;32675:24;:47:::1;:::i;:::-;32651:21;:71:::0;-1:-1:-1;32312:760:0::1;;;;;-1:-1:-1::0;;;;;;;;;;;32769:48:0::1;;;;;:::i;:::-;;;;;;;;32915:51;32944:22:::0;32915:26;:51:::1;:::i;:::-;32889:23;:77:::0;33009:47:::1;33036:20:::0;33009:24;:47:::1;:::i;:::-;32985:21;:71:::0;32312:760:::1;31435:1648;;;;;30911:2532;;30863:2580::o:0;31392:2044::-:1;33147:4;-1:-1:-1::0;;;;;33147:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;33143:282;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;33307:6:0::1;33296:18;;;;;;:::i;:::-;;;;;;;;33238:92;30911:2532;;30863:2580::o:0;33143:282::-:1;;;-1:-1:-1::0;;;;;;;;;;;33361:48:0::1;;;;;:::i;:::-;;;;;;;;33143:282;30911:2532;;30863:2580::o:0;30330:183::-;1905:13;:11;:13::i;:::-;30441:4:::1;-1:-1:-1::0;;;;;30423:23:0;::::1;::::0;30415:38:::1;;;::::0;-1:-1:-1;;;30415:38:0;;8933:2:1;30415:38:0::1;::::0;::::1;8915:21:1::0;8972:1;8952:18;;;8945:29;-1:-1:-1;;;8990:18:1;;;8983:32;9032:18;;30415:38:0::1;8731:325:1::0;30415:38:0::1;30471:6;-1:-1:-1::0;;;;;30464:23:0::1;;30488:7;2019:6:::0;;-1:-1:-1;;;;;2019:6:0;;1946:87;30488:7:::1;30497;30464:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30330:183:::0;;:::o;26333:96::-;26378:16;26414:7;26407:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26407:14:0;;;;;;;;;;;;;;;;;;;;;;26333:96;:::o;42831:128::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42917:24:0;;;::::1;;::::0;;;:15:::1;:24;::::0;;;;:34;;-1:-1:-1;;42917:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42831:128::o;16145:3867::-;1199:1;1345:7;;:19;1337:34;;;;-1:-1:-1;;;1337:34:0;;;;;;;:::i;:::-;1199:1;1382:7;:18;16225:7:::1;::::0;::::1;::::0;::::1;;;16224:8;16216:23;;;::::0;-1:-1:-1;;;16216:23:0;;10122:2:1;16216:23:0::1;::::0;::::1;10104:21:1::0;10161:1;10141:18;;;10134:29;-1:-1:-1;;;10179:18:1;;;10172:32;10221:18;;16216:23:0::1;9920:325:1::0;16216:23:0::1;16250:7;:14:::0;;-1:-1:-1;;16250:14:0::1;;;::::0;;16314:23:::1;::::0;16375:21:::1;::::0;16421:23;;:48;::::1;;;-1:-1:-1::0;16448:21:0;;16421:48:::1;16417:117;;;-1:-1:-1::0;;16486:7:0::1;:15:::0;;-1:-1:-1;;16486:15:0::1;::::0;;16516:7:::1;;16417:117;16631:12;16604:24;16730:37;16751:16:::0;16730:18;:37:::1;:::i;:::-;16702:65;;16901:16;16881:17;:36;16877:694;;;16965:13;17007:17:::0;16981:23:::1;:16:::0;17000:4:::1;16981:23;:::i;:::-;:43;;;;:::i;:::-;16965:59:::0;-1:-1:-1;17089:4:0::1;17060:26;16965:59:::0;17060:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;17039:54:::0;-1:-1:-1;17154:4:0::1;17127:24;17146:5:::0;17127:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;17108:50:::0;-1:-1:-1;17193:37:0::1;17108:50:::0;17193:18;:37:::1;:::i;:::-;17173:57;;17333:18;17306:23;;:45;;;;;;;:::i;:::-;;;;;;;;17391:16;17366:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;16877:694:0::1;::::0;-1:-1:-1;;16877:694:0::1;;17518:1;17492:23;:27:::0;;;17534:21:::1;:25:::0;16877:694:::1;17596:52;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;17596:52:0::1;::::0;10397:18:1;17596:52:0::1;;;;;;;17737:46;::::0;-1:-1:-1;;;17737:46:0;;17752:4:::1;17737:46;::::0;::::1;2292:51:1::0;;;17711:23:0::1;::::0;17737:31:::1;::::0;2265:18:1;;17737:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17711:72;;17816:17;17798:15;:35;17794:385;;;17979:18;17952:23;;:45;;;;;;;:::i;:::-;;;;;;;;18037:16;18012:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;18068:7:0::1;:15:::0;;-1:-1:-1;;18068:15:0::1;::::0;;18103:43:::1;::::0;-1:-1:-1;;;;;;;;;;;18103:43:0;::::1;::::0;10894:2:1;10876:21;;;10933:2;10913:18;;;10906:30;10972:31;10967:2;10952:18;;10945:59;11036:2;11021:18;;10692:353;18103:43:0::1;;;;;;;;18161:7;;;;;;;17794:385;18261:16;::::0;18229:69:::1;::::0;18246:4:::1;::::0;-1:-1:-1;;;;;18261:16:0::1;-1:-1:-1::0;;18229:8:0::1;:69::i;:::-;18394:21;18366:25;18516:31;18529:17:::0;18516:12:::1;:31::i;:::-;18494:53;;18572:11;18587:1;18572:16:::0;18568:280:::1;;18711:18;18684:23;;:45;;;;;;;:::i;:::-;;;;;;;;18769:16;18744:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;18800:7:0::1;:15:::0;;-1:-1:-1;;18800:15:0::1;::::0;;-1:-1:-1;18830:7:0::1;::::0;-1:-1:-1;;;;;;18830:7:0::1;18568:280;18946:21;18982:39:::0;;::::1;18978:355;;19137:18;19110:23;;:45;;;;;;;:::i;:::-;;;;;;;;19195:16;19170:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19231:39:0::1;::::0;-1:-1:-1;;;;;;;;;;;19231:39:0;::::1;::::0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;19285:7:0::1;:15:::0;;-1:-1:-1;;19285:15:0::1;::::0;;-1:-1:-1;19315:7:0::1;::::0;-1:-1:-1;;;;;19315:7:0::1;18978:355;19397:25;19425:38;19446:17:::0;19425:18;:38:::1;:::i;:::-;19397:66:::0;-1:-1:-1;19514:23:0::1;19581:17:::0;19540:38:::1;19560:18:::0;19397:66;19540:38:::1;:::i;:::-;:58;;;;:::i;:::-;19514:84:::0;-1:-1:-1;19609:21:0::1;19633:35;19514:84:::0;19633:17;:35:::1;:::i;:::-;19609:59:::0;-1:-1:-1;19727:19:0;;19723:102:::1;;19763:50;19777:15;19794:18;19763:13;:50::i;:::-;19886:17:::0;;19882:87:::1;;19920:37;19943:13;19920:22;:37::i;:::-;-1:-1:-1::0;;19989:7:0::1;:15:::0;;-1:-1:-1;;19989:15:0::1;::::0;;-1:-1:-1;;;;;;;;;1411:1:0::1;1155::::0;1423:7;:22;16145:3867::o;42515:162::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42616:42:0;;;::::1;;::::0;;;:33:::1;:42;::::0;;;;:53;;-1:-1:-1;;42616:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42515:162::o;12810:836::-;1905:13;:11;:13::i;:::-;12871:12:::1;::::0;::::1;;12870:13;12862:28;;;::::0;-1:-1:-1;;;12862:28:0;;11606:2:1;12862:28:0::1;::::0;::::1;11588:21:1::0;11645:1;11625:18;;;11618:29;-1:-1:-1;;;11663:18:1;;;11656:32;11705:18;;12862:28:0::1;11404:325:1::0;12862:28:0::1;12901:12;:19:::0;;-1:-1:-1;;12901:19:0::1;12916:4;12901:19;::::0;;12992:17:::1;::::0;13033:10:::1;::::0;12992:52:::1;::::0;-1:-1:-1;;;12992:52:0;;13026:4:::1;12992:52;::::0;::::1;11946:34:1::0;-1:-1:-1;;;;;13033:10:0;;::::1;11996:18:1::0;;;11989:43;12992:17:0;::::1;::::0;:25:::1;::::0;11881:18:1;;12992:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12976:13;:68:::0;;-1:-1:-1;;;;;;12976:68:0::1;-1:-1:-1::0;;;;;12976:68:0;;;::::1;::::0;;::::1;::::0;;13110:131:::1;;13174:17;::::0;13218:10:::1;::::0;13174:55:::1;::::0;-1:-1:-1;;;13174:55:0;;13211:4:::1;13174:55;::::0;::::1;11946:34:1::0;-1:-1:-1;;;;;13218:10:0;;::::1;11996:18:1::0;;;11989:43;13174:17:0;::::1;::::0;:28:::1;::::0;11881:18:1;;13174:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13158:13;:71:::0;;-1:-1:-1;;;;;;13158:71:0::1;-1:-1:-1::0;;;;;13158:71:0;;;::::1;::::0;;;::::1;::::0;;13110:131:::1;13269:13;::::0;-1:-1:-1;;;;;13269:13:0::1;13261:42;;;::::0;-1:-1:-1;;;13261:42:0;;12501:2:1;13261:42:0::1;::::0;::::1;12483:21:1::0;12540:1;12520:18;;;12513:29;-1:-1:-1;;;12558:18:1;;;12551:32;12600:18;;13261:42:0::1;12299:325:1::0;13261:42:0::1;13348:16;::::0;13316:69:::1;::::0;13333:4:::1;::::0;-1:-1:-1;;;;;13348:16:0::1;-1:-1:-1::0;;13316:8:0::1;:69::i;:::-;13421:10;::::0;13449:16:::1;::::0;13414:72:::1;::::0;-1:-1:-1;;;13414:72:0;;-1:-1:-1;;;;;13421:10:0;;::::1;::::0;13414:26:::1;::::0;:72:::1;::::0;13449:16;::::1;::::0;-1:-1:-1;;13468:17:0;13414:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13406:87;;;::::0;-1:-1:-1;;;13406:87:0;;12831:2:1;13406:87:0::1;::::0;::::1;12813:21:1::0;12870:1;12850:18;;;12843:29;-1:-1:-1;;;12888:18:1;;;12881:32;12930:18;;13406:87:0::1;12629:325:1::0;13406:87:0::1;13511:10;::::0;13531:13:::1;::::0;13504:60:::1;::::0;-1:-1:-1;;;13504:60:0;;-1:-1:-1;;;;;13511:10:0;;::::1;::::0;13504:26:::1;::::0;:60:::1;::::0;13531:13;::::1;::::0;-1:-1:-1;;13546:17:0;13504:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;13605:13:0::1;::::0;13575:63:::1;::::0;-1:-1:-1;;;13575:63:0;;13590:4:::1;::::0;13575:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;13605:13:0::1;::::0;-1:-1:-1;;13620:17:0;13575:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12810:836::o:0;42177:84::-;1905:13;:11;:13::i;:::-;42232:14:::1;:21:::0;;-1:-1:-1;;;;42232:21:0::1;-1:-1:-1::0;;;42232:21:0::1;::::0;;42177:84::o;3057:95::-;3104:13;3137:7;3130:14;;;;;:::i;26484:2260::-;1905:13;:11;:13::i;:::-;26617:1:::1;26603:11;:15;26595:30;;;;-1:-1:-1::0;;;26595:30:0::1;;;;;;;:::i;:::-;26658:1;26644:11;:15;26636:30;;;::::0;-1:-1:-1;;;26636:30:0;;13491:2:1;26636:30:0::1;::::0;::::1;13473:21:1::0;13530:1;13510:18;;;13503:29;-1:-1:-1;;;13548:18:1;;;13541:32;13590:18;;26636:30:0::1;13289:325:1::0;26636:30:0::1;26709:46;::::0;-1:-1:-1;;;26709:46:0;;26724:4:::1;26709:46;::::0;::::1;2292:51:1::0;;;26759:11:0;;26709:31:::1;::::0;2265:18:1;;26709:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;26687:113;;;::::0;-1:-1:-1;;;26687:113:0;;13821:2:1;26687:113:0::1;::::0;::::1;13803:21:1::0;13860:1;13840:18;;;13833:29;-1:-1:-1;;;13878:18:1;;;13871:32;13920:18;;26687:113:0::1;13619:325:1::0;26687:113:0::1;26850:10;::::0;26843:40:::1;::::0;-1:-1:-1;;;26843:40:0;;26872:10:::1;26843:40;::::0;::::1;2292:51:1::0;26887:11:0;;-1:-1:-1;;;;;26850:10:0::1;::::0;26843:28:::1;::::0;2265:18:1;;26843:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;26821:107;;;::::0;-1:-1:-1;;;26821:107:0;;14151:2:1;26821:107:0::1;::::0;::::1;14133:21:1::0;14190:1;14170:18;;;14163:29;-1:-1:-1;;;14208:18:1;;;14201:32;14250:18;;26821:107:0::1;13949:325:1::0;26821:107:0::1;27030:10;::::0;27023:71:::1;::::0;-1:-1:-1;;;27023:71:0;;-1:-1:-1;;;;;27030:10:0;;::::1;::::0;27023:31:::1;::::0;:71:::1;::::0;27055:10:::1;::::0;27075:4:::1;::::0;27082:11;;27023:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27001:123;;;::::0;-1:-1:-1;;;27001:123:0;;14861:2:1;27001:123:0::1;::::0;::::1;14843:21:1::0;14900:1;14880:18;;;14873:29;-1:-1:-1;;;14918:18:1;;;14911:32;14960:18;;27001:123:0::1;14659:325:1::0;27001:123:0::1;27203:16;::::0;27171:63:::1;::::0;27188:4:::1;::::0;-1:-1:-1;;;;;27203:16:0::1;27222:11:::0;27171:8:::1;:63::i;:::-;27252:10;::::0;27280:16:::1;::::0;27245:66:::1;::::0;-1:-1:-1;;;27245:66:0;;-1:-1:-1;;;;;27252:10:0;;::::1;::::0;27245:26:::1;::::0;:66:::1;::::0;27280:16;::::1;::::0;27299:11;;27245:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27336:16:0::1;::::0;27408:10:::1;::::0;-1:-1:-1;;;;;27336:16:0;;::::1;::::0;:29:::1;::::0;27388:4:::1;::::0;27408:10:::1;27433:11:::0;27459;27336:16:::1;::::0;27609:10:::1;27634:21;:15;27652:3;27634:21;:::i;:::-;27336:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;27336:356:0;;;-1:-1:-1;;;;;15404:15:1;;;27336:356:0::1;::::0;::::1;15386:34:1::0;15456:15;;;15436:18;;;15429:43;15488:18;;;15481:34;;;;15531:18;;;15524:34;;;;15574:19;;;15567:35;;;;15618:19;;;15611:35;15683:15;;;15662:19;;;15655:44;15715:19;;;15708:35;;;;15320:19;;27336:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27336:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;27336:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;27332:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;27847:16;::::0;27815:53:::1;::::0;27832:4:::1;::::0;-1:-1:-1;;;;;27847:16:0::1;;27815:8;:53::i;:::-;27890:10;::::0;27918:16:::1;::::0;27883:56:::1;::::0;-1:-1:-1;;;27883:56:0;;-1:-1:-1;;;;;27890:10:0;;::::1;::::0;27883:26:::1;::::0;:56:::1;::::0;27918:16;::::1;::::0;27890:10:::1;::::0;27883:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28023:10:0::1;::::0;28016:52:::1;::::0;-1:-1:-1;;;28016:52:0;;-1:-1:-1;;;;;28023:10:0;;::::1;::::0;28016:27:::1;::::0;:52:::1;::::0;28044:10:::1;::::0;28056:11;;28016:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28104:6;28097:14;;-1:-1:-1::0;;;28097:14:0::1;;;;;;;;:::i;27332:1147::-;;;28205:16;::::0;28173:53:::1;::::0;28190:4:::1;::::0;-1:-1:-1;;;;;28205:16:0::1;;28173:8;:53::i;:::-;28248:10;::::0;28276:16:::1;::::0;28241:56:::1;::::0;-1:-1:-1;;;28241:56:0;;-1:-1:-1;;;;;28248:10:0;;::::1;::::0;28241:26:::1;::::0;:56:::1;::::0;28276:16;::::1;::::0;28248:10:::1;::::0;28241:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28381:10:0::1;::::0;28374:52:::1;::::0;-1:-1:-1;;;28374:52:0;;-1:-1:-1;;;;;28381:10:0;;::::1;::::0;28374:27:::1;::::0;:52:::1;::::0;28402:10:::1;::::0;28414:11;;28374:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28455:12:0::1;::::0;-1:-1:-1;;;28455:12:0;;16554:2:1;28455:12:0::1;::::0;::::1;16536:21:1::0;16593:1;16573:18;;;16566:29;-1:-1:-1;;;16611:18:1;;;16604:32;16653:18;;28455:12:0::1;16352:325:1::0;27332:1147:0::1;-1:-1:-1::0;;27713:40:0::1;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;27713:40:0::1;::::0;-1:-1:-1;10397:18:1;27713:40:0::1;;;;;;;28582:10;::::0;28575:43:::1;::::0;-1:-1:-1;;;28575:43:0;;28612:4:::1;28575:43;::::0;::::1;2292:51:1::0;28549:23:0::1;::::0;-1:-1:-1;;;;;28582:10:0::1;::::0;28575:28:::1;::::0;2265:18:1;;28575:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28549:69:::0;-1:-1:-1;28633:19:0;;28629:108:::1;;28676:10;::::0;28669:56:::1;::::0;-1:-1:-1;;;28669:56:0;;-1:-1:-1;;;;;28676:10:0;;::::1;::::0;28669:27:::1;::::0;:56:::1;::::0;28697:10:::1;::::0;28709:15;;28669:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26584:2160;26484:2260:::0;;:::o;35489:319::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;35581:31:0;::::1;35573:46;;;::::0;-1:-1:-1;;;35573:46:0;;16884:2:1;35573:46:0::1;::::0;::::1;16866:21:1::0;16923:1;16903:18;;;16896:29;-1:-1:-1;;;16941:18:1;;;16934:32;16983:18;;35573:46:0::1;16682:325:1::0;35573:46:0::1;35662:14;::::0;;-1:-1:-1;;;;;35687:34:0;;::::1;-1:-1:-1::0;;;;;;35687:34:0;::::1;::::0;::::1;::::0;;;35747:53:::1;::::0;;35662:14;;;::::1;11946:34:1::0;;;12011:2;11996:18;;11989:43;;;;35747:53:0::1;::::0;11881:18:1;35747:53:0::1;11734:304:1::0;3485:182:0;3555:4;3588:10;3609:28;3588:10;3626:2;3630:6;3609:9;:28::i;34483:948::-;1905:13;:11;:13::i;:::-;1199:1:::1;1345:7;;:19:::0;1337:34:::1;;;;-1:-1:-1::0;;;1337:34:0::1;;;;;;;:::i;:::-;1199:1;1382:7;:18:::0;34575:15;34567:57:::2;;;::::0;-1:-1:-1;;;34567:57:0;;17214:2:1;34567:57:0::2;::::0;::::2;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:31;17272:18;;;17265:59;17341:18;;34567:57:0::2;17012:353:1::0;34567:57:0::2;34676:4;3424:7:::0;3451:18;;;;;;;;;;;34643:11:::2;:39;;34635:72;;;::::0;-1:-1:-1;;;34635:72:0;;17572:2:1;34635:72:0::2;::::0;::::2;17554:21:1::0;17611:2;17591:18;;;17584:30;-1:-1:-1;;;17630:18:1;;;17623:50;17690:18;;34635:72:0::2;17370:344:1::0;34635:72:0::2;34726:12;::::0;-1:-1:-1;;;34726:12:0;::::2;;;34718:43;;;;-1:-1:-1::0;;;34718:43:0::2;;;;;;;:::i;:::-;34857:21;34829:25;34946;34959:11:::0;34946:12:::2;:25::i;:::-;34924:47;;35033:11;35048:1;35033:16:::0;35029:87:::2;;35066:38;::::0;-1:-1:-1;;;35066:38:0;;18268:2:1;35066:38:0::2;::::0;::::2;18250:21:1::0;18307:2;18287:18;;;18280:30;18346;18326:18;;;18319:58;18394:18;;35066:38:0::2;18066:352:1::0;35029:87:0::2;35214:21;35250:39:::0;;::::2;35246:107;;35306:35;;-1:-1:-1::0;;;35306:35:0::2;;;;;;;:::i;35246:107::-;35378:45;::::0;;10424:25:1;;;10480:2;10465:18;;10458:34;;;35378:45:0::2;::::0;10397:18:1;35378:45:0::2;;;;;;;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;34483:948:0:o;30156:166::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;30230:21:0;::::1;30222:36;;;::::0;-1:-1:-1;;;30222:36:0;;18625:2:1;30222:36:0::1;::::0;::::1;18607:21:1::0;18664:1;18644:18;;;18637:29;-1:-1:-1;;;18682:18:1;;;18675:32;18724:18;;30222:36:0::1;18423:325:1::0;30222:36:0::1;30269:16;:45:::0;;-1:-1:-1;;;;;;30269:45:0::1;-1:-1:-1::0;;;;;30269:45:0;;;::::1;::::0;;;::::1;::::0;;30156:166::o;37745:1415::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;37825:24:0;::::1;37817:52;;;::::0;-1:-1:-1;;;37817:52:0;;18955:2:1;37817:52:0::1;::::0;::::1;18937:21:1::0;18994:2;18974:18;;;18967:30;-1:-1:-1;;;19013:18:1;;;19006:45;19068:18;;37817:52:0::1;18753:339:1::0;37817:52:0::1;37962:10;-1:-1:-1::0;;;;;37951:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;37951:39:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;37951:39:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;37947:521;;38424:32;::::0;-1:-1:-1;;;38424:32:0;;19299:2:1;38424:32:0::1;::::0;::::1;19281:21:1::0;19338:2;19318:18;;;19311:30;-1:-1:-1;;;19357:18:1;;;19350:52;19419:18;;38424:32:0::1;19097:346:1::0;37947:521:0::1;-1:-1:-1::0;;;;;38161:24:0;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;38189:27:0;::::1;38211:4;38189:27;;38161:55;38157:143;;;38237:47;::::0;-1:-1:-1;;;38237:47:0;;19650:2:1;38237:47:0::1;::::0;::::1;19632:21:1::0;19689:2;19669:18;;;19662:30;19728:34;19708:18;;;19701:62;-1:-1:-1;;;19779:18:1;;;19772:35;19824:19;;38237:47:0::1;19448:401:1::0;38157:143:0::1;-1:-1:-1::0;38523:9:0::1;:22:::0;;-1:-1:-1;;;;;;;;;38523:22:0;::::1;::::0;;::::1;38556:19:::0;;;;-1:-1:-1;;;;;;38556:19:0;;;;;;;-1:-1:-1;;;38556:19:0::1;::::0;;;38650:55:::1;::::0;-1:-1:-1;;;38650:55:0;;38699:4:::1;38650:55;::::0;::::1;2292:51:1::0;38650:40:0::1;::::0;2265:18:1;;38650:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;38646:457;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;38926:6:0::1;38865:68;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;38865:68:0;;::::1;::::0;;;;;;;38847:88:::1;::::0;::::1;:::i;:::-;;;;;;;;38747:200;38646:457;;;;;-1:-1:-1::0;;;;;;;;;;;39031:60:0::1;;;;20564:2:1::0;20546:21;;;20603:2;20583:18;;;20576:30;20642:34;20637:2;20622:18;;20615:62;-1:-1:-1;;;20708:2:1;20693:18;;20686:44;20762:3;20747:19;;20362:410;39031:60:0::1;;;;;;;;38646:457;39128:24;::::0;-1:-1:-1;;;;;39128:24:0;::::1;::::0;::::1;::::0;;;::::1;37745:1415:::0;:::o;35859:1603::-;1905:13;:11;:13::i;:::-;1199:1:::1;1345:7;;:19:::0;1337:34:::1;;;;-1:-1:-1::0;;;1337:34:0::1;;;;;;;:::i;:::-;1199:1;1382:7;:18:::0;35966:15;35958:30:::2;;;;-1:-1:-1::0;;;35958:30:0::2;;;;;;;:::i;:::-;36007:46;::::0;-1:-1:-1;;;36007:46:0;;36022:4:::2;36007:46;::::0;::::2;2292:51:1::0;;;36057:11:0;;36007:31:::2;::::0;2265:18:1;;36007:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;35999:76;;;::::0;-1:-1:-1;;;35999:76:0;;13821:2:1;35999:76:0::2;::::0;::::2;13803:21:1::0;13860:1;13840:18;;;13833:29;-1:-1:-1;;;13878:18:1;;;13871:32;13920:18;;35999:76:0::2;13619:325:1::0;35999:76:0::2;36094:12;::::0;-1:-1:-1;;;36094:12:0;::::2;;;36086:43;;;;-1:-1:-1::0;;;36086:43:0::2;;;;;;;:::i;:::-;36212:16;::::0;36180:69:::2;::::0;36197:4:::2;::::0;-1:-1:-1;;;;;36212:16:0::2;-1:-1:-1::0;;36180:8:0::2;:69::i;:::-;36345:21;36317:25;36451;36464:11:::0;36451:12:::2;:25::i;:::-;36429:47;;36501:11;36516:1;36501:16:::0;36497:87:::2;;36534:38;::::0;-1:-1:-1;;;36534:38:0;;18268:2:1;36534:38:0::2;::::0;::::2;18250:21:1::0;18307:2;18287:18;;;18280:30;18346;18326:18;;;18319:58;18394:18;;36534:38:0::2;18066:352:1::0;36497:87:0::2;36682:21;36718:39:::0;;::::2;36714:107;;36774:35;;-1:-1:-1::0;;;36774:35:0::2;;;;;;;:::i;36714:107::-;36885:25;36913:38;36934:17:::0;36913:18;:38:::2;:::i;:::-;36885:66:::0;-1:-1:-1;37002:23:0::2;37064:3;37028:33;9821:2;36885:66:::0;37028:33:::2;:::i;:::-;:39;;;;:::i;:::-;37002:65:::0;-1:-1:-1;37078:21:0::2;37136:3;37102:31;9877:2;37102:17:::0;:31:::2;:::i;:::-;:37;;;;:::i;:::-;37078:61:::0;-1:-1:-1;37198:19:0;;37194:117:::2;;37234:65;37248:15:::0;37295:3:::2;37265:27;9821:2;37265:11:::0;:27:::2;:::i;:::-;:33;;;;:::i;:::-;37234:13;:65::i;:::-;37372:17:::0;;37368:87:::2;;37406:37;37429:13;37406:22;:37::i;:::-;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;;;;35859:1603:0:o;42371:132::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42457:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:38;;-1:-1:-1;;42457:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42371:132::o;28829:1319::-;1905:13;:11;:13::i;:::-;28939:46:::1;::::0;-1:-1:-1;;;28939:46:0;;28954:4:::1;28939:46;::::0;::::1;2292:51:1::0;;;28917:19:0::1;::::0;28939:31:::1;::::0;2265:18:1;;28939:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28917:68;;29018:1;29004:11;:15;28996:30;;;;-1:-1:-1::0;;;28996:30:0::1;;;;;;;:::i;:::-;29057:1;29045:9;:13;29037:28;;;::::0;-1:-1:-1;;;29037:28:0;;20979:2:1;29037:28:0::1;::::0;::::1;20961:21:1::0;21018:1;20998:18;;;20991:29;-1:-1:-1;;;21036:18:1;;;21029:32;21078:18;;29037:28:0::1;20777:325:1::0;29037:28:0::1;29144:16;::::0;29112:63:::1;::::0;29129:4:::1;::::0;-1:-1:-1;;;;;29144:16:0::1;29163:11:::0;29112:8:::1;:63::i;:::-;29200:16;::::0;-1:-1:-1;;;;;29200:16:0::1;:32;29240:9;29273:4;29293:11:::0;29200:16:::1;::::0;29441:10:::1;29466:21;:15;29484:3;29466:21;:::i;:::-;29200:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29200:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29200:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29196:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;29677:16;::::0;29645:53:::1;::::0;29662:4:::1;::::0;-1:-1:-1;;;;;29677:16:0::1;;29645:8;:53::i;:::-;29763:51;::::0;29771:10:::1;::::0;29792:21:::1;29763:51:::0;::::1;;;::::0;::::1;::::0;;;29792:21;29771:10;29763:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29196:945;;;29951:16;::::0;29919:53:::1;::::0;29936:4:::1;::::0;-1:-1:-1;;;;;29951:16:0::1;;29919:8;:53::i;:::-;30037:51;::::0;30045:10:::1;::::0;30066:21:::1;30037:51:::0;::::1;;;::::0;::::1;::::0;;;30066:21;30045:10;30037:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29196:945;-1:-1:-1::0;;29545:38:0::1;::::0;;10424:25:1;;;29573:9:0::1;10480:2:1::0;10465:18;;10458:34;29545:38:0::1;::::0;-1:-1:-1;10397:18:1;29545:38:0::1;;;;;;;28906:1242;28829:1319::o:0;42689:130::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42776:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:35;;-1:-1:-1;;42776:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42689:130::o;33489:958::-;1905:13;:11;:13::i;:::-;33624:16:::1;::::0;33592:69:::1;::::0;33609:4:::1;::::0;-1:-1:-1;;;;;33624:16:0::1;-1:-1:-1::0;;33592:8:0::1;:69::i;:::-;33740:10;::::0;33768:16:::1;::::0;33733:72:::1;::::0;-1:-1:-1;;;33733:72:0;;-1:-1:-1;;;;;33740:10:0;;::::1;::::0;33733:26:::1;::::0;:72:::1;::::0;33768:16;::::1;::::0;-1:-1:-1;;33787:17:0;33733:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33733:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;33733:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;33729:193:::0;::::1;;-1:-1:-1::0;33844:10:0::1;::::0;33864:16:::1;::::0;33826:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;33844:10:0;;::::1;::::0;33864:16;::::1;::::0;-1:-1:-1;;33883:17:0;33826:75:::1;:::i;:::-;;;;;;;;33729:193;33997:13;::::0;-1:-1:-1;;;;;33997:13:0::1;:27:::0;33993:447:::1;;34052:10;::::0;34072:13:::1;::::0;34045:60:::1;::::0;-1:-1:-1;;;34045:60:0;;-1:-1:-1;;;;;34052:10:0;;::::1;::::0;34045:26:::1;::::0;:60:::1;::::0;34072:13;::::1;::::0;-1:-1:-1;;34087:17:0;34045:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34045:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;34045:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;34041:177:::0;::::1;;-1:-1:-1::0;34148:10:0::1;::::0;34160:13:::1;::::0;34130:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;34148:10:0;;::::1;::::0;34160:13;::::1;::::0;-1:-1:-1;;34175:17:0;34130:63:::1;:::i;:::-;;;;;;;;34041:177;34280:13;::::0;34250:63:::1;::::0;-1:-1:-1;;;34250:63:0;;34265:4:::1;::::0;34250:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;34280:13:0::1;::::0;-1:-1:-1;;34295:17:0;34250:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34250:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;34250:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;34246:183:::0;::::1;;-1:-1:-1::0;34371:13:0::1;::::0;34338:66:::1;::::0;::::1;::::0;::::1;::::0;34364:4:::1;::::0;-1:-1:-1;;;;;34371:13:0::1;::::0;-1:-1:-1;;34386:17:0;34338:66:::1;:::i;:::-;;;;;;;;34246:183;33489:958::o:0;2149:165::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;2238:22:0;::::1;2230:37;;;::::0;-1:-1:-1;;;2230:37:0;;21921:2:1;2230:37:0::1;::::0;::::1;21903:21:1::0;21960:1;21940:18;;;21933:29;-1:-1:-1;;;21978:18:1;;;21971:32;22020:18;;2230:37:0::1;21719:325:1::0;2230:37:0::1;2278:28;2297:8;2278:18;:28::i;5336:256::-:0;-1:-1:-1;;;;;5438:19:0;;;;;;:44;;-1:-1:-1;;;;;;5461:21:0;;;;5438:44;5430:59;;;;-1:-1:-1;;;5430:59:0;;22251:2:1;5430:59:0;;;22233:21:1;22290:1;22270:18;;;22263:29;-1:-1:-1;;;22308:18:1;;;22301:32;22350:18;;5430:59:0;22049:325:1;5430:59:0;-1:-1:-1;;;;;5500:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5552:32;;160:25:1;;;5552:32:0;;133:18:1;5552:32:0;;;;;;;5336:256;;;:::o;2041:100::-;2116:10;2105:7;2019:6;;-1:-1:-1;;;;;2019:6:0;;1946:87;2105:7;-1:-1:-1;;;;;2105:21:0;;2097:36;;;;-1:-1:-1;;;2097:36:0;;22581:2:1;2097:36:0;;;22563:21:1;22620:1;22600:18;;;22593:29;-1:-1:-1;;;22638:18:1;;;22631:32;22680:18;;2097:36:0;22379:325:1;5600:311:0;-1:-1:-1;;;;;3782:18:0;;;5701:24;3782:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5772:26;;;;5764:41;;;;-1:-1:-1;;;5764:41:0;;22911:2:1;5764:41:0;;;22893:21:1;22950:1;22930:18;;;22923:29;-1:-1:-1;;;22968:18:1;;;22961:32;23010:18;;5764:41:0;22709:325:1;5764:41:0;5841:51;5850:5;5857:7;5885:6;5866:16;:25;5841:8;:51::i;39215:2914::-;-1:-1:-1;;;;;39347:18:0;;39339:33;;;;-1:-1:-1;;;39339:33:0;;23241:2:1;39339:33:0;;;23223:21:1;23280:1;23260:18;;;23253:29;-1:-1:-1;;;23298:18:1;;;23291:32;23340:18;;39339:33:0;23039:325:1;39339:33:0;-1:-1:-1;;;;;39391:16:0;;39383:31;;;;-1:-1:-1;;;39383:31:0;;23571:2:1;39383:31:0;;;23553:21:1;23610:1;23590:18;;;23583:29;-1:-1:-1;;;23628:18:1;;;23621:32;23670:18;;39383:31:0;23369:325:1;39383:31:0;39442:1;39433:6;:10;39425:25;;;;-1:-1:-1;;;39425:25:0;;23901:2:1;39425:25:0;;;23883:21:1;23940:1;23920:18;;;23913:29;-1:-1:-1;;;23958:18:1;;;23951:32;24000:18;;39425:25:0;23699:325:1;39425:25:0;39523:7;;;;;;;39519:94;;;39547:33;39563:4;39569:2;39573:6;39547:15;:33::i;39519:94::-;-1:-1:-1;;;;;39707:24:0;;39690:12;39707:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;39735:22:0;;;;;;:18;:22;;;;;;;;39707:50;39871:14;;39705:53;;;-1:-1:-1;;;;39871:14:0;;;;39870:15;:65;;;;-1:-1:-1;39898:13:0;;-1:-1:-1;;;;;39890:21:0;;;39898:13;;39890:21;;:44;;-1:-1:-1;39921:13:0;;-1:-1:-1;;;;;39915:19:0;;;39921:13;;39915:19;39890:44;39866:113;;;-1:-1:-1;39962:5:0;39866:113;40064:14;;-1:-1:-1;;;40064:14:0;;;;:58;;;;-1:-1:-1;;;;;;40083:39:0;;;;;;:33;:39;;;;;;;;40082:40;40064:58;:100;;;;-1:-1:-1;;;;;;40127:37:0;;;;;;:33;:37;;;;;;;;40126:38;40064:100;40060:585;;;40290:13;;-1:-1:-1;;;;;40290:13:0;;;40284:19;;;;40280:114;;-1:-1:-1;;;;;40332:22:0;;;;;;:16;:22;;;;;;;;40324:54;;;;-1:-1:-1;;;40324:54:0;;24231:2:1;40324:54:0;;;24213:21:1;24270:2;24250:18;;;24243:30;-1:-1:-1;;;24289:18:1;;;24282:49;24348:18;;40324:54:0;24029:343:1;40324:54:0;40534:13;;-1:-1:-1;;;;;40534:13:0;;;40526:21;;;;40522:112;;-1:-1:-1;;;;;40576:19:0;;;;;;:15;:19;;;;;;;;40568:50;;;;-1:-1:-1;;;40568:50:0;;24579:2:1;40568:50:0;;;24561:21:1;24618:2;24598:18;;;24591:30;-1:-1:-1;;;24637:18:1;;;24630:48;24695:18;;40568:50:0;24377:342:1;40568:50:0;40732:41;40747:4;40753:2;40757:6;40765:7;40732:14;:41::i;:::-;40924:7;:30;;;;-1:-1:-1;40941:13:0;;-1:-1:-1;;;;;40935:19:0;;;40941:13;;40935:19;40924:30;:42;;;;-1:-1:-1;40959:7:0;;;;;;;40958:8;40924:42;:97;;;;;41020:1;40996:21;;40970:23;;:47;;;;:::i;:::-;:51;40924:97;40920:1202;;;41237:21;;41211:23;;41147:11;;;;41211:47;;41237:21;41211:47;:::i;:::-;:60;41207:904;;41442:12;41418:21;;41392:23;;:47;;;;:::i;:::-;:62;41388:708;;;41564:4;-1:-1:-1;;;;;41564:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41560:194;41388:708;41560:194;41388:708;;;41887:4;-1:-1:-1;;;;;41887:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41883:194;;41023:1099;39328:2801;39215:2914;;;:::o;20020:4166::-;20080:7;20104:11;20119:1;20104:16;20100:30;;-1:-1:-1;20129:1:0;;20020:4166;-1:-1:-1;20020:4166:0:o;20100:30::-;20149:12;;-1:-1:-1;;;20149:12:0;;;;20141:43;;;;-1:-1:-1;;;20141:43:0;;;;;;;:::i;:::-;20276:11;20319;20302:28;;20298:118;;;-1:-1:-1;20364:11:0;20298:118;20460:16;;;20474:1;20460:16;;;;;;;;20436:21;;20460:16;;;;;;;;;;-1:-1:-1;20460:16:0;20436:40;;20505:4;20487;20492:1;20487:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20487:23:0;;;:7;;;;;;;;;;:23;;;;20531:16;;:23;;;-1:-1:-1;;;20531:23:0;;;;:16;;;;;:21;;:23;;;;;20487:7;;20531:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20521:4;20526:1;20521:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20521:33:0;;;:7;;;;;;;;;:33;20923:16;;20745:20;;20891:69;;20908:4;;20923:16;-1:-1:-1;;20891:8:0;:69::i;:::-;21033:16;21052:22;:15;21070:4;21052:22;:::i;:::-;21306:16;;21463:9;;21306:233;;-1:-1:-1;;;21306:233:0;;21033:41;;-1:-1:-1;21180:21:0;;-1:-1:-1;;;;;21306:16:0;;;;:67;;:233;;21388:14;;21417:12;;21444:4;;21463:9;;;;;;;;21033:41;;21306:233;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21302:2877;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;23114:20;;:24;23110:552;;23281:11;;;;;;;;;;;;-1:-1:-1;;;23281:11:0;;;;;23243:24;;;;;;:50;;23239:408;;23383:18;23404;23421:1;23404:14;:18;:::i;:::-;23383:39;-1:-1:-1;23449:14:0;;23445:183;;-1:-1:-1;;;;;;;;;;;23497:49:0;;;;25637:2:1;25619:21;;;25676:2;25656:18;;;25649:30;25715:34;25710:2;25695:18;;25688:62;-1:-1:-1;;;25781:2:1;25766:18;;25759:33;25824:3;25809:19;;25435:399;23497:49:0;;;;;;;;23580:24;23593:10;23580:12;:24::i;:::-;23573:31;20020:4166;-1:-1:-1;;;;;;;;;20020:4166:0:o;23445:183::-;23295:352;23239:408;-1:-1:-1;;;;;;;;;;;23692:6:0;23681:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;23721:1:0;;20020:4166;-1:-1:-1;;;;;;;20020:4166:0:o;21302:2877::-;;;23838:18;23859;23876:1;23859:14;:18;:::i;:::-;23838:39;;23909:1;23896:10;:14;:46;;;;;23928:14;23914:10;:28;;23896:46;23892:201;;;-1:-1:-1;;;;;;;;;;;23968:59:0;;;;26041:2:1;26023:21;;;26080:2;26060:18;;;26053:30;26119:34;26114:2;26099:18;;26092:62;-1:-1:-1;;;26185:2:1;26170:18;;26163:43;26238:3;26223:19;;25839:409;23968:59:0;;;;;;;;24053:24;24066:10;24053:12;:24::i;:::-;24046:31;20020:4166;-1:-1:-1;;;;;;;;20020:4166:0:o;23892:201::-;-1:-1:-1;;;;;;;;;;;24112:32:0;;;;26455:2:1;26437:21;;;26494:2;26474:18;;;26467:30;-1:-1:-1;;;26528:2:1;26513:18;;26506:48;26586:2;26571:18;;26253:342;21302:2877:0;21661:9;;;;;;;;;-1:-1:-1;;;;;21661:9:0;-1:-1:-1;;;;;21650:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:1360;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;22826:6:0;22778:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22778:55:0;;;;;;;;;;22760:75;;;:::i;21646:1360::-;;;-1:-1:-1;;;;;;;;;;;22909:54:0;;;;27266:2:1;27248:21;;;27305:2;27285:18;;;27278:30;27344:34;27339:2;27324:18;;27317:62;-1:-1:-1;;;27410:2:1;27395:18;;27388:38;27458:3;27443:19;;27064:404;22909:54:0;;;;;;;;-1:-1:-1;22989:1:0;;20020:4166;-1:-1:-1;;;;;;20020:4166:0:o;21646:1360::-;21795:21;21766:26;21857:38;21878:17;21795:21;21857:38;:::i;:::-;21835:60;-1:-1:-1;21936:15:0;;21932:754;;21981:43;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;21981:43:0;;10397:18:1;21981:43:0;;;;;;;22210:11;22193:14;:28;22189:280;;;22250:23;22276:28;22290:14;22276:11;:28;:::i;:::-;22250:54;;22331:21;22355:29;22368:15;22355:12;:29::i;:::-;22331:53;-1:-1:-1;22418:27:0;22331:53;22418:11;:27;:::i;:::-;22411:34;20020:4166;-1:-1:-1;;;;;;;;;;;20020:4166:0:o;21932:754::-;-1:-1:-1;;;;;;;;;;;22585:50:0;;;;27675:2:1;27657:21;;;27714:2;27694:18;;;27687:30;27753:34;27748:2;27733:18;;27726:62;-1:-1:-1;;;27819:2:1;27804:18;;27797:34;27863:3;27848:19;;27473:400;22585:50:0;;;;;;;;-1:-1:-1;22665:1:0;;20020:4166;-1:-1:-1;;;;;;;;20020:4166:0:o;24505:828::-;24667:22;24729:3;24707:18;211:2;24729:3;24707:18;:::i;:::-;24692:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;24667:65;-1:-1:-1;24743:20:0;24801:3;24779:18;211:2;24801:3;24779:18;:::i;:::-;24766:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;24829:16;;24743:61;;-1:-1:-1;;;;;;24829:16:0;:32;24869:9;24902:4;24922:11;24948:14;24743:61;24902:4;25032:22;:15;25050:4;25032:22;:::i;:::-;24829:271;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24829:271:0;;;;;;;;-1:-1:-1;;24829:271:0;;;;;;;;;;;;:::i;:::-;;;24825:501;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25226:26;25245:6;25226:26;;;;;;:::i;:::-;;;;;;;;25172:92;24825:501;;;;;25291:23;;;;;28676:2:1;28658:21;;;28715:1;28695:18;;;28688:29;-1:-1:-1;;;28748:2:1;28733:18;;28726:31;28789:2;28774:18;;28474:324;25291:23:0;;;;;;;;24825:501;;;-1:-1:-1;;25121:38:0;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;25121:38:0;;-1:-1:-1;10397:18:1;25121:38:0;;;;;;;24576:757;;24505:828;;:::o;25374:818::-;25464:7;:14;25493:17;;;:32;;-1:-1:-1;25514:11:0;;25493:32;25489:45;;;25527:7;25374:818;:::o;25489:45::-;25554:23;25580:21;25589:12;25580:6;:21;:::i;:::-;25554:47;;25616:15;25635:1;25616:20;25612:33;;25638:7;;25374:818;:::o;25612:33::-;25670:9;25665:454;25689:12;25685:1;:16;25665:454;;;25723:14;25740:7;25748:1;25740:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25740:10:0;;-1:-1:-1;25769:20:0;;;;;:47;;-1:-1:-1;;;;;;25793:23:0;;25811:4;25793:23;;25769:47;:74;;;;-1:-1:-1;25830:13:0;;-1:-1:-1;;;;;25820:23:0;;;25830:13;;25820:23;;25769:74;25765:343;;;25919:12;25937:6;-1:-1:-1;;;;;25937:11:0;25956:15;25937:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25918:58;;;26000:7;25995:98;;26037:36;;;;;29215:2:1;29197:21;;;29254:2;29234:18;;;29227:30;-1:-1:-1;;;29288:2:1;29273:18;;29266:49;29347:2;29332:18;;29013:343;26037:36:0;;;;;;;;25995:98;25845:263;25765:343;-1:-1:-1;25703:3:0;;;;:::i;:::-;;;;25665:454;;;-1:-1:-1;26144:40:0;;;10424:25:1;;;10480:2;10465:18;;10458:34;;;26144:40:0;;10397:18:1;26144:40:0;;;;;;;25430:762;;25374:818;:::o;2322:191::-;2415:6;;;-1:-1:-1;;;;;2432:17:0;;;-1:-1:-1;;;;;;2432:17:0;;;;;;;2465:40;;2415:6;;;2432:17;2415:6;;2465:40;;2396:16;;2465:40;2385:128;2322:191;:::o;4281:639::-;-1:-1:-1;;;;;4412:18:0;;4404:33;;;;-1:-1:-1;;;4404:33:0;;23241:2:1;4404:33:0;;;23223:21:1;23280:1;23260:18;;;23253:29;-1:-1:-1;;;23298:18:1;;;23291:32;23340:18;;4404:33:0;23039:325:1;4404:33:0;-1:-1:-1;;;;;4456:16:0;;4448:31;;;;-1:-1:-1;;;4448:31:0;;23571:2:1;4448:31:0;;;23553:21:1;23610:1;23590:18;;;23583:29;-1:-1:-1;;;23628:18:1;;;23621:32;23670:18;;4448:31:0;23369:325:1;4448:31:0;4507:1;4498:6;:10;4490:25;;;;-1:-1:-1;;;4490:25:0;;23901:2:1;4490:25:0;;;23883:21:1;23940:1;23920:18;;;23913:29;-1:-1:-1;;;23958:18:1;;;23951:32;24000:18;;4490:25:0;23699:325:1;4490:25:0;-1:-1:-1;;;;;4617:15:0;;4595:19;4617:15;;;;;;;;;;;4651:21;;;;4643:36;;;;-1:-1:-1;;;4643:36:0;;29703:2:1;4643:36:0;;;29685:21:1;29742:1;29722:18;;;29715:29;-1:-1:-1;;;29760:18:1;;;29753:32;29802:18;;4643:36:0;29501:325:1;4643:36:0;-1:-1:-1;;;;;4715:15:0;;;:9;:15;;;;;;;;;;;4733:20;;;4715:38;;4768:13;;;;;;;;;;:23;;;;;;4828:26;;160:25:1;;;4768:13:0;;4828:26;;133:18:1;4828:26:0;;;;;;;4875:37;30330:183;13654:1696;13809:7;13805:1249;;;13863:17;13903:3;13883:17;9766:1;13883:6;:17;:::i;:::-;:23;;;;:::i;:::-;13863:43;-1:-1:-1;13939:13:0;;13935:1108;;14033:23;14087:3;14059:25;9821:2;14059:9;:25;:::i;:::-;:31;;;;:::i;:::-;14033:57;-1:-1:-1;14109:21:0;14159:3;14133:23;9877:2;14133:9;:23;:::i;:::-;:29;;;;:::i;:::-;14109:53;-1:-1:-1;14257:22:0;14282:18;14291:9;14282:6;:18;:::i;:::-;14257:43;;14380:49;14396:6;14412:4;14419:9;14380:15;:49::i;:::-;14517:50;14533:6;14541:9;14552:14;14517:15;:50::i;:::-;14682:15;14655:23;;:42;;;;;;;:::i;:::-;;;;;;;;14741:13;14716:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;14837:61:0;;-1:-1:-1;14851:6:0;9939:11;14859:17;14851:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;14859:17;:38;;14837:13;:61::i;:::-;14917:67;14931:9;9939:11;14942:20;14952:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;14917:67;15021:7;;;;;;13935:1108;13818:1236;13805:1249;15102:42;15118:6;15126:9;15137:6;15102:15;:42::i;:::-;15203:61;15217:6;9939:11;15225:17;15235:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;15203:61;15275:67;15289:9;9939:11;15300:20;15310:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;15358:779;15453:13;;-1:-1:-1;;;;;15442:24:0;;;15453:13;;15442:24;;;;:52;;-1:-1:-1;;;;;;15470:24:0;;15489:4;15470:24;;15442:52;15438:692;;;15515:14;:36;;;;-1:-1:-1;;;;;;15534:17:0;;;;;;:8;:17;;;;;;;;15533:18;15515:36;15511:608;;;-1:-1:-1;;;;;;15572:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;15572:24:0;15592:4;15572:24;;;;;;15615:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;15615:21:0;;;;;;30863:2580::o;15511:608::-;15663:14;15662:15;:36;;;;-1:-1:-1;;;;;;15681:17:0;;;;;;:8;:17;;;;;;;;15662:36;15658:461;;;-1:-1:-1;;;;;15719:17:0;;15739:5;15719:17;;;:8;:17;;;;;:25;;-1:-1:-1;;15719:25:0;;;15827:277;15851:7;:14;15847:18;;15827:277;;;15913:7;-1:-1:-1;;;;;15899:21:0;:7;15907:1;15899:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;15899:10:0;:21;15895:190;;15962:7;15970:14;;:18;;15987:1;;15970:18;:::i;:::-;15962:27;;;;;;;;:::i;:::-;;;;;;;;;;;15949:7;:10;;-1:-1:-1;;;;;15962:27:0;;;;15957:1;;15949:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;15949:40:0;;;;;-1:-1:-1;;;;;15949:40:0;;;;;;16016:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;16016:13:0;;;;;-1:-1:-1;;;;;;16016:13:0;;;;;;30464:41:::1;30330:183:::0;;:::o;15895:190::-;15867:3;;;;:::i;:::-;;;;15827:277;;196:250:1;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:456::-;1577:6;1585;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1701:9;1688:23;1720:31;1745:5;1720:31;:::i;:::-;1770:5;-1:-1:-1;1827:2:1;1812:18;;1799:32;1840:33;1799:32;1840:33;:::i;:::-;1500:456;;1892:7;;-1:-1:-1;;;1946:2:1;1931:18;;;;1918:32;;1500:456::o;1961:180::-;2020:6;2073:2;2061:9;2052:7;2048:23;2044:32;2041:52;;;2089:1;2086;2079:12;2041:52;-1:-1:-1;2112:23:1;;1961:180;-1:-1:-1;1961:180:1:o;2543:247::-;2602:6;2655:2;2643:9;2634:7;2630:23;2626:32;2623:52;;;2671:1;2668;2661:12;2623:52;2710:9;2697:23;2729:31;2754:5;2729:31;:::i;:::-;2779:5;2543:247;-1:-1:-1;;;2543:247:1:o;2795:461::-;2848:3;2886:5;2880:12;2913:6;2908:3;2901:19;2939:4;2968:2;2963:3;2959:12;2952:19;;3005:2;2998:5;2994:14;3026:1;3036:195;3050:6;3047:1;3044:13;3036:195;;;3115:13;;-1:-1:-1;;;;;3111:39:1;3099:52;;3171:12;;;;3206:15;;;;3147:1;3065:9;3036:195;;;-1:-1:-1;3247:3:1;;2795:461;-1:-1:-1;;;;;2795:461:1:o;3261:261::-;3440:2;3429:9;3422:21;3403:4;3460:56;3512:2;3501:9;3497:18;3489:6;3460:56;:::i;3760:118::-;3846:5;3839:13;3832:21;3825:5;3822:32;3812:60;;3868:1;3865;3858:12;3883:382;3948:6;3956;4009:2;3997:9;3988:7;3984:23;3980:32;3977:52;;;4025:1;4022;4015:12;3977:52;4064:9;4051:23;4083:31;4108:5;4083:31;:::i;:::-;4133:5;-1:-1:-1;4190:2:1;4175:18;;4162:32;4203:30;4162:32;4203:30;:::i;:::-;4252:7;4242:17;;;3883:382;;;;;:::o;4270:248::-;4338:6;4346;4399:2;4387:9;4378:7;4374:23;4370:32;4367:52;;;4415:1;4412;4405:12;4367:52;-1:-1:-1;;4438:23:1;;;4508:2;4493:18;;;4480:32;;-1:-1:-1;4270:248:1:o;4523:388::-;4591:6;4599;4652:2;4640:9;4631:7;4627:23;4623:32;4620:52;;;4668:1;4665;4658:12;4620:52;4707:9;4694:23;4726:31;4751:5;4726:31;:::i;:::-;4776:5;-1:-1:-1;4833:2:1;4818:18;;4805:32;4846:33;4805:32;4846:33;:::i;5150:380::-;5229:1;5225:12;;;;5272;;;5293:61;;5347:4;5339:6;5335:17;5325:27;;5293:61;5400:2;5392:6;5389:14;5369:18;5366:38;5363:161;;5446:10;5441:3;5437:20;5434:1;5427:31;5481:4;5478:1;5471:15;5509:4;5506:1;5499:15;5363:161;;5150:380;;;:::o;6195:127::-;6256:10;6251:3;6247:20;6244:1;6237:31;6287:4;6284:1;6277:15;6311:4;6308:1;6301:15;6327:125;6392:9;;;6413:10;;;6410:36;;;6426:18;;:::i;6457:168::-;6530:9;;;6561;;6578:15;;;6572:22;;6558:37;6548:71;;6599:18;;:::i;6630:217::-;6670:1;6696;6686:132;;6740:10;6735:3;6731:20;6728:1;6721:31;6775:4;6772:1;6765:15;6803:4;6800:1;6793:15;6686:132;-1:-1:-1;6832:9:1;;6630:217::o;6852:128::-;6919:9;;;6940:11;;;6937:37;;;6954:18;;:::i;6985:179::-;7020:3;7062:1;7044:16;7041:23;7038:120;;;7108:1;7105;7102;7087:23;-1:-1:-1;7145:1:1;7139:8;7134:3;7130:18;7038:120;6985:179;:::o;7301:346::-;7411:2;7392:13;;-1:-1:-1;;7388:27:1;7376:40;;7446:18;7431:34;;7467:22;;;7428:62;7425:185;;;7532:10;7527:3;7523:20;7520:1;7513:31;7567:4;7564:1;7557:15;7595:4;7592:1;7585:15;7425:185;7626:2;7619:22;-1:-1:-1;;7301:346:1:o;7652:671::-;7691:3;7733:4;7715:16;7712:26;7709:39;;;7652:671;:::o;7709:39::-;7775:2;7769:9;-1:-1:-1;;7840:16:1;7836:25;;7833:1;7769:9;7812:50;7891:4;7885:11;7915:16;7950:18;8021:2;8014:4;8006:6;8002:17;7999:25;7994:2;7986:6;7983:14;7980:45;7977:58;;;8028:5;;;;;7652:671;:::o;7977:58::-;8065:6;8059:4;8055:17;8044:28;;8101:3;8095:10;8128:2;8120:6;8117:14;8114:27;;;8134:5;;;;;;7652:671;:::o;8114:27::-;8218:2;8199:16;8193:4;8189:27;8185:36;8178:4;8169:6;8164:3;8160:16;8156:27;8153:69;8150:82;;;8225:5;;;;;;7652:671;:::o;8150:82::-;8241:57;8292:4;8283:6;8275;8271:19;8267:30;8261:4;8241:57;:::i;:::-;-1:-1:-1;8314:3:1;;7652:671;-1:-1:-1;;;;;7652:671:1:o;8328:398::-;8530:2;8512:21;;;8569:2;8549:18;;;8542:30;8608:34;8603:2;8588:18;;8581:62;-1:-1:-1;;;8674:2:1;8659:18;;8652:32;8716:3;8701:19;;8328:398::o;9061:274::-;-1:-1:-1;;;;;9253:32:1;;;;9235:51;;9317:2;9302:18;;9295:34;9223:2;9208:18;;9061:274::o;9340:245::-;9407:6;9460:2;9448:9;9439:7;9435:23;9431:32;9428:52;;;9476:1;9473;9466:12;9428:52;9508:9;9502:16;9527:28;9549:5;9527:28;:::i;9590:325::-;9792:2;9774:21;;;9831:1;9811:18;;;9804:29;-1:-1:-1;;;9864:2:1;9849:18;;9842:32;9906:2;9891:18;;9590:325::o;10503:184::-;10573:6;10626:2;10614:9;10605:7;10601:23;10597:32;10594:52;;;10642:1;10639;10632:12;10594:52;-1:-1:-1;10665:16:1;;10503:184;-1:-1:-1;10503:184:1:o;11050:349::-;11252:2;11234:21;;;11291:2;11271:18;;;11264:30;11330:27;11325:2;11310:18;;11303:55;11390:2;11375:18;;11050:349::o;12043:251::-;12113:6;12166:2;12154:9;12145:7;12141:23;12137:32;12134:52;;;12182:1;12179;12172:12;12134:52;12214:9;12208:16;12233:31;12258:5;12233:31;:::i;12959:325::-;13161:2;13143:21;;;13200:1;13180:18;;;13173:29;-1:-1:-1;;;13233:2:1;13218:18;;13211:32;13275:2;13260:18;;12959:325::o;14279:375::-;-1:-1:-1;;;;;14537:15:1;;;14519:34;;14589:15;;;;14584:2;14569:18;;14562:43;14636:2;14621:18;;14614:34;;;;14469:2;14454:18;;14279:375::o;15754:306::-;15842:6;15850;15858;15911:2;15899:9;15890:7;15886:23;15882:32;15879:52;;;15927:1;15924;15917:12;15879:52;15956:9;15950:16;15940:26;;16006:2;15995:9;15991:18;15985:25;15975:35;;16050:2;16039:9;16035:18;16029:25;16019:35;;15754:306;;;;;:::o;17719:342::-;17921:2;17903:21;;;17960:2;17940:18;;;17933:30;-1:-1:-1;;;17994:2:1;17979:18;;17972:48;18052:2;18037:18;;17719:342::o;19854:503::-;20116:34;20111:3;20104:47;-1:-1:-1;;;20176:2:1;20171:3;20167:12;20160:32;20086:3;20221:6;20215:13;20237:73;20303:6;20298:2;20293:3;20289:12;20284:2;20276:6;20272:15;20237:73;:::i;:::-;20330:16;;;;20348:2;20326:25;;19854:503;-1:-1:-1;;19854:503:1:o;21107:607::-;-1:-1:-1;;;;;21466:15:1;;;21448:34;;21513:2;21498:18;;21491:34;;;;21556:2;21541:18;;21534:34;;;;21599:2;21584:18;;21577:34;;;;21648:15;;;21642:3;21627:19;;21620:44;21428:3;21680:19;;21673:35;;;;21397:3;21382:19;;21107:607::o;24724:127::-;24785:10;24780:3;24776:20;24773:1;24766:31;24816:4;24813:1;24806:15;24840:4;24837:1;24830:15;24856:574;25147:6;25136:9;25129:25;25190:6;25185:2;25174:9;25170:18;25163:34;25233:3;25228:2;25217:9;25213:18;25206:31;25110:4;25254:57;25306:3;25295:9;25291:19;25283:6;25254:57;:::i;:::-;-1:-1:-1;;;;;25347:32:1;;;;25342:2;25327:18;;25320:60;-1:-1:-1;25411:3:1;25396:19;25389:35;25246:65;24856:574;-1:-1:-1;;;24856:574:1:o;26600:459::-;26862:29;26857:3;26850:42;26832:3;26921:6;26915:13;26937:75;27005:6;27000:2;26995:3;26991:12;26984:4;26976:6;26972:17;26937:75;:::i;:::-;27032:16;;;;27050:2;27028:25;;26600:459;-1:-1:-1;;26600:459:1:o;29361:135::-;29400:3;29421:17;;;29418:43;;29441:18;;:::i;:::-;-1:-1:-1;29488:1:1;29477:13;;29361:135::o;29831:127::-;29892:10;29887:3;29883:20;29880:1;29873:31;29923:4;29920:1;29913:15;29947:4;29944:1;29937:15

Swarm Source

ipfs://06af8156c9a091de0f92d96ef3197cb2aeb142c8fb267846b05232599af30118

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.