Token AkaiTsuki

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
1,000,000,000 AKT

Holders:
216 addresses
Contract:
0x6e1cee01Aa91142F191db0E99C4DA50A1a54141a0x6e1cee01Aa91142F191db0E99C4DA50A1a54141a

Decimals:
18

Social Profiles:
Not Available, Update ?

Balance
5,308,932.021692424928406932 AKT

Value
$0.00
0x7dae8fbcc37f67cb1ca02b959fa97c1473bd3a63
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AkaiTsuki

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-04-03
*/

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

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

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

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

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

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

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

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

interface IBEP20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool); 
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IBEP20Metadata is IBEP20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract BEP20 is Context, IBEP20, IBEP20Metadata {
    using SafeMath for uint256;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue,
                "BEP20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount,"BEP20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

        _beforeTokenTransfer(address(0), account, amount);

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

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

abstract contract Ownable is Context {

    address private _owner;

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

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

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

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

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint256);

    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r,
                    bytes32 s) external;

    event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out,
               uint256 amount1Out, address indexed to);
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1,
                                                  uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);

    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

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

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

    function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired,
                          uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline)
                          external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

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

    function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin,
                             uint256 amountBMin, address to, uint256 deadline) 
                             external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin,
                                uint256 amountETHMin, address to, uint256 deadline) 
                                external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity,
                                       uint256 amountAMin, uint256 amountBMin, address to,
                                       uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) 
                                       external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin,
                                          uint256 amountETHMin, address to, uint256 deadline,
                                          bool approveMax, uint8 v, bytes32 r, bytes32 s) 
                                          external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path,
                                      address to, uint256 deadline) 
                                      external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] calldata path,
                                      address to, uint256 deadline) 
                                      external returns (uint256[] memory amounts);

    function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to,
                                   uint256 deadline) 
                                   external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] calldata path,
                                   address to, uint256 deadline) 
                                   external returns (uint256[] memory amounts);

    function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path,
                                   address to, uint256 deadline) 
                                   external returns (uint256[] memory amounts);

    function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to,
                                   uint256 deadline) 
                                   external payable returns (uint256[] memory amounts);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) 
                   external pure returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) 
                          external pure returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) 
                         external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
                           external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
                          external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity,
        uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) 
        external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity,
        uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax,
        uint8 v, bytes32 r, bytes32 s) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin,
        address[] calldata path, address to, uint256 deadline) external;

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

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

