S Price: $0.544081 (-8.86%)

Contract

0x8cF4Ae149C3724fB43422F48A45038aFB01A74b3

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
Add Initial Liqu...114771252025-03-03 21:05:0020 hrs ago1741035900IN
0x8cF4Ae14...FB01A74b3
0.05 S0.0117635155
Approve114759082025-03-03 20:57:1921 hrs ago1741035439IN
0x8cF4Ae14...FB01A74b3
0 S0.002727756
Transfer114756862025-03-03 20:55:5121 hrs ago1741035351IN
0x8cF4Ae14...FB01A74b3
1 S0.0012791157.86
Approve Treasury...114756172025-03-03 20:55:2421 hrs ago1741035324IN
0x8cF4Ae14...FB01A74b3
0 S0.0031639355
Add Initial Liqu...114755452025-03-03 20:54:5821 hrs ago1741035298IN
0x8cF4Ae14...FB01A74b3
50 S0.0151981555
Initialize114754242025-03-03 20:54:1721 hrs ago1741035257IN
0x8cF4Ae14...FB01A74b3
0 S0.1294028455

Latest 3 internal transactions

Parent Transaction Hash Block From To
114771252025-03-03 21:05:0020 hrs ago1741035900
0x8cF4Ae14...FB01A74b3
1 S
114771252025-03-03 21:05:0020 hrs ago1741035900
0x8cF4Ae14...FB01A74b3
0.05 S
114755452025-03-03 20:54:5821 hrs ago1741035298
0x8cF4Ae14...FB01A74b3
50 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-03
*/

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

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

// 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) && to != address(0), "E1");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "E2");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

