ETH Price: $2,452.35 (-1.95%)

Contract

0xC8ac1DC3c2216297a9d23a7c16D84Ef4f291DC50
 

Overview

ETH Balance

14 wei

Eth Value

Less Than $0.01 (@ $2,452.35/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve151942312022-07-22 19:10:03834 days ago1658517003IN
0xC8ac1DC3...4f291DC50
0 ETH0.0007439615.96344537
Approve150313092022-06-26 22:53:30860 days ago1656284010IN
0xC8ac1DC3...4f291DC50
0 ETH0.0017487437.52350937
Approve150311602022-06-26 22:14:11860 days ago1656281651IN
0xC8ac1DC3...4f291DC50
0 ETH0.0018584439.87744198
Approve150310502022-06-26 21:47:33860 days ago1656280053IN
0xC8ac1DC3...4f291DC50
0 ETH0.0013137528.18985291
Approve150310202022-06-26 21:40:04860 days ago1656279604IN
0xC8ac1DC3...4f291DC50
0 ETH0.0014641131.41600706
Approve150309462022-06-26 21:19:44860 days ago1656278384IN
0xC8ac1DC3...4f291DC50
0 ETH0.001015421.78794976
Approve150309142022-06-26 21:13:36860 days ago1656278016IN
0xC8ac1DC3...4f291DC50
0 ETH0.0016602335.62429486
Approve150309132022-06-26 21:13:08860 days ago1656277988IN
0xC8ac1DC3...4f291DC50
0 ETH0.0014847731.85932549
Approve150309032022-06-26 21:09:53860 days ago1656277793IN
0xC8ac1DC3...4f291DC50
0 ETH0.0014673531.48551683
Approve150308922022-06-26 21:07:15860 days ago1656277635IN
0xC8ac1DC3...4f291DC50
0 ETH0.0020196843.33715726
Approve150308922022-06-26 21:07:15860 days ago1656277635IN
0xC8ac1DC3...4f291DC50
0 ETH0.0020196843.33715726
Approve150308822022-06-26 21:02:30860 days ago1656277350IN
0xC8ac1DC3...4f291DC50
0 ETH0.001289227.66297435
Approve150308812022-06-26 21:02:02860 days ago1656277322IN
0xC8ac1DC3...4f291DC50
0 ETH0.0014896632.17972569
Approve150308532022-06-26 20:55:12860 days ago1656276912IN
0xC8ac1DC3...4f291DC50
0 ETH0.0013891629.80776451
Approve150308322022-06-26 20:49:51860 days ago1656276591IN
0xC8ac1DC3...4f291DC50
0 ETH0.0017245737.00487375
Approve150308212022-06-26 20:46:35860 days ago1656276395IN
0xC8ac1DC3...4f291DC50
0 ETH0.0014996832.17938947
Approve150308192022-06-26 20:46:05860 days ago1656276365IN
0xC8ac1DC3...4f291DC50
0 ETH0.0015497433.25354345
Approve150308192022-06-26 20:46:05860 days ago1656276365IN
0xC8ac1DC3...4f291DC50
0 ETH0.0015497433.25354345
Approve150308192022-06-26 20:46:05860 days ago1656276365IN
0xC8ac1DC3...4f291DC50
0 ETH0.0015497433.25354345
Approve150308082022-06-26 20:43:33860 days ago1656276213IN
0xC8ac1DC3...4f291DC50
0 ETH0.002043643.85043156
Approve150308072022-06-26 20:43:09860 days ago1656276189IN
0xC8ac1DC3...4f291DC50
0 ETH0.0019501341.84489416
Renounce Ownersh...150307992022-06-26 20:41:39860 days ago1656276099IN
0xC8ac1DC3...4f291DC50
0 ETH0.0012877955.04340663
Approve150307922022-06-26 20:37:49860 days ago1656275869IN
0xC8ac1DC3...4f291DC50
0 ETH0.0013079228.06458403
Approve150307912022-06-26 20:37:39860 days ago1656275859IN
0xC8ac1DC3...4f291DC50
0 ETH0.0012093625.94987621
Approve150307882022-06-26 20:36:54860 days ago1656275814IN
0xC8ac1DC3...4f291DC50
0 ETH0.0011724525.15773797
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
151529582022-07-16 9:33:22841 days ago1657964002
0xC8ac1DC3...4f291DC50
0.00005324 ETH
151529582022-07-16 9:33:22841 days ago1657964002
0xC8ac1DC3...4f291DC50
0.00005324 ETH
150625672022-07-02 10:27:09855 days ago1656757629
0xC8ac1DC3...4f291DC50
0.00005706 ETH
150625672022-07-02 10:27:09855 days ago1656757629
0xC8ac1DC3...4f291DC50
0.00005706 ETH
150387352022-06-28 8:13:05859 days ago1656403985
0xC8ac1DC3...4f291DC50
0.00006122 ETH
150387352022-06-28 8:13:05859 days ago1656403985
0xC8ac1DC3...4f291DC50
0.00006122 ETH
150344482022-06-27 12:51:44859 days ago1656334304
0xC8ac1DC3...4f291DC50
0.00006491 ETH
150344482022-06-27 12:51:44859 days ago1656334304
0xC8ac1DC3...4f291DC50
0.00006491 ETH
150313152022-06-26 22:54:28860 days ago1656284068
0xC8ac1DC3...4f291DC50
0.00006991 ETH
150313152022-06-26 22:54:28860 days ago1656284068
0xC8ac1DC3...4f291DC50
0.00006991 ETH
150313092022-06-26 22:53:30860 days ago1656284010
0xC8ac1DC3...4f291DC50
0.00007551 ETH
150313092022-06-26 22:53:30860 days ago1656284010
0xC8ac1DC3...4f291DC50
0.00007551 ETH
150312982022-06-26 22:50:09860 days ago1656283809
0xC8ac1DC3...4f291DC50
0.00008182 ETH
150312982022-06-26 22:50:09860 days ago1656283809
0xC8ac1DC3...4f291DC50
0.00008182 ETH
150312922022-06-26 22:49:02860 days ago1656283742
0xC8ac1DC3...4f291DC50
0.00008895 ETH
150312922022-06-26 22:49:02860 days ago1656283742
0xC8ac1DC3...4f291DC50
0.00008895 ETH
150312912022-06-26 22:48:34860 days ago1656283714
0xC8ac1DC3...4f291DC50
0.00009706 ETH
150312912022-06-26 22:48:34860 days ago1656283714
0xC8ac1DC3...4f291DC50
0.00009706 ETH
150311702022-06-26 22:18:34860 days ago1656281914
0xC8ac1DC3...4f291DC50
0.00010371 ETH
150311702022-06-26 22:18:34860 days ago1656281914
0xC8ac1DC3...4f291DC50
0.00010371 ETH
150311632022-06-26 22:14:57860 days ago1656281697
0xC8ac1DC3...4f291DC50
0.00011388 ETH
150311632022-06-26 22:14:57860 days ago1656281697
0xC8ac1DC3...4f291DC50
0.00011388 ETH
150311462022-06-26 22:11:07860 days ago1656281467
0xC8ac1DC3...4f291DC50
0.00012618 ETH
150311462022-06-26 22:11:07860 days ago1656281467
0xC8ac1DC3...4f291DC50
0.00012618 ETH
150311292022-06-26 22:06:15860 days ago1656281175
0xC8ac1DC3...4f291DC50
0.00013111 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BearishInu

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-26
*/

// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.4;

interface IERC20 {
    
    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);
}

library SafeMath {
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
    
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
    
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
    
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
    
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }


    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }
    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }
    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