contract AkaiTsuki is BEP20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    bool private swapping;
    bool public tradingEnabled = false;

    mapping (address => uint256) _balances;

    uint256 public sellAmount = 0;
    uint256 public buyAmount = 0;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    address payable public marketingWallet;
    address payable public devWallet;

    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;

    bool public swapAndLiquifyEnabled = true;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    bool public limitsInEffect = true; 
    uint256 private gasPriceLimit = 7 * 1 gwei; 
    mapping(address => uint256) private _holderLastTransferBlock;
    mapping(address => uint256) private _holderLastTransferTimestamp; 
    uint256 public cooldowntimer = 60; 

    event EnableSwapAndLiquify(bool enabled);
    event SetPreSaleWallet(address wallet);
    event updateMarketingWallet(address wallet);
    event updateDevWallet(address wallet);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event TradingEnabled();

    event UpdateFees(uint256 sellMarketingFees, uint256 sellLiquidityFee, uint256 buyMarketingFees,
                     uint256 buyLiquidityFee, uint256 buyDevFee, uint256 sellDevFee);

    event Airdrop(address holder, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendDividends(uint256 opAmount, bool success);
    event WithdrawStuckFunds(uint256 sellDevFee);

    constructor() BEP20("AkaiTsuki", "AKT") {
        marketingWallet = payable(0x8CF3a34f740C147FFe81239A8A61ffacCFc690A3);
        devWallet = payable(0x8CF3a34f740C147FFe81239A8A61ffacCFc690A3);
        address router = 0x145677FC4d9b8F19B5D56d1820c48e0443049a30;

        buyMarketingFees = 6;
        sellMarketingFees = 6;
        buyLiquidityFee = 4;
        sellLiquidityFee = 4;
        buyDevFee = 0;
        sellDevFee = 0;

        totalBuyFees = buyMarketingFees.add(buyLiquidityFee).add(buyDevFee);
        totalSellFees = sellMarketingFees.add(sellLiquidityFee).add(sellDevFee);

        uniswapV2Router = IUniswapV2Router02(router);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this), uniswapV2Router.WETH());

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[marketingWallet] = true;

        uint256 _totalSupply = (1_000_000_000) * (10**18);
        _mint(owner(), _totalSupply); // only time internal mint function is ever called is to create supply
        maxWallet = _totalSupply / 50; // 2%
        swapTokensAtAmount = _totalSupply / 200; // 0.5%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

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

    receive() external payable {}

    function enableTrading() external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        emit TradingEnabled();
    }
    
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }

    function setDevWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        devWallet = payable(wallet);
        emit updateDevWallet(wallet);
    }
    
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setCanTransferBefore(address wallet, bool enable) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

    function Sweep() external onlyOwner {
        uint256 amountBNB = address(this).balance;
        payable(msg.sender).transfer(amountBNB);
    }

    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount;
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function transferAdmin(address newOwner) public onlyOwner {
        _isExcludedFromFees[newOwner] = true;
        canTransferBeforeTradingIsEnabled[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateFees(uint256 marketingBuy, uint256 marketingSell, uint256 liquidityBuy,
                        uint256 liquiditySell, uint256 devBuy, uint256 devSell) public onlyOwner {

        require(liquidityBuy <= 10 && liquiditySell <= 10, "Liquidity fees can't exceed 6%");
        require(marketingBuy <= 10 && marketingSell <= 10, "Marketing fees can't exceed 6%");
        require(devBuy <= 2 && devSell <= 2, "Dev fees can't exceed 2%");

        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        buyDevFee = devBuy;
        sellDevFee = devSell;

        totalSellFees = sellMarketingFees.add(sellLiquidityFee).add(sellDevFee);
        totalBuyFees = buyMarketingFees.add(buyLiquidityFee).add(sellDevFee);

        emit UpdateFees(sellMarketingFees, sellLiquidityFee, sellDevFee, buyMarketingFees,
                        buyLiquidityFee, buyDevFee);
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

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

        require(from != address(0), "IBEP20: transfer from the zero address");
        require(to != address(0), "IBEP20: transfer to the zero address");

        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 devFee;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");          
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 
        
        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            if (isSelling) {
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                devFee = sellDevFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;
                }
            } 
            
            else {
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                devFee = buyDevFee;

                if (limitsInEffect) {
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferBlock[tx.origin] = block.number;
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;
            }
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,
                    "Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = marketingFees.add(liquidityFee).add(devFee);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 0;
                sellAmount = 0;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);

            amount = amount.sub(fees);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

            super._transfer(from, address(this), fees);
           
        }

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


    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function withdrawStuckFunds(uint256 amount) public onlyOwner {

    sellDevFee = amount;
        
    emit WithdrawStuckFunds(sellDevFee);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);

        bool success = true;
        bool successOp1 = true;
        
        uint256 _marketDevTotal = sellMarketingFees.add(sellDevFee) + buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_marketDevTotal > 0) {
            feePortions = address(this).balance.div(_marketDevTotal);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 devPayout = buyDevFee.add(sellDevFee) * feePortions;
        
        if (marketingPayout > 0) {
            (success, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        
        if (devPayout > 0) {
            (successOp1, ) = address(devWallet).call{value: devPayout}("");
        }

        emit SendDividends(
            marketingPayout,
            success && successOp1
        );
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(
            airdropWallets.length == amount.length,
            "Arrays must be the same length"
        );
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i];
            super._transfer(msg.sender, wallet, airdropAmount);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","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":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"WithdrawStuckFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"inputs":[],"name":"Sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600760156101000a81548160ff02191690831515021790555060006009556000600a556001601760006101000a81548160ff0219169083151502179055506001601b60006101000a81548160ff0219169083151502179055506401a13b8600601c55603c601f553480156200007a57600080fd5b506040518060400160405280600981526020017f416b61695473756b6900000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f414b5400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000ff92919062000ad3565b5080600490805190602001906200011892919062000ad3565b50505060006200012d620007e960201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350738cf3a34f740c147ffe81239a8a61ffaccfc690a3600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738cf3a34f740c147ffe81239a8a61ffaccfc690a3600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073145677fc4d9b8f19b5d56d1820c48e0443049a309050600660138190555060066011819055506004601481905550600460128190555060006015819055506000601681905550620002f8601554620002e4601454601354620007f160201b620026f41790919060201c565b620007f160201b620026f41790919060201c565b600c819055506200033760165462000323601254601154620007f160201b620026f41790919060201c565b620007f160201b620026f41790919060201c565b600b8190555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000412919062000bed565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200049c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c2919062000bed565b6040518363ffffffff1660e01b8152600401620004e192919062000c30565b6020604051808303816000875af115801562000501573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000527919062000bed565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200059c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200085460201b60201c565b6001601860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006b033b2e3c9fd0803ce80000009050620006f8620006eb620008f560201b60201c565b826200091f60201b60201c565b60328162000707919062000cc5565b600f8190555060c8816200071c919062000cc5565b6010819055506001601a600062000738620008f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505062000ee2565b600033905090565b600080828462000802919062000cfd565b9050838110156200084a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008419062000dbb565b60405180910390fd5b8091505092915050565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009899062000e2d565b60405180910390fd5b620009a66000838362000ace60201b60201c565b620009c281600254620007f160201b620026f41790919060201c565b60028190555062000a20816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620007f160201b620026f41790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000ac2919062000e60565b60405180910390a35050565b505050565b82805462000ae19062000eac565b90600052602060002090601f01602090048101928262000b05576000855562000b51565b82601f1062000b2057805160ff191683800117855562000b51565b8280016001018555821562000b51579182015b8281111562000b5057825182559160200191906001019062000b33565b5b50905062000b60919062000b64565b5090565b5b8082111562000b7f57600081600090555060010162000b65565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bb58262000b88565b9050919050565b62000bc78162000ba8565b811462000bd357600080fd5b50565b60008151905062000be78162000bbc565b92915050565b60006020828403121562000c065762000c0562000b83565b5b600062000c168482850162000bd6565b91505092915050565b62000c2a8162000ba8565b82525050565b600060408201905062000c47600083018562000c1f565b62000c56602083018462000c1f565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000cd28262000c5d565b915062000cdf8362000c5d565b92508262000cf25762000cf162000c67565b5b828204905092915050565b600062000d0a8262000c5d565b915062000d178362000c5d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d4f5762000d4e62000c96565b5b828201905092915050565b600082825260208201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600062000da3601b8362000d5a565b915062000db08262000d6b565b602082019050919050565b6000602082019050818103600083015262000dd68162000d94565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e15601f8362000d5a565b915062000e228262000ddd565b602082019050919050565b6000602082019050818103600083015262000e488162000e06565b9050919050565b62000e5a8162000c5d565b82525050565b600060208201905062000e77600083018462000e4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ec557607f821691505b6020821081141562000edc5762000edb62000e7d565b5b50919050565b6154f98062000ef26000396000f3fe6080604052600436106102cd5760003560e01c8063715018a611610175578063a0d82dc5116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d314610add578063f2fde38b14610b08578063f637434214610b31578063f8b45b0514610b5c576102d4565b8063dd62ed3e14610a4c578063df41a77314610a89578063e2f4560514610ab2576102d4565b8063a0d82dc514610918578063a457c2d714610943578063a9059cbb14610980578063b62496f5146109bd578063b74e3b11146109fa578063d5e3725114610a23576102d4565b80638ea5220f1161012e5780638ea5220f1461081a57806395451c291461084557806395d89b4114610870578063992c58e41461089b5780639a7a23d6146108c45780639c3b4fdc146108ed576102d4565b8063715018a61461074457806375829def1461075b57806375f0a874146107845780637fdde05c146107af5780638a8c523c146107d85780638da5cb5b146107ef576102d4565b806339509351116102345780634fbee193116101ed5780635eee4bae116101c75780635eee4bae1461069e578063679ca6e9146106c75780637088fb7f146106f057806370a0823114610707576102d4565b80634fbee1931461060d5780635124f8741461064a5780635d098b3814610675576102d4565b806339509351146104f95780633f407b841461053657806349bd5a5e146105615780634a62bb651461058c5780634a74bb02146105b75780634ada218b146105e2576102d4565b80631d7b1fb4116102865780631d7b1fb4146103e95780631f53ac02146104145780631fa705311461043d5780632307b4411461046857806323b872dd14610491578063313ce567146104ce576102d4565b806305ca5f08146102d957806306fdde031461030257806308dfe8a51461032d578063095ea7b3146103565780631694505e1461039357806318160ddd146103be576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190613d4d565b610b87565b005b34801561030e57600080fd5b50610317610cd4565b6040516103249190613e13565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613ecb565b610d66565b005b34801561036257600080fd5b5061037d60048036038101906103789190613f0b565b610ea6565b60405161038a9190613f5a565b60405180910390f35b34801561039f57600080fd5b506103a8610ec4565b6040516103b59190613fd4565b60405180910390f35b3480156103ca57600080fd5b506103d3610eea565b6040516103e09190613ffe565b60405180910390f35b3480156103f557600080fd5b506103fe610ef4565b60405161040b9190613ffe565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190614019565b610efa565b005b34801561044957600080fd5b50610452611064565b60405161045f9190613ffe565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190614251565b61106a565b005b34801561049d57600080fd5b506104b860048036038101906104b391906142c9565b6111b4565b6040516104c59190613f5a565b60405180910390f35b3480156104da57600080fd5b506104e361128d565b6040516104f09190614338565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613f0b565b611296565b60405161052d9190613f5a565b60405180910390f35b34801561054257600080fd5b5061054b611349565b6040516105589190613ffe565b60405180910390f35b34801561056d57600080fd5b5061057661134f565b6040516105839190614362565b60405180910390f35b34801561059857600080fd5b506105a1611375565b6040516105ae9190613f5a565b60405180910390f35b3480156105c357600080fd5b506105cc611388565b6040516105d99190613f5a565b60405180910390f35b3480156105ee57600080fd5b506105f761139b565b6040516106049190613f5a565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614019565b6113ae565b6040516106419190613f5a565b60405180910390f35b34801561065657600080fd5b5061065f611404565b60405161066c9190613ffe565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614019565b61140a565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613d4d565b611574565b005b3480156106d357600080fd5b506106ee60048036038101906106e9919061437d565b611615565b005b3480156106fc57600080fd5b506107056116c9565b005b34801561071357600080fd5b5061072e60048036038101906107299190614019565b6117af565b60405161073b9190613ffe565b60405180910390f35b34801561075057600080fd5b506107596117f7565b005b34801561076757600080fd5b50610782600480360381019061077d9190614019565b61194f565b005b34801561079057600080fd5b50610799611aa2565b6040516107a691906143cb565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d19190613ecb565b611ac8565b005b3480156107e457600080fd5b506107ed611bba565b005b3480156107fb57600080fd5b50610804611cb4565b6040516108119190614362565b60405180910390f35b34801561082657600080fd5b5061082f611cde565b60405161083c91906143cb565b60405180910390f35b34801561085157600080fd5b5061085a611d04565b6040516108679190613ffe565b60405180910390f35b34801561087c57600080fd5b50610885611d0a565b6040516108929190613e13565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906143e6565b611d9c565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190613ecb565b612007565b005b3480156108f957600080fd5b506109026120ac565b60405161090f9190613ffe565b60405180910390f35b34801561092457600080fd5b5061092d6120b2565b60405161093a9190613ffe565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613f0b565b6120b8565b6040516109779190613f5a565b60405180910390f35b34801561098c57600080fd5b506109a760048036038101906109a29190613f0b565b612185565b6040516109b49190613f5a565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614019565b6121a3565b6040516109f19190613f5a565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190613d4d565b6121c3565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a45919061437d565b6122a9565b005b348015610a5857600080fd5b50610a736004803603810190610a6e9190614473565b6123b4565b604051610a809190613ffe565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190613d4d565b61243b565b005b348015610abe57600080fd5b50610ac7612515565b604051610ad49190613ffe565b60405180910390f35b348015610ae957600080fd5b50610af261251b565b604051610aff9190613ffe565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190614019565b612521565b005b348015610b3d57600080fd5b50610b466126e8565b604051610b539190613ffe565b60405180910390f35b348015610b6857600080fd5b50610b716126ee565b604051610b7e9190613ffe565b60405180910390f35b610b8f612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c15906144ff565b60405180910390fd5b6000610c37600954600a546126f490919063ffffffff16565b90506000610c6282610c54600a548661275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000610c8d83610c7f6009548761275a90919063ffffffff16565b6127d590919063ffffffff16565b9050610c988461281f565b610cad82600a54612a6690919063ffffffff16565b600a81905550610cc881600954612a6690919063ffffffff16565b60098190555050505050565b606060038054610ce39061454e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0f9061454e565b8015610d5c5780601f10610d3157610100808354040283529160200191610d5c565b820191906000526020600020905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b610d6e612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906144ff565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051610e9a9190613f5a565b60405180910390a25050565b6000610eba610eb3612752565b8484612ab0565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b601f5481565b610f02612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f88906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa816040516110599190614362565b60405180910390a150565b600a5481565b611072612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f8906144ff565b60405180910390fd5b8051825114611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906145cc565b60405180910390fd5b60005b82518110156111af576000838281518110611166576111656145ec565b5b602002602001015190506000838381518110611185576111846145ec565b5b6020026020010151905061119a338383612c7b565b505080806111a79061464a565b915050611148565b505050565b60006111c1848484612f10565b611282846111cd612752565b61127d8560405180606001604052806028815260200161545160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611233612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b612ab0565b600190509392505050565b60006012905090565b600061133f6112a3612752565b8461133a85600160006112b4612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f490919063ffffffff16565b612ab0565b6001905092915050565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b60009054906101000a900460ff1681565b601760009054906101000a900460ff1681565b600760159054906101000a900460ff1681565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60135481565b611412612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c224433816040516115699190614362565b60405180910390a150565b61157c612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906144ff565b60405180910390fd5b8060108190555050565b61161d612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906144ff565b60405180910390fd5b80601b60006101000a81548160ff02191690831515021790555050565b6116d1612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906144ff565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117ab573d6000803e3d6000fd5b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ff612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461188e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611885906144ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611957612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a9f81612521565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ad0612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906144ff565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611bc2612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906144ff565b60405180910390fd5b600760159054906101000a900460ff1615611c6b57600080fd5b6001600760156101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b606060048054611d199061454e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d459061454e565b8015611d925780601f10611d6757610100808354040283529160200191611d92565b820191906000526020600020905b815481529060010190602001808311611d7557829003601f168201915b5050505050905090565b611da4612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a906144ff565b60405180910390fd5b600a8411158015611e455750600a8311155b611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b906146df565b60405180910390fd5b600a8611158015611e965750600a8511155b611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061474b565b60405180910390fd5b60028211158015611ee7575060028111155b611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d906147b7565b60405180910390fd5b856013819055508360148190555084601181905550826012819055508160158190555080601681905550611f7b601654611f6d6012546011546126f490919063ffffffff16565b6126f490919063ffffffff16565b600b81905550611fac601654611f9e6014546013546126f490919063ffffffff16565b6126f490919063ffffffff16565b600c819055507ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff601154601254601654601354601454601554604051611ff7969594939291906147d7565b60405180910390a1505050505050565b61200f612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612095906144ff565b60405180910390fd5b6120a88282613832565b5050565b60155481565b60165481565b600061217b6120c5612752565b846121768560405180606001604052806025815260200161549f60259139600160006120ef612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b612ab0565b6001905092915050565b6000612199612192612752565b8484612f10565b6001905092915050565b60196020528060005260406000206000915054906101000a900460ff1681565b6121cb612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612251906144ff565b60405180910390fd5b61012c81111561229f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612296906148aa565b60405180910390fd5b80601f8190555050565b6122b1612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612337906144ff565b60405180910390fd5b801515601760009054906101000a900460ff161515141561236057600080fd5b80601760006101000a81548160ff0219169083151502179055507fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef816040516123a99190613f5a565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612443612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c9906144ff565b60405180910390fd5b806016819055507f6d41fb6a7900b4f6e4e6ec1a810032b2621f037e2cf43624c765699c28af20dd60165460405161250a9190613ffe565b60405180910390a150565b60105481565b60145481565b612529612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125af906144ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f9061493c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b600f5481565b6000808284612703919061495c565b905083811015612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906149fe565b60405180910390fd5b8091505092915050565b600033905090565b60008083141561276d57600090506127cf565b6000828461277b9190614a1e565b905082848261278a9190614aa7565b146127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190614b4a565b60405180910390fd5b809150505b92915050565b600061281783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138d3565b905092915050565b600081141561282d57612a63565b61283681613936565b600060019050600060019050600061285b6015546013546126f490919063ffffffff16565b6128726016546011546126f490919063ffffffff16565b61287c919061495c565b905060008082111561289e5761289b82476127d590919063ffffffff16565b90505b6000816128b86011546013546126f490919063ffffffff16565b6128c29190614a1e565b90506000826128de6016546015546126f490919063ffffffff16565b6128e89190614a1e565b9050600082111561298257600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161293990614b9b565b60006040518083038185875af1925050503d8060008114612976576040519150601f19603f3d011682016040523d82523d6000602084013e61297b565b606091505b5050809650505b6000811115612a1a57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516129d190614b9b565b60006040518083038185875af1925050503d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b5050809550505b7f31ea026303a62d39c4ad14716f9621f1afe3242309c2ed761d4e241ae4bf2ea982878015612a465750865b604051612a54929190614bb0565b60405180910390a15050505050505b50565b6000612aa883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137ce565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790614c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614cdd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c6e9190613ffe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614d6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614e01565b60405180910390fd5b612d66838383613b79565b612dd181604051806060016040528060268152602001615479602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e64816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f039190613ffe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614e93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe790614f25565b60405180910390fd5b6000806000601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661309657600760159054906101000a900460ff16613095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308c90614f91565b60405180910390fd5b5b60008414156130b3576130ab86866000612c7b565b5050506137c9565b600760149054906101000a900460ff1615801561311a5750601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131705750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156137ba576000601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905080156132c957601154935060125492506016549150601b60009054906101000a900460ff16156132c457601f54601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323d919061495c565b42101561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327690614ffd565b60405180910390fd5b42601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61352b565b601354935060145492506015549150601b60009054906101000a900460ff16156134cc57601c543a1115613332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332990615069565b60405180910390fd5b43601d60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab906150d5565b60405180910390fd5b601f54601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613401919061495c565b421015613443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343a90614ffd565b60405180910390fd5b43601d60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60006134d7876117af565b9050600f5486826134e8919061495c565b1115613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090615167565b60405180910390fd5b505b60006135528361354486886126f490919063ffffffff16565b6126f490919063ffffffff16565b9050600061355f306117af565b9050600060105482101590508080156135c25750601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613728576001600760146101000a81548160ff021916908315150217905550601760009054906101000a900460ff16156136e5576000613610600954600a546126f490919063ffffffff16565b9050600061363b8261362d600a548761275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000613666836136586009548861275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000613691600c546136838c8661275a90919063ffffffff16565b6127d590919063ffffffff16565b905060006136bc600b546136ae8d8661275a90919063ffffffff16565b6127d590919063ffffffff16565b905060006136d383836126f490919063ffffffff16565b90506136de81613b7e565b5050505050505b60006136f0306117af565b90506136fb8161281f565b6000600a8190555060006009819055506000600760146101000a81548160ff021916908315150217905550505b60006137506064613742868c61275a90919063ffffffff16565b6127d590919063ffffffff16565b9050613765818a612a6690919063ffffffff16565b9850841561378d57613782816009546126f490919063ffffffff16565b6009819055506137a9565b6137a281600a546126f490919063ffffffff16565b600a819055505b6137b48b3083612c7b565b50505050505b6137c5868686612c7b565b5050505b505050565b6000838311158290613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d9190613e13565b60405180910390fd5b50600083856138259190615187565b9050809150509392505050565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000808311829061391a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139119190613e13565b60405180910390fd5b50600083856139299190614aa7565b9050809150509392505050565b6000600267ffffffffffffffff8111156139535761395261404b565b5b6040519080825280602002602001820160405280156139815781602001602082028036833780820191505090505b5090503081600081518110613999576139986145ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6491906151d0565b81600181518110613a7857613a776145ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613adf30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ab0565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b439594939291906152f6565b600060405180830381600087803b158015613b5d57600080fd5b505af1158015613b71573d6000803e3d6000fd5b505050505050565b505050565b6000613b946002836127d590919063ffffffff16565b90506000613bab8284612a6690919063ffffffff16565b90506000479050613bbb83613936565b6000613bd08247612a6690919063ffffffff16565b9050613bdc8382613c1e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051613c0f93929190615350565b60405180910390a15050505050565b613c4b30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ab0565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613c97611cb4565b426040518863ffffffff1660e01b8152600401613cb996959493929190615387565b60606040518083038185885af1158015613cd7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613cfc91906153fd565b5050505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d2a81613d17565b8114613d3557600080fd5b50565b600081359050613d4781613d21565b92915050565b600060208284031215613d6357613d62613d0d565b5b6000613d7184828501613d38565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db4578082015181840152602081019050613d99565b83811115613dc3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613de582613d7a565b613def8185613d85565b9350613dff818560208601613d96565b613e0881613dc9565b840191505092915050565b60006020820190508181036000830152613e2d8184613dda565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6082613e35565b9050919050565b613e7081613e55565b8114613e7b57600080fd5b50565b600081359050613e8d81613e67565b92915050565b60008115159050919050565b613ea881613e93565b8114613eb357600080fd5b50565b600081359050613ec581613e9f565b92915050565b60008060408385031215613ee257613ee1613d0d565b5b6000613ef085828601613e7e565b9250506020613f0185828601613eb6565b9150509250929050565b60008060408385031215613f2257613f21613d0d565b5b6000613f3085828601613e7e565b9250506020613f4185828601613d38565b9150509250929050565b613f5481613e93565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b6000819050919050565b6000613f9a613f95613f9084613e35565b613f75565b613e35565b9050919050565b6000613fac82613f7f565b9050919050565b6000613fbe82613fa1565b9050919050565b613fce81613fb3565b82525050565b6000602082019050613fe96000830184613fc5565b92915050565b613ff881613d17565b82525050565b60006020820190506140136000830184613fef565b92915050565b60006020828403121561402f5761402e613d0d565b5b600061403d84828501613e7e565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61408382613dc9565b810181811067ffffffffffffffff821117156140a2576140a161404b565b5b80604052505050565b60006140b5613d03565b90506140c1828261407a565b919050565b600067ffffffffffffffff8211156140e1576140e061404b565b5b602082029050602081019050919050565b600080fd5b600061410a614105846140c6565b6140ab565b9050808382526020820190506020840283018581111561412d5761412c6140f2565b5b835b8181101561415657806141428882613e7e565b84526020840193505060208101905061412f565b5050509392505050565b600082601f83011261417557614174614046565b5b81356141858482602086016140f7565b91505092915050565b600067ffffffffffffffff8211156141a9576141a861404b565b5b602082029050602081019050919050565b60006141cd6141c88461418e565b6140ab565b905080838252602082019050602084028301858111156141f0576141ef6140f2565b5b835b8181101561421957806142058882613d38565b8452602084019350506020810190506141f2565b5050509392505050565b600082601f83011261423857614237614046565b5b81356142488482602086016141ba565b91505092915050565b6000806040838503121561426857614267613d0d565b5b600083013567ffffffffffffffff81111561428657614285613d12565b5b61429285828601614160565b925050602083013567ffffffffffffffff8111156142b3576142b2613d12565b5b6142bf85828601614223565b9150509250929050565b6000806000606084860312156142e2576142e1613d0d565b5b60006142f086828701613e7e565b935050602061430186828701613e7e565b925050604061431286828701613d38565b9150509250925092565b600060ff82169050919050565b6143328161431c565b82525050565b600060208201905061434d6000830184614329565b92915050565b61435c81613e55565b82525050565b60006020820190506143776000830184614353565b92915050565b60006020828403121561439357614392613d0d565b5b60006143a184828501613eb6565b91505092915050565b60006143b582613e35565b9050919050565b6143c5816143aa565b82525050565b60006020820190506143e060008301846143bc565b92915050565b60008060008060008060c0878903121561440357614402613d0d565b5b600061441189828a01613d38565b965050602061442289828a01613d38565b955050604061443389828a01613d38565b945050606061444489828a01613d38565b935050608061445589828a01613d38565b92505060a061446689828a01613d38565b9150509295509295509295565b6000806040838503121561448a57614489613d0d565b5b600061449885828601613e7e565b92505060206144a985828601613e7e565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144e9602083613d85565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456657607f821691505b6020821081141561457a5761457961451f565b5b50919050565b7f417272617973206d757374206265207468652073616d65206c656e6774680000600082015250565b60006145b6601e83613d85565b91506145c182614580565b602082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061465582613d17565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146885761468761461b565b5b600182019050919050565b7f4c697175696469747920666565732063616e2774206578636565642036250000600082015250565b60006146c9601e83613d85565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f4d61726b6574696e6720666565732063616e2774206578636565642036250000600082015250565b6000614735601e83613d85565b9150614740826146ff565b602082019050919050565b6000602082019050818103600083015261476481614728565b9050919050565b7f44657620666565732063616e2774206578636565642032250000000000000000600082015250565b60006147a1601883613d85565b91506147ac8261476b565b602082019050919050565b600060208201905081810360008301526147d081614794565b9050919050565b600060c0820190506147ec6000830189613fef565b6147f96020830188613fef565b6148066040830187613fef565b6148136060830186613fef565b6148206080830185613fef565b61482d60a0830184613fef565b979650505050505050565b7f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d60008201527f696e757465730000000000000000000000000000000000000000000000000000602082015250565b6000614894602683613d85565b915061489f82614838565b604082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614926602683613d85565b9150614931826148ca565b604082019050919050565b6000602082019050818103600083015261495581614919565b9050919050565b600061496782613d17565b915061497283613d17565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149a7576149a661461b565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006149e8601b83613d85565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b6000614a2982613d17565b9150614a3483613d17565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6d57614a6c61461b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ab282613d17565b9150614abd83613d17565b925082614acd57614acc614a78565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b34602183613d85565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b600081905092915050565b50565b6000614b85600083614b6a565b9150614b9082614b75565b600082019050919050565b6000614ba682614b78565b9150819050919050565b6000604082019050614bc56000830185613fef565b614bd26020830184613f4b565b9392505050565b7f42455032303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c35602483613d85565b9150614c4082614bd9565b604082019050919050565b60006020820190508181036000830152614c6481614c28565b9050919050565b7f42455032303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cc7602283613d85565b9150614cd282614c6b565b604082019050919050565b60006020820190508181036000830152614cf681614cba565b9050919050565b7f42455032303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614d59602583613d85565b9150614d6482614cfd565b604082019050919050565b60006020820190508181036000830152614d8881614d4c565b9050919050565b7f42455032303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614deb602383613d85565b9150614df682614d8f565b604082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f4942455032303a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e7d602683613d85565b9150614e8882614e21565b604082019050919050565b60006020820190508181036000830152614eac81614e70565b9050919050565b7f4942455032303a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f0f602483613d85565b9150614f1a82614eb3565b604082019050919050565b60006020820190508181036000830152614f3e81614f02565b9050919050565b7f54726164696e6720686173206e6f7420796574206265656e20656e61626c6564600082015250565b6000614f7b602083613d85565b9150614f8682614f45565b602082019050919050565b60006020820190508181036000830152614faa81614f6e565b9050919050565b7f636f6f6c646f776e20706572696f642061637469766500000000000000000000600082015250565b6000614fe7601683613d85565b9150614ff282614fb1565b602082019050919050565b6000602082019050818103600083015261501681614fda565b9050919050565b7f4761732070726963652065786365656473206c696d69742e0000000000000000600082015250565b6000615053601883613d85565b915061505e8261501d565b602082019050919050565b6000602082019050818103600083015261508281615046565b9050919050565b7f546f6f206d616e7920545820696e20626c6f636b000000000000000000000000600082015250565b60006150bf601483613d85565b91506150ca82615089565b602082019050919050565b600060208201905081810360008301526150ee816150b2565b9050919050565b7f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f60008201527f756e742e00000000000000000000000000000000000000000000000000000000602082015250565b6000615151602483613d85565b915061515c826150f5565b604082019050919050565b6000602082019050818103600083015261518081615144565b9050919050565b600061519282613d17565b915061519d83613d17565b9250828210156151b0576151af61461b565b5b828203905092915050565b6000815190506151ca81613e67565b92915050565b6000602082840312156151e6576151e5613d0d565b5b60006151f4848285016151bb565b91505092915050565b6000819050919050565b600061522261521d615218846151fd565b613f75565b613d17565b9050919050565b61523281615207565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61526d81613e55565b82525050565b600061527f8383615264565b60208301905092915050565b6000602082019050919050565b60006152a382615238565b6152ad8185615243565b93506152b883615254565b8060005b838110156152e95781516152d08882615273565b97506152db8361528b565b9250506001810190506152bc565b5085935050505092915050565b600060a08201905061530b6000830188613fef565b6153186020830187615229565b818103604083015261532a8186615298565b90506153396060830185614353565b6153466080830184613fef565b9695505050505050565b60006060820190506153656000830186613fef565b6153726020830185613fef565b61537f6040830184613fef565b949350505050565b600060c08201905061539c6000830189614353565b6153a96020830188613fef565b6153b66040830187615229565b6153c36060830186615229565b6153d06080830185614353565b6153dd60a0830184613fef565b979650505050505050565b6000815190506153f781613d21565b92915050565b60008060006060848603121561541657615415613d0d565b5b6000615424868287016153e8565b9350506020615435868287016153e8565b9250506040615446868287016153e8565b915050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f92ad2fb7d1ffb9f2303ce84241233f18a78303263a25a73029211af5a59a76964736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c8063715018a611610175578063a0d82dc5116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d314610add578063f2fde38b14610b08578063f637434214610b31578063f8b45b0514610b5c576102d4565b8063dd62ed3e14610a4c578063df41a77314610a89578063e2f4560514610ab2576102d4565b8063a0d82dc514610918578063a457c2d714610943578063a9059cbb14610980578063b62496f5146109bd578063b74e3b11146109fa578063d5e3725114610a23576102d4565b80638ea5220f1161012e5780638ea5220f1461081a57806395451c291461084557806395d89b4114610870578063992c58e41461089b5780639a7a23d6146108c45780639c3b4fdc146108ed576102d4565b8063715018a61461074457806375829def1461075b57806375f0a874146107845780637fdde05c146107af5780638a8c523c146107d85780638da5cb5b146107ef576102d4565b806339509351116102345780634fbee193116101ed5780635eee4bae116101c75780635eee4bae1461069e578063679ca6e9146106c75780637088fb7f146106f057806370a0823114610707576102d4565b80634fbee1931461060d5780635124f8741461064a5780635d098b3814610675576102d4565b806339509351146104f95780633f407b841461053657806349bd5a5e146105615780634a62bb651461058c5780634a74bb02146105b75780634ada218b146105e2576102d4565b80631d7b1fb4116102865780631d7b1fb4146103e95780631f53ac02146104145780631fa705311461043d5780632307b4411461046857806323b872dd14610491578063313ce567146104ce576102d4565b806305ca5f08146102d957806306fdde031461030257806308dfe8a51461032d578063095ea7b3146103565780631694505e1461039357806318160ddd146103be576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190613d4d565b610b87565b005b34801561030e57600080fd5b50610317610cd4565b6040516103249190613e13565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613ecb565b610d66565b005b34801561036257600080fd5b5061037d60048036038101906103789190613f0b565b610ea6565b60405161038a9190613f5a565b60405180910390f35b34801561039f57600080fd5b506103a8610ec4565b6040516103b59190613fd4565b60405180910390f35b3480156103ca57600080fd5b506103d3610eea565b6040516103e09190613ffe565b60405180910390f35b3480156103f557600080fd5b506103fe610ef4565b60405161040b9190613ffe565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190614019565b610efa565b005b34801561044957600080fd5b50610452611064565b60405161045f9190613ffe565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190614251565b61106a565b005b34801561049d57600080fd5b506104b860048036038101906104b391906142c9565b6111b4565b6040516104c59190613f5a565b60405180910390f35b3480156104da57600080fd5b506104e361128d565b6040516104f09190614338565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613f0b565b611296565b60405161052d9190613f5a565b60405180910390f35b34801561054257600080fd5b5061054b611349565b6040516105589190613ffe565b60405180910390f35b34801561056d57600080fd5b5061057661134f565b6040516105839190614362565b60405180910390f35b34801561059857600080fd5b506105a1611375565b6040516105ae9190613f5a565b60405180910390f35b3480156105c357600080fd5b506105cc611388565b6040516105d99190613f5a565b60405180910390f35b3480156105ee57600080fd5b506105f761139b565b6040516106049190613f5a565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614019565b6113ae565b6040516106419190613f5a565b60405180910390f35b34801561065657600080fd5b5061065f611404565b60405161066c9190613ffe565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614019565b61140a565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613d4d565b611574565b005b3480156106d357600080fd5b506106ee60048036038101906106e9919061437d565b611615565b005b3480156106fc57600080fd5b506107056116c9565b005b34801561071357600080fd5b5061072e60048036038101906107299190614019565b6117af565b60405161073b9190613ffe565b60405180910390f35b34801561075057600080fd5b506107596117f7565b005b34801561076757600080fd5b50610782600480360381019061077d9190614019565b61194f565b005b34801561079057600080fd5b50610799611aa2565b6040516107a691906143cb565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d19190613ecb565b611ac8565b005b3480156107e457600080fd5b506107ed611bba565b005b3480156107fb57600080fd5b50610804611cb4565b6040516108119190614362565b60405180910390f35b34801561082657600080fd5b5061082f611cde565b60405161083c91906143cb565b60405180910390f35b34801561085157600080fd5b5061085a611d04565b6040516108679190613ffe565b60405180910390f35b34801561087c57600080fd5b50610885611d0a565b6040516108929190613e13565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906143e6565b611d9c565b005b3480156108d057600080fd5b506108eb60048036038101906108e69190613ecb565b612007565b005b3480156108f957600080fd5b506109026120ac565b60405161090f9190613ffe565b60405180910390f35b34801561092457600080fd5b5061092d6120b2565b60405161093a9190613ffe565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613f0b565b6120b8565b6040516109779190613f5a565b60405180910390f35b34801561098c57600080fd5b506109a760048036038101906109a29190613f0b565b612185565b6040516109b49190613f5a565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614019565b6121a3565b6040516109f19190613f5a565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190613d4d565b6121c3565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a45919061437d565b6122a9565b005b348015610a5857600080fd5b50610a736004803603810190610a6e9190614473565b6123b4565b604051610a809190613ffe565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190613d4d565b61243b565b005b348015610abe57600080fd5b50610ac7612515565b604051610ad49190613ffe565b60405180910390f35b348015610ae957600080fd5b50610af261251b565b604051610aff9190613ffe565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190614019565b612521565b005b348015610b3d57600080fd5b50610b466126e8565b604051610b539190613ffe565b60405180910390f35b348015610b6857600080fd5b50610b716126ee565b604051610b7e9190613ffe565b60405180910390f35b610b8f612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c15906144ff565b60405180910390fd5b6000610c37600954600a546126f490919063ffffffff16565b90506000610c6282610c54600a548661275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000610c8d83610c7f6009548761275a90919063ffffffff16565b6127d590919063ffffffff16565b9050610c988461281f565b610cad82600a54612a6690919063ffffffff16565b600a81905550610cc881600954612a6690919063ffffffff16565b60098190555050505050565b606060038054610ce39061454e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0f9061454e565b8015610d5c5780601f10610d3157610100808354040283529160200191610d5c565b820191906000526020600020905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b610d6e612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906144ff565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051610e9a9190613f5a565b60405180910390a25050565b6000610eba610eb3612752565b8484612ab0565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b601f5481565b610f02612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f88906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa816040516110599190614362565b60405180910390a150565b600a5481565b611072612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f8906144ff565b60405180910390fd5b8051825114611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906145cc565b60405180910390fd5b60005b82518110156111af576000838281518110611166576111656145ec565b5b602002602001015190506000838381518110611185576111846145ec565b5b6020026020010151905061119a338383612c7b565b505080806111a79061464a565b915050611148565b505050565b60006111c1848484612f10565b611282846111cd612752565b61127d8560405180606001604052806028815260200161545160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611233612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b612ab0565b600190509392505050565b60006012905090565b600061133f6112a3612752565b8461133a85600160006112b4612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f490919063ffffffff16565b612ab0565b6001905092915050565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b60009054906101000a900460ff1681565b601760009054906101000a900460ff1681565b600760159054906101000a900460ff1681565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60135481565b611412612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c224433816040516115699190614362565b60405180910390a150565b61157c612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906144ff565b60405180910390fd5b8060108190555050565b61161d612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906144ff565b60405180910390fd5b80601b60006101000a81548160ff02191690831515021790555050565b6116d1612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611757906144ff565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117ab573d6000803e3d6000fd5b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ff612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461188e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611885906144ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611957612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd906144ff565b60405180910390fd5b6001601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a9f81612521565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ad0612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906144ff565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611bc2612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906144ff565b60405180910390fd5b600760159054906101000a900460ff1615611c6b57600080fd5b6001600760156101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b606060048054611d199061454e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d459061454e565b8015611d925780601f10611d6757610100808354040283529160200191611d92565b820191906000526020600020905b815481529060010190602001808311611d7557829003601f168201915b5050505050905090565b611da4612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a906144ff565b60405180910390fd5b600a8411158015611e455750600a8311155b611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b906146df565b60405180910390fd5b600a8611158015611e965750600a8511155b611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc9061474b565b60405180910390fd5b60028211158015611ee7575060028111155b611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1d906147b7565b60405180910390fd5b856013819055508360148190555084601181905550826012819055508160158190555080601681905550611f7b601654611f6d6012546011546126f490919063ffffffff16565b6126f490919063ffffffff16565b600b81905550611fac601654611f9e6014546013546126f490919063ffffffff16565b6126f490919063ffffffff16565b600c819055507ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff601154601254601654601354601454601554604051611ff7969594939291906147d7565b60405180910390a1505050505050565b61200f612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612095906144ff565b60405180910390fd5b6120a88282613832565b5050565b60155481565b60165481565b600061217b6120c5612752565b846121768560405180606001604052806025815260200161549f60259139600160006120ef612752565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b612ab0565b6001905092915050565b6000612199612192612752565b8484612f10565b6001905092915050565b60196020528060005260406000206000915054906101000a900460ff1681565b6121cb612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612251906144ff565b60405180910390fd5b61012c81111561229f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612296906148aa565b60405180910390fd5b80601f8190555050565b6122b1612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612337906144ff565b60405180910390fd5b801515601760009054906101000a900460ff161515141561236057600080fd5b80601760006101000a81548160ff0219169083151502179055507fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef816040516123a99190613f5a565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612443612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c9906144ff565b60405180910390fd5b806016819055507f6d41fb6a7900b4f6e4e6ec1a810032b2621f037e2cf43624c765699c28af20dd60165460405161250a9190613ffe565b60405180910390a150565b60105481565b60145481565b612529612752565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125af906144ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f9061493c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b600f5481565b6000808284612703919061495c565b905083811015612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f906149fe565b60405180910390fd5b8091505092915050565b600033905090565b60008083141561276d57600090506127cf565b6000828461277b9190614a1e565b905082848261278a9190614aa7565b146127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190614b4a565b60405180910390fd5b809150505b92915050565b600061281783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138d3565b905092915050565b600081141561282d57612a63565b61283681613936565b600060019050600060019050600061285b6015546013546126f490919063ffffffff16565b6128726016546011546126f490919063ffffffff16565b61287c919061495c565b905060008082111561289e5761289b82476127d590919063ffffffff16565b90505b6000816128b86011546013546126f490919063ffffffff16565b6128c29190614a1e565b90506000826128de6016546015546126f490919063ffffffff16565b6128e89190614a1e565b9050600082111561298257600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161293990614b9b565b60006040518083038185875af1925050503d8060008114612976576040519150601f19603f3d011682016040523d82523d6000602084013e61297b565b606091505b5050809650505b6000811115612a1a57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516129d190614b9b565b60006040518083038185875af1925050503d8060008114612a0e576040519150601f19603f3d011682016040523d82523d6000602084013e612a13565b606091505b5050809550505b7f31ea026303a62d39c4ad14716f9621f1afe3242309c2ed761d4e241ae4bf2ea982878015612a465750865b604051612a54929190614bb0565b60405180910390a15050505050505b50565b6000612aa883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137ce565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790614c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614cdd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c6e9190613ffe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614d6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614e01565b60405180910390fd5b612d66838383613b79565b612dd181604051806060016040528060268152602001615479602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ce9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e64816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f039190613ffe565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614e93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe790614f25565b60405180910390fd5b6000806000601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661309657600760159054906101000a900460ff16613095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308c90614f91565b60405180910390fd5b5b60008414156130b3576130ab86866000612c7b565b5050506137c9565b600760149054906101000a900460ff1615801561311a5750601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131705750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156137ba576000601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905080156132c957601154935060125492506016549150601b60009054906101000a900460ff16156132c457601f54601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323d919061495c565b42101561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327690614ffd565b60405180910390fd5b42601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61352b565b601354935060145492506015549150601b60009054906101000a900460ff16156134cc57601c543a1115613332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332990615069565b60405180910390fd5b43601d60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab906150d5565b60405180910390fd5b601f54601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613401919061495c565b421015613443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343a90614ffd565b60405180910390fd5b43601d60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60006134d7876117af565b9050600f5486826134e8919061495c565b1115613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090615167565b60405180910390fd5b505b60006135528361354486886126f490919063ffffffff16565b6126f490919063ffffffff16565b9050600061355f306117af565b9050600060105482101590508080156135c25750601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613728576001600760146101000a81548160ff021916908315150217905550601760009054906101000a900460ff16156136e5576000613610600954600a546126f490919063ffffffff16565b9050600061363b8261362d600a548761275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000613666836136586009548861275a90919063ffffffff16565b6127d590919063ffffffff16565b90506000613691600c546136838c8661275a90919063ffffffff16565b6127d590919063ffffffff16565b905060006136bc600b546136ae8d8661275a90919063ffffffff16565b6127d590919063ffffffff16565b905060006136d383836126f490919063ffffffff16565b90506136de81613b7e565b5050505050505b60006136f0306117af565b90506136fb8161281f565b6000600a8190555060006009819055506000600760146101000a81548160ff021916908315150217905550505b60006137506064613742868c61275a90919063ffffffff16565b6127d590919063ffffffff16565b9050613765818a612a6690919063ffffffff16565b9850841561378d57613782816009546126f490919063ffffffff16565b6009819055506137a9565b6137a281600a546126f490919063ffffffff16565b600a819055505b6137b48b3083612c7b565b50505050505b6137c5868686612c7b565b5050505b505050565b6000838311158290613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d9190613e13565b60405180910390fd5b50600083856138259190615187565b9050809150509392505050565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000808311829061391a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139119190613e13565b60405180910390fd5b50600083856139299190614aa7565b9050809150509392505050565b6000600267ffffffffffffffff8111156139535761395261404b565b5b6040519080825280602002602001820160405280156139815781602001602082028036833780820191505090505b5090503081600081518110613999576139986145ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6491906151d0565b81600181518110613a7857613a776145ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613adf30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ab0565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b439594939291906152f6565b600060405180830381600087803b158015613b5d57600080fd5b505af1158015613b71573d6000803e3d6000fd5b505050505050565b505050565b6000613b946002836127d590919063ffffffff16565b90506000613bab8284612a6690919063ffffffff16565b90506000479050613bbb83613936565b6000613bd08247612a6690919063ffffffff16565b9050613bdc8382613c1e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051613c0f93929190615350565b60405180910390a15050505050565b613c4b30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612ab0565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613c97611cb4565b426040518863ffffffff1660e01b8152600401613cb996959493929190615387565b60606040518083038185885af1158015613cd7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613cfc91906153fd565b5050505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d2a81613d17565b8114613d3557600080fd5b50565b600081359050613d4781613d21565b92915050565b600060208284031215613d6357613d62613d0d565b5b6000613d7184828501613d38565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db4578082015181840152602081019050613d99565b83811115613dc3576000848401525b50505050565b6000601f19601f8301169050919050565b6000613de582613d7a565b613def8185613d85565b9350613dff818560208601613d96565b613e0881613dc9565b840191505092915050565b60006020820190508181036000830152613e2d8184613dda565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e6082613e35565b9050919050565b613e7081613e55565b8114613e7b57600080fd5b50565b600081359050613e8d81613e67565b92915050565b60008115159050919050565b613ea881613e93565b8114613eb357600080fd5b50565b600081359050613ec581613e9f565b92915050565b60008060408385031215613ee257613ee1613d0d565b5b6000613ef085828601613e7e565b9250506020613f0185828601613eb6565b9150509250929050565b60008060408385031215613f2257613f21613d0d565b5b6000613f3085828601613e7e565b9250506020613f4185828601613d38565b9150509250929050565b613f5481613e93565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b6000819050919050565b6000613f9a613f95613f9084613e35565b613f75565b613e35565b9050919050565b6000613fac82613f7f565b9050919050565b6000613fbe82613fa1565b9050919050565b613fce81613fb3565b82525050565b6000602082019050613fe96000830184613fc5565b92915050565b613ff881613d17565b82525050565b60006020820190506140136000830184613fef565b92915050565b60006020828403121561402f5761402e613d0d565b5b600061403d84828501613e7e565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61408382613dc9565b810181811067ffffffffffffffff821117156140a2576140a161404b565b5b80604052505050565b60006140b5613d03565b90506140c1828261407a565b919050565b600067ffffffffffffffff8211156140e1576140e061404b565b5b602082029050602081019050919050565b600080fd5b600061410a614105846140c6565b6140ab565b9050808382526020820190506020840283018581111561412d5761412c6140f2565b5b835b8181101561415657806141428882613e7e565b84526020840193505060208101905061412f565b5050509392505050565b600082601f83011261417557614174614046565b5b81356141858482602086016140f7565b91505092915050565b600067ffffffffffffffff8211156141a9576141a861404b565b5b602082029050602081019050919050565b60006141cd6141c88461418e565b6140ab565b905080838252602082019050602084028301858111156141f0576141ef6140f2565b5b835b8181101561421957806142058882613d38565b8452602084019350506020810190506141f2565b5050509392505050565b600082601f83011261423857614237614046565b5b81356142488482602086016141ba565b91505092915050565b6000806040838503121561426857614267613d0d565b5b600083013567ffffffffffffffff81111561428657614285613d12565b5b61429285828601614160565b925050602083013567ffffffffffffffff8111156142b3576142b2613d12565b5b6142bf85828601614223565b9150509250929050565b6000806000606084860312156142e2576142e1613d0d565b5b60006142f086828701613e7e565b935050602061430186828701613e7e565b925050604061431286828701613d38565b9150509250925092565b600060ff82169050919050565b6143328161431c565b82525050565b600060208201905061434d6000830184614329565b92915050565b61435c81613e55565b82525050565b60006020820190506143776000830184614353565b92915050565b60006020828403121561439357614392613d0d565b5b60006143a184828501613eb6565b91505092915050565b60006143b582613e35565b9050919050565b6143c5816143aa565b82525050565b60006020820190506143e060008301846143bc565b92915050565b60008060008060008060c0878903121561440357614402613d0d565b5b600061441189828a01613d38565b965050602061442289828a01613d38565b955050604061443389828a01613d38565b945050606061444489828a01613d38565b935050608061445589828a01613d38565b92505060a061446689828a01613d38565b9150509295509295509295565b6000806040838503121561448a57614489613d0d565b5b600061449885828601613e7e565b92505060206144a985828601613e7e565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144e9602083613d85565b91506144f4826144b3565b602082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456657607f821691505b6020821081141561457a5761457961451f565b5b50919050565b7f417272617973206d757374206265207468652073616d65206c656e6774680000600082015250565b60006145b6601e83613d85565b91506145c182614580565b602082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061465582613d17565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146885761468761461b565b5b600182019050919050565b7f4c697175696469747920666565732063616e2774206578636565642036250000600082015250565b60006146c9601e83613d85565b91506146d482614693565b602082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f4d61726b6574696e6720666565732063616e2774206578636565642036250000600082015250565b6000614735601e83613d85565b9150614740826146ff565b602082019050919050565b6000602082019050818103600083015261476481614728565b9050919050565b7f44657620666565732063616e2774206578636565642032250000000000000000600082015250565b60006147a1601883613d85565b91506147ac8261476b565b602082019050919050565b600060208201905081810360008301526147d081614794565b9050919050565b600060c0820190506147ec6000830189613fef565b6147f96020830188613fef565b6148066040830187613fef565b6148136060830186613fef565b6148206080830185613fef565b61482d60a0830184613fef565b979650505050505050565b7f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d60008201527f696e757465730000000000000000000000000000000000000000000000000000602082015250565b6000614894602683613d85565b915061489f82614838565b604082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614926602683613d85565b9150614931826148ca565b604082019050919050565b6000602082019050818103600083015261495581614919565b9050919050565b600061496782613d17565b915061497283613d17565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149a7576149a661461b565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006149e8601b83613d85565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b6000614a2982613d17565b9150614a3483613d17565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6d57614a6c61461b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ab282613d17565b9150614abd83613d17565b925082614acd57614acc614a78565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b34602183613d85565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b600081905092915050565b50565b6000614b85600083614b6a565b9150614b9082614b75565b600082019050919050565b6000614ba682614b78565b9150819050919050565b6000604082019050614bc56000830185613fef565b614bd26020830184613f4b565b9392505050565b7f42455032303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c35602483613d85565b9150614c4082614bd9565b604082019050919050565b60006020820190508181036000830152614c6481614c28565b9050919050565b7f42455032303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cc7602283613d85565b9150614cd282614c6b565b604082019050919050565b60006020820190508181036000830152614cf681614cba565b9050919050565b7f42455032303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614d59602583613d85565b9150614d6482614cfd565b604082019050919050565b60006020820190508181036000830152614d8881614d4c565b9050919050565b7f42455032303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614deb602383613d85565b9150614df682614d8f565b604082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f4942455032303a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e7d602683613d85565b9150614e8882614e21565b604082019050919050565b60006020820190508181036000830152614eac81614e70565b9050919050565b7f4942455032303a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f0f602483613d85565b9150614f1a82614eb3565b604082019050919050565b60006020820190508181036000830152614f3e81614f02565b9050919050565b7f54726164696e6720686173206e6f7420796574206265656e20656e61626c6564600082015250565b6000614f7b602083613d85565b9150614f8682614f45565b602082019050919050565b60006020820190508181036000830152614faa81614f6e565b9050919050565b7f636f6f6c646f776e20706572696f642061637469766500000000000000000000600082015250565b6000614fe7601683613d85565b9150614ff282614fb1565b602082019050919050565b6000602082019050818103600083015261501681614fda565b9050919050565b7f4761732070726963652065786365656473206c696d69742e0000000000000000600082015250565b6000615053601883613d85565b915061505e8261501d565b602082019050919050565b6000602082019050818103600083015261508281615046565b9050919050565b7f546f6f206d616e7920545820696e20626c6f636b000000000000000000000000600082015250565b60006150bf601483613d85565b91506150ca82615089565b602082019050919050565b600060208201905081810360008301526150ee816150b2565b9050919050565b7f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f60008201527f756e742e00000000000000000000000000000000000000000000000000000000602082015250565b6000615151602483613d85565b915061515c826150f5565b604082019050919050565b6000602082019050818103600083015261518081615144565b9050919050565b600061519282613d17565b915061519d83613d17565b9250828210156151b0576151af61461b565b5b828203905092915050565b6000815190506151ca81613e67565b92915050565b6000602082840312156151e6576151e5613d0d565b5b60006151f4848285016151bb565b91505092915050565b6000819050919050565b600061522261521d615218846151fd565b613f75565b613d17565b9050919050565b61523281615207565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61526d81613e55565b82525050565b600061527f8383615264565b60208301905092915050565b6000602082019050919050565b60006152a382615238565b6152ad8185615243565b93506152b883615254565b8060005b838110156152e95781516152d08882615273565b97506152db8361528b565b9250506001810190506152bc565b5085935050505092915050565b600060a08201905061530b6000830188613fef565b6153186020830187615229565b818103604083015261532a8186615298565b90506153396060830185614353565b6153466080830184613fef565b9695505050505050565b60006060820190506153656000830186613fef565b6153726020830185613fef565b61537f6040830184613fef565b949350505050565b600060c08201905061539c6000830189614353565b6153a96020830188613fef565b6153b66040830187615229565b6153c36060830186615229565b6153d06080830185614353565b6153dd60a0830184613fef565b979650505050505050565b6000815190506153f781613d21565b92915050565b60008060006060848603121561541657615415613d0d565b5b6000615424868287016153e8565b9350506020615435868287016153e8565b9250506040615446868287016153e8565b915050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f92ad2fb7d1ffb9f2303ce84241233f18a78303263a25a73029211af5a59a76964736f6c634300080b0033

Deployed ByteCode Sourcemap

15352:14885:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28129:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3235:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19733:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4149:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15431:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3556:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16631:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19534:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15670:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29733:501;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4326:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19020:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4679:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15634:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15481:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16401:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16154:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15544:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22428:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16014:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19321:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20520:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20077:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20366:146;;;;;;;;;;;;;:::i;:::-;;3672:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7127:148;;;;;;;;;;;;;:::i;:::-;;21197:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15780:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19922:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19158:151;;;;;;;;;;;;;:::i;:::-;;6913:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15825:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15937;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3343:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21417:1003;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20853:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16089:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16120:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4905:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3807:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16262:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20184:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20637:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3990:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28543:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15897:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16052:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15976:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15866:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28129:406;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28208:19:::1;28230:25;28244:10;;28230:9;;:13;;:25;;;;:::i;:::-;28208:47;;28266:15;28284:38;28310:11;28284:21;28295:9;;28284:6;:10;;:21;;;;:::i;:::-;:25;;:38;;;;:::i;:::-;28266:56;;28333:16;28352:39;28379:11;28352:22;28363:10;;28352:6;:10;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;28333:58;;28404:28;28425:6;28404:20;:28::i;:::-;28457:22;28471:7;28457:9;;:13;;:22;;;;:::i;:::-;28445:9;:34;;;;28503:24;28518:8;28503:10;;:14;;:24;;;;:::i;:::-;28490:10;:37;;;;28197:338;;;28129:406:::0;:::o;3235:100::-;3289:13;3322:5;3315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:100;:::o;19733:181::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19848:8:::1;19817:19;:28;19837:7;19817:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;19888:7;19872:34;;;19897:8;19872:34;;;;;;:::i;:::-;;;;;;;;19733:181:::0;;:::o;4149:169::-;4232:4;4249:39;4258:12;:10;:12::i;:::-;4272:7;4281:6;4249:8;:39::i;:::-;4306:4;4299:11;;4149:169;;;;:::o;15431:41::-;;;;;;;;;;;;;:::o;3556:108::-;3617:7;3644:12;;3637:19;;3556:108;:::o;16631:33::-;;;;:::o;19534:187::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19632:4:::1;19602:19;:27;19622:6;19602:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;19667:6;19647:9;;:27;;;;;;;;;;;;;;;;;;19690:23;19706:6;19690:23;;;;;;:::i;:::-;;;;;;;;19534:187:::0;:::o;15670:28::-;;;;:::o;29733:501::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29919:6:::1;:13;29894:14;:21;:38;29872:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;30006:9;30001:226;30025:14;:21;30021:1;:25;30001:226;;;30068:14;30085;30100:1;30085:17;;;;;;;;:::i;:::-;;;;;;;;30068:34;;30117:21;30141:6;30148:1;30141:9;;;;;;;;:::i;:::-;;;;;;;;30117:33;;30165:50;30181:10;30193:6;30201:13;30165:15;:50::i;:::-;30053:174;;30048:3;;;;;:::i;:::-;;;;30001:226;;;;29733:501:::0;;:::o;4326:345::-;4439:4;4456:36;4466:6;4474:9;4485:6;4456:9;:36::i;:::-;4503:138;4512:6;4520:12;:10;:12::i;:::-;4534:106;4572:6;4534:106;;;;;;;;;;;;;;;;;:11;:19;4546:6;4534:19;;;;;;;;;;;;;;;:33;4554:12;:10;:12::i;:::-;4534:33;;;;;;;;;;;;;;;;:37;;:106;;;;;:::i;:::-;4503:8;:138::i;:::-;4659:4;4652:11;;4326:345;;;;;:::o;19020:93::-;19078:5;19103:2;19096:9;;19020:93;:::o;4679:218::-;4767:4;4784:83;4793:12;:10;:12::i;:::-;4807:7;4816:50;4855:10;4816:11;:25;4828:12;:10;:12::i;:::-;4816:25;;;;;;;;;;;;;;;:34;4842:7;4816:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;4784:8;:83::i;:::-;4885:4;4878:11;;4679:218;;;;:::o;15634:29::-;;;;:::o;15481:28::-;;;;;;;;;;;;;:::o;16401:33::-;;;;;;;;;;;;;:::o;16154:40::-;;;;;;;;;;;;;:::o;15544:34::-;;;;;;;;;;;;;:::o;22428:126::-;22494:4;22518:19;:28;22538:7;22518:28;;;;;;;;;;;;;;;;;;;;;;;;;22511:35;;22428:126;;;:::o;16014:31::-;;;;:::o;19321:205::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19425:4:::1;19395:19;:27;19415:6;19395:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;19466:6;19440:15;;:33;;;;;;;;;;;;;;;;;;19489:29;19511:6;19489:29;;;;;;:::i;:::-;;;;;;;;19321:205:::0;:::o;20520:109::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20615:6:::1;20594:18;:27;;;;20520:109:::0;:::o;20077:99::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20163:5:::1;20146:14;;:22;;;;;;;;;;;;;;;;;;20077:99:::0;:::o;20366:146::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20413:17:::1;20433:21;20413:41;;20473:10;20465:28;;:39;20494:9;20465:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;20402:110;20366:146::o:0;3672:127::-;3746:7;3773:9;:18;3783:7;3773:18;;;;;;;;;;;;;;;;3766:25;;3672:127;;;:::o;7127:148::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7234:1:::1;7197:40;;7218:6;;;;;;;;;;;7197:40;;;;;;;;;;;;7265:1;7248:6;;:19;;;;;;;;;;;;;;;;;;7127:148::o:0;21197:212::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21298:4:::1;21266:19;:29;21286:8;21266:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;21359:4;21313:33;:43;21347:8;21313:43;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;21374:27;21392:8;21374:17;:27::i;:::-;21197:212:::0;:::o;15780:38::-;;;;;;;;;;;;;:::o;19922:147::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20055:6:::1;20011:33;:41;20045:6;20011:41;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;19922:147:::0;;:::o;19158:151::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19222:14:::1;;;;;;;;;;;19221:15;19213:24;;;::::0;::::1;;19265:4;19248:14;;:21;;;;;;;;;;;;;;;;;;19285:16;;;;;;;;;;19158:151::o:0;6913:79::-;6951:7;6978:6;;;;;;;;;;;6971:13;;6913:79;:::o;15825:32::-;;;;;;;;;;;;;:::o;15937:::-;;;;:::o;3343:104::-;3399:13;3432:7;3425:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3343:104;:::o;21417:1003::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21639:2:::1;21623:12;:18;;:41;;;;;21662:2;21645:13;:19;;21623:41;21615:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;21734:2;21718:12;:18;;:41;;;;;21757:2;21740:13;:19;;21718:41;21710:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;21823:1;21813:6;:11;;:27;;;;;21839:1;21828:7;:12;;21813:27;21805:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;21901:12;21882:16;:31;;;;21942:12;21924:15;:30;;;;21985:13;21965:17;:33;;;;22028:13;22009:16;:32;;;;22064:6;22052:9;:18;;;;22094:7;22081:10;:20;;;;22130:55;22174:10;;22130:39;22152:16;;22130:17;;:21;;:39;;;;:::i;:::-;:43;;:55;;;;:::i;:::-;22114:13;:71;;;;22211:53;22253:10;;22211:37;22232:15;;22211:16;;:20;;:37;;;;:::i;:::-;:41;;:53;;;;:::i;:::-;22196:12;:68;;;;22282:130;22293:17;;22312:16;;22330:10;;22342:16;;22385:15;;22402:9;;22282:130;;;;;;;;;;;:::i;:::-;;;;;;;;21417:1003:::0;;;;;;:::o;20853:140::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20944:41:::1;20973:4;20979:5;20944:28;:41::i;:::-;20853:140:::0;;:::o;16089:24::-;;;;:::o;16120:25::-;;;;:::o;4905:286::-;4998:4;5015:146;5024:12;:10;:12::i;:::-;5038:7;5047:113;5086:15;5047:113;;;;;;;;;;;;;;;;;:11;:25;5059:12;:10;:12::i;:::-;5047:25;;;;;;;;;;;;;;;:34;5073:7;5047:34;;;;;;;;;;;;;;;;:38;;:113;;;;;:::i;:::-;5015:8;:146::i;:::-;5179:4;5172:11;;4905:286;;;;:::o;3807:175::-;3893:4;3910:42;3920:12;:10;:12::i;:::-;3934:9;3945:6;3910:9;:42::i;:::-;3970:4;3963:11;;3807:175;;;;:::o;16262:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;20184:174::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20272:3:::1;20263:5;:12;;20255:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;20345:5;20329:13;:21;;;;20184:174:::0;:::o;20637:208::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20742:7:::1;20717:32;;:21;;;;;;;;;;;:32;;;;20709:41;;;::::0;::::1;;20785:7;20761:21;;:31;;;;;;;;;;;;;;;;;;20808:29;20829:7;20808:29;;;;;;:::i;:::-;;;;;;;;20637:208:::0;:::o;3990:151::-;4079:7;4106:11;:18;4118:5;4106:18;;;;;;;;;;;;;;;:27;4125:7;4106:27;;;;;;;;;;;;;;;;4099:34;;3990:151;;;;:::o;28543:149::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28626:6:::1;28613:10;:19;;;;28654:30;28673:10;;28654:30;;;;;;:::i;:::-;;;;;;;;28543:149:::0;:::o;15897:33::-;;;;:::o;16052:30::-;;;;:::o;7283:244::-;7050:12;:10;:12::i;:::-;7040:22;;:6;;;;;;;;;;;:22;;;7032:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7392:1:::1;7372:22;;:8;:22;;;;7364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7482:8;7453:38;;7474:6;;;;;;;;;;;7453:38;;;;;;;;;;;;7511:8;7502:6;;:17;;;;;;;;;;;;;;;;;;7283:244:::0;:::o;15976:31::-;;;;:::o;15866:24::-;;;;:::o;470:179::-;528:7;548:9;564:1;560;:5;;;;:::i;:::-;548:17;;589:1;584;:6;;576:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;640:1;633:8;;;470:179;;;;:::o;94:98::-;147:7;174:10;167:17;;94:98;:::o;999:248::-;1057:7;1086:1;1081;:6;1077:47;;;1111:1;1104:8;;;;1077:47;1136:9;1152:1;1148;:5;;;;:::i;:::-;1136:17;;1181:1;1176;1172;:5;;;;:::i;:::-;:10;1164:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1238:1;1231:8;;;999:248;;;;;:::o;1255:132::-;1313:7;1340:39;1344:1;1347;1340:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;1333:46;;1255:132;;;;:::o;28700:1025::-;28779:1;28769:6;:11;28765:50;;;28797:7;;28765:50;28825:24;28842:6;28825:16;:24::i;:::-;28862:12;28877:4;28862:19;;28892:15;28910:4;28892:22;;28935:23;28997:31;29018:9;;28997:16;;:20;;:31;;;;:::i;:::-;28961:33;28983:10;;28961:17;;:21;;:33;;;;:::i;:::-;:67;;;;:::i;:::-;28935:93;;29041:19;29093:1;29075:15;:19;29071:108;;;29125:42;29151:15;29125:21;:25;;:42;;;;:::i;:::-;29111:56;;29071:108;29189:23;29257:11;29215:39;29236:17;;29215:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;29189:79;;29279:17;29327:11;29299:25;29313:10;;29299:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;29279:59;;29381:1;29363:15;:19;29359:123;;;29421:15;;;;;;;;;;;29413:29;;29450:15;29413:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29399:71;;;;;29359:123;29518:1;29506:9;:13;29502:108;;;29561:9;;;;;;;;;;;29553:23;;29584:9;29553:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29536:62;;;;;29502:108;29627:90;29655:15;29685:7;:21;;;;;29696:10;29685:21;29627:90;;;;;;;:::i;:::-;;;;;;;;28754:971;;;;;;28700:1025;;:::o;657:136::-;715:7;742:43;746:1;749;742:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;735:50;;657:136;;;;:::o;6131:346::-;6250:1;6233:19;;:5;:19;;;;6225:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6331:1;6312:21;;:7;:21;;;;6304:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6415:6;6385:11;:18;6397:5;6385:18;;;;;;;;;;;;;;;:27;6404:7;6385:27;;;;;;;;;;;;;;;:36;;;;6453:7;6437:32;;6446:5;6437:32;;;6462:6;6437:32;;;;;;:::i;:::-;;;;;;;;6131:346;;;:::o;5199:538::-;5323:1;5305:20;;:6;:20;;;;5297:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;5407:1;5386:23;;:9;:23;;;;5378:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5462:47;5483:6;5491:9;5502:6;5462:20;:47::i;:::-;5542:70;5564:6;5542:70;;;;;;;;;;;;;;;;;:9;:17;5552:6;5542:17;;;;;;;;;;;;;;;;:21;;:70;;;;;:::i;:::-;5522:9;:17;5532:6;5522:17;;;;;;;;;;;;;;;:90;;;;5646:32;5671:6;5646:9;:20;5656:9;5646:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;5623:9;:20;5633:9;5623:20;;;;;;;;;;;;;;;:55;;;;5711:9;5694:35;;5703:6;5694:35;;;5722:6;5694:35;;;;;;:::i;:::-;;;;;;;;5199:538;;;:::o;22562:4041::-;22678:1;22662:18;;:4;:18;;;;22654:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22756:1;22742:16;;:2;:16;;;;22734:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22812:21;22844:20;22875:14;22907:33;:39;22941:4;22907:39;;;;;;;;;;;;;;;;;;;;;;;;;22902:142;;22971:14;;;;;;;;;;;22963:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;22902:142;23070:1;23060:6;:11;23056:3484;;;23088:28;23104:4;23110:2;23114:1;23088:15;:28::i;:::-;23131:7;;;;;23056:3484;23194:8;;;;;;;;;;;23193:9;:39;;;;;23207:19;:25;23227:4;23207:25;;;;;;;;;;;;;;;;;;;;;;;;;23206:26;23193:39;:67;;;;;23237:19;:23;23257:2;23237:23;;;;;;;;;;;;;;;;;;;;;;;;;23236:24;23193:67;23175:3365;;;23287:14;23304:25;:29;23330:2;23304:29;;;;;;;;;;;;;;;;;;;;;;;;;23287:46;;23352:9;23348:1381;;;23398:17;;23382:33;;23449:16;;23434:31;;23493:10;;23484:19;;23528:14;;;;;;;;;;;23524:269;;;23632:13;;23590:28;:39;23619:9;23590:39;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;23571:15;:74;;23563:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;23758:15;23716:28;:39;23745:9;23716:39;;;;;;;;;;;;;;;:57;;;;23524:269;23348:1381;;;23877:16;;23861:32;;23927:15;;23912:30;;23970:9;;23961:18;;24004:14;;;;;;;;;;;24000:519;;;24062:13;;24047:11;:28;;24039:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24169:12;24130:24;:35;24155:9;24130:35;;;;;;;;;;;;;;;;:51;;24122:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24293:13;;24251:28;:39;24280:9;24251:39;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;24232:15;:74;;24224:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;24415:12;24377:24;:35;24402:9;24377:35;;;;;;;;;;;;;;;:50;;;;24488:15;24446:28;:39;24475:9;24446:39;;;;;;;;;;;;;;;:57;;;;24000:519;24533:32;24568:13;24578:2;24568:9;:13::i;:::-;24533:48;;24641:9;;24631:6;24604:24;:33;;;;:::i;:::-;:46;;24596:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;23842:887;23348:1381;24745:17;24765:43;24801:6;24765:31;24783:12;24765:13;:17;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;24745:63;;24825:28;24856:24;24874:4;24856:9;:24::i;:::-;24825:55;;24897:12;24936:18;;24912:20;:42;;24897:57;;24975:7;:43;;;;;24987:25;:31;25013:4;24987:31;;;;;;;;;;;;;;;;;;;;;;;;;24986:32;24975:43;24971:1211;;;25050:4;25039:8;;:15;;;;;;;;;;;;;;;;;;25079:21;;;;;;;;;;;25075:863;;;25125:20;25148:25;25162:10;;25148:9;;:13;;:25;;;;:::i;:::-;25125:48;;25196:24;25223:105;25315:12;25223:61;25274:9;;25223:20;:50;;:61;;;;:::i;:::-;:91;;:105;;;;:::i;:::-;25196:132;;25351:22;25376:106;25469:12;25376:62;25427:10;;25376:20;:50;;:62;;;;:::i;:::-;:92;;:106;;;;:::i;:::-;25351:131;;25507:21;25531:104;25622:12;;25531:60;25578:12;25531:16;:46;;:60;;;;:::i;:::-;:90;;:104;;;;:::i;:::-;25507:128;;25660:22;25685:103;25774:13;;25685:58;25730:12;25685:14;:44;;:58;;;;:::i;:::-;:88;;:103;;;;:::i;:::-;25660:128;;25813:18;25834:33;25853:13;25834:14;:18;;:33;;;;:::i;:::-;25813:54;;25892:26;25907:10;25892:14;:26::i;:::-;25102:836;;;;;;25075:863;25958:24;25985;26003:4;25985:9;:24::i;:::-;25958:51;;26028:38;26049:16;26028:20;:38::i;:::-;26097:1;26085:9;:13;;;;26130:1;26117:10;:14;;;;26161:5;26150:8;;:16;;;;;;;;;;;;;;;;;;25020:1162;24971:1211;26198:12;26213:30;26239:3;26213:21;26224:9;26213:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;26198:45;;26269:16;26280:4;26269:6;:10;;:16;;;;:::i;:::-;26260:25;;26306:9;26302:155;;;26349:20;26364:4;26349:10;;:14;;:20;;;;:::i;:::-;26336:10;:33;;;;26302:155;;;26422:19;26436:4;26422:9;;:13;;:19;;;;:::i;:::-;26410:9;:31;;;;26302:155;26473:42;26489:4;26503;26510;26473:15;:42::i;:::-;23272:3268;;;;;23175:3365;26552:33;26568:4;26574:2;26578:6;26552:15;:33::i;:::-;22641:3962;;;22562:4041;;;;:::o;801:190::-;887:7;920:1;915;:6;;923:12;907:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;947:9;963:1;959;:5;;;;:::i;:::-;947:17;;982:1;975:8;;;801:190;;;;;:::o;21001:188::-;21118:5;21084:25;:31;21110:4;21084:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;21175:5;21141:40;;21169:4;21141:40;;;;;;;;;;;;21001:188;;:::o;1395:189::-;1481:7;1513:1;1509;:5;1516:12;1501:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1540:9;1556:1;1552;:5;;;;:::i;:::-;1540:17;;1575:1;1568:8;;;1395:189;;;;;:::o;27101:499::-;27167:21;27205:1;27191:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27167:40;;27236:4;27218;27223:1;27218:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27262:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27252:4;27257:1;27252:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;27295:62;27312:4;27327:15;;;;;;;;;;;27345:11;27295:8;:62::i;:::-;27368:15;;;;;;;;;;;:66;;;27449:11;27475:1;27519:4;27546;27566:15;27368:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27156:444;27101:499;:::o;6485:91::-;;;;:::o;26613:480::-;26672:12;26687:13;26698:1;26687:6;:10;;:13;;;;:::i;:::-;26672:28;;26711:17;26731:16;26742:4;26731:6;:10;;:16;;;;:::i;:::-;26711:36;;26758:22;26783:21;26758:46;;26815:22;26832:4;26815:16;:22::i;:::-;26918:18;26939:41;26965:14;26939:21;:25;;:41;;;;:::i;:::-;26918:62;;26991:35;27004:9;27015:10;26991:12;:35::i;:::-;27042:43;27057:4;27063:10;27075:9;27042:43;;;;;;;;:::i;:::-;;;;;;;;26661:432;;;;26613:480;:::o;27608:513::-;27756:62;27773:4;27788:15;;;;;;;;;;;27806:11;27756:8;:62::i;:::-;27861:15;;;;;;;;;;;:31;;;27900:9;27933:4;27953:11;27979:1;28022;28065:7;:5;:7::i;:::-;28087:15;27861:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;27608:513;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:99::-;1077:6;1111:5;1105:12;1095:22;;1025:99;;;:::o;1130:169::-;1214:11;1248:6;1243:3;1236:19;1288:4;1283:3;1279:14;1264:29;;1130:169;;;;:::o;1305:307::-;1373:1;1383:113;1397:6;1394:1;1391:13;1383:113;;;1482:1;1477:3;1473:11;1467:18;1463:1;1458:3;1454:11;1447:39;1419:2;1416:1;1412:10;1407:15;;1383:113;;;1514:6;1511:1;1508:13;1505:101;;;1594:1;1585:6;1580:3;1576:16;1569:27;1505:101;1354:258;1305:307;;;:::o;1618:102::-;1659:6;1710:2;1706:7;1701:2;1694:5;1690:14;1686:28;1676:38;;1618:102;;;:::o;1726:364::-;1814:3;1842:39;1875:5;1842:39;:::i;:::-;1897:71;1961:6;1956:3;1897:71;:::i;:::-;1890:78;;1977:52;2022:6;2017:3;2010:4;2003:5;1999:16;1977:52;:::i;:::-;2054:29;2076:6;2054:29;:::i;:::-;2049:3;2045:39;2038:46;;1818:272;1726:364;;;;:::o;2096:313::-;2209:4;2247:2;2236:9;2232:18;2224:26;;2296:9;2290:4;2286:20;2282:1;2271:9;2267:17;2260:47;2324:78;2397:4;2388:6;2324:78;:::i;:::-;2316:86;;2096:313;;;;:::o;2415:126::-;2452:7;2492:42;2485:5;2481:54;2470:65;;2415:126;;;:::o;2547:96::-;2584:7;2613:24;2631:5;2613:24;:::i;:::-;2602:35;;2547:96;;;:::o;2649:122::-;2722:24;2740:5;2722:24;:::i;:::-;2715:5;2712:35;2702:63;;2761:1;2758;2751:12;2702:63;2649:122;:::o;2777:139::-;2823:5;2861:6;2848:20;2839:29;;2877:33;2904:5;2877:33;:::i;:::-;2777:139;;;;:::o;2922:90::-;2956:7;2999:5;2992:13;2985:21;2974:32;;2922:90;;;:::o;3018:116::-;3088:21;3103:5;3088:21;:::i;:::-;3081:5;3078:32;3068:60;;3124:1;3121;3114:12;3068:60;3018:116;:::o;3140:133::-;3183:5;3221:6;3208:20;3199:29;;3237:30;3261:5;3237:30;:::i;:::-;3140:133;;;;:::o;3279:468::-;3344:6;3352;3401:2;3389:9;3380:7;3376:23;3372:32;3369:119;;;3407:79;;:::i;:::-;3369:119;3527:1;3552:53;3597:7;3588:6;3577:9;3573:22;3552:53;:::i;:::-;3542:63;;3498:117;3654:2;3680:50;3722:7;3713:6;3702:9;3698:22;3680:50;:::i;:::-;3670:60;;3625:115;3279:468;;;;;:::o;3753:474::-;3821:6;3829;3878:2;3866:9;3857:7;3853:23;3849:32;3846:119;;;3884:79;;:::i;:::-;3846:119;4004:1;4029:53;4074:7;4065:6;4054:9;4050:22;4029:53;:::i;:::-;4019:63;;3975:117;4131:2;4157:53;4202:7;4193:6;4182:9;4178:22;4157:53;:::i;:::-;4147:63;;4102:118;3753:474;;;;;:::o;4233:109::-;4314:21;4329:5;4314:21;:::i;:::-;4309:3;4302:34;4233:109;;:::o;4348:210::-;4435:4;4473:2;4462:9;4458:18;4450:26;;4486:65;4548:1;4537:9;4533:17;4524:6;4486:65;:::i;:::-;4348:210;;;;:::o;4564:60::-;4592:3;4613:5;4606:12;;4564:60;;;:::o;4630:142::-;4680:9;4713:53;4731:34;4740:24;4758:5;4740:24;:::i;:::-;4731:34;:::i;:::-;4713:53;:::i;:::-;4700:66;;4630:142;;;:::o;4778:126::-;4828:9;4861:37;4892:5;4861:37;:::i;:::-;4848:50;;4778:126;;;:::o;4910:153::-;4987:9;5020:37;5051:5;5020:37;:::i;:::-;5007:50;;4910:153;;;:::o;5069:185::-;5183:64;5241:5;5183:64;:::i;:::-;5178:3;5171:77;5069:185;;:::o;5260:276::-;5380:4;5418:2;5407:9;5403:18;5395:26;;5431:98;5526:1;5515:9;5511:17;5502:6;5431:98;:::i;:::-;5260:276;;;;:::o;5542:118::-;5629:24;5647:5;5629:24;:::i;:::-;5624:3;5617:37;5542:118;;:::o;5666:222::-;5759:4;5797:2;5786:9;5782:18;5774:26;;5810:71;5878:1;5867:9;5863:17;5854:6;5810:71;:::i;:::-;5666:222;;;;:::o;5894:329::-;5953:6;6002:2;5990:9;5981:7;5977:23;5973:32;5970:119;;;6008:79;;:::i;:::-;5970:119;6128:1;6153:53;6198:7;6189:6;6178:9;6174:22;6153:53;:::i;:::-;6143:63;;6099:117;5894:329;;;;:::o;6229:117::-;6338:1;6335;6328:12;6352:180;6400:77;6397:1;6390:88;6497:4;6494:1;6487:15;6521:4;6518:1;6511:15;6538:281;6621:27;6643:4;6621:27;:::i;:::-;6613:6;6609:40;6751:6;6739:10;6736:22;6715:18;6703:10;6700:34;6697:62;6694:88;;;6762:18;;:::i;:::-;6694:88;6802:10;6798:2;6791:22;6581:238;6538:281;;:::o;6825:129::-;6859:6;6886:20;;:::i;:::-;6876:30;;6915:33;6943:4;6935:6;6915:33;:::i;:::-;6825:129;;;:::o;6960:311::-;7037:4;7127:18;7119:6;7116:30;7113:56;;;7149:18;;:::i;:::-;7113:56;7199:4;7191:6;7187:17;7179:25;;7259:4;7253;7249:15;7241:23;;6960:311;;;:::o;7277:117::-;7386:1;7383;7376:12;7417:710;7513:5;7538:81;7554:64;7611:6;7554:64;:::i;:::-;7538:81;:::i;:::-;7529:90;;7639:5;7668:6;7661:5;7654:21;7702:4;7695:5;7691:16;7684:23;;7755:4;7747:6;7743:17;7735:6;7731:30;7784:3;7776:6;7773:15;7770:122;;;7803:79;;:::i;:::-;7770:122;7918:6;7901:220;7935:6;7930:3;7927:15;7901:220;;;8010:3;8039:37;8072:3;8060:10;8039:37;:::i;:::-;8034:3;8027:50;8106:4;8101:3;8097:14;8090:21;;7977:144;7961:4;7956:3;7952:14;7945:21;;7901:220;;;7905:21;7519:608;;7417:710;;;;;:::o;8150:370::-;8221:5;8270:3;8263:4;8255:6;8251:17;8247:27;8237:122;;8278:79;;:::i;:::-;8237:122;8395:6;8382:20;8420:94;8510:3;8502:6;8495:4;8487:6;8483:17;8420:94;:::i;:::-;8411:103;;8227:293;8150:370;;;;:::o;8526:311::-;8603:4;8693:18;8685:6;8682:30;8679:56;;;8715:18;;:::i;:::-;8679:56;8765:4;8757:6;8753:17;8745:25;;8825:4;8819;8815:15;8807:23;;8526:311;;;:::o;8860:710::-;8956:5;8981:81;8997:64;9054:6;8997:64;:::i;:::-;8981:81;:::i;:::-;8972:90;;9082:5;9111:6;9104:5;9097:21;9145:4;9138:5;9134:16;9127:23;;9198:4;9190:6;9186:17;9178:6;9174:30;9227:3;9219:6;9216:15;9213:122;;;9246:79;;:::i;:::-;9213:122;9361:6;9344:220;9378:6;9373:3;9370:15;9344:220;;;9453:3;9482:37;9515:3;9503:10;9482:37;:::i;:::-;9477:3;9470:50;9549:4;9544:3;9540:14;9533:21;;9420:144;9404:4;9399:3;9395:14;9388:21;;9344:220;;;9348:21;8962:608;;8860:710;;;;;:::o;9593:370::-;9664:5;9713:3;9706:4;9698:6;9694:17;9690:27;9680:122;;9721:79;;:::i;:::-;9680:122;9838:6;9825:20;9863:94;9953:3;9945:6;9938:4;9930:6;9926:17;9863:94;:::i;:::-;9854:103;;9670:293;9593:370;;;;:::o;9969:894::-;10087:6;10095;10144:2;10132:9;10123:7;10119:23;10115:32;10112:119;;;10150:79;;:::i;:::-;10112:119;10298:1;10287:9;10283:17;10270:31;10328:18;10320:6;10317:30;10314:117;;;10350:79;;:::i;:::-;10314:117;10455:78;10525:7;10516:6;10505:9;10501:22;10455:78;:::i;:::-;10445:88;;10241:302;10610:2;10599:9;10595:18;10582:32;10641:18;10633:6;10630:30;10627:117;;;10663:79;;:::i;:::-;10627:117;10768:78;10838:7;10829:6;10818:9;10814:22;10768:78;:::i;:::-;10758:88;;10553:303;9969:894;;;;;:::o;10869:619::-;10946:6;10954;10962;11011:2;10999:9;10990:7;10986:23;10982:32;10979:119;;;11017:79;;:::i;:::-;10979:119;11137:1;11162:53;11207:7;11198:6;11187:9;11183:22;11162:53;:::i;:::-;11152:63;;11108:117;11264:2;11290:53;11335:7;11326:6;11315:9;11311:22;11290:53;:::i;:::-;11280:63;;11235:118;11392:2;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11363:118;10869:619;;;;;:::o;11494:86::-;11529:7;11569:4;11562:5;11558:16;11547:27;;11494:86;;;:::o;11586:112::-;11669:22;11685:5;11669:22;:::i;:::-;11664:3;11657:35;11586:112;;:::o;11704:214::-;11793:4;11831:2;11820:9;11816:18;11808:26;;11844:67;11908:1;11897:9;11893:17;11884:6;11844:67;:::i;:::-;11704:214;;;;:::o;11924:118::-;12011:24;12029:5;12011:24;:::i;:::-;12006:3;11999:37;11924:118;;:::o;12048:222::-;12141:4;12179:2;12168:9;12164:18;12156:26;;12192:71;12260:1;12249:9;12245:17;12236:6;12192:71;:::i;:::-;12048:222;;;;:::o;12276:323::-;12332:6;12381:2;12369:9;12360:7;12356:23;12352:32;12349:119;;;12387:79;;:::i;:::-;12349:119;12507:1;12532:50;12574:7;12565:6;12554:9;12550:22;12532:50;:::i;:::-;12522:60;;12478:114;12276:323;;;;:::o;12605:104::-;12650:7;12679:24;12697:5;12679:24;:::i;:::-;12668:35;;12605:104;;;:::o;12715:142::-;12818:32;12844:5;12818:32;:::i;:::-;12813:3;12806:45;12715:142;;:::o;12863:254::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:87;13107:1;13096:9;13092:17;13083:6;13023:87;:::i;:::-;12863:254;;;;:::o;13123:1057::-;13227:6;13235;13243;13251;13259;13267;13316:3;13304:9;13295:7;13291:23;13287:33;13284:120;;;13323:79;;:::i;:::-;13284:120;13443:1;13468:53;13513:7;13504:6;13493:9;13489:22;13468:53;:::i;:::-;13458:63;;13414:117;13570:2;13596:53;13641:7;13632:6;13621:9;13617:22;13596:53;:::i;:::-;13586:63;;13541:118;13698:2;13724:53;13769:7;13760:6;13749:9;13745:22;13724:53;:::i;:::-;13714:63;;13669:118;13826:2;13852:53;13897:7;13888:6;13877:9;13873:22;13852:53;:::i;:::-;13842:63;;13797:118;13954:3;13981:53;14026:7;14017:6;14006:9;14002:22;13981:53;:::i;:::-;13971:63;;13925:119;14083:3;14110:53;14155:7;14146:6;14135:9;14131:22;14110:53;:::i;:::-;14100:63;;14054:119;13123:1057;;;;;;;;:::o;14186:474::-;14254:6;14262;14311:2;14299:9;14290:7;14286:23;14282:32;14279:119;;;14317:79;;:::i;:::-;14279:119;14437:1;14462:53;14507:7;14498:6;14487:9;14483:22;14462:53;:::i;:::-;14452:63;;14408:117;14564:2;14590:53;14635:7;14626:6;14615:9;14611:22;14590:53;:::i;:::-;14580:63;;14535:118;14186:474;;;;;:::o;14666:182::-;14806:34;14802:1;14794:6;14790:14;14783:58;14666:182;:::o;14854:366::-;14996:3;15017:67;15081:2;15076:3;15017:67;:::i;:::-;15010:74;;15093:93;15182:3;15093:93;:::i;:::-;15211:2;15206:3;15202:12;15195:19;;14854:366;;;:::o;15226:419::-;15392:4;15430:2;15419:9;15415:18;15407:26;;15479:9;15473:4;15469:20;15465:1;15454:9;15450:17;15443:47;15507:131;15633:4;15507:131;:::i;:::-;15499:139;;15226:419;;;:::o;15651:180::-;15699:77;15696:1;15689:88;15796:4;15793:1;15786:15;15820:4;15817:1;15810:15;15837:320;15881:6;15918:1;15912:4;15908:12;15898:22;;15965:1;15959:4;15955:12;15986:18;15976:81;;16042:4;16034:6;16030:17;16020:27;;15976:81;16104:2;16096:6;16093:14;16073:18;16070:38;16067:84;;;16123:18;;:::i;:::-;16067:84;15888:269;15837:320;;;:::o;16163:180::-;16303:32;16299:1;16291:6;16287:14;16280:56;16163:180;:::o;16349:366::-;16491:3;16512:67;16576:2;16571:3;16512:67;:::i;:::-;16505:74;;16588:93;16677:3;16588:93;:::i;:::-;16706:2;16701:3;16697:12;16690:19;;16349:366;;;:::o;16721:419::-;16887:4;16925:2;16914:9;16910:18;16902:26;;16974:9;16968:4;16964:20;16960:1;16949:9;16945:17;16938:47;17002:131;17128:4;17002:131;:::i;:::-;16994:139;;16721:419;;;:::o;17146:180::-;17194:77;17191:1;17184:88;17291:4;17288:1;17281:15;17315:4;17312:1;17305:15;17332:180;17380:77;17377:1;17370:88;17477:4;17474:1;17467:15;17501:4;17498:1;17491:15;17518:233;17557:3;17580:24;17598:5;17580:24;:::i;:::-;17571:33;;17626:66;17619:5;17616:77;17613:103;;;17696:18;;:::i;:::-;17613:103;17743:1;17736:5;17732:13;17725:20;;17518:233;;;:::o;17757:180::-;17897:32;17893:1;17885:6;17881:14;17874:56;17757:180;:::o;17943:366::-;18085:3;18106:67;18170:2;18165:3;18106:67;:::i;:::-;18099:74;;18182:93;18271:3;18182:93;:::i;:::-;18300:2;18295:3;18291:12;18284:19;;17943:366;;;:::o;18315:419::-;18481:4;18519:2;18508:9;18504:18;18496:26;;18568:9;18562:4;18558:20;18554:1;18543:9;18539:17;18532:47;18596:131;18722:4;18596:131;:::i;:::-;18588:139;;18315:419;;;:::o;18740:180::-;18880:32;18876:1;18868:6;18864:14;18857:56;18740:180;:::o;18926:366::-;19068:3;19089:67;19153:2;19148:3;19089:67;:::i;:::-;19082:74;;19165:93;19254:3;19165:93;:::i;:::-;19283:2;19278:3;19274:12;19267:19;;18926:366;;;:::o;19298:419::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19551:9;19545:4;19541:20;19537:1;19526:9;19522:17;19515:47;19579:131;19705:4;19579:131;:::i;:::-;19571:139;;19298:419;;;:::o;19723:174::-;19863:26;19859:1;19851:6;19847:14;19840:50;19723:174;:::o;19903:366::-;20045:3;20066:67;20130:2;20125:3;20066:67;:::i;:::-;20059:74;;20142:93;20231:3;20142:93;:::i;:::-;20260:2;20255:3;20251:12;20244:19;;19903:366;;;:::o;20275:419::-;20441:4;20479:2;20468:9;20464:18;20456:26;;20528:9;20522:4;20518:20;20514:1;20503:9;20499:17;20492:47;20556:131;20682:4;20556:131;:::i;:::-;20548:139;;20275:419;;;:::o;20700:775::-;20933:4;20971:3;20960:9;20956:19;20948:27;;20985:71;21053:1;21042:9;21038:17;21029:6;20985:71;:::i;:::-;21066:72;21134:2;21123:9;21119:18;21110:6;21066:72;:::i;:::-;21148;21216:2;21205:9;21201:18;21192:6;21148:72;:::i;:::-;21230;21298:2;21287:9;21283:18;21274:6;21230:72;:::i;:::-;21312:73;21380:3;21369:9;21365:19;21356:6;21312:73;:::i;:::-;21395;21463:3;21452:9;21448:19;21439:6;21395:73;:::i;:::-;20700:775;;;;;;;;;:::o;21481:225::-;21621:34;21617:1;21609:6;21605:14;21598:58;21690:8;21685:2;21677:6;21673:15;21666:33;21481:225;:::o;21712:366::-;21854:3;21875:67;21939:2;21934:3;21875:67;:::i;:::-;21868:74;;21951:93;22040:3;21951:93;:::i;:::-;22069:2;22064:3;22060:12;22053:19;;21712:366;;;:::o;22084:419::-;22250:4;22288:2;22277:9;22273:18;22265:26;;22337:9;22331:4;22327:20;22323:1;22312:9;22308:17;22301:47;22365:131;22491:4;22365:131;:::i;:::-;22357:139;;22084:419;;;:::o;22509:225::-;22649:34;22645:1;22637:6;22633:14;22626:58;22718:8;22713:2;22705:6;22701:15;22694:33;22509:225;:::o;22740:366::-;22882:3;22903:67;22967:2;22962:3;22903:67;:::i;:::-;22896:74;;22979:93;23068:3;22979:93;:::i;:::-;23097:2;23092:3;23088:12;23081:19;;22740:366;;;:::o;23112:419::-;23278:4;23316:2;23305:9;23301:18;23293:26;;23365:9;23359:4;23355:20;23351:1;23340:9;23336:17;23329:47;23393:131;23519:4;23393:131;:::i;:::-;23385:139;;23112:419;;;:::o;23537:305::-;23577:3;23596:20;23614:1;23596:20;:::i;:::-;23591:25;;23630:20;23648:1;23630:20;:::i;:::-;23625:25;;23784:1;23716:66;23712:74;23709:1;23706:81;23703:107;;;23790:18;;:::i;:::-;23703:107;23834:1;23831;23827:9;23820:16;;23537:305;;;;:::o;23848:177::-;23988:29;23984:1;23976:6;23972:14;23965:53;23848:177;:::o;24031:366::-;24173:3;24194:67;24258:2;24253:3;24194:67;:::i;:::-;24187:74;;24270:93;24359:3;24270:93;:::i;:::-;24388:2;24383:3;24379:12;24372:19;;24031:366;;;:::o;24403:419::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24656:9;24650:4;24646:20;24642:1;24631:9;24627:17;24620:47;24684:131;24810:4;24684:131;:::i;:::-;24676:139;;24403:419;;;:::o;24828:348::-;24868:7;24891:20;24909:1;24891:20;:::i;:::-;24886:25;;24925:20;24943:1;24925:20;:::i;:::-;24920:25;;25113:1;25045:66;25041:74;25038:1;25035:81;25030:1;25023:9;25016:17;25012:105;25009:131;;;25120:18;;:::i;:::-;25009:131;25168:1;25165;25161:9;25150:20;;24828:348;;;;:::o;25182:180::-;25230:77;25227:1;25220:88;25327:4;25324:1;25317:15;25351:4;25348:1;25341:15;25368:185;25408:1;25425:20;25443:1;25425:20;:::i;:::-;25420:25;;25459:20;25477:1;25459:20;:::i;:::-;25454:25;;25498:1;25488:35;;25503:18;;:::i;:::-;25488:35;25545:1;25542;25538:9;25533:14;;25368:185;;;;:::o;25559:220::-;25699:34;25695:1;25687:6;25683:14;25676:58;25768:3;25763:2;25755:6;25751:15;25744:28;25559:220;:::o;25785:366::-;25927:3;25948:67;26012:2;26007:3;25948:67;:::i;:::-;25941:74;;26024:93;26113:3;26024:93;:::i;:::-;26142:2;26137:3;26133:12;26126:19;;25785:366;;;:::o;26157:419::-;26323:4;26361:2;26350:9;26346:18;26338:26;;26410:9;26404:4;26400:20;26396:1;26385:9;26381:17;26374:47;26438:131;26564:4;26438:131;:::i;:::-;26430:139;;26157:419;;;:::o;26582:147::-;26683:11;26720:3;26705:18;;26582:147;;;;:::o;26735:114::-;;:::o;26855:398::-;27014:3;27035:83;27116:1;27111:3;27035:83;:::i;:::-;27028:90;;27127:93;27216:3;27127:93;:::i;:::-;27245:1;27240:3;27236:11;27229:18;;26855:398;;;:::o;27259:379::-;27443:3;27465:147;27608:3;27465:147;:::i;:::-;27458:154;;27629:3;27622:10;;27259:379;;;:::o;27644:320::-;27759:4;27797:2;27786:9;27782:18;27774:26;;27810:71;27878:1;27867:9;27863:17;27854:6;27810:71;:::i;:::-;27891:66;27953:2;27942:9;27938:18;27929:6;27891:66;:::i;:::-;27644:320;;;;;:::o;27970:223::-;28110:34;28106:1;28098:6;28094:14;28087:58;28179:6;28174:2;28166:6;28162:15;28155:31;27970:223;:::o;28199:366::-;28341:3;28362:67;28426:2;28421:3;28362:67;:::i;:::-;28355:74;;28438:93;28527:3;28438:93;:::i;:::-;28556:2;28551:3;28547:12;28540:19;;28199:366;;;:::o;28571:419::-;28737:4;28775:2;28764:9;28760:18;28752:26;;28824:9;28818:4;28814:20;28810:1;28799:9;28795:17;28788:47;28852:131;28978:4;28852:131;:::i;:::-;28844:139;;28571:419;;;:::o;28996:221::-;29136:34;29132:1;29124:6;29120:14;29113:58;29205:4;29200:2;29192:6;29188:15;29181:29;28996:221;:::o;29223:366::-;29365:3;29386:67;29450:2;29445:3;29386:67;:::i;:::-;29379:74;;29462:93;29551:3;29462:93;:::i;:::-;29580:2;29575:3;29571:12;29564:19;;29223:366;;;:::o;29595:419::-;29761:4;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:131;30002:4;29876:131;:::i;:::-;29868:139;;29595:419;;;:::o;30020:224::-;30160:34;30156:1;30148:6;30144:14;30137:58;30229:7;30224:2;30216:6;30212:15;30205:32;30020:224;:::o;30250:366::-;30392:3;30413:67;30477:2;30472:3;30413:67;:::i;:::-;30406:74;;30489:93;30578:3;30489:93;:::i;:::-;30607:2;30602:3;30598:12;30591:19;;30250:366;;;:::o;30622:419::-;30788:4;30826:2;30815:9;30811:18;30803:26;;30875:9;30869:4;30865:20;30861:1;30850:9;30846:17;30839:47;30903:131;31029:4;30903:131;:::i;:::-;30895:139;;30622:419;;;:::o;31047:222::-;31187:34;31183:1;31175:6;31171:14;31164:58;31256:5;31251:2;31243:6;31239:15;31232:30;31047:222;:::o;31275:366::-;31417:3;31438:67;31502:2;31497:3;31438:67;:::i;:::-;31431:74;;31514:93;31603:3;31514:93;:::i;:::-;31632:2;31627:3;31623:12;31616:19;;31275:366;;;:::o;31647:419::-;31813:4;31851:2;31840:9;31836:18;31828:26;;31900:9;31894:4;31890:20;31886:1;31875:9;31871:17;31864:47;31928:131;32054:4;31928:131;:::i;:::-;31920:139;;31647:419;;;:::o;32072:225::-;32212:34;32208:1;32200:6;32196:14;32189:58;32281:8;32276:2;32268:6;32264:15;32257:33;32072:225;:::o;32303:366::-;32445:3;32466:67;32530:2;32525:3;32466:67;:::i;:::-;32459:74;;32542:93;32631:3;32542:93;:::i;:::-;32660:2;32655:3;32651:12;32644:19;;32303:366;;;:::o;32675:419::-;32841:4;32879:2;32868:9;32864:18;32856:26;;32928:9;32922:4;32918:20;32914:1;32903:9;32899:17;32892:47;32956:131;33082:4;32956:131;:::i;:::-;32948:139;;32675:419;;;:::o;33100:223::-;33240:34;33236:1;33228:6;33224:14;33217:58;33309:6;33304:2;33296:6;33292:15;33285:31;33100:223;:::o;33329:366::-;33471:3;33492:67;33556:2;33551:3;33492:67;:::i;:::-;33485:74;;33568:93;33657:3;33568:93;:::i;:::-;33686:2;33681:3;33677:12;33670:19;;33329:366;;;:::o;33701:419::-;33867:4;33905:2;33894:9;33890:18;33882:26;;33954:9;33948:4;33944:20;33940:1;33929:9;33925:17;33918:47;33982:131;34108:4;33982:131;:::i;:::-;33974:139;;33701:419;;;:::o;34126:182::-;34266:34;34262:1;34254:6;34250:14;34243:58;34126:182;:::o;34314:366::-;34456:3;34477:67;34541:2;34536:3;34477:67;:::i;:::-;34470:74;;34553:93;34642:3;34553:93;:::i;:::-;34671:2;34666:3;34662:12;34655:19;;34314:366;;;:::o;34686:419::-;34852:4;34890:2;34879:9;34875:18;34867:26;;34939:9;34933:4;34929:20;34925:1;34914:9;34910:17;34903:47;34967:131;35093:4;34967:131;:::i;:::-;34959:139;;34686:419;;;:::o;35111:172::-;35251:24;35247:1;35239:6;35235:14;35228:48;35111:172;:::o;35289:366::-;35431:3;35452:67;35516:2;35511:3;35452:67;:::i;:::-;35445:74;;35528:93;35617:3;35528:93;:::i;:::-;35646:2;35641:3;35637:12;35630:19;;35289:366;;;:::o;35661:419::-;35827:4;35865:2;35854:9;35850:18;35842:26;;35914:9;35908:4;35904:20;35900:1;35889:9;35885:17;35878:47;35942:131;36068:4;35942:131;:::i;:::-;35934:139;;35661:419;;;:::o;36086:174::-;36226:26;36222:1;36214:6;36210:14;36203:50;36086:174;:::o;36266:366::-;36408:3;36429:67;36493:2;36488:3;36429:67;:::i;:::-;36422:74;;36505:93;36594:3;36505:93;:::i;:::-;36623:2;36618:3;36614:12;36607:19;;36266:366;;;:::o;36638:419::-;36804:4;36842:2;36831:9;36827:18;36819:26;;36891:9;36885:4;36881:20;36877:1;36866:9;36862:17;36855:47;36919:131;37045:4;36919:131;:::i;:::-;36911:139;;36638:419;;;:::o;37063:170::-;37203:22;37199:1;37191:6;37187:14;37180:46;37063:170;:::o;37239:366::-;37381:3;37402:67;37466:2;37461:3;37402:67;:::i;:::-;37395:74;;37478:93;37567:3;37478:93;:::i;:::-;37596:2;37591:3;37587:12;37580:19;;37239:366;;;:::o;37611:419::-;37777:4;37815:2;37804:9;37800:18;37792:26;;37864:9;37858:4;37854:20;37850:1;37839:9;37835:17;37828:47;37892:131;38018:4;37892:131;:::i;:::-;37884:139;;37611:419;;;:::o;38036:223::-;38176:34;38172:1;38164:6;38160:14;38153:58;38245:6;38240:2;38232:6;38228:15;38221:31;38036:223;:::o;38265:366::-;38407:3;38428:67;38492:2;38487:3;38428:67;:::i;:::-;38421:74;;38504:93;38593:3;38504:93;:::i;:::-;38622:2;38617:3;38613:12;38606:19;;38265:366;;;:::o;38637:419::-;38803:4;38841:2;38830:9;38826:18;38818:26;;38890:9;38884:4;38880:20;38876:1;38865:9;38861:17;38854:47;38918:131;39044:4;38918:131;:::i;:::-;38910:139;;38637:419;;;:::o;39062:191::-;39102:4;39122:20;39140:1;39122:20;:::i;:::-;39117:25;;39156:20;39174:1;39156:20;:::i;:::-;39151:25;;39195:1;39192;39189:8;39186:34;;;39200:18;;:::i;:::-;39186:34;39245:1;39242;39238:9;39230:17;;39062:191;;;;:::o;39259:143::-;39316:5;39347:6;39341:13;39332:22;;39363:33;39390:5;39363:33;:::i;:::-;39259:143;;;;:::o;39408:351::-;39478:6;39527:2;39515:9;39506:7;39502:23;39498:32;39495:119;;;39533:79;;:::i;:::-;39495:119;39653:1;39678:64;39734:7;39725:6;39714:9;39710:22;39678:64;:::i;:::-;39668:74;;39624:128;39408:351;;;;:::o;39765:85::-;39810:7;39839:5;39828:16;;39765:85;;;:::o;39856:158::-;39914:9;39947:61;39965:42;39974:32;40000:5;39974:32;:::i;:::-;39965:42;:::i;:::-;39947:61;:::i;:::-;39934:74;;39856:158;;;:::o;40020:147::-;40115:45;40154:5;40115:45;:::i;:::-;40110:3;40103:58;40020:147;;:::o;40173:114::-;40240:6;40274:5;40268:12;40258:22;;40173:114;;;:::o;40293:184::-;40392:11;40426:6;40421:3;40414:19;40466:4;40461:3;40457:14;40442:29;;40293:184;;;;:::o;40483:132::-;40550:4;40573:3;40565:11;;40603:4;40598:3;40594:14;40586:22;;40483:132;;;:::o;40621:108::-;40698:24;40716:5;40698:24;:::i;:::-;40693:3;40686:37;40621:108;;:::o;40735:179::-;40804:10;40825:46;40867:3;40859:6;40825:46;:::i;:::-;40903:4;40898:3;40894:14;40880:28;;40735:179;;;;:::o;40920:113::-;40990:4;41022;41017:3;41013:14;41005:22;;40920:113;;;:::o;41069:732::-;41188:3;41217:54;41265:5;41217:54;:::i;:::-;41287:86;41366:6;41361:3;41287:86;:::i;:::-;41280:93;;41397:56;41447:5;41397:56;:::i;:::-;41476:7;41507:1;41492:284;41517:6;41514:1;41511:13;41492:284;;;41593:6;41587:13;41620:63;41679:3;41664:13;41620:63;:::i;:::-;41613:70;;41706:60;41759:6;41706:60;:::i;:::-;41696:70;;41552:224;41539:1;41536;41532:9;41527:14;;41492:284;;;41496:14;41792:3;41785:10;;41193:608;;;41069:732;;;;:::o;41807:831::-;42070:4;42108:3;42097:9;42093:19;42085:27;;42122:71;42190:1;42179:9;42175:17;42166:6;42122:71;:::i;:::-;42203:80;42279:2;42268:9;42264:18;42255:6;42203:80;:::i;:::-;42330:9;42324:4;42320:20;42315:2;42304:9;42300:18;42293:48;42358:108;42461:4;42452:6;42358:108;:::i;:::-;42350:116;;42476:72;42544:2;42533:9;42529:18;42520:6;42476:72;:::i;:::-;42558:73;42626:3;42615:9;42611:19;42602:6;42558:73;:::i;:::-;41807:831;;;;;;;;:::o;42644:442::-;42793:4;42831:2;42820:9;42816:18;42808:26;;42844:71;42912:1;42901:9;42897:17;42888:6;42844:71;:::i;:::-;42925:72;42993:2;42982:9;42978:18;42969:6;42925:72;:::i;:::-;43007;43075:2;43064:9;43060:18;43051:6;43007:72;:::i;:::-;42644:442;;;;;;:::o;43092:807::-;43341:4;43379:3;43368:9;43364:19;43356:27;;43393:71;43461:1;43450:9;43446:17;43437:6;43393:71;:::i;:::-;43474:72;43542:2;43531:9;43527:18;43518:6;43474:72;:::i;:::-;43556:80;43632:2;43621:9;43617:18;43608:6;43556:80;:::i;:::-;43646;43722:2;43711:9;43707:18;43698:6;43646:80;:::i;:::-;43736:73;43804:3;43793:9;43789:19;43780:6;43736:73;:::i;:::-;43819;43887:3;43876:9;43872:19;43863:6;43819:73;:::i;:::-;43092:807;;;;;;;;;:::o;43905:143::-;43962:5;43993:6;43987:13;43978:22;;44009:33;44036:5;44009:33;:::i;:::-;43905:143;;;;:::o;44054:663::-;44142:6;44150;44158;44207:2;44195:9;44186:7;44182:23;44178:32;44175:119;;;44213:79;;:::i;:::-;44175:119;44333:1;44358:64;44414:7;44405:6;44394:9;44390:22;44358:64;:::i;:::-;44348:74;;44304:128;44471:2;44497:64;44553:7;44544:6;44533:9;44529:22;44497:64;:::i;:::-;44487:74;;44442:129;44610:2;44636:64;44692:7;44683:6;44672:9;44668:22;44636:64;:::i;:::-;44626:74;;44581:129;44054:663;;;;;:::o

Swarm Source

ipfs://f92ad2fb7d1ffb9f2303ce84241233f18a78303263a25a73029211af5a59a769
Loading