// 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 = 100 * 10**18; // 100 tokens minimum for processing
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity
    uint256 private constant MAX_SLIPPAGE = 30; // 30% slippage tolerance
    uint256 private constant TREASURY_PERCENTAGE = 25; // 25% of Sonic tokens to treasury
    uint256 private constant HOLDERS_PERCENTAGE = 75; // 75% of Sonic tokens to holders

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;
    bool public treasuryApproved; // Treasury wallet'ın onay durumu

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

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event TreasuryTransfer(uint256 amount);
    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 TreasuryApprovalGranted(address treasury);
    event AutoTransferFromTreasury(uint256 amount);

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

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

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

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

        _mint(address(this), TOTAL_SUPPLY);
    }

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Vergi işleme mantığı
        if (
            !_inSwap && 
            from != owner() && 
            to != owner() && 
            from != address(this) && 
            to == liquidityPair
        ) {
            // 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(from, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(from, to, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Eğer yeterli miktarda token biriktiysek işlemi başlat
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    try this.processLiquidityAndAirdrop() {} catch {}
                }
                
                // Holder durumunu güncelle
                _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
                _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(from, to, amount);
        
        // Holder durumunu güncelle
        _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
        _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
    }

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

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Reset pending amounts
        _pendingLiquidityTokens = 0;
        _pendingAirdropTokens = 0;
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max);
        
        // Process swap
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        uint256 sonicReceived = _processSwap(totalTokensToSwap);
        
        if (sonicReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontrol et: Eğer Sonic token kontrata değil treasury'ye gönderildiyse
        uint256 sonicBalance = IERC20(sonicToken).balanceOf(address(this));
        if (sonicBalance < sonicReceived) {
            // Treasury'den otomatik transfer dene (eğer onay verilmişse)
            if (treasuryApproved) {
                uint256 sonicInTreasury = IERC20(sonicToken).balanceOf(treasuryWallet);
                if (sonicInTreasury > 0) {
                    try IERC20(sonicToken).transferFrom(treasuryWallet, address(this), sonicInTreasury) {
                        emit AutoTransferFromTreasury(sonicInTreasury);
                        sonicBalance = IERC20(sonicToken).balanceOf(address(this));
                        sonicReceived = sonicInTreasury;
                    } catch {
                        emit SwapFailed("ATF");
                        _inSwap = false;
                        return;
                    }
                }
            } else {
                emit SwapFailed("TNA");
                _inSwap = false;
                return;
            }
        }
        
        // Calculate amounts
        uint256 sonicForLiquidity = sonicReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 sonicForAirdrop = sonicReceived - sonicForLiquidity;
        
        // Process liquidity
        if (sonicForLiquidity > 0) {
            _processLiquidity(tokensForLiquidity, sonicForLiquidity);
        }
        
        // Process airdrop
        if (sonicForAirdrop > 0) {
            uint256 sonicForTreasury = sonicForAirdrop * TREASURY_PERCENTAGE / 100;
            uint256 sonicForHolders = sonicForAirdrop - sonicForTreasury;
            
            _processTreasuryTransfer(sonicForTreasury);
            _processAirdrop(sonicForHolders);
        }
        
        _inSwap = false;
    }

    function _processSwap(uint256 tokensToSwap) private returns (uint256) {
        if (tokensToSwap == 0) return 0;

        _approve(address(this), address(metropolisRouter), tokensToSwap);

        // Swap için path oluştur
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = sonicToken; // Bu aslında WETH (WSonic)

        uint256 sonicBefore = IERC20(sonicToken).balanceOf(address(this));

        try metropolisRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this), // Kontrata gönder
            block.timestamp + 300
        ) {
            uint256 sonicAfter = IERC20(sonicToken).balanceOf(address(this));
            uint256 sonicReceived = sonicAfter - sonicBefore;
            emit SwapSuccessful(tokensToSwap, sonicReceived);
            return sonicReceived;
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("E");
            return 0;
        }
    }

    function _processLiquidity(uint256 tokensForLiquidity, uint256 sonicForLiquidity) private {
        if (tokensForLiquidity == 0 || sonicForLiquidity == 0) {
            return;
        }

        // Approve Sonic token for router
        IERC20(sonicToken).approve(address(metropolisRouter), sonicForLiquidity);
        // Approve this token for router
        _approve(address(this), address(metropolisRouter), tokensForLiquidity);

        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokensForLiquidity,
            sonicForLiquidity,
            tokensForLiquidity * (100 - MAX_SLIPPAGE) / 100,
            sonicForLiquidity * (100 - MAX_SLIPPAGE) / 100,
            address(this),
            block.timestamp + 300
        ) {
            emit LiquidityAdded(tokensForLiquidity, sonicForLiquidity);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("E");
        }
    }

    function _processTreasuryTransfer(uint256 sonicAmount) private {
        if (sonicAmount == 0 || treasuryWallet == address(0)) return;
        
        try IERC20(sonicToken).transfer(treasuryWallet, sonicAmount) {
            emit TreasuryTransfer(sonicAmount);
        } catch {
            emit AirdropFailed("TTF");
        }
    }

    function _processAirdrop(uint256 sonicAmount) private {
        if (sonicAmount == 0 || holders.length == 0) {
            return;
        }

        uint256 sonicPerHolder = sonicAmount / holders.length;
        
        for (uint256 i = 0; i < holders.length; i++) {
            if (holders[i] != address(0) && holders[i] != address(this) && holders[i] != liquidityPair) {
                try IERC20(sonicToken).transfer(holders[i], sonicPerHolder) {
                    // Transfer başarılı
                } catch Error(string memory reason) {
                    emit AirdropFailed(reason);
                } catch {
                    emit AirdropFailed("E");
                }
            }
        }
    }

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

    // Initial liquidity function (must be called by owner with ETH)
    function addInitialLiquidity(uint256 tokenAmount) external payable onlyOwner {
        require(msg.value > 0, "NE");
        require(tokenAmount > 0, "NT");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );

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

        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0,
            0,
            msg.sender,
            block.timestamp
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            revert("FL");
        }

        uint256 remainingETH = address(this).balance;
        if (remainingETH > 0) {
            payable(msg.sender).transfer(remainingETH);
        }
    }

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

    // Manual trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        try this.processLiquidityAndAirdrop() {
            // Process successful
        } catch {
            emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
        }
    }

    // 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 {}
        }
    }

    // Treasury wallet'ın kontrata Sonic token transferi için onay vermesi
    function approveTreasuryToContract() external {
        require(msg.sender == treasuryWallet, "OT");
        require(sonicToken != address(0), "NS");
        
        // Treasury wallet'ın kontrata Sonic token transferi için onay vermesi
        try IERC20(sonicToken).approve(address(this), type(uint256).max) {
            treasuryApproved = true;
            emit TreasuryApprovalGranted(treasuryWallet);
        } catch Error(string memory reason) {
            revert(string(abi.encodePacked("AF: ", reason)));
        } catch {
            revert("AF");
        }
    }

    // Set treasury wallet (only owner)
    function setTreasuryWallet(address _treasuryWallet) external onlyOwner {
        require(_treasuryWallet != address(0), "IT");
        address oldTreasury = treasuryWallet;
        treasuryWallet = _treasuryWallet;
        treasuryApproved = false; // Yeni treasury wallet için onay durumunu sıfırla
        emit TreasuryWalletUpdated(oldTreasury, _treasuryWallet);
    }

    // Treasury'den kontrata Sonic token transferi (acil durumlar için)
    function transferSonicFromTreasury(uint256 amount) external onlyOwner {
        require(treasuryWallet != address(0), "NT");
        require(amount > 0, "NA");
        
        // Onay verildikten sonra transferi gerçekleştir
        try IERC20(sonicToken).transferFrom(treasuryWallet, address(this), amount) {
            emit TreasuryTransfer(amount);
        } catch Error(string memory reason) {
            revert(string(abi.encodePacked("TF: ", reason)));
        } catch {
            revert("TF");
        }
    }

    // Manuel olarak swap işlemini gerçekleştir (acil durumlar için)
    function manualSwap(uint256 amount) external onlyOwner {
        require(amount > 0, "NA");
        require(IERC20(address(this)).balanceOf(address(this)) >= amount, "IB");
        
        uint256 sonicReceived = _processSwap(amount);
        
        if (sonicReceived > 0) {
            emit SwapSuccessful(amount, sonicReceived);
        }
    }

    // Manuel olarak likidite ve airdrop işlemlerini gerçekleştir (acil durumlar için)
    function manualLiquidityAndAirdrop(uint256 farmerAmount, uint256 sonicAmount) external onlyOwner {
        require(farmerAmount > 0 && sonicAmount > 0, "NA");
        require(IERC20(address(this)).balanceOf(address(this)) >= farmerAmount, "IF");
        require(IERC20(sonicToken).balanceOf(address(this)) >= sonicAmount, "IS");
        
        // Likidite ve airdrop için Sonic token miktarlarını hesapla
        uint256 sonicForLiquidity = sonicAmount * LIQUIDITY_TAX / (LIQUIDITY_TAX + AIRDROP_TAX);
        uint256 sonicForAirdrop = sonicAmount - sonicForLiquidity;
        
        // Likidite ve airdrop için FARMER token miktarlarını hesapla
        uint256 farmerForLiquidity = farmerAmount * LIQUIDITY_TAX / (LIQUIDITY_TAX + AIRDROP_TAX);
        
        // Likidite ekle
        if (farmerForLiquidity > 0 && sonicForLiquidity > 0) {
            _processLiquidity(farmerForLiquidity, sonicForLiquidity);
        }
        
        // Airdrop işlemini gerçekleştir
        if (sonicForAirdrop > 0) {
            uint256 sonicForTreasury = sonicForAirdrop * TREASURY_PERCENTAGE / 100;
            uint256 sonicForHolders = sonicForAirdrop - sonicForTreasury;
            
            _processTreasuryTransfer(sonicForTreasury);
            _processAirdrop(sonicForHolders);
        }
    }

    receive() external payable {}
}

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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AutoTransferFromTreasury","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":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":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":"treasury","type":"address"}],"name":"TreasuryApprovalGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryTransfer","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"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"addInitialLiquidity","outputs":[],"stateMutability":"payable","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":[],"name":"approveTreasuryToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"","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":"farmerAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferSonicFromTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b61342180620004186000396000f3fe6080604052600436106102085760003560e01c80637ac84fc111610118578063a9059cbb116100a0578063d4d7b19a1161006f578063d4d7b19a146105b6578063dd62ed3e146105e6578063ed9cacfe1461062c578063f2fde38b14610641578063fd7c9fab1461066157600080fd5b8063a9059cbb14610535578063b03b06b314610555578063b70143c914610576578063c0d786551461059657600080fd5b80638da5cb5b116100e75780638da5cb5b146104a25780638e7c3ec5146104c05780638f7f0e64146104e057806395d89b4114610500578063a8602fea1461051557600080fd5b80637ac84fc1146104435780637ff793d314610458578063808a54571461046d5780638129fc1c1461048d57600080fd5b806341a22cc21161019b5780635d76b04c1161016a5780635d76b04c146103a15780635fe8e7cc146103b657806362b6327a146103d857806370a08231146103f85780637136982b1461042e57600080fd5b806341a22cc21461032e578063461a3a95146103415780634626402b14610361578063573761981461038157600080fd5b806323b872dd116101d757806323b872dd146102a35780632a11ced0146102c3578063313ce567146102fb578063397883d21461031757600080fd5b806306fdde031461021457806308dee2b41461023f578063095ea7b31461025e57806318160ddd1461028e57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b50610229610681565b6040516102369190612ed1565b60405180910390f35b34801561024b57600080fd5b50600e545b604051908152602001610236565b34801561026a57600080fd5b5061027e610279366004612f19565b610713565b6040519015158152602001610236565b34801561029a57600080fd5b50600254610250565b3480156102af57600080fd5b5061027e6102be366004612f45565b61072d565b3480156102cf57600080fd5b506102e36102de366004612f86565b610751565b6040516001600160a01b039091168152602001610236565b34801561030757600080fd5b5060405160128152602001610236565b34801561032357600080fd5b5061032c61077b565b005b61032c61033c366004612f86565b610899565b34801561034d57600080fd5b506009546102e3906001600160a01b031681565b34801561036d57600080fd5b50600b546102e3906001600160a01b031681565b34801561038d57600080fd5b5061032c61039c366004612f19565b610aff565b3480156103ad57600080fd5b50600f54610250565b3480156103c257600080fd5b506103cb610bc6565b6040516102369190612fe3565b3480156103e457600080fd5b506007546102e3906001600160a01b031681565b34801561040457600080fd5b50610250610413366004612ffd565b6001600160a01b031660009081526020819052604090205490565b34801561043a57600080fd5b50600d54610250565b34801561044f57600080fd5b5061032c610c27565b34801561046457600080fd5b5061032c61114a565b34801561047957600080fd5b50600a546102e3906001600160a01b031681565b34801561049957600080fd5b5061032c611316565b3480156104ae57600080fd5b506006546001600160a01b03166102e3565b3480156104cc57600080fd5b5061032c6104db36600461301a565b61168c565b3480156104ec57600080fd5b5061032c6104fb366004612f86565b6118b3565b34801561050c57600080fd5b50610229611a2e565b34801561052157600080fd5b5061032c610530366004612ffd565b611a3d565b34801561054157600080fd5b5061027e610550366004612f19565b611ae2565b34801561056157600080fd5b50600b5461027e90600160a01b900460ff1681565b34801561058257600080fd5b5061032c610591366004612f86565b611af0565b3480156105a257600080fd5b5061032c6105b1366004612ffd565b611bf5565b3480156105c257600080fd5b5061027e6105d1366004612ffd565b600c6020526000908152604090205460ff1681565b3480156105f257600080fd5b5061025061060136600461303c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561063857600080fd5b5061032c611c5a565b34801561064d57600080fd5b5061032c61065c366004612ffd565b611ed3565b34801561066d57600080fd5b506008546102e3906001600160a01b031681565b60606003805461069090613075565b80601f01602080910402602001604051908101604052809291908181526020018280546106bc90613075565b80156107095780601f106106de57610100808354040283529160200191610709565b820191906000526020600020905b8154815290600101906020018083116106ec57829003601f168201915b5050505050905090565b600033610721818585611f1f565b60019150505b92915050565b60003361073b858285611fd1565b61074685858561203f565b506001949350505050565b600d818154811061076157600080fd5b6000918252602090912001546001600160a01b0316905081565b61078361228e565b6000600e54118061079657506000600f54115b6107cc5760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108005760405162461bcd60e51b815260206004820152600260248201526109c960f31b60448201526064016107c3565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561083b57600080fd5b505af192505050801561084c575060015b610897577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f5460405161088e929190918252602082015260400190565b60405180910390a15b565b6108a161228e565b600034116108d65760405162461bcd60e51b81526020600482015260026024820152614e4560f01b60448201526064016107c3565b6000811161090b5760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016107c3565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c91906130af565b101561099f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b60448201526064016107c3565b6007546109b79030906001600160a01b031683611f1f565b60075460405163f305d71960e01b81523060048201526024810183905260006044820181905260648201523360848201524260a48201526001600160a01b039091169063f305d71990349060c40160606040518083038185885af193505050508015610a40575060408051601f3d908101601f19168201909252610a3d918101906130c8565b60015b610a8a57600754610a5d9030906001600160a01b03166000611f1f565b60405162461bcd60e51b8152602060048201526002602482015261119360f21b60448201526064016107c3565b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a1478015610afb57604051339082156108fc029083906000818181858888f19350505050158015610af9573d6000803e3d6000fd5b505b5050565b610b0761228e565b306001600160a01b03831603610b445760405162461bcd60e51b815260206004820152600260248201526121a360f11b60448201526064016107c3565b816001600160a01b031663a9059cbb610b656006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610b839291906130f6565b6020604051808303816000875af1158015610ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af9919061310f565b6060600d80548060200260200160405190810160405280929190818152602001828054801561070957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c00575050505050905090565b600260055403610c5e5760405162461bcd60e51b8152602060048201526002602482015261523160f01b60448201526064016107c3565b6002600555601054610100900460ff1615610ca05760405162461bcd60e51b8152602060048201526002602482015261041560f41b60448201526064016107c3565b6010805461ff001916610100179055600e54600f5481158015610cc1575080155b15610cd85750506010805461ff0019169055611143565b60408051838152602081018390527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16000600e819055600f55600754610d359030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610d6d92911690600019906004016130f6565b6020604051808303816000875af1158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db0919061310f565b506000610dbd8284613147565b90506000610dca826122dc565b905080600003610de95750506010805461ff0019169055506111439050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906130af565b9050818110156110b557600b54600160a01b900460ff161561106457600954600b546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee791906130af565b9050801561105e57600954600b546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610f27929116903090869060040161315a565b6020604051808303816000875af1925050508015610f62575060408051601f3d908101601f19168201909252610f5f9181019061310f565b60015b610fb8576000805160206133cc833981519152604051610f999060208082526003908201526220aa2360e91b604082015260600190565b60405180910390a150506010805461ff00191690555061114392505050565b506040518181527fc6359f75dd26788a9c37bd02903f193da3f5c417c0742f245600976783acb3d19060200160405180910390a16009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105891906130af565b91508092505b506110b5565b6000805160206133cc83398151915260405161109790602080825260039082015262544e4160e81b604082015260600190565b60405180910390a150506010805461ff001916905550611143915050565b6000836110c2878561317e565b6110cc9190613195565b905060006110da82856131b7565b905081156110ec576110ec87836125a4565b8015611130576000606461110160198461317e565b61110b9190613195565b9050600061111982846131b7565b90506111248261281d565b61112d816128f5565b50505b50506010805461ff001916905550505050505b6001600555565b600b546001600160a01b031633146111895760405162461bcd60e51b815260206004820152600260248201526113d560f21b60448201526064016107c3565b6009546001600160a01b03166111c65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b60448201526064016107c3565b60095460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906111fa903090600019906004016130f6565b6020604051808303816000875af1925050508015611235575060408051601f3d908101601f191682019092526112329181019061310f565b60015b6112c6576112416131ca565b806308c379a0036112975750611255613221565b806112605750611299565b8060405160200161127191906132ab565b60408051601f198184030181529082905262461bcd60e51b82526107c391600401612ed1565b505b60405162461bcd60e51b815260206004820152600260248201526120a360f11b60448201526064016107c3565b50600b8054600160a01b60ff60a01b198216179091556040516001600160a01b0390911681527f61f455c025be680134d6c3dfee8a7bedc6d3eb445cd61c5210f4b7f83609742f9060200161088e565b61131e61228e565b60105460ff16156113565760405162461bcd60e51b8152602060048201526002602482015261231960f11b60448201526064016107c3565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa1580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906132d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611495576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147491906132d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114d25760405162461bcd60e51b8152602060048201526002602482015261463360f01b60448201526064016107c3565b6007546114ec9030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261152492911690600019906004016130f6565b6020604051808303816000875af1158015611543573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611567919061310f565b6115985760405162461bcd60e51b8152602060048201526002602482015261118d60f21b60448201526064016107c3565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115d092911690600019906004016130f6565b6020604051808303816000875af11580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611613919061310f565b50600a5460405163095ea7b360e01b8152309163095ea7b391611646916001600160a01b031690600019906004016130f6565b6020604051808303816000875af1158015611665573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611689919061310f565b50565b61169461228e565b6000821180156116a45750600081115b6116c05760405162461bcd60e51b81526004016107c3906132f4565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172191906130af565b10156117545760405162461bcd60e51b815260206004820152600260248201526124a360f11b60448201526064016107c3565b6009546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c091906130af565b10156117f35760405162461bcd60e51b8152602060048201526002602482015261495360f01b60448201526064016107c3565b6000611800601980613147565b61180b60198461317e565b6118159190613195565b9050600061182382846131b7565b90506000611832601980613147565b61183d60198761317e565b6118479190613195565b90506000811180156118595750600083115b156118685761186881846125a4565b81156118ac576000606461187d60198561317e565b6118879190613195565b9050600061189582856131b7565b90506118a08261281d565b6118a9816128f5565b50505b5050505050565b6118bb61228e565b600b546001600160a01b03166118f85760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016107c3565b600081116119185760405162461bcd60e51b81526004016107c3906132f4565b600954600b546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611950929116903090869060040161315a565b6020604051808303816000875af192505050801561198b575060408051601f3d908101601f191682019092526119889181019061310f565b60015b6119f6576119976131ca565b806308c379a0036119c757506119ab613221565b806119b657506119c9565b806040516020016112719190613310565b505b60405162461bcd60e51b81526020600482015260026024820152612a2360f11b60448201526064016107c3565b506040518181527f81f40cfa7691027044b117aa50764b33eaa2223ca9f761d5ff1c316a33d65ad2906020015b60405180910390a150565b60606004805461069090613075565b611a4561228e565b6001600160a01b038116611a805760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016107c3565b600b80546001600160a01b038381166001600160a81b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb491015b60405180910390a15050565b60003361072181858561203f565b611af861228e565b60008111611b185760405162461bcd60e51b81526004016107c3906132f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7991906130af565b1015611bac5760405162461bcd60e51b815260206004820152600260248201526124a160f11b60448201526064016107c3565b6000611bb7826122dc565b90508015610afb5760408051838152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc019101611ad6565b611bfd61228e565b6001600160a01b038116611c385760405162461bcd60e51b815260206004820152600260248201526124a960f11b60448201526064016107c3565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611c6261228e565b600754611c7c9030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611cb492911690600019906004016130f6565b6020604051808303816000875af1925050508015611cef575060408051601f3d908101601f19168201909252611cec9181019061310f565b60015b15611d4557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92611d3c926001600160a01b03918216929116906000199061315a565b60405180910390a15b600a546001600160a01b03161561089757600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611d8e92911690600019906004016130f6565b6020604051808303816000875af1925050508015611dc9575060408051601f3d908101601f19168201909252611dc69181019061310f565b60015b15611e1f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92611e16926001600160a01b03918216929116906000199061315a565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391611e51916001600160a01b031690600019906004016130f6565b6020604051808303816000875af1925050508015611e8c575060408051601f3d908101601f19168201909252611e899181019061310f565b60015b156108975750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9161088e9130916001600160a01b0316906000199061315a565b611edb61228e565b6001600160a01b038116611f165760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064016107c3565b61168981612b36565b6001600160a01b03831615801590611f3f57506001600160a01b03821615155b611f705760405162461bcd60e51b8152602060048201526002602482015261114d60f21b60448201526064016107c3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220548181101561202c5760405162461bcd60e51b8152602060048201526002602482015261453560f01b60448201526064016107c3565b6120398484848403611f1f565b50505050565b601054610100900460ff1615801561206557506006546001600160a01b03848116911614155b801561207f57506006546001600160a01b03838116911614155b801561209457506001600160a01b0383163014155b80156120ad5750600a546001600160a01b038381169116145b1561222b57600060646120c160058461317e565b6120cb9190613195565b9050801561222957600060646120e260198461317e565b6120ec9190613195565b9050600060646120fd60198561317e565b6121079190613195565b9050600061211584866131b7565b9050612122873086612b88565b61212d878783612b88565b82600e600082825461213f9190613147565b9250508190555081600f60008282546121589190613147565b9091555050600f54600e5468056bc75e2d631000009161217791613147565b106121ca57306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156121b757600080fd5b505af19250505080156121c8575060015b505b6121fd87678ac7230489e800006121f68a6001600160a01b031660009081526020819052604090205490565b1015612c9e565b6118a986678ac7230489e800006121f6896001600160a01b031660009081526020819052604090205490565b505b612236838383612b88565b61226283678ac7230489e800006121f6866001600160a01b031660009081526020819052604090205490565b610af982678ac7230489e800006121f6856001600160a01b031660009081526020819052604090205490565b336122a16006546001600160a01b031690565b6001600160a01b0316146108975760405162461bcd60e51b8152602060048201526002602482015261279960f11b60448201526064016107c3565b6000816000036122ee57506000919050565b6007546123069030906001600160a01b031684611f1f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061233b5761233b61332f565b6001600160a01b03928316602091820292909201015260095482519116908290600190811061236c5761236c61332f565b6001600160a01b0392831660209182029290920101526009546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea91906130af565b6007549091506001600160a01b0316635c11d795856000853061240f4261012c613147565b6040518663ffffffff1660e01b815260040161242f959493929190613345565b600060405180830381600087803b15801561244957600080fd5b505af192505050801561245a575060015b6124e4576124666131ca565b806308c379a0036124b5575061247a613221565b8061248557506124b7565b6000805160206133cc833981519152816040516124a29190612ed1565b60405180910390a1506000949350505050565b505b6000805160206133cc8339815191526040516124d290613381565b60405180910390a15060009392505050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561252d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255191906130af565b9050600061255f83836131b7565b60408051888152602081018390529192507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a195945050505050565b8115806125af575080155b156125b8575050565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926125ee9291169085906004016130f6565b6020604051808303816000875af115801561260d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612631919061310f565b5060075461264a9030906001600160a01b031684611f1f565b6007546009546001600160a01b039182169163e8e337009130911685856064612674601e826131b7565b61267e908a61317e565b6126889190613195565b6064612695601e826131b7565b61269f908a61317e565b6126a99190613195565b306126b64261012c613147565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af192505050801561274e575060408051601f3d908101601f1916820190925261274b918101906130c8565b60015b6127e45761275a6131ca565b806308c379a0036127b5575061276e613221565b8061277957506127b7565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516127a89190612ed1565b60405180910390a1505050565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051611ad690613381565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b925001611ad6565b8015806128335750600b546001600160a01b0316155b1561283b5750565b600954600b5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926128719291169085906004016130f6565b6020604051808303816000875af19250505080156128ac575060408051601f3d908101601f191682019092526128a99181019061310f565b60015b6119f6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051611a23906020808252600390820152622a2a2360e91b604082015260600190565b8015806129025750600d54155b1561290a5750565b600d5460009061291a9083613195565b905060005b600d54811015610af95760006001600160a01b0316600d82815481106129475761294761332f565b6000918252602090912001546001600160a01b03161480159061299a5750306001600160a01b0316600d82815481106129825761298261332f565b6000918252602090912001546001600160a01b031614155b80156129dc5750600a54600d80546001600160a01b0390921691839081106129c4576129c461332f565b6000918252602090912001546001600160a01b031614155b15612b2457600954600d80546001600160a01b039092169163a9059cbb919084908110612a0b57612a0b61332f565b6000918252602090912001546040516001600160e01b031960e084901b168152612a43916001600160a01b03169086906004016130f6565b6020604051808303816000875af1925050508015612a7e575060408051601f3d908101601f19168201909252612a7b9181019061310f565b60015b612b2257612a8a6131ca565b806308c379a003612ae65750612a9e613221565b80612aa95750612ae8565b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161481604051612ad89190612ed1565b60405180910390a150612b24565b505b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612b1590613381565b60405180910390a1612b24565b505b80612b2e8161339c565b91505061291f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831615801590612ba857506001600160a01b03821615155b612bd95760405162461bcd60e51b8152602060048201526002602482015261453160f01b60448201526064016107c3565b612be4838383610af9565b6001600160a01b03831660009081526020819052604090205481811015612c325760405162461bcd60e51b8152602060048201526002602482015261229960f11b60448201526064016107c3565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612039848484610af9565b600a546001600160a01b03838116911614801590612cc557506001600160a01b0382163014155b15610afb57808015612cf057506001600160a01b0382166000908152600c602052604090205460ff16155b15612d5c57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015612d8257506001600160a01b0382166000908152600c602052604090205460ff165b15610afb576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610af957826001600160a01b0316600d8281548110612dcf57612dcf61332f565b6000918252602090912001546001600160a01b031603612e9b57600d8054612df9906001906131b7565b81548110612e0957612e0961332f565b600091825260209091200154600d80546001600160a01b039092169183908110612e3557612e3561332f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480612e7457612e746133b5565b600082815260209020810160001990810180546001600160a01b0319169055019055610af9565b80612ea58161339c565b915050612da8565b60005b83811015612ec8578181015183820152602001612eb0565b50506000910152565b6020815260008251806020840152612ef0816040850160208701612ead565b601f01601f19169190910160400192915050565b6001600160a01b038116811461168957600080fd5b60008060408385031215612f2c57600080fd5b8235612f3781612f04565b946020939093013593505050565b600080600060608486031215612f5a57600080fd5b8335612f6581612f04565b92506020840135612f7581612f04565b929592945050506040919091013590565b600060208284031215612f9857600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612fd85781516001600160a01b031687529582019590820190600101612fb3565b509495945050505050565b602081526000612ff66020830184612f9f565b9392505050565b60006020828403121561300f57600080fd5b8135612ff681612f04565b6000806040838503121561302d57600080fd5b50508035926020909101359150565b6000806040838503121561304f57600080fd5b823561305a81612f04565b9150602083013561306a81612f04565b809150509250929050565b600181811c9082168061308957607f821691505b6020821081036130a957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130c157600080fd5b5051919050565b6000806000606084860312156130dd57600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03929092168252602082015260400190565b60006020828403121561312157600080fd5b81518015158114612ff657600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561072757610727613131565b6001600160a01b039384168152919092166020820152604081019190915260600190565b808202811582820484141761072757610727613131565b6000826131b257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561072757610727613131565b600060033d11156131e35760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561321a57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d101561322f5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561325f57505050505090565b82850191508151818111156132775750505050505090565b843d87010160208285010111156132915750505050505090565b6132a0602082860101876131e6565b509095945050505050565b63020a31d160e51b8152600082516132ca816004850160208701612ead565b9190910160040192915050565b6000602082840312156132e957600080fd5b8151612ff681612f04565b6020808252600290820152614e4160f01b604082015260600190565b6302a231d160e51b8152600082516132ca816004850160208701612ead565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061336460a0830186612f9f565b6001600160a01b0394909416606083015250608001529392505050565b6020808252600190820152604560f81b604082015260600190565b6000600182016133ae576133ae613131565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220c1d8affd27ef60ef3f39b8411ac0d0c59d161493f1d475fc7a0dcef036f2136b64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102085760003560e01c80637ac84fc111610118578063a9059cbb116100a0578063d4d7b19a1161006f578063d4d7b19a146105b6578063dd62ed3e146105e6578063ed9cacfe1461062c578063f2fde38b14610641578063fd7c9fab1461066157600080fd5b8063a9059cbb14610535578063b03b06b314610555578063b70143c914610576578063c0d786551461059657600080fd5b80638da5cb5b116100e75780638da5cb5b146104a25780638e7c3ec5146104c05780638f7f0e64146104e057806395d89b4114610500578063a8602fea1461051557600080fd5b80637ac84fc1146104435780637ff793d314610458578063808a54571461046d5780638129fc1c1461048d57600080fd5b806341a22cc21161019b5780635d76b04c1161016a5780635d76b04c146103a15780635fe8e7cc146103b657806362b6327a146103d857806370a08231146103f85780637136982b1461042e57600080fd5b806341a22cc21461032e578063461a3a95146103415780634626402b14610361578063573761981461038157600080fd5b806323b872dd116101d757806323b872dd146102a35780632a11ced0146102c3578063313ce567146102fb578063397883d21461031757600080fd5b806306fdde031461021457806308dee2b41461023f578063095ea7b31461025e57806318160ddd1461028e57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b50610229610681565b6040516102369190612ed1565b60405180910390f35b34801561024b57600080fd5b50600e545b604051908152602001610236565b34801561026a57600080fd5b5061027e610279366004612f19565b610713565b6040519015158152602001610236565b34801561029a57600080fd5b50600254610250565b3480156102af57600080fd5b5061027e6102be366004612f45565b61072d565b3480156102cf57600080fd5b506102e36102de366004612f86565b610751565b6040516001600160a01b039091168152602001610236565b34801561030757600080fd5b5060405160128152602001610236565b34801561032357600080fd5b5061032c61077b565b005b61032c61033c366004612f86565b610899565b34801561034d57600080fd5b506009546102e3906001600160a01b031681565b34801561036d57600080fd5b50600b546102e3906001600160a01b031681565b34801561038d57600080fd5b5061032c61039c366004612f19565b610aff565b3480156103ad57600080fd5b50600f54610250565b3480156103c257600080fd5b506103cb610bc6565b6040516102369190612fe3565b3480156103e457600080fd5b506007546102e3906001600160a01b031681565b34801561040457600080fd5b50610250610413366004612ffd565b6001600160a01b031660009081526020819052604090205490565b34801561043a57600080fd5b50600d54610250565b34801561044f57600080fd5b5061032c610c27565b34801561046457600080fd5b5061032c61114a565b34801561047957600080fd5b50600a546102e3906001600160a01b031681565b34801561049957600080fd5b5061032c611316565b3480156104ae57600080fd5b506006546001600160a01b03166102e3565b3480156104cc57600080fd5b5061032c6104db36600461301a565b61168c565b3480156104ec57600080fd5b5061032c6104fb366004612f86565b6118b3565b34801561050c57600080fd5b50610229611a2e565b34801561052157600080fd5b5061032c610530366004612ffd565b611a3d565b34801561054157600080fd5b5061027e610550366004612f19565b611ae2565b34801561056157600080fd5b50600b5461027e90600160a01b900460ff1681565b34801561058257600080fd5b5061032c610591366004612f86565b611af0565b3480156105a257600080fd5b5061032c6105b1366004612ffd565b611bf5565b3480156105c257600080fd5b5061027e6105d1366004612ffd565b600c6020526000908152604090205460ff1681565b3480156105f257600080fd5b5061025061060136600461303c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561063857600080fd5b5061032c611c5a565b34801561064d57600080fd5b5061032c61065c366004612ffd565b611ed3565b34801561066d57600080fd5b506008546102e3906001600160a01b031681565b60606003805461069090613075565b80601f01602080910402602001604051908101604052809291908181526020018280546106bc90613075565b80156107095780601f106106de57610100808354040283529160200191610709565b820191906000526020600020905b8154815290600101906020018083116106ec57829003601f168201915b5050505050905090565b600033610721818585611f1f565b60019150505b92915050565b60003361073b858285611fd1565b61074685858561203f565b506001949350505050565b600d818154811061076157600080fd5b6000918252602090912001546001600160a01b0316905081565b61078361228e565b6000600e54118061079657506000600f54115b6107cc5760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108005760405162461bcd60e51b815260206004820152600260248201526109c960f31b60448201526064016107c3565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561083b57600080fd5b505af192505050801561084c575060015b610897577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f5460405161088e929190918252602082015260400190565b60405180910390a15b565b6108a161228e565b600034116108d65760405162461bcd60e51b81526020600482015260026024820152614e4560f01b60448201526064016107c3565b6000811161090b5760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016107c3565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c91906130af565b101561099f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b60448201526064016107c3565b6007546109b79030906001600160a01b031683611f1f565b60075460405163f305d71960e01b81523060048201526024810183905260006044820181905260648201523360848201524260a48201526001600160a01b039091169063f305d71990349060c40160606040518083038185885af193505050508015610a40575060408051601f3d908101601f19168201909252610a3d918101906130c8565b60015b610a8a57600754610a5d9030906001600160a01b03166000611f1f565b60405162461bcd60e51b8152602060048201526002602482015261119360f21b60448201526064016107c3565b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a1478015610afb57604051339082156108fc029083906000818181858888f19350505050158015610af9573d6000803e3d6000fd5b505b5050565b610b0761228e565b306001600160a01b03831603610b445760405162461bcd60e51b815260206004820152600260248201526121a360f11b60448201526064016107c3565b816001600160a01b031663a9059cbb610b656006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610b839291906130f6565b6020604051808303816000875af1158015610ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af9919061310f565b6060600d80548060200260200160405190810160405280929190818152602001828054801561070957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c00575050505050905090565b600260055403610c5e5760405162461bcd60e51b8152602060048201526002602482015261523160f01b60448201526064016107c3565b6002600555601054610100900460ff1615610ca05760405162461bcd60e51b8152602060048201526002602482015261041560f41b60448201526064016107c3565b6010805461ff001916610100179055600e54600f5481158015610cc1575080155b15610cd85750506010805461ff0019169055611143565b60408051838152602081018390527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16000600e819055600f55600754610d359030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610d6d92911690600019906004016130f6565b6020604051808303816000875af1158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db0919061310f565b506000610dbd8284613147565b90506000610dca826122dc565b905080600003610de95750506010805461ff0019169055506111439050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906130af565b9050818110156110b557600b54600160a01b900460ff161561106457600954600b546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee791906130af565b9050801561105e57600954600b546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610f27929116903090869060040161315a565b6020604051808303816000875af1925050508015610f62575060408051601f3d908101601f19168201909252610f5f9181019061310f565b60015b610fb8576000805160206133cc833981519152604051610f999060208082526003908201526220aa2360e91b604082015260600190565b60405180910390a150506010805461ff00191690555061114392505050565b506040518181527fc6359f75dd26788a9c37bd02903f193da3f5c417c0742f245600976783acb3d19060200160405180910390a16009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105891906130af565b91508092505b506110b5565b6000805160206133cc83398151915260405161109790602080825260039082015262544e4160e81b604082015260600190565b60405180910390a150506010805461ff001916905550611143915050565b6000836110c2878561317e565b6110cc9190613195565b905060006110da82856131b7565b905081156110ec576110ec87836125a4565b8015611130576000606461110160198461317e565b61110b9190613195565b9050600061111982846131b7565b90506111248261281d565b61112d816128f5565b50505b50506010805461ff001916905550505050505b6001600555565b600b546001600160a01b031633146111895760405162461bcd60e51b815260206004820152600260248201526113d560f21b60448201526064016107c3565b6009546001600160a01b03166111c65760405162461bcd60e51b81526020600482015260026024820152614e5360f01b60448201526064016107c3565b60095460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906111fa903090600019906004016130f6565b6020604051808303816000875af1925050508015611235575060408051601f3d908101601f191682019092526112329181019061310f565b60015b6112c6576112416131ca565b806308c379a0036112975750611255613221565b806112605750611299565b8060405160200161127191906132ab565b60408051601f198184030181529082905262461bcd60e51b82526107c391600401612ed1565b505b60405162461bcd60e51b815260206004820152600260248201526120a360f11b60448201526064016107c3565b50600b8054600160a01b60ff60a01b198216179091556040516001600160a01b0390911681527f61f455c025be680134d6c3dfee8a7bedc6d3eb445cd61c5210f4b7f83609742f9060200161088e565b61131e61228e565b60105460ff16156113565760405162461bcd60e51b8152602060048201526002602482015261231960f11b60448201526064016107c3565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa1580156113b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d991906132d7565b600a80546001600160a01b0319166001600160a01b03929092169182179055611495576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147491906132d7565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166114d25760405162461bcd60e51b8152602060048201526002602482015261463360f01b60448201526064016107c3565b6007546114ec9030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261152492911690600019906004016130f6565b6020604051808303816000875af1158015611543573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611567919061310f565b6115985760405162461bcd60e51b8152602060048201526002602482015261118d60f21b60448201526064016107c3565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115d092911690600019906004016130f6565b6020604051808303816000875af11580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611613919061310f565b50600a5460405163095ea7b360e01b8152309163095ea7b391611646916001600160a01b031690600019906004016130f6565b6020604051808303816000875af1158015611665573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611689919061310f565b50565b61169461228e565b6000821180156116a45750600081115b6116c05760405162461bcd60e51b81526004016107c3906132f4565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172191906130af565b10156117545760405162461bcd60e51b815260206004820152600260248201526124a360f11b60448201526064016107c3565b6009546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c091906130af565b10156117f35760405162461bcd60e51b8152602060048201526002602482015261495360f01b60448201526064016107c3565b6000611800601980613147565b61180b60198461317e565b6118159190613195565b9050600061182382846131b7565b90506000611832601980613147565b61183d60198761317e565b6118479190613195565b90506000811180156118595750600083115b156118685761186881846125a4565b81156118ac576000606461187d60198561317e565b6118879190613195565b9050600061189582856131b7565b90506118a08261281d565b6118a9816128f5565b50505b5050505050565b6118bb61228e565b600b546001600160a01b03166118f85760405162461bcd60e51b8152602060048201526002602482015261139560f21b60448201526064016107c3565b600081116119185760405162461bcd60e51b81526004016107c3906132f4565b600954600b546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611950929116903090869060040161315a565b6020604051808303816000875af192505050801561198b575060408051601f3d908101601f191682019092526119889181019061310f565b60015b6119f6576119976131ca565b806308c379a0036119c757506119ab613221565b806119b657506119c9565b806040516020016112719190613310565b505b60405162461bcd60e51b81526020600482015260026024820152612a2360f11b60448201526064016107c3565b506040518181527f81f40cfa7691027044b117aa50764b33eaa2223ca9f761d5ff1c316a33d65ad2906020015b60405180910390a150565b60606004805461069090613075565b611a4561228e565b6001600160a01b038116611a805760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016107c3565b600b80546001600160a01b038381166001600160a81b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb491015b60405180910390a15050565b60003361072181858561203f565b611af861228e565b60008111611b185760405162461bcd60e51b81526004016107c3906132f4565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7991906130af565b1015611bac5760405162461bcd60e51b815260206004820152600260248201526124a160f11b60448201526064016107c3565b6000611bb7826122dc565b90508015610afb5760408051838152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc019101611ad6565b611bfd61228e565b6001600160a01b038116611c385760405162461bcd60e51b815260206004820152600260248201526124a960f11b60448201526064016107c3565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611c6261228e565b600754611c7c9030906001600160a01b0316600019611f1f565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611cb492911690600019906004016130f6565b6020604051808303816000875af1925050508015611cef575060408051601f3d908101601f19168201909252611cec9181019061310f565b60015b15611d4557506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92611d3c926001600160a01b03918216929116906000199061315a565b60405180910390a15b600a546001600160a01b03161561089757600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611d8e92911690600019906004016130f6565b6020604051808303816000875af1925050508015611dc9575060408051601f3d908101601f19168201909252611dc69181019061310f565b60015b15611e1f5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92611e16926001600160a01b03918216929116906000199061315a565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391611e51916001600160a01b031690600019906004016130f6565b6020604051808303816000875af1925050508015611e8c575060408051601f3d908101601f19168201909252611e899181019061310f565b60015b156108975750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9161088e9130916001600160a01b0316906000199061315a565b611edb61228e565b6001600160a01b038116611f165760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064016107c3565b61168981612b36565b6001600160a01b03831615801590611f3f57506001600160a01b03821615155b611f705760405162461bcd60e51b8152602060048201526002602482015261114d60f21b60448201526064016107c3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220548181101561202c5760405162461bcd60e51b8152602060048201526002602482015261453560f01b60448201526064016107c3565b6120398484848403611f1f565b50505050565b601054610100900460ff1615801561206557506006546001600160a01b03848116911614155b801561207f57506006546001600160a01b03838116911614155b801561209457506001600160a01b0383163014155b80156120ad5750600a546001600160a01b038381169116145b1561222b57600060646120c160058461317e565b6120cb9190613195565b9050801561222957600060646120e260198461317e565b6120ec9190613195565b9050600060646120fd60198561317e565b6121079190613195565b9050600061211584866131b7565b9050612122873086612b88565b61212d878783612b88565b82600e600082825461213f9190613147565b9250508190555081600f60008282546121589190613147565b9091555050600f54600e5468056bc75e2d631000009161217791613147565b106121ca57306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156121b757600080fd5b505af19250505080156121c8575060015b505b6121fd87678ac7230489e800006121f68a6001600160a01b031660009081526020819052604090205490565b1015612c9e565b6118a986678ac7230489e800006121f6896001600160a01b031660009081526020819052604090205490565b505b612236838383612b88565b61226283678ac7230489e800006121f6866001600160a01b031660009081526020819052604090205490565b610af982678ac7230489e800006121f6856001600160a01b031660009081526020819052604090205490565b336122a16006546001600160a01b031690565b6001600160a01b0316146108975760405162461bcd60e51b8152602060048201526002602482015261279960f11b60448201526064016107c3565b6000816000036122ee57506000919050565b6007546123069030906001600160a01b031684611f1f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061233b5761233b61332f565b6001600160a01b03928316602091820292909201015260095482519116908290600190811061236c5761236c61332f565b6001600160a01b0392831660209182029290920101526009546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea91906130af565b6007549091506001600160a01b0316635c11d795856000853061240f4261012c613147565b6040518663ffffffff1660e01b815260040161242f959493929190613345565b600060405180830381600087803b15801561244957600080fd5b505af192505050801561245a575060015b6124e4576124666131ca565b806308c379a0036124b5575061247a613221565b8061248557506124b7565b6000805160206133cc833981519152816040516124a29190612ed1565b60405180910390a1506000949350505050565b505b6000805160206133cc8339815191526040516124d290613381565b60405180910390a15060009392505050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561252d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255191906130af565b9050600061255f83836131b7565b60408051888152602081018390529192507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a195945050505050565b8115806125af575080155b156125b8575050565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926125ee9291169085906004016130f6565b6020604051808303816000875af115801561260d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612631919061310f565b5060075461264a9030906001600160a01b031684611f1f565b6007546009546001600160a01b039182169163e8e337009130911685856064612674601e826131b7565b61267e908a61317e565b6126889190613195565b6064612695601e826131b7565b61269f908a61317e565b6126a99190613195565b306126b64261012c613147565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af192505050801561274e575060408051601f3d908101601f1916820190925261274b918101906130c8565b60015b6127e45761275a6131ca565b806308c379a0036127b5575061276e613221565b8061277957506127b7565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad816040516127a89190612ed1565b60405180910390a1505050565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051611ad690613381565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b925001611ad6565b8015806128335750600b546001600160a01b0316155b1561283b5750565b600954600b5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926128719291169085906004016130f6565b6020604051808303816000875af19250505080156128ac575060408051601f3d908101601f191682019092526128a99181019061310f565b60015b6119f6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051611a23906020808252600390820152622a2a2360e91b604082015260600190565b8015806129025750600d54155b1561290a5750565b600d5460009061291a9083613195565b905060005b600d54811015610af95760006001600160a01b0316600d82815481106129475761294761332f565b6000918252602090912001546001600160a01b03161480159061299a5750306001600160a01b0316600d82815481106129825761298261332f565b6000918252602090912001546001600160a01b031614155b80156129dc5750600a54600d80546001600160a01b0390921691839081106129c4576129c461332f565b6000918252602090912001546001600160a01b031614155b15612b2457600954600d80546001600160a01b039092169163a9059cbb919084908110612a0b57612a0b61332f565b6000918252602090912001546040516001600160e01b031960e084901b168152612a43916001600160a01b03169086906004016130f6565b6020604051808303816000875af1925050508015612a7e575060408051601f3d908101601f19168201909252612a7b9181019061310f565b60015b612b2257612a8a6131ca565b806308c379a003612ae65750612a9e613221565b80612aa95750612ae8565b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161481604051612ad89190612ed1565b60405180910390a150612b24565b505b7fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612b1590613381565b60405180910390a1612b24565b505b80612b2e8161339c565b91505061291f565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831615801590612ba857506001600160a01b03821615155b612bd95760405162461bcd60e51b8152602060048201526002602482015261453160f01b60448201526064016107c3565b612be4838383610af9565b6001600160a01b03831660009081526020819052604090205481811015612c325760405162461bcd60e51b8152602060048201526002602482015261229960f11b60448201526064016107c3565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612039848484610af9565b600a546001600160a01b03838116911614801590612cc557506001600160a01b0382163014155b15610afb57808015612cf057506001600160a01b0382166000908152600c602052604090205460ff16155b15612d5c57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b80158015612d8257506001600160a01b0382166000908152600c602052604090205460ff165b15610afb576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610af957826001600160a01b0316600d8281548110612dcf57612dcf61332f565b6000918252602090912001546001600160a01b031603612e9b57600d8054612df9906001906131b7565b81548110612e0957612e0961332f565b600091825260209091200154600d80546001600160a01b039092169183908110612e3557612e3561332f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d805480612e7457612e746133b5565b600082815260209020810160001990810180546001600160a01b0319169055019055610af9565b80612ea58161339c565b915050612da8565b60005b83811015612ec8578181015183820152602001612eb0565b50506000910152565b6020815260008251806020840152612ef0816040850160208701612ead565b601f01601f19169190910160400192915050565b6001600160a01b038116811461168957600080fd5b60008060408385031215612f2c57600080fd5b8235612f3781612f04565b946020939093013593505050565b600080600060608486031215612f5a57600080fd5b8335612f6581612f04565b92506020840135612f7581612f04565b929592945050506040919091013590565b600060208284031215612f9857600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612fd85781516001600160a01b031687529582019590820190600101612fb3565b509495945050505050565b602081526000612ff66020830184612f9f565b9392505050565b60006020828403121561300f57600080fd5b8135612ff681612f04565b6000806040838503121561302d57600080fd5b50508035926020909101359150565b6000806040838503121561304f57600080fd5b823561305a81612f04565b9150602083013561306a81612f04565b809150509250929050565b600181811c9082168061308957607f821691505b6020821081036130a957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130c157600080fd5b5051919050565b6000806000606084860312156130dd57600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03929092168252602082015260400190565b60006020828403121561312157600080fd5b81518015158114612ff657600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561072757610727613131565b6001600160a01b039384168152919092166020820152604081019190915260600190565b808202811582820484141761072757610727613131565b6000826131b257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561072757610727613131565b600060033d11156131e35760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561321a57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d101561322f5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561325f57505050505090565b82850191508151818111156132775750505050505090565b843d87010160208285010111156132915750505050505090565b6132a0602082860101876131e6565b509095945050505050565b63020a31d160e51b8152600082516132ca816004850160208701612ead565b9190910160040192915050565b6000602082840312156132e957600080fd5b8151612ff681612f04565b6020808252600290820152614e4160f01b604082015260600190565b6302a231d160e51b8152600082516132ca816004850160208701612ead565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a06040820152600061336460a0830186612f9f565b6001600160a01b0394909416606083015250608001529392505050565b6020808252600190820152604560f81b604082015260600190565b6000600182016133ae576133ae613131565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220c1d8affd27ef60ef3f39b8411ac0d0c59d161493f1d475fc7a0dcef036f2136b64736f6c63430008110033

