S Price: $0.541143 (-8.64%)

Contract

0x1Ab6f9aFcde07ae2273715dC1A22a7C4c3F91c25

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve115282282025-03-04 2:43:102 days ago1741056190IN
0x1Ab6f9aF...4c3F91c25
0 S0.0026794855.01
Add Initial Liqu...115280592025-03-04 2:42:012 days ago1741056121IN
0x1Ab6f9aF...4c3F91c25
60 S0.1345275255
Initialize115279952025-03-04 2:41:362 days ago1741056096IN
0x1Ab6f9aF...4c3F91c25
0 S0.1309187555
Setup Swap Proxy...115279362025-03-04 2:41:142 days ago1741056074IN
0x1Ab6f9aF...4c3F91c25
0 S0.0029538855
Set Swap Proxy115279142025-03-04 2:41:052 days ago1741056065IN
0x1Ab6f9aF...4c3F91c25
0 S0.0019605355

Latest 1 internal transaction

Parent Transaction Hash Block From To
115280592025-03-04 2:42:012 days ago1741056121
0x1Ab6f9aF...4c3F91c25
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 - Metropolis'in desteklediği fonksiyon adlarını kullanıyoruz
    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;
    
    // Alternatif fonksiyon adları - Metropolis farklı bir isimlendirme kullanıyor olabilir
    function swapExactTokensForNATIVESupportingFeeOnTransferTokens(
        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;

        // Trading'i her zaman etkin yap
        tradingEnabled = true;

        // Kontrat adresini fee'den muaf tut
        _isExcludedFromFee[address(this)] = true;
        // Owner'ı fee'den muaf tut
        _isExcludedFromFee[msg.sender] = true;
        // Owner'ı trading kısıtlamalarından muaf tut
        _isExcludedFromTradingRestriction[msg.sender] = true;
        // Owner'a satış izni ver
        _isAllowedToSell[msg.sender] = true;
        // Owner'a alım izni ver
        _isAllowedToBuy[msg.sender] = true;

        _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");

        // Likidite çiftini fee'den muaf tut
        _isExcludedFromFee[liquidityPair] = true;
        // Likidite çiftini trading kısıtlamalarından muaf tut
        _isExcludedFromTradingRestriction[liquidityPair] = true;

        _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 {
        // Satış işlemlerinde her zaman vergi al (recipient == liquidityPair)
        bool shouldTakeFee = takeFee || recipient == liquidityPair;
        
        if (shouldTakeFee && !_inSwap) {
            // 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);
                
                // Otomatik likidite ve airdrop işlemini tetikle
                // Sadece satış işlemlerinde
                if (recipient == liquidityPair && !_inSwap && _pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    // Kontrat çağrısı yerine doğrudan fonksiyonu çağır
                    try this.processLiquidityAndAirdrop() {
                        // Başarılı
                    } catch {
                        // Hata durumunda sessizce devam et
                    }
                }
                
                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");
        
        // Bekleyen token miktarını kontrol et
        require(_pendingLiquidityTokens + _pendingAirdropTokens > 0, "No pending tokens");
        
        _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;
            emit SwapFailed("Swap failed, no ETH received");
            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) {
            try metropolisRouter.addLiquidityETH{value: ethForLiquidity}(
                address(this),
                tokensForLiquidity,
                0, // Minimum token miktarı
                0, // Minimum ETH miktarı
                treasuryWallet, // LP tokenleri treasury'ye gönder
                block.timestamp + 600 // 10 dakika deadline
            ) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
                emit LiquidityAdded(amountToken, amountETH);
                // liquidity değişkeni kullanılmıyor, ama uyarıyı önlemek için burada belirtiyoruz
                if (liquidity > 0) {
                    // LP token miktarı pozitif, işlem başarılı
                }
            } catch Error(string memory reason) {
                emit LiquidityAddFailed(reason);
            } catch {
                emit LiquidityAddFailed("Unknown error in addLiquidity");
            }
        }
        
        // 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 - daha yüksek bir miktar kullanıyoruz
        _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;
        
        // Önce swapExactTokensForETHSupportingFeeOnTransferTokens fonksiyonunu deneyelim
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            adjustedAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // İşlem başarılı, proxy'den ETH'yi alalım
            return _processProxyTransfer(initialEthBalance, adjustedAmount, tokenAmount);
        } catch Error(string memory reason) {
            // Eğer bu fonksiyon çalışmazsa, alternatif fonksiyonu deneyelim
            emit SwapFailed(string(abi.encodePacked("First swap method failed: ", reason)));
            
            // Alternatif fonksiyonu dene
            try metropolisRouter.swapExactTokensForNATIVESupportingFeeOnTransferTokens(
                adjustedAmount,
                minAmountOut,
                path,
                swapProxy, // ETH'yi proxy kontrata gönder
                deadline
            ) {
                // İşlem başarılı, proxy'den ETH'yi alalım
                return _processProxyTransfer(initialEthBalance, adjustedAmount, tokenAmount);
            } catch Error(string memory altReason) {
                // Hata mesajını kontrol et
                if (bytes(altReason).length > 0) {
                    // Eğer hata "E5" ise, daha küçük bir miktarla tekrar dene
                    if (keccak256(bytes(altReason)) == keccak256(bytes("E5"))) {
                        // Onayları tekrar yenile
                        _approve(address(this), address(metropolisRouter), type(uint256).max);
                        
                        // 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(string(abi.encodePacked("Alternative swap method failed: ", altReason)));
                return 0;
            } catch {
                // Bilinmeyen hata durumunda, daha küçük bir miktarla tekrar dene
                uint256 halfAmount = adjustedAmount / 2;
                if (halfAmount > 0 && halfAmount != adjustedAmount) {
                    // Onayları tekrar yenile
                    _approve(address(this), address(metropolisRouter), type(uint256).max);
                    
                    emit SwapFailed("Unknown swap error, retrying with half amount");
                    return _processSwap(halfAmount);
                }
                emit SwapFailed("Unknown swap error");
                return 0;
            }
        } catch {
            // Bilinmeyen hata durumunda, alternatif fonksiyonu deneyelim
            emit SwapFailed("First swap method failed with unknown error");
            
            // Alternatif fonksiyonu dene
            try metropolisRouter.swapExactTokensForNATIVESupportingFeeOnTransferTokens(
                adjustedAmount,
                minAmountOut,
                path,
                swapProxy, // ETH'yi proxy kontrata gönder
                deadline
            ) {
                // İşlem başarılı, proxy'den ETH'yi alalım
                return _processProxyTransfer(initialEthBalance, adjustedAmount, tokenAmount);
            } catch Error(string memory altReason) {
                emit SwapFailed(string(abi.encodePacked("Alternative swap method failed: ", altReason)));
                return 0;
            } catch {
                // Bilinmeyen hata durumunda, daha küçük bir miktarla tekrar dene
                uint256 halfAmount = adjustedAmount / 2;
                if (halfAmount > 0 && halfAmount != adjustedAmount) {
                    // Onayları tekrar yenile
                    _approve(address(this), address(metropolisRouter), type(uint256).max);
                    
                    emit SwapFailed("Unknown swap error, retrying with half amount");
                    return _processSwap(halfAmount);
                }
                emit SwapFailed("All swap methods failed with unknown errors");
                return 0;
            }
        }
    }
    
    // Proxy transfer işlemini ayrı bir fonksiyona çıkardık
    function _processProxyTransfer(uint256 initialEthBalance, uint256 adjustedAmount, uint256 tokenAmount) private returns (uint256) {
        // 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;
        }
    }

    // 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 fonksiyonu
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        if (ethAmount == 0 || tokenAmount == 0) return;
        
        // Onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // ETH miktarının yarısını kullan (daha güvenli)
        uint256 halfEthAmount = ethAmount / 2;
        if (halfEthAmount == 0) return;
        
        // Token miktarının yarısını kullan
        uint256 halfTokenAmount = tokenAmount / 2;
        if (halfTokenAmount == 0) return;
        
        // Minimum miktarları hesapla (slippage için)
        uint256 minEthAmount = halfEthAmount * 90 / 100; // %10 slippage
        uint256 minTokenAmount = halfTokenAmount * 90 / 100; // %10 slippage
        
        // Deadline ayarla
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        try metropolisRouter.addLiquidityETH{value: halfEthAmount}(
            address(this),
            halfTokenAmount,
            minTokenAmount,
            minEthAmount,
            treasuryWallet, // LP tokenleri treasury'ye gönder
            deadline
        ) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
            emit LiquidityAdded(amountToken, amountETH);
            // liquidity değişkeni kullanılmıyor, ama uyarıyı önlemek için burada belirtiyoruz
            if (liquidity > 0) {
                // LP token miktarı pozitif, işlem başarılı
            }
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("Unknown error in addLiquidity");
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) internal {
        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;
        
        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]);
        
        // Transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    // Trading ile ilgili fonksiyonlar - artık kullanılmıyor
    // 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];
    }
    
    // Manuel olarak SwapProxy'yi ayarla
    function setupSwapProxyManually() external onlyOwner {
        require(swapProxy != address(0), "Swap proxy not set");
        require(swapProxySet, "Swap proxy not set");
        
        // Proxy kontratına bu kontratı ayarla
        ISwapProxy(swapProxy).setFarmerContract(address(this));
    }
}

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":[{"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":"setupSwapProxyManually","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"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000388565b5060046200006f828262000388565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c381620001e5565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790556010805460ff60b81b1916600160b81b179055306000818152601160209081526040808320805460ff1990811660019081179092553385528285208054821683179055601284528285208054821683179055601384528285208054821683179055601490935292208054909116909117905591929091620001db9069d3c21bcecceda100000062000237565b505050506200047c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002745760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b806002600082825462000288919062000454565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200030f57607f821691505b6020821081036200033057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002df57600081815260208120601f850160051c810160208610156200035f5750805b601f850160051c820191505b8181101562000380578281556001016200036b565b505050505050565b81516001600160401b03811115620003a457620003a4620002e4565b620003bc81620003b58454620002fa565b8462000336565b602080601f831160018114620003f45760008415620003db5750858301515b600019600386901b1c1916600185901b17855562000380565b600085815260208120601f198616915b82811015620004255788860151825594840194600190910190840162000404565b5085821015620004445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200047657634e487b7160e01b600052601160045260246000fd5b92915050565b6149b0806200048c6000396000f3fe6080604052600436106102815760003560e01c8063808a54571161014f578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461083e578063e6efd91a14610846578063e85ceee814610866578063ed9cacfe1461089f578063f2fde38b146108b4578063fd7c9fab146108d457600080fd5b8063c0d7865514610748578063c84a705c14610768578063d4d7b19a14610788578063d720a2a8146107b8578063dd62ed3e146107d8578063df8408fe1461081e57600080fd5b8063a8602fea11610113578063a8602fea14610679578063a9059cbb14610699578063b58bedb6146106b9578063b70143c9146106ce578063b77e895c146106ee578063b9276e4b1461072757600080fd5b8063808a5457146105f15780638129fc1c146106115780638da5cb5b1461062657806395d89b4114610644578063975b87e81461065957600080fd5b80635342acb4116101f35780636d62062a116101ac5780636d62062a146105125780636ec4be901461054b57806370a08231146105715780637136982b146105a75780637ac84fc1146105bc578063801b51d9146105d157600080fd5b80635342acb414610442578063573761981461047b5780635d76b04c1461049b5780635fe8e7cc146104b057806362b6327a146104d25780636a3c68fc146104f257600080fd5b80632a11ced0116102455780632a11ced014610378578063313ce567146103b0578063397883d2146103cc578063461a3a95146103e15780634626402b146104015780634ada218b1461042157600080fd5b806306fdde03146102c957806308dee2b4146102f4578063095ea7b31461031357806318160ddd1461034357806323b872dd1461035857600080fd5b366102c45734156102c25760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102d557600080fd5b506102de6108f4565b6040516102eb9190614207565b60405180910390f35b34801561030057600080fd5b50600e545b6040519081526020016102eb565b34801561031f57600080fd5b5061033361032e36600461424f565b610986565b60405190151581526020016102eb565b34801561034f57600080fd5b50600254610305565b34801561036457600080fd5b5061033361037336600461427b565b6109a0565b34801561038457600080fd5b506103986103933660046142bc565b6109c6565b6040516001600160a01b0390911681526020016102eb565b3480156103bc57600080fd5b50604051601281526020016102eb565b3480156103d857600080fd5b506102c26109f0565b3480156103ed57600080fd5b50600954610398906001600160a01b031681565b34801561040d57600080fd5b50600b54610398906001600160a01b031681565b34801561042d57600080fd5b5060105461033390600160b81b900460ff1681565b34801561044e57600080fd5b5061033361045d3660046142d5565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561048757600080fd5b506102c261049636600461424f565b610d17565b3480156104a757600080fd5b50600f54610305565b3480156104bc57600080fd5b506104c5610de3565b6040516102eb9190614336565b3480156104de57600080fd5b50600754610398906001600160a01b031681565b3480156104fe57600080fd5b506102c261050d366004614357565b610e44565b34801561051e57600080fd5b5061033361052d3660046142d5565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561055757600080fd5b50601054610398906201000090046001600160a01b031681565b34801561057d57600080fd5b5061030561058c3660046142d5565b6001600160a01b031660009081526020819052604090205490565b3480156105b357600080fd5b50600d54610305565b3480156105c857600080fd5b506102c2610e77565b3480156105dd57600080fd5b506102c26105ec366004614357565b611472565b3480156105fd57600080fd5b50600a54610398906001600160a01b031681565b34801561061d57600080fd5b506102c26114a5565b34801561063257600080fd5b506006546001600160a01b0316610398565b34801561065057600080fd5b506102de611859565b34801561066557600080fd5b506102c2610674366004614390565b611868565b34801561068557600080fd5b506102c26106943660046142d5565b611f99565b3480156106a557600080fd5b506103336106b436600461424f565b612036565b3480156106c557600080fd5b506102c2612044565b3480156106da57600080fd5b506102c26106e93660046142bc565b612101565b3480156106fa57600080fd5b506103336107093660046142d5565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561073357600080fd5b5060105461033390600160b01b900460ff1681565b34801561075457600080fd5b506102c26107633660046142d5565b61228e565b34801561077457600080fd5b506102c26107833660046142d5565b6122f3565b34801561079457600080fd5b506103336107a33660046142d5565b600c6020526000908152604090205460ff1681565b3480156107c457600080fd5b506102c26107d33660046142bc565b6124c4565b3480156107e457600080fd5b506103056107f33660046143b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561082a57600080fd5b506102c2610839366004614357565b6126bc565b6102c26126ef565b34801561085257600080fd5b506102c2610861366004614357565b61292b565b34801561087257600080fd5b506103336108813660046142d5565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108ab57600080fd5b506102c261295e565b3480156108c057600080fd5b506102c26108cf3660046142d5565b612be2565b3480156108e057600080fd5b50600854610398906001600160a01b031681565b606060038054610903906143e0565b80601f016020809104026020016040519081016040528092919081815260200182805461092f906143e0565b801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b5050505050905090565b600033610994818585612c2e565b60019150505b92915050565b6000336109ae858285612ce0565b6109b9858585612d48565b60019150505b9392505050565b600d81815481106109d657600080fd5b6000918252602090912001546001600160a01b0316905081565b6109f8612e5c565b6000600e541180610a0b57506000600f54115b610a415760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610a755760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a38565b600f54600e5468056bc75e2d6310000091600091610a939190614430565b905081811115610c4c57600081610ab284670de0b6b3a7640000614443565b610abc919061445a565b90506000670de0b6b3a764000082600e54610ad79190614443565b610ae1919061445a565b90506000670de0b6b3a764000083600f54610afc9190614443565b610b06919061445a565b905081600e6000828254610b1a919061447c565b9250508190555080600f6000828254610b33919061447c565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610b8257600080fd5b505af1925050508015610b93575060015b610c4357610b9f61448f565b806308c379a003610c035750610bb36144e6565b80610bbe5750610c05565b60008051602061491b83398151915281604051610bdb9190614207565b60405180910390a1610bed8584614430565b600e55610bfa8483614430565b600f5550610c43565b505b60008051602061491b833981519152604051610c2090614570565b60405180910390a1610c328483614430565b600e55610c3f8382614430565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8757600080fd5b505af1925050508015610c98575060015b610d1357610ca461448f565b806308c379a003610ced5750610cb86144e6565b80610cc35750610cef565b60008051602061491b83398151915281604051610ce09190614207565b60405180910390a1505050565b505b60008051602061491b833981519152604051610d0a90614570565b60405180910390a15b5050565b610d1f612e5c565b306001600160a01b03831603610d5c5760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a38565b816001600160a01b031663a9059cbb610d7d6006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610d9b9291906145b2565b6020604051808303816000875af1158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde91906145cb565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561097c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e1d575050505050905090565b610e4c612e5c565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610e995760405162461bcd60e51b8152600401610a38906145e8565b6002600555601054610100900460ff1615610edb5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a38565b6000600f54600e54610eed9190614430565b11610f2e5760405162461bcd60e51b81526020600482015260116024820152704e6f2070656e64696e6720746f6b656e7360781b6044820152606401610a38565b6010805461ff001916610100179055600e54600f5481158015610f4f575080155b15610f665750506010805461ff001916905561146b565b68056bc75e2d631000006000610f7c8385614430565b90508181111561102857600081610f9b84670de0b6b3a7640000614443565b610fa5919061445a565b9050670de0b6b3a7640000610fba8287614443565b610fc4919061445a565b9450670de0b6b3a7640000610fd98286614443565b610fe3919061445a565b9350610fef8486614430565b915084600e6000828254611003919061447c565b9250508190555083600f600082825461101c919061447c565b90915550611033915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa1580156110aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ce9190614604565b9050818110156111735784600e60008282546110ea9190614430565b9250508190555083600f60008282546111039190614430565b90915550506010805461ff001916905560405160008051602061491b83398151915290611161906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a1505050505061146b565b60075461118d9030906001600160a01b0316600019612c2e565b47600061119984612eaa565b90508060000361120e5786600e60008282546111b59190614430565b9250508190555085600f60008282546111ce9190614430565b90915550506010805461ff001916905560405160008051602061491b833981519152906111fa9061461d565b60405180910390a15050505050505061146b565b478281116112835787600e60008282546112289190614430565b9250508190555086600f60008282546112419190614430565b909155505060405160008051602061491b8339815191529061126290614654565b60405180910390a150506010805461ff00191690555061146b945050505050565b600061128f848361447c565b905060008661129e8b84614443565b6112a8919061445a565b905060006112b6828461447c565b9050811561144557600760009054906101000a90046001600160a01b03166001600160a01b031663f305d71983308e600080600b60009054906101000a90046001600160a01b03164261025861130c9190614430565b6040518863ffffffff1660e01b815260040161132d9695949392919061468b565b60606040518083038185885af193505050508015611368575060408051601f3d908101601f19168201909252611365918101906146c6565b60015b61141a5761137461448f565b806308c379a0036113be57506113886144e6565b8061139357506113c0565b60008051602061495b833981519152816040516113b09190614207565b60405180910390a150611445565b505b60008051602061495b83398151915260405161140d906020808252601d908201527f556e6b6e6f776e206572726f7220696e206164644c6971756964697479000000604082015260600190565b60405180910390a1611445565b604080518481526020810184905260008051602061493b833981519152910160405180910390a15050505b801561145457611454816135cd565b50506010805461ff00191690555050505050505050505b6001600555565b61147a612e5c565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6114ad612e5c565b60105460ff16156114e55760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a38565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156891906146f4565b600a80546001600160a01b0319166001600160a01b03929092169182179055611624576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156115df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160391906146f4565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166116615760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a38565b600a80546001600160a01b0390811660009081526011602090815260408083208054600160ff19918216811790925595548516845260129092529091208054909316179091556007546116b991309116600019612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926116f192911690600019906004016145b2565b6020604051808303816000875af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173491906145cb565b6117655760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a38565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261179d92911690600019906004016145b2565b6020604051808303816000875af11580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e091906145cb565b50600a5460405163095ea7b360e01b8152309163095ea7b391611813916001600160a01b031690600019906004016145b2565b6020604051808303816000875af1158015611832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185691906145cb565b50565b606060048054610903906143e0565b611870612e5c565b600082116118905760405162461bcd60e51b8152600401610a3890614711565b600081116118c55760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a38565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190614604565b10156119595760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a38565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190614604565b10156119f85760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a38565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611a2c9033903090869060040161472d565b6020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906145cb565b611aa05760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a38565b600754611ab89030906001600160a01b031684612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611aee9291169085906004016145b2565b6020604051808303816000875af1158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3191906145cb565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611b5f42610258614430565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611bf7575060408051601f3d908101601f19168201909252611bf4918101906146c6565b60015b611e7f57611c0361448f565b806308c379a003611d465750611c176144e6565b80611c225750611d48565b600754611c3b9030906001600160a01b03166000612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c72929116906000906004016145b2565b6020604051808303816000875af1158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb591906145cb565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611ce890339086906004016145b2565b6020604051808303816000875af1158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b91906145cb565b508060405162461bcd60e51b8152600401610a389190614207565b505b600754611d619030906001600160a01b03166000612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611d98929116906000906004016145b2565b6020604051808303816000875af1158015611db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ddb91906145cb565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611e0e90339085906004016145b2565b6020604051808303816000875af1158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5191906145cb565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a38565b5050604080518481526020810184905260008051602061493b83398151915292500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f169190614604565b90508015610dde5760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611f5090339085906004016145b2565b6020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9391906145cb565b50505050565b611fa1612e5c565b6001600160a01b038116611fdc5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a38565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d0a565b600033610994818585612d48565b61204c612e5c565b6010546201000090046001600160a01b031661207a5760405162461bcd60e51b8152600401610a3890614751565b601054600160b01b900460ff166120a35760405162461bcd60e51b8152600401610a3890614751565b6010546040516324872d5b60e21b8152306004820152620100009091046001600160a01b03169063921cb56c90602401600060405180830381600087803b1580156120ed57600080fd5b505af1158015611f93573d6000803e3d6000fd5b612109612e5c565b60026005540361212b5760405162461bcd60e51b8152600401610a38906145e8565b60026005558061217d5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a38565b306000908152602081905260409020548111156121d35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a38565b601054600160b01b900460ff166121fc5760405162461bcd60e51b8152600401610a3890614751565b47600061220883612eaa565b90508060000361222a5760405162461bcd60e51b8152600401610a389061461d565b4782811161224a5760405162461bcd60e51b8152600401610a3890614654565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b612296612e5c565b6001600160a01b0381166122d15760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a38565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6122fb612e5c565b6001600160a01b0381166123435760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a38565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561239d575060408051601f3d908101601f1916820190925261239a918101906146f4565b60015b6123e25760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a38565b6001600160a01b0381161580159061240357506001600160a01b0381163014155b1561245e5760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a38565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6124cc612e5c565b6002600554036124ee5760405162461bcd60e51b8152600401610a38906145e8565b6002600555806125105760405162461bcd60e51b8152600401610a3890614711565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa15801561254d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125719190614604565b10156125a45760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a38565b601054600160b01b900460ff166125cd5760405162461bcd60e51b8152600401610a3890614751565b6007546125e79030906001600160a01b0316600019612c2e565b4760006125f383612eaa565b9050806000036126155760405162461bcd60e51b8152600401610a389061461d565b478281116126355760405162461bcd60e51b8152600401610a3890614654565b6000612641848361447c565b905060006064612652601984614443565b61265c919061445a565b90506000606461266d601985614443565b612677919061445a565b9050811561269f5761269f82606461269060198b614443565b61269a919061445a565b61377a565b80156126ae576126ae816135cd565b505060016005555050505050565b6126c4612e5c565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6126f7612e5c565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127599190614604565b90506000811161277b5760405162461bcd60e51b8152600401610a3890614711565b600034116127b05760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a38565b6007546127c89030906001600160a01b031683612c2e565b6007546001600160a01b031663f305d719343084600080336127ec42610258614430565b6040518863ffffffff1660e01b815260040161280d9695949392919061468b565b60606040518083038185885af193505050508015612848575060408051601f3d908101601f19168201909252612845918101906146c6565b60015b6128ff5761285461448f565b806308c379a0036128b857506128686144e6565b8061287357506128ba565b60075461288c9030906001600160a01b03166000612c2e565b60405133904780156108fc02916000818181858888f19350505050158015611d2b573d6000803e3d6000fd5b505b6007546128d39030906001600160a01b03166000612c2e565b60405133904780156108fc02916000818181858888f19350505050158015611e51573d6000803e3d6000fd5b50506040805183815234602082015260008051602061493b83398151915292500160405180910390a150565b612933612e5c565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612966612e5c565b6007546129809030906001600160a01b0316600019612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129b892911690600019906004016145b2565b6020604051808303816000875af19250505080156129f3575060408051601f3d908101601f191682019092526129f0918101906145cb565b60015b15612a4957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a40926001600160a01b03918216929116906000199061472d565b60405180910390a15b600a546001600160a01b031615612be057600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612a9292911690600019906004016145b2565b6020604051808303816000875af1925050508015612acd575060408051601f3d908101601f19168201909252612aca918101906145cb565b60015b15612b235750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612b1a926001600160a01b03918216929116906000199061472d565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612b55916001600160a01b031690600019906004016145b2565b6020604051808303816000875af1925050508015612b90575060408051601f3d908101601f19168201909252612b8d918101906145cb565b60015b15612be05750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612bd79130916001600160a01b0316906000199061472d565b60405180910390a15b565b612bea612e5c565b6001600160a01b038116612c255760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a38565b61185681613989565b6001600160a01b03831615801590612c4e57506001600160a01b03821615155b612c7f5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a38565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612d3b5760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a38565b611f938484848403612c2e565b6001600160a01b038316612d835760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a38565b6001600160a01b038216612dbe5760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a38565b60008111612df35760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a38565b601054610100900460ff1615612e0e57610dde8383836139db565b6001600160a01b03831660009081526011602052604081205460ff1680612e4d57506001600160a01b03831660009081526011602052604090205460ff165b159050611f9384848484613b3a565b33612e6f6006546001600160a01b031690565b6001600160a01b031614612be05760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a38565b600081600003612ebc57506000919050565b601054600160b01b900460ff16612ee55760405162461bcd60e51b8152600401610a3890614751565b816802b5e3af16b1880000811115612f0357506802b5e3af16b18800005b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f3857612f3861477d565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb591906146f4565b81600181518110612fc857612fc861477d565b6001600160a01b039283166020918202929092010152600754600091612ff391309116600019612c2e565b600061300142610e10614430565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261304a928a9289928b9262010000909104909116908990600401614793565b600060405180830381600087803b15801561306457600080fd5b505af1925050508015613075575060015b6135b75761308161448f565b806308c379a00361339557506130956144e6565b806130a05750613397565b60008051602061491b833981519152816040516020016130c091906147cf565b60408051601f19818403018152908290526130da91614207565b60405180910390a160075460105460405163082349bf60e31b81526001600160a01b039283169263411a4df892613126928b928a928c9262010000909104909116908a90600401614793565b600060405180830381600087803b15801561314057600080fd5b505af1925050508015613151575060015b61337e5761315d61448f565b806308c379a0036132c357506131716144e6565b8061317c57506132c5565b80511561327257604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc401613272576007546131e39030906001600160a01b0316600019612c2e565b60006131f060028961445a565b905080156132705760008051602061491b8339815191526040516132519060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161326281612eaa565b9a9950505050505050505050565b505b60008051602061491b833981519152816040516020016132929190614814565b60408051601f19818403018152908290526132ac91614207565b60405180910390a150600098975050505050505050565b505b60006132d260028861445a565b90506000811180156132e45750868114155b1561333c576007546133039030906001600160a01b0316600019612c2e565b60008051602061491b83398151915260405161331e90614859565b60405180910390a161332f81612eaa565b9998505050505050505050565b60008051602061491b8339815191526040516132ac906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b61338982878a613d8e565b98975050505050505050565b505b60008051602061491b8339815191526040516133f8906020808252602b908201527f46697273742073776170206d6574686f64206661696c6564207769746820756e60408201526a35b737bbb71032b93937b960a91b606082015260800190565b60405180910390a160075460105460405163082349bf60e31b81526001600160a01b039283169263411a4df892613444928a9289928b9262010000909104909116908990600401614793565b600060405180830381600087803b15801561345e57600080fd5b505af192505050801561346f575060015b6135b75761347b61448f565b806308c379a0036134ea575061348f6144e6565b8061349a57506134ec565b60008051602061491b833981519152816040516020016134ba9190614814565b60408051601f19818403018152908290526134d491614207565b60405180910390a1506000979650505050505050565b505b60006134f960028761445a565b905060008111801561350b5750858114155b156135565760075461352a9030906001600160a01b0316600019612c2e565b60008051602061491b83398151915260405161354590614859565b60405180910390a161338981612eaa565b60008051602061491b8339815191526040516134d4906020808252602b908201527f416c6c2073776170206d6574686f6473206661696c6564207769746820756e6b60408201526a6e6f776e206572726f727360a81b606082015260800190565b6135c2818689613d8e565b979650505050505050565b600d548015806135db575081155b156135e4575050565b60006135f0828461445a565b9050806000036135ff57505050565b60005b8281101561373b576000600d828154811061361f5761361f61477d565b6000918252602090912001546001600160a01b03169050801580159061364e57506001600160a01b0381163014155b80156136685750600a546001600160a01b03828116911614155b15613728576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146136ba576040519150601f19603f3d011682016040523d82523d6000602084013e6136bf565b606091505b5050905080613726577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161371d90602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b5080613733816148a6565b915050613602565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b811580613785575080155b1561378e575050565b6007546137a89030906001600160a01b0316600019612c2e565b60006137b560028461445a565b9050806000036137c457505050565b60006137d160028461445a565b9050806000036137e15750505050565b600060646137f084605a614443565b6137fa919061445a565b90506000606461380b84605a614443565b613815919061445a565b9050600061382542610e10614430565b600754600b5460405163f305d71960e01b81529293506001600160a01b039182169263f305d7199289926138699230928b928a928c92909116908a9060040161468b565b60606040518083038185885af1935050505080156138a4575060408051601f3d908101601f191682019092526138a1918101906146c6565b60015b613956576138b061448f565b806308c379a0036138fa57506138c46144e6565b806138cf57506138fc565b60008051602061495b833981519152816040516138ec9190614207565b60405180910390a150610c43565b505b60008051602061495b833981519152604051613949906020808252601d908201527f556e6b6e6f776e206572726f7220696e206164644c6971756964697479000000604082015260600190565b60405180910390a1610c43565b604080518481526020810184905260008051602061493b833981519152910160405180910390a150505050505050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613a165760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a38565b6001600160a01b038216613a515760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a38565b60008111613a865760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a38565b6001600160a01b03831660009081526020819052604090205481811015613ad45760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a38565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f93565b60008180613b555750600a546001600160a01b038581169116145b9050808015613b6c5750601054610100900460ff16155b15613d245760006064613b80600586614443565b613b8a919061445a565b90508015613d225760006064613ba1601984614443565b613bab919061445a565b905060006064613bbc601985614443565b613bc6919061445a565b90506000613bd4848861447c565b9050613be18930866139db565b613bec8989836139db565b82600e6000828254613bfe9190614430565b9250508190555081600f6000828254613c179190614430565b90915550613c50905089678ac7230489e80000613c49826001600160a01b031660009081526020819052604090205490565b1015613fd4565b613c7c88678ac7230489e80000613c498b6001600160a01b031660009081526020819052604090205490565b600a546001600160a01b038981169116148015613ca15750601054610100900460ff16155b8015613cc557506801158e460913d00000600f54600e54613cc29190614430565b10155b15613d1857306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613d0557600080fd5b505af1925050508015613d16575060015b505b5050505050611f93565b505b613d2f8585856139db565b613d5b85678ac7230489e80000613c49886001600160a01b031660009081526020819052604090205490565b613d8784678ac7230489e80000613c49876001600160a01b031660009081526020819052604090205490565b5050505050565b6000601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613de057600080fd5b505af1925050508015613df1575060015b613ed857613dfd61448f565b806308c379a003613e685750613e116144e6565b80613e1c5750613e6a565b60008051602061491b83398151915281604051602001613e3c91906148bf565b60408051601f1981840301815290829052613e5691614207565b60405180910390a160009150506109bf565b505b60008051602061491b833981519152604051613ec89060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060006109bf565b476000613ee5868361447c565b90508015613f675760408051868152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a183851015613f5e576000613f3a868661447c565b90506000613f4782612eaa565b9050613f538184614430565b9450505050506109bf565b91506109bf9050565b60008051602061491b833981519152604051613fc19060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a16000925050506109bf565b600a546001600160a01b03838116911614801590613ffb57506001600160a01b0382163014155b15610d135780801561402657506001600160a01b0382166000908152600c602052604090205460ff16155b1561409257506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156140b857506001600160a01b0382166000908152600c602052604090205460ff165b15610d13576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610dde57826001600160a01b0316600d82815481106141055761410561477d565b6000918252602090912001546001600160a01b0316036141d157600d805461412f9060019061447c565b8154811061413f5761413f61477d565b600091825260209091200154600d80546001600160a01b03909216918390811061416b5761416b61477d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806141aa576141aa614904565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806141db816148a6565b9150506140de565b60005b838110156141fe5781810151838201526020016141e6565b50506000910152565b60208152600082518060208401526142268160408501602087016141e3565b601f01601f19169190910160400192915050565b6001600160a01b038116811461185657600080fd5b6000806040838503121561426257600080fd5b823561426d8161423a565b946020939093013593505050565b60008060006060848603121561429057600080fd5b833561429b8161423a565b925060208401356142ab8161423a565b929592945050506040919091013590565b6000602082840312156142ce57600080fd5b5035919050565b6000602082840312156142e757600080fd5b81356109bf8161423a565b600081518084526020808501945080840160005b8381101561432b5781516001600160a01b031687529582019590820190600101614306565b509495945050505050565b6020815260006109bf60208301846142f2565b801515811461185657600080fd5b6000806040838503121561436a57600080fd5b82356143758161423a565b9150602083013561438581614349565b809150509250929050565b600080604083850312156143a357600080fd5b50508035926020909101359150565b600080604083850312156143c557600080fd5b82356143d08161423a565b915060208301356143858161423a565b600181811c908216806143f457607f821691505b60208210810361441457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561099a5761099a61441a565b808202811582820484141761099a5761099a61441a565b60008261447757634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561099a5761099a61441a565b600060033d11156144a85760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156144df57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156144f45790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561452457505050505090565b828501915081518181111561453c5750505050505090565b843d87010160208285010111156145565750505050505090565b614565602082860101876144ab565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156145dd57600080fd5b81516109bf81614349565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561461657600080fd5b5051919050565b6020808252601c908201527f53776170206661696c65642c206e6f2045544820726563656976656400000000604082015260600190565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806000606084860312156146db57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561470657600080fd5b81516109bf8161423a565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006147b260a08301866142f2565b6001600160a01b0394909416606083015250608001529392505050565b7f46697273742073776170206d6574686f64206661696c65643a2000000000000081526000825161480781601a8501602087016141e3565b91909101601a0192915050565b7f416c7465726e61746976652073776170206d6574686f64206661696c65643a2081526000825161484c8160208501602087016141e3565b9190910160200192915050565b6020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b6000600182016148b8576148b861441a565b5060010190565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516148f781601b8501602087016141e3565b91909101601b0192915050565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072338f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515ba31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ada26469706673582212208a7d6ca80ed0956a2a7dfe20ffdeb54305d1bcfda00c2585b69731c1b9fe030764736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063808a54571161014f578063c0d78655116100c1578063e3a8fa551161007a578063e3a8fa551461083e578063e6efd91a14610846578063e85ceee814610866578063ed9cacfe1461089f578063f2fde38b146108b4578063fd7c9fab146108d457600080fd5b8063c0d7865514610748578063c84a705c14610768578063d4d7b19a14610788578063d720a2a8146107b8578063dd62ed3e146107d8578063df8408fe1461081e57600080fd5b8063a8602fea11610113578063a8602fea14610679578063a9059cbb14610699578063b58bedb6146106b9578063b70143c9146106ce578063b77e895c146106ee578063b9276e4b1461072757600080fd5b8063808a5457146105f15780638129fc1c146106115780638da5cb5b1461062657806395d89b4114610644578063975b87e81461065957600080fd5b80635342acb4116101f35780636d62062a116101ac5780636d62062a146105125780636ec4be901461054b57806370a08231146105715780637136982b146105a75780637ac84fc1146105bc578063801b51d9146105d157600080fd5b80635342acb414610442578063573761981461047b5780635d76b04c1461049b5780635fe8e7cc146104b057806362b6327a146104d25780636a3c68fc146104f257600080fd5b80632a11ced0116102455780632a11ced014610378578063313ce567146103b0578063397883d2146103cc578063461a3a95146103e15780634626402b146104015780634ada218b1461042157600080fd5b806306fdde03146102c957806308dee2b4146102f4578063095ea7b31461031357806318160ddd1461034357806323b872dd1461035857600080fd5b366102c45734156102c25760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b3480156102d557600080fd5b506102de6108f4565b6040516102eb9190614207565b60405180910390f35b34801561030057600080fd5b50600e545b6040519081526020016102eb565b34801561031f57600080fd5b5061033361032e36600461424f565b610986565b60405190151581526020016102eb565b34801561034f57600080fd5b50600254610305565b34801561036457600080fd5b5061033361037336600461427b565b6109a0565b34801561038457600080fd5b506103986103933660046142bc565b6109c6565b6040516001600160a01b0390911681526020016102eb565b3480156103bc57600080fd5b50604051601281526020016102eb565b3480156103d857600080fd5b506102c26109f0565b3480156103ed57600080fd5b50600954610398906001600160a01b031681565b34801561040d57600080fd5b50600b54610398906001600160a01b031681565b34801561042d57600080fd5b5060105461033390600160b81b900460ff1681565b34801561044e57600080fd5b5061033361045d3660046142d5565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561048757600080fd5b506102c261049636600461424f565b610d17565b3480156104a757600080fd5b50600f54610305565b3480156104bc57600080fd5b506104c5610de3565b6040516102eb9190614336565b3480156104de57600080fd5b50600754610398906001600160a01b031681565b3480156104fe57600080fd5b506102c261050d366004614357565b610e44565b34801561051e57600080fd5b5061033361052d3660046142d5565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561055757600080fd5b50601054610398906201000090046001600160a01b031681565b34801561057d57600080fd5b5061030561058c3660046142d5565b6001600160a01b031660009081526020819052604090205490565b3480156105b357600080fd5b50600d54610305565b3480156105c857600080fd5b506102c2610e77565b3480156105dd57600080fd5b506102c26105ec366004614357565b611472565b3480156105fd57600080fd5b50600a54610398906001600160a01b031681565b34801561061d57600080fd5b506102c26114a5565b34801561063257600080fd5b506006546001600160a01b0316610398565b34801561065057600080fd5b506102de611859565b34801561066557600080fd5b506102c2610674366004614390565b611868565b34801561068557600080fd5b506102c26106943660046142d5565b611f99565b3480156106a557600080fd5b506103336106b436600461424f565b612036565b3480156106c557600080fd5b506102c2612044565b3480156106da57600080fd5b506102c26106e93660046142bc565b612101565b3480156106fa57600080fd5b506103336107093660046142d5565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561073357600080fd5b5060105461033390600160b01b900460ff1681565b34801561075457600080fd5b506102c26107633660046142d5565b61228e565b34801561077457600080fd5b506102c26107833660046142d5565b6122f3565b34801561079457600080fd5b506103336107a33660046142d5565b600c6020526000908152604090205460ff1681565b3480156107c457600080fd5b506102c26107d33660046142bc565b6124c4565b3480156107e457600080fd5b506103056107f33660046143b2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561082a57600080fd5b506102c2610839366004614357565b6126bc565b6102c26126ef565b34801561085257600080fd5b506102c2610861366004614357565b61292b565b34801561087257600080fd5b506103336108813660046142d5565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108ab57600080fd5b506102c261295e565b3480156108c057600080fd5b506102c26108cf3660046142d5565b612be2565b3480156108e057600080fd5b50600854610398906001600160a01b031681565b606060038054610903906143e0565b80601f016020809104026020016040519081016040528092919081815260200182805461092f906143e0565b801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b5050505050905090565b600033610994818585612c2e565b60019150505b92915050565b6000336109ae858285612ce0565b6109b9858585612d48565b60019150505b9392505050565b600d81815481106109d657600080fd5b6000918252602090912001546001600160a01b0316905081565b6109f8612e5c565b6000600e541180610a0b57506000600f54115b610a415760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d54610a755760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610a38565b600f54600e5468056bc75e2d6310000091600091610a939190614430565b905081811115610c4c57600081610ab284670de0b6b3a7640000614443565b610abc919061445a565b90506000670de0b6b3a764000082600e54610ad79190614443565b610ae1919061445a565b90506000670de0b6b3a764000083600f54610afc9190614443565b610b06919061445a565b905081600e6000828254610b1a919061447c565b9250508190555080600f6000828254610b33919061447c565b9091555050600e8054600f80549285905583905560408051637ac84fc160e01b815290519192913091637ac84fc191600480830192600092919082900301818387803b158015610b8257600080fd5b505af1925050508015610b93575060015b610c4357610b9f61448f565b806308c379a003610c035750610bb36144e6565b80610bbe5750610c05565b60008051602061491b83398151915281604051610bdb9190614207565b60405180910390a1610bed8584614430565b600e55610bfa8483614430565b600f5550610c43565b505b60008051602061491b833981519152604051610c2090614570565b60405180910390a1610c328483614430565b600e55610c3f8382614430565b600f555b50505050505050565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8757600080fd5b505af1925050508015610c98575060015b610d1357610ca461448f565b806308c379a003610ced5750610cb86144e6565b80610cc35750610cef565b60008051602061491b83398151915281604051610ce09190614207565b60405180910390a1505050565b505b60008051602061491b833981519152604051610d0a90614570565b60405180910390a15b5050565b610d1f612e5c565b306001600160a01b03831603610d5c5760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610a38565b816001600160a01b031663a9059cbb610d7d6006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610d9b9291906145b2565b6020604051808303816000875af1158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde91906145cb565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561097c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e1d575050505050905090565b610e4c612e5c565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600260055403610e995760405162461bcd60e51b8152600401610a38906145e8565b6002600555601054610100900460ff1615610edb5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610a38565b6000600f54600e54610eed9190614430565b11610f2e5760405162461bcd60e51b81526020600482015260116024820152704e6f2070656e64696e6720746f6b656e7360781b6044820152606401610a38565b6010805461ff001916610100179055600e54600f5481158015610f4f575080155b15610f665750506010805461ff001916905561146b565b68056bc75e2d631000006000610f7c8385614430565b90508181111561102857600081610f9b84670de0b6b3a7640000614443565b610fa5919061445a565b9050670de0b6b3a7640000610fba8287614443565b610fc4919061445a565b9450670de0b6b3a7640000610fd98286614443565b610fe3919061445a565b9350610fef8486614430565b915084600e6000828254611003919061447c565b9250508190555083600f600082825461101c919061447c565b90915550611033915050565b6000600e819055600f555b60408051858152602081018590527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa1580156110aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ce9190614604565b9050818110156111735784600e60008282546110ea9190614430565b9250508190555083600f60008282546111039190614430565b90915550506010805461ff001916905560405160008051602061491b83398151915290611161906020808252601d908201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604082015260600190565b60405180910390a1505050505061146b565b60075461118d9030906001600160a01b0316600019612c2e565b47600061119984612eaa565b90508060000361120e5786600e60008282546111b59190614430565b9250508190555085600f60008282546111ce9190614430565b90915550506010805461ff001916905560405160008051602061491b833981519152906111fa9061461d565b60405180910390a15050505050505061146b565b478281116112835787600e60008282546112289190614430565b9250508190555086600f60008282546112419190614430565b909155505060405160008051602061491b8339815191529061126290614654565b60405180910390a150506010805461ff00191690555061146b945050505050565b600061128f848361447c565b905060008661129e8b84614443565b6112a8919061445a565b905060006112b6828461447c565b9050811561144557600760009054906101000a90046001600160a01b03166001600160a01b031663f305d71983308e600080600b60009054906101000a90046001600160a01b03164261025861130c9190614430565b6040518863ffffffff1660e01b815260040161132d9695949392919061468b565b60606040518083038185885af193505050508015611368575060408051601f3d908101601f19168201909252611365918101906146c6565b60015b61141a5761137461448f565b806308c379a0036113be57506113886144e6565b8061139357506113c0565b60008051602061495b833981519152816040516113b09190614207565b60405180910390a150611445565b505b60008051602061495b83398151915260405161140d906020808252601d908201527f556e6b6e6f776e206572726f7220696e206164644c6971756964697479000000604082015260600190565b60405180910390a1611445565b604080518481526020810184905260008051602061493b833981519152910160405180910390a15050505b801561145457611454816135cd565b50506010805461ff00191690555050505050505050505b6001600555565b61147a612e5c565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6114ad612e5c565b60105460ff16156114e55760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610a38565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015611544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156891906146f4565b600a80546001600160a01b0319166001600160a01b03929092169182179055611624576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156115df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160391906146f4565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166116615760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610a38565b600a80546001600160a01b0390811660009081526011602090815260408083208054600160ff19918216811790925595548516845260129092529091208054909316179091556007546116b991309116600019612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926116f192911690600019906004016145b2565b6020604051808303816000875af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173491906145cb565b6117655760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610a38565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261179d92911690600019906004016145b2565b6020604051808303816000875af11580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e091906145cb565b50600a5460405163095ea7b360e01b8152309163095ea7b391611813916001600160a01b031690600019906004016145b2565b6020604051808303816000875af1158015611832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185691906145cb565b50565b606060048054610903906143e0565b611870612e5c565b600082116118905760405162461bcd60e51b8152600401610a3890614711565b600081116118c55760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610a38565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190614604565b10156119595760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a38565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190614604565b10156119f85760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610a38565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611a2c9033903090869060040161472d565b6020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906145cb565b611aa05760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610a38565b600754611ab89030906001600160a01b031684612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611aee9291169085906004016145b2565b6020604051808303816000875af1158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3191906145cb565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611b5f42610258614430565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1925050508015611bf7575060408051601f3d908101601f19168201909252611bf4918101906146c6565b60015b611e7f57611c0361448f565b806308c379a003611d465750611c176144e6565b80611c225750611d48565b600754611c3b9030906001600160a01b03166000612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c72929116906000906004016145b2565b6020604051808303816000875af1158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb591906145cb565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611ce890339086906004016145b2565b6020604051808303816000875af1158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b91906145cb565b508060405162461bcd60e51b8152600401610a389190614207565b505b600754611d619030906001600160a01b03166000612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611d98929116906000906004016145b2565b6020604051808303816000875af1158015611db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ddb91906145cb565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611e0e90339085906004016145b2565b6020604051808303816000875af1158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5191906145cb565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610a38565b5050604080518481526020810184905260008051602061493b83398151915292500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f169190614604565b90508015610dde5760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611f5090339085906004016145b2565b6020604051808303816000875af1158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9391906145cb565b50505050565b611fa1612e5c565b6001600160a01b038116611fdc5760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610a38565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb49101610d0a565b600033610994818585612d48565b61204c612e5c565b6010546201000090046001600160a01b031661207a5760405162461bcd60e51b8152600401610a3890614751565b601054600160b01b900460ff166120a35760405162461bcd60e51b8152600401610a3890614751565b6010546040516324872d5b60e21b8152306004820152620100009091046001600160a01b03169063921cb56c90602401600060405180830381600087803b1580156120ed57600080fd5b505af1158015611f93573d6000803e3d6000fd5b612109612e5c565b60026005540361212b5760405162461bcd60e51b8152600401610a38906145e8565b60026005558061217d5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a38565b306000908152602081905260409020548111156121d35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a38565b601054600160b01b900460ff166121fc5760405162461bcd60e51b8152600401610a3890614751565b47600061220883612eaa565b90508060000361222a5760405162461bcd60e51b8152600401610a389061461d565b4782811161224a5760405162461bcd60e51b8152600401610a3890614654565b60408051858152602081018490527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a1505060016005555050565b612296612e5c565b6001600160a01b0381166122d15760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610a38565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6122fb612e5c565b6001600160a01b0381166123435760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a38565b806001600160a01b0316639c0b7d466040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561239d575060408051601f3d908101601f1916820190925261239a918101906146f4565b60015b6123e25760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c1c9bde1e4818dbdb9d1c9858dd60521b6044820152606401610a38565b6001600160a01b0381161580159061240357506001600160a01b0381163014155b1561245e5760405162461bcd60e51b815260206004820152602560248201527f50726f787920616c72656164792073657420746f20616e6f7468657220636f6e6044820152641d1c9858dd60da1b6064820152608401610a38565b506010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b6124cc612e5c565b6002600554036124ee5760405162461bcd60e51b8152600401610a38906145e8565b6002600555806125105760405162461bcd60e51b8152600401610a3890614711565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa15801561254d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125719190614604565b10156125a45760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610a38565b601054600160b01b900460ff166125cd5760405162461bcd60e51b8152600401610a3890614751565b6007546125e79030906001600160a01b0316600019612c2e565b4760006125f383612eaa565b9050806000036126155760405162461bcd60e51b8152600401610a389061461d565b478281116126355760405162461bcd60e51b8152600401610a3890614654565b6000612641848361447c565b905060006064612652601984614443565b61265c919061445a565b90506000606461266d601985614443565b612677919061445a565b9050811561269f5761269f82606461269060198b614443565b61269a919061445a565b61377a565b80156126ae576126ae816135cd565b505060016005555050505050565b6126c4612e5c565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6126f7612e5c565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127599190614604565b90506000811161277b5760405162461bcd60e51b8152600401610a3890614711565b600034116127b05760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610a38565b6007546127c89030906001600160a01b031683612c2e565b6007546001600160a01b031663f305d719343084600080336127ec42610258614430565b6040518863ffffffff1660e01b815260040161280d9695949392919061468b565b60606040518083038185885af193505050508015612848575060408051601f3d908101601f19168201909252612845918101906146c6565b60015b6128ff5761285461448f565b806308c379a0036128b857506128686144e6565b8061287357506128ba565b60075461288c9030906001600160a01b03166000612c2e565b60405133904780156108fc02916000818181858888f19350505050158015611d2b573d6000803e3d6000fd5b505b6007546128d39030906001600160a01b03166000612c2e565b60405133904780156108fc02916000818181858888f19350505050158015611e51573d6000803e3d6000fd5b50506040805183815234602082015260008051602061493b83398151915292500160405180910390a150565b612933612e5c565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b612966612e5c565b6007546129809030906001600160a01b0316600019612c2e565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926129b892911690600019906004016145b2565b6020604051808303816000875af19250505080156129f3575060408051601f3d908101601f191682019092526129f0918101906145cb565b60015b15612a4957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612a40926001600160a01b03918216929116906000199061472d565b60405180910390a15b600a546001600160a01b031615612be057600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612a9292911690600019906004016145b2565b6020604051808303816000875af1925050508015612acd575060408051601f3d908101601f19168201909252612aca918101906145cb565b60015b15612b235750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612b1a926001600160a01b03918216929116906000199061472d565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612b55916001600160a01b031690600019906004016145b2565b6020604051808303816000875af1925050508015612b90575060408051601f3d908101601f19168201909252612b8d918101906145cb565b60015b15612be05750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91612bd79130916001600160a01b0316906000199061472d565b60405180910390a15b565b612bea612e5c565b6001600160a01b038116612c255760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610a38565b61185681613989565b6001600160a01b03831615801590612c4e57506001600160a01b03821615155b612c7f5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610a38565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612d3b5760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610a38565b611f938484848403612c2e565b6001600160a01b038316612d835760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a38565b6001600160a01b038216612dbe5760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a38565b60008111612df35760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a38565b601054610100900460ff1615612e0e57610dde8383836139db565b6001600160a01b03831660009081526011602052604081205460ff1680612e4d57506001600160a01b03831660009081526011602052604090205460ff165b159050611f9384848484613b3a565b33612e6f6006546001600160a01b031690565b6001600160a01b031614612be05760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610a38565b600081600003612ebc57506000919050565b601054600160b01b900460ff16612ee55760405162461bcd60e51b8152600401610a3890614751565b816802b5e3af16b1880000811115612f0357506802b5e3af16b18800005b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f3857612f3861477d565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb591906146f4565b81600181518110612fc857612fc861477d565b6001600160a01b039283166020918202929092010152600754600091612ff391309116600019612c2e565b600061300142610e10614430565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac9479261304a928a9289928b9262010000909104909116908990600401614793565b600060405180830381600087803b15801561306457600080fd5b505af1925050508015613075575060015b6135b75761308161448f565b806308c379a00361339557506130956144e6565b806130a05750613397565b60008051602061491b833981519152816040516020016130c091906147cf565b60408051601f19818403018152908290526130da91614207565b60405180910390a160075460105460405163082349bf60e31b81526001600160a01b039283169263411a4df892613126928b928a928c9262010000909104909116908a90600401614793565b600060405180830381600087803b15801561314057600080fd5b505af1925050508015613151575060015b61337e5761315d61448f565b806308c379a0036132c357506131716144e6565b8061317c57506132c5565b80511561327257604080518082019091526002815261453560f01b6020918201528151908201207ff3465d5cb5831136b3b4e82db30aaef6a41154c3cba2fd4f528d2b5dde880dc401613272576007546131e39030906001600160a01b0316600019612c2e565b60006131f060028961445a565b905080156132705760008051602061491b8339815191526040516132519060208082526023908201527f4535206572726f722c207265747279696e6720776974682068616c6620616d6f6040820152621d5b9d60ea1b606082015260800190565b60405180910390a161326281612eaa565b9a9950505050505050505050565b505b60008051602061491b833981519152816040516020016132929190614814565b60408051601f19818403018152908290526132ac91614207565b60405180910390a150600098975050505050505050565b505b60006132d260028861445a565b90506000811180156132e45750868114155b1561333c576007546133039030906001600160a01b0316600019612c2e565b60008051602061491b83398151915260405161331e90614859565b60405180910390a161332f81612eaa565b9998505050505050505050565b60008051602061491b8339815191526040516132ac906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b61338982878a613d8e565b98975050505050505050565b505b60008051602061491b8339815191526040516133f8906020808252602b908201527f46697273742073776170206d6574686f64206661696c6564207769746820756e60408201526a35b737bbb71032b93937b960a91b606082015260800190565b60405180910390a160075460105460405163082349bf60e31b81526001600160a01b039283169263411a4df892613444928a9289928b9262010000909104909116908990600401614793565b600060405180830381600087803b15801561345e57600080fd5b505af192505050801561346f575060015b6135b75761347b61448f565b806308c379a0036134ea575061348f6144e6565b8061349a57506134ec565b60008051602061491b833981519152816040516020016134ba9190614814565b60408051601f19818403018152908290526134d491614207565b60405180910390a1506000979650505050505050565b505b60006134f960028761445a565b905060008111801561350b5750858114155b156135565760075461352a9030906001600160a01b0316600019612c2e565b60008051602061491b83398151915260405161354590614859565b60405180910390a161338981612eaa565b60008051602061491b8339815191526040516134d4906020808252602b908201527f416c6c2073776170206d6574686f6473206661696c6564207769746820756e6b60408201526a6e6f776e206572726f727360a81b606082015260800190565b6135c2818689613d8e565b979650505050505050565b600d548015806135db575081155b156135e4575050565b60006135f0828461445a565b9050806000036135ff57505050565b60005b8281101561373b576000600d828154811061361f5761361f61477d565b6000918252602090912001546001600160a01b03169050801580159061364e57506001600160a01b0381163014155b80156136685750600a546001600160a01b03828116911614155b15613728576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146136ba576040519150601f19603f3d011682016040523d82523d6000602084013e6136bf565b606091505b5050905080613726577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161371d90602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b5080613733816148a6565b915050613602565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c217910160405180910390a1505050565b811580613785575080155b1561378e575050565b6007546137a89030906001600160a01b0316600019612c2e565b60006137b560028461445a565b9050806000036137c457505050565b60006137d160028461445a565b9050806000036137e15750505050565b600060646137f084605a614443565b6137fa919061445a565b90506000606461380b84605a614443565b613815919061445a565b9050600061382542610e10614430565b600754600b5460405163f305d71960e01b81529293506001600160a01b039182169263f305d7199289926138699230928b928a928c92909116908a9060040161468b565b60606040518083038185885af1935050505080156138a4575060408051601f3d908101601f191682019092526138a1918101906146c6565b60015b613956576138b061448f565b806308c379a0036138fa57506138c46144e6565b806138cf57506138fc565b60008051602061495b833981519152816040516138ec9190614207565b60405180910390a150610c43565b505b60008051602061495b833981519152604051613949906020808252601d908201527f556e6b6e6f776e206572726f7220696e206164644c6971756964697479000000604082015260600190565b60405180910390a1610c43565b604080518481526020810184905260008051602061493b833981519152910160405180910390a150505050505050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316613a165760405162461bcd60e51b8152602060048201526002602482015261543160f01b6044820152606401610a38565b6001600160a01b038216613a515760405162461bcd60e51b81526020600482015260026024820152612a1960f11b6044820152606401610a38565b60008111613a865760405162461bcd60e51b8152602060048201526002602482015261543360f01b6044820152606401610a38565b6001600160a01b03831660009081526020819052604090205481811015613ad45760405162461bcd60e51b8152602060048201526002602482015261150d60f21b6044820152606401610a38565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f93565b60008180613b555750600a546001600160a01b038581169116145b9050808015613b6c5750601054610100900460ff16155b15613d245760006064613b80600586614443565b613b8a919061445a565b90508015613d225760006064613ba1601984614443565b613bab919061445a565b905060006064613bbc601985614443565b613bc6919061445a565b90506000613bd4848861447c565b9050613be18930866139db565b613bec8989836139db565b82600e6000828254613bfe9190614430565b9250508190555081600f6000828254613c179190614430565b90915550613c50905089678ac7230489e80000613c49826001600160a01b031660009081526020819052604090205490565b1015613fd4565b613c7c88678ac7230489e80000613c498b6001600160a01b031660009081526020819052604090205490565b600a546001600160a01b038981169116148015613ca15750601054610100900460ff16155b8015613cc557506801158e460913d00000600f54600e54613cc29190614430565b10155b15613d1857306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613d0557600080fd5b505af1925050508015613d16575060015b505b5050505050611f93565b505b613d2f8585856139db565b613d5b85678ac7230489e80000613c49886001600160a01b031660009081526020819052604090205490565b613d8784678ac7230489e80000613c49876001600160a01b031660009081526020819052604090205490565b5050505050565b6000601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613de057600080fd5b505af1925050508015613df1575060015b613ed857613dfd61448f565b806308c379a003613e685750613e116144e6565b80613e1c5750613e6a565b60008051602061491b83398151915281604051602001613e3c91906148bf565b60408051601f1981840301815290829052613e5691614207565b60405180910390a160009150506109bf565b505b60008051602061491b833981519152604051613ec89060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b60405180910390a15060006109bf565b476000613ee5868361447c565b90508015613f675760408051868152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a183851015613f5e576000613f3a868661447c565b90506000613f4782612eaa565b9050613f538184614430565b9450505050506109bf565b91506109bf9050565b60008051602061491b833981519152604051613fc19060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a16000925050506109bf565b600a546001600160a01b03838116911614801590613ffb57506001600160a01b0382163014155b15610d135780801561402657506001600160a01b0382166000908152600c602052604090205460ff16155b1561409257506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156140b857506001600160a01b0382166000908152600c602052604090205460ff165b15610d13576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610dde57826001600160a01b0316600d82815481106141055761410561477d565b6000918252602090912001546001600160a01b0316036141d157600d805461412f9060019061447c565b8154811061413f5761413f61477d565b600091825260209091200154600d80546001600160a01b03909216918390811061416b5761416b61477d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806141aa576141aa614904565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806141db816148a6565b9150506140de565b60005b838110156141fe5781810151838201526020016141e6565b50506000910152565b60208152600082518060208401526142268160408501602087016141e3565b601f01601f19169190910160400192915050565b6001600160a01b038116811461185657600080fd5b6000806040838503121561426257600080fd5b823561426d8161423a565b946020939093013593505050565b60008060006060848603121561429057600080fd5b833561429b8161423a565b925060208401356142ab8161423a565b929592945050506040919091013590565b6000602082840312156142ce57600080fd5b5035919050565b6000602082840312156142e757600080fd5b81356109bf8161423a565b600081518084526020808501945080840160005b8381101561432b5781516001600160a01b031687529582019590820190600101614306565b509495945050505050565b6020815260006109bf60208301846142f2565b801515811461185657600080fd5b6000806040838503121561436a57600080fd5b82356143758161423a565b9150602083013561438581614349565b809150509250929050565b600080604083850312156143a357600080fd5b50508035926020909101359150565b600080604083850312156143c557600080fd5b82356143d08161423a565b915060208301356143858161423a565b600181811c908216806143f457607f821691505b60208210810361441457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561099a5761099a61441a565b808202811582820484141761099a5761099a61441a565b60008261447757634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561099a5761099a61441a565b600060033d11156144a85760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156144df57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156144f45790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561452457505050505090565b828501915081518181111561453c5750505050505090565b843d87010160208285010111156145565750505050505090565b614565602082860101876144ab565b509095945050505050565b60208082526022908201527f556e6b6e6f776e206572726f7220696e207472696767657250726f63657373696040820152616e6760f01b606082015260800190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156145dd57600080fd5b81516109bf81614349565b602080825260029082015261523160f01b604082015260600190565b60006020828403121561461657600080fd5b5051919050565b6020808252601c908201527f53776170206661696c65642c206e6f2045544820726563656976656400000000604082015260600190565b60208082526019908201527f4e6f204554482072656365697665642066726f6d207377617000000000000000604082015260600190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806000606084860312156146db57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561470657600080fd5b81516109bf8161423a565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526012908201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006147b260a08301866142f2565b6001600160a01b0394909416606083015250608001529392505050565b7f46697273742073776170206d6574686f64206661696c65643a2000000000000081526000825161480781601a8501602087016141e3565b91909101601a0192915050565b7f416c7465726e61746976652073776170206d6574686f64206661696c65643a2081526000825161484c8160208501602087016141e3565b9190910160200192915050565b6020808252602d908201527f556e6b6e6f776e2073776170206572726f722c207265747279696e672077697460408201526c1a081a185b1988185b5bdd5b9d609a1b606082015260800190565b6000600182016148b8576148b861441a565b5060010190565b7f50726f787920455448207472616e73666572206661696c65643a2000000000008152600082516148f781601b8501602087016141e3565b91909101601b0192915050565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072338f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515ba31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ada26469706673582212208a7d6ca80ed0956a2a7dfe20ffdeb54305d1bcfda00c2585b69731c1b9fe030764736f6c63430008110033

