ETH Price: $3,700.28 (+2.96%)

Token

Lilly Finance (Ly)
 

Overview

Max Total Supply

120,000,000,000,000,000 Ly

Holders

11,792 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,144,255,630,415.920752181 Ly

Value
$0.00
0xaee530945325B5F4dbAa2b19455Bd5a64bbE3fEf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Lilly identifies needs, opportunities and problems in health care, then employs a next generation financing system to make change happen faster.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Lilly

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-12
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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 add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }
    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IWETH {
    function deposit() external payable;
    function balanceOf(address _owner) external returns (uint256);
    function transfer(address _to, uint256 _value) external returns (bool);
    function withdraw(uint256 _amount) external;
}


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

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
        //The following line avoids exploiting previous lock/unlock to regain ownership
        _previousOwner = address(0);
    }
    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
  
}

contract Lilly is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    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 _isExcludedFromReward;
    mapping (address => bool) private _isExcludedFromMaxTxLimit;
    address[] private _excludedAddressesFromReward;
   
    string constant private _name = "Lilly Finance";
    string constant private _symbol = "Ly";
    uint256 constant private _decimals = 9;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 120000000000000000  * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _tBurnTotal;
   
    address payable public marketingAddress = payable(0xF6a88B388D253dF0e3C1223A055a7682F8c680aA);
    address payable public foundationAddress = payable(0x6312839503eb9298d037687C1492ab815888dC31);
    address public  deadAddress = 0x000000000000000000000000000000000000dEaD;
    address private wallet1 = 0xEd2B288bCc7CE04fC120b05b87E1D91a4f8c4ffF;
    address private wallet2 = 0xC014D92ce5c35268188294924b3d7179aEAb8876;
    address private wallet3 = 0x598961cf3a6905E684b85136C7D7b7cF3a961Cff;
  

    uint256 public _taxFee = 3;
    uint256 private _previousTaxFee = _taxFee;
    uint256 public _liquidityFee = 1;
    uint256 private _previousLiquidityFee = _liquidityFee;
    uint256 public _burnFee = 2;
    uint256 private _previousBurnFee = _burnFee;
    uint256 public _marketingFee= 3;
    uint256 private _previousMarketingFee = _marketingFee;
    uint256 public _foundationFee= 1;
    uint256 private _previousfoundatoinFee = _foundationFee;

    IUniswapV2Router02 public immutable uniswapV2RouterObject;
    address public immutable uniswapV2wETHAddr;
    address public uniswapV2PairAddr;
    address public immutable uniswapV2RouterAddr;
    address constant private _blackholeZero = address(0);
    address constant private _blackholeDead = 0x000000000000000000000000000000000000dEaD;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    bool public tradingEnabled;
    
    uint256 public _maxTxAmount = _tTotal.div(100);
    uint256 public numTokensSellToAddToLiquidity = 12000000000 * 10**9;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor() {
        _rOwned[_msgSender()] = _rTotal;

        address _uniswapV2RouterAddr=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_uniswapV2RouterAddr);
        uniswapV2RouterAddr = _uniswapV2RouterAddr;
		uniswapV2wETHAddr = _uniswapV2Router.WETH();
         // Create a uniswap pair for this new token
        uniswapV2PairAddr = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        // set the rest of the contract variables
        uniswapV2RouterObject = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[wallet1] = true;
        _isExcludedFromFee[wallet2] = true;
        _isExcludedFromFee[wallet3] = true;
        _isExcludedFromFee[deadAddress] = true;
        _isExcludedFromFee[marketingAddress] = true;
        _isExcludedFromFee[foundationAddress] = true;

        _isExcludedFromMaxTxLimit[wallet1] = true;
        _isExcludedFromMaxTxLimit[wallet2] = true;
        _isExcludedFromMaxTxLimit[wallet3] = true;
        _isExcludedFromMaxTxLimit[deadAddress] = true;
        _isExcludedFromMaxTxLimit[marketingAddress] = true;
        _isExcludedFromMaxTxLimit[foundationAddress] = true;
        
        emit Transfer(_blackholeZero, _msgSender(), _tTotal);
}
    function enableTrading(bool trading) external onlyOwner
    {
        tradingEnabled = trading;
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return uint8(_decimals);
    }

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

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

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

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

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

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

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

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

    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromReward[account];
    }

    function totalFees() internal view returns (uint256) {
        return _taxFee.add(_liquidityFee).add(_burnFee).add(_marketingFee).add(_foundationFee);
    }

    function deliver(uint256 tAmount) external {
        address sender = _msgSender();
        require(!_isExcludedFromReward[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) external 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) external onlyOwner() {
      
        require(!_isExcludedFromReward[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedAddressesFromReward.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcludedFromReward[account], "Account is already excluded");
        for (uint256 i = 0; i < _excludedAddressesFromReward.length; i++) {
            if (_excludedAddressesFromReward[i] == account) {
                _excludedAddressesFromReward[i] = _excludedAddressesFromReward[_excludedAddressesFromReward.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedAddressesFromReward.pop();
                break;
            }
        }
    }
   
    //Allow excluding from fee certain contracts, usually lock or payment contracts, but not the router or the pool.
    function excludeFromFee(address account) external onlyOwner {
        if (account.isContract() && account != uniswapV2PairAddr && account != uniswapV2RouterAddr)
        _isExcludedFromFee[account] = true;
    }
    // Do not include back this contract. Owner can renounce being feeless.
    function includeInFee(address account) external onlyOwner {
        if (account != address(this))
        _isExcludedFromFee[account] = false;
    }

    function includeInMaxTxLimit(address account) external onlyOwner
    {
        _isExcludedFromMaxTxLimit[account] = false;
    }

    function excludeFromMaxTxLimit(address account) external onlyOwner
    {
        _isExcludedFromMaxTxLimit[account] = true;
    }

    function changenumTokensSellToAddToLiquidity(uint256 num) external onlyOwner
    {
        numTokensSellToAddToLiquidity = num;
    }
    
    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }
    
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
        _liquidityFee = liquidityFee;
    }
    
    function setMarketingPercent(uint256 MarketingFee) external onlyOwner() {
        _marketingFee = MarketingFee;
    }

    function setFoundationPercent(uint256 FoundationFee) external onlyOwner() {
        _foundationFee = FoundationFee;
    }

    function setBurnFeePercent(uint256 burnFee) external onlyOwner() {
        _burnFee= burnFee;
    }
   
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }

    function setMarketingWallet(address wallet) external onlyOwner()
    {
        marketingAddress = payable(wallet);
    }

    function setFoundationWallet(address wallet) external onlyOwner()
    {
        foundationAddress = payable(wallet);
    }

    
    function setDeadWallet(address wallet) external onlyOwner()
    {
        deadAddress = wallet;
    }

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

    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 tBurn,uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tBurn, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tBurn, tLiquidity);
    }

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

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 totalTax = rFee.add(rBurn).add(rLiquidity);
        uint256 rTransferAmount = rAmount.sub(totalTax);
        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 < _excludedAddressesFromReward.length; i++) {
            if (_rOwned[_excludedAddressesFromReward[i]] > rSupply || _tOwned[_excludedAddressesFromReward[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excludedAddressesFromReward[i]]);
            tSupply = tSupply.sub(_tOwned[_excludedAddressesFromReward[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

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

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

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

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

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _takeBurn(address sender, uint256 tBurn) private {
        
        _tOwned[deadAddress] = _tOwned[deadAddress].add(tBurn);
        if(tBurn > 0)
        {emit Transfer(sender, deadAddress, tBurn);}
         
    }
    
    function _takeMarketing(address sender, uint256 tMarketing) private returns(uint256){
      uint256 rMarketing = calculateMarketingFee(tMarketing);
      _rOwned[address(this)] = _rOwned[address(this)].add(rMarketing);
      _rOwned[sender] = _rOwned[sender].sub(rMarketing);
      emit Transfer(sender, address(this), rMarketing);
         if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tMarketing);
      return rMarketing;
    }

    function _takeFoundation(address sender, uint256 tFoundation) private returns(uint256){
      uint256 rFoundation = calculateFoundationFee(tFoundation);
      _rOwned[address(this)] = _rOwned[address(this)].add(rFoundation);
      _rOwned[sender] = _rOwned[sender].sub(rFoundation);
      emit Transfer(sender, address(this), rFoundation);
         if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tFoundation);
      return rFoundation;
    }
    
    
    function removeAllFee() private {
        if(_taxFee == 0 && _burnFee == 0 && _liquidityFee == 0) return;
        
        _previousTaxFee = _taxFee;
        _previousBurnFee = _burnFee;
        _previousLiquidityFee = _liquidityFee;
        
        _taxFee = 0;
        _burnFee = 0;
        _liquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _burnFee = _previousBurnFee;
        _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");
        if(from != owner()) {require(tradingEnabled, "Trading is not enabled yet");}
        if(from != owner() && to != owner())
        {
            if(!_isExcludedFromMaxTxLimit[from]){
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");}
        }
     //indicates if fee should be deducted from transfer
        uint8 takeFee = 1;
        
          // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
     
        if(contractTokenBalance >= _maxTxAmount)
        {
            contractTokenBalance = _maxTxAmount;
        }
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2PairAddr &&
            swapAndLiquifyEnabled &&
			takeFee == 1 //avoid costly liquify on p2p sends
        ) {
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
       

       
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = 0;
        }

        if(from != uniswapV2PairAddr && to != uniswapV2PairAddr)
        {
            takeFee = 0;
        }

       
        if(takeFee == 1)
        {
        uint256 marketingAmount = _takeMarketing(from, amount);
        uint256 foundationAmount = _takeFoundation(from, amount);
        amount = amount - (marketingAmount+foundationAmount);}

      
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }

    
	
    function swapAndLiquify(uint256 tokensToLiquify) private lockTheSwap {
        
        uint256 tokensToLP = tokensToLiquify.mul(_liquidityFee).div(totalFees()).div(2);
        uint256 amountToSwap = tokensToLiquify.sub(tokensToLP);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2wETHAddr;

        _approve(address(this), address(uniswapV2RouterAddr), tokensToLiquify);
        uniswapV2RouterObject.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 ethBalance = address(this).balance;
        uint256 ethFeeFactor = totalFees().sub((_liquidityFee).div(2));

        uint256 ethForLiquidity = ethBalance.mul(_liquidityFee).div(ethFeeFactor).div(2);
        uint256 ethForMarketing = ethBalance.mul(_marketingFee).div(ethFeeFactor);
        uint256 ethForFounders = ethBalance.mul(_foundationFee).div(ethFeeFactor);
     
        addLiquidity(tokensToLP, ethForLiquidity);

        payable(marketingAddress).transfer(ethForMarketing);
        payable(foundationAddress).transfer(ethForFounders);
       
    }

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

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,uint8 feePlan) private {
        if(feePlan == 0) //no fees
            removeAllFee();
        
        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(feePlan != 1) //restore standard fees
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeBurn(sender, tBurn);
        _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 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);    
        _takeLiquidity(tLiquidity);
        _takeBurn(sender, tBurn);       
        _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 tBurn, uint256 tLiquidity) = _getValues(tAmount);
        
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        _takeLiquidity(tLiquidity);
        _takeBurn(sender, tBurn);
        emit Transfer(sender, recipient, tTransferAmount);
      

    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tLiquidity) = _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);
        _takeBurn(sender, tBurn);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
     
    }

}

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":"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":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_foundationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","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":"_maxTxAmount","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":"uint256","name":"num","type":"uint256"}],"name":"changenumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"bool","name":"trading","type":"bool"}],"name":"enableTrading","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":"excludeFromMaxTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundationAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxTxLimit","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":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setDeadWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"FoundationFee","type":"uint256"}],"name":"setFoundationPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setFoundationWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"MarketingFee","type":"uint256"}],"name":"setMarketingPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"uniswapV2PairAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2RouterAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2RouterObject","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2wETHAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526a6342fd08f00f6378000000600a819055620000239060001962000608565b62000031906000196200061f565b600b55600e80546001600160a01b031990811673f6a88b388d253df0e3c1223a055a7682f8c680aa17909155600f80548216736312839503eb9298d037687c1492ab815888dc3117905560108054821661dead17905560118054821673ed2b288bcc7ce04fc120b05b87e1d91a4f8c4fff17905560128054821673c014d92ce5c35268188294924b3d7179aeab88761790556013805490911673598961cf3a6905e684b85136c7d7b7cf3a961cff17905560036014819055601581905560016016819055601781905560026018819055601955601a829055601b91909155601c819055601d55601e805460ff60a81b1916600160a81b179055600a54620001499060646200171e6200055c602090811b91909117901c565b601f5567a688906bd8b000006020553480156200016557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526003602090815260409182902092909255737a250d5630b4cf539739df2c5dacb4c659f2488d60c081905281516315ab88c960e31b8152915190928392839263ad5c4648926004808401939192918290030181865afa15801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023e919062000645565b6001600160a01b031660a0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000296573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bc919062000645565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200030a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000330919062000645565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200037e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a4919062000645565b601e80546001600160a01b0319166001600160a01b039283161790558116608052600160066000620003de6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600684528281208054861660019081179091556011805484168352848320805488168317905560128054851684528584208054891684179055601380548616855286852080548a1685179055601080548716865287862080548b1686179055600e80548816875288872080548c1687179055600f80548916885289882080548d1688179055945488168752600890995287862080548b168617905591548616855286852080548a16851790555485168452858420805489168417905554841683528483208054881683179055945483168252838220805487168217905593549091168152208054909216179055620005043390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040516200054c91815260200190565b60405180910390a35050620006df565b6000620005a683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620005ad60201b60201c565b9392505050565b60008183620005da5760405162461bcd60e51b8152600401620005d1919062000670565b60405180910390fd5b506000620005e98486620006c8565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b6000826200061a576200061a620005f2565b500690565b6000828210156200064057634e487b7160e01b600052601160045260246000fd5b500390565b6000602082840312156200065857600080fd5b81516001600160a01b0381168114620005a657600080fd5b600060208083528351808285015260005b818110156200069f5785810183015185820160400152820162000681565b81811115620006b2576000604083870101525b50601f01601f1916929092016040019392505050565b600082620006da57620006da620005f2565b500490565b60805160a05160c051613035620007396000396000818161092701528181610f5401528181611f60015261262a0152600081816106700152611f080152600081816107f201528181611f9c015261265101526130356000f3fe60806040526004361061031e5760003560e01c806370a08231116101ab578063a9059cbb116100f7578063d12a768811610095578063ea2f0b371161006f578063ea2f0b37146109e5578063f275f64b14610a05578063f2fde38b14610a25578063fcf07c6b14610a4557600080fd5b8063d12a768814610969578063d543dbeb1461097f578063dd62ed3e1461099f57600080fd5b8063c49b9a80116100d1578063c49b9a80146108d5578063c6055ec3146108f5578063cea2085114610915578063cea269581461094957600080fd5b8063a9059cbb1461087f578063b7cd77941461089f578063c0b0fda2146108bf57600080fd5b80638da5cb5b1161016457806394e6a8391161013e57806394e6a839146107e057806395d89b4114610814578063a457c2d71461083f578063a5ece9411461085f57600080fd5b80638da5cb5b1461078c5780638ee88c53146107aa5780638efb3843146107ca57600080fd5b806370a08231146106c8578063715018a6146106e857806371547984146106fd57806374dfa3161461071d5780637d1db4a51461073d57806388f820201461075357600080fd5b8063395093511161026a5780634ada218b116102235780635d098b38116101fd5780635d098b381461063e5780635fe876651461065e57806361a60d57146106925780636bc87c3a146106b257600080fd5b80634ada218b146105c457806352390c02146105e55780635342acb41461060557600080fd5b8063395093511461050d5780633b124fe71461052d5780633bd5d17314610543578063437823ec146105635780634549b039146105835780634a74bb02146105a357600080fd5b806322976e0d116102d757806327c8f835116102b157806327c8f835146104915780632d838119146104b1578063313ce567146104d15780633685d419146104ed57600080fd5b806322976e0d1461043b57806323b872dd1461045157806326fddf081461047157600080fd5b8063015493b41461032a578063061c82d01461034c57806306fdde031461036c578063095ea7b3146103b45780631811eea6146103e457806318160ddd1461041c57600080fd5b3661032557005b600080fd5b34801561033657600080fd5b5061034a610345366004612ca1565b610a65565b005b34801561035857600080fd5b5061034a610367366004612cbc565b610aba565b34801561037857600080fd5b5060408051808201909152600d81526c4c696c6c792046696e616e636560981b60208201525b6040516103ab9190612cd5565b60405180910390f35b3480156103c057600080fd5b506103d46103cf366004612d2a565b610ae9565b60405190151581526020016103ab565b3480156103f057600080fd5b50601e54610404906001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b34801561042857600080fd5b50600a545b6040519081526020016103ab565b34801561044757600080fd5b5061042d601a5481565b34801561045d57600080fd5b506103d461046c366004612d54565b610b00565b34801561047d57600080fd5b5061034a61048c366004612cbc565b610b69565b34801561049d57600080fd5b50601054610404906001600160a01b031681565b3480156104bd57600080fd5b5061042d6104cc366004612cbc565b610b98565b3480156104dd57600080fd5b50604051600981526020016103ab565b3480156104f957600080fd5b5061034a610508366004612ca1565b610c1c565b34801561051957600080fd5b506103d4610528366004612d2a565b610dd3565b34801561053957600080fd5b5061042d60145481565b34801561054f57600080fd5b5061034a61055e366004612cbc565b610e09565b34801561056f57600080fd5b5061034a61057e366004612ca1565b610ef5565b34801561058f57600080fd5b5061042d61059e366004612da0565b610fb5565b3480156105af57600080fd5b50601e546103d490600160a81b900460ff1681565b3480156105d057600080fd5b50601e546103d490600160b01b900460ff1681565b3480156105f157600080fd5b5061034a610600366004612ca1565b611044565b34801561061157600080fd5b506103d4610620366004612ca1565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561064a57600080fd5b5061034a610659366004612ca1565b611197565b34801561066a57600080fd5b506104047f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e57600080fd5b5061034a6106ad366004612ca1565b6111e3565b3480156106be57600080fd5b5061042d60165481565b3480156106d457600080fd5b5061042d6106e3366004612ca1565b61122f565b3480156106f457600080fd5b5061034a61128e565b34801561070957600080fd5b5061034a610718366004612ca1565b61130e565b34801561072957600080fd5b5061034a610738366004612cbc565b611359565b34801561074957600080fd5b5061042d601f5481565b34801561075f57600080fd5b506103d461076e366004612ca1565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561079857600080fd5b506000546001600160a01b0316610404565b3480156107b657600080fd5b5061034a6107c5366004612cbc565b611388565b3480156107d657600080fd5b5061042d601c5481565b3480156107ec57600080fd5b506104047f000000000000000000000000000000000000000000000000000000000000000081565b34801561082057600080fd5b506040805180820190915260028152614c7960f01b602082015261039e565b34801561084b57600080fd5b506103d461085a366004612d2a565b6113b7565b34801561086b57600080fd5b50600e54610404906001600160a01b031681565b34801561088b57600080fd5b506103d461089a366004612d2a565b611406565b3480156108ab57600080fd5b5061034a6108ba366004612ca1565b611413565b3480156108cb57600080fd5b5061042d60185481565b3480156108e157600080fd5b5061034a6108f0366004612dcc565b611461565b34801561090157600080fd5b5061034a610910366004612cbc565b6114e3565b34801561092157600080fd5b506104047f000000000000000000000000000000000000000000000000000000000000000081565b34801561095557600080fd5b5061034a610964366004612cbc565b611512565b34801561097557600080fd5b5061042d60205481565b34801561098b57600080fd5b5061034a61099a366004612cbc565b611541565b3480156109ab57600080fd5b5061042d6109ba366004612de7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156109f157600080fd5b5061034a610a00366004612ca1565b611591565b348015610a1157600080fd5b5061034a610a20366004612dcc565b6115ec565b348015610a3157600080fd5b5061034a610a40366004612ca1565b611634565b348015610a5157600080fd5b50600f54610404906001600160a01b031681565b6000546001600160a01b03163314610a985760405162461bcd60e51b8152600401610a8f90612e11565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8f90612e11565b601455565b6000610af6338484611760565b5060015b92915050565b6000610b548433610b4f85604051806060016040528060288152602001612fb3602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611884565b611760565b610b5f8484846118be565b5060019392505050565b6000546001600160a01b03163314610b935760405162461bcd60e51b8152600401610a8f90612e11565b601c55565b6000600b54821115610bff5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a8f565b6000610c09611c63565b9050610c15838261171e565b9392505050565b6000546001600160a01b03163314610c465760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03811660009081526007602052604090205460ff16610cae5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a8f565b60005b600954811015610dcf57816001600160a01b031660098281548110610cd857610cd8612e46565b6000918252602090912001546001600160a01b03161415610dbd5760098054610d0390600190612e72565b81548110610d1357610d13612e46565b600091825260209091200154600980546001600160a01b039092169183908110610d3f57610d3f612e46565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556009805480610d9757610d97612e89565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610dc781612e9f565b915050610cb1565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610af6918590610b4f9086611c86565b3360008181526007602052604090205460ff1615610e7e5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a8f565b6000610e8983611ce5565b5050506001600160a01b038616600090815260036020526040902054939450610eb793925084915050611d40565b6001600160a01b038316600090815260036020526040902055600b54610edd9082611d40565b600b55600c54610eed9084611c86565b600c55505050565b6000546001600160a01b03163314610f1f5760405162461bcd60e51b8152600401610a8f90612e11565b610f31816001600160a01b0316611d82565b8015610f4b5750601e546001600160a01b03828116911614155b8015610f8957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b15610fb2576001600160a01b0381166000908152600660205260409020805460ff191660011790555b50565b6000600a548311156110095760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a8f565b8161102957600061101984611ce5565b50949650610afa95505050505050565b600061103484611ce5565b50939650610afa95505050505050565b6000546001600160a01b0316331461106e5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03811660009081526007602052604090205460ff16156110d75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a8f565b6001600160a01b03811660009081526003602052604090205415611131576001600160a01b03811660009081526003602052604090205461111790610b98565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b031633146111c15760405162461bcd60e51b8152600401610a8f90612e11565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461120d5760405162461bcd60e51b8152600401610a8f90612e11565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561126c57506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610afa90610b98565b6000546001600160a01b031633146112b85760405162461bcd60e51b8152600401610a8f90612e11565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b031633146113385760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b031633146113835760405162461bcd60e51b8152600401610a8f90612e11565b602055565b6000546001600160a01b031633146113b25760405162461bcd60e51b8152600401610a8f90612e11565b601655565b6000610af63384610b4f85604051806060016040528060258152602001612fdb602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611884565b6000610af63384846118be565b6000546001600160a01b0316331461143d5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b0316331461148b5760405162461bcd60e51b8152600401610a8f90612e11565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906114d890831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461150d5760405162461bcd60e51b8152600401610a8f90612e11565b601a55565b6000546001600160a01b0316331461153c5760405162461bcd60e51b8152600401610a8f90612e11565b601855565b6000546001600160a01b0316331461156b5760405162461bcd60e51b8152600401610a8f90612e11565b61158b606461158583600a54611dbe90919063ffffffff16565b9061171e565b601f5550565b6000546001600160a01b031633146115bb5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b0381163014610fb2576001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116165760405162461bcd60e51b8152600401610a8f90612e11565b601e8054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b0381166116c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e3d565b6001600160a01b0383166117c25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a8f565b6001600160a01b0382166118235760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a8f565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156118a85760405162461bcd60e51b8152600401610a8f9190612cd5565b5060006118b58486612e72565b95945050505050565b6001600160a01b0383166119225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a8f565b6001600160a01b0382166119845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a8f565b600081116119e65760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a8f565b6000546001600160a01b03848116911614611a5457601e54600160b01b900460ff16611a545760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420656e61626c6564207965740000000000006044820152606401610a8f565b6000546001600160a01b03848116911614801590611a8057506000546001600160a01b03838116911614155b15611b08576001600160a01b03831660009081526008602052604090205460ff16611b0857601f54811115611b085760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a8f565b60016000611b153061122f565b9050601f548110611b255750601f545b60205481108015908190611b435750601e54600160a01b900460ff16155b8015611b5d5750601e546001600160a01b03878116911614155b8015611b725750601e54600160a81b900460ff165b8015611b8157508260ff166001145b15611b8f57611b8f82611e6b565b6001600160a01b03861660009081526006602052604090205460ff1680611bce57506001600160a01b03851660009081526006602052604090205460ff165b15611bd857600092505b601e546001600160a01b03878116911614801590611c045750601e546001600160a01b03868116911614155b15611c0e57600092505b8260ff1660011415611c4f576000611c268786612127565b90506000611c348887612216565b9050611c408183612eba565b611c4a9087612e72565b955050505b611c5b86868686612222565b505050505050565b6000806000611c706123ae565b9092509050611c7f828261171e565b9250505090565b600080611c938385612eba565b905083811015610c155760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8f565b6000806000806000806000806000806000611cff8c612530565b93509350935093506000806000611d208f878787611d1b611c63565b61257f565b919f509d509b509599509397509195509350505050919395979092949650565b6000610c1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611884565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611db657508115155b949350505050565b600082611dcd57506000610afa565b6000611dd98385612ed2565b905082611de68583612ef1565b14610c155760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a8f565b60008183611e5e5760405162461bcd60e51b8152600401610a8f9190612cd5565b5060006118b58486612ef1565b601e805460ff60a01b1916600160a01b1790556000611e9e6002611585611e906125f4565b601654611585908790611dbe565b90506000611eac8383611d40565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611ee657611ee6612e46565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611f3a57611f3a612e46565b60200260200101906001600160a01b031690816001600160a01b031681525050611f85307f000000000000000000000000000000000000000000000000000000000000000086611760565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611fda908590600090869030904290600401612f13565b600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b5050601654479250600091506120319061202390600261171e565b61202b6125f4565b90611d40565b9050600061205360026115858461158560165488611dbe90919063ffffffff16565b9050600061207083611585601a5487611dbe90919063ffffffff16565b9050600061208d84611585601c5488611dbe90919063ffffffff16565b90506120998884612624565b600e546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156120d3573d6000803e3d6000fd5b50600f546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561210e573d6000803e3d6000fd5b5050601e805460ff60a01b191690555050505050505050565b6000806121338361272a565b306000908152600360205260409020549091506121509082611c86565b30600090815260036020526040808220929092556001600160a01b0386168152205461217c9082611d40565b6001600160a01b038516600081815260036020908152604091829020939093555183815230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a33060009081526007602052604090205460ff1615610c1557306000908152600460205260409020546121ff9084611c86565b306000908152600460205260409020559392505050565b60008061213383612746565b60ff811661223257612232612762565b6001600160a01b03841660009081526007602052604090205460ff16801561227357506001600160a01b03831660009081526007602052604090205460ff16155b15612288576122838484846127a7565b612386565b6001600160a01b03841660009081526007602052604090205460ff161580156122c957506001600160a01b03831660009081526007602052604090205460ff165b156122d9576122838484846128ee565b6001600160a01b03841660009081526007602052604090205460ff1615801561231b57506001600160a01b03831660009081526007602052604090205460ff16155b1561232b576122838484846129e3565b6001600160a01b03841660009081526007602052604090205460ff16801561236b57506001600160a01b03831660009081526007602052604090205460ff165b1561237b57612283848484612a6c565b6123868484846129e3565b8060ff166001146123a8576123a8601554601455601954601855601754601655565b50505050565b600b54600a546000918291825b600954811015612500578260036000600984815481106123dd576123dd612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612448575081600460006009848154811061242157612421612e46565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561245e57600b54600a54945094505050509091565b6124a4600360006009848154811061247857612478612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d40565b92506124ec60046000600984815481106124c0576124c0612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d40565b9150806124f881612e9f565b9150506123bb565b50600a54600b546125109161171e565b82101561252757600b54600a549350935050509091565b90939092509050565b600080600080600061254186612af5565b9050600061254e87612b11565b9050600061255b88612b2d565b9050600061256f8261202b85818d89611d40565b9993985091965094509092505050565b600080808061258e8986611dbe565b9050600061259c8987611dbe565b905060006125aa8988611dbe565b905060006125b88989611dbe565b905060006125d0826125ca8686611c86565b90611c86565b905060006125de8683611d40565b959e959d50939b50939950505050505050505050565b600061261f601c546125ca601a546125ca6018546125ca601654601454611c8690919063ffffffff16565b905090565b61264f307f000000000000000000000000000000000000000000000000000000000000000084611760565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806126966000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126fe573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127239190612f84565b5050505050565b6000610afa6064611585601a5485611dbe90919063ffffffff16565b6000610afa6064611585601c5485611dbe90919063ffffffff16565b6014541580156127725750601854155b801561277e5750601654155b1561278557565b6014805460155560188054601955601680546017556000928390559082905555565b60008060008060008060006127bb88611ce5565b965096509650965096509650965061280188600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546128309088611d40565b6001600160a01b03808c1660009081526003602052604080822093909355908b168152205461285f9087611c86565b6001600160a01b038a166000908152600360205260409020556128828584612b49565b61288b81612b6d565b6128958a83612bf6565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516128da91815260200190565b60405180910390a350505050505050505050565b600080600080600080600061290288611ce5565b965096509650965096509650965061294887600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c1681526004909152205461297e9085611c86565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546129ad9087611c86565b6001600160a01b038a166000908152600360205260409020556129cf81612b6d565b6129d98a83612bf6565b6128958584612b49565b60008060008060008060006129f788611ce5565b9650965096509650965096509650612a3d87600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b03808c1660009081526003602052604080822093909355908b16815220546129ad9087611c86565b6000806000806000806000612a8088611ce5565b9650965096509650965096509650612ac688600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546129489088611d40565b6000610afa606461158560145485611dbe90919063ffffffff16565b6000610afa606461158560185485611dbe90919063ffffffff16565b6000610afa606461158560165485611dbe90919063ffffffff16565b600b54612b569083611d40565b600b55600c54612b669082611c86565b600c555050565b6000612b77611c63565b90506000612b858383611dbe565b30600090815260036020526040902054909150612ba29082611c86565b3060009081526003602090815260408083209390935560079052205460ff1615612bf15730600090815260046020526040902054612be09084611c86565b306000908152600460205260409020555b505050565b6010546001600160a01b0316600090815260046020526040902054612c1b9082611c86565b6010546001600160a01b03166000908152600460205260409020558015610dcf576010546040518281526001600160a01b03918216918416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114612c9c57600080fd5b919050565b600060208284031215612cb357600080fd5b610c1582612c85565b600060208284031215612cce57600080fd5b5035919050565b600060208083528351808285015260005b81811015612d0257858101830151858201604001528201612ce6565b81811115612d14576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612d3d57600080fd5b612d4683612c85565b946020939093013593505050565b600080600060608486031215612d6957600080fd5b612d7284612c85565b9250612d8060208501612c85565b9150604084013590509250925092565b80358015158114612c9c57600080fd5b60008060408385031215612db357600080fd5b82359150612dc360208401612d90565b90509250929050565b600060208284031215612dde57600080fd5b610c1582612d90565b60008060408385031215612dfa57600080fd5b612e0383612c85565b9150612dc360208401612c85565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612e8457612e84612e5c565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415612eb357612eb3612e5c565b5060010190565b60008219821115612ecd57612ecd612e5c565b500190565b6000816000190483118215151615612eec57612eec612e5c565b500290565b600082612f0e57634e487b7160e01b600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f635784516001600160a01b031683529383019391830191600101612f3e565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f9957600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8d54d9bb9bde1e43817b40733fe3ff4691af491c90059cda5c81c6f89e8644c64736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061031e5760003560e01c806370a08231116101ab578063a9059cbb116100f7578063d12a768811610095578063ea2f0b371161006f578063ea2f0b37146109e5578063f275f64b14610a05578063f2fde38b14610a25578063fcf07c6b14610a4557600080fd5b8063d12a768814610969578063d543dbeb1461097f578063dd62ed3e1461099f57600080fd5b8063c49b9a80116100d1578063c49b9a80146108d5578063c6055ec3146108f5578063cea2085114610915578063cea269581461094957600080fd5b8063a9059cbb1461087f578063b7cd77941461089f578063c0b0fda2146108bf57600080fd5b80638da5cb5b1161016457806394e6a8391161013e57806394e6a839146107e057806395d89b4114610814578063a457c2d71461083f578063a5ece9411461085f57600080fd5b80638da5cb5b1461078c5780638ee88c53146107aa5780638efb3843146107ca57600080fd5b806370a08231146106c8578063715018a6146106e857806371547984146106fd57806374dfa3161461071d5780637d1db4a51461073d57806388f820201461075357600080fd5b8063395093511161026a5780634ada218b116102235780635d098b38116101fd5780635d098b381461063e5780635fe876651461065e57806361a60d57146106925780636bc87c3a146106b257600080fd5b80634ada218b146105c457806352390c02146105e55780635342acb41461060557600080fd5b8063395093511461050d5780633b124fe71461052d5780633bd5d17314610543578063437823ec146105635780634549b039146105835780634a74bb02146105a357600080fd5b806322976e0d116102d757806327c8f835116102b157806327c8f835146104915780632d838119146104b1578063313ce567146104d15780633685d419146104ed57600080fd5b806322976e0d1461043b57806323b872dd1461045157806326fddf081461047157600080fd5b8063015493b41461032a578063061c82d01461034c57806306fdde031461036c578063095ea7b3146103b45780631811eea6146103e457806318160ddd1461041c57600080fd5b3661032557005b600080fd5b34801561033657600080fd5b5061034a610345366004612ca1565b610a65565b005b34801561035857600080fd5b5061034a610367366004612cbc565b610aba565b34801561037857600080fd5b5060408051808201909152600d81526c4c696c6c792046696e616e636560981b60208201525b6040516103ab9190612cd5565b60405180910390f35b3480156103c057600080fd5b506103d46103cf366004612d2a565b610ae9565b60405190151581526020016103ab565b3480156103f057600080fd5b50601e54610404906001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b34801561042857600080fd5b50600a545b6040519081526020016103ab565b34801561044757600080fd5b5061042d601a5481565b34801561045d57600080fd5b506103d461046c366004612d54565b610b00565b34801561047d57600080fd5b5061034a61048c366004612cbc565b610b69565b34801561049d57600080fd5b50601054610404906001600160a01b031681565b3480156104bd57600080fd5b5061042d6104cc366004612cbc565b610b98565b3480156104dd57600080fd5b50604051600981526020016103ab565b3480156104f957600080fd5b5061034a610508366004612ca1565b610c1c565b34801561051957600080fd5b506103d4610528366004612d2a565b610dd3565b34801561053957600080fd5b5061042d60145481565b34801561054f57600080fd5b5061034a61055e366004612cbc565b610e09565b34801561056f57600080fd5b5061034a61057e366004612ca1565b610ef5565b34801561058f57600080fd5b5061042d61059e366004612da0565b610fb5565b3480156105af57600080fd5b50601e546103d490600160a81b900460ff1681565b3480156105d057600080fd5b50601e546103d490600160b01b900460ff1681565b3480156105f157600080fd5b5061034a610600366004612ca1565b611044565b34801561061157600080fd5b506103d4610620366004612ca1565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561064a57600080fd5b5061034a610659366004612ca1565b611197565b34801561066a57600080fd5b506104047f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561069e57600080fd5b5061034a6106ad366004612ca1565b6111e3565b3480156106be57600080fd5b5061042d60165481565b3480156106d457600080fd5b5061042d6106e3366004612ca1565b61122f565b3480156106f457600080fd5b5061034a61128e565b34801561070957600080fd5b5061034a610718366004612ca1565b61130e565b34801561072957600080fd5b5061034a610738366004612cbc565b611359565b34801561074957600080fd5b5061042d601f5481565b34801561075f57600080fd5b506103d461076e366004612ca1565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561079857600080fd5b506000546001600160a01b0316610404565b3480156107b657600080fd5b5061034a6107c5366004612cbc565b611388565b3480156107d657600080fd5b5061042d601c5481565b3480156107ec57600080fd5b506104047f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561082057600080fd5b506040805180820190915260028152614c7960f01b602082015261039e565b34801561084b57600080fd5b506103d461085a366004612d2a565b6113b7565b34801561086b57600080fd5b50600e54610404906001600160a01b031681565b34801561088b57600080fd5b506103d461089a366004612d2a565b611406565b3480156108ab57600080fd5b5061034a6108ba366004612ca1565b611413565b3480156108cb57600080fd5b5061042d60185481565b3480156108e157600080fd5b5061034a6108f0366004612dcc565b611461565b34801561090157600080fd5b5061034a610910366004612cbc565b6114e3565b34801561092157600080fd5b506104047f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561095557600080fd5b5061034a610964366004612cbc565b611512565b34801561097557600080fd5b5061042d60205481565b34801561098b57600080fd5b5061034a61099a366004612cbc565b611541565b3480156109ab57600080fd5b5061042d6109ba366004612de7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156109f157600080fd5b5061034a610a00366004612ca1565b611591565b348015610a1157600080fd5b5061034a610a20366004612dcc565b6115ec565b348015610a3157600080fd5b5061034a610a40366004612ca1565b611634565b348015610a5157600080fd5b50600f54610404906001600160a01b031681565b6000546001600160a01b03163314610a985760405162461bcd60e51b8152600401610a8f90612e11565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8f90612e11565b601455565b6000610af6338484611760565b5060015b92915050565b6000610b548433610b4f85604051806060016040528060288152602001612fb3602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611884565b611760565b610b5f8484846118be565b5060019392505050565b6000546001600160a01b03163314610b935760405162461bcd60e51b8152600401610a8f90612e11565b601c55565b6000600b54821115610bff5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a8f565b6000610c09611c63565b9050610c15838261171e565b9392505050565b6000546001600160a01b03163314610c465760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03811660009081526007602052604090205460ff16610cae5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a8f565b60005b600954811015610dcf57816001600160a01b031660098281548110610cd857610cd8612e46565b6000918252602090912001546001600160a01b03161415610dbd5760098054610d0390600190612e72565b81548110610d1357610d13612e46565b600091825260209091200154600980546001600160a01b039092169183908110610d3f57610d3f612e46565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556009805480610d9757610d97612e89565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610dc781612e9f565b915050610cb1565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610af6918590610b4f9086611c86565b3360008181526007602052604090205460ff1615610e7e5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a8f565b6000610e8983611ce5565b5050506001600160a01b038616600090815260036020526040902054939450610eb793925084915050611d40565b6001600160a01b038316600090815260036020526040902055600b54610edd9082611d40565b600b55600c54610eed9084611c86565b600c55505050565b6000546001600160a01b03163314610f1f5760405162461bcd60e51b8152600401610a8f90612e11565b610f31816001600160a01b0316611d82565b8015610f4b5750601e546001600160a01b03828116911614155b8015610f8957507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316816001600160a01b031614155b15610fb2576001600160a01b0381166000908152600660205260409020805460ff191660011790555b50565b6000600a548311156110095760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a8f565b8161102957600061101984611ce5565b50949650610afa95505050505050565b600061103484611ce5565b50939650610afa95505050505050565b6000546001600160a01b0316331461106e5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03811660009081526007602052604090205460ff16156110d75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a8f565b6001600160a01b03811660009081526003602052604090205415611131576001600160a01b03811660009081526003602052604090205461111790610b98565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b031633146111c15760405162461bcd60e51b8152600401610a8f90612e11565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461120d5760405162461bcd60e51b8152600401610a8f90612e11565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561126c57506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610afa90610b98565b6000546001600160a01b031633146112b85760405162461bcd60e51b8152600401610a8f90612e11565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b031633146113385760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b031633146113835760405162461bcd60e51b8152600401610a8f90612e11565b602055565b6000546001600160a01b031633146113b25760405162461bcd60e51b8152600401610a8f90612e11565b601655565b6000610af63384610b4f85604051806060016040528060258152602001612fdb602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611884565b6000610af63384846118be565b6000546001600160a01b0316331461143d5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b0316331461148b5760405162461bcd60e51b8152600401610a8f90612e11565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906114d890831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461150d5760405162461bcd60e51b8152600401610a8f90612e11565b601a55565b6000546001600160a01b0316331461153c5760405162461bcd60e51b8152600401610a8f90612e11565b601855565b6000546001600160a01b0316331461156b5760405162461bcd60e51b8152600401610a8f90612e11565b61158b606461158583600a54611dbe90919063ffffffff16565b9061171e565b601f5550565b6000546001600160a01b031633146115bb5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b0381163014610fb2576001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146116165760405162461bcd60e51b8152600401610a8f90612e11565b601e8054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610a8f90612e11565b6001600160a01b0381166116c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e3d565b6001600160a01b0383166117c25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a8f565b6001600160a01b0382166118235760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a8f565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156118a85760405162461bcd60e51b8152600401610a8f9190612cd5565b5060006118b58486612e72565b95945050505050565b6001600160a01b0383166119225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a8f565b6001600160a01b0382166119845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a8f565b600081116119e65760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a8f565b6000546001600160a01b03848116911614611a5457601e54600160b01b900460ff16611a545760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420656e61626c6564207965740000000000006044820152606401610a8f565b6000546001600160a01b03848116911614801590611a8057506000546001600160a01b03838116911614155b15611b08576001600160a01b03831660009081526008602052604090205460ff16611b0857601f54811115611b085760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a8f565b60016000611b153061122f565b9050601f548110611b255750601f545b60205481108015908190611b435750601e54600160a01b900460ff16155b8015611b5d5750601e546001600160a01b03878116911614155b8015611b725750601e54600160a81b900460ff165b8015611b8157508260ff166001145b15611b8f57611b8f82611e6b565b6001600160a01b03861660009081526006602052604090205460ff1680611bce57506001600160a01b03851660009081526006602052604090205460ff165b15611bd857600092505b601e546001600160a01b03878116911614801590611c045750601e546001600160a01b03868116911614155b15611c0e57600092505b8260ff1660011415611c4f576000611c268786612127565b90506000611c348887612216565b9050611c408183612eba565b611c4a9087612e72565b955050505b611c5b86868686612222565b505050505050565b6000806000611c706123ae565b9092509050611c7f828261171e565b9250505090565b600080611c938385612eba565b905083811015610c155760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8f565b6000806000806000806000806000806000611cff8c612530565b93509350935093506000806000611d208f878787611d1b611c63565b61257f565b919f509d509b509599509397509195509350505050919395979092949650565b6000610c1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611884565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611db657508115155b949350505050565b600082611dcd57506000610afa565b6000611dd98385612ed2565b905082611de68583612ef1565b14610c155760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a8f565b60008183611e5e5760405162461bcd60e51b8152600401610a8f9190612cd5565b5060006118b58486612ef1565b601e805460ff60a01b1916600160a01b1790556000611e9e6002611585611e906125f4565b601654611585908790611dbe565b90506000611eac8383611d40565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611ee657611ee6612e46565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611f3a57611f3a612e46565b60200260200101906001600160a01b031690816001600160a01b031681525050611f85307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d86611760565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611fda908590600090869030904290600401612f13565b600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b5050601654479250600091506120319061202390600261171e565b61202b6125f4565b90611d40565b9050600061205360026115858461158560165488611dbe90919063ffffffff16565b9050600061207083611585601a5487611dbe90919063ffffffff16565b9050600061208d84611585601c5488611dbe90919063ffffffff16565b90506120998884612624565b600e546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156120d3573d6000803e3d6000fd5b50600f546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561210e573d6000803e3d6000fd5b5050601e805460ff60a01b191690555050505050505050565b6000806121338361272a565b306000908152600360205260409020549091506121509082611c86565b30600090815260036020526040808220929092556001600160a01b0386168152205461217c9082611d40565b6001600160a01b038516600081815260036020908152604091829020939093555183815230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a33060009081526007602052604090205460ff1615610c1557306000908152600460205260409020546121ff9084611c86565b306000908152600460205260409020559392505050565b60008061213383612746565b60ff811661223257612232612762565b6001600160a01b03841660009081526007602052604090205460ff16801561227357506001600160a01b03831660009081526007602052604090205460ff16155b15612288576122838484846127a7565b612386565b6001600160a01b03841660009081526007602052604090205460ff161580156122c957506001600160a01b03831660009081526007602052604090205460ff165b156122d9576122838484846128ee565b6001600160a01b03841660009081526007602052604090205460ff1615801561231b57506001600160a01b03831660009081526007602052604090205460ff16155b1561232b576122838484846129e3565b6001600160a01b03841660009081526007602052604090205460ff16801561236b57506001600160a01b03831660009081526007602052604090205460ff165b1561237b57612283848484612a6c565b6123868484846129e3565b8060ff166001146123a8576123a8601554601455601954601855601754601655565b50505050565b600b54600a546000918291825b600954811015612500578260036000600984815481106123dd576123dd612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612448575081600460006009848154811061242157612421612e46565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561245e57600b54600a54945094505050509091565b6124a4600360006009848154811061247857612478612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d40565b92506124ec60046000600984815481106124c0576124c0612e46565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d40565b9150806124f881612e9f565b9150506123bb565b50600a54600b546125109161171e565b82101561252757600b54600a549350935050509091565b90939092509050565b600080600080600061254186612af5565b9050600061254e87612b11565b9050600061255b88612b2d565b9050600061256f8261202b85818d89611d40565b9993985091965094509092505050565b600080808061258e8986611dbe565b9050600061259c8987611dbe565b905060006125aa8988611dbe565b905060006125b88989611dbe565b905060006125d0826125ca8686611c86565b90611c86565b905060006125de8683611d40565b959e959d50939b50939950505050505050505050565b600061261f601c546125ca601a546125ca6018546125ca601654601454611c8690919063ffffffff16565b905090565b61264f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611760565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806126966000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126fe573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127239190612f84565b5050505050565b6000610afa6064611585601a5485611dbe90919063ffffffff16565b6000610afa6064611585601c5485611dbe90919063ffffffff16565b6014541580156127725750601854155b801561277e5750601654155b1561278557565b6014805460155560188054601955601680546017556000928390559082905555565b60008060008060008060006127bb88611ce5565b965096509650965096509650965061280188600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546128309088611d40565b6001600160a01b03808c1660009081526003602052604080822093909355908b168152205461285f9087611c86565b6001600160a01b038a166000908152600360205260409020556128828584612b49565b61288b81612b6d565b6128958a83612bf6565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516128da91815260200190565b60405180910390a350505050505050505050565b600080600080600080600061290288611ce5565b965096509650965096509650965061294887600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c1681526004909152205461297e9085611c86565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546129ad9087611c86565b6001600160a01b038a166000908152600360205260409020556129cf81612b6d565b6129d98a83612bf6565b6128958584612b49565b60008060008060008060006129f788611ce5565b9650965096509650965096509650612a3d87600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b03808c1660009081526003602052604080822093909355908b16815220546129ad9087611c86565b6000806000806000806000612a8088611ce5565b9650965096509650965096509650612ac688600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611d4090919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546129489088611d40565b6000610afa606461158560145485611dbe90919063ffffffff16565b6000610afa606461158560185485611dbe90919063ffffffff16565b6000610afa606461158560165485611dbe90919063ffffffff16565b600b54612b569083611d40565b600b55600c54612b669082611c86565b600c555050565b6000612b77611c63565b90506000612b858383611dbe565b30600090815260036020526040902054909150612ba29082611c86565b3060009081526003602090815260408083209390935560079052205460ff1615612bf15730600090815260046020526040902054612be09084611c86565b306000908152600460205260409020555b505050565b6010546001600160a01b0316600090815260046020526040902054612c1b9082611c86565b6010546001600160a01b03166000908152600460205260409020558015610dcf576010546040518281526001600160a01b03918216918416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114612c9c57600080fd5b919050565b600060208284031215612cb357600080fd5b610c1582612c85565b600060208284031215612cce57600080fd5b5035919050565b600060208083528351808285015260005b81811015612d0257858101830151858201604001528201612ce6565b81811115612d14576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612d3d57600080fd5b612d4683612c85565b946020939093013593505050565b600080600060608486031215612d6957600080fd5b612d7284612c85565b9250612d8060208501612c85565b9150604084013590509250925092565b80358015158114612c9c57600080fd5b60008060408385031215612db357600080fd5b82359150612dc360208401612d90565b90509250929050565b600060208284031215612dde57600080fd5b610c1582612d90565b60008060408385031215612dfa57600080fd5b612e0383612c85565b9150612dc360208401612c85565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612e8457612e84612e5c565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415612eb357612eb3612e5c565b5060010190565b60008219821115612ecd57612ecd612e5c565b500190565b6000816000190483118215151615612eec57612eec612e5c565b500290565b600082612f0e57634e487b7160e01b600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f635784516001600160a01b031683529383019391830191600101612f3e565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f9957600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8d54d9bb9bde1e43817b40733fe3ff4691af491c90059cda5c81c6f89e8644c64736f6c634300080b0033