Deployed Bytecode Sourcemap

8477:20046:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23207:118;;;;;;;;;;-1:-1:-1;23294:23:0;;23207:118;;;816:25:1;;;804:2;789:18;23207:118:0;670:177:1;3740:190:0;;;;;;;;;;-1:-1:-1;3740:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3740:190:0;1308:187:1;3167:99:0;;;;;;;;;;-1:-1:-1;3246:12:0;;3167:99;;3938:250;;;;;;;;;;-1:-1:-1;3938:250:0;;;;;:::i;:::-;;:::i;9790:24::-;;;;;;;;;;-1:-1:-1;9790:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;9790:24:0;2146:203:1;3075:84:0;;;;;;;;;;-1:-1:-1;3075:84:0;;3149:2;2496:36:1;;2484:2;2469:18;3075:84:0;2354:184:1;23506:378:0;;;;;;;;;;;;;:::i;:::-;;21855:936;;;;;;:::i;:::-;;:::i;9544:25::-;;;;;;;;;;-1:-1:-1;9544:25:0;;;;-1:-1:-1;;;;;9544:25:0;;;9611:29;;;;;;;;;;-1:-1:-1;9611:29:0;;;;-1:-1:-1;;;;;9611:29:0;;;22973:183;;;;;;;;;;-1:-1:-1;22973:183:0;;;;;:::i;:::-;;:::i;23333:114::-;;;;;;;;;;-1:-1:-1;23418:21:0;;23333:114;;21681:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9446:41::-;;;;;;;;;;-1:-1:-1;9446:41:0;;;;-1:-1:-1;;;;;9446:41:0;;;3274:118;;;;;;;;;;-1:-1:-1;3274:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;21571:98;;;;;;;;;;-1:-1:-1;21647:7:0;:14;21571:98;;15268:2973;;;;;;;;;;;;;:::i;24974:590::-;;;;;;;;;;;;;:::i;9576:28::-;;;;;;;;;;-1:-1:-1;9576:28:0;;;;-1:-1:-1;;;;;9576:28:0;;;11523:836;;;;;;;;;;;;;:::i;1861:87::-;;;;;;;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;1934:6:0;1861:87;;27150:1333;;;;;;;;;;-1:-1:-1;27150:1333:0;;;;;:::i;:::-;;:::i;26075:535::-;;;;;;;;;;-1:-1:-1;26075:535:0;;;;;:::i;:::-;;:::i;2972:95::-;;;;;;;;;;;;;:::i;25613:380::-;;;;;;;;;;-1:-1:-1;25613:380:0;;;;;:::i;:::-;;:::i;3400:182::-;;;;;;;;;;-1:-1:-1;3400:182:0;;;;;:::i;:::-;;:::i;9647:28::-;;;;;;;;;;-1:-1:-1;9647:28:0;;;;-1:-1:-1;;;9647:28:0;;;;;;26692:358;;;;;;;;;;-1:-1:-1;26692:358:0;;;;;:::i;:::-;;:::i;22799:166::-;;;;;;;;;;-1:-1:-1;22799:166:0;;;;;:::i;:::-;;:::i;9743:40::-;;;;;;;;;;-1:-1:-1;9743:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3590:142;;;;;;;;;;-1:-1:-1;3590:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3697:18:0;;;3670:7;3697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3590:142;23930:958;;;;;;;;;;;;;:::i;2064:165::-;;;;;;;;;;-1:-1:-1;2064:165:0;;;;;:::i;:::-;;:::i;9494:43::-;;;;;;;;;;-1:-1:-1;9494:43:0;;;;-1:-1:-1;;;;;9494:43:0;;;2873:91;2918:13;2951:5;2944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;:::o;3740:190::-;3814:4;3847:10;3868:32;3847:10;3884:7;3893:6;3868:8;:32::i;:::-;3918:4;3911:11;;;3740:190;;;;;:::o;3938:250::-;4026:4;4061:10;4082:38;4098:4;4061:10;4113:6;4082:15;:38::i;:::-;4131:27;4141:4;4147:2;4151:6;4131:9;:27::i;:::-;-1:-1:-1;4176:4:0;;3938:250;-1:-1:-1;;;;3938:250:0:o;9790:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9790:24:0;;-1:-1:-1;9790:24:0;:::o;23506:378::-;1820:13;:11;:13::i;:::-;23599:1:::1;23573:23;;:27;:56;;;;23628:1;23604:21;;:25;23573:56;23565:71;;;::::0;-1:-1:-1;;;23565:71:0;;5227:2:1;23565:71:0::1;::::0;::::1;5209:21:1::0;5266:1;5246:18;;;5239:29;-1:-1:-1;;;5284:18:1;;;5277:32;5326:18;;23565:71:0::1;;;;;;;;;23655:7;:14:::0;23647:33:::1;;;::::0;-1:-1:-1;;;23647:33:0;;5557:2:1;23647:33:0::1;::::0;::::1;5539:21:1::0;5596:1;5576:18;;;5569:29;-1:-1:-1;;;5614:18:1;;;5607:32;5656:18;;23647:33:0::1;5355:325:1::0;23647:33:0::1;23695:4;-1:-1:-1::0;;;;;23695:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;23691:186;;23803:62;23818:23;;23843:21;;23803:62;;;;;;5859:25:1::0;;;5915:2;5900:18;;5893:34;5847:2;5832:18;;5685:248;23803:62:0::1;;;;;;;;23691:186;23506:378::o:0;21855:936::-;1820:13;:11;:13::i;:::-;21963:1:::1;21951:9;:13;21943:28;;;::::0;-1:-1:-1;;;21943:28:0;;6140:2:1;21943:28:0::1;::::0;::::1;6122:21:1::0;6179:1;6159:18;;;6152:29;-1:-1:-1;;;6197:18:1;;;6190:32;6239:18;;21943:28:0::1;5938:325:1::0;21943:28:0::1;22004:1;21990:11;:15;21982:30;;;::::0;-1:-1:-1;;;21982:30:0;;6470:2:1;21982:30:0::1;::::0;::::1;6452:21:1::0;6509:1;6489:18;;;6482:29;-1:-1:-1;;;6527:18:1;;;6520:32;6569:18;;21982:30:0::1;6268:325:1::0;21982:30:0::1;22055:46;::::0;-1:-1:-1;;;22055:46:0;;22070:4:::1;22055:46;::::0;::::1;2292:51:1::0;;;22105:11:0;;22055:31:::1;::::0;2265:18:1;;22055:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;22033:113;;;::::0;-1:-1:-1;;;22033:113:0;;6989:2:1;22033:113:0::1;::::0;::::1;6971:21:1::0;7028:1;7008:18;;;7001:29;-1:-1:-1;;;7046:18:1;;;7039:32;7088:18;;22033:113:0::1;6787:325:1::0;22033:113:0::1;22191:16;::::0;22159:63:::1;::::0;22176:4:::1;::::0;-1:-1:-1;;;;;22191:16:0::1;22210:11:::0;22159:8:::1;:63::i;:::-;22239:16;::::0;:202:::1;::::0;-1:-1:-1;;;22239:202:0;;22312:4:::1;22239:202;::::0;::::1;7458:34:1::0;7508:18;;;7501:34;;;22239:16:0::1;7551:18:1::0;;;7544:34;;;7594:18;;;7587:34;22390:10:0::1;7637:19:1::0;;;7630:44;22415:15:0::1;7690:19:1::0;;;7683:35;-1:-1:-1;;;;;22239:16:0;;::::1;::::0;:32:::1;::::0;22279:9:::1;::::0;7392:19:1;;22239:202:0::1;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;22239:202:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;22239:202:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;22235:391;;22566:16;::::0;22534:53:::1;::::0;22551:4:::1;::::0;-1:-1:-1;;;;;22566:16:0::1;;22534:8;:53::i;:::-;22602:12;::::0;-1:-1:-1;;;22602:12:0;;8242:2:1;22602:12:0::1;::::0;::::1;8224:21:1::0;8281:1;8261:18;;;8254:29;-1:-1:-1;;;8299:18:1;;;8292:32;8341:18;;22602:12:0::1;8040:325:1::0;22235:391:0::1;-1:-1:-1::0;;22462:38:0::1;::::0;;5859:25:1;;;22490:9:0::1;5915:2:1::0;5900:18;;5893:34;22462:38:0::1;::::0;-1:-1:-1;5832:18:1;22462:38:0::1;;;;;;;22661:21;22697:16:::0;;22693:91:::1;;22730:42;::::0;22738:10:::1;::::0;22730:42;::::1;;;::::0;22759:12;;22730:42:::1;::::0;;;22759:12;22738:10;22730:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;22693:91;21932:859;21855:936:::0;:::o;22973:183::-;1820:13;:11;:13::i;:::-;23084:4:::1;-1:-1:-1::0;;;;;23066:23:0;::::1;::::0;23058:38:::1;;;::::0;-1:-1:-1;;;23058:38:0;;8572:2:1;23058:38:0::1;::::0;::::1;8554:21:1::0;8611:1;8591:18;;;8584:29;-1:-1:-1;;;8629:18:1;;;8622:32;8671:18;;23058:38:0::1;8370:325:1::0;23058:38:0::1;23114:6;-1:-1:-1::0;;;;;23107:23:0::1;;23131:7;1934:6:::0;;-1:-1:-1;;;;;1934:6:0;;1861:87;23131:7:::1;23140;23107:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21681:96::-:0;21726:16;21762:7;21755:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21755:14:0;;;;;;;;;;;;;;;;;;;;;;21681:96;:::o;15268:2973::-;1114:1;1260:7;;:19;1252:34;;;;-1:-1:-1;;;1252:34:0;;9463:2:1;1252:34:0;;;9445:21:1;9502:1;9482:18;;;9475:29;-1:-1:-1;;;9520:18:1;;;9513:32;9562:18;;1252:34:0;9261:325:1;1252:34:0;1114:1;1297:7;:18;15348:7:::1;::::0;::::1;::::0;::::1;;;15347:8;15339:23;;;::::0;-1:-1:-1;;;15339:23:0;;9793:2:1;15339:23:0::1;::::0;::::1;9775:21:1::0;9832:1;9812:18;;;9805:29;-1:-1:-1;;;9850:18:1;;;9843:32;9892:18;;15339:23:0::1;9591:325:1::0;15339:23:0::1;15373:7;:14:::0;;-1:-1:-1;;15373:14:0::1;;;::::0;;15437:23:::1;::::0;15498:21:::1;::::0;15544:23;;:48;::::1;;;-1:-1:-1::0;15571:21:0;;15544:48:::1;15540:117;;;-1:-1:-1::0;;15609:7:0::1;:15:::0;;-1:-1:-1;;15609:15:0::1;::::0;;15639:7:::1;;15540:117;15682:52;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;15682:52:0::1;::::0;5832:18:1;15682:52:0::1;;;;;;;15815:1;15789:23;:27:::0;;;15827:21:::1;:25:::0;15935:16:::1;::::0;15903:69:::1;::::0;15920:4:::1;::::0;-1:-1:-1;;;;;15935:16:0::1;-1:-1:-1::0;;15903:8:0::1;:69::i;:::-;15990:10;::::0;16018:16:::1;::::0;15983:72:::1;::::0;-1:-1:-1;;;15983:72:0;;-1:-1:-1;;;;;15990:10:0;;::::1;::::0;15983:26:::1;::::0;:72:::1;::::0;16018:16;::::1;::::0;-1:-1:-1;;16037:17:0;15983:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;16101:25:0::1;16129:37;16150:16:::0;16129:18;:37:::1;:::i;:::-;16101:65;;16177:21;16201:31;16214:17;16201:12;:31::i;:::-;16177:55;;16257:13;16274:1;16257:18:::0;16253:87:::1;;-1:-1:-1::0;;16292:7:0::1;:15:::0;;-1:-1:-1;;16292:15:0::1;::::0;;-1:-1:-1;16322:7:0::1;::::0;-1:-1:-1;16322:7:0::1;16253:87;16475:10;::::0;16468:43:::1;::::0;-1:-1:-1;;;16468:43:0;;16505:4:::1;16468:43;::::0;::::1;2292:51:1::0;16445:20:0::1;::::0;-1:-1:-1;;;;;16475:10:0::1;::::0;16468:28:::1;::::0;2265:18:1;;16468:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16445:66;;16541:13;16526:12;:28;16522:950;;;16652:16;::::0;-1:-1:-1;;;16652:16:0;::::1;;;16648:813;;;16722:10;::::0;16744:14:::1;::::0;16715:44:::1;::::0;-1:-1:-1;;;16715:44:0;;-1:-1:-1;;;;;16744:14:0;;::::1;16715:44;::::0;::::1;2292:51:1::0;16689:23:0::1;::::0;16722:10;;;::::1;::::0;16715:28:::1;::::0;2265:18:1;;16715:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16689:70:::0;-1:-1:-1;16782:19:0;;16778:546:::1;;16837:10;::::0;16862:14:::1;::::0;16830:79:::1;::::0;-1:-1:-1;;;16830:79:0;;-1:-1:-1;;;;;16837:10:0;;::::1;::::0;16830:31:::1;::::0;:79:::1;::::0;16862:14;::::1;::::0;16886:4:::1;::::0;16893:15;;16830:79:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;16830:79:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;16830:79:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;16826:479;;-1:-1:-1::0;;;;;;;;;;;17189:17:0::1;;;;10765:2:1::0;10747:21;;;10804:1;10784:18;;;10777:29;-1:-1:-1;;;10837:2:1;10822:18;;10815:33;10880:2;10865:18;;10563:326;17189:17:0::1;;;;;;;;-1:-1:-1::0;;17233:7:0::1;:15:::0;;-1:-1:-1;;17233:15:0::1;::::0;;-1:-1:-1;17275:7:0::1;::::0;-1:-1:-1;;;17275:7:0::1;16826:479;-1:-1:-1::0;16942:41:0::1;::::0;816:25:1;;;16942:41:0::1;::::0;804:2:1;789:18;16942:41:0::1;;;;;;;17032:10;::::0;17025:43:::1;::::0;-1:-1:-1;;;17025:43:0;;17062:4:::1;17025:43;::::0;::::1;2292:51:1::0;-1:-1:-1;;;;;17032:10:0;;::::1;::::0;17025:28:::1;::::0;2265:18:1;;17025:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17010:58;;17111:15;17095:31;;16826:479;16670:669;16648:813;;;-1:-1:-1::0;;;;;;;;;;;17369:17:0::1;;;;11096:2:1::0;11078:21;;;11135:1;11115:18;;;11108:29;-1:-1:-1;;;11168:2:1;11153:18;;11146:33;11211:2;11196:18;;10894:326;17369:17:0::1;;;;;;;;-1:-1:-1::0;;17405:7:0::1;:15:::0;;-1:-1:-1;;17405:15:0::1;::::0;;-1:-1:-1;17439:7:0::1;::::0;-1:-1:-1;;17439:7:0::1;16648:813;17522:25;17587:17:::0;17550:34:::1;17566:18:::0;17550:13;:34:::1;:::i;:::-;:54;;;;:::i;:::-;17522:82:::0;-1:-1:-1;17615:23:0::1;17641:33;17522:82:::0;17641:13;:33:::1;:::i;:::-;17615:59:::0;-1:-1:-1;17729:21:0;;17725:110:::1;;17767:56;17785:18;17805:17;17767;:56::i;:::-;17887:19:::0;;17883:315:::1;;17923:24;17990:3;17950:37;9278:2;17950:15:::0;:37:::1;:::i;:::-;:43;;;;:::i;:::-;17923:70:::0;-1:-1:-1;18008:23:0::1;18034:34;17923:70:::0;18034:15;:34:::1;:::i;:::-;18008:60;;18097:42;18122:16;18097:24;:42::i;:::-;18154:32;18170:15;18154;:32::i;:::-;17908:290;;17883:315;-1:-1:-1::0;;18218:7:0::1;:15:::0;;-1:-1:-1;;18218:15:0::1;::::0;;-1:-1:-1;;;;;1326:1:0::1;1070::::0;1338:7;:22;15268:2973::o;24974:590::-;25053:14;;-1:-1:-1;;;;;25053:14:0;25039:10;:28;25031:43;;;;-1:-1:-1;;;25031:43:0;;11955:2:1;25031:43:0;;;11937:21:1;11994:1;11974:18;;;11967:29;-1:-1:-1;;;12012:18:1;;;12005:32;12054:18;;25031:43:0;11753:325:1;25031:43:0;25093:10;;-1:-1:-1;;;;;25093:10:0;25085:39;;;;-1:-1:-1;;;25085:39:0;;12285:2:1;25085:39:0;;;12267:21:1;12324:1;12304:18;;;12297:29;-1:-1:-1;;;12342:18:1;;;12335:32;12384:18;;25085:39:0;12083:325:1;25085:39:0;25238:10;;25231:60;;-1:-1:-1;;;25231:60:0;;-1:-1:-1;;;;;25238:10:0;;;;25231:26;;:60;;25266:4;;-1:-1:-1;;25273:17:0;25231:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25231:60:0;;;;;;;;-1:-1:-1;;25231:60:0;;;;;;;;;;;;:::i;:::-;;;25227:330;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25490:6;25465:32;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25465:32:0;;;;;;;;;;-1:-1:-1;;;25451:48:0;;;;;;;:::i;25227:330::-;;;25533:12;;-1:-1:-1;;;25533:12:0;;14397:2:1;25533:12:0;;;14379:21:1;14436:1;14416:18;;;14409:29;-1:-1:-1;;;14454:18:1;;;14447:32;14496:18;;25533:12:0;14195:325:1;25227:330:0;-1:-1:-1;25307:16:0;:23;;-1:-1:-1;;;;;;;25307:23:0;;;;;;25350:39;;-1:-1:-1;;;;;25374:14:0;;;2292:51:1;;25350:39:0;;2280:2:1;2265:18;25350:39:0;2146:203:1;11523:836:0;1820:13;:11;:13::i;:::-;11584:12:::1;::::0;::::1;;11583:13;11575:28;;;::::0;-1:-1:-1;;;11575:28:0;;14727:2:1;11575:28:0::1;::::0;::::1;14709:21:1::0;14766:1;14746:18;;;14739:29;-1:-1:-1;;;14784:18:1;;;14777:32;14826:18;;11575:28:0::1;14525:325:1::0;11575:28:0::1;11614:12;:19:::0;;-1:-1:-1;;11614:19:0::1;11629:4;11614:19;::::0;;11705:17:::1;::::0;11746:10:::1;::::0;11705:52:::1;::::0;-1:-1:-1;;;11705:52:0;;11739:4:::1;11705:52;::::0;::::1;15067:34:1::0;-1:-1:-1;;;;;11746:10:0;;::::1;15117:18:1::0;;;15110:43;11705:17:0;::::1;::::0;:25:::1;::::0;15002:18:1;;11705:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11689:13;:68:::0;;-1:-1:-1;;;;;;11689:68:0::1;-1:-1:-1::0;;;;;11689:68:0;;;::::1;::::0;;::::1;::::0;;11823:131:::1;;11887:17;::::0;11931:10:::1;::::0;11887:55:::1;::::0;-1:-1:-1;;;11887:55:0;;11924:4:::1;11887:55;::::0;::::1;15067:34:1::0;-1:-1:-1;;;;;11931:10:0;;::::1;15117:18:1::0;;;15110:43;11887:17:0;::::1;::::0;:28:::1;::::0;15002:18:1;;11887:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11871:13;:71:::0;;-1:-1:-1;;;;;;11871:71:0::1;-1:-1:-1::0;;;;;11871:71:0;;;::::1;::::0;;;::::1;::::0;;11823:131:::1;11982:13;::::0;-1:-1:-1;;;;;11982:13:0::1;11974:42;;;::::0;-1:-1:-1;;;11974:42:0;;15622:2:1;11974:42:0::1;::::0;::::1;15604:21:1::0;15661:1;15641:18;;;15634:29;-1:-1:-1;;;15679:18:1;;;15672:32;15721:18;;11974:42:0::1;15420:325:1::0;11974:42:0::1;12061:16;::::0;12029:69:::1;::::0;12046:4:::1;::::0;-1:-1:-1;;;;;12061:16:0::1;-1:-1:-1::0;;12029:8:0::1;:69::i;:::-;12134:10;::::0;12162:16:::1;::::0;12127:72:::1;::::0;-1:-1:-1;;;12127:72:0;;-1:-1:-1;;;;;12134:10:0;;::::1;::::0;12127:26:::1;::::0;:72:::1;::::0;12162:16;::::1;::::0;-1:-1:-1;;12181:17:0;12127:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12119:87;;;::::0;-1:-1:-1;;;12119:87:0;;15952:2:1;12119:87:0::1;::::0;::::1;15934:21:1::0;15991:1;15971:18;;;15964:29;-1:-1:-1;;;16009:18:1;;;16002:32;16051:18;;12119:87:0::1;15750:325:1::0;12119:87:0::1;12224:10;::::0;12244:13:::1;::::0;12217:60:::1;::::0;-1:-1:-1;;;12217:60:0;;-1:-1:-1;;;;;12224:10:0;;::::1;::::0;12217:26:::1;::::0;:60:::1;::::0;12244:13;::::1;::::0;-1:-1:-1;;12259:17:0;12217:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12318:13:0::1;::::0;12288:63:::1;::::0;-1:-1:-1;;;12288:63:0;;12303:4:::1;::::0;12288:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;12318:13:0::1;::::0;-1:-1:-1;;12333:17:0;12288:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11523:836::o:0;27150:1333::-;1820:13;:11;:13::i;:::-;27281:1:::1;27266:12;:16;:35;;;;;27300:1;27286:11;:15;27266:35;27258:50;;;;-1:-1:-1::0;;;27258:50:0::1;;;;;;;:::i;:::-;27327:46;::::0;-1:-1:-1;;;27327:46:0;;27342:4:::1;27327:46;::::0;::::1;2292:51:1::0;;;27377:12:0;;27327:31:::1;::::0;2265:18:1;;27327:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;27319:77;;;::::0;-1:-1:-1;;;27319:77:0;;16612:2:1;27319:77:0::1;::::0;::::1;16594:21:1::0;16651:1;16631:18;;;16624:29;-1:-1:-1;;;16669:18:1;;;16662:32;16711:18;;27319:77:0::1;16410:325:1::0;27319:77:0::1;27422:10;::::0;27415:43:::1;::::0;-1:-1:-1;;;27415:43:0;;27452:4:::1;27415:43;::::0;::::1;2292:51:1::0;27462:11:0;;-1:-1:-1;;;;;27422:10:0::1;::::0;27415:28:::1;::::0;2265:18:1;;27415:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;27407:73;;;::::0;-1:-1:-1;;;27407:73:0;;16942:2:1;27407:73:0::1;::::0;::::1;16924:21:1::0;16981:1;16961:18;;;16954:29;-1:-1:-1;;;16999:18:1;;;16992:32;17041:18;;27407:73:0::1;16740:325:1::0;27407:73:0::1;27574:25;27633:27;8765:2;::::0;27633:27:::1;:::i;:::-;27602;8709:2;27602:11:::0;:27:::1;:::i;:::-;:59;;;;:::i;:::-;27574:87:::0;-1:-1:-1;27672:23:0::1;27698:31;27574:87:::0;27698:11;:31:::1;:::i;:::-;27672:57:::0;-1:-1:-1;27824:26:0::1;27885:27;8765:2;::::0;27885:27:::1;:::i;:::-;27853:28;8709:2;27853:12:::0;:28:::1;:::i;:::-;:60;;;;:::i;:::-;27824:89;;27985:1;27964:18;:22;:47;;;;;28010:1;27990:17;:21;27964:47;27960:136;;;28028:56;28046:18;28066:17;28028;:56::i;:::-;28165:19:::0;;28161:315:::1;;28201:24;28268:3;28228:37;9278:2;28228:15:::0;:37:::1;:::i;:::-;:43;;;;:::i;:::-;28201:70:::0;-1:-1:-1;28286:23:0::1;28312:34;28201:70:::0;28312:15;:34:::1;:::i;:::-;28286:60;;28375:42;28400:16;28375:24;:42::i;:::-;28432:32;28448:15;28432;:32::i;:::-;28186:290;;28161:315;27247:1236;;;27150:1333:::0;;:::o;26075:535::-;1820:13;:11;:13::i;:::-;26164:14:::1;::::0;-1:-1:-1;;;;;26164:14:0::1;26156:43;;;::::0;-1:-1:-1;;;26156:43:0;;6470:2:1;26156:43:0::1;::::0;::::1;6452:21:1::0;6509:1;6489:18;;;6482:29;-1:-1:-1;;;6527:18:1;;;6520:32;6569:18;;26156:43:0::1;6268:325:1::0;26156:43:0::1;26227:1;26218:6;:10;26210:25;;;;-1:-1:-1::0;;;26210:25:0::1;;;;;;;:::i;:::-;26327:10;::::0;26352:14:::1;::::0;26320:70:::1;::::0;-1:-1:-1;;;26320:70:0;;-1:-1:-1;;;;;26327:10:0;;::::1;::::0;26320:31:::1;::::0;:70:::1;::::0;26352:14;::::1;::::0;26376:4:::1;::::0;26383:6;;26320:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26320:70:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;26320:70:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;26316:287;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;26536:6;26511:32;;;;;;;;:::i;26316:287::-;;;26579:12;::::0;-1:-1:-1;;;26579:12:0;;17711:2:1;26579:12:0::1;::::0;::::1;17693:21:1::0;17750:1;17730:18;;;17723:29;-1:-1:-1;;;17768:18:1;;;17761:32;17810:18;;26579:12:0::1;17509:325:1::0;26316:287:0::1;-1:-1:-1::0;26411:24:0::1;::::0;816:25:1;;;26411:24:0::1;::::0;804:2:1;789:18;26411:24:0::1;;;;;;;;26075:535:::0;:::o;2972:95::-;3019:13;3052:7;3045:14;;;;;:::i;25613:380::-;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;25703:29:0;::::1;25695:44;;;::::0;-1:-1:-1;;;25695:44:0;;18041:2:1;25695:44:0::1;::::0;::::1;18023:21:1::0;18080:1;18060:18;;;18053:29;-1:-1:-1;;;18098:18:1;;;18091:32;18140:18;;25695:44:0::1;17839:325:1::0;25695:44:0::1;25772:14;::::0;;-1:-1:-1;;;;;25797:32:0;;::::1;-1:-1:-1::0;;;;;;25840:24:0;;;;;;;25934:51:::1;::::0;;25772:14;;;::::1;15067:34:1::0;;;15132:2;15117:18;;15110:43;;;;25934:51:0::1;::::0;15002:18:1;25934:51:0::1;;;;;;;;25684:309;25613:380:::0;:::o;3400:182::-;3470:4;3503:10;3524:28;3503:10;3541:2;3545:6;3524:9;:28::i;26692:358::-;1820:13;:11;:13::i;:::-;26775:1:::1;26766:6;:10;26758:25;;;;-1:-1:-1::0;;;26758:25:0::1;;;;;;;:::i;:::-;26802:46;::::0;-1:-1:-1;;;26802:46:0;;26817:4:::1;26802:46;::::0;::::1;2292:51:1::0;;;26852:6:0;;26802:31:::1;::::0;2265:18:1;;26802:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;26794:71;;;::::0;-1:-1:-1;;;26794:71:0;;6989:2:1;26794:71:0::1;::::0;::::1;6971:21:1::0;7028:1;7008:18;;;7001:29;-1:-1:-1;;;7046:18:1;;;7039:32;7088:18;;26794:71:0::1;6787:325:1::0;26794:71:0::1;26886:21;26910:20;26923:6;26910:12;:20::i;:::-;26886:44:::0;-1:-1:-1;26955:17:0;;26951:92:::1;;26994:37;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;26994:37:0::1;::::0;5832:18:1;26994:37:0::1;5685:248:1::0;22799:166:0;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;22873:21:0;::::1;22865:36;;;::::0;-1:-1:-1;;;22865:36:0;;18371:2:1;22865:36:0::1;::::0;::::1;18353:21:1::0;18410:1;18390:18;;;18383:29;-1:-1:-1;;;18428:18:1;;;18421:32;18470:18;;22865:36:0::1;18169:325:1::0;22865:36:0::1;22912:16;:45:::0;;-1:-1:-1;;;;;;22912:45:0::1;-1:-1:-1::0;;;;;22912:45:0;;;::::1;::::0;;;::::1;::::0;;22799:166::o;23930:958::-;1820:13;:11;:13::i;:::-;24065:16:::1;::::0;24033:69:::1;::::0;24050:4:::1;::::0;-1:-1:-1;;;;;24065:16:0::1;-1:-1:-1::0;;24033:8:0::1;:69::i;:::-;24181:10;::::0;24209:16:::1;::::0;24174:72:::1;::::0;-1:-1:-1;;;24174:72:0;;-1:-1:-1;;;;;24181:10:0;;::::1;::::0;24174:26:::1;::::0;:72:::1;::::0;24209:16;::::1;::::0;-1:-1:-1;;24228:17:0;24174:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;24174:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;24174:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;24170:193:::0;::::1;;-1:-1:-1::0;24285:10:0::1;::::0;24305:16:::1;::::0;24267:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;24285:10:0;;::::1;::::0;24305:16;::::1;::::0;-1:-1:-1;;24324:17:0;24267:75:::1;:::i;:::-;;;;;;;;24170:193;24438:13;::::0;-1:-1:-1;;;;;24438:13:0::1;:27:::0;24434:447:::1;;24493:10;::::0;24513:13:::1;::::0;24486:60:::1;::::0;-1:-1:-1;;;24486:60:0;;-1:-1:-1;;;;;24493:10:0;;::::1;::::0;24486:26:::1;::::0;:60:::1;::::0;24513:13;::::1;::::0;-1:-1:-1;;24528:17:0;24486:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;24486:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;24486:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;24482:177:::0;::::1;;-1:-1:-1::0;24589:10:0::1;::::0;24601:13:::1;::::0;24571:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;24589:10:0;;::::1;::::0;24601:13;::::1;::::0;-1:-1:-1;;24616:17:0;24571:63:::1;:::i;:::-;;;;;;;;24482:177;24721:13;::::0;24691:63:::1;::::0;-1:-1:-1;;;24691:63:0;;24706:4:::1;::::0;24691:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;24721:13:0::1;::::0;-1:-1:-1;;24736:17:0;24691:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;24691:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;24691:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;24687:183:::0;::::1;;-1:-1:-1::0;24812:13:0::1;::::0;24779:66:::1;::::0;::::1;::::0;::::1;::::0;24805:4:::1;::::0;-1:-1:-1;;;;;24812:13:0::1;::::0;-1:-1:-1;;24827:17:0;24779:66:::1;:::i;2064:165::-:0;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;2153:22:0;::::1;2145:37;;;::::0;-1:-1:-1;;;2145:37:0;;18701:2:1;2145:37:0::1;::::0;::::1;18683:21:1::0;18740:1;18720:18;;;18713:29;-1:-1:-1;;;18758:18:1;;;18751:32;18800:18;;2145:37:0::1;18499:325:1::0;2145:37:0::1;2193:28;2212:8;2193:18;:28::i;5119:256::-:0;-1:-1:-1;;;;;5221:19:0;;;;;;:44;;-1:-1:-1;;;;;;5244:21:0;;;;5221:44;5213:59;;;;-1:-1:-1;;;5213:59:0;;19031:2:1;5213:59:0;;;19013:21:1;19070:1;19050:18;;;19043:29;-1:-1:-1;;;19088:18:1;;;19081:32;19130:18;;5213:59:0;18829:325:1;5213:59:0;-1:-1:-1;;;;;5283:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5335:32;;816:25:1;;;5335:32:0;;789:18:1;5335:32:0;;;;;;;5119:256;;;:::o;5383:311::-;-1:-1:-1;;;;;3697:18:0;;;5484:24;3697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5555:26;;;;5547:41;;;;-1:-1:-1;;;5547:41:0;;19361:2:1;5547:41:0;;;19343:21:1;19400:1;19380:18;;;19373:29;-1:-1:-1;;;19418:18:1;;;19411:32;19460:18;;5547:41:0;19159:325:1;5547:41:0;5624:51;5633:5;5640:7;5668:6;5649:16;:25;5624:8;:51::i;:::-;5473:221;5383:311;;;:::o;12367:2106::-;12555:7;;;;;;;12554:8;:41;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;12580:15:0;;;1934:6;;12580:15;;12554:41;:72;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;12613:13:0;;;1934:6;;12613:13;;12554:72;:111;;;;-1:-1:-1;;;;;;12644:21:0;;12660:4;12644:21;;12554:111;:148;;;;-1:-1:-1;12689:13:0;;-1:-1:-1;;;;;12683:19:0;;;12689:13;;12683:19;12554:148;12536:1668;;;12759:17;12799:3;12779:17;8654:1;12779:6;:17;:::i;:::-;:23;;;;:::i;:::-;12759:43;-1:-1:-1;12835:13:0;;12831:1362;;12929:23;12983:3;12955:25;8709:2;12955:9;:25;:::i;:::-;:31;;;;:::i;:::-;12929:57;-1:-1:-1;13005:21:0;13055:3;13029:23;8765:2;13029:9;:23;:::i;:::-;:29;;;;:::i;:::-;13005:53;-1:-1:-1;13153:22:0;13178:18;13187:9;13178:6;:18;:::i;:::-;13153:43;;13276:47;13292:4;13306;13313:9;13276:15;:47::i;:::-;13411:41;13427:4;13433:2;13437:14;13411:15;:41::i;:::-;13567:15;13540:23;;:42;;;;;;;:::i;:::-;;;;;;;;13626:13;13601:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;13783:21:0;;13757:23;;8934:12;;13757:47;;;:::i;:::-;:73;13753:170;;13859:4;-1:-1:-1;;;;;13859:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13855:49;;14005:57;14019:4;8827:11;14025:15;14035:4;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;14025:15;:36;;14005:13;:57::i;:::-;14081:53;14095:2;8827:11;14099:13;14109:2;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;12831:1362;12714:1490;12536:1668;14252:33;14268:4;14274:2;14278:6;14252:15;:33::i;:::-;14344:57;14358:4;8827:11;14364:15;14374:4;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;14344:57;14412:53;14426:2;8827:11;14430:13;14440:2;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;1956:100;2031:10;2020:7;1934:6;;-1:-1:-1;;;;;1934:6:0;;1861:87;2020:7;-1:-1:-1;;;;;2020:21:0;;2012:36;;;;-1:-1:-1;;;2012:36:0;;19691:2:1;2012:36:0;;;19673:21:1;19730:1;19710:18;;;19703:29;-1:-1:-1;;;19748:18:1;;;19741:32;19790:18;;2012:36:0;19489:325:1;18249:1140:0;18310:7;18334:12;18350:1;18334:17;18330:31;;-1:-1:-1;18360:1:0;;18249:1140;-1:-1:-1;18249:1140:0:o;18330:31::-;18406:16;;18374:64;;18391:4;;-1:-1:-1;;;;;18406:16:0;18425:12;18374:8;:64::i;:::-;18512:16;;;18526:1;18512:16;;;;;;;;18488:21;;18512:16;;;;;;;;;;-1:-1:-1;18512:16:0;18488:40;;18557:4;18539;18544:1;18539:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18539:23:0;;;:7;;;;;;;;;:23;18583:10;;18573:7;;18583:10;;;18573:4;;18583:10;;18573:7;;;;;;:::i;:::-;-1:-1:-1;;;;;18573:20:0;;;:7;;;;;;;;;:20;18664:10;;18657:43;;-1:-1:-1;;;18657:43:0;;18694:4;18657:43;;;2292:51:1;18635:19:0;;18664:10;;;;;18657:28;;2265:18:1;;18657:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18717:16;;18635:65;;-1:-1:-1;;;;;;18717:16:0;:70;18802:12;18717:16;18845:4;18872;18912:21;:15;18930:3;18912:21;:::i;:::-;18717:227;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18713:669;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;19263:6:0;19252:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;19292:1:0;;18249:1140;-1:-1:-1;;;;18249:1140:0:o;18713:669::-;;;-1:-1:-1;;;;;;;;;;;19332:15:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;19369:1:0;;18249:1140;-1:-1:-1;;;18249:1140:0:o;18713:669::-;18988:10;;18981:43;;-1:-1:-1;;;18981:43:0;;19018:4;18981:43;;;2292:51:1;18960:18:0;;-1:-1:-1;;;;;18988:10:0;;18981:28;;2265:18:1;;18981:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18960:64;-1:-1:-1;19039:21:0;19063:24;19076:11;18960:64;19063:24;:::i;:::-;19107:43;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;19039:48:0;;-1:-1:-1;19107:43:0;;5832:18:1;19107:43:0;;;;;;;19172:13;18249:1140;-1:-1:-1;;;;;18249:1140:0:o;19397:1049::-;19502:23;;;:49;;-1:-1:-1;19529:22:0;;19502:49;19498:88;;;19397:1049;;:::o;19498:88::-;19648:10;;19676:16;;19641:72;;-1:-1:-1;;;19641:72:0;;-1:-1:-1;;;;;19648:10:0;;;;19641:26;;:72;;19676:16;;;19695:17;;19641:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19798:16:0;;19766:70;;19783:4;;-1:-1:-1;;;;;19798:16:0;19817:18;19766:8;:70::i;:::-;19853:16;;19925:10;;-1:-1:-1;;;;;19853:16:0;;;;:29;;19905:4;;19925:10;19950:18;19983:17;20059:3;20037:18;9196:2;20059:3;20037:18;:::i;:::-;20015:41;;:18;:41;:::i;:::-;:47;;;;:::i;:::-;20120:3;20098:18;9196:2;20120:3;20098:18;:::i;:::-;20077:40;;:17;:40;:::i;:::-;:46;;;;:::i;:::-;20146:4;20166:21;:15;20184:3;20166:21;:::i;:::-;19853:345;;;;;;-1:-1:-1;;;;;;19853:345:0;;;-1:-1:-1;;;;;21266:15:1;;;19853:345:0;;;21248:34:1;21318:15;;;21298:18;;;21291:43;21350:18;;;21343:34;;;;21393:18;;;21386:34;;;;21436:19;;;21429:35;;;;21480:19;;;21473:35;21545:15;;;21524:19;;;21517:44;21577:19;;;21570:35;;;;21182:19;;19853:345:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;19853:345:0;;;;;;;;-1:-1:-1;;19853:345:0;;;;;;;;;;;;:::i;:::-;;;19849:590;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20339:26;20358:6;20339:26;;;;;;:::i;:::-;;;;;;;;20285:92;21932:859:::1;21855:936:::0;:::o;19849:590::-;;;20404:23;;;;;;:::i;19849:590::-;-1:-1:-1;;20219:53:0;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;20219:53:0;;-1:-1:-1;5832:18:1;20219:53:0;5685:248:1;20454:343:0;20532:16;;;:48;;-1:-1:-1;20552:14:0;;-1:-1:-1;;;;;20552:14:0;:28;20532:48;20528:61;;;20454:343;:::o;20528:61::-;20620:10;;20641:14;;20613:56;;-1:-1:-1;;;20613:56:0;;-1:-1:-1;;;;;20620:10:0;;;;20613:27;;:56;;20641:14;;;20657:11;;20613:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20613:56:0;;;;;;;;-1:-1:-1;;20613:56:0;;;;;;;;;;;;:::i;:::-;;;20609:181;;20758:20;;;;;21818:2:1;21800:21;;;21857:1;21837:18;;;21830:29;-1:-1:-1;;;21890:2:1;21875:18;;21868:33;21933:2;21918:18;;21616:326;20805:735:0;20874:16;;;:39;;-1:-1:-1;20894:7:0;:14;:19;20874:39;20870:78;;;20805:735;:::o;20870:78::-;20999:7;:14;20960:22;;20985:28;;:11;:28;:::i;:::-;20960:53;;21039:9;21034:499;21058:7;:14;21054:18;;21034:499;;;21120:1;-1:-1:-1;;;;;21098:24:0;:7;21106:1;21098:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21098:10:0;:24;;;;:55;;;21148:4;-1:-1:-1;;;;;21126:27:0;:7;21134:1;21126:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21126:10:0;:27;;21098:55;:86;;;;-1:-1:-1;21171:13:0;;21157:7;:10;;-1:-1:-1;;;;;21171:13:0;;;;21165:1;;21157:10;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21157:10:0;:27;;21098:86;21094:428;;;21216:10;;21237:7;:10;;-1:-1:-1;;;;;21216:10:0;;;;21209:27;;21237:7;21245:1;;21237:10;;;;;;:::i;:::-;;;;;;;;;;;21209:55;;-1:-1:-1;;;;;;21209:55:0;;;;;;;;;-1:-1:-1;;;;;21237:10:0;;21249:14;;21209:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21209:55:0;;;;;;;;-1:-1:-1;;21209:55:0;;;;;;;;;;;;:::i;:::-;;;21205:302;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;21393:21;21407:6;21393:21;;;;;;:::i;:::-;;;;;;;;21331:103;21205:302;;;;;21469:18;;;;;;:::i;:::-;;;;;;;;21205:302;;;;;21074:3;;;;:::i;:::-;;;;21034:499;;2237:191;2330:6;;;-1:-1:-1;;;;;2347:17:0;;;-1:-1:-1;;;;;;2347:17:0;;;;;;;2380:40;;2330:6;;;2347:17;2330:6;;2380:40;;2311:16;;2380:40;2300:128;2237:191;:::o;4196:507::-;-1:-1:-1;;;;;4293:18:0;;;;;;:38;;-1:-1:-1;;;;;;4315:16:0;;;;4293:38;4285:53;;;;-1:-1:-1;;;4285:53:0;;22289:2:1;4285:53:0;;;22271:21:1;22328:1;22308:18;;;22301:29;-1:-1:-1;;;22346:18:1;;;22339:32;22388:18;;4285:53:0;22087:325:1;4285:53:0;4349:38;4370:4;4376:2;4380:6;4349:20;:38::i;:::-;-1:-1:-1;;;;;4420:15:0;;4398:19;4420:15;;;;;;;;;;;4454:21;;;;4446:36;;;;-1:-1:-1;;;4446:36:0;;22619:2:1;4446:36:0;;;22601:21:1;22658:1;22638:18;;;22631:29;-1:-1:-1;;;22676:18:1;;;22669:32;22718:18;;4446:36:0;22417:325:1;4446:36:0;-1:-1:-1;;;;;4518:15:0;;;:9;:15;;;;;;;;;;;4536:20;;;4518:38;;4571:13;;;;;;;;;;:23;;;;;;4621:26;;816:25:1;;;4571:13:0;;4621:26;;789:18:1;4621:26:0;;;;;;;4658:37;4678:4;4684:2;4688:6;4658:19;:37::i;14481:779::-;14576:13;;-1:-1:-1;;;;;14565:24:0;;;14576:13;;14565:24;;;;:52;;-1:-1:-1;;;;;;14593:24:0;;14612:4;14593:24;;14565:52;14561:692;;;14638:14;:36;;;;-1:-1:-1;;;;;;14657:17:0;;;;;;:8;:17;;;;;;;;14656:18;14638:36;14634:608;;;-1:-1:-1;;;;;;14695:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;14695:24:0;14715:4;14695:24;;;;;;14738:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;14738:21:0;;;;;;21855:936::o;14634:608::-;14786:14;14785:15;:36;;;;-1:-1:-1;;;;;;14804:17:0;;;;;;:8;:17;;;;;;;;14785:36;14781:461;;;-1:-1:-1;;;;;14842:17:0;;14862:5;14842:17;;;:8;:17;;;;;:25;;-1:-1:-1;;14842:25:0;;;14950:277;14974:7;:14;14970:18;;14950:277;;;15036:7;-1:-1:-1;;;;;15022:21:0;:7;15030:1;15022:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;15022:10:0;:21;15018:190;;15085:7;15093:14;;:18;;15110:1;;15093:18;:::i;:::-;15085:27;;;;;;;;:::i;:::-;;;;;;;;;;;15072:7;:10;;-1:-1:-1;;;;;15085:27:0;;;;15080:1;;15072:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;15072:40:0;;;;;-1:-1:-1;;;;;15072:40:0;;;;;;15139:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;15139:13:0;;;;;-1:-1:-1;;;;;;15139:13:0;;;;;;15179:5;;15018:190;14990:3;;;;:::i;:::-;;;;14950:277;;14:250:1;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269: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:461::-;2596:3;2634:5;2628:12;2661:6;2656:3;2649:19;2687:4;2716:2;2711:3;2707:12;2700:19;;2753:2;2746:5;2742:14;2774:1;2784:195;2798:6;2795:1;2792:13;2784:195;;;2863:13;;-1:-1:-1;;;;;2859:39:1;2847:52;;2919:12;;;;2954:15;;;;2895:1;2813:9;2784:195;;;-1:-1:-1;2995:3:1;;2543:461;-1:-1:-1;;;;;2543:461:1:o;3009:261::-;3188:2;3177:9;3170:21;3151:4;3208:56;3260:2;3249:9;3245:18;3237:6;3208:56;:::i;:::-;3200:64;3009:261;-1:-1:-1;;;3009:261:1:o;3508:247::-;3567:6;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;3760:248::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;-1:-1:-1;;3928:23:1;;;3998:2;3983:18;;;3970:32;;-1:-1:-1;3760:248:1:o;4013:388::-;4081:6;4089;4142:2;4130:9;4121:7;4117:23;4113:32;4110:52;;;4158:1;4155;4148:12;4110:52;4197:9;4184:23;4216:31;4241:5;4216:31;:::i;:::-;4266:5;-1:-1:-1;4323:2:1;4308:18;;4295:32;4336:33;4295:32;4336:33;:::i;:::-;4388:7;4378:17;;;4013:388;;;;;:::o;4640:380::-;4719:1;4715:12;;;;4762;;;4783:61;;4837:4;4829:6;4825:17;4815:27;;4783:61;4890:2;4882:6;4879:14;4859:18;4856:38;4853:161;;4936:10;4931:3;4927:20;4924:1;4917:31;4971:4;4968:1;4961:15;4999:4;4996:1;4989:15;4853:161;;4640:380;;;:::o;6598:184::-;6668:6;6721:2;6709:9;6700:7;6696:23;6692:32;6689:52;;;6737:1;6734;6727:12;6689:52;-1:-1:-1;6760:16:1;;6598:184;-1:-1:-1;6598:184:1:o;7729:306::-;7817:6;7825;7833;7886:2;7874:9;7865:7;7861:23;7857:32;7854:52;;;7902:1;7899;7892:12;7854:52;7931:9;7925:16;7915:26;;7981:2;7970:9;7966:18;7960:25;7950:35;;8025:2;8014:9;8010:18;8004:25;7994:35;;7729:306;;;;;:::o;8700:274::-;-1:-1:-1;;;;;8892:32:1;;;;8874:51;;8956:2;8941:18;;8934:34;8862:2;8847:18;;8700:274::o;8979:277::-;9046:6;9099:2;9087:9;9078:7;9074:23;9070:32;9067:52;;;9115:1;9112;9105:12;9067:52;9147:9;9141:16;9200:5;9193:13;9186:21;9179:5;9176:32;9166:60;;9222:1;9219;9212:12;9921:127;9982:10;9977:3;9973:20;9970:1;9963:31;10013:4;10010:1;10003:15;10037:4;10034:1;10027:15;10053:125;10118:9;;;10139:10;;;10136:36;;;10152:18;;:::i;10183:375::-;-1:-1:-1;;;;;10441:15:1;;;10423:34;;10493:15;;;;10488:2;10473:18;;10466:43;10540:2;10525:18;;10518:34;;;;10373:2;10358:18;;10183:375::o;11225:168::-;11298:9;;;11329;;11346:15;;;11340:22;;11326:37;11316:71;;11367:18;;:::i;11398:217::-;11438:1;11464;11454:132;;11508:10;11503:3;11499:20;11496:1;11489:31;11543:4;11540:1;11533:15;11571:4;11568:1;11561:15;11454:132;-1:-1:-1;11600:9:1;;11398:217::o;11620:128::-;11687:9;;;11708:11;;;11705:37;;;11722:18;;:::i;12413:179::-;12448:3;12490:1;12472:16;12469:23;12466:120;;;12536:1;12533;12530;12515:23;-1:-1:-1;12573:1:1;12567:8;12562:3;12558:18;12466:120;12413:179;:::o;12729:346::-;12839:2;12820:13;;-1:-1:-1;;12816:27:1;12804:40;;12874:18;12859:34;;12895:22;;;12856:62;12853:185;;;12960:10;12955:3;12951:20;12948:1;12941:31;12995:4;12992:1;12985:15;13023:4;13020:1;13013:15;12853:185;13054:2;13047:22;-1:-1:-1;;12729:346:1:o;13080:671::-;13119:3;13161:4;13143:16;13140:26;13137:39;;;13080:671;:::o;13137:39::-;13203:2;13197:9;-1:-1:-1;;13268:16:1;13264:25;;13261:1;13197:9;13240:50;13319:4;13313:11;13343:16;13378:18;13449:2;13442:4;13434:6;13430:17;13427:25;13422:2;13414:6;13411:14;13408:45;13405:58;;;13456:5;;;;;13080:671;:::o;13405:58::-;13493:6;13487:4;13483:17;13472:28;;13529:3;13523:10;13556:2;13548:6;13545:14;13542:27;;;13562:5;;;;;;13080:671;:::o;13542:27::-;13646:2;13627:16;13621:4;13617:27;13613:36;13606:4;13597:6;13592:3;13588:16;13584:27;13581:69;13578:82;;;13653:5;;;;;;13080:671;:::o;13578:82::-;13669:57;13720:4;13711:6;13703;13699:19;13695:30;13689:4;13669:57;:::i;:::-;-1:-1:-1;13742:3:1;;13080:671;-1:-1:-1;;;;;13080:671:1:o;13756:434::-;-1:-1:-1;;;14013:3:1;14006:19;13988:3;14054:6;14048:13;14070:74;14137:6;14133:1;14128:3;14124:11;14117:4;14109:6;14105:17;14070:74;:::i;:::-;14164:16;;;;14182:1;14160:24;;13756:434;-1:-1:-1;;13756:434:1:o;15164:251::-;15234:6;15287:2;15275:9;15266:7;15262:23;15258:32;15255:52;;;15303:1;15300;15293:12;15255:52;15335:9;15329:16;15354:31;15379:5;15354:31;:::i;16080:325::-;16282:2;16264:21;;;16321:1;16301:18;;;16294:29;-1:-1:-1;;;16354:2:1;16339:18;;16332:32;16396:2;16381:18;;16080:325::o;17070:434::-;-1:-1:-1;;;17327:3:1;17320:19;17302:3;17368:6;17362:13;17384:74;17451:6;17447:1;17442:3;17438:11;17431:4;17423:6;17419:17;17384:74;:::i;19819:127::-;19880:10;19875:3;19871:20;19868:1;19861:31;19911:4;19908:1;19901:15;19935:4;19932:1;19925:15;19951:582;20250:6;20239:9;20232:25;20293:6;20288:2;20277:9;20273:18;20266:34;20336:3;20331:2;20320:9;20316:18;20309:31;20213:4;20357:57;20409:3;20398:9;20394:19;20386:6;20357:57;:::i;:::-;-1:-1:-1;;;;;20450:32:1;;;;20445:2;20430:18;;20423:60;-1:-1:-1;20514:3:1;20499:19;20492:35;20349:65;19951:582;-1:-1:-1;;;19951:582:1:o;20538:324::-;20740:2;20722:21;;;20779:1;20759:18;;;20752:29;-1:-1:-1;;;20812:2:1;20797:18;;20790:31;20853:2;20838:18;;20538:324::o;21947:135::-;21986:3;22007:17;;;22004:43;;22027:18;;:::i;:::-;-1:-1:-1;22074:1:1;22063:13;;21947:135::o;22747:127::-;22808:10;22803:3;22799:20;22796:1;22789:31;22839:4;22836:1;22829:15;22863:4;22860:1;22853:15

Swarm Source

ipfs://c1d8affd27ef60ef3f39b8411ac0d0c59d161493f1d475fc7a0dcef036f2136b

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.