Deployed Bytecode Sourcemap

9972:38248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44663:9;:13;44659:85;;44698:34;;44722:9;160:25:1;;44710:10:0;;44698:34;;148:2:1;133:18;44698:34:0;;;;;;;44659:85;9972:38248;;;;;2958:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37609:118;;;;;;;;;;-1:-1:-1;37696:23:0;;37609:118;;;160:25:1;;;148:2;133:18;37609: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;3252:99:0;;;;;;;;;;-1:-1:-1;3331:12:0;;3252:99;;4023:250;;;;;;;;;;-1:-1:-1;4023:250:0;;;;;:::i;:::-;;:::i;10972:24::-;;;;;;;;;;-1:-1:-1;10972:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10972: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;37908:2580:0;;;;;;;;;;;;;:::i;10796:25::-;;;;;;;;;;-1:-1:-1;10796:25:0;;;;-1:-1:-1;;;;;10796:25:0;;;10863:29;;;;;;;;;;-1:-1:-1;10863:29:0;;;;-1:-1:-1;;;;;10863:29:0;;;12106:26;;;;;;;;;;-1:-1:-1;12106:26:0;;;;-1:-1:-1;;;12106:26:0;;;;;;47298:126;;;;;;;;;;-1:-1:-1;47298:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;47389:27:0;47365:4;47389:27;;;:18;:27;;;;;;;;;47298:126;37375:183;;;;;;;;;;-1:-1:-1;37375:183:0;;;;;:::i;:::-;;:::i;37735:114::-;;;;;;;;;;-1:-1:-1;37820:21:0;;37735:114;;33378:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10698:41::-;;;;;;;;;;-1:-1:-1;10698:41:0;;;;-1:-1:-1;;;;;10698:41:0;;;47158:128;;;;;;;;;;-1:-1:-1;47158:128:0;;;;;:::i;:::-;;:::i;47738:120::-;;;;;;;;;;-1:-1:-1;47738:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;47826:24:0;47802:4;47826:24;;;:15;:24;;;;;;;;;47738:120;12020:24;;;;;;;;;;-1:-1:-1;12020:24:0;;;;;;;-1:-1:-1;;;;;12020:24:0;;;3359:118;;;;;;;;;;-1:-1:-1;3359:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;33268:98;;;;;;;;;;-1:-1:-1;33344:7:0;:14;33268:98;;18077:4986;;;;;;;;;;;;;:::i;46842:162::-;;;;;;;;;;-1:-1:-1;46842:162:0;;;;;:::i;:::-;;:::i;10828:28::-;;;;;;;;;;-1:-1:-1;10828:28:0;;;;-1:-1:-1;;;;;10828:28:0;;;13739:1070;;;;;;;;;;;;;:::i;1946:87::-;;;;;;;;;;-1:-1:-1;2019:6:0;;-1:-1:-1;;;;;2019:6:0;1946:87;;3057:95;;;;;;;;;;;;;:::i;33529:2260::-;;;;;;;;;;-1:-1:-1;33529:2260:0;;;;;:::i;:::-;;:::i;42534:319::-;;;;;;;;;;-1:-1:-1;42534:319:0;;;;;:::i;:::-;;:::i;3485:182::-;;;;;;;;;;-1:-1:-1;3485:182:0;;;;;:::i;:::-;;:::i;47912:305::-;;;;;;;;;;;;;:::i;41528:948::-;;;;;;;;;;-1:-1:-1;41528:948:0;;;;;:::i;:::-;;:::i;47604:122::-;;;;;;;;;;-1:-1:-1;47604:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;47693:25:0;47669:4;47693:25;;;:16;:25;;;;;;;;;47604:122;12051:24;;;;;;;;;;-1:-1:-1;12051:24:0;;;;-1:-1:-1;;;12051:24:0;;;;;;37201:166;;;;;;;;;;-1:-1:-1;37201:166:0;;;;;:::i;:::-;;:::i;44790:888::-;;;;;;;;;;-1:-1:-1;44790:888:0;;;;;:::i;:::-;;:::i;10925:40::-;;;;;;;;;;-1:-1:-1;10925:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42904:1603;;;;;;;;;;-1:-1:-1;42904: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;46698:132;;;;;;;;;;-1:-1:-1;46698:132:0;;;;;:::i;:::-;;:::i;35874:1319::-;;;:::i;47016:130::-;;;;;;;;;;-1:-1:-1;47016:130:0;;;;;:::i;:::-;;:::i;47436:156::-;;;;;;;;;;-1:-1:-1;47436:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;47542:42:0;47518:4;47542:42;;;:33;:42;;;;;;;;;47436:156;40534:958;;;;;;;;;;;;;:::i;2149:165::-;;;;;;;;;;-1:-1:-1;2149:165:0;;;;;:::i;:::-;;:::i;10746:43::-;;;;;;;;;;-1:-1:-1;10746:43:0;;;;-1:-1:-1;;;;;10746: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;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;:::-;4261:4;4254:11;;;4023:250;;;;;;:::o;10972:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10972:24:0;;-1:-1:-1;10972:24:0;:::o;37908:2580::-;1905:13;:11;:13::i;:::-;38001:1:::1;37975:23;;:27;:56;;;;38030:1;38006:21;;:25;37975:56;37967:71;;;::::0;-1:-1:-1;;;37967:71:0;;5737:2:1;37967: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;;37967:71:0::1;;;;;;;;;38057:7;:14:::0;38049:33:::1;;;::::0;-1:-1:-1;;;38049:33:0;;6067:2:1;38049: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;;38049:33:0::1;5865:325:1::0;38049:33:0::1;38306:21;::::0;38280:23:::1;::::0;38180:12:::1;::::0;38153:24:::1;::::0;38280:47:::1;::::0;38306:21;38280:47:::1;:::i;:::-;38251:76;;38462:16;38441:18;:37;38437:2044;;;38526:13;38568:18:::0;38542:23:::1;:16:::0;38561:4:::1;38542:23;:::i;:::-;:44;;;;:::i;:::-;38526:60;;38601:30;38668:4;38660:5;38634:23;;:31;;;;:::i;:::-;:38;;;;:::i;:::-;38601:71;;38687:28;38750:4;38742:5;38718:21;;:29;;;;:::i;:::-;:36;;;;:::i;:::-;38687:67;;38857:22;38830:23;;:49;;;;;;;:::i;:::-;;;;;;;;38919:20;38894:21;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39051:23:0::1;::::0;;39124:21:::1;::::0;;39221:48;;;;39284:44;;;39361:33:::1;::::0;;-1:-1:-1;;;39361:33:0;;;;39051:23;;39124:21;39361:4:::1;::::0;:31:::1;::::0;:33:::1;::::0;;::::1;::::0;39014:34:::1;::::0;39361:33;;;;;;;39014:34;39361:4;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;39357:760;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;39521:6:0::1;39510:18;;;;;;:::i;:::-;;;;;;;;39626:51;39655:22:::0;39626:26;:51:::1;:::i;:::-;39600:23;:77:::0;39720:47:::1;39747:20:::0;39720:24;:47:::1;:::i;:::-;39696:21;:71:::0;-1:-1:-1;39357:760:0::1;;;;;-1:-1:-1::0;;;;;;;;;;;39814:48:0::1;;;;;:::i;:::-;;;;;;;;39960:51;39989:22:::0;39960:26;:51:::1;:::i;:::-;39934:23;:77:::0;40054:47:::1;40081:20:::0;40054:24;:47:::1;:::i;:::-;40030:21;:71:::0;39357:760:::1;38480:1648;;;;;37956:2532;;37908:2580::o:0;38437:2044::-:1;40192:4;-1:-1:-1::0;;;;;40192:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;40188:282;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;40352:6:0::1;40341:18;;;;;;:::i;:::-;;;;;;;;40283:92;37956:2532;;37908:2580::o:0;40188:282::-:1;;;-1:-1:-1::0;;;;;;;;;;;40406:48:0::1;;;;;:::i;:::-;;;;;;;;40188:282;37956:2532;;37908:2580::o:0;37375:183::-;1905:13;:11;:13::i;:::-;37486:4:::1;-1:-1:-1::0;;;;;37468:23:0;::::1;::::0;37460:38:::1;;;::::0;-1:-1:-1;;;37460:38:0;;8933:2:1;37460: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;;37460:38:0::1;8731:325:1::0;37460:38:0::1;37516:6;-1:-1:-1::0;;;;;37509:23:0::1;;37533:7;2019:6:::0;;-1:-1:-1;;;;;2019:6:0;;1946:87;37533:7:::1;37542;37509:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37375:183:::0;;:::o;33378:96::-;33423:16;33459:7;33452:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33452:14:0;;;;;;;;;;;;;;;;;;;;;;33378:96;:::o;47158:128::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;47244:24:0;;;::::1;;::::0;;;:15:::1;:24;::::0;;;;:34;;-1:-1:-1;;47244:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47158:128::o;18077:4986::-;1199:1;1345:7;;:19;1337:34;;;;-1:-1:-1;;;1337:34:0;;;;;;;:::i;:::-;1199:1;1382:7;:18;18157:7:::1;::::0;::::1;::::0;::::1;;;18156:8;18148:23;;;::::0;-1:-1:-1;;;18148:23:0;;10122:2:1;18148: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;;18148:23:0::1;9920:325:1::0;18148:23:0::1;18300:1;18276:21;;18250:23;;:47;;;;:::i;:::-;:51;18242:81;;;::::0;-1:-1:-1;;;18242:81:0;;10452:2:1;18242:81:0::1;::::0;::::1;10434:21:1::0;10491:2;10471:18;;;10464:30;-1:-1:-1;;;10510:18:1;;;10503:47;10567:18;;18242:81:0::1;10250:341:1::0;18242:81:0::1;18344:7;:14:::0;;-1:-1:-1;;18344:14:0::1;;;::::0;;18408:23:::1;::::0;18469:21:::1;::::0;18515:23;;:48;::::1;;;-1:-1:-1::0;18542:21:0;;18515:48:::1;18511:117;;;-1:-1:-1::0;;18580:7:0::1;:15:::0;;-1:-1:-1;;18580:15:0::1;::::0;;18610:7:::1;;18511:117;18725:12;18698:24;18824:37;18845:16:::0;18824:18;:37:::1;:::i;:::-;18796:65;;18995:16;18975:17;:36;18971:694;;;19059:13;19101:17:::0;19075:23:::1;:16:::0;19094:4:::1;19075:23;:::i;:::-;:43;;;;:::i;:::-;19059:59:::0;-1:-1:-1;19183:4:0::1;19154:26;19059:59:::0;19154:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;19133:54:::0;-1:-1:-1;19248:4:0::1;19221:24;19240:5:::0;19221:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;19202:50:::0;-1:-1:-1;19287:37:0::1;19202:50:::0;19287:18;:37:::1;:::i;:::-;19267:57;;19427:18;19400:23;;:45;;;;;;;:::i;:::-;;;;;;;;19485:16;19460:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;18971:694:0::1;::::0;-1:-1:-1;;18971:694:0::1;;19612:1;19586:23;:27:::0;;;19628:21:::1;:25:::0;18971:694:::1;19690:52;::::0;;10770:25:1;;;10826:2;10811:18;;10804:34;;;19690:52:0::1;::::0;10743:18:1;19690:52:0::1;;;;;;;19831:46;::::0;-1:-1:-1;;;19831:46:0;;19846:4:::1;19831:46;::::0;::::1;2292:51:1::0;;;19805:23:0::1;::::0;19831:31:::1;::::0;2265:18:1;;19831:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19805:72;;19910:17;19892:15;:35;19888:385;;;20073:18;20046:23;;:45;;;;;;;:::i;:::-;;;;;;;;20131:16;20106:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20162:7:0::1;:15:::0;;-1:-1:-1;;20162:15:0::1;::::0;;20197:43:::1;::::0;-1:-1:-1;;;;;;;;;;;20197:43:0;::::1;::::0;11240:2:1;11222:21;;;11279:2;11259:18;;;11252:30;11318:31;11313:2;11298:18;;11291:59;11382:2;11367:18;;11038:353;20197:43:0::1;;;;;;;;20255:7;;;;;;;19888:385;20355:16;::::0;20323:69:::1;::::0;20340:4:::1;::::0;-1:-1:-1;;;;;20355:16:0::1;-1:-1:-1::0;;20323:8:0::1;:69::i;:::-;20488:21;20460:25;20610:31;20623:17:::0;20610:12:::1;:31::i;:::-;20588:53;;20666:11;20681:1;20666:16:::0;20662:342:::1;;20805:18;20778:23;;:45;;;;;;;:::i;:::-;;;;;;;;20863:16;20838:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20894:7:0::1;:15:::0;;-1:-1:-1;;20894:15:0::1;::::0;;20929:42:::1;::::0;-1:-1:-1;;;;;;;;;;;20929:42:0;::::1;::::0;::::1;:::i;:::-;;;;;;;;20986:7;;;;;;;;;20662:342;21102:21;21138:39:::0;;::::1;21134:355;;21293:18;21266:23;;:45;;;;;;;:::i;:::-;;;;;;;;21351:16;21326:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;21387:39:0::1;::::0;-1:-1:-1;;;;;;;;;;;21387:39:0;::::1;::::0;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;21441:7:0::1;:15:::0;;-1:-1:-1;;21441:15:0::1;::::0;;-1:-1:-1;21471:7:0::1;::::0;-1:-1:-1;;;;;21471:7:0::1;21134:355;21553:25;21581:38;21602:17:::0;21581:18;:38:::1;:::i;:::-;21553:66:::0;-1:-1:-1;21670:23:0::1;21737:17:::0;21696:38:::1;21716:18:::0;21553:66;21696:38:::1;:::i;:::-;:58;;;;:::i;:::-;21670:84:::0;-1:-1:-1;21765:21:0::1;21789:35;21670:84:::0;21789:17;:35:::1;:::i;:::-;21765:59:::0;-1:-1:-1;21883:19:0;;21879:997:::1;;21923:16;;;;;;;;;-1:-1:-1::0;;;;;21923:16:0::1;-1:-1:-1::0;;;;;21923:32:0::1;;21963:15;22006:4;22030:18;22067:1;22113::::0;22157:14:::1;;;;;;;;;-1:-1:-1::0;;;;;22157:14:0::1;22226:15;22244:3;22226:21;;;;:::i;:::-;21923:361;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;21923:361:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;21923:361:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;21919:946;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;22744:6:0::1;22725:26;;;;;;:::i;:::-;;;;;;;;22667:100;21919:946;;;;;-1:-1:-1::0;;;;;;;;;;;22798:51:0::1;;;;13232:2:1::0;13214:21;;;13271:2;13251:18;;;13244:30;13310:31;13305:2;13290:18;;13283:59;13374:2;13359:18;;13030:353;22798:51:0::1;;;;;;;;21919:946;;;22377:38;::::0;;10770:25:1;;;10826:2;10811:18;;10804:34;;;-1:-1:-1;;;;;;;;;;;22377:38:0;10743:18:1;22377:38:0::1;;;;;;;22285:381;;;21919:946;22937:17:::0;;22933:87:::1;;22971:37;22994:13;22971:22;:37::i;:::-;-1:-1:-1::0;;23040:7:0::1;:15:::0;;-1:-1:-1;;23040:15:0::1;::::0;;-1:-1:-1;;;;;;;;;1411:1:0::1;1155::::0;1423:7;:22;18077:4986::o;46842:162::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;46943:42:0;;;::::1;;::::0;;;:33:::1;:42;::::0;;;;:53;;-1:-1:-1;;46943:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46842:162::o;13739:1070::-;1905:13;:11;:13::i;:::-;13800:12:::1;::::0;::::1;;13799:13;13791:28;;;::::0;-1:-1:-1;;;13791:28:0;;13590:2:1;13791:28:0::1;::::0;::::1;13572:21:1::0;13629:1;13609:18;;;13602:29;-1:-1:-1;;;13647:18:1;;;13640:32;13689:18;;13791:28:0::1;13388:325:1::0;13791:28:0::1;13830:12;:19:::0;;-1:-1:-1;;13830:19:0::1;13845:4;13830:19;::::0;;13921:17:::1;::::0;13962:10:::1;::::0;13921:52:::1;::::0;-1:-1:-1;;;13921:52:0;;13955:4:::1;13921:52;::::0;::::1;13930:34:1::0;-1:-1:-1;;;;;13962:10:0;;::::1;13980:18:1::0;;;13973:43;13921:17:0;::::1;::::0;:25:::1;::::0;13865:18:1;;13921:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13905:13;:68:::0;;-1:-1:-1;;;;;;13905:68:0::1;-1:-1:-1::0;;;;;13905:68:0;;;::::1;::::0;;::::1;::::0;;14039:131:::1;;14103:17;::::0;14147:10:::1;::::0;14103:55:::1;::::0;-1:-1:-1;;;14103:55:0;;14140:4:::1;14103:55;::::0;::::1;13930:34:1::0;-1:-1:-1;;;;;14147:10:0;;::::1;13980:18:1::0;;;13973:43;14103:17:0;::::1;::::0;:28:::1;::::0;13865:18:1;;14103:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14087:13;:71:::0;;-1:-1:-1;;;;;;14087:71:0::1;-1:-1:-1::0;;;;;14087:71:0;;;::::1;::::0;;;::::1;::::0;;14039:131:::1;14198:13;::::0;-1:-1:-1;;;;;14198:13:0::1;14190:42;;;::::0;-1:-1:-1;;;14190:42:0;;14485:2:1;14190:42:0::1;::::0;::::1;14467:21:1::0;14524:1;14504:18;;;14497:29;-1:-1:-1;;;14542:18:1;;;14535:32;14584:18;;14190:42:0::1;14283:325:1::0;14190:42:0::1;14311:13;::::0;;-1:-1:-1;;;;;14311:13:0;;::::1;14292:33;::::0;;;:18:::1;:33;::::0;;;;;;;:40;;14328:4:::1;-1:-1:-1::0;;14292:40:0;;::::1;::::0;::::1;::::0;;;14445:13;;;::::1;14411:48:::0;;:33:::1;:48:::0;;;;;;:55;;;;::::1;;::::0;;;14511:16:::1;::::0;14479:69:::1;::::0;14496:4:::1;::::0;14511:16:::1;-1:-1:-1::0;;14479:8:0::1;:69::i;:::-;14584:10;::::0;14612:16:::1;::::0;14577:72:::1;::::0;-1:-1:-1;;;14577:72:0;;-1:-1:-1;;;;;14584:10:0;;::::1;::::0;14577:26:::1;::::0;:72:::1;::::0;14612:16;::::1;::::0;-1:-1:-1;;14631:17:0;14577:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14569:87;;;::::0;-1:-1:-1;;;14569:87:0;;14815:2:1;14569:87:0::1;::::0;::::1;14797:21:1::0;14854:1;14834:18;;;14827:29;-1:-1:-1;;;14872:18:1;;;14865:32;14914:18;;14569:87:0::1;14613:325:1::0;14569:87:0::1;14674:10;::::0;14694:13:::1;::::0;14667:60:::1;::::0;-1:-1:-1;;;14667:60:0;;-1:-1:-1;;;;;14674:10:0;;::::1;::::0;14667:26:::1;::::0;:60:::1;::::0;14694:13;::::1;::::0;-1:-1:-1;;14709:17:0;14667:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14768:13:0::1;::::0;14738:63:::1;::::0;-1:-1:-1;;;14738:63:0;;14753:4:::1;::::0;14738:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;14768:13:0::1;::::0;-1:-1:-1;;14783:17:0;14738:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13739:1070::o:0;3057:95::-;3104:13;3137:7;3130:14;;;;;:::i;33529:2260::-;1905:13;:11;:13::i;:::-;33662:1:::1;33648:11;:15;33640:30;;;;-1:-1:-1::0;;;33640:30:0::1;;;;;;;:::i;:::-;33703:1;33689:11;:15;33681:30;;;::::0;-1:-1:-1;;;33681:30:0;;15475:2:1;33681:30:0::1;::::0;::::1;15457:21:1::0;15514:1;15494:18;;;15487:29;-1:-1:-1;;;15532:18:1;;;15525:32;15574:18;;33681:30:0::1;15273:325:1::0;33681:30:0::1;33754:46;::::0;-1:-1:-1;;;33754:46:0;;33769:4:::1;33754:46;::::0;::::1;2292:51:1::0;;;33804:11:0;;33754:31:::1;::::0;2265:18:1;;33754:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;33732:113;;;::::0;-1:-1:-1;;;33732:113:0;;15805:2:1;33732:113:0::1;::::0;::::1;15787:21:1::0;15844:1;15824:18;;;15817:29;-1:-1:-1;;;15862:18:1;;;15855:32;15904:18;;33732:113:0::1;15603:325:1::0;33732:113:0::1;33895:10;::::0;33888:40:::1;::::0;-1:-1:-1;;;33888:40:0;;33917:10:::1;33888:40;::::0;::::1;2292:51:1::0;33932:11:0;;-1:-1:-1;;;;;33895:10:0::1;::::0;33888:28:::1;::::0;2265:18:1;;33888:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;33866:107;;;::::0;-1:-1:-1;;;33866:107:0;;16135:2:1;33866:107:0::1;::::0;::::1;16117:21:1::0;16174:1;16154:18;;;16147:29;-1:-1:-1;;;16192:18:1;;;16185:32;16234:18;;33866:107:0::1;15933:325:1::0;33866:107:0::1;34075:10;::::0;34068:71:::1;::::0;-1:-1:-1;;;34068:71:0;;-1:-1:-1;;;;;34075:10:0;;::::1;::::0;34068:31:::1;::::0;:71:::1;::::0;34100:10:::1;::::0;34120:4:::1;::::0;34127:11;;34068:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34046:123;;;::::0;-1:-1:-1;;;34046:123:0;;16845:2:1;34046:123:0::1;::::0;::::1;16827:21:1::0;16884:1;16864:18;;;16857:29;-1:-1:-1;;;16902:18:1;;;16895:32;16944:18;;34046:123:0::1;16643:325:1::0;34046:123:0::1;34248:16;::::0;34216:63:::1;::::0;34233:4:::1;::::0;-1:-1:-1;;;;;34248:16:0::1;34267:11:::0;34216:8:::1;:63::i;:::-;34297:10;::::0;34325:16:::1;::::0;34290:66:::1;::::0;-1:-1:-1;;;34290:66:0;;-1:-1:-1;;;;;34297:10:0;;::::1;::::0;34290:26:::1;::::0;:66:::1;::::0;34325:16;::::1;::::0;34344:11;;34290:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;34381:16:0::1;::::0;34453:10:::1;::::0;-1:-1:-1;;;;;34381:16:0;;::::1;::::0;:29:::1;::::0;34433:4:::1;::::0;34453:10:::1;34478:11:::0;34504;34381:16:::1;::::0;34654:10:::1;34679:21;:15;34697:3;34679:21;:::i;:::-;34381:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;34381:356:0;;;-1:-1:-1;;;;;17388:15:1;;;34381:356:0::1;::::0;::::1;17370:34:1::0;17440:15;;;17420:18;;;17413:43;17472:18;;;17465:34;;;;17515:18;;;17508:34;;;;17558:19;;;17551:35;;;;17602:19;;;17595:35;17667:15;;;17646:19;;;17639:44;17699:19;;;17692:35;;;;17304:19;;34381:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34381:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;34381:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;34377:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;34892:16;::::0;34860:53:::1;::::0;34877:4:::1;::::0;-1:-1:-1;;;;;34892:16:0::1;;34860:8;:53::i;:::-;34935:10;::::0;34963:16:::1;::::0;34928:56:::1;::::0;-1:-1:-1;;;34928:56:0;;-1:-1:-1;;;;;34935:10:0;;::::1;::::0;34928:26:::1;::::0;:56:::1;::::0;34963:16;::::1;::::0;34935:10:::1;::::0;34928:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;35068:10:0::1;::::0;35061:52:::1;::::0;-1:-1:-1;;;35061:52:0;;-1:-1:-1;;;;;35068:10:0;;::::1;::::0;35061:27:::1;::::0;:52:::1;::::0;35089:10:::1;::::0;35101:11;;35061:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35149:6;35142:14;;-1:-1:-1::0;;;35142:14:0::1;;;;;;;;:::i;34377:1147::-;;;35250:16;::::0;35218:53:::1;::::0;35235:4:::1;::::0;-1:-1:-1;;;;;35250:16:0::1;;35218:8;:53::i;:::-;35293:10;::::0;35321:16:::1;::::0;35286:56:::1;::::0;-1:-1:-1;;;35286:56:0;;-1:-1:-1;;;;;35293:10:0;;::::1;::::0;35286:26:::1;::::0;:56:::1;::::0;35321:16;::::1;::::0;35293:10:::1;::::0;35286:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;35426:10:0::1;::::0;35419:52:::1;::::0;-1:-1:-1;;;35419:52:0;;-1:-1:-1;;;;;35426:10:0;;::::1;::::0;35419:27:::1;::::0;:52:::1;::::0;35447:10:::1;::::0;35459:11;;35419:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;35500:12:0::1;::::0;-1:-1:-1;;;35500:12:0;;18227:2:1;35500:12:0::1;::::0;::::1;18209:21:1::0;18266:1;18246:18;;;18239:29;-1:-1:-1;;;18284:18:1;;;18277:32;18326:18;;35500:12:0::1;18025:325:1::0;34377:1147:0::1;-1:-1:-1::0;;34758:40:0::1;::::0;;10770:25:1;;;10826:2;10811:18;;10804:34;;;-1:-1:-1;;;;;;;;;;;34758:40:0;-1:-1:-1;10743:18:1;34758:40:0::1;;;;;;;35627:10;::::0;35620:43:::1;::::0;-1:-1:-1;;;35620:43:0;;35657:4:::1;35620:43;::::0;::::1;2292:51:1::0;35594:23:0::1;::::0;-1:-1:-1;;;;;35627:10:0::1;::::0;35620:28:::1;::::0;2265:18:1;;35620:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35594:69:::0;-1:-1:-1;35678:19:0;;35674:108:::1;;35721:10;::::0;35714:56:::1;::::0;-1:-1:-1;;;35714:56:0;;-1:-1:-1;;;;;35721:10:0;;::::1;::::0;35714:27:::1;::::0;:56:::1;::::0;35742:10:::1;::::0;35754:15;;35714:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33629:2160;33529:2260:::0;;:::o;42534:319::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;42626:31:0;::::1;42618:46;;;::::0;-1:-1:-1;;;42618:46:0;;18557:2:1;42618:46:0::1;::::0;::::1;18539:21:1::0;18596:1;18576:18;;;18569:29;-1:-1:-1;;;18614:18:1;;;18607:32;18656:18;;42618:46:0::1;18355:325:1::0;42618:46:0::1;42707:14;::::0;;-1:-1:-1;;;;;42732:34:0;;::::1;-1:-1:-1::0;;;;;;42732:34:0;::::1;::::0;::::1;::::0;;;42792:53:::1;::::0;;42707:14;;;::::1;13930:34:1::0;;;13995:2;13980:18;;13973:43;;;;42792:53:0::1;::::0;13865:18:1;42792:53:0::1;13718:304:1::0;3485:182:0;3555:4;3588:10;3609:28;3588:10;3626:2;3630:6;3609:9;:28::i;47912:305::-;1905:13;:11;:13::i;:::-;47984:9:::1;::::0;;;::::1;-1:-1:-1::0;;;;;47984:9:0::1;47976:54;;;;-1:-1:-1::0;;;47976:54:0::1;;;;;;;:::i;:::-;48049:12;::::0;-1:-1:-1;;;48049:12:0;::::1;;;48041:43;;;;-1:-1:-1::0;;;48041:43:0::1;;;;;;;:::i;:::-;48166:9;::::0;48155:54:::1;::::0;-1:-1:-1;;;48155:54:0;;48203:4:::1;48155:54;::::0;::::1;2292:51:1::0;48166:9:0;;;::::1;-1:-1:-1::0;;;;;48166:9:0::1;::::0;48155:39:::1;::::0;2265:18:1;;48155:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;41528:948:::0;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;41620:15;41612:57:::2;;;::::0;-1:-1:-1;;;41612:57:0;;19234:2:1;41612:57:0::2;::::0;::::2;19216:21:1::0;19273:2;19253:18;;;19246:30;19312:31;19292:18;;;19285:59;19361:18;;41612:57:0::2;19032:353:1::0;41612:57:0::2;41721:4;3424:7:::0;3451:18;;;;;;;;;;;41688:11:::2;:39;;41680:72;;;::::0;-1:-1:-1;;;41680:72:0;;19592:2:1;41680:72:0::2;::::0;::::2;19574:21:1::0;19631:2;19611:18;;;19604:30;-1:-1:-1;;;19650:18:1;;;19643:50;19710:18;;41680:72:0::2;19390:344:1::0;41680:72:0::2;41771:12;::::0;-1:-1:-1;;;41771:12:0;::::2;;;41763:43;;;;-1:-1:-1::0;;;41763:43:0::2;;;;;;;:::i;:::-;41902:21;41874:25;41991;42004:11:::0;41991:12:::2;:25::i;:::-;41969:47;;42078:11;42093:1;42078:16:::0;42074:87:::2;;42111:38;;-1:-1:-1::0;;;42111:38:0::2;;;;;;;:::i;42074:87::-;42259:21;42295:39:::0;;::::2;42291:107;;42351:35;;-1:-1:-1::0;;;42351:35:0::2;;;;;;;:::i;42291:107::-;42423:45;::::0;;10770:25:1;;;10826:2;10811:18;;10804:34;;;42423:45:0::2;::::0;10743:18:1;42423:45:0::2;;;;;;;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;41528:948:0:o;37201:166::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;37275:21:0;::::1;37267:36;;;::::0;-1:-1:-1;;;37267:36:0;;19941:2:1;37267:36:0::1;::::0;::::1;19923:21:1::0;19980:1;19960:18;;;19953:29;-1:-1:-1;;;19998:18:1;;;19991:32;20040:18;;37267:36:0::1;19739:325:1::0;37267:36:0::1;37314:16;:45:::0;;-1:-1:-1;;;;;;37314:45:0::1;-1:-1:-1::0;;;;;37314:45:0;;;::::1;::::0;;;::::1;::::0;;37201:166::o;44790:888::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;44870:24:0;::::1;44862:52;;;::::0;-1:-1:-1;;;44862:52:0;;20271:2:1;44862:52:0::1;::::0;::::1;20253:21:1::0;20310:2;20290:18;;;20283:30;-1:-1:-1;;;20329:18:1;;;20322:45;20384:18;;44862:52:0::1;20069:339:1::0;44862:52:0::1;45007:10;-1:-1:-1::0;;;;;44996:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;44996:39:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;44996:39:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;44992:521;;45469:32;::::0;-1:-1:-1;;;45469:32:0;;20615:2:1;45469:32:0::1;::::0;::::1;20597:21:1::0;20654:2;20634:18;;;20627:30;-1:-1:-1;;;20673:18:1;;;20666:52;20735:18;;45469:32:0::1;20413:346:1::0;44992:521:0::1;-1:-1:-1::0;;;;;45206:24:0;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;45234:27:0;::::1;45256:4;45234:27;;45206:55;45202:143;;;45282:47;::::0;-1:-1:-1;;;45282:47:0;;20966:2:1;45282:47:0::1;::::0;::::1;20948:21:1::0;21005:2;20985:18;;;20978:30;21044:34;21024:18;;;21017:62;-1:-1:-1;;;21095:18:1;;;21088:35;21140:19;;45282:47:0::1;20764:401:1::0;45202:143:0::1;45036:320;45568:9;:22:::0;;-1:-1:-1;;;;;;;;;45568:22:0;::::1;::::0;;::::1;45601:19:::0;;;;-1:-1:-1;;;;;;45601:19:0;;;;;;;-1:-1:-1;;;45601:19:0::1;::::0;;;45646:24:::1;::::0;::::1;::::0;-1:-1:-1;;45646:24:0::1;44790:888:::0;:::o;42904: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;43011:15;43003:30:::2;;;;-1:-1:-1::0;;;43003:30:0::2;;;;;;;:::i;:::-;43052:46;::::0;-1:-1:-1;;;43052:46:0;;43067:4:::2;43052:46;::::0;::::2;2292:51:1::0;;;43102:11:0;;43052:31:::2;::::0;2265:18:1;;43052:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;43044:76;;;::::0;-1:-1:-1;;;43044:76:0;;15805:2:1;43044:76:0::2;::::0;::::2;15787:21:1::0;15844:1;15824:18;;;15817:29;-1:-1:-1;;;15862:18:1;;;15855:32;15904:18;;43044:76:0::2;15603:325:1::0;43044:76:0::2;43139:12;::::0;-1:-1:-1;;;43139:12:0;::::2;;;43131:43;;;;-1:-1:-1::0;;;43131:43:0::2;;;;;;;:::i;:::-;43257:16;::::0;43225:69:::2;::::0;43242:4:::2;::::0;-1:-1:-1;;;;;43257:16:0::2;-1:-1:-1::0;;43225:8:0::2;:69::i;:::-;43390:21;43362:25;43496;43509:11:::0;43496:12:::2;:25::i;:::-;43474:47;;43546:11;43561:1;43546:16:::0;43542:87:::2;;43579:38;;-1:-1:-1::0;;;43579:38:0::2;;;;;;;:::i;43542:87::-;43727:21;43763:39:::0;;::::2;43759:107;;43819:35;;-1:-1:-1::0;;;43819:35:0::2;;;;;;;:::i;43759:107::-;43930:25;43958:38;43979:17:::0;43958:18;:38:::2;:::i;:::-;43930:66:::0;-1:-1:-1;44047:23:0::2;44109:3;44073:33;10204:2;43930:66:::0;44073:33:::2;:::i;:::-;:39;;;;:::i;:::-;44047:65:::0;-1:-1:-1;44123:21:0::2;44181:3;44147:31;10260:2;44147:17:::0;:31:::2;:::i;:::-;:37;;;;:::i;:::-;44123:61:::0;-1:-1:-1;44243:19:0;;44239:117:::2;;44279:65;44293:15:::0;44340:3:::2;44310:27;10204:2;44310:11:::0;:27:::2;:::i;:::-;:33;;;;:::i;:::-;44279:13;:65::i;:::-;44417:17:::0;;44413:87:::2;;44451:37;44474:13;44451:22;:37::i;:::-;-1:-1:-1::0;;1155:1:0::1;1423:7;:22:::0;-1:-1:-1;;;;;42904:1603:0:o;46698:132::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;46784:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:38;;-1:-1:-1;;46784:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46698:132::o;35874:1319::-;1905:13;:11;:13::i;:::-;35984:46:::1;::::0;-1:-1:-1;;;35984:46:0;;35999:4:::1;35984:46;::::0;::::1;2292:51:1::0;;;35962:19:0::1;::::0;35984:31:::1;::::0;2265:18:1;;35984:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35962:68;;36063:1;36049:11;:15;36041:30;;;;-1:-1:-1::0;;;36041:30:0::1;;;;;;;:::i;:::-;36102:1;36090:9;:13;36082:28;;;::::0;-1:-1:-1;;;36082:28:0;;21372:2:1;36082:28:0::1;::::0;::::1;21354:21:1::0;21411:1;21391:18;;;21384:29;-1:-1:-1;;;21429:18:1;;;21422:32;21471:18;;36082:28:0::1;21170:325:1::0;36082:28:0::1;36189:16;::::0;36157:63:::1;::::0;36174:4:::1;::::0;-1:-1:-1;;;;;36189:16:0::1;36208:11:::0;36157:8:::1;:63::i;:::-;36245:16;::::0;-1:-1:-1;;;;;36245:16:0::1;:32;36285:9;36318:4;36338:11:::0;36245:16:::1;::::0;36486:10:::1;36511:21;:15;36529:3;36511:21;:::i;:::-;36245:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;36245:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;36245:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;36241:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;36722:16;::::0;36690:53:::1;::::0;36707:4:::1;::::0;-1:-1:-1;;;;;36722:16:0::1;;36690:8;:53::i;:::-;36808:51;::::0;36816:10:::1;::::0;36837:21:::1;36808:51:::0;::::1;;;::::0;::::1;::::0;;;36837:21;36816:10;36808:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;36241:945;;;36996:16;::::0;36964:53:::1;::::0;36981:4:::1;::::0;-1:-1:-1;;;;;36996:16:0::1;;36964:8;:53::i;:::-;37082:51;::::0;37090:10:::1;::::0;37111:21:::1;37082:51:::0;::::1;;;::::0;::::1;::::0;;;37111:21;37090:10;37082:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;36241:945;-1:-1:-1::0;;36590:38:0::1;::::0;;10770:25:1;;;36618:9:0::1;10826:2:1::0;10811:18;;10804:34;-1:-1:-1;;;;;;;;;;;36590:38:0;-1:-1:-1;10743:18:1;36590:38:0::1;;;;;;;35951:1242;35874:1319::o:0;47016:130::-;1905:13;:11;:13::i;:::-;-1:-1:-1;;;;;47103:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:35;;-1:-1:-1;;47103:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47016:130::o;40534:958::-;1905:13;:11;:13::i;:::-;40669:16:::1;::::0;40637:69:::1;::::0;40654:4:::1;::::0;-1:-1:-1;;;;;40669:16:0::1;-1:-1:-1::0;;40637:8:0::1;:69::i;:::-;40785:10;::::0;40813:16:::1;::::0;40778:72:::1;::::0;-1:-1:-1;;;40778:72:0;;-1:-1:-1;;;;;40785:10:0;;::::1;::::0;40778:26:::1;::::0;:72:::1;::::0;40813:16;::::1;::::0;-1:-1:-1;;40832:17:0;40778:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40778:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;40778:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;40774:193:::0;::::1;;-1:-1:-1::0;40889:10:0::1;::::0;40909:16:::1;::::0;40871:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;40889:10:0;;::::1;::::0;40909:16;::::1;::::0;-1:-1:-1;;40928:17:0;40871:75:::1;:::i;:::-;;;;;;;;40774:193;41042:13;::::0;-1:-1:-1;;;;;41042:13:0::1;:27:::0;41038:447:::1;;41097:10;::::0;41117:13:::1;::::0;41090:60:::1;::::0;-1:-1:-1;;;41090:60:0;;-1:-1:-1;;;;;41097:10:0;;::::1;::::0;41090:26:::1;::::0;:60:::1;::::0;41117:13;::::1;::::0;-1:-1:-1;;41132:17:0;41090:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;41090:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;41090:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;41086:177:::0;::::1;;-1:-1:-1::0;41193:10:0::1;::::0;41205:13:::1;::::0;41175:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;41193:10:0;;::::1;::::0;41205:13;::::1;::::0;-1:-1:-1;;41220:17:0;41175:63:::1;:::i;:::-;;;;;;;;41086:177;41325:13;::::0;41295:63:::1;::::0;-1:-1:-1;;;41295:63:0;;41310:4:::1;::::0;41295:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;41325:13:0::1;::::0;-1:-1:-1;;41340:17:0;41295:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;41295:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;41295:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;41291:183:::0;::::1;;-1:-1:-1::0;41416:13:0::1;::::0;41383:66:::1;::::0;::::1;::::0;::::1;::::0;41409:4:::1;::::0;-1:-1:-1;;;;;41416:13:0::1;::::0;-1:-1:-1;;41431:17:0;41383:66:::1;:::i;:::-;;;;;;;;41291:183;40534: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;;21702:2:1;2230:37:0::1;::::0;::::1;21684:21:1::0;21741:1;21721:18;;;21714:29;-1:-1:-1;;;21759:18:1;;;21752:32;21801:18;;2230:37:0::1;21500: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;;22032:2:1;5430:59:0;;;22014:21:1;22071:1;22051:18;;;22044:29;-1:-1:-1;;;22089:18:1;;;22082:32;22131:18;;5430:59:0;21830: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;5600:311::-;-1:-1:-1;;;;;3782:18:0;;;5701:24;3782:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5772:26;;;;5764:41;;;;-1:-1:-1;;;5764:41:0;;22362:2:1;5764:41:0;;;22344:21:1;22401:1;22381:18;;;22374:29;-1:-1:-1;;;22419:18:1;;;22412:32;22461:18;;5764:41:0;22160:325:1;5764:41:0;5841:51;5850:5;5857:7;5885:6;5866:16;:25;5841:8;:51::i;45733:680::-;-1:-1:-1;;;;;45865:18:0;;45857:33;;;;-1:-1:-1;;;45857:33:0;;22692:2:1;45857:33:0;;;22674:21:1;22731:1;22711:18;;;22704:29;-1:-1:-1;;;22749:18:1;;;22742:32;22791:18;;45857:33:0;22490:325:1;45857:33:0;-1:-1:-1;;;;;45909:16:0;;45901:31;;;;-1:-1:-1;;;45901:31:0;;23022:2:1;45901:31:0;;;23004:21:1;23061:1;23041:18;;;23034:29;-1:-1:-1;;;23079:18:1;;;23072:32;23121:18;;45901:31:0;22820:325:1;45901:31:0;45960:1;45951:6;:10;45943:25;;;;-1:-1:-1;;;45943:25:0;;23352:2:1;45943:25:0;;;23334:21:1;23391:1;23371:18;;;23364:29;-1:-1:-1;;;23409:18:1;;;23402:32;23451:18;;45943:25:0;23150:325:1;45943:25:0;46041:7;;;;;;;46037:94;;;46065:33;46081:4;46087:2;46091:6;46065:15;:33::i;46037:94::-;-1:-1:-1;;;;;46225:24:0;;46208:12;46225:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;46253:22:0;;;;;;:18;:22;;;;;;;;46225:50;46223:53;46208:68;;46364:41;46379:4;46385:2;46389:6;46397:7;46364:14;:41::i;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;;23682:2:1;2097:36:0;;;23664:21:1;23721:1;23701:18;;;23694:29;-1:-1:-1;;;23739:18:1;;;23732:32;23781:18;;2097:36:0;23480:325:1;23071:5688:0;23131:7;23155:11;23170:1;23155:16;23151:30;;-1:-1:-1;23180:1:0;;23071:5688;-1:-1:-1;23071:5688:0:o;23151:30::-;23200:12;;-1:-1:-1;;;23200:12:0;;;;23192:43;;;;-1:-1:-1;;;23192:43:0;;;;;;;:::i;:::-;23327:11;23370;23353:28;;23349:118;;;-1:-1:-1;23415:11:0;23349:118;23511:16;;;23525:1;23511:16;;;;;;;;23487:21;;23511:16;;;;;;;;;;-1:-1:-1;23511:16:0;23487:40;;23556:4;23538;23543:1;23538:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23538:23:0;;;:7;;;;;;;;;;:23;;;;23582:16;;:23;;;-1:-1:-1;;;23582:23:0;;;;:16;;;;;:21;;:23;;;;;23538:7;;23582:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23572:4;23577:1;23572:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23572:33:0;;;:7;;;;;;;;;:33;24014:16;;23796:20;;23982:69;;23999:4;;24014:16;-1:-1:-1;;23982:8:0;:69::i;:::-;24124:16;24143:22;:15;24161:4;24143:22;:::i;:::-;24409:16;;24566:9;;24409:233;;-1:-1:-1;;;24409:233:0;;24124:41;;-1:-1:-1;24271:21:0;;-1:-1:-1;;;;;24409:16:0;;;;:67;;:233;;24491:14;;24520:12;;24547:4;;24566:9;;;;;;;;24124:41;;24409:233;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24405:4347;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;25010:6:0;24963:54;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24963:54:0;;;;;;;;;;24945:74;;;:::i;:::-;;;;;;;;25095:16;;25271:9;;25095:260;;-1:-1:-1;;;25095:260:0;;-1:-1:-1;;;;;25095:16:0;;;;:70;;:260;;25184:14;;25217:12;;25248:4;;25271:9;;;;;;;;25332:8;;25095:260;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25091:2110;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25641:23;;:27;25637:772;;25822:11;;;;;;;;;;;;-1:-1:-1;;;25822:11:0;;;;;25781:27;;;;;;:53;;25777:613;;25947:16;;25915:69;;25932:4;;-1:-1:-1;;;;;25947:16:0;-1:-1:-1;;25915:8:0;:69::i;:::-;26106:18;26127;26144:1;26127:14;:18;:::i;:::-;26106:39;-1:-1:-1;26176:14:0;;26172:195;;-1:-1:-1;;;;;;;;;;;26228:49:0;;;;25186:2:1;25168:21;;;25225:2;25205:18;;;25198:30;25264:34;25259:2;25244:18;;25237:62;-1:-1:-1;;;25330:2:1;25315:18;;25308:33;25373:3;25358:19;;24984:399;26228:49:0;;;;;;;;26315:24;26328:10;26315:12;:24::i;:::-;26308:31;23071:5688;-1:-1:-1;;;;;;;;;;23071:5688:0:o;26172:195::-;25836:554;25777:613;-1:-1:-1;;;;;;;;;;;26503:9:0;26450:63;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26450:63:0;;;;;;;;;;26432:83;;;:::i;:::-;;;;;;;;-1:-1:-1;26541:1:0;;23071:5688;-1:-1:-1;;;;;;;;23071:5688:0:o;25091:2110::-;;;26670:18;26691;26708:1;26691:14;:18;:::i;:::-;26670:39;;26745:1;26732:10;:14;:46;;;;;26764:14;26750:10;:28;;26732:46;26728:375;;;26883:16;;26851:69;;26868:4;;-1:-1:-1;;;;;26883:16:0;-1:-1:-1;;26851:8:0;:69::i;:::-;-1:-1:-1;;;;;;;;;;;26970:59:0;;;;;:::i;:::-;;;;;;;;27059:24;27072:10;27059:12;:24::i;:::-;27052:31;23071:5688;-1:-1:-1;;;;;;;;;23071:5688:0:o;26728:375::-;-1:-1:-1;;;;;;;;;;;27126:32:0;;;;26471:2:1;26453:21;;;26510:2;26490:18;;;26483:30;-1:-1:-1;;;26544:2:1;26529:18;;26522:48;26602:2;26587:18;;26269:342;25091:2110:0;25448:69;25470:17;25489:14;25505:11;25448:21;:69::i;:::-;25441:76;23071:5688;-1:-1:-1;;;;;;;;23071:5688:0:o;24405:4347::-;;;-1:-1:-1;;;;;;;;;;;27314:57:0;;;;26818:2:1;26800:21;;;26857:2;26837:18;;;26830:30;26896:34;26891:2;26876:18;;26869:62;-1:-1:-1;;;26962:2:1;26947:18;;26940:41;27013:3;26998:19;;26616:407;27314:57:0;;;;;;;;27447:16;;27623:9;;27447:260;;-1:-1:-1;;;27447:260:0;;-1:-1:-1;;;;;27447:16:0;;;;:70;;:260;;27536:14;;27569:12;;27600:4;;27623:9;;;;;;;;27684:8;;27447:260;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27443:1298;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;28018:9:0;27965:63;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27965:63:0;;;;;;;;;;27947:83;;;:::i;:::-;;;;;;;;-1:-1:-1;28056:1:0;;23071:5688;-1:-1:-1;;;;;;;23071:5688:0:o;27443:1298::-;;;28185:18;28206;28223:1;28206:14;:18;:::i;:::-;28185:39;;28260:1;28247:10;:14;:46;;;;;28279:14;28265:10;:28;;28247:46;28243:375;;;28398:16;;28366:69;;28383:4;;-1:-1:-1;;;;;28398:16:0;-1:-1:-1;;28366:8:0;:69::i;:::-;-1:-1:-1;;;;;;;;;;;28485:59:0;;;;;:::i;:::-;;;;;;;;28574:24;28587:10;28574:12;:24::i;28243:375::-;-1:-1:-1;;;;;;;;;;;28641:57:0;;;;27230:2:1;27212:21;;;27269:2;27249:18;;;27242:30;27308:34;27303:2;27288:18;;27281:62;-1:-1:-1;;;27374:2:1;27359:18;;27352:41;27425:3;27410:19;;27028:407;27443:1298:0;27800:69;27822:17;27841:14;27857:11;27800:21;:69::i;:::-;27793:76;23071:5688;-1:-1:-1;;;;;;;23071:5688:0:o;32418:819::-;32509:7;:14;32538:17;;;:32;;-1:-1:-1;32559:11:0;;32538:32;32534:45;;;32572:7;32418:819;:::o;32534:45::-;32599:23;32625:21;32634:12;32625:6;:21;:::i;:::-;32599:47;;32661:15;32680:1;32661:20;32657:33;;32683:7;;32418:819;:::o;32657:33::-;32715:9;32710:454;32734:12;32730:1;:16;32710:454;;;32768:14;32785:7;32793:1;32785:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;32785:10:0;;-1:-1:-1;32814:20:0;;;;;:47;;-1:-1:-1;;;;;;32838:23:0;;32856:4;32838:23;;32814:47;:74;;;;-1:-1:-1;32875:13:0;;-1:-1:-1;;;;;32865:23:0;;;32875:13;;32865:23;;32814:74;32810:343;;;32964:12;32982:6;-1:-1:-1;;;;;32982:11:0;33001:15;32982:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32963:58;;;33045:7;33040:98;;33082:36;;;;;27852:2:1;27834:21;;;27891:2;27871:18;;;27864:30;-1:-1:-1;;;27925:2:1;27910:18;;27903:49;27984:2;27969:18;;27650:343;33082:36:0;;;;;;;;33040:98;32890:263;32810:343;-1:-1:-1;32748:3:0;;;;:::i;:::-;;;;32710:454;;;-1:-1:-1;33189:40:0;;;10770:25:1;;;10826:2;10811:18;;10804:34;;;33189:40:0;;10743:18:1;33189:40:0;;;;;;;32475:762;;32418:819;:::o;30653:1724::-;30739:14;;;:34;;-1:-1:-1;30757:16:0;;30739:34;30735:47;;;30653:1724;;:::o;30735:47::-;30863:16;;30831:69;;30848:4;;-1:-1:-1;;;;;30863:16:0;-1:-1:-1;;30831:8:0;:69::i;:::-;30985:21;31009:13;31021:1;31009:9;:13;:::i;:::-;30985:37;;31037:13;31054:1;31037:18;31033:31;;31057:7;30653:1724;;:::o;31033:31::-;31134:23;31160:15;31174:1;31160:11;:15;:::i;:::-;31134:41;;31190:15;31209:1;31190:20;31186:33;;31212:7;;30653:1724;;:::o;31186:33::-;31296:20;31340:3;31319:18;:13;31335:2;31319:18;:::i;:::-;:24;;;;:::i;:::-;31296:47;-1:-1:-1;31370:22:0;31418:3;31395:20;:15;31413:2;31395:20;:::i;:::-;:26;;;;:::i;:::-;31370:51;-1:-1:-1;31486:16:0;31505:22;:15;31523:4;31505:22;:::i;:::-;31562:16;;31745:14;;31562:267;;-1:-1:-1;;;31562:267:0;;31486:41;;-1:-1:-1;;;;;;31562:16:0;;;;:32;;31602:13;;31562:267;;31639:4;;31659:15;;31689:14;;31718:12;;31745:14;;;;31486:41;;31562:267;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31562:267:0;;;;;;;;-1:-1:-1;;31562:267:0;;;;;;;;;;;;:::i;:::-;;;31558:812;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;32261:6:0;32242:26;;;;;;:::i;:::-;;;;;;;;32188:92;31558:812;;;;;-1:-1:-1;;;;;;;;;;;32307:51:0;;;;13232:2:1;13214:21;;;13271:2;13251:18;;;13244:30;13310:31;13305:2;13290:18;;13283:59;13374:2;13359:18;;13030:353;32307:51:0;;;;;;;;31558:812;;;31918:38;;;10770:25:1;;;10826:2;10811:18;;10804:34;;;-1:-1:-1;;;;;;;;;;;31918:38:0;10743:18:1;31918:38:0;;;;;;;31830:357;;;30724:1653;;;;;30653:1724;;:::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;;22692:2:1;4404:33:0;;;22674:21:1;22731:1;22711:18;;;22704:29;-1:-1:-1;;;22749:18:1;;;22742:32;22791:18;;4404:33:0;22490:325:1;4404:33:0;-1:-1:-1;;;;;4456:16:0;;4448:31;;;;-1:-1:-1;;;4448:31:0;;23022:2:1;4448:31:0;;;23004:21:1;23061:1;23041:18;;;23034:29;-1:-1:-1;;;23079:18:1;;;23072:32;23121:18;;4448:31:0;22820:325:1;4448:31:0;4507:1;4498:6;:10;4490:25;;;;-1:-1:-1;;;4490:25:0;;23352:2:1;4490:25:0;;;23334:21:1;23391:1;23371:18;;;23364:29;-1:-1:-1;;;23409:18:1;;;23402:32;23451:18;;4490:25:0;23150: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;;28936:2:1;4643:36:0;;;28918:21:1;28975:1;28955:18;;;28948:29;-1:-1:-1;;;28993:18:1;;;28986:32;29035:18;;4643:36:0;28734: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;37375:183;14817:2465;15050:18;15071:7;:37;;;-1:-1:-1;15095:13:0;;-1:-1:-1;;;;;15082:26:0;;;15095:13;;15082:26;15071:37;15050:58;;15133:13;:25;;;;-1:-1:-1;15151:7:0;;;;;;;15150:8;15133:25;15129:1857;;;15205:17;15245:3;15225:17;10149:1;15225:6;:17;:::i;:::-;:23;;;;:::i;:::-;15205:43;-1:-1:-1;15281:13:0;;15277:1698;;15375:23;15429:3;15401:25;10204:2;15401:9;:25;:::i;:::-;:31;;;;:::i;:::-;15375:57;-1:-1:-1;15451:21:0;15501:3;15475:23;10260:2;15475:9;:23;:::i;:::-;:29;;;;:::i;:::-;15451:53;-1:-1:-1;15599:22:0;15624:18;15633:9;15624:6;:18;:::i;:::-;15599:43;;15722:49;15738:6;15754:4;15761:9;15722:15;:49::i;:::-;15859:50;15875:6;15883:9;15894:14;15859:15;:50::i;:::-;16024:15;15997:23;;:42;;;;;;;:::i;:::-;;;;;;;;16083:13;16058:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;16179:61:0;;-1:-1:-1;16193:6:0;10322:11;16201:17;16193:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;16201:17;:38;;16179:13;:61::i;:::-;16259:67;16273:9;10322:11;16284:20;16294:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;16259:67;16496:13;;-1:-1:-1;;;;;16483:26:0;;;16496:13;;16483:26;:38;;;;-1:-1:-1;16514:7:0;;;;;;;16513:8;16483:38;:115;;;;;10429:11;16551:21;;16525:23;;:47;;;;:::i;:::-;:73;;16483:115;16479:438;;;16708:4;-1:-1:-1;;;;;16708:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16704:194;;16953:7;;;;;;;15277:1698;15160:1826;15129:1857;17034:42;17050:6;17058:9;17069:6;17034:15;:42::i;:::-;17135:61;17149:6;10322:11;17157:17;17167:6;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;17135:61;17207:67;17221:9;10322:11;17232:20;17242:9;-1:-1:-1;;;;;3451:18:0;3424:7;3451:18;;;;;;;;;;;;3359:118;17207:67;14957:2325;14817:2465;;;;:::o;28837:1490::-;28957:7;29079:9;;;;;;;;;-1:-1:-1;;;;;29079:9:0;-1:-1:-1;;;;;29068:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29064:1256;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;30160:6:0;30112:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;30112:55:0;;;;;;;;;;30094:75;;;:::i;:::-;;;;;;;;30191:1;30184:8;;;;;29064:1256;;;-1:-1:-1;;;;;;;;;;;30231:54:0;;;;29730:2:1;29712:21;;;29769:2;29749:18;;;29742:30;29808:34;29803:2;29788:18;;29781:62;-1:-1:-1;;;29874:2:1;29859:18;;29852:38;29922:3;29907:19;;29528:404;30231:54:0;;;;;;;;-1:-1:-1;30307:1:0;30300:8;;29064:1256;29205:21;29176:26;29263:38;29284:17;29205:21;29263:38;:::i;:::-;29241:60;-1:-1:-1;29334:15:0;;29330:698;;29375:43;;;10770:25:1;;;10826:2;10811:18;;10804:34;;;29375:43:0;;10743:18:1;29375:43:0;;;;;;;29592:11;29575:14;:28;29571:264;;;29628:23;29654:28;29668:14;29654:11;:28;:::i;:::-;29628:54;;29705:21;29729:29;29742:15;29729:12;:29::i;:::-;29705:53;-1:-1:-1;29788:27:0;29705:53;29788:11;:27;:::i;:::-;29781:34;;;;;;;;29571:264;29878:11;-1:-1:-1;29871:18:0;;-1:-1:-1;29871:18:0;29330:698;-1:-1:-1;;;;;;;;;;;29935:50:0;;;;30139:2:1;30121:21;;;30178:2;30158:18;;;30151:30;30217:34;30212:2;30197:18;;30190:62;-1:-1:-1;;;30283:2:1;30268:18;;30261:34;30327:3;30312:19;;29937:400;29935:50:0;;;;;;;;30011:1;30004:8;;;;;;17290:779;17385:13;;-1:-1:-1;;;;;17374:24:0;;;17385:13;;17374:24;;;;:52;;-1:-1:-1;;;;;;17402:24:0;;17421:4;17402:24;;17374:52;17370:692;;;17447:14;:36;;;;-1:-1:-1;;;;;;17466:17:0;;;;;;:8;:17;;;;;;;;17465:18;17447:36;17443:608;;;-1:-1:-1;;;;;;17504:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;17504:24:0;17524:4;17504:24;;;;;;17547:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;17547:21:0;;;;;;37908:2580::o;17443:608::-;17595:14;17594:15;:36;;;;-1:-1:-1;;;;;;17613:17:0;;;;;;:8;:17;;;;;;;;17594:36;17590:461;;;-1:-1:-1;;;;;17651:17:0;;17671:5;17651:17;;;:8;:17;;;;;:25;;-1:-1:-1;;17651:25:0;;;17759:277;17783:7;:14;17779:18;;17759:277;;;17845:7;-1:-1:-1;;;;;17831:21:0;:7;17839:1;17831:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17831:10:0;:21;17827:190;;17894:7;17902:14;;:18;;17919:1;;17902:18;:::i;:::-;17894:27;;;;;;;;:::i;:::-;;;;;;;;;;;17881:7;:10;;-1:-1:-1;;;;;17894:27:0;;;;17889:1;;17881:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;17881:40:0;;;;;-1:-1:-1;;;;;17881:40:0;;;;;;17948:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;17948:13:0;;;;;-1:-1:-1;;;;;;17948:13:0;;;;;;37509:41:::1;37375:183:::0;;:::o;17827:190::-;17799:3;;;;:::i;:::-;;;;17759: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;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;10849:184::-;10919:6;10972:2;10960:9;10951:7;10947:23;10943:32;10940:52;;;10988:1;10985;10978:12;10940:52;-1:-1:-1;11011:16:1;;10849:184;-1:-1:-1;10849:184:1:o;11396:352::-;11598:2;11580:21;;;11637:2;11617:18;;;11610:30;11676;11671:2;11656:18;;11649:58;11739:2;11724:18;;11396:352::o;11753:349::-;11955:2;11937:21;;;11994:2;11974:18;;;11967:30;12033:27;12028:2;12013:18;;12006:55;12093:2;12078:18;;11753:349::o;12107:607::-;-1:-1:-1;;;;;12466:15:1;;;12448:34;;12513:2;12498:18;;12491:34;;;;12556:2;12541:18;;12534:34;;;;12599:2;12584:18;;12577:34;;;;12648:15;;;12642:3;12627:19;;12620:44;12428:3;12680:19;;12673:35;;;;12397:3;12382:19;;12107:607::o;12719:306::-;12807:6;12815;12823;12876:2;12864:9;12855:7;12851:23;12847:32;12844:52;;;12892:1;12889;12882:12;12844:52;12921:9;12915:16;12905:26;;12971:2;12960:9;12956:18;12950:25;12940:35;;13015:2;13004:9;13000:18;12994:25;12984:35;;12719:306;;;;;:::o;14027:251::-;14097:6;14150:2;14138:9;14129:7;14125:23;14121:32;14118:52;;;14166:1;14163;14156:12;14118:52;14198:9;14192:16;14217:31;14242:5;14217:31;:::i;14943:325::-;15145:2;15127:21;;;15184:1;15164:18;;;15157:29;-1:-1:-1;;;15217:2:1;15202:18;;15195:32;15259:2;15244:18;;14943:325::o;16263:375::-;-1:-1:-1;;;;;16521:15:1;;;16503:34;;16573:15;;;;16568:2;16553:18;;16546:43;16620:2;16605:18;;16598:34;;;;16453:2;16438:18;;16263:375::o;18685:342::-;18887:2;18869:21;;;18926:2;18906:18;;;18899:30;-1:-1:-1;;;18960:2:1;18945:18;;18938:48;19018:2;19003:18;;18685:342::o;23810:127::-;23871:10;23866:3;23862:20;23859:1;23852:31;23902:4;23899:1;23892:15;23926:4;23923:1;23916:15;23942:574;24233:6;24222:9;24215:25;24276:6;24271:2;24260:9;24256:18;24249:34;24319:3;24314:2;24303:9;24299:18;24292:31;24196:4;24340:57;24392:3;24381:9;24377:19;24369:6;24340:57;:::i;:::-;-1:-1:-1;;;;;24433:32:1;;;;24428:2;24413:18;;24406:60;-1:-1:-1;24497:3:1;24482:19;24475:35;24332:65;23942:574;-1:-1:-1;;;23942:574:1:o;24521:458::-;24783:28;24778:3;24771:41;24753:3;24841:6;24835:13;24857:75;24925:6;24920:2;24915:3;24911:12;24904:4;24896:6;24892:17;24857:75;:::i;:::-;24952:16;;;;24970:2;24948:25;;24521:458;-1:-1:-1;;24521:458:1:o;25388:462::-;25650:34;25645:3;25638:47;25620:3;25714:6;25708:13;25730:73;25796:6;25791:2;25786:3;25782:12;25777:2;25769:6;25765:15;25730:73;:::i;:::-;25823:16;;;;25841:2;25819:25;;25388:462;-1:-1:-1;;25388:462:1:o;25855:409::-;26057:2;26039:21;;;26096:2;26076:18;;;26069:30;26135:34;26130:2;26115:18;;26108:62;-1:-1:-1;;;26201:2:1;26186:18;;26179:43;26254:3;26239:19;;25855:409::o;27998:135::-;28037:3;28058:17;;;28055:43;;28078:18;;:::i;:::-;-1:-1:-1;28125:1:1;28114:13;;27998:135::o;29064:459::-;29326:29;29321:3;29314:42;29296:3;29385:6;29379:13;29401:75;29469:6;29464:2;29459:3;29455:12;29448:4;29440:6;29436:17;29401:75;:::i;:::-;29496:16;;;;29514:2;29492:25;;29064:459;-1:-1:-1;;29064:459:1:o;30342:127::-;30403:10;30398:3;30394:20;30391:1;30384:31;30434:4;30431:1;30424:15;30458:4;30455:1;30448:15

Swarm Source

ipfs://8a7d6ca80ed0956a2a7dfe20ffdeb54305d1bcfda00c2585b69731c1b9fe0307

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.