Deployed Bytecode Sourcemap

14947:24938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25738:125;;;;;;;;;;-1:-1:-1;25738:125:0;;;;;:::i;:::-;;:::i;:::-;;24823:98;;;;;;;;;;-1:-1:-1;24823:98:0;;;;;:::i;:::-;;:::i;19453:85::-;;;;;;;;;;-1:-1:-1;19525:5:0;;;;;;;;;;;;-1:-1:-1;;;19525:5:0;;;;19453:85;;;;;;;:::i;:::-;;;;;;;;20394:163;;;;;;;;;;-1:-1:-1;20394:163:0;;;;;:::i;:::-;;:::i;:::-;;;1594:14:1;;1587:22;1569:41;;1557:2;1542:18;20394:163:0;1429:187:1;16961:32:0;;;;;;;;;;-1:-1:-1;16961:32:0;;;;-1:-1:-1;;;;;16961:32:0;;;;;;-1:-1:-1;;;;;1785:32:1;;;1767:51;;1755:2;1740:18;16961:32:0;1621:203:1;19743:97:0;;;;;;;;;;-1:-1:-1;19825:7:0;;19743:97;;;1975:25:1;;;1963:2;1948:18;19743:97:0;1829:177:1;16647:31:0;;;;;;;;;;;;;;;;20565:315;;;;;;;;;;-1:-1:-1;20565:315:0;;;;;:::i;:::-;;:::i;25194:123::-;;;;;;;;;;-1:-1:-1;25194:123:0;;;;;:::i;:::-;;:::i;16073:72::-;;;;;;;;;;-1:-1:-1;16073:72:0;;;;-1:-1:-1;;;;;16073:72:0;;;22547:253;;;;;;;;;;-1:-1:-1;22547:253:0;;;;;:::i;:::-;;:::i;19643:92::-;;;;;;;;;;-1:-1:-1;19643:92:0;;15625:1;2486:36:1;;2474:2;2459:18;19643:92:0;2344:184:1;23198:613:0;;;;;;;;;;-1:-1:-1;23198:613:0;;;;;:::i;:::-;;:::i;20888:220::-;;;;;;;;;;-1:-1:-1;20888:220:0;;;;;:::i;:::-;;:::i;16383:26::-;;;;;;;;;;;;;;;;21701:390;;;;;;;;;;-1:-1:-1;21701:390:0;;;;;:::i;:::-;;:::i;23940:214::-;;;;;;;;;;-1:-1:-1;23940:214:0;;;;;:::i;:::-;;:::i;22099:440::-;;;;;;;;;;-1:-1:-1;22099:440:0;;;;;:::i;:::-;;:::i;17235:40::-;;;;;;;;;;-1:-1:-1;17235:40:0;;;;-1:-1:-1;;;17235:40:0;;;;;;17284:26;;;;;;;;;;-1:-1:-1;17284:26:0;;;;-1:-1:-1;;;17284:26:0;;;;;;22808:382;;;;;;;;;;-1:-1:-1;22808:382:0;;;;;:::i;:::-;;:::i;31665:123::-;;;;;;;;;;-1:-1:-1;31665:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;31753:27:0;31729:4;31753:27;;;:18;:27;;;;;;;;;31665:123;25607;;;;;;;;;;-1:-1:-1;25607:123:0;;;;;:::i;:::-;;:::i;16912:42::-;;;;;;;;;;;;;;;25877:104;;;;;;;;;;-1:-1:-1;25877:104:0;;;;;:::i;:::-;;:::i;16464:32::-;;;;;;;;;;;;;;;;19848:208;;;;;;;;;;-1:-1:-1;19848:208:0;;;;;:::i;:::-;;:::i;14407:277::-;;;;;;;;;;;;;:::i;24396:131::-;;;;;;;;;;-1:-1:-1;24396:131:0;;;;;:::i;:::-;;:::i;24675:136::-;;;;;;;;;;-1:-1:-1;24675:136:0;;;;;:::i;:::-;;:::i;17323:46::-;;;;;;;;;;;;;;;;21395:132;;;;;;;;;;-1:-1:-1;21395:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;21489:30:0;21465:4;21489:30;;;:21;:30;;;;;;;;;21395:132;14197:79;;;;;;;;;;-1:-1:-1;14235:7:0;14262:6;-1:-1:-1;;;;;14262:6:0;14197:79;;24933:122;;;;;;;;;;-1:-1:-1;24933:122:0;;;;;:::i;:::-;;:::i;16745:32::-;;;;;;;;;;;;;;;;16848:57;;;;;;;;;;;;;;;19546:89;;;;;;;;;;-1:-1:-1;19620:7:0;;;;;;;;;;;;-1:-1:-1;;;19620:7:0;;;;19546:89;;21116:271;;;;;;;;;;-1:-1:-1;21116:271:0;;;;;:::i;:::-;;:::i;15872:93::-;;;;;;;;;;-1:-1:-1;15872:93:0;;;;-1:-1:-1;;;;;15872:93:0;;;20064:169;;;;;;;;;;-1:-1:-1;20064:169:0;;;;;:::i;:::-;;:::i;24535:132::-;;;;;;;;;;-1:-1:-1;24535:132:0;;;;;:::i;:::-;;:::i;16563:27::-;;;;;;;;;;;;;;;;25989:175;;;;;;;;;;-1:-1:-1;25989:175:0;;;;;:::i;:::-;;:::i;25067:119::-;;;;;;;;;;-1:-1:-1;25067:119:0;;;;;:::i;:::-;;:::i;17000:44::-;;;;;;;;;;;;;;;25325:101;;;;;;;;;;-1:-1:-1;25325:101:0;;;;;:::i;:::-;;:::i;17376:66::-;;;;;;;;;;;;;;;;25437:162;;;;;;;;;;-1:-1:-1;25437:162:0;;;;;:::i;:::-;;:::i;20241:145::-;;;;;;;;;;-1:-1:-1;20241:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;20351:18:0;;;20324:7;20351:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20241:145;24237:151;;;;;;;;;;-1:-1:-1;24237:151:0;;;;;:::i;:::-;;:::i;19341:104::-;;;;;;;;;;-1:-1:-1;19341:104:0;;;;;:::i;:::-;;:::i;14690:246::-;;;;;;;;;;-1:-1:-1;14690:246:0;;;;;:::i;:::-;;:::i;15972:94::-;;;;;;;;;;-1:-1:-1;15972:94:0;;;;-1:-1:-1;;;;;15972:94:0;;;25738:125;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;;;;;;;;;25820:17:::1;:35:::0;;-1:-1:-1;;;;;;25820:35:0::1;-1:-1:-1::0;;;;;25820:35:0;;;::::1;::::0;;;::::1;::::0;;25738:125::o;24823:98::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;24897:7:::1;:16:::0;24823:98::o;20394:163::-;20471:4;20488:39;2382:10;20511:7;20520:6;20488:8;:39::i;:::-;-1:-1:-1;20545:4:0;20394:163;;;;;:::o;20565:315::-;20665:4;20682:121;20691:6;2382:10;20713:89;20751:6;20713:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20713:19:0;;;;;;:11;:19;;;;;;;;2382:10;20713:33;;;;;;;;;;:37;:89::i;:::-;20682:8;:121::i;:::-;20814:36;20824:6;20832:9;20843:6;20814:9;:36::i;:::-;-1:-1:-1;20868:4:0;20565:315;;;;;:::o;25194:123::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25279:14:::1;:30:::0;25194:123::o;22547:253::-;22613:7;22652;;22641;:18;;22633:73;;;;-1:-1:-1;;;22633:73:0;;4423:2:1;22633:73:0;;;4405:21:1;4462:2;4442:18;;;4435:30;4501:34;4481:18;;;4474:62;-1:-1:-1;;;4552:18:1;;;4545:40;4602:19;;22633:73:0;4221:406:1;22633:73:0;22717:19;22740:10;:8;:10::i;:::-;22717:33;-1:-1:-1;22768:24:0;:7;22717:33;22768:11;:24::i;:::-;22761:31;22547:253;-1:-1:-1;;;22547:253:0:o;23198:613::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23280:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;23272:70;;;::::0;-1:-1:-1;;;23272:70:0;;4834:2:1;23272:70:0::1;::::0;::::1;4816:21:1::0;4873:2;4853:18;;;4846:30;4912:29;4892:18;;;4885:57;4959:18;;23272:70:0::1;4632:351:1::0;23272:70:0::1;23358:9;23353:451;23377:28;:35:::0;23373:39;::::1;23353:451;;;23473:7;-1:-1:-1::0;;;;;23438:42:0::1;:28;23467:1;23438:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;23438:31:0::1;:42;23434:359;;;23535:28;23564:35:::0;;:39:::1;::::0;23602:1:::1;::::0;23564:39:::1;:::i;:::-;23535:69;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;23501:28:::1;:31:::0;;-1:-1:-1;;;;;23535:69:0;;::::1;::::0;23530:1;;23501:31;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:103:::0;;-1:-1:-1;;;;;;23501:103:0::1;-1:-1:-1::0;;;;;23501:103:0;;::::1;;::::0;;23623:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;23662:21:::1;:30:::0;;;;:38;;-1:-1:-1;;23662:38:0::1;::::0;;23719:28:::1;:34:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;23719:34:0;;;;;-1:-1:-1;;;;;;23719:34:0::1;::::0;;;;;23353:451:::1;23198:613:::0;:::o;23434:359::-:1;23414:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23353:451;;;;23198:613:::0;:::o;20888:220::-;2382:10;20978:4;21027:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21027:34:0;;;;;;;;;;20978:4;;20995:83;;21018:7;;21027:50;;21066:10;21027:38;:50::i;21701:390::-;2382:10;21755:14;21804:29;;;:21;:29;;;;;;;;21803:30;21795:87;;;;-1:-1:-1;;;21795:87:0;;5856:2:1;21795:87:0;;;5838:21:1;5895:2;5875:18;;;5868:30;5934:34;5914:18;;;5907:62;-1:-1:-1;;;5985:18:1;;;5978:42;6037:19;;21795:87:0;5654:408:1;21795:87:0;21894:15;21919:19;21930:7;21919:10;:19::i;:::-;-1:-1:-1;;;;;;;;21967:15:0;;;;;;:7;:15;;;;;;21893:45;;-1:-1:-1;21967:28:0;;:15;-1:-1:-1;21893:45:0;;-1:-1:-1;;21967:19:0;:28::i;:::-;-1:-1:-1;;;;;21949:15:0;;;;;;:7;:15;;;;;:46;22016:7;;:20;;22028:7;22016:11;:20::i;:::-;22006:7;:30;22060:10;;:23;;22075:7;22060:14;:23::i;:::-;22047:10;:36;-1:-1:-1;;;21701:390:0:o;23940:214::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;24015:20:::1;:7;-1:-1:-1::0;;;;;24015:18:0::1;;:20::i;:::-;:52;;;;-1:-1:-1::0;24050:17:0::1;::::0;-1:-1:-1;;;;;24039:28:0;;::::1;24050:17:::0;::::1;24039:28;;24015:52;:86;;;;;24082:19;-1:-1:-1::0;;;;;24071:30:0::1;:7;-1:-1:-1::0;;;;;24071:30:0::1;;;24015:86;24011:135;;;-1:-1:-1::0;;;;;24112:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;24112:34:0::1;24142:4;24112:34;::::0;;24011:135:::1;23940:214:::0;:::o;22099:440::-;22191:7;22230;;22219;:18;;22211:62;;;;-1:-1:-1;;;22211:62:0;;6269:2:1;22211:62:0;;;6251:21:1;6308:2;6288:18;;;6281:30;6347:33;6327:18;;;6320:61;6398:18;;22211:62:0;6067:355:1;22211:62:0;22289:17;22284:248;;22324:15;22349:19;22360:7;22349:10;:19::i;:::-;-1:-1:-1;22323:45:0;;-1:-1:-1;22383:14:0;;-1:-1:-1;;;;;;22383:14:0;22284:248;22432:23;22464:19;22475:7;22464:10;:19::i;:::-;-1:-1:-1;22430:53:0;;-1:-1:-1;22498:22:0;;-1:-1:-1;;;;;;22498:22:0;22808:382;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22901:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;22900:31;22892:71;;;::::0;-1:-1:-1;;;22892:71:0;;4834:2:1;22892:71:0::1;::::0;::::1;4816:21:1::0;4873:2;4853:18;;;4846:30;4912:29;4892:18;;;4885:57;4959:18;;22892:71:0::1;4632:351:1::0;22892:71:0::1;-1:-1:-1::0;;;;;22977:16:0;::::1;22996:1;22977:16:::0;;;:7:::1;:16;::::0;;;;;:20;22974:108:::1;;-1:-1:-1::0;;;;;23053:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;23033:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;23014:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;22974:108:::1;-1:-1:-1::0;;;;;23092:30:0::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;23092:37:0::1;23125:4;23092:37:::0;;::::1;::::0;;;23140:28:::1;:42:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;23140:42:0::1;::::0;;::::1;::::0;;22808:382::o;25607:123::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25688:16:::1;:34:::0;;-1:-1:-1;;;;;;25688:34:0::1;-1:-1:-1::0;;;;;25688:34:0;;;::::1;::::0;;;::::1;::::0;;25607:123::o;25877:104::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25953:11:::1;:20:::0;;-1:-1:-1;;;;;;25953:20:0::1;-1:-1:-1::0;;;;;25953:20:0;;;::::1;::::0;;;::::1;::::0;;25877:104::o;19848:208::-;-1:-1:-1;;;;;19938:30:0;;19914:7;19938:30;;;:21;:30;;;;;;;;19934:59;;;-1:-1:-1;;;;;;19977:16:0;;;;;:7;:16;;;;;;;19848:208::o;19934:59::-;-1:-1:-1;;;;;20031:16:0;;;;;;:7;:16;;;;;;20011:37;;:19;:37::i;14407:277::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;14516:1:::1;14500:6:::0;;14479:40:::1;::::0;-1:-1:-1;;;;;14500:6:0;;::::1;::::0;14479:40:::1;::::0;14516:1;;14479:40:::1;14547:1;14530:19:::0;;-1:-1:-1;;;;;;14530:19:0;;::::1;::::0;;;;14649:27;;;;::::1;::::0;;14407:277::o;24396:131::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24477:34:0::1;24514:5;24477:34:::0;;;:25:::1;:34;::::0;;;;:42;;-1:-1:-1;;24477:42:0::1;::::0;;24396:131::o;24675:136::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;24768:29:::1;:35:::0;24675:136::o;24933:122::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25019:13:::1;:28:::0;24933:122::o;21116:271::-;21211:4;21228:129;2382:10;21251:7;21260:96;21299:15;21260:96;;;;;;;;;;;;;;;;;2382:10;21260:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21260:34:0;;;;;;;;;;;;:38;:96::i;20064:169::-;20144:4;20161:42;2382:10;20185:9;20196:6;20161:9;:42::i;24535:132::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24618:34:0::1;;::::0;;;:25:::1;:34;::::0;;;;:41;;-1:-1:-1;;24618:41:0::1;24655:4;24618:41;::::0;;24535:132::o;25989:175::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;26070:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;26070:32:0::1;-1:-1:-1::0;;;;26070:32:0;;::::1;;::::0;;26118:38:::1;::::0;::::1;::::0;::::1;::::0;26094:8;1594:14:1;1587:22;1569:41;;1557:2;1542:18;;1429:187;26118:38:0::1;;;;;;;;25989:175:::0;:::o;25067:119::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25150:13:::1;:28:::0;25067:119::o;25325:101::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25401:8:::1;:17:::0;25325:101::o;25437:162::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;25531:60:::1;25575:5;25531:25;25543:12;25531:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:60::i;:::-;25516:12;:75:::0;-1:-1:-1;25437:162:0:o;24237:151::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24310:24:0;::::1;24329:4;24310:24;24306:74;;-1:-1:-1::0;;;;;24345:27:0::1;24375:5;24345:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;24345:35:0::1;::::0;;24237:151::o;19341:104::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;19413:14:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;19413:24:0::1;-1:-1:-1::0;;;;19413:24:0;;::::1;::::0;;;::::1;::::0;;19341:104::o;14690:246::-;14322:6;;-1:-1:-1;;;;;14322:6:0;2382:10;14322:22;14314:67;;;;-1:-1:-1;;;14314:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14781:22:0;::::1;14773:73;;;::::0;-1:-1:-1;;;14773:73:0;;6629:2:1;14773:73:0::1;::::0;::::1;6611:21:1::0;6668:2;6648:18;;;6641:30;6707:34;6687:18;;;6680:62;-1:-1:-1;;;6758:18:1;;;6751:36;6804:19;;14773:73:0::1;6427:402:1::0;14773:73:0::1;14883:6;::::0;;14862:38:::1;::::0;-1:-1:-1;;;;;14862:38:0;;::::1;::::0;14883:6;::::1;::::0;14862:38:::1;::::0;::::1;14911:6;:17:::0;;-1:-1:-1;;;;;;14911:17:0::1;-1:-1:-1::0;;;;;14911:17:0;;;::::1;::::0;;;::::1;::::0;;14690:246::o;1540:132::-;1598:7;1625:39;1629:1;1632;1625:39;;;;;;;;;;;;;;;;;:3;:39::i;31796:337::-;-1:-1:-1;;;;;31889:19:0;;31881:68;;;;-1:-1:-1;;;31881:68:0;;7036:2:1;31881:68:0;;;7018:21:1;7075:2;7055:18;;;7048:30;7114:34;7094:18;;;7087:62;-1:-1:-1;;;7165:18:1;;;7158:34;7209:19;;31881:68:0;6834:400:1;31881:68:0;-1:-1:-1;;;;;31968:21:0;;31960:68;;;;-1:-1:-1;;;31960:68:0;;7441:2:1;31960:68:0;;;7423:21:1;7480:2;7460:18;;;7453:30;7519:34;7499:18;;;7492:62;-1:-1:-1;;;7570:18:1;;;7563:32;7612:19;;31960:68:0;7239:398:1;31960:68:0;-1:-1:-1;;;;;32041:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32093:32;;1975:25:1;;;32093:32:0;;1948:18:1;32093:32:0;;;;;;;31796:337;;;:::o;1090:192::-;1176:7;1212:12;1204:6;;;;1196:29;;;;-1:-1:-1;;;1196:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1236:9:0;1248:5;1252:1;1248;:5;:::i;:::-;1236:17;1090:192;-1:-1:-1;;;;;1090:192:0:o;32141:2324::-;-1:-1:-1;;;;;32263:18:0;;32255:68;;;;-1:-1:-1;;;32255:68:0;;7844:2:1;32255:68:0;;;7826:21:1;7883:2;7863:18;;;7856:30;7922:34;7902:18;;;7895:62;-1:-1:-1;;;7973:18:1;;;7966:35;8018:19;;32255:68:0;7642:401:1;32255:68:0;-1:-1:-1;;;;;32342:16:0;;32334:64;;;;-1:-1:-1;;;32334:64:0;;8250:2:1;32334:64:0;;;8232:21:1;8289:2;8269:18;;;8262:30;8328:34;8308:18;;;8301:62;-1:-1:-1;;;8379:18:1;;;8372:33;8422:19;;32334:64:0;8048:399:1;32334:64:0;32426:1;32417:6;:10;32409:64;;;;-1:-1:-1;;;32409:64:0;;8654:2:1;32409:64:0;;;8636:21:1;8693:2;8673:18;;;8666:30;8732:34;8712:18;;;8705:62;-1:-1:-1;;;8783:18:1;;;8776:39;8832:19;;32409:64:0;8452:405:1;32409:64:0;14235:7;14262:6;-1:-1:-1;;;;;32487:15:0;;;14262:6;;32487:15;32484:76;;32513:14;;-1:-1:-1;;;32513:14:0;;;;32505:53;;;;-1:-1:-1;;;32505:53:0;;9064:2:1;32505:53:0;;;9046:21:1;9103:2;9083:18;;;9076:30;9142:28;9122:18;;;9115:56;9188:18;;32505:53:0;8862:350:1;32505:53:0;14235:7;14262:6;-1:-1:-1;;;;;32573:15:0;;;14262:6;;32573:15;;;;:32;;-1:-1:-1;14235:7:0;14262:6;-1:-1:-1;;;;;32592:13:0;;;14262:6;;32592:13;;32573:32;32570:200;;;-1:-1:-1;;;;;32635:31:0;;;;;;:25;:31;;;;;;;;32631:128;;32700:12;;32690:6;:22;;32682:75;;;;-1:-1:-1;;;32682:75:0;;9419:2:1;32682:75:0;;;9401:21:1;9458:2;9438:18;;;9431:30;9497:34;9477:18;;;9470:62;-1:-1:-1;;;9548:18:1;;;9541:38;9596:19;;32682:75:0;9217:404:1;32682:75:0;32854:1;32838:13;33191:24;33209:4;33191:9;:24::i;:::-;33160:55;;33260:12;;33236:20;:36;33233:112;;-1:-1:-1;33321:12:0;;33233:112;33416:29;;33392:53;;;;;;;33474;;-1:-1:-1;33511:16:0;;-1:-1:-1;;;33511:16:0;;;;33510:17;33474:53;:95;;;;-1:-1:-1;33552:17:0;;-1:-1:-1;;;;;33544:25:0;;;33552:17;;33544:25;;33474:95;:133;;;;-1:-1:-1;33586:21:0;;-1:-1:-1;;;33586:21:0;;;;33474:133;:153;;;;;33615:7;:12;;33626:1;33615:12;33474:153;33456:311;;;33719:36;33734:20;33719:14;:36::i;:::-;-1:-1:-1;;;;;33884:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;33912:22:0;;;;;;:18;:22;;;;;;;;33884:50;33881:92;;;33960:1;33950:11;;33881:92;33996:17;;-1:-1:-1;;;;;33988:25:0;;;33996:17;;33988:25;;;;:52;;-1:-1:-1;34023:17:0;;-1:-1:-1;;;;;34017:23:0;;;34023:17;;34017:23;;33988:52;33985:104;;;34076:1;34066:11;;33985:104;34113:7;:12;;34124:1;34113:12;34110:223;;;34147:23;34173:28;34188:4;34194:6;34173:14;:28::i;:::-;34147:54;;34212:24;34239:29;34255:4;34261:6;34239:15;:29::i;:::-;34212:56;-1:-1:-1;34298:32:0;34212:56;34298:15;:32;:::i;:::-;34288:43;;:6;:43;:::i;:::-;34279:52;;34136:197;;34110:223;34419:38;34434:4;34439:2;34442:6;34449:7;34419:14;:38::i;:::-;32244:2221;;;32141:2324;;;:::o;27814:163::-;27855:7;27876:15;27893;27912:19;:17;:19::i;:::-;27875:56;;-1:-1:-1;27875:56:0;-1:-1:-1;27949:20:0;27875:56;;27949:11;:20::i;:::-;27942:27;;;;27814:163;:::o;763:179::-;821:7;;853:5;857:1;853;:5;:::i;:::-;841:17;;882:1;877;:6;;869:46;;;;-1:-1:-1;;;869:46:0;;9961:2:1;869:46:0;;;9943:21:1;10000:2;9980:18;;;9973:30;10039:29;10019:18;;;10012:57;10086:18;;869:46:0;9759:351:1;26383:456:0;26442:7;26451;26460;26469;26478;26487;26496;26517:23;26542:12;26556:13;26570:18;26592:20;26604:7;26592:11;:20::i;:::-;26516:96;;;;;;;;26624:15;26641:23;26666:12;26682:57;26694:7;26703:4;26709:5;26716:10;26728;:8;:10::i;:::-;26682:11;:57::i;:::-;26623:116;;-1:-1:-1;26623:116:0;-1:-1:-1;26623:116:0;-1:-1:-1;26790:15:0;;-1:-1:-1;26807:4:0;;-1:-1:-1;26813:5:0;;-1:-1:-1;26820:10:0;-1:-1:-1;;;;26383:456:0;;;;;;;;;:::o;948:136::-;1006:7;1033:43;1037:1;1040;1033:43;;;;;;;;;;;;;;;;;:3;:43::i;2669:619::-;2729:4;3197:20;;3040:66;3237:23;;;;;;:42;;-1:-1:-1;3264:15:0;;;3237:42;3229:51;2669:619;-1:-1:-1;;;;2669:619:0:o;1288:246::-;1346:7;1370:6;1366:47;;-1:-1:-1;1400:1:0;1393:8;;1366:47;1423:9;1435:5;1439:1;1435;:5;:::i;:::-;1423:17;-1:-1:-1;1468:1:0;1459:5;1463:1;1423:17;1459:5;:::i;:::-;:10;1451:56;;;;-1:-1:-1;;;1451:56:0;;10712:2:1;1451:56:0;;;10694:21:1;10751:2;10731:18;;;10724:30;10790:34;10770:18;;;10763:62;-1:-1:-1;;;10841:18:1;;;10834:31;10882:19;;1451:56:0;10510:397:1;1678:276:0;1764:7;1799:12;1792:5;1784:28;;;;-1:-1:-1;;;1784:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1823:9:0;1835:5;1839:1;1835;:5;:::i;34482:1247::-;17749:16;:23;;-1:-1:-1;;;;17749:23:0;-1:-1:-1;;;17749:23:0;;;;34593:58:::1;34649:1;34593:51;34632:11;:9;:11::i;:::-;34613:13;::::0;34593:34:::1;::::0;:15;;:19:::1;:34::i;:58::-;34572:79:::0;-1:-1:-1;34662:20:0::1;34685:31;:15:::0;34572:79;34685:19:::1;:31::i;:::-;34753:16;::::0;;34767:1:::1;34753:16:::0;;;;;::::1;::::0;;34662:54;;-1:-1:-1;34729:21:0::1;::::0;34753:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;34753:16:0::1;34729:40;;34798:4;34780;34785:1;34780:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;34780:23:0::1;;;-1:-1:-1::0;;;;;34780:23:0::1;;;::::0;::::1;34824:17;34814:4;34819:1;34814:7;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1::0;;;;;34814:27:0::1;;;-1:-1:-1::0;;;;;34814:27:0::1;;;::::0;::::1;34854:70;34871:4;34886:19;34908:15;34854:8;:70::i;:::-;34935:203;::::0;-1:-1:-1;;;34935:203:0;;-1:-1:-1;;;;;34935:21:0::1;:72;::::0;::::1;::::0;:203:::1;::::0;35022:12;;35049:1:::1;::::0;35065:4;;35092::::1;::::0;35112:15:::1;::::0;34935:203:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35244:13:0::1;::::0;35172:21:::1;::::0;-1:-1:-1;35151:18:0::1;::::0;-1:-1:-1;35227:39:0::1;::::0;35243:22:::1;::::0;35263:1:::1;35243:19;:22::i;:::-;35227:11;:9;:11::i;:::-;:15:::0;::::1;:39::i;:::-;35204:62;;35279:23;35305:54;35357:1;35305:47;35339:12;35305:29;35320:13;;35305:10;:14;;:29;;;;:::i;:54::-;35279:80;;35370:23;35396:47;35430:12;35396:29;35411:13;;35396:10;:14;;:29;;;;:::i;:47::-;35370:73;;35454:22;35479:48;35514:12;35479:30;35494:14;;35479:10;:14;;:30;;;;:::i;:48::-;35454:73;;35545:41;35558:10;35570:15;35545:12;:41::i;:::-;35607:16;::::0;35599:51:::1;::::0;-1:-1:-1;;;;;35607:16:0;;::::1;::::0;35599:51;::::1;;;::::0;35634:15;;35607:16:::1;35599:51:::0;35607:16;35599:51;35634:15;35607:16;35599:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;35669:17:0::1;::::0;35661:51:::1;::::0;-1:-1:-1;;;;;35669:17:0;;::::1;::::0;35661:51;::::1;;;::::0;35697:14;;35669:17:::1;35661:51:::0;35669:17;35661:51;35697:14;35669:17;35661:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17795:16:0;:24;;-1:-1:-1;;;;17795:24:0;;;-1:-1:-1;;;;;;;;34482:1247:0:o;30116:497::-;30192:7;30209:18;30230:33;30252:10;30230:21;:33::i;:::-;30313:4;30297:22;;;;:7;:22;;;;;;30209:54;;-1:-1:-1;30297:38:0;;30209:54;30297:26;:38::i;:::-;30288:4;30272:22;;;;:7;:22;;;;;;:63;;;;-1:-1:-1;;;;;30362:15:0;;;;;;:31;;30382:10;30362:19;:31::i;:::-;-1:-1:-1;;;;;30344:15:0;;;;;;:7;:15;;;;;;;;;:49;;;;30407:43;1975:25:1;;;30432:4:0;;30407:43;;1948:18:1;30407:43:0;;;;;;;30495:4;30465:36;;;;:21;:36;;;;;;;;30462:117;;;30557:4;30541:22;;;;:7;:22;;;;;;:38;;30568:10;30541:26;:38::i;:::-;30532:4;30516:22;;;;:7;:22;;;;;:63;30595:10;30116:497;-1:-1:-1;;;30116:497:0:o;30621:507::-;30699:7;30716:19;30738:35;30761:11;30738:22;:35::i;36341:957::-;36452:12;;;36449:54;;36489:14;:12;:14::i;:::-;-1:-1:-1;;;;;36528:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;36562:32:0;;;;;;:21;:32;;;;;;;;36561:33;36528:66;36524:677;;;36611:48;36633:6;36641:9;36652:6;36611:21;:48::i;:::-;36524:677;;;-1:-1:-1;;;;;36682:29:0;;;;;;:21;:29;;;;;;;;36681:30;:66;;;;-1:-1:-1;;;;;;36715:32:0;;;;;;:21;:32;;;;;;;;36681:66;36677:524;;;36764:46;36784:6;36792:9;36803:6;36764:19;:46::i;36677:524::-;-1:-1:-1;;;;;36833:29:0;;;;;;:21;:29;;;;;;;;36832:30;:67;;;;-1:-1:-1;;;;;;36867:32:0;;;;;;:21;:32;;;;;;;;36866:33;36832:67;36828:373;;;36916:44;36934:6;36942:9;36953:6;36916:17;:44::i;36828:373::-;-1:-1:-1;;;;;36982:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;37015:32:0;;;;;;:21;:32;;;;;;;;36982:65;36978:223;;;37064:48;37086:6;37094:9;37105:6;37064:21;:48::i;36978:223::-;37145:44;37163:6;37171:9;37182:6;37145:17;:44::i;:::-;37224:7;:12;;37235:1;37224:12;37221:69;;37275:15;31540;;31530:7;:25;31577:16;;31566:8;:27;31620:21;;31604:13;:37;31486:163;37275:15;36341:957;;;;:::o;27985:656::-;28082:7;;28118;;28035;;;;;28142:384;28166:28;:35;28162:39;;28142:384;;;28270:7;28227;:40;28235:28;28264:1;28235:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28235:31:0;28227:40;;;;;;;;;;;;;:50;;:104;;;28324:7;28281;:40;28289:28;28318:1;28289:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28289:31:0;28281:40;;;;;;;;;;;;;:50;28227:104;28223:135;;;28341:7;;28350;;28333:25;;;;;;;27985:656;;:::o;28223:135::-;28383:53;28395:7;:40;28403:28;28432:1;28403:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28403:31:0;28395:40;;;;;;;;;;;;;28383:7;;:11;:53::i;:::-;28373:63;;28461:53;28473:7;:40;28481:28;28510:1;28481:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28481:31:0;28473:40;;;;;;;;;;;;;28461:7;;:11;:53::i;:::-;28451:63;-1:-1:-1;28203:3:0;;;;:::i;:::-;;;;28142:384;;;-1:-1:-1;28562:7:0;;28550;;:20;;:11;:20::i;:::-;28540:7;:30;28536:61;;;28580:7;;28589;;28572:25;;;;;;27985:656;;:::o;28536:61::-;28616:7;;28625;;-1:-1:-1;27985:656:0;-1:-1:-1;27985:656:0:o;26847:409::-;26907:7;26916;26925;26934;26954:12;26969:24;26985:7;26969:15;:24::i;:::-;26954:39;;27004:13;27020:25;27037:7;27020:16;:25::i;:::-;27004:41;;27056:18;27077:30;27099:7;27077:21;:30::i;:::-;27056:51;-1:-1:-1;27118:23:0;27144:44;27056:51;27144:28;27166:5;27144:28;:7;27156:4;27144:11;:17::i;:44::-;27118:70;27224:4;;-1:-1:-1;27230:5:0;;-1:-1:-1;27230:5:0;-1:-1:-1;26847:409:0;;-1:-1:-1;;;26847:409:0:o;27264:542::-;27394:7;;;;27450:24;:7;27462:11;27450;:24::i;:::-;27432:42;-1:-1:-1;27485:12:0;27500:21;:4;27509:11;27500:8;:21::i;:::-;27485:36;-1:-1:-1;27532:13:0;27548:22;:5;27558:11;27548:9;:22::i;:::-;27532:38;-1:-1:-1;27581:18:0;27602:27;:10;27617:11;27602:14;:27::i;:::-;27581:48;-1:-1:-1;27640:16:0;27659:31;27581:48;27659:15;:4;27668:5;27659:8;:15::i;:::-;:19;;:31::i;:::-;27640:50;-1:-1:-1;27701:23:0;27727:21;:7;27640:50;27727:11;:21::i;:::-;27767:7;;;;-1:-1:-1;27793:4:0;;-1:-1:-1;27264:542:0;;-1:-1:-1;;;;;;;;;;27264:542:0:o;21535:158::-;21579:7;21606:79;21670:14;;21606:59;21651:13;;21606:40;21637:8;;21606:26;21618:13;;21606:7;;:11;;:26;;;;:::i;:79::-;21599:86;;21535:158;:::o;35737:523::-;35885:66;35902:4;35917:19;35939:11;35885:8;:66::i;:::-;35994:21;-1:-1:-1;;;;;35994:37:0;;36039:9;36072:4;36092:11;36118:1;36161;36204:7;14235;14262:6;-1:-1:-1;;;;;14262:6:0;;14197:79;36204:7;35994:258;;;;;;-1:-1:-1;;;;;;35994:258:0;;;-1:-1:-1;;;;;12388:15:1;;;35994:258:0;;;12370:34:1;12420:18;;;12413:34;;;;12463:18;;;12456:34;;;;12506:18;;;12499:34;12570:15;;;12549:19;;;12542:44;36226:15:0;12602:19:1;;;12595:35;12304:19;;35994:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;35737:523;;:::o;28976:166::-;29046:7;29073:61;29118:5;29073:26;29085:13;;29073:7;:11;;:26;;;;:::i;29151:168::-;29222:7;29249:62;29295:5;29249:27;29261:14;;29249:7;:11;;:27;;;;:::i;31146:328::-;31192:7;;:12;:29;;;;-1:-1:-1;31208:8:0;;:13;31192:29;:51;;;;-1:-1:-1;31225:13:0;;:18;31192:51;31189:63;;;31146:328::o;31189:63::-;31290:7;;;31272:15;:25;31327:8;;;31308:16;:27;31370:13;;;31346:21;:37;-1:-1:-1;31404:11:0;;;;31426:12;;;;31449:17;31146:328::o;38540:633::-;38643:15;38660:23;38685:12;38699:23;38724:12;38738:13;38753:18;38775:19;38786:7;38775:10;:19::i;:::-;38642:152;;;;;;;;;;;;;;38833:28;38853:7;38833;:15;38841:6;-1:-1:-1;;;;;38833:15:0;-1:-1:-1;;;;;38833:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;38815:15:0;;;;;;:7;:15;;;;;;;;:46;;;;38890:7;:15;;;;:28;;38910:7;38890:19;:28::i;:::-;-1:-1:-1;;;;;38872:15:0;;;;;;;:7;:15;;;;;;:46;;;;38950:18;;;;;;;:39;;38973:15;38950:22;:39::i;:::-;-1:-1:-1;;;;;38929:18:0;;;;;;:7;:18;;;;;:60;39000:23;39012:4;39018;39000:11;:23::i;:::-;39034:26;39049:10;39034:14;:26::i;:::-;39071:24;39081:6;39089:5;39071:9;:24::i;:::-;39128:9;-1:-1:-1;;;;;39111:44:0;39120:6;-1:-1:-1;;;;;39111:44:0;;39139:15;39111:44;;;;1975:25:1;;1963:2;1948:18;;1829:177;39111:44:0;;;;;;;;38631:542;;;;;;;38540:633;;;:::o;37882:650::-;37983:15;38000:23;38025:12;38039:23;38064:12;38078:13;38093:18;38115:19;38126:7;38115:10;:19::i;:::-;37982:152;;;;;;;;;;;;;;38163:28;38183:7;38163;:15;38171:6;-1:-1:-1;;;;;38163:15:0;-1:-1:-1;;;;;38163:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;38145:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;38223:18;;;;;:7;:18;;;;;:39;;38246:15;38223:22;:39::i;:::-;-1:-1:-1;;;;;38202:18:0;;;;;;:7;:18;;;;;;;;:60;;;;38294:7;:18;;;;:39;;38317:15;38294:22;:39::i;:::-;-1:-1:-1;;;;;38273:18:0;;;;;;:7;:18;;;;;:60;38348:26;38363:10;38348:14;:26::i;:::-;38385:24;38395:6;38403:5;38385:9;:24::i;:::-;38427:23;38439:4;38445;38427:11;:23::i;37306:568::-;37405:15;37422:23;37447:12;37461:23;37486:12;37500:13;37515:18;37537:19;37548:7;37537:10;:19::i;:::-;37404:152;;;;;;;;;;;;;;37585:28;37605:7;37585;:15;37593:6;-1:-1:-1;;;;;37585:15:0;-1:-1:-1;;;;;37585:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;37567:15:0;;;;;;;:7;:15;;;;;;:46;;;;37645:18;;;;;;;:39;;37668:15;37645:22;:39::i;39181:699::-;39284:15;39301:23;39326:12;39340:23;39365:12;39379:13;39394:18;39416:19;39427:7;39416:10;:19::i;:::-;39283:152;;;;;;;;;;;;;;39464:28;39484:7;39464;:15;39472:6;-1:-1:-1;;;;;39464:15:0;-1:-1:-1;;;;;39464:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;39446:15:0;;;;;;:7;:15;;;;;;;;:46;;;;39521:7;:15;;;;:28;;39541:7;39521:19;:28::i;28665:154::-;28729:7;28756:55;28795:5;28756:20;28768:7;;28756;:11;;:20;;;;:::i;28827:141::-;28892:7;28922:32;28948:5;28922:21;28934:8;;28922:7;:11;;:21;;;;:::i;29328:166::-;29398:7;29425:61;29470:5;29425:26;29437:13;;29425:7;:11;;:26;;;;:::i;26219:156::-;26297:7;;:17;;26309:4;26297:11;:17::i;:::-;26287:7;:27;26338:10;;:20;;26353:4;26338:14;:20::i;:::-;26325:10;:33;-1:-1:-1;;26219:156:0:o;29502:365::-;29565:19;29588:10;:8;:10::i;:::-;29565:33;-1:-1:-1;29609:18:0;29630:27;:10;29565:33;29630:14;:27::i;:::-;29709:4;29693:22;;;;:7;:22;;;;;;29609:48;;-1:-1:-1;29693:38:0;;29609:48;29693:26;:38::i;:::-;29684:4;29668:22;;;;:7;:22;;;;;;;;:63;;;;29745:21;:36;;;;;;29742:117;;;29837:4;29821:22;;;;:7;:22;;;;;;:38;;29848:10;29821:26;:38::i;:::-;29812:4;29796:22;;;;:7;:22;;;;;:63;29742:117;29554:313;;29502:365;:::o;29875:229::-;29985:11;;-1:-1:-1;;;;;29985:11:0;29977:20;;;;:7;:20;;;;;;:31;;30002:5;29977:24;:31::i;:::-;29962:11;;-1:-1:-1;;;;;29962:11:0;29954:20;;;;:7;:20;;;;;:54;30022:9;;30019:67;;30065:11;;30048:36;;1975:25:1;;;-1:-1:-1;;;;;30065:11:0;;;;30048:36;;;;;1963:2:1;1948:18;30048:36:0;;;;;;;29875:229;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:180::-;442:6;495:2;483:9;474:7;470:23;466:32;463:52;;;511:1;508;501:12;463:52;-1:-1:-1;534:23:1;;383:180;-1:-1:-1;383:180:1:o;568:597::-;680:4;709:2;738;727:9;720:21;770:6;764:13;813:6;808:2;797:9;793:18;786:34;838:1;848:140;862:6;859:1;856:13;848:140;;;957:14;;;953:23;;947:30;923:17;;;942:2;919:26;912:66;877:10;;848:140;;;1006:6;1003:1;1000:13;997:91;;;1076:1;1071:2;1062:6;1051:9;1047:22;1043:31;1036:42;997:91;-1:-1:-1;1149:2:1;1128:15;-1:-1:-1;;1124:29:1;1109:45;;;;1156:2;1105:54;;568:597;-1:-1:-1;;;568:597:1:o;1170:254::-;1238:6;1246;1299:2;1287:9;1278:7;1274:23;1270:32;1267:52;;;1315:1;1312;1305:12;1267:52;1338:29;1357:9;1338:29;:::i;:::-;1328:39;1414:2;1399:18;;;;1386:32;;-1:-1:-1;;;1170:254:1:o;2011:328::-;2088:6;2096;2104;2157:2;2145:9;2136:7;2132:23;2128:32;2125:52;;;2173:1;2170;2163:12;2125:52;2196:29;2215:9;2196:29;:::i;:::-;2186:39;;2244:38;2278:2;2267:9;2263:18;2244:38;:::i;:::-;2234:48;;2329:2;2318:9;2314:18;2301:32;2291:42;;2011:328;;;;;:::o;2533:160::-;2598:20;;2654:13;;2647:21;2637:32;;2627:60;;2683:1;2680;2673:12;2698:248;2763:6;2771;2824:2;2812:9;2803:7;2799:23;2795:32;2792:52;;;2840:1;2837;2830:12;2792:52;2876:9;2863:23;2853:33;;2905:35;2936:2;2925:9;2921:18;2905:35;:::i;:::-;2895:45;;2698:248;;;;;:::o;3410:180::-;3466:6;3519:2;3507:9;3498:7;3494:23;3490:32;3487:52;;;3535:1;3532;3525:12;3487:52;3558:26;3574:9;3558:26;:::i;3595:260::-;3663:6;3671;3724:2;3712:9;3703:7;3699:23;3695:32;3692:52;;;3740:1;3737;3730:12;3692:52;3763:29;3782:9;3763:29;:::i;:::-;3753:39;;3811:38;3845:2;3834:9;3830:18;3811:38;:::i;3860:356::-;4062:2;4044:21;;;4081:18;;;4074:30;4140:34;4135:2;4120:18;;4113:62;4207:2;4192:18;;3860:356::o;4988:127::-;5049:10;5044:3;5040:20;5037:1;5030:31;5080:4;5077:1;5070:15;5104:4;5101:1;5094:15;5120:127;5181:10;5176:3;5172:20;5169:1;5162:31;5212:4;5209:1;5202:15;5236:4;5233:1;5226:15;5252:125;5292:4;5320:1;5317;5314:8;5311:34;;;5325:18;;:::i;:::-;-1:-1:-1;5362:9:1;;5252:125::o;5382:127::-;5443:10;5438:3;5434:20;5431:1;5424:31;5474:4;5471:1;5464:15;5498:4;5495:1;5488:15;5514:135;5553:3;-1:-1:-1;;5574:17:1;;5571:43;;;5594:18;;:::i;:::-;-1:-1:-1;5641:1:1;5630:13;;5514:135::o;9626:128::-;9666:3;9697:1;9693:6;9690:1;9687:13;9684:39;;;9703:18;;:::i;:::-;-1:-1:-1;9739:9:1;;9626:128::o;10115:168::-;10155:7;10221:1;10217;10213:6;10209:14;10206:1;10203:21;10198:1;10191:9;10184:17;10180:45;10177:71;;;10228:18;;:::i;:::-;-1:-1:-1;10268:9:1;;10115:168::o;10288:217::-;10328:1;10354;10344:132;;10398:10;10393:3;10389:20;10386:1;10379:31;10433:4;10430:1;10423:15;10461:4;10458:1;10451:15;10344:132;-1:-1:-1;10490:9:1;;10288:217::o;11044:980::-;11306:4;11354:3;11343:9;11339:19;11385:6;11374:9;11367:25;11411:2;11449:6;11444:2;11433:9;11429:18;11422:34;11492:3;11487:2;11476:9;11472:18;11465:31;11516:6;11551;11545:13;11582:6;11574;11567:22;11620:3;11609:9;11605:19;11598:26;;11659:2;11651:6;11647:15;11633:29;;11680:1;11690:195;11704:6;11701:1;11698:13;11690:195;;;11769:13;;-1:-1:-1;;;;;11765:39:1;11753:52;;11860:15;;;;11825:12;;;;11801:1;11719:9;11690:195;;;-1:-1:-1;;;;;;;11941:32:1;;;;11936:2;11921:18;;11914:60;-1:-1:-1;;;12005:3:1;11990:19;11983:35;11902:3;11044:980;-1:-1:-1;;;11044:980:1:o;12641:306::-;12729:6;12737;12745;12798:2;12786:9;12777:7;12773:23;12769:32;12766:52;;;12814:1;12811;12804:12;12766:52;12843:9;12837:16;12827:26;;12893:2;12882:9;12878:18;12872:25;12862:35;;12937:2;12926:9;12922:18;12916:25;12906:35;;12641:306;;;;;:::o

Swarm Source

ipfs://e8d54d9bb9bde1e43817b40733fe3ff4691af491c90059cda5c81c6f89e8644c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.