abstract contract Ownable is Context {
    address internal _owner;
    address private _previousOwner;
    uint256 public _lockTime;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    
    function owner() public view virtual 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;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock.");
        require(block.timestamp > _lockTime , "Contract is locked.");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

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

interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract BearishInu is Context, IERC20, Ownable {
    using SafeMath for uint256;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
    address public _marketingWalletAddress;     // TODO - team wallet here
    address public _burnAddress = 0x000000000000000000000000000000000000dEaD;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    string private _name;
    string private _symbol;
    uint256 private _decimals;

    // Buy tax 
    uint256 private _buyTaxFee       = 0;
    uint256 private _buyLiquidityFee = 5;
    uint256 private _buyMarketingFee = 0;

    // Sell tax 
    uint256 private _sellTaxFee       = 0; 
    uint256 private _sellLiquidityFee = 5;
    uint256 private _sellMarketingFee = 0;

    uint256 public _taxFee = _buyTaxFee;
    uint256 public _liquidityFee = _buyLiquidityFee;
    uint256 public _marketingFee = _buyMarketingFee;

    uint256 private _previousTaxFee = _taxFee;
    uint256 private _previousMarketingFee = _liquidityFee;
    uint256 private _previousLiquidityFee = _marketingFee;
    
    uint256 public _maxWallet;

    uint256 public constant MAX_TRADE_FREQUENCY_BLOCKS = 1;
    mapping (address => uint256) public blockLastTrade;
    
    IUniswapV2Router public uniswapV2Router;
    address public uniswapV2Pair;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public numTokensSellToAddToLiquidity;
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event MaxWalletUpdated(uint256 newMaxWallet);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _name = "Bearish Inu";
        _symbol = "BEARISH";
        _decimals = 9;
        _tTotal = 10000000000 * 10 ** _decimals;
        _rTotal = (MAX - (MAX % _tTotal));
        numTokensSellToAddToLiquidity = 1000000 * 10 ** _decimals;
        _marketingWalletAddress = msg.sender;
        _maxWallet = 3 * _tTotal / 100;
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[address(this)] = true;

        //exclude from rewards 
        _isExcluded[_burnAddress] = true;
        _isExcluded[uniswapV2Pair] = true;
    
        _owner = _msgSender();
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

    function decimals() public view returns (uint256) {
        return _decimals;
    }

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: 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, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _takeMarketing(tMarketing);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setSellFeePercent(uint256 tFee, uint256 lFee, uint256 mFee) external onlyOwner {
       _sellTaxFee       = tFee; 
       _sellLiquidityFee = lFee;
       _sellMarketingFee = mFee;
    }

    function setBuyFeePercent(uint256 tFee, uint256 lFee, uint256 mFee) external onlyOwner {
       _buyTaxFee       = tFee; 
       _buyLiquidityFee = lFee;
       _buyMarketingFee = mFee;
    } 
   
    function setMarketingWalletAddress(address _addr) external onlyOwner {
        _marketingWalletAddress = _addr;
    }
    
    function setNumTokensSellToAddToLiquidity(uint256 amount) external onlyOwner {
        numTokensSellToAddToLiquidity = amount * 10 **_decimals;

        emit MinTokensBeforeSwapUpdated(amount);
    }
    
    function setMaxWallet(uint256 maxWallet) external onlyOwner {
        _maxWallet = maxWallet * 10 ** _decimals;

        emit MaxWalletUpdated(maxWallet);
    }

    function setRouterAddress(address newRouter) external onlyOwner {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(newRouter);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    // to withdraw stucked ETH 
    function withdrawStuckFunds(uint amount) external onlyOwner{
        // This is the current recommended method to use.
        (bool sent,) = _owner.call{value: amount}("");
        require(sent, "Failed to send ETH");    
    }
    
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tMarketing, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tMarketing);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(tMarketing);
        return (tTransferAmount, tFee, tLiquidity, tMarketing);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rMarketing);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function _takeMarketing(uint256 tMarketing) private {
        uint256 currentRate =  _getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);
        _rOwned[_marketingWalletAddress] = _rOwned[_marketingWalletAddress].add(rMarketing);
        if(_isExcluded[_marketingWalletAddress])
            _tOwned[_marketingWalletAddress] = _tOwned[_marketingWalletAddress].add(tMarketing);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateMarketingFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_marketingFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function removeAllFee() private { 
        _previousTaxFee = _taxFee;
        _previousMarketingFee = _marketingFee;
        _previousLiquidityFee = _liquidityFee;
        
        _taxFee = 0;
        _marketingFee = 0;
        _liquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _marketingFee = _previousMarketingFee;
        _liquidityFee = _previousLiquidityFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            swapAndLiquify(contractTokenBalance);
        }
        
        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
         else {

             if(from != uniswapV2Pair){
                 require(block.number > blockLastTrade[from] + MAX_TRADE_FREQUENCY_BLOCKS,
                     "Trade too frequent.");                 
             }

             if(to != uniswapV2Pair){
                 require(amount + balanceOf(to) <= _maxWallet, "Max wallet exceeded.");                 
             }
                 
            if (from == uniswapV2Pair) { // Buy
                require(tx.origin == to, "Antibot.");
                blockLastTrade[to] = block.number;  

                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee;
                _marketingFee = _buyMarketingFee;
            }
            else if (to == uniswapV2Pair){ // Sell
                _taxFee = _sellTaxFee;
                _liquidityFee = _sellLiquidityFee;
                _marketingFee = _sellMarketingFee;
            }
            else { // Transfer
                _taxFee = _buyTaxFee;
                _liquidityFee = _buyLiquidityFee;
                _marketingFee = _buyMarketingFee;
            }
        }
        
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 tFee = _marketingFee.add(_liquidityFee);
        uint256 marketingTokens = contractTokenBalance.div(tFee).mul(_marketingFee);
        uint256 liquidityTokens = contractTokenBalance.sub(marketingTokens);
        tFee = _marketingFee.add(_liquidityFee.div(2));
        uint256 half      = liquidityTokens.div(2);
        uint256 otherHalf = liquidityTokens.sub(half);
        uint256 swapTokens = marketingTokens.add(half);

        uint256 initialBalance = address(this).balance;        
        swapTokensForEth(swapTokens);
        uint256 newBalance = address(this).balance.sub(initialBalance);

        uint256 marketingFunds = newBalance.div(tFee).mul(_marketingFee);
        (bool success, ) = payable(_marketingWalletAddress).call{
            value: marketingFunds,
            gas: 30000}("");
        require(success, " _marketingWalletAddress transfer is reverted");
        uint256 halfFunds = newBalance.div(tFee).mul(_liquidityFee.div(2));
        addLiquidity(otherHalf, halfFunds);        
        emit SwapAndLiquify(half, halfFunds, 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(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeMarketing(tMarketing);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _takeMarketing(tMarketing);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _takeMarketing(tMarketing);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"MaxWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"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":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"inputs":[],"name":"MAX_TRADE_FREQUENCY_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blockLastTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFee","type":"uint256"},{"internalType":"uint256","name":"lFee","type":"uint256"},{"internalType":"uint256","name":"mFee","type":"uint256"}],"name":"setBuyFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setMarketingWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFee","type":"uint256"},{"internalType":"uint256","name":"lFee","type":"uint256"},{"internalType":"uint256","name":"mFee","type":"uint256"}],"name":"setSellFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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 IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a80546001600160a01b03191661dead17905560006011819055600560128190556013829055601482905560158190556016829055601782905560188190556019829055601a829055601b55601c556020805460ff60a81b1916600160a81b1790553480156200007457600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360408051808201909152600b8082526a4265617269736820496e7560a81b6020909201918252620000e891600e916200048c565b50604080518082019091526007808252660848a82a492a6960cb1b60209092019182526200011991600f916200048c565b50600960108190556200012e90600a620005c2565b6200013f906402540be40062000680565b600b8190556200015290600019620006f9565b6200016090600019620006a2565b600c556010546200017390600a620005c2565b6200018290620f424062000680565b602155600980546001600160a01b03191633179055600b54606490620001aa90600362000680565b620001b6919062000562565b601d55600c543360009081526003602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000256919062000532565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029f57600080fd5b505afa158015620002b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002da919062000532565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200032357600080fd5b505af115801562000338573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035e919062000532565b602080546001600160a01b03199081166001600160a01b0393841617909155601f80549091169183169190911790556001600660006200039b3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260068452828120805486166001908117909155600a5483168252600785528382208054871682179055935490911681522080549092161790556200040d3390565b600080546001600160a01b0319166001600160a01b0392909216919091179055620004353390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200047d91815260200190565b60405180910390a3506200073c565b8280546200049a90620006bc565b90600052602060002090601f016020900481019282620004be576000855562000509565b82601f10620004d957805160ff191683800117855562000509565b8280016001018555821562000509579182015b8281111562000509578251825591602001919060010190620004ec565b50620005179291506200051b565b5090565b5b808211156200051757600081556001016200051c565b60006020828403121562000544578081fd5b81516001600160a01b03811681146200055b578182fd5b9392505050565b60008262000574576200057462000726565b500490565b600181815b80851115620005ba5781600019048211156200059e576200059e62000710565b80851615620005ac57918102915b93841c93908002906200057e565b509250929050565b60006200055b8383600082620005db575060016200067a565b81620005ea575060006200067a565b81600181146200060357600281146200060e576200062e565b60019150506200067a565b60ff84111562000622576200062262000710565b50506001821b6200067a565b5060208310610133831016604e8410600b841016171562000653575081810a6200067a565b6200065f838362000579565b806000190482111562000676576200067662000710565b0290505b92915050565b60008160001904831182151516156200069d576200069d62000710565b500290565b600082821015620006b757620006b762000710565b500390565b600181811c90821680620006d157607f821691505b60208210811415620006f357634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200070b576200070b62000726565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b612ff9806200074c6000396000f3fe60806040526004361061028c5760003560e01c80635342acb41161015a578063a69df4b5116100c1578063dd4670641161007a578063dd467064146107ac578063dd62ed3e146107cc578063df41a77314610812578063ea2f0b3714610832578063f0f165af14610852578063f2fde38b1461087257600080fd5b8063a69df4b514610701578063a9059cbb14610716578063bd3900c014610736578063be19674b14610756578063c49b9a8014610776578063d12a76881461079657600080fd5b806382247ec01161011357806382247ec01461063257806388f82020146106485780638da5cb5b14610681578063920d89841461069f57806395d89b41146106cc578063a457c2d7146106e157600080fd5b80635342acb4146105785780635d0044ca146105b15780636bc87c3a146105d157806370a08231146105e7578063715018a61461060757806379af25a61461061c57600080fd5b806339509351116101fe578063437823ec116101b7578063437823ec146104b75780634549b039146104d757806349bd5a5e146104f75780634a74bb02146105175780634cb80fd51461053857806352390c021461055857600080fd5b8063395093511461040c5780633b124fe71461042c5780633bd5d173146104425780633e128fcd146104625780634144d9e41461047757806341cb87fc1461049757600080fd5b806318160ddd1161025057806318160ddd1461036c57806322976e0d1461038157806323b872dd146103975780632d838119146103b7578063313ce567146103d75780633685d419146103ec57600080fd5b806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f3578063151cd1c2146103125780631694505e1461033457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610892565b6040516102ba9190612c81565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612ba1565b610924565b60405190151581526020016102ba565b3480156102ff57600080fd5b50600d545b6040519081526020016102ba565b34801561031e57600080fd5b5061033261032d366004612c29565b61093b565b005b34801561034057600080fd5b50601f54610354906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b34801561037857600080fd5b50600b54610304565b34801561038d57600080fd5b5061030460195481565b3480156103a357600080fd5b506102e36103b2366004612b61565b61097c565b3480156103c357600080fd5b506103046103d2366004612be6565b6109e5565b3480156103e357600080fd5b50601054610304565b3480156103f857600080fd5b50610332610407366004612af1565b610a69565b34801561041857600080fd5b506102e3610427366004612ba1565b610c58565b34801561043857600080fd5b5061030460175481565b34801561044e57600080fd5b5061033261045d366004612be6565b610c8e565b34801561046e57600080fd5b50610304600181565b34801561048357600080fd5b50600954610354906001600160a01b031681565b3480156104a357600080fd5b506103326104b2366004612af1565b610d7a565b3480156104c357600080fd5b506103326104d2366004612af1565b610f4c565b3480156104e357600080fd5b506103046104f2366004612bfe565b610f9a565b34801561050357600080fd5b50602054610354906001600160a01b031681565b34801561052357600080fd5b506020546102e390600160a81b900460ff1681565b34801561054457600080fd5b50610332610553366004612af1565b611029565b34801561056457600080fd5b50610332610573366004612af1565b611075565b34801561058457600080fd5b506102e3610593366004612af1565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105bd57600080fd5b506103326105cc366004612be6565b6111c8565b3480156105dd57600080fd5b5061030460185481565b3480156105f357600080fd5b50610304610602366004612af1565b611244565b34801561061357600080fd5b506103326112a3565b34801561062857600080fd5b5061030460025481565b34801561063e57600080fd5b50610304601d5481565b34801561065457600080fd5b506102e3610663366004612af1565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561068d57600080fd5b506000546001600160a01b0316610354565b3480156106ab57600080fd5b506103046106ba366004612af1565b601e6020526000908152604090205481565b3480156106d857600080fd5b506102ad611305565b3480156106ed57600080fd5b506102e36106fc366004612ba1565b611314565b34801561070d57600080fd5b50610332611363565b34801561072257600080fd5b506102e3610731366004612ba1565b61145f565b34801561074257600080fd5b50600a54610354906001600160a01b031681565b34801561076257600080fd5b50610332610771366004612c29565b61146c565b34801561078257600080fd5b50610332610791366004612bcc565b6114a4565b3480156107a257600080fd5b5061030460215481565b3480156107b857600080fd5b506103326107c7366004612be6565b611518565b3480156107d857600080fd5b506103046107e7366004612b29565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061033261082d366004612be6565b611587565b34801561083e57600080fd5b5061033261084d366004612af1565b611649565b34801561085e57600080fd5b5061033261086d366004612be6565b611694565b34801561087e57600080fd5b5061033261088d366004612af1565b611709565b6060600e80546108a190612ed2565b80601f01602080910402602001604051908101604052809291908181526020018280546108cd90612ed2565b801561091a5780601f106108ef5761010080835404028352916020019161091a565b820191906000526020600020905b8154815290600101906020018083116108fd57829003601f168201915b5050505050905090565b60006109313384846117e1565b5060015b92915050565b6000546001600160a01b0316331461096e5760405162461bcd60e51b815260040161096590612cd4565b60405180910390fd5b601492909255601555601655565b6000610989848484611905565b6109db84336109d685604051806060016040528060288152602001612f57602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611cb7565b6117e1565b5060019392505050565b6000600c54821115610a4c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610965565b6000610a56611ce3565b9050610a628382611d06565b9392505050565b6000546001600160a01b03163314610a935760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03811660009081526007602052604090205460ff16610afb5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610965565b60005b600854811015610c5457816001600160a01b031660088281548110610b3357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610c425760088054610b5e90600190612ebb565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600880546001600160a01b039092169183908110610bb657634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610c1c57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610c4c81612f0d565b915050610afe565b5050565b3360008181526005602090815260408083206001600160a01b038716845290915281205490916109319185906109d69086611d12565b3360008181526007602052604090205460ff1615610d035760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610965565b6000610d0e83611d1e565b5050506001600160a01b038616600090815260036020526040902054939450610d3c93925084915050611d79565b6001600160a01b038316600090815260036020526040902055600c54610d629082611d79565b600c55600d54610d729084611d12565b600d55505050565b6000546001600160a01b03163314610da45760405162461bcd60e51b815260040161096590612cd4565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610de257600080fd5b505afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612b0d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190612b0d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612b0d565b602080546001600160a01b039283166001600160a01b031991821617909155601f805493909216921691909117905550565b6000546001600160a01b03163314610f765760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600b54831115610fee5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610965565b8161100e576000610ffe84611d1e565b5094965061093595505050505050565b600061101984611d1e565b5093965061093595505050505050565b6000546001600160a01b031633146110535760405162461bcd60e51b815260040161096590612cd4565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461109f5760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03811660009081526007602052604090205460ff16156111085760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610965565b6001600160a01b03811660009081526003602052604090205415611162576001600160a01b038116600090815260036020526040902054611148906109e5565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b031633146111f25760405162461bcd60e51b815260040161096590612cd4565b60105461120090600a612df4565b61120a9082612e9c565b601d556040518181527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace906020015b60405180910390a150565b6001600160a01b03811660009081526007602052604081205460ff161561128157506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610935906109e5565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161096590612cd4565b600080546040516001600160a01b0390911690600080516020612f7f833981519152908390a3600080546001600160a01b0319169055565b6060600f80546108a190612ed2565b600061093133846109d685604051806060016040528060258152602001612f9f602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611cb7565b6001546001600160a01b031633146113c95760405162461bcd60e51b8152602060048201526024808201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60448201526337b1b59760e11b6064820152608401610965565b60025442116114105760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903637b1b5b2b21760691b6044820152606401610965565b600154600080546040516001600160a01b039384169390911691600080516020612f7f83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610931338484611905565b6000546001600160a01b031633146114965760405162461bcd60e51b815260040161096590612cd4565b601192909255601255601355565b6000546001600160a01b031633146114ce5760405162461bcd60e51b815260040161096590612cd4565b6020805460ff60a81b1916600160a81b8315159081029190911782556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599101611239565b6000546001600160a01b031633146115425760405162461bcd60e51b815260040161096590612cd4565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516815560028290556040518190600080516020612f7f833981519152908290a350565b6000546001600160a01b031633146115b15760405162461bcd60e51b815260040161096590612cd4565b600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146115fe576040519150601f19603f3d011682016040523d82523d6000602084013e611603565b606091505b5050905080610c545760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610965565b6000546001600160a01b031633146116735760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116be5760405162461bcd60e51b815260040161096590612cd4565b6010546116cc90600a612df4565b6116d69082612e9c565b6021556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611239565b6000546001600160a01b031633146117335760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b0381166117985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b600080546040516001600160a01b0380851693921691600080516020612f7f83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610965565b6001600160a01b0382166118a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610965565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6001600160a01b0382166119cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610965565b60008111611a2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610965565b6000611a3830611244565b60215490915081108015908190611a595750602054600160a01b900460ff16155b8015611a7357506020546001600160a01b03868116911614155b8015611a885750602054600160a81b900460ff165b15611a9b576021549150611a9b82611d85565b6001600160a01b03851660009081526006602052604090205460019060ff1680611add57506001600160a01b03851660009081526006602052604090205460ff165b15611aea57506000611ca3565b6020546001600160a01b03878116911614611b68576001600160a01b0386166000908152601e6020526040902054611b2490600190612d79565b4311611b685760405162461bcd60e51b81526020600482015260136024820152722a3930b232903a37b790333932b8bab2b73a1760691b6044820152606401610965565b6020546001600160a01b03868116911614611bd857601d54611b8986611244565b611b939086612d79565b1115611bd85760405162461bcd60e51b815260206004820152601460248201527326b0bc103bb0b63632ba1032bc31b2b2b232b21760611b6044820152606401610965565b6020546001600160a01b0387811691161415611c6357326001600160a01b03861614611c315760405162461bcd60e51b815260206004820152600860248201526720b73a34b137ba1760c11b6044820152606401610965565b6001600160a01b0385166000908152601e60205260409020439055601154601755601254601855601354601955611ca3565b6020546001600160a01b0386811691161415611c9057601454601755601554601855601654601955611ca3565b6011546017556012546018556013546019555b611caf86868684611fb0565b505050505050565b60008184841115611cdb5760405162461bcd60e51b81526004016109659190612c81565b505050900390565b6000806000611cf0612150565b9092509050611cff8282611d06565b9250505090565b6000610a628284612d91565b6000610a628284612d79565b6000806000806000806000806000806000611d388c61230a565b93509350935093506000806000611d598f878787611d54611ce3565b61235f565b919f509d509b509599509397509195509350505050919395979092949650565b6000610a628284612ebb565b6020805460ff60a01b1916600160a01b179055601854601954600091611dab9190611d12565b90506000611dce601954611dc88486611d0690919063ffffffff16565b906123c1565b90506000611ddc8483611d79565b9050611e00611df76002601854611d0690919063ffffffff16565b60195490611d12565b92506000611e0f826002611d06565b90506000611e1d8383611d79565b90506000611e2b8584611d12565b905047611e37826123cd565b6000611e434783611d79565b90506000611e60601954611dc88b85611d0690919063ffffffff16565b6009546040519192506000916001600160a01b039091169061753090849084818181858888f193505050503d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b5050905080611f235760405162461bcd60e51b815260206004820152602d60248201527f205f6d61726b6574696e6757616c6c657441646472657373207472616e73666560448201526c1c881a5cc81c995d995c9d1959609a1b6064820152608401610965565b6000611f48611f3e6002601854611d0690919063ffffffff16565b611dc8868e611d06565b9050611f54878261254a565b60408051898152602081018390529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506020805460ff60a01b1916905550505050505050505050565b80611fda57611fda60178054601a5560198054601b5560188054601c556000928390559082905555565b6001600160a01b03841660009081526007602052604090205460ff16801561201b57506001600160a01b03831660009081526007602052604090205460ff16155b156120305761202b84848461262e565b61212e565b6001600160a01b03841660009081526007602052604090205460ff1615801561207157506001600160a01b03831660009081526007602052604090205460ff165b156120815761202b848484612774565b6001600160a01b03841660009081526007602052604090205460ff161580156120c357506001600160a01b03831660009081526007602052604090205460ff16155b156120d35761202b848484612833565b6001600160a01b03841660009081526007602052604090205460ff16801561211357506001600160a01b03831660009081526007602052604090205460ff165b156121235761202b84848461288d565b61212e848484612833565b8061214a5761214a601a54601755601b54601955601c54601855565b50505050565b600c54600b546000918291825b6008548110156122da5782600360006008848154811061218d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061220657508160046000600884815481106121df57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561221c57600c54600b54945094505050509091565b612270600360006008848154811061224457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d79565b92506122c6600460006008848154811061229a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d79565b9150806122d281612f0d565b91505061215d565b50600b54600c546122ea91611d06565b82101561230157600c54600b549350935050509091565b90939092509050565b600080600080600061231b86612916565b9050600061232887612938565b9050600061233588612954565b9050600061234f8261234985818d89611d79565b90611d79565b9993985091965094509092505050565b600080808061236e89866123c1565b9050600061237c89876123c1565b9050600061238a89886123c1565b9050600061239889896123c1565b905060006123ac8261234985818989611d79565b949d949c50929a509298505050505050505050565b6000610a628284612e9c565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061241057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561246457600080fd5b505afa158015612478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249c9190612b0d565b816001815181106124bd57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601f546124e391309116846117e1565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061251c908590600090869030904290600401612d09565b600060405180830381600087803b15801561253657600080fd5b505af1158015611caf573d6000803e3d6000fd5b601f546125629030906001600160a01b0316846117e1565b601f546001600160a01b031663f305d71982308560008061258b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126279190612c54565b5050505050565b600080600080600080600061264288611d1e565b965096509650965096509650965061268888600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546126b79088611d79565b6001600160a01b03808c1660009081526003602052604080822093909355908b16815220546126e69087611d12565b6001600160a01b038a1660009081526003602052604090205561270882612970565b612711816129f9565b61271b8584612ab8565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161276091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061278888611d1e565b96509650965096509650965096506127ce87600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546128049085611d12565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546126e69087611d12565b600080600080600080600061284788611d1e565b96509650965096509650965096506126b787600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b60008060008060008060006128a188611d1e565b96509650965096509650965096506128e788600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546127ce9088611d79565b60006109356064612932601754856123c190919063ffffffff16565b90611d06565b60006109356064612932601854856123c190919063ffffffff16565b60006109356064612932601954856123c190919063ffffffff16565b600061297a611ce3565b9050600061298883836123c1565b306000908152600360205260409020549091506129a59082611d12565b3060009081526003602090815260408083209390935560079052205460ff16156129f457306000908152600460205260409020546129e39084611d12565b306000908152600460205260409020555b505050565b6000612a03611ce3565b90506000612a1183836123c1565b6009546001600160a01b0316600090815260036020526040902054909150612a399082611d12565b600980546001600160a01b03908116600090815260036020908152604080832095909555925490911681526007909152205460ff16156129f4576009546001600160a01b0316600090815260046020526040902054612a989084611d12565b6009546001600160a01b0316600090815260046020526040902055505050565b600c54612ac59083611d79565b600c55600d54612ad59082611d12565b600d555050565b80358015158114612aec57600080fd5b919050565b600060208284031215612b02578081fd5b8135610a6281612f3e565b600060208284031215612b1e578081fd5b8151610a6281612f3e565b60008060408385031215612b3b578081fd5b8235612b4681612f3e565b91506020830135612b5681612f3e565b809150509250929050565b600080600060608486031215612b75578081fd5b8335612b8081612f3e565b92506020840135612b9081612f3e565b929592945050506040919091013590565b60008060408385031215612bb3578182fd5b8235612bbe81612f3e565b946020939093013593505050565b600060208284031215612bdd578081fd5b610a6282612adc565b600060208284031215612bf7578081fd5b5035919050565b60008060408385031215612c10578182fd5b82359150612c2060208401612adc565b90509250929050565b600080600060608486031215612c3d578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c68578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612cad57858101830151858201604001528201612c91565b81811115612cbe5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612d585784516001600160a01b031683529383019391830191600101612d33565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d8c57612d8c612f28565b500190565b600082612dac57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612dec578160001904821115612dd257612dd2612f28565b80851615612ddf57918102915b93841c9390800290612db6565b509250929050565b6000610a628383600082612e0a57506001610935565b81612e1757506000610935565b8160018114612e2d5760028114612e3757612e53565b6001915050610935565b60ff841115612e4857612e48612f28565b50506001821b610935565b5060208310610133831016604e8410600b8410161715612e76575081810a610935565b612e808383612db1565b8060001904821115612e9457612e94612f28565b029392505050565b6000816000190483118215151615612eb657612eb6612f28565b500290565b600082821015612ecd57612ecd612f28565b500390565b600181811c90821680612ee657607f821691505b60208210811415612f0757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f2157612f21612f28565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612f5357600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c564dea9709c97f35a0d2dfec84440ae9420fd862a0479909b263351d89e07a464736f6c63430008040033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80635342acb41161015a578063a69df4b5116100c1578063dd4670641161007a578063dd467064146107ac578063dd62ed3e146107cc578063df41a77314610812578063ea2f0b3714610832578063f0f165af14610852578063f2fde38b1461087257600080fd5b8063a69df4b514610701578063a9059cbb14610716578063bd3900c014610736578063be19674b14610756578063c49b9a8014610776578063d12a76881461079657600080fd5b806382247ec01161011357806382247ec01461063257806388f82020146106485780638da5cb5b14610681578063920d89841461069f57806395d89b41146106cc578063a457c2d7146106e157600080fd5b80635342acb4146105785780635d0044ca146105b15780636bc87c3a146105d157806370a08231146105e7578063715018a61461060757806379af25a61461061c57600080fd5b806339509351116101fe578063437823ec116101b7578063437823ec146104b75780634549b039146104d757806349bd5a5e146104f75780634a74bb02146105175780634cb80fd51461053857806352390c021461055857600080fd5b8063395093511461040c5780633b124fe71461042c5780633bd5d173146104425780633e128fcd146104625780634144d9e41461047757806341cb87fc1461049757600080fd5b806318160ddd1161025057806318160ddd1461036c57806322976e0d1461038157806323b872dd146103975780632d838119146103b7578063313ce567146103d75780633685d419146103ec57600080fd5b806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f3578063151cd1c2146103125780631694505e1461033457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610892565b6040516102ba9190612c81565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612ba1565b610924565b60405190151581526020016102ba565b3480156102ff57600080fd5b50600d545b6040519081526020016102ba565b34801561031e57600080fd5b5061033261032d366004612c29565b61093b565b005b34801561034057600080fd5b50601f54610354906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b34801561037857600080fd5b50600b54610304565b34801561038d57600080fd5b5061030460195481565b3480156103a357600080fd5b506102e36103b2366004612b61565b61097c565b3480156103c357600080fd5b506103046103d2366004612be6565b6109e5565b3480156103e357600080fd5b50601054610304565b3480156103f857600080fd5b50610332610407366004612af1565b610a69565b34801561041857600080fd5b506102e3610427366004612ba1565b610c58565b34801561043857600080fd5b5061030460175481565b34801561044e57600080fd5b5061033261045d366004612be6565b610c8e565b34801561046e57600080fd5b50610304600181565b34801561048357600080fd5b50600954610354906001600160a01b031681565b3480156104a357600080fd5b506103326104b2366004612af1565b610d7a565b3480156104c357600080fd5b506103326104d2366004612af1565b610f4c565b3480156104e357600080fd5b506103046104f2366004612bfe565b610f9a565b34801561050357600080fd5b50602054610354906001600160a01b031681565b34801561052357600080fd5b506020546102e390600160a81b900460ff1681565b34801561054457600080fd5b50610332610553366004612af1565b611029565b34801561056457600080fd5b50610332610573366004612af1565b611075565b34801561058457600080fd5b506102e3610593366004612af1565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105bd57600080fd5b506103326105cc366004612be6565b6111c8565b3480156105dd57600080fd5b5061030460185481565b3480156105f357600080fd5b50610304610602366004612af1565b611244565b34801561061357600080fd5b506103326112a3565b34801561062857600080fd5b5061030460025481565b34801561063e57600080fd5b50610304601d5481565b34801561065457600080fd5b506102e3610663366004612af1565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561068d57600080fd5b506000546001600160a01b0316610354565b3480156106ab57600080fd5b506103046106ba366004612af1565b601e6020526000908152604090205481565b3480156106d857600080fd5b506102ad611305565b3480156106ed57600080fd5b506102e36106fc366004612ba1565b611314565b34801561070d57600080fd5b50610332611363565b34801561072257600080fd5b506102e3610731366004612ba1565b61145f565b34801561074257600080fd5b50600a54610354906001600160a01b031681565b34801561076257600080fd5b50610332610771366004612c29565b61146c565b34801561078257600080fd5b50610332610791366004612bcc565b6114a4565b3480156107a257600080fd5b5061030460215481565b3480156107b857600080fd5b506103326107c7366004612be6565b611518565b3480156107d857600080fd5b506103046107e7366004612b29565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061033261082d366004612be6565b611587565b34801561083e57600080fd5b5061033261084d366004612af1565b611649565b34801561085e57600080fd5b5061033261086d366004612be6565b611694565b34801561087e57600080fd5b5061033261088d366004612af1565b611709565b6060600e80546108a190612ed2565b80601f01602080910402602001604051908101604052809291908181526020018280546108cd90612ed2565b801561091a5780601f106108ef5761010080835404028352916020019161091a565b820191906000526020600020905b8154815290600101906020018083116108fd57829003601f168201915b5050505050905090565b60006109313384846117e1565b5060015b92915050565b6000546001600160a01b0316331461096e5760405162461bcd60e51b815260040161096590612cd4565b60405180910390fd5b601492909255601555601655565b6000610989848484611905565b6109db84336109d685604051806060016040528060288152602001612f57602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611cb7565b6117e1565b5060019392505050565b6000600c54821115610a4c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610965565b6000610a56611ce3565b9050610a628382611d06565b9392505050565b6000546001600160a01b03163314610a935760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03811660009081526007602052604090205460ff16610afb5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610965565b60005b600854811015610c5457816001600160a01b031660088281548110610b3357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610c425760088054610b5e90600190612ebb565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600880546001600160a01b039092169183908110610bb657634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610c1c57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610c4c81612f0d565b915050610afe565b5050565b3360008181526005602090815260408083206001600160a01b038716845290915281205490916109319185906109d69086611d12565b3360008181526007602052604090205460ff1615610d035760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610965565b6000610d0e83611d1e565b5050506001600160a01b038616600090815260036020526040902054939450610d3c93925084915050611d79565b6001600160a01b038316600090815260036020526040902055600c54610d629082611d79565b600c55600d54610d729084611d12565b600d55505050565b6000546001600160a01b03163314610da45760405162461bcd60e51b815260040161096590612cd4565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610de257600080fd5b505afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612b0d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190612b0d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612b0d565b602080546001600160a01b039283166001600160a01b031991821617909155601f805493909216921691909117905550565b6000546001600160a01b03163314610f765760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600b54831115610fee5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610965565b8161100e576000610ffe84611d1e565b5094965061093595505050505050565b600061101984611d1e565b5093965061093595505050505050565b6000546001600160a01b031633146110535760405162461bcd60e51b815260040161096590612cd4565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461109f5760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03811660009081526007602052604090205460ff16156111085760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610965565b6001600160a01b03811660009081526003602052604090205415611162576001600160a01b038116600090815260036020526040902054611148906109e5565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b031633146111f25760405162461bcd60e51b815260040161096590612cd4565b60105461120090600a612df4565b61120a9082612e9c565b601d556040518181527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace906020015b60405180910390a150565b6001600160a01b03811660009081526007602052604081205460ff161561128157506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610935906109e5565b6000546001600160a01b031633146112cd5760405162461bcd60e51b815260040161096590612cd4565b600080546040516001600160a01b0390911690600080516020612f7f833981519152908390a3600080546001600160a01b0319169055565b6060600f80546108a190612ed2565b600061093133846109d685604051806060016040528060258152602001612f9f602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611cb7565b6001546001600160a01b031633146113c95760405162461bcd60e51b8152602060048201526024808201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60448201526337b1b59760e11b6064820152608401610965565b60025442116114105760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903637b1b5b2b21760691b6044820152606401610965565b600154600080546040516001600160a01b039384169390911691600080516020612f7f83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610931338484611905565b6000546001600160a01b031633146114965760405162461bcd60e51b815260040161096590612cd4565b601192909255601255601355565b6000546001600160a01b031633146114ce5760405162461bcd60e51b815260040161096590612cd4565b6020805460ff60a81b1916600160a81b8315159081029190911782556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599101611239565b6000546001600160a01b031633146115425760405162461bcd60e51b815260040161096590612cd4565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516815560028290556040518190600080516020612f7f833981519152908290a350565b6000546001600160a01b031633146115b15760405162461bcd60e51b815260040161096590612cd4565b600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146115fe576040519150601f19603f3d011682016040523d82523d6000602084013e611603565b606091505b5050905080610c545760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610965565b6000546001600160a01b031633146116735760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116be5760405162461bcd60e51b815260040161096590612cd4565b6010546116cc90600a612df4565b6116d69082612e9c565b6021556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611239565b6000546001600160a01b031633146117335760405162461bcd60e51b815260040161096590612cd4565b6001600160a01b0381166117985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b600080546040516001600160a01b0380851693921691600080516020612f7f83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610965565b6001600160a01b0382166118a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610965565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6001600160a01b0382166119cb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610965565b60008111611a2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610965565b6000611a3830611244565b60215490915081108015908190611a595750602054600160a01b900460ff16155b8015611a7357506020546001600160a01b03868116911614155b8015611a885750602054600160a81b900460ff165b15611a9b576021549150611a9b82611d85565b6001600160a01b03851660009081526006602052604090205460019060ff1680611add57506001600160a01b03851660009081526006602052604090205460ff165b15611aea57506000611ca3565b6020546001600160a01b03878116911614611b68576001600160a01b0386166000908152601e6020526040902054611b2490600190612d79565b4311611b685760405162461bcd60e51b81526020600482015260136024820152722a3930b232903a37b790333932b8bab2b73a1760691b6044820152606401610965565b6020546001600160a01b03868116911614611bd857601d54611b8986611244565b611b939086612d79565b1115611bd85760405162461bcd60e51b815260206004820152601460248201527326b0bc103bb0b63632ba1032bc31b2b2b232b21760611b6044820152606401610965565b6020546001600160a01b0387811691161415611c6357326001600160a01b03861614611c315760405162461bcd60e51b815260206004820152600860248201526720b73a34b137ba1760c11b6044820152606401610965565b6001600160a01b0385166000908152601e60205260409020439055601154601755601254601855601354601955611ca3565b6020546001600160a01b0386811691161415611c9057601454601755601554601855601654601955611ca3565b6011546017556012546018556013546019555b611caf86868684611fb0565b505050505050565b60008184841115611cdb5760405162461bcd60e51b81526004016109659190612c81565b505050900390565b6000806000611cf0612150565b9092509050611cff8282611d06565b9250505090565b6000610a628284612d91565b6000610a628284612d79565b6000806000806000806000806000806000611d388c61230a565b93509350935093506000806000611d598f878787611d54611ce3565b61235f565b919f509d509b509599509397509195509350505050919395979092949650565b6000610a628284612ebb565b6020805460ff60a01b1916600160a01b179055601854601954600091611dab9190611d12565b90506000611dce601954611dc88486611d0690919063ffffffff16565b906123c1565b90506000611ddc8483611d79565b9050611e00611df76002601854611d0690919063ffffffff16565b60195490611d12565b92506000611e0f826002611d06565b90506000611e1d8383611d79565b90506000611e2b8584611d12565b905047611e37826123cd565b6000611e434783611d79565b90506000611e60601954611dc88b85611d0690919063ffffffff16565b6009546040519192506000916001600160a01b039091169061753090849084818181858888f193505050503d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b5050905080611f235760405162461bcd60e51b815260206004820152602d60248201527f205f6d61726b6574696e6757616c6c657441646472657373207472616e73666560448201526c1c881a5cc81c995d995c9d1959609a1b6064820152608401610965565b6000611f48611f3e6002601854611d0690919063ffffffff16565b611dc8868e611d06565b9050611f54878261254a565b60408051898152602081018390529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506020805460ff60a01b1916905550505050505050505050565b80611fda57611fda60178054601a5560198054601b5560188054601c556000928390559082905555565b6001600160a01b03841660009081526007602052604090205460ff16801561201b57506001600160a01b03831660009081526007602052604090205460ff16155b156120305761202b84848461262e565b61212e565b6001600160a01b03841660009081526007602052604090205460ff1615801561207157506001600160a01b03831660009081526007602052604090205460ff165b156120815761202b848484612774565b6001600160a01b03841660009081526007602052604090205460ff161580156120c357506001600160a01b03831660009081526007602052604090205460ff16155b156120d35761202b848484612833565b6001600160a01b03841660009081526007602052604090205460ff16801561211357506001600160a01b03831660009081526007602052604090205460ff165b156121235761202b84848461288d565b61212e848484612833565b8061214a5761214a601a54601755601b54601955601c54601855565b50505050565b600c54600b546000918291825b6008548110156122da5782600360006008848154811061218d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061220657508160046000600884815481106121df57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561221c57600c54600b54945094505050509091565b612270600360006008848154811061224457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d79565b92506122c6600460006008848154811061229a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d79565b9150806122d281612f0d565b91505061215d565b50600b54600c546122ea91611d06565b82101561230157600c54600b549350935050509091565b90939092509050565b600080600080600061231b86612916565b9050600061232887612938565b9050600061233588612954565b9050600061234f8261234985818d89611d79565b90611d79565b9993985091965094509092505050565b600080808061236e89866123c1565b9050600061237c89876123c1565b9050600061238a89886123c1565b9050600061239889896123c1565b905060006123ac8261234985818989611d79565b949d949c50929a509298505050505050505050565b6000610a628284612e9c565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061241057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561246457600080fd5b505afa158015612478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249c9190612b0d565b816001815181106124bd57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601f546124e391309116846117e1565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061251c908590600090869030904290600401612d09565b600060405180830381600087803b15801561253657600080fd5b505af1158015611caf573d6000803e3d6000fd5b601f546125629030906001600160a01b0316846117e1565b601f546001600160a01b031663f305d71982308560008061258b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126279190612c54565b5050505050565b600080600080600080600061264288611d1e565b965096509650965096509650965061268888600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546126b79088611d79565b6001600160a01b03808c1660009081526003602052604080822093909355908b16815220546126e69087611d12565b6001600160a01b038a1660009081526003602052604090205561270882612970565b612711816129f9565b61271b8584612ab8565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161276091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061278888611d1e565b96509650965096509650965096506127ce87600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546128049085611d12565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546126e69087611d12565b600080600080600080600061284788611d1e565b96509650965096509650965096506126b787600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b60008060008060008060006128a188611d1e565b96509650965096509650965096506128e788600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d7990919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546127ce9088611d79565b60006109356064612932601754856123c190919063ffffffff16565b90611d06565b60006109356064612932601854856123c190919063ffffffff16565b60006109356064612932601954856123c190919063ffffffff16565b600061297a611ce3565b9050600061298883836123c1565b306000908152600360205260409020549091506129a59082611d12565b3060009081526003602090815260408083209390935560079052205460ff16156129f457306000908152600460205260409020546129e39084611d12565b306000908152600460205260409020555b505050565b6000612a03611ce3565b90506000612a1183836123c1565b6009546001600160a01b0316600090815260036020526040902054909150612a399082611d12565b600980546001600160a01b03908116600090815260036020908152604080832095909555925490911681526007909152205460ff16156129f4576009546001600160a01b0316600090815260046020526040902054612a989084611d12565b6009546001600160a01b0316600090815260046020526040902055505050565b600c54612ac59083611d79565b600c55600d54612ad59082611d12565b600d555050565b80358015158114612aec57600080fd5b919050565b600060208284031215612b02578081fd5b8135610a6281612f3e565b600060208284031215612b1e578081fd5b8151610a6281612f3e565b60008060408385031215612b3b578081fd5b8235612b4681612f3e565b91506020830135612b5681612f3e565b809150509250929050565b600080600060608486031215612b75578081fd5b8335612b8081612f3e565b92506020840135612b9081612f3e565b929592945050506040919091013590565b60008060408385031215612bb3578182fd5b8235612bbe81612f3e565b946020939093013593505050565b600060208284031215612bdd578081fd5b610a6282612adc565b600060208284031215612bf7578081fd5b5035919050565b60008060408385031215612c10578182fd5b82359150612c2060208401612adc565b90509250929050565b600080600060608486031215612c3d578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c68578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612cad57858101830151858201604001528201612c91565b81811115612cbe5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612d585784516001600160a01b031683529383019391830191600101612d33565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d8c57612d8c612f28565b500190565b600082612dac57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115612dec578160001904821115612dd257612dd2612f28565b80851615612ddf57918102915b93841c9390800290612db6565b509250929050565b6000610a628383600082612e0a57506001610935565b81612e1757506000610935565b8160018114612e2d5760028114612e3757612e53565b6001915050610935565b60ff841115612e4857612e48612f28565b50506001821b610935565b5060208310610133831016604e8410600b8410161715612e76575081810a610935565b612e808383612db1565b8060001904821115612e9457612e94612f28565b029392505050565b6000816000190483118215151615612eb657612eb6612f28565b500290565b600082821015612ecd57612ecd612f28565b500390565b600181811c90821680612ee657607f821691505b60208210811415612f0757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f2157612f21612f28565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612f5357600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c564dea9709c97f35a0d2dfec84440ae9420fd862a0479909b263351d89e07a464736f6c63430008040033

Deployed Bytecode Sourcemap

6128:21779:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9552:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10466:161;;;;;;;;;;-1:-1:-1;10466:161:0;;;;;:::i;:::-;;:::i;:::-;;;4720:14:1;;4713:22;4695:41;;4683:2;4668:18;10466:161:0;4650:92:1;11587:87:0;;;;;;;;;;-1:-1:-1;11656:10:0;;11587:87;;;12972:25:1;;;12960:2;12945:18;11587:87:0;12927:76:1;14551:199:0;;;;;;;;;;-1:-1:-1;14551:199:0;;;;;:::i;:::-;;:::i;:::-;;7713:39;;;;;;;;;;-1:-1:-1;7713:39:0;;;;-1:-1:-1;;;;;7713:39:0;;;;;;-1:-1:-1;;;;;3590:32:1;;;3572:51;;3560:2;3545:18;7713:39:0;3527:102:1;9831:95:0;;;;;;;;;;-1:-1:-1;9911:7:0;;9831:95;;7325:47;;;;;;;;;;;;;;;;10635:313;;;;;;;;;;-1:-1:-1;10635:313:0;;;;;:::i;:::-;;:::i;12514:253::-;;;;;;;;;;-1:-1:-1;12514:253:0;;;;;:::i;:::-;;:::i;9738:85::-;;;;;;;;;;-1:-1:-1;9806:9:0;;9738:85;;13114:477;;;;;;;;;;-1:-1:-1;13114:477:0;;;;;:::i;:::-;;:::i;10956:218::-;;;;;;;;;;-1:-1:-1;10956:218:0;;;;;:::i;:::-;;:::i;7229:35::-;;;;;;;;;;;;;;;;11682:378;;;;;;;;;;-1:-1:-1;11682:378:0;;;;;:::i;:::-;;:::i;7589:54::-;;;;;;;;;;;;7642:1;7589:54;;6541:38;;;;;;;;;;-1:-1:-1;6541:38:0;;;;-1:-1:-1;;;;;6541:38:0;;;15483:314;;;;;;;;;;-1:-1:-1;15483:314:0;;;;;:::i;:::-;;:::i;14310:111::-;;;;;;;;;;-1:-1:-1;14310:111:0;;;;;:::i;:::-;;:::i;12068:438::-;;;;;;;;;;-1:-1:-1;12068:438:0;;;;;:::i;:::-;;:::i;7759:28::-;;;;;;;;;;-1:-1:-1;7759:28:0;;;;-1:-1:-1;;;;;7759:28:0;;;7822:40;;;;;;;;;;-1:-1:-1;7822:40:0;;;;-1:-1:-1;;;7822:40:0;;;;;;14965:119;;;;;;;;;;-1:-1:-1;14965:119:0;;;;;:::i;:::-;;:::i;12775:331::-;;;;;;;;;;-1:-1:-1;12775:331:0;;;;;:::i;:::-;;:::i;20367:123::-;;;;;;;;;;-1:-1:-1;20367:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;20455:27:0;20431:4;20455:27;;;:18;:27;;;;;;;;;20367:123;15311:164;;;;;;;;;;-1:-1:-1;15311:164:0;;;;;:::i;:::-;;:::i;7271:47::-;;;;;;;;;;;;;;;;9934:198;;;;;;;;;;-1:-1:-1;9934:198:0;;;;;:::i;:::-;;:::i;4307:148::-;;;;;;;;;;;;;:::i;3832:24::-;;;;;;;;;;;;;;;;7555:25;;;;;;;;;;;;;;;;11459:120;;;;;;;;;;-1:-1:-1;11459:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;11551:20:0;11527:4;11551:20;;;:11;:20;;;;;;;;;11459:120;4078:87;;;;;;;;;;-1:-1:-1;4124:7:0;4151:6;-1:-1:-1;;;;;4151:6:0;4078:87;;7650:50;;;;;;;;;;-1:-1:-1;7650:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;9643:87;;;;;;;;;;;;;:::i;11182:269::-;;;;;;;;;;-1:-1:-1;11182:269:0;;;;;:::i;:::-;;:::i;5067:294::-;;;;;;;;;;;;;:::i;10140:167::-;;;;;;;;;;-1:-1:-1;10140:167:0;;;;;:::i;:::-;;:::i;6617:72::-;;;;;;;;;;-1:-1:-1;6617:72:0;;;;-1:-1:-1;;;;;6617:72:0;;;14758:195;;;;;;;;;;-1:-1:-1;14758:195:0;;;;;:::i;:::-;;:::i;15805:173::-;;;;;;;;;;-1:-1:-1;15805:173:0;;;;;:::i;:::-;;:::i;7869:44::-;;;;;;;;;;;;;;;;4783:208;;;;;;;;;;-1:-1:-1;4783:208:0;;;;;:::i;:::-;;:::i;10315:143::-;;;;;;;;;;-1:-1:-1;10315:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;10423:18:0;;;10396:7;10423:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10315:143;16019:232;;;;;;;;;;-1:-1:-1;16019:232:0;;;;;:::i;:::-;;:::i;14433:110::-;;;;;;;;;;-1:-1:-1;14433:110:0;;;;;:::i;:::-;;:::i;15096:203::-;;;;;;;;;;-1:-1:-1;15096:203:0;;;;;:::i;:::-;;:::i;4463:244::-;;;;;;;;;;-1:-1:-1;4463:244:0;;;;;:::i;:::-;;:::i;9552:83::-;9589:13;9622:5;9615:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9552:83;:::o;10466:161::-;10541:4;10558:39;3453:10;10581:7;10590:6;10558:8;:39::i;:::-;-1:-1:-1;10615:4:0;10466:161;;;;;:::o;14551:199::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;;;;;;;;;14649:11:::1;:24:::0;;;;14684:17:::1;:24:::0;14718:17:::1;:24:::0;14551:199::o;10635:313::-;10733:4;10750:36;10760:6;10768:9;10779:6;10750:9;:36::i;:::-;10797:121;10806:6;3453:10;10828:89;10866:6;10828:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10828:19:0;;;;;;:11;:19;;;;;;;;3453:10;10828:33;;;;;;;;;;:37;:89::i;:::-;10797:8;:121::i;:::-;-1:-1:-1;10936:4:0;10635:313;;;;;:::o;12514:253::-;12580:7;12619;;12608;:18;;12600:73;;;;-1:-1:-1;;;12600:73:0;;6193:2:1;12600:73:0;;;6175:21:1;6232:2;6212:18;;;6205:30;6271:34;6251:18;;;6244:62;-1:-1:-1;;;6322:18:1;;;6315:40;6372:19;;12600:73:0;6165:232:1;12600:73:0;12684:19;12707:10;:8;:10::i;:::-;12684:33;-1:-1:-1;12735:24:0;:7;12684:33;12735:11;:24::i;:::-;12728:31;12514:253;-1:-1:-1;;;12514:253:0:o;13114:477::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13194:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;13186:60;;;::::0;-1:-1:-1;;;13186:60:0;;8106:2:1;13186:60:0::1;::::0;::::1;8088:21:1::0;8145:2;8125:18;;;8118:30;8184:29;8164:18;;;8157:57;8231:18;;13186:60:0::1;8078:177:1::0;13186:60:0::1;13262:9;13257:327;13281:9;:16:::0;13277:20;::::1;13257:327;;;13339:7;-1:-1:-1::0;;;;;13323:23:0::1;:9;13333:1;13323:12;;;;;;-1:-1:-1::0;;;13323:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;13323:12:0::1;:23;13319:254;;;13382:9;13392:16:::0;;:20:::1;::::0;13411:1:::1;::::0;13392:20:::1;:::i;:::-;13382:31;;;;;;-1:-1:-1::0;;;13382:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;13367:9:::1;:12:::0;;-1:-1:-1;;;;;13382:31:0;;::::1;::::0;13377:1;;13367:12;::::1;;;-1:-1:-1::0;;;13367:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;13367:46:0::1;-1:-1:-1::0;;;;;13367:46:0;;::::1;;::::0;;13432:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;13471:11:::1;:20:::0;;;;:28;;-1:-1:-1;;13471:28:0::1;::::0;;13518:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;13518:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;13518:15:0;;;;;-1:-1:-1;;;;;;13518:15:0::1;::::0;;;;;13257:327:::1;13114:477:::0;:::o;13319:254::-:1;13299:3:::0;::::1;::::0;::::1;:::i;:::-;;;;13257:327;;;;13114:477:::0;:::o;10956:218::-;3453:10;11044:4;11093:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11093:34:0;;;;;;;;;;11044:4;;11061:83;;11084:7;;11093:50;;11132:10;11093:38;:50::i;11682:378::-;3453:10;11734:14;11783:19;;;:11;:19;;;;;;;;11782:20;11774:77;;;;-1:-1:-1;;;11774:77:0;;12615:2:1;11774:77:0;;;12597:21:1;12654:2;12634:18;;;12627:30;12693:34;12673:18;;;12666:62;-1:-1:-1;;;12744:18:1;;;12737:42;12796:19;;11774:77:0;12587:234:1;11774:77:0;11863:15;11888:19;11899:7;11888:10;:19::i;:::-;-1:-1:-1;;;;;;;;11936:15:0;;;;;;:7;:15;;;;;;11862:45;;-1:-1:-1;11936:28:0;;:15;-1:-1:-1;11862:45:0;;-1:-1:-1;;11936:19:0;:28::i;:::-;-1:-1:-1;;;;;11918:15:0;;;;;;:7;:15;;;;;:46;11985:7;;:20;;11997:7;11985:11;:20::i;:::-;11975:7;:30;12029:10;;:23;;12044:7;12029:14;:23::i;:::-;12016:10;:36;-1:-1:-1;;;11682:378:0:o;15483:314::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;15558:33:::1;15611:9;15558:63;;15666:16;-1:-1:-1::0;;;;;15666:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15648:56:0::1;;15713:4;15720:16;-1:-1:-1::0;;;;;15720:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15648:96;::::0;-1:-1:-1;;;;;;15648:96:0::1;::::0;;;;;;-1:-1:-1;;;;;3864:15:1;;;15648:96:0::1;::::0;::::1;3846:34:1::0;3916:15;;3896:18;;;3889:43;3781:18;;15648:96:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15632:13;:112:::0;;-1:-1:-1;;;;;15632:112:0;;::::1;-1:-1:-1::0;;;;;;15632:112:0;;::::1;;::::0;;;15755:15:::1;:34:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;15483:314:0:o;14310:111::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14379:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;14379:34:0::1;14409:4;14379:34;::::0;;14310:111::o;12068:438::-;12158:7;12197;;12186;:18;;12178:62;;;;-1:-1:-1;;;12178:62:0;;8462:2:1;12178:62:0;;;8444:21:1;8501:2;8481:18;;;8474:30;8540:33;8520:18;;;8513:61;8591:18;;12178:62:0;8434:181:1;12178:62:0;12256:17;12251:248;;12291:15;12316:19;12327:7;12316:10;:19::i;:::-;-1:-1:-1;12290:45:0;;-1:-1:-1;12350:14:0;;-1:-1:-1;;;;;;12350:14:0;12251:248;12399:23;12431:19;12442:7;12431:10;:19::i;:::-;-1:-1:-1;12397:53:0;;-1:-1:-1;12465:22:0;;-1:-1:-1;;;;;;12465:22:0;14965:119;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;15045:23:::1;:31:::0;;-1:-1:-1;;;;;;15045:31:0::1;-1:-1:-1::0;;;;;15045:31:0;;;::::1;::::0;;;::::1;::::0;;14965:119::o;12775:331::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12856:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;12855:21;12847:61;;;::::0;-1:-1:-1;;;12847:61:0;;7414:2:1;12847:61:0::1;::::0;::::1;7396:21:1::0;7453:2;7433:18;;;7426:30;7492:29;7472:18;;;7465:57;7539:18;;12847:61:0::1;7386:177:1::0;12847:61:0::1;-1:-1:-1::0;;;;;12922:16:0;::::1;12941:1;12922:16:::0;;;:7:::1;:16;::::0;;;;;:20;12919:108:::1;;-1:-1:-1::0;;;;;12998:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;12978:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;12959:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;12919:108:::1;-1:-1:-1::0;;;;;13037:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;13037:27:0::1;13060:4;13037:27:::0;;::::1;::::0;;;13075:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;13075:23:0::1;::::0;;::::1;::::0;;12775:331::o;15311:164::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;15413:9:::1;::::0;15407:15:::1;::::0;:2:::1;:15;:::i;:::-;15395:27;::::0;:9;:27:::1;:::i;:::-;15382:10;:40:::0;15440:27:::1;::::0;12972:25:1;;;15440:27:0::1;::::0;12960:2:1;12945:18;15440:27:0::1;;;;;;;;15311:164:::0;:::o;9934:198::-;-1:-1:-1;;;;;10024:20:0;;10000:7;10024:20;;;:11;:20;;;;;;;;10020:49;;;-1:-1:-1;;;;;;10053:16:0;;;;;:7;:16;;;;;;;9934:198::o;10020:49::-;-1:-1:-1;;;;;10107:16:0;;;;;;:7;:16;;;;;;10087:37;;:19;:37::i;4307:148::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;4414:1:::1;4398:6:::0;;4377:40:::1;::::0;-1:-1:-1;;;;;4398:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;4377:40:0;4414:1;;4377:40:::1;4445:1;4428:19:::0;;-1:-1:-1;;;;;;4428:19:0::1;::::0;;4307:148::o;9643:87::-;9682:13;9715:7;9708:14;;;;;:::i;11182:269::-;11275:4;11292:129;3453:10;11315:7;11324:96;11363:15;11324:96;;;;;;;;;;;;;;;;;3453:10;11324:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11324:34:0;;;;;;;;;;;;:38;:96::i;5067:294::-;5119:14;;-1:-1:-1;;;;;5119:14:0;5137:10;5119:28;5111:77;;;;-1:-1:-1;;;5111:77:0;;10289:2:1;5111:77:0;;;10271:21:1;10328:2;10308:18;;;10301:30;10367:34;10347:18;;;10340:62;-1:-1:-1;;;10418:18:1;;;10411:34;10462:19;;5111:77:0;10261:226:1;5111:77:0;5225:9;;5207:15;:27;5199:60;;;;-1:-1:-1;;;5199:60:0;;12267:2:1;5199:60:0;;;12249:21:1;12306:2;12286:18;;;12279:30;-1:-1:-1;;;12325:18:1;;;12318:49;12384:18;;5199:60:0;12239:169:1;5199:60:0;5304:14;;;5296:6;;5275:44;;-1:-1:-1;;;;;5304:14:0;;;;5296:6;;;;-1:-1:-1;;;;;;;;;;;5275:44:0;;5339:14;;;5330:23;;-1:-1:-1;;;;;;5330:23:0;-1:-1:-1;;;;;5339:14:0;;;5330:23;;;;;;5067:294::o;10140:167::-;10218:4;10235:42;3453:10;10259:9;10270:6;10235:9;:42::i;14758:195::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;14855:10:::1;:23:::0;;;;14889:16:::1;:23:::0;14922:16:::1;:23:::0;14758:195::o;15805:173::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;15884:21:::1;:32:::0;;-1:-1:-1;;;;15884:32:0::1;-1:-1:-1::0;;;15884:32:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;15932:38:::1;::::0;4695:41:1;;;15932:38:0::1;::::0;4668:18:1;15932:38:0::1;4650:92:1::0;4783:208:0;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;4864:6:::1;::::0;;;4847:23;;-1:-1:-1;;;;;;4847:23:0;;::::1;-1:-1:-1::0;;;;;4864:6:0;::::1;4847:23;::::0;;;4881:19:::1;::::0;;4911:9:::1;:16:::0;;;4943:40:::1;::::0;4864:6;;-1:-1:-1;;;;;;;;;;;4943:40:0;4864:6;;4943:40:::1;4783:208:::0;:::o;16019:232::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;16149:9:::1;16163:6:::0;;:30:::1;::::0;-1:-1:-1;;;;;16163:6:0;;::::1;::::0;16182;;16149:9;16163:30;16149:9;16163:30;16182:6;16163;:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16148:45;;;16212:4;16204:35;;;::::0;-1:-1:-1;;;16204:35:0;;9593:2:1;16204:35:0::1;::::0;::::1;9575:21:1::0;9632:2;9612:18;;;9605:30;-1:-1:-1;;;9651:18:1;;;9644:48;9709:18;;16204:35:0::1;9565:168:1::0;14433:110:0;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14500:27:0::1;14530:5;14500:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;14500:35:0::1;::::0;;14433:110::o;15096:203::-;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;15230:9:::1;::::0;15225:14:::1;::::0;:2:::1;:14;:::i;:::-;15216:23;::::0;:6;:23:::1;:::i;:::-;15184:29;:55:::0;15257:34:::1;::::0;12972:25:1;;;15257:34:0::1;::::0;12960:2:1;12945:18;15257:34:0::1;12927:76:1::0;4463:244:0;4124:7;4151:6;-1:-1:-1;;;;;4151:6:0;3453:10;4215:23;4207:68;;;;-1:-1:-1;;;4207:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4552:22:0;::::1;4544:73;;;::::0;-1:-1:-1;;;4544:73:0;;6604:2:1;4544:73:0::1;::::0;::::1;6586:21:1::0;6643:2;6623:18;;;6616:30;6682:34;6662:18;;;6655:62;-1:-1:-1;;;6733:18:1;;;6726:36;6779:19;;4544:73:0::1;6576:228:1::0;4544:73:0::1;4654:6;::::0;;4633:38:::1;::::0;-1:-1:-1;;;;;4633:38:0;;::::1;::::0;4654:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;4633:38:0;::::1;4682:6;:17:::0;;-1:-1:-1;;;;;;4682:17:0::1;-1:-1:-1::0;;;;;4682:17:0;;;::::1;::::0;;;::::1;::::0;;4463:244::o;20498:337::-;-1:-1:-1;;;;;20591:19:0;;20583:68;;;;-1:-1:-1;;;20583:68:0;;11448:2:1;20583:68:0;;;11430:21:1;11487:2;11467:18;;;11460:30;11526:34;11506:18;;;11499:62;-1:-1:-1;;;11577:18:1;;;11570:34;11621:19;;20583:68:0;11420:226:1;20583:68:0;-1:-1:-1;;;;;20670:21:0;;20662:68;;;;-1:-1:-1;;;20662:68:0;;7011:2:1;20662:68:0;;;6993:21:1;7050:2;7030:18;;;7023:30;7089:34;7069:18;;;7062:62;-1:-1:-1;;;7140:18:1;;;7133:32;7182:19;;20662:68:0;6983:224:1;20662:68:0;-1:-1:-1;;;;;20743:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20795:32;;12972:25:1;;;20795:32:0;;12945:18:1;20795:32:0;;;;;;;20498:337;;;:::o;20843:2160::-;-1:-1:-1;;;;;20965:18:0;;20957:68;;;;-1:-1:-1;;;20957:68:0;;10694:2:1;20957:68:0;;;10676:21:1;10733:2;10713:18;;;10706:30;10772:34;10752:18;;;10745:62;-1:-1:-1;;;10823:18:1;;;10816:35;10868:19;;20957:68:0;10666:227:1;20957:68:0;-1:-1:-1;;;;;21044:16:0;;21036:64;;;;-1:-1:-1;;;21036:64:0;;5789:2:1;21036:64:0;;;5771:21:1;5828:2;5808:18;;;5801:30;5867:34;5847:18;;;5840:62;-1:-1:-1;;;5918:18:1;;;5911:33;5961:19;;21036:64:0;5761:225:1;21036:64:0;21128:1;21119:6;:10;21111:64;;;;-1:-1:-1;;;21111:64:0;;9183:2:1;21111:64:0;;;9165:21:1;9222:2;9202:18;;;9195:30;9261:34;9241:18;;;9234:62;-1:-1:-1;;;9312:18:1;;;9305:39;9361:19;;21111:64:0;9155:231:1;21111:64:0;21196:28;21227:24;21245:4;21227:9;:24::i;:::-;21323:29;;21196:55;;-1:-1:-1;21299:53:0;;;;;;;21381;;-1:-1:-1;21418:16:0;;-1:-1:-1;;;21418:16:0;;;;21417:17;21381:53;:91;;;;-1:-1:-1;21459:13:0;;-1:-1:-1;;;;;21451:21:0;;;21459:13;;21451:21;;21381:91;:129;;;;-1:-1:-1;21489:21:0;;-1:-1:-1;;;21489:21:0;;;;21381:129;21363:289;;;21560:29;;21537:52;;21604:36;21619:20;21604:14;:36::i;:::-;-1:-1:-1;;;;;21705:24:0;;21672:12;21705:24;;;:18;:24;;;;;;21687:4;;21705:24;;;:50;;-1:-1:-1;;;;;;21733:22:0;;;;;;:18;:22;;;;;;;;21705:50;21702:1235;;;-1:-1:-1;21781:5:0;21702:1235;;;21843:13;;-1:-1:-1;;;;;21835:21:0;;;21843:13;;21835:21;21832:197;;-1:-1:-1;;;;;21900:20:0;;;;;;:14;:20;;;;;;:49;;7642:1;;21900:49;:::i;:::-;21885:12;:64;21877:118;;;;-1:-1:-1;;;21877:118:0;;11100:2:1;21877:118:0;;;11082:21:1;11139:2;11119:18;;;11112:30;-1:-1:-1;;;11158:18:1;;;11151:49;11217:18;;21877:118:0;11072:169:1;21877:118:0;22055:13;;-1:-1:-1;;;;;22049:19:0;;;22055:13;;22049:19;22046:146;;22123:10;;22106:13;22116:2;22106:9;:13::i;:::-;22097:22;;:6;:22;:::i;:::-;:36;;22089:69;;;;-1:-1:-1;;;22089:69:0;;9940:2:1;22089:69:0;;;9922:21:1;9979:2;9959:18;;;9952:30;-1:-1:-1;;;9998:18:1;;;9991:50;10058:18;;22089:69:0;9912:170:1;22089:69:0;22237:13;;-1:-1:-1;;;;;22229:21:0;;;22237:13;;22229:21;22225:701;;;22286:9;-1:-1:-1;;;;;22286:15:0;;;22278:36;;;;-1:-1:-1;;;22278:36:0;;7770:2:1;22278:36:0;;;7752:21:1;7809:1;7789:18;;;7782:29;-1:-1:-1;;;7827:18:1;;;7820:38;7875:18;;22278:36:0;7742:157:1;22278:36:0;-1:-1:-1;;;;;22333:18:0;;;;;;:14;:18;;;;;22354:12;22333:33;;22399:10;;22389:7;:20;22444:16;;22428:13;:32;22495:16;;22479:13;:32;22225:701;;;22556:13;;-1:-1:-1;;;;;22550:19:0;;;22556:13;;22550:19;22546:380;;;22607:11;;22597:7;:21;22653:17;;22637:13;:33;22705:17;;22689:13;:33;22546:380;;;22798:10;;22788:7;:20;22843:16;;22827:13;:32;22894:16;;22878:13;:32;22546:380;22957:38;22972:4;22977:2;22980:6;22987:7;22957:14;:38::i;:::-;20843:2160;;;;;;:::o;2693:206::-;2779:7;2840:12;2832:6;;;;2824:29;;;;-1:-1:-1;;;2824:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;2875:5:0;;;2693:206::o;17867:163::-;17908:7;17929:15;17946;17965:19;:17;:19::i;:::-;17928:56;;-1:-1:-1;17928:56:0;-1:-1:-1;18002:20:0;17928:56;;18002:11;:20::i;:::-;17995:27;;;;17867:163;:::o;2475:98::-;2533:7;2560:5;2564:1;2560;:5;:::i;2153:98::-;2211:7;2238:5;2242:1;2238;:5;:::i;16418:472::-;16477:7;16486;16495;16504;16513;16522;16531;16552:23;16577:12;16591:18;16611;16633:20;16645:7;16633:11;:20::i;:::-;16551:102;;;;;;;;16665:15;16682:23;16707:12;16723:62;16735:7;16744:4;16750:10;16762;16774;:8;:10::i;:::-;16723:11;:62::i;:::-;16664:121;;-1:-1:-1;16664:121:0;-1:-1:-1;16664:121:0;-1:-1:-1;16836:15:0;;-1:-1:-1;16853:4:0;;-1:-1:-1;16859:10:0;;-1:-1:-1;16871:10:0;-1:-1:-1;;;;16418:472:0;;;;;;;;;:::o;2259:98::-;2317:7;2344:5;2348:1;2344;:5;:::i;23011:1180::-;8265:16;:23;;-1:-1:-1;;;;8265:23:0;-1:-1:-1;;;8265:23:0;;;23129:13:::1;::::0;23111::::1;::::0;8265:23;;23111:32:::1;::::0;:13;:17:::1;:32::i;:::-;23096:47;;23154:23;23180:49;23215:13;;23180:30;23205:4;23180:20;:24;;:30;;;;:::i;:::-;:34:::0;::::1;:49::i;:::-;23154:75:::0;-1:-1:-1;23240:23:0::1;23266:41;:20:::0;23154:75;23266:24:::1;:41::i;:::-;23240:67;;23325:39;23343:20;23361:1;23343:13;;:17;;:20;;;;:::i;:::-;23325:13;::::0;;:17:::1;:39::i;:::-;23318:46:::0;-1:-1:-1;23375:12:0::1;23395:22;:15:::0;23415:1:::1;23395:19;:22::i;:::-;23375:42:::0;-1:-1:-1;23428:17:0::1;23448:25;:15:::0;23375:42;23448:19:::1;:25::i;:::-;23428:45:::0;-1:-1:-1;23484:18:0::1;23505:25;:15:::0;23525:4;23505:19:::1;:25::i;:::-;23484:46:::0;-1:-1:-1;23568:21:0::1;23608:28;23484:46:::0;23608:16:::1;:28::i;:::-;23647:18;23668:41;:21;23694:14:::0;23668:25:::1;:41::i;:::-;23647:62;;23722:22;23747:39;23772:13;;23747:20;23762:4;23747:10;:14;;:20;;;;:::i;:39::-;23824:23;::::0;23816:103:::1;::::0;23722:64;;-1:-1:-1;23798:12:0::1;::::0;-1:-1:-1;;;;;23824:23:0;;::::1;::::0;23909:5:::1;::::0;23722:64;;23798:12;23816:103;23798:12;23816:103;23722:64;23824:23;23909:5;23816:103:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23797:122;;;23938:7;23930:65;;;::::0;-1:-1:-1;;;23930:65:0;;11853:2:1;23930:65:0::1;::::0;::::1;11835:21:1::0;11892:2;11872:18;;;11865:30;11931:34;11911:18;;;11904:62;-1:-1:-1;;;11982:18:1;;;11975:43;12035:19;;23930:65:0::1;11825:235:1::0;23930:65:0::1;24006:17;24026:46;24051:20;24069:1;24051:13;;:17;;:20;;;;:::i;:::-;24026;:10:::0;24041:4;24026:14:::1;:20::i;:46::-;24006:66;;24083:34;24096:9;24107;24083:12;:34::i;:::-;24141:42;::::0;;14198:25:1;;;14254:2;14239:18;;14232:34;;;14282:18;;;14275:34;;;24141:42:0::1;::::0;14186:2:1;14171:18;24141:42:0::1;;;;;;;-1:-1:-1::0;;8311:16:0;:24;;-1:-1:-1;;;;8311:24:0;;;-1:-1:-1;;;;;;;;;;23011:1180:0:o;25128:834::-;25239:7;25235:40;;25261:14;19971:7;;;19953:15;:25;20013:13;;;19989:21;:37;20061:13;;;20037:21;:37;-1:-1:-1;20095:11:0;;;;20117:17;;;;20145;19909:261;25261:14;-1:-1:-1;;;;;25300:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;25324:22:0;;;;;;:11;:22;;;;;;;;25323:23;25300:46;25296:597;;;25363:48;25385:6;25393:9;25404:6;25363:21;:48::i;:::-;25296:597;;;-1:-1:-1;;;;;25434:19:0;;;;;;:11;:19;;;;;;;;25433:20;:46;;;;-1:-1:-1;;;;;;25457:22:0;;;;;;:11;:22;;;;;;;;25433:46;25429:464;;;25496:46;25516:6;25524:9;25535:6;25496:19;:46::i;25429:464::-;-1:-1:-1;;;;;25565:19:0;;;;;;:11;:19;;;;;;;;25564:20;:47;;;;-1:-1:-1;;;;;;25589:22:0;;;;;;:11;:22;;;;;;;;25588:23;25564:47;25560:333;;;25628:44;25646:6;25654:9;25665:6;25628:17;:44::i;25560:333::-;-1:-1:-1;;;;;25694:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;25717:22:0;;;;;;:11;:22;;;;;;;;25694:45;25690:203;;;25756:48;25778:6;25786:9;25797:6;25756:21;:48::i;25690:203::-;25837:44;25855:6;25863:9;25874:6;25837:17;:44::i;:::-;25917:7;25913:41;;25939:15;20236;;20226:7;:25;20278:21;;20262:13;:37;20326:21;;20310:13;:37;20182:173;25939:15;25128:834;;;;:::o;18038:561::-;18135:7;;18171;;18088;;;;;18195:289;18219:9;:16;18215:20;;18195:289;;;18285:7;18261;:21;18269:9;18279:1;18269:12;;;;;;-1:-1:-1;;;18269:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18269:12:0;18261:21;;;;;;;;;;;;;:31;;:66;;;18320:7;18296;:21;18304:9;18314:1;18304:12;;;;;;-1:-1:-1;;;18304:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18304:12:0;18296:21;;;;;;;;;;;;;:31;18261:66;18257:97;;;18337:7;;18346;;18329:25;;;;;;;18038:561;;:::o;18257:97::-;18379:34;18391:7;:21;18399:9;18409:1;18399:12;;;;;;-1:-1:-1;;;18399:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18399:12:0;18391:21;;;;;;;;;;;;;18379:7;;:11;:34::i;:::-;18369:44;;18438:34;18450:7;:21;18458:9;18468:1;18458:12;;;;;;-1:-1:-1;;;18458:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18458:12:0;18450:21;;;;;;;;;;;;;18438:7;;:11;:34::i;:::-;18428:44;-1:-1:-1;18237:3:0;;;;:::i;:::-;;;;18195:289;;;-1:-1:-1;18520:7:0;;18508;;:20;;:11;:20::i;:::-;18498:7;:30;18494:61;;;18538:7;;18547;;18530:25;;;;;;18038:561;;:::o;18494:61::-;18574:7;;18583;;-1:-1:-1;18038:561:0;-1:-1:-1;18038:561:0:o;16898:429::-;16958:7;16967;16976;16985;17005:12;17020:24;17036:7;17020:15;:24::i;:::-;17005:39;;17055:18;17076:30;17098:7;17076:21;:30::i;:::-;17055:51;;17117:18;17138:30;17160:7;17138:21;:30::i;:::-;17117:51;-1:-1:-1;17179:23:0;17205:49;17117:51;17205:33;17227:10;17205:33;:7;17217:4;17205:11;:17::i;:::-;:21;;:33::i;:49::-;17179:75;17290:4;;-1:-1:-1;17296:10:0;;-1:-1:-1;17296:10:0;-1:-1:-1;16898:429:0;;-1:-1:-1;;;16898:429:0:o;17335:524::-;17470:7;;;;17526:24;:7;17538:11;17526;:24::i;:::-;17508:42;-1:-1:-1;17561:12:0;17576:21;:4;17585:11;17576:8;:21::i;:::-;17561:36;-1:-1:-1;17608:18:0;17629:27;:10;17644:11;17629:14;:27::i;:::-;17608:48;-1:-1:-1;17667:18:0;17688:27;:10;17703:11;17688:14;:27::i;:::-;17667:48;-1:-1:-1;17726:23:0;17752:49;17667:48;17752:33;17774:10;17752:33;:7;17764:4;17752:11;:17::i;:49::-;17820:7;;;;-1:-1:-1;17846:4:0;;-1:-1:-1;17335:524:0;;-1:-1:-1;;;;;;;;;17335:524:0:o;2365:98::-;2423:7;2450:5;2454:1;2450;:5;:::i;24199:499::-;24289:16;;;24303:1;24289:16;;;;;;;;24265:21;;24289:16;;;;;;;;;;-1:-1:-1;24289:16:0;24265:40;;24334:4;24316;24321:1;24316:7;;;;;;-1:-1:-1;;;24316:7:0;;;;;;;;;-1:-1:-1;;;;;24316:23:0;;;:7;;;;;;;;;;:23;;;;24360:15;;:22;;;-1:-1:-1;;;24360:22:0;;;;:15;;;;;:20;;:22;;;;;24316:7;;24360:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24350:4;24355:1;24350:7;;;;;;-1:-1:-1;;;24350:7:0;;;;;;;;;-1:-1:-1;;;;;24350:32:0;;;:7;;;;;;;;;:32;24425:15;;24393:62;;24410:4;;24425:15;24443:11;24393:8;:62::i;:::-;24466:15;;:224;;-1:-1:-1;;;24466:224:0;;-1:-1:-1;;;;;24466:15:0;;;;:66;;:224;;24547:11;;24466:15;;24617:4;;24644;;24664:15;;24466:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24706:414;24819:15;;24787:62;;24804:4;;-1:-1:-1;;;;;24819:15:0;24837:11;24787:8;:62::i;:::-;24860:15;;-1:-1:-1;;;;;24860:15:0;:31;24899:9;24932:4;24952:11;24860:15;;25064:7;4124;4151:6;-1:-1:-1;;;;;4151:6:0;;4078:87;25064:7;24860:252;;;;;;-1:-1:-1;;;;;;24860:252:0;;;-1:-1:-1;;;;;4302:15:1;;;24860:252:0;;;4284:34:1;4334:18;;;4327:34;;;;4377:18;;;4370:34;;;;4420:18;;;4413:34;4484:15;;;4463:19;;;4456:44;25086:15:0;4516:19:1;;;4509:35;4218:19;;24860:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24706:414;;:::o;27188:623::-;27291:15;27308:23;27333:12;27347:23;27372:12;27386:18;27406;27428:19;27439:7;27428:10;:19::i;:::-;27290:157;;;;;;;;;;;;;;27476:28;27496:7;27476;:15;27484:6;-1:-1:-1;;;;;27476:15:0;-1:-1:-1;;;;;27476:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;27458:15:0;;;;;;:7;:15;;;;;;;;:46;;;;27533:7;:15;;;;:28;;27553:7;27533:19;:28::i;:::-;-1:-1:-1;;;;;27515:15:0;;;;;;;:7;:15;;;;;;:46;;;;27593:18;;;;;;;:39;;27616:15;27593:22;:39::i;:::-;-1:-1:-1;;;;;27572:18:0;;;;;;:7;:18;;;;;:60;27646:26;27661:10;27646:14;:26::i;:::-;27683;27698:10;27683:14;:26::i;:::-;27720:23;27732:4;27738;27720:11;:23::i;:::-;27776:9;-1:-1:-1;;;;;27759:44:0;27768:6;-1:-1:-1;;;;;27759:44:0;;27787:15;27759:44;;;;12972:25:1;;12960:2;12945:18;;12927:76;27759:44:0;;;;;;;;27188:623;;;;;;;;;;:::o;26537:643::-;26638:15;26655:23;26680:12;26694:23;26719:12;26733:18;26753;26775:19;26786:7;26775:10;:19::i;:::-;26637:157;;;;;;;;;;;;;;26823:28;26843:7;26823;:15;26831:6;-1:-1:-1;;;;;26823:15:0;-1:-1:-1;;;;;26823:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;26805:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;26883:18;;;;;:7;:18;;;;;:39;;26906:15;26883:22;:39::i;:::-;-1:-1:-1;;;;;26862:18:0;;;;;;:7;:18;;;;;;;;:60;;;;26954:7;:18;;;;:39;;26977:15;26954:22;:39::i;25970:559::-;26069:15;26086:23;26111:12;26125:23;26150:12;26164:18;26184;26206:19;26217:7;26206:10;:19::i;:::-;26068:157;;;;;;;;;;;;;;26254:28;26274:7;26254;:15;26262:6;-1:-1:-1;;;;;26254:15:0;-1:-1:-1;;;;;26254:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;13599:699::-;13702:15;13719:23;13744:12;13758:23;13783:12;13797:18;13817;13839:19;13850:7;13839:10;:19::i;:::-;13701:157;;;;;;;;;;;;;;13887:28;13907:7;13887;:15;13895:6;-1:-1:-1;;;;;13887:15:0;-1:-1:-1;;;;;13887:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;13869:15:0;;;;;;:7;:15;;;;;;;;:46;;;;13944:7;:15;;;;:28;;13964:7;13944:19;:28::i;19395:154::-;19459:7;19486:55;19525:5;19486:20;19498:7;;19486;:11;;:20;;;;:::i;:::-;:24;;:55::i;19731:166::-;19801:7;19828:61;19873:5;19828:26;19840:13;;19828:7;:11;;:26;;;;:::i;19557:166::-;19627:7;19654:61;19699:5;19654:26;19666:13;;19654:7;:11;;:26;;;;:::i;18611:355::-;18674:19;18697:10;:8;:10::i;:::-;18674:33;-1:-1:-1;18718:18:0;18739:27;:10;18674:33;18739:14;:27::i;:::-;18818:4;18802:22;;;;:7;:22;;;;;;18718:48;;-1:-1:-1;18802:38:0;;18718:48;18802:26;:38::i;:::-;18793:4;18777:22;;;;:7;:22;;;;;;;;:63;;;;18854:11;:26;;;;;;18851:107;;;18936:4;18920:22;;;;:7;:22;;;;;;:38;;18947:10;18920:26;:38::i;:::-;18911:4;18895:22;;;;:7;:22;;;;;:63;18851:107;18611:355;;;:::o;18978:405::-;19041:19;19064:10;:8;:10::i;:::-;19041:33;-1:-1:-1;19085:18:0;19106:27;:10;19041:33;19106:14;:27::i;:::-;19187:23;;-1:-1:-1;;;;;19187:23:0;19179:32;;;;:7;:32;;;;;;19085:48;;-1:-1:-1;19179:48:0;;19085;19179:36;:48::i;:::-;19152:23;;;-1:-1:-1;;;;;19152:23:0;;;19144:32;;;;:7;:32;;;;;;;;:83;;;;19253:23;;;;;19241:36;;:11;:36;;;;;;;19238:137;;;19335:23;;-1:-1:-1;;;;;19335:23:0;19327:32;;;;:7;:32;;;;;;:48;;19364:10;19327:36;:48::i;:::-;19300:23;;-1:-1:-1;;;;;19300:23:0;19292:32;;;;:7;:32;;;;;:83;18978:405;;;:::o;16263:147::-;16341:7;;:17;;16353:4;16341:11;:17::i;:::-;16331:7;:27;16382:10;;:20;;16397:4;16382:14;:20::i;:::-;16369:10;:33;-1:-1:-1;;16263:147:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;707:398::-;775:6;783;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:31;945:5;920:31;:::i;:::-;970:5;-1:-1:-1;1027:2:1;1012:18;;999:32;1040:33;999:32;1040:33;:::i;:::-;1092:7;1082:17;;;794:311;;;;;:::o;1110:466::-;1187:6;1195;1203;1256:2;1244:9;1235:7;1231:23;1227:32;1224:2;;;1277:6;1269;1262:22;1224:2;1321:9;1308:23;1340:31;1365:5;1340:31;:::i;:::-;1390:5;-1:-1:-1;1447:2:1;1432:18;;1419:32;1460:33;1419:32;1460:33;:::i;:::-;1214:362;;1512:7;;-1:-1:-1;;;1566:2:1;1551:18;;;;1538:32;;1214:362::o;1581:325::-;1649:6;1657;1710:2;1698:9;1689:7;1685:23;1681:32;1678:2;;;1731:6;1723;1716:22;1678:2;1775:9;1762:23;1794:31;1819:5;1794:31;:::i;:::-;1844:5;1896:2;1881:18;;;;1868:32;;-1:-1:-1;;;1668:238:1:o;1911:190::-;1967:6;2020:2;2008:9;1999:7;1995:23;1991:32;1988:2;;;2041:6;2033;2026:22;1988:2;2069:26;2085:9;2069:26;:::i;2106:190::-;2165:6;2218:2;2206:9;2197:7;2193:23;2189:32;2186:2;;;2239:6;2231;2224:22;2186:2;-1:-1:-1;2267:23:1;;2176:120;-1:-1:-1;2176:120:1:o;2301:258::-;2366:6;2374;2427:2;2415:9;2406:7;2402:23;2398:32;2395:2;;;2448:6;2440;2433:22;2395:2;2489:9;2476:23;2466:33;;2518:35;2549:2;2538:9;2534:18;2518:35;:::i;:::-;2508:45;;2385:174;;;;;:::o;2564:326::-;2641:6;2649;2657;2710:2;2698:9;2689:7;2685:23;2681:32;2678:2;;;2731:6;2723;2716:22;2678:2;-1:-1:-1;;2759:23:1;;;2829:2;2814:18;;2801:32;;-1:-1:-1;2880:2:1;2865:18;;;2852:32;;2668:222;-1:-1:-1;2668:222:1:o;2895:316::-;2983:6;2991;2999;3052:2;3040:9;3031:7;3027:23;3023:32;3020:2;;;3073:6;3065;3058:22;3020:2;3107:9;3101:16;3091:26;;3157:2;3146:9;3142:18;3136:25;3126:35;;3201:2;3190:9;3186:18;3180:25;3170:35;;3010:201;;;;;:::o;4979:603::-;5091:4;5120:2;5149;5138:9;5131:21;5181:6;5175:13;5224:6;5219:2;5208:9;5204:18;5197:34;5249:4;5262:140;5276:6;5273:1;5270:13;5262:140;;;5371:14;;;5367:23;;5361:30;5337:17;;;5356:2;5333:26;5326:66;5291:10;;5262:140;;;5420:6;5417:1;5414:13;5411:2;;;5490:4;5485:2;5476:6;5465:9;5461:22;5457:31;5450:45;5411:2;-1:-1:-1;5566:2:1;5545:15;-1:-1:-1;;5541:29:1;5526:45;;;;5573:2;5522:54;;5100:482;-1:-1:-1;;;5100:482:1:o;8620:356::-;8822:2;8804:21;;;8841:18;;;8834:30;8900:34;8895:2;8880:18;;8873:62;8967:2;8952:18;;8794:182::o;13008:983::-;13270:4;13318:3;13307:9;13303:19;13349:6;13338:9;13331:25;13375:2;13413:6;13408:2;13397:9;13393:18;13386:34;13456:3;13451:2;13440:9;13436:18;13429:31;13480:6;13515;13509:13;13546:6;13538;13531:22;13584:3;13573:9;13569:19;13562:26;;13623:2;13615:6;13611:15;13597:29;;13644:4;13657:195;13671:6;13668:1;13665:13;13657:195;;;13736:13;;-1:-1:-1;;;;;13732:39:1;13720:52;;13827:15;;;;13792:12;;;;13768:1;13686:9;13657:195;;;-1:-1:-1;;;;;;;13908:32:1;;;;13903:2;13888:18;;13881:60;-1:-1:-1;;;13972:3:1;13957:19;13950:35;13869:3;13279:712;-1:-1:-1;;;13279:712:1:o;14320:128::-;14360:3;14391:1;14387:6;14384:1;14381:13;14378:2;;;14397:18;;:::i;:::-;-1:-1:-1;14433:9:1;;14368:80::o;14453:217::-;14493:1;14519;14509:2;;-1:-1:-1;;;14544:31:1;;14598:4;14595:1;14588:15;14626:4;14551:1;14616:15;14509:2;-1:-1:-1;14655:9:1;;14499:171::o;14675:422::-;14764:1;14807:5;14764:1;14821:270;14842:7;14832:8;14829:21;14821:270;;;14901:4;14897:1;14893:6;14889:17;14883:4;14880:27;14877:2;;;14910:18;;:::i;:::-;14960:7;14950:8;14946:22;14943:2;;;14980:16;;;;14943:2;15059:22;;;;15019:15;;;;14821:270;;;14825:3;14739:358;;;;;:::o;15102:131::-;15162:5;15191:36;15218:8;15212:4;15287:5;15317:8;15307:2;;-1:-1:-1;15358:1:1;15372:5;;15307:2;15406:4;15396:2;;-1:-1:-1;15443:1:1;15457:5;;15396:2;15488:4;15506:1;15501:59;;;;15574:1;15569:130;;;;15481:218;;15501:59;15531:1;15522:10;;15545:5;;;15569:130;15606:3;15596:8;15593:17;15590:2;;;15613:18;;:::i;:::-;-1:-1:-1;;15669:1:1;15655:16;;15684:5;;15481:218;;15783:2;15773:8;15770:16;15764:3;15758:4;15755:13;15751:36;15745:2;15735:8;15732:16;15727:2;15721:4;15718:12;15714:35;15711:77;15708:2;;;-1:-1:-1;15820:19:1;;;15852:5;;15708:2;15899:34;15924:8;15918:4;15899:34;:::i;:::-;15969:6;15965:1;15961:6;15957:19;15948:7;15945:32;15942:2;;;15980:18;;:::i;:::-;16018:20;;15297:747;-1:-1:-1;;;15297:747:1:o;16049:168::-;16089:7;16155:1;16151;16147:6;16143:14;16140:1;16137:21;16132:1;16125:9;16118:17;16114:45;16111:2;;;16162:18;;:::i;:::-;-1:-1:-1;16202:9:1;;16101:116::o;16222:125::-;16262:4;16290:1;16287;16284:8;16281:2;;;16295:18;;:::i;:::-;-1:-1:-1;16332:9:1;;16271:76::o;16352:380::-;16431:1;16427:12;;;;16474;;;16495:2;;16549:4;16541:6;16537:17;16527:27;;16495:2;16602;16594:6;16591:14;16571:18;16568:38;16565:2;;;16648:10;16643:3;16639:20;16636:1;16629:31;16683:4;16680:1;16673:15;16711:4;16708:1;16701:15;16565:2;;16407:325;;;:::o;16737:135::-;16776:3;-1:-1:-1;;16797:17:1;;16794:2;;;16817:18;;:::i;:::-;-1:-1:-1;16864:1:1;16853:13;;16784:88::o;16877:127::-;16938:10;16933:3;16929:20;16926:1;16919:31;16969:4;16966:1;16959:15;16993:4;16990:1;16983:15;17009:131;-1:-1:-1;;;;;17084:31:1;;17074:42;;17064:2;;17130:1;17127;17120:12;17064:2;17054:86;:::o

Swarm Source

ipfs://c564dea9709c97f35a0d2dfec84440ae9420fd862a0479909b263351d89e07a4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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