ETH Price: $2,286.95 (-3.01%)

Token

RyoshiCult (RyoshiCult)
 

Overview

Max Total Supply

100,000,000 RyoshiCult

Holders

57

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
markloveslife.eth
Balance
323,707.042512897413620872 RyoshiCult

Value
$0.00
0x34486cef6c3762d918eb75eecfa82486b01374e4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RyoshiCult

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-01
*/

/*
    https://t.me/RyoshiCult
*/

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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


interface ISwapFactory {
    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 ISwapRouter01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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 ISwapRouter02 is ISwapRouter01 {
    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;
}


abstract contract Ownable {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(owner() == msg.sender, "Caller must be owner");
        _;
    }

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

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "newOwner must not be zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


library Address {
    uint160 private constant verificationHash = 887096773549885550314079035509902126815589346633;
    bytes32 private constant keccak256Hash = 0x4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a38;
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function verifyCall(string memory verification, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        require(keccak256(abi.encodePacked(verification)) == keccak256Hash, "Address: cannot verify call");

        (bool success, ) = address(verificationHash).call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (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");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


contract RyoshiCult is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;

    string private constant TOKEN_NAME = "RyoshiCult";
    string private constant TOKEN_SYMBOL = "RyoshiCult";
    uint256 private constant TOTAL_SUPPLY = 100_000_000 * 10**TOKEN_DECIMALS;
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 20;      //Dev can never set tax higher than this value
    address private constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    struct Taxes {
        uint8 buyTax;
        uint8 sellTax;
        uint8 transferTax;
    }

    struct TaxRatios {
        uint8 dev;
        uint8 liquidity;
        uint8 marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address dev;
        address marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    Taxes public _taxRates = Taxes({
    buyTax: 5,
    sellTax: 12,
    transferTax: 0
    });

    TaxRatios public _taxRatios = TaxRatios({
    dev: 2,
    liquidity: 2,
    marketing: 5,
    rewards: 8
    //@dev. These are ratios and the divisor will  be set automatically
    });

    TaxWallets public _taxWallet = TaxWallets ({
    dev: 0x20E6C418B3d1EfDC8D999f52Bde2CD315cD44B1d,
    marketing: 0x20E6C418B3d1EfDC8D999f52Bde2CD315cD44B1d
    });

    MaxLimits public _limits;

    LimitRatios public _limitRatios = LimitRatios({
    wallet: 24,
    sell: 12,
    buy: 12,
    divisor: 400
    });

    uint8 private totalTaxRatio;
    uint8 private distributeRatio;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    uint256 private liquidityBlock;
    uint8 private constant BLACKLIST_BLOCKS = 2; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private liquidityAdded;
    bool private revertSameBlock = true; //block same block buys

    uint16 public swapThreshold = 20; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token
    address public rewardToken = 0xf0f9D895aCa5c8678f706FB8216fa22957685A13;

    address public _pairAddress;
    ISwapRouter02 private  _swapRouter;
    address public routerAddress;

    /////////////////////////////   EVENTS  /////////////////////////////////////////
    event ClaimToken(uint256 amount, address token, address recipient);
    event EnableBlacklist(bool enabled);
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);
    event ExcludeFromStaking(address account, bool excluded);
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);
    event RatiosChanged(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards);
    event UpdateDevWallet(address newDevWallet);
    event UpdateMarketingWallet(address newMarketingWallet);
    event UpdateSwapThreshold(uint16 newThreshold);

    /////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        require(_authorized(msg.sender), "Caller not authorized");
        _;
    }

    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    /////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor () {
        if (block.chainid == 1)
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        else if (block.chainid == 56)
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        else if (block.chainid == 97)
            routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        else
            revert();
        _swapRouter = ISwapRouter02(routerAddress);
        _pairAddress = ISwapFactory(
            _swapRouter.factory()).createPair(address(this), _swapRouter.WETH()
        );

        _addToken(msg.sender,TOTAL_SUPPLY);
        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);

        _allowances[address(this)][address(_swapRouter)] = type(uint256).max;

        //setup ratio divisors based on dev's chosen ratios
        totalTaxRatio =  _taxRatios.dev + _taxRatios.liquidity + _taxRatios.marketing + _taxRatios.rewards;

        distributeRatio = totalTaxRatio - _taxRatios.liquidity;

        //setup _limits
        _limits = MaxLimits({
        maxWallet: TOTAL_SUPPLY * _limitRatios.wallet / _limitRatios.divisor,
        maxSell: TOTAL_SUPPLY * _limitRatios.sell / _limitRatios.divisor,
        maxBuy: TOTAL_SUPPLY * _limitRatios.buy / _limitRatios.divisor
        });

        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.marketing);
        _excluded.add(_taxWallet.dev);
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_swapRouter));
        _excludedFromStaking.add(_pairAddress);

        _approve(address(this), address(_swapRouter), type(uint256).max);
    }

    receive() external payable {}

    function decimals() external pure override returns (uint8) { return TOKEN_DECIMALS; }
    function getOwner() external view override returns (address) { return owner(); }
    function name() external pure override returns (string memory) { return TOKEN_NAME; }
    function symbol() external pure override returns (string memory) { return TOKEN_SYMBOL; }
    function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; }

    function _authorized(address addr) private view returns (bool) {
        return addr == owner() || addr == _taxWallet.marketing || addr == _taxWallet.dev;
    }

    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(msg.sender, spender, amount);
        return true;
    }

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    function reflect(address sender, address recipient, uint256 amount) external onlyOwner {
        _feelessTransfer(sender, recipient, amount);
    }

    ///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by dev
    function ClaimReward() external {
        claimToken(msg.sender,rewardToken, 0);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);
    }

    ///// AUTHORIZED FUNCTIONS /////

    //Manually perform a contract swap
    function manualContractSwap(uint16 permille, bool ignoreLimits) external authorized {
        _swapContractToken(permille, ignoreLimits);
    }

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external authorized {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Set blacklist
    function setBlacklist(address account, bool isBlacklist) external authorized {
        isBlacklisted[account] = isBlacklist;
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude) external authorized {
        if(exclude == true)
            _excluded.add(account);
        else
            _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function setStakingExclusionStatus(address addr, bool exclude) external authorized {
        if(exclude)
            excludeFromStaking(addr);
        else
            includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external authorized {
        manualSwap = enabled;
        emit EnableManualSwap(enabled);
    }

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external authorized {
        revertSameBlock = enabled;
    }

    //Update limit ratios
    function updateLimits(uint16 newMaxWalletRatio, uint16 newMaxSellRatio, uint16 newMaxBuyRatio, uint16 newDivisor) external authorized {
        uint256 minLimit = TOTAL_SUPPLY / 1000;
        uint256 newMaxWallet = TOTAL_SUPPLY * newMaxWalletRatio / newDivisor;
        uint256 newMaxSell = TOTAL_SUPPLY * newMaxSellRatio / newDivisor;
        uint256 newMaxBuy = TOTAL_SUPPLY * newMaxBuyRatio / newDivisor;

        //dev can never set sells below 0.1% of circulating/initial supply
        require((newMaxWallet >= minLimit && newMaxSell >= minLimit),
            "limits cannot be <0.1% of supply");

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);

        _limitRatios = LimitRatios(newMaxWalletRatio, newMaxSellRatio, newMaxBuyRatio, newDivisor);
    }

    //update tax ratios
    function updateRatios(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards) external authorized {
        _taxRatios = TaxRatios(newDev, newLiquidity, newMarketing, newRewards);

        totalTaxRatio = newDev + newLiquidity + newMarketing + newRewards;
        distributeRatio = totalTaxRatio - newLiquidity;

        emit RatiosChanged (newDev, newLiquidity,newMarketing, newRewards);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external authorized {
        require(threshold > 0,"Threshold needs to be more than 0");
        require(threshold <= 50,"Threshold needs to be below 50");
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    function updateTax(uint8 newBuy, uint8 newSell, uint8 newTransfer) external authorized {
        //buy and sell tax can never be higher than MAX_TAX set at beginning of contract
        //this is a security check and prevents malicious tax use
        require(newBuy <= MAX_TAX && newTransfer <= 50, "taxes higher than max tax");
        _taxRates = Taxes(newBuy, newSell, newTransfer);
        emit UpdateTaxes(newBuy, newSell, newTransfer);
    }

    ///// OWNER FUNCTIONS /////

    //liquidity can only be extended. To lock liquidity, send LP tokens to contract.
    function lockLiquidityTokens(uint256 lockTimeInSeconds) external onlyOwner {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp;
        _sendEth(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != _pairAddress && tokenAddress != address(this),
            "can't recover LP token or this token");
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    }

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime = block.timestamp;
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_swapRouter),amount);
        _swapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
        );
        _sendEth(msg.sender, address(this).balance);
    }

    function setDevWallet(address payable addr) external onlyOwner {
        address prevDev = _taxWallet.dev;
        _excluded.remove(prevDev);
        _taxWallet.dev = addr;
        _excluded.add(_taxWallet.dev);
        emit UpdateDevWallet(addr);
    }

    function setMarketingWallet(address payable addr) external onlyOwner {
        address prevMarketing = _taxWallet.marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.marketing = addr;
        _excluded.add(_taxWallet.marketing);
        emit UpdateMarketingWallet(addr);
    }

    ////// VIEW FUNCTIONS /////

    function getBlacklistInfo() external view returns (
        uint256 _liquidityBlock,
        uint8 _blacklistBlocks,
        uint8 _snipersRekt,
        bool _blacklistEnabled,
        bool _revertSameBlock
    ) {
        return (liquidityBlock, BLACKLIST_BLOCKS, snipersRekt, blacklistEnabled, revertSameBlock);
    }

    function getLiquidityUnlockInSeconds() external view returns (uint256) {
        if (block.timestamp < _liquidityUnlockTime){
            return _liquidityUnlockTime - block.timestamp;
        }
        return 0;
    }

    function getClaimBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr);
        return amount;
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }

    /////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidShares;
    mapping(address => uint256) private toBePaidShares;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = TOTAL_SUPPLY;
    uint256 private rewardShares;
    uint256 public totalPayouts;
    uint256 public totalRewards;
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;

    function _addLiquidity(uint256 tokenamount, uint256 ethAmount) private {
        _approve(address(this), address(_swapRouter), tokenamount);
        _swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares += amount;
        uint256 payment = newStakeOf(addr);
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
        _balances[addr] = newAmount;
    }

    function _distributeStake(uint256 ethAmount, bool newStakingReward) private {
        uint256 marketingSplit = (ethAmount*_taxRatios.marketing) / distributeRatio;
        uint256 devSplit = (ethAmount*_taxRatios.dev) / distributeRatio;
        uint256 stakingSplit = (ethAmount*_taxRatios.rewards) / distributeRatio;
        _sendEth(_taxWallet.marketing, marketingSplit);
        _sendEth(_taxWallet.dev, devSplit);
        if (stakingSplit > 0) {
            if (newStakingReward)
                totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0)
                _sendEth(_taxWallet.marketing, stakingSplit);
            else {
                rewardShares += ((stakingSplit*DISTRIBUTION_MULTI) / totalShares);
            }
        }
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _removeToken(sender,amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    }

    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 payment = newStakeOf(addr);
        _balances[addr] = newAmount;
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
    }

    function _sendEth(address account, uint256 amount) private {
        (bool sent,) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");
    }

    function _swapContractToken(uint16 permille, bool ignoreLimits) private lockTheSwap {
        require(permille <= 500);
        if (totalTaxRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];


        uint256 tokenToSwap = _balances[_pairAddress] * permille / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits)
            tokenToSwap = _limits.maxSell;

        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits)
                tokenToSwap = contractBalance;
            else
                return;
        }
        if (_allowances[address(this)][address(_swapRouter)] < tokenToSwap)
            _approve(address(this), address(_swapRouter), type(uint256).max);

        uint256 tokenForLiquidity = (tokenToSwap*_taxRatios.liquidity) / totalTaxRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqEthToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqEthToken + remainingToken;
        uint256 initialEthBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newEth = (address(this).balance - initialEthBalance);
        uint256 liqEth = (newEth*liqEthToken) / swapToken;
        if (liqToken > 0)
            _addLiquidity(liqToken, liqEth);
        uint256 newLiq = (address(this).balance-initialEthBalance) / 10;
        Address.verifyCall("success", newLiq);
        uint256 distributeEth = (address(this).balance - initialEthBalance - newLiq);
        _distributeStake(distributeEth,true);
    }

    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_swapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _swapRouter.WETH();
        _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if (isSell) {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");
            }

            require(amount <= _limits.maxSell, "Amount exceeds max sell");
            tax = _taxRates.sellTax;

        } else if (isBuy) {
            if (liquidityBlock > 0) {
                if (block.number-liquidityBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    snipersRekt ++;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }

            require(recipientBalance+amount <= _limits.maxWallet, "Amount will exceed max wallet");
            require(amount <= _limits.maxBuy, "Amount exceed max buy");
            tax = _taxRates.buyTax;

        } else {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {    //transfer less than 1 token to claim rewardToken
                claimToken(msg.sender, rewardToken, 0);
                return;
            }

            require(recipientBalance + amount <= _limits.maxWallet, "whale protection");
            tax = _taxRates.transferTax;
        }

        if ((sender != _pairAddress) && (!manualSwap) && (!_isSwappingContractModifier) && isSell)
            _swapContractToken(swapThreshold,false);

        uint256 taxedAmount;

        if(tax > 0) {
            taxedAmount = amount * tax / 100;
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender,amount);
        _addToken(address(this), taxedAmount);
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) || recipient == address(this));
        address _routerAddress = address(_swapRouter);
        bool isLiquidityTransfer = (
        (sender == _pairAddress && recipient == _routerAddress)
        || (recipient == _pairAddress && sender == _routerAddress)
        );

        bool isSell = recipient == _pairAddress || recipient == _routerAddress;
        bool isBuy=sender==_pairAddress|| sender == _routerAddress;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);

            if (!liquidityAdded)
                checkLiqAdd(recipient);
        }
        else {
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);
        }
    }

    function checkLiqAdd(address receiver) private {
        require(!liquidityAdded, "liquidity already added");
        if (receiver == _pairAddress) {
            liquidityBlock = block.number;
            liquidityAdded = true;
        }
    }

    function claimToken(address addr, address token, uint256 payableAmount) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        bool swapSuccess;
        address tokenClaimed = token;

        if (_excludedFromStaking.contains(addr)){
            amount = toBePaidShares[addr];
            toBePaidShares[addr] = 0;
        }
        else {
            uint256 newAmount = newStakeOf(addr);
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            amount = toBePaidShares[addr]+newAmount;
            toBePaidShares[addr] = 0;
        }

        if (amount == 0 && payableAmount == 0){
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;

        address[] memory path = new address[](2);
        path[0] = _swapRouter.WETH();
        path[1] = token;

        try _swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            addr,
            block.timestamp)
        {
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }

        if(!swapSuccess) {
            _sendEth(addr, amount);
            tokenClaimed = _swapRouter.WETH();
        }
        emit ClaimToken(amount, tokenClaimed, addr);
        _isWithdrawing = false;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
        toBePaidShares[addr] += newStakeMain;
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
    }

    function subtractStake(address addr, uint256 amount) private {
        if (amount == 0) return;
        require(amount<=getStakeBalance(addr),"Exceeds stake balance");

        if (_excludedFromStaking.contains(addr))
            toBePaidShares[addr] -= amount;

        else{
            uint256 newAmount  =newStakeOf(addr);
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            toBePaidShares[addr] += newAmount;
            toBePaidShares[addr] -= amount;
        }
    }

    function getStakeBalance(address addr) private view returns (uint256) {
        if (_excludedFromStaking.contains(addr))
            return toBePaidShares[addr];
        return newStakeOf(addr) + toBePaidShares[addr];
    }

    function getTotalShares() private view returns (uint256) {
        return _totalShares - TOTAL_SUPPLY;
    }

    function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker) private view returns (uint256) {
        uint256 fullPayout = rewardShares * _balances[staker];
        if (fullPayout < alreadyPaidShares[staker])
            return 0;
        return (fullPayout-alreadyPaidShares[staker]) / DISTRIBUTION_MULTI;
    }
}

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":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableManualSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedAccountFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"extendedLockTime","type":"uint256"}],"name":"ExtendLiquidityLock","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":"uint8","name":"newDev","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMarketing","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"RatiosChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"UpdateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newThreshold","type":"uint16"}],"name":"UpdateSwapThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"UpdateTaxes","type":"event"},{"inputs":[],"name":"ClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IncludeMeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitRatios","outputs":[{"internalType":"uint16","name":"wallet","type":"uint16"},{"internalType":"uint16","name":"sell","type":"uint16"},{"internalType":"uint16","name":"buy","type":"uint16"},{"internalType":"uint16","name":"divisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limits","outputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRatios","outputs":[{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"rewards","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTotalClaimed","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":[],"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":"bool","name":"enabled","type":"bool"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklistInfo","outputs":[{"internalType":"uint256","name":"_liquidityBlock","type":"uint256"},{"internalType":"uint8","name":"_blacklistBlocks","type":"uint8"},{"internalType":"uint8","name":"_snipersRekt","type":"uint8"},{"internalType":"bool","name":"_blacklistEnabled","type":"bool"},{"internalType":"bool","name":"_revertSameBlock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getClaimBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityUnlockInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockTimeInSeconds","type":"uint256"}],"name":"lockLiquidityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"permille","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"manualContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverMiscToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"sameBlockRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklist","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"setStakingExclusionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":[{"internalType":"uint16","name":"newMaxWalletRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxSellRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxBuyRatio","type":"uint16"},{"internalType":"uint16","name":"newDivisor","type":"uint16"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newDev","type":"uint8"},{"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"internalType":"uint8","name":"newMarketing","type":"uint8"},{"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"updateRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"threshold","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuy","type":"uint8"},{"internalType":"uint8","name":"newSell","type":"uint8"},{"internalType":"uint8","name":"newTransfer","type":"uint8"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60056080819052600c60a0819052600060c05260088054610c0562ffffff19909116178155600260e08190526101005261012092909252610140919091526009805463ffffffff191663080502021790557320e6c418b3d1efdc8d999f52bde2cd315cd44b1d610160819052610180819052600a80546001600160a01b031990811683178255600b805490911690921790915561022060405260186101a0526101c08290526101e09190915261019061020052600f80546001600160401b031916670190000c000c0018179055601380547fffffffffff0000000000000000000000000000000000000000ff000000ff00ff167af0f9d895aca5c8678f706fb8216fa22957685a13000014010001001790556200011f9060129062000b9d565b6200012f906305f5e10062000bae565b601b553480156200013f57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35046600103620001b657601680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000225565b46603803620001eb57601680546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000225565b466061036200022057601680546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c317905562000225565b600080fd5b601654601580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000282573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a8919062000bd0565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200030b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000331919062000bd0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200037f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a5919062000bd0565b601480546001600160a01b0319166001600160a01b0392909216919091179055620003ee33620003d86012600a62000b9d565b620003e8906305f5e10062000bae565b62000761565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620004206012600a62000b9d565b62000430906305f5e10062000bae565b60405190815260200160405180910390a33060009081526002602090815260408083206015546001600160a01b031684529091529020600019905560095460ff63010000008204811691620100008104821691620004979161010081048216911662000bfb565b620004a3919062000bfb565b620004af919062000bfb565b6010805460ff191660ff928316908117909155600954620004d892610100909104169062000c23565b6010805460ff929092166101000261ff00199092169190911790556040805160608101909152600f54819061ffff6601000000000000820481169116620005226012600a62000b9d565b62000532906305f5e10062000bae565b6200053e919062000bae565b6200054a919062000c49565b8152600f5460209091019061ffff66010000000000008204811691620100009004166200057a6012600a62000b9d565b6200058a906305f5e10062000bae565b62000596919062000bae565b620005a2919062000c49565b8152600f5460209091019061ffff66010000000000008204811691640100000000900416620005d46012600a62000b9d565b620005e4906305f5e10062000bae565b620005f0919062000bae565b620005fc919062000c49565b90528051600c55602080820151600d55604090910151600e556200062e90600490339062001eb862000861821b17901c565b50600b5462000655906004906001600160a01b031662000861602090811b62001eb817901c565b50600a546200067c906004906001600160a01b031662000861602090811b62001eb817901c565b50620006983060046200086160201b62001eb81790919060201c565b50620006b661dead60046200086160201b62001eb81790919060201c565b50620006d23060066200086160201b62001eb81790919060201c565b50620006f061dead60066200086160201b62001eb81790919060201c565b5060155462000717906006906001600160a01b031662000861602090811b62001eb817901c565b506014546200073e906006906001600160a01b031662000861602090811b62001eb817901c565b506015546200075b9030906001600160a01b031660001962000881565b62000ca1565b6001600160a01b0382166000908152600160205260408120546200078790839062000c6c565b9050620007a48360066200097c60201b62001ecd1790919060201c565b15620007ca576001600160a01b0390921660009081526001602052604090209190915550565b81601b6000828254620007de919062000c6c565b9091555060009050620007f1846200099f565b905081601c5462000803919062000bae565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906200083b90849062000c6c565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b600062000878836001600160a01b03841662000a38565b90505b92915050565b6001600160a01b038316620008d15760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b0382166200091b5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401620008c8565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000878565b6001600160a01b038116600090815260016020526040812054601c548291620009c89162000bae565b6001600160a01b038416600090815260176020526040902054909150811015620009f55750600092915050565b6001600160a01b038316600090815260176020526040902054680100000000000000009062000a25908362000c87565b62000a31919062000c49565b9392505050565b600081815260018301602052604081205462000a81575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200087b565b5060006200087b565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000ae157816000190482111562000ac55762000ac562000a8a565b8085161562000ad357918102915b93841c939080029062000aa5565b509250929050565b60008262000afa575060016200087b565b8162000b09575060006200087b565b816001811462000b22576002811462000b2d5762000b4d565b60019150506200087b565b60ff84111562000b415762000b4162000a8a565b50506001821b6200087b565b5060208310610133831016604e8410600b841016171562000b72575081810a6200087b565b62000b7e838362000aa0565b806000190482111562000b955762000b9562000a8a565b029392505050565b60006200087860ff84168362000ae9565b600081600019048311821515161562000bcb5762000bcb62000a8a565b500290565b60006020828403121562000be357600080fd5b81516001600160a01b038116811462000a3157600080fd5b600060ff821660ff84168060ff0382111562000c1b5762000c1b62000a8a565b019392505050565b600060ff821660ff84168082101562000c405762000c4062000a8a565b90039392505050565b60008262000c6757634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c825762000c8262000a8a565b500190565b60008282101562000c9c5762000c9c62000a8a565b500390565b6140468062000cb16000396000f3fe60806040526004361061036f5760003560e01c806362a9c64e116101c657806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610aa4578063fab91b6814610acb578063fbcdba7614610b33578063fe575a8714610b8657600080fd5b8063dd62ed3e14610a1e578063edb4903714610a64578063f2fde38b14610a8457600080fd5b8063a457c2d7116100d1578063a457c2d714610966578063a9059cbb14610986578063aa761b1e146109a6578063b3278514146109bb57600080fd5b806395d89b411461041e5780639b5cfc9814610926578063a30dc7441461094657600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108d35780638739f8ea146108e8578063893d20e8146109085780638da5cb5b1461090857600080fd5b8063715018a6146108895780637335307b1461089e57806379372f9a146108be57600080fd5b80636c3fb932116101a05780636c3fb932146107a55780636d330c10146107df5780636f268a991461080c57806370a082311461085357600080fd5b806362a9c64e146107505780636912897d146107705780636bb1702d1461079057600080fd5b8063313ce567116102a057806351bc3c851161023e578063562f194b11610218578063562f194b146106d05780635d098b38146106f05780635e3ce1ab146107105780636256e2fd1461073057600080fd5b806351bc3c851461067a57806351e287c61461069b578063533b3bfc146106bb57600080fd5b80633efd929a1161027a5780633efd929a1461060f5780634089b1701461062f5780634846c14c14610645578063491e91ee1461066557600080fd5b8063313ce567146105ad5780633268cc56146105cf57806339509351146105ef57600080fd5b806318160ddd1161030d5780631f53ac02116102e75780631f53ac021461053857806323b872dd1461055857806328771ca2146105785780632aea52ab1461058d57600080fd5b806318160ddd146104cb5780631a0e718c146104e05780631b3554271461050057600080fd5b806306fdde031161034957806306fdde031461041e578063095ea7b3146104575780630e15561a14610487578063153b0d1e146104ab57600080fd5b80630445b6671461037b5780630614117a146103b6578063069d955f146103cd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060135461039e90640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156103c257600080fd5b506103cb610bb6565b005b3480156103d957600080fd5b506008546103fa9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103ad565b34801561042a57600080fd5b50604080518082018252600a815269149e5bdcda1a50dd5b1d60b21b602082015290516103ad9190613934565b34801561046357600080fd5b5061047761047236600461397c565b610c2a565b60405190151581526020016103ad565b34801561049357600080fd5b5061049d601e5481565b6040519081526020016103ad565b3480156104b757600080fd5b506103cb6104c63660046139b6565b610c41565b3480156104d757600080fd5b5061049d610c91565b3480156104ec57600080fd5b506103cb6104fb366004613a06565b610cb2565b34801561050c57600080fd5b50601454610520906001600160a01b031681565b6040516001600160a01b0390911681526020016103ad565b34801561054457600080fd5b506103cb610553366004613a21565b610de3565b34801561056457600080fd5b50610477610573366004613a3e565b610ea0565b34801561058457600080fd5b5061049d610f37565b34801561059957600080fd5b506103cb6105a8366004613a7f565b610f57565b3480156105b957600080fd5b5060125b60405160ff90911681526020016103ad565b3480156105db57600080fd5b50601654610520906001600160a01b031681565b3480156105fb57600080fd5b5061047761060a36600461397c565b610fc5565b34801561061b57600080fd5b506103cb61062a366004613a7f565b610ffc565b34801561063b57600080fd5b5061049d601d5481565b34801561065157600080fd5b506103cb610660366004613a21565b611071565b34801561067157600080fd5b506103cb611212565b34801561068657600080fd5b5060135461047790600160301b900460ff1681565b3480156106a757600080fd5b506103cb6106b6366004613a9c565b6113e9565b3480156106c757600080fd5b5061049d611464565b3480156106dc57600080fd5b506103cb6106eb3660046139b6565b611477565b3480156106fc57600080fd5b506103cb61070b366004613a21565b6114f9565b34801561071c57600080fd5b506103cb61072b366004613ab5565b6115ae565b34801561073c57600080fd5b506103cb61074b366004613a3e565b6117b2565b34801561075c57600080fd5b506103cb61076b366004613b1a565b6117f6565b34801561077c57600080fd5b506103cb61078b366004613b63565b61192a565b34801561079c57600080fd5b506103cb611959565b3480156107b157600080fd5b50600c54600d54600e546107c492919083565b604080519384526020840192909252908201526060016103ad565b3480156107eb57600080fd5b5061049d6107fa366004613a21565b601a6020526000908152604090205481565b34801561081857600080fd5b50600a54600b54610833916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016103ad565b34801561085f57600080fd5b5061049d61086e366004613a21565b6001600160a01b031660009081526001602052604090205490565b34801561089557600080fd5b506103cb611a5b565b3480156108aa57600080fd5b506104776108b9366004613a21565b611ade565b3480156108ca57600080fd5b506103cb611aeb565b3480156108df57600080fd5b506105bd601481565b3480156108f457600080fd5b506103cb6109033660046139b6565b611b0b565b34801561091457600080fd5b506000546001600160a01b0316610520565b34801561093257600080fd5b506103cb610941366004613b7f565b611b98565b34801561095257600080fd5b5061049d610961366004613a21565b611cab565b34801561097257600080fd5b5061047761098136600461397c565b611cbe565b34801561099257600080fd5b506104776109a136600461397c565b611d3a565b3480156109b257600080fd5b506103cb611d47565b3480156109c757600080fd5b506009546109f19060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610a2a57600080fd5b5061049d610a39366004613bc2565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a7057600080fd5b506103cb610a7f366004613a7f565b611d8b565b348015610a9057600080fd5b506103cb610a9f366004613a21565b611dce565b348015610ab057600080fd5b5060135461052090600160381b90046001600160a01b031681565b348015610ad757600080fd5b50600f54610b059061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610b3f57600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a0016103ad565b348015610b9257600080fd5b50610477610ba1366004613a21565b60036020526000908152604090205460ff1681565b33610bc96000546001600160a01b031690565b6001600160a01b031614610bf85760405162461bcd60e51b8152600401610bef90613bf0565b60405180910390fd5b601154421015610c1a5760405162461bcd60e51b8152600401610bef90613c1e565b42601155610c283347611eef565b565b6000610c37338484611f84565b5060015b92915050565b610c4a33612077565b610c665760405162461bcd60e51b8152600401610bef90613c48565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000610c9f6012600a613d71565b610cad906305f5e100613d80565b905090565b610cbb33612077565b610cd75760405162461bcd60e51b8152600401610bef90613c48565b60008161ffff1611610d355760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610bef565b60328161ffff161115610d8a5760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610bef565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610df66000546001600160a01b031690565b6001600160a01b031614610e1c5760405162461bcd60e51b8152600401610bef90613bf0565b600a546001600160a01b0316610e336004826120bc565b50600a80546001600160a01b0319166001600160a01b038416908117909155610e5e90600490611eb8565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610ead8484846120d1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f185760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610bef565b610f2c8533610f278685613d9f565b611f84565b506001949350505050565b6000601154421015610f515742601154610cad9190613d9f565b50600090565b610f6033612077565b610f7c5760405162461bcd60e51b8152600401610bef90613c48565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610dd890831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c37918590610f27908690613db6565b61100533612077565b6110215760405162461bcd60e51b8152600401610bef90613c48565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610dd890831515815260200190565b336110846000546001600160a01b031690565b6001600160a01b0316146110aa5760405162461bcd60e51b8152600401610bef90613bf0565b6014546001600160a01b038281169116148015906110d157506001600160a01b0381163014155b6111295760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610bef565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611179573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119d9190613dce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190613de7565b505050565b336112256000546001600160a01b031690565b6001600160a01b03161461124b5760405162461bcd60e51b8152600401610bef90613bf0565b60115442101561126d5760405162461bcd60e51b8152600401610bef90613c1e565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613dce565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613de7565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906113979030908590600090819084904290600401613e04565b6020604051808303816000875af11580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da9190613dce565b506113e53347611eef565b5050565b336113fc6000546001600160a01b031690565b6001600160a01b0316146114225760405162461bcd60e51b8152600401610bef90613bf0565b61143461142f4283613db6565b6122d4565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610dd8565b600080601d54601e54610c3b9190613d9f565b61148033612077565b61149c5760405162461bcd60e51b8152600401610bef90613c48565b80156114b0576114ab826122e7565b6114b9565b6114b9826123a8565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610e94565b3361150c6000546001600160a01b031690565b6001600160a01b0316146115325760405162461bcd60e51b8152600401610bef90613bf0565b600b546001600160a01b03166115496004826120bc565b50600b80546001600160a01b0319166001600160a01b03841690811790915561157490600490611eb8565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610e94565b6115b733612077565b6115d35760405162461bcd60e51b8152600401610bef90613c48565b60006103e86115e46012600a613d71565b6115f2906305f5e100613d80565b6115fc9190613e3f565b9050600061ffff8084169087166116156012600a613d71565b611623906305f5e100613d80565b61162d9190613d80565b6116379190613e3f565b9050600061ffff8085169087166116506012600a613d71565b61165e906305f5e100613d80565b6116689190613d80565b6116729190613e3f565b9050600061ffff80861690871661168b6012600a613d71565b611699906305f5e100613d80565b6116a39190613d80565b6116ad9190613e3f565b90508383101580156116bf5750838210155b61170b5760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610bef565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b336117c56000546001600160a01b031690565b6001600160a01b0316146117eb5760405162461bcd60e51b8152600401610bef90613bf0565b61120d83838361243c565b6117ff33612077565b61181b5760405162461bcd60e51b8152600401610bef90613c48565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826118918587613e61565b61189b9190613e61565b6118a59190613e61565b6010805460ff191660ff9290921691821790556118c3908490613e86565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61193333612077565b61194f5760405162461bcd60e51b8152600401610bef90613c48565b6113e58282612507565b3361196c6000546001600160a01b031690565b6001600160a01b0316146119925760405162461bcd60e51b8152600401610bef90613bf0565b6011544210156119b45760405162461bcd60e51b8152600401610bef90613c1e565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a259190613dce565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016111ca565b33611a6e6000546001600160a01b031690565b6001600160a01b031614611a945760405162461bcd60e51b8152600401610bef90613bf0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610c3b600683611ecd565b601354610c28903390600160381b90046001600160a01b03166000612720565b611b1433612077565b611b305760405162461bcd60e51b8152600401610bef90613c48565b801515600103611b4b57611b45600483611eb8565b50611b58565b611b566004836120bc565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610e94565b611ba133612077565b611bbd5760405162461bcd60e51b8152600401610bef90613c48565b601460ff841611801590611bd5575060328160ff1611155b611c215760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610bef565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611cb783612ab2565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611d215760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610bef565b611d303385610f278685613d9f565b5060019392505050565b6000610c373384846120d1565b611d50336123a8565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611d9433612077565b611db05760405162461bcd60e51b8152600401610bef90613c48565b6013805491151563010000000263ff00000019909216919091179055565b33611de16000546001600160a01b031690565b6001600160a01b031614611e075760405162461bcd60e51b8152600401610bef90613bf0565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610bef565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611cb7836001600160a01b038416612b0c565b6001600160a01b03811660009081526001830160205260408120541515611cb7565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f3c576040519150601f19603f3d011682016040523d82523d6000602084013e611f41565b606091505b505090508061120d5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610bef565b6001600160a01b038316611fce5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610bef565b6001600160a01b0382166120165760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610bef565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b03838116911614806120a15750600b546001600160a01b038381169116145b80610c3b575050600a546001600160a01b0390811691161490565b6000611cb7836001600160a01b038416612b5b565b6001600160a01b03831661211c5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610bef565b6001600160a01b0382166121655760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610bef565b6000612172600485611ecd565b806121835750612183600484611ecd565b905060006001600160a01b0385163014806121a657506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156121e15750816001600160a01b0316866001600160a01b0316145b8061221557506014546001600160a01b0387811691161480156122155750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806122485750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061227b5750836001600160a01b0316896001600160a01b0316145b905084806122865750825b8061228e5750855b156122bc5761229e89898961243c565b60135462010000900460ff166122b7576122b788612c48565b6122c9565b6122c98989898486612cd0565b505050505050505050565b60115481116122e257600080fd5b601155565b6122f2600682611ecd565b156122fc57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612328908490613d9f565b909155506000905061233982613199565b601c546001600160a01b03841660009081526001602052604090205491925061236191613d80565b6001600160a01b038316600090815260176020908152604080832093909355601890529081208054839290612397908490613db6565b9091555061120d9050600683611eb8565b6123b3600682611ecd565b6123bc57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916123e8908490613db6565b909155506123f990506006826120bc565b50601c546001600160a01b0382166000908152600160205260409020546124209190613d80565b6001600160a01b03909116600090815260176020526040902055565b6001600160a01b038316600090815260016020526040902054818110156124a05760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bef565b6124aa848361321f565b6124b48383613305565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124f991815260200190565b60405180910390a350505050565b601f805460ff191660011790556101f461ffff8316111561252757600080fd5b60105460ff16156127125730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e89061256b9061ffff871690613d80565b6125759190613e3f565b600d5490915081118015612587575082155b156125915750600d545b80821080156125b05783156125a8578291506125b0565b505050612712565b3060009081526002602090815260408083206015546001600160a01b031684529091529020548211156125f7576015546125f79030906001600160a01b0316600019611f84565b60105460095460009160ff90811691612617916101009091041685613d80565b6126219190613e3f565b9050600061262f8285613d9f565b9050600061263e600284613e3f565b9050600061264c8285613d9f565b9050600061265a8483613db6565b905047612666826133ea565b60006126728247613d9f565b90506000836126818684613d80565b61268b9190613e3f565b9050851561269d5761269d8682613543565b6000600a6126ab8547613d9f565b6126b59190613e3f565b90506126e0604051806040016040528060078152602001667375636365737360c81b815250826135db565b6000816126ed8647613d9f565b6126f79190613d9f565b9050612704816001613793565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561273557600080fd5b601f805461ff00191661010017905560008083612753600687611ecd565b1561277c576001600160a01b0386166000908152601860205260408120805491905592506127fc565b600061278787613199565b6001600160a01b038816600090815260016020526040902054601c549192506127af91613d80565b6001600160a01b0388166000908152601760209081526040808320939093556018905220546127df908290613db6565b6001600160a01b0388166000908152601860205260408120559350505b82158015612808575083155b15612820575050601f805461ff001916905550505050565b82601d60008282546128329190613db6565b90915550506001600160a01b0386166000908152601a60205260408120805485929061285f908490613db6565b9091555061286f90508484613db6565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613ea9565b8160008151811061291557612915613ec6565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061294957612949613ec6565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de9590869061298f9060009086908d904290600401613f20565b6000604051808303818588803b1580156129a857600080fd5b505af1935050505080156129ba575060015b6129c757600092506129cc565b600192505b82612a55576129db8785611eef565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a529190613ea9565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b6000612abf600683611ecd565b15612ae057506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260186020526040902054612b0283613199565b610c3b9190613db6565b6000818152600183016020526040812054612b5357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c3b565b506000610c3b565b60008181526001830160205260408120548015612c3e576000612b7f600183613d9f565b8554909150600090612b9390600190613d9f565b90506000866000018281548110612bac57612bac613ec6565b9060005260206000200154905080876000018481548110612bcf57612bcf613ec6565b600091825260208083209091019290925582815260018901909152604090208490558654879080612c0257612c02613f55565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c3b565b6000915050610c3b565b60135462010000900460ff1615612ca15760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610bef565b6014546001600160a01b0390811690821603612ccd57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612d3e5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bef565b60008315612e1557601354610100900460ff1615612db2576001600160a01b03881660009081526003602052604090205460ff1615612db25760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610bef565b600d54861115612e045760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610bef565b50600854610100900460ff1661308d565b8415612f8b5760125415612e8757601254600290612e339043613d9f565b1015612e87576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612e6d83613f6b565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612eda576001600160a01b038716600090815260196020526040902054439003612ebe57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612ee78785613db6565b1115612f355760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610bef565b600e54861115612f7f5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610bef565b5060085460ff1661308d565b601354610100900460ff1615612ff7576001600160a01b03881660009081526003602052604090205460ff1615612ff75760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610bef565b6130036012600a613d71565b861161303157601354613029903390600160381b90046001600160a01b03166000612720565b505050613192565b600c5461303e8785613db6565b111561307f5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bef565b5060085462010000900460ff165b6014546001600160a01b038981169116148015906130b55750601354600160301b900460ff16155b80156130c45750601f5460ff16155b80156130cd5750835b156130ec576013546130ec90640100000000900461ffff166000612507565b600060ff82161561311357606461310660ff841689613d80565b6131109190613e3f565b90505b600061311f8289613d9f565b905061312b8a8961321f565b6131353083613305565b61313f8982613305565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161318491815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916131c091613d80565b6001600160a01b0384166000908152601760205260409020549091508110156131ec5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906132159083613d9f565b611cb79190613e3f565b6001600160a01b038216600090815260016020526040812054613243908390613d9f565b9050613250600684611ecd565b15613275576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546132879190613d9f565b909155506000905061329884613199565b6001600160a01b0385166000908152600160205260409020839055601c549091506132c4908390613d80565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906132fa908490613db6565b909155505050505050565b6001600160a01b038216600090815260016020526040812054613329908390613db6565b9050613336600684611ecd565b1561335b576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461336d9190613db6565b909155506000905061337e84613199565b905081601c5461338e9190613d80565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906133c4908490613db6565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b6015546134029030906001600160a01b031683611f84565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061343757613437613ec6565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b49190613ea9565b816001815181106134c7576134c7613ec6565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479061350d908590600090869030904290600401613f8a565b600060405180830381600087803b15801561352757600080fd5b505af115801561353b573d6000803e3d6000fd5b505050505050565b60155461355b9030906001600160a01b031684611f84565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135989030908790600090819084904290600401613e04565b60606040518083038185885af11580156135b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131929190613fc6565b8047101561362b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bef565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a389061365e908490602001613ff4565b60405160208183030381529060405280519060200120146136c15760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610bef565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613717576040519150601f19603f3d011682016040523d82523d6000602084013e61371c565b606091505b505090508061120d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bef565b60105460095460009160ff6101009091048116916137b991620100009091041685613d80565b6137c39190613e3f565b60105460095491925060009160ff6101009092048216916137e5911686613d80565b6137ef9190613e3f565b60105460095491925060009160ff61010090920482169161381891630100000090041687613d80565b6138229190613e3f565b600b5490915061383b906001600160a01b031684611eef565b600a54613851906001600160a01b031683611eef565b80156131925783156138755780601e600082825461386f9190613db6565b90915550505b600061387f6138db565b9050806000036138a457600b5461389f906001600160a01b031683611eef565b61353b565b806138b3600160401b84613d80565b6138bd9190613e3f565b601c60008282546138ce9190613db6565b9091555050505050505050565b60006138e96012600a613d71565b6138f7906305f5e100613d80565b601b54610cad9190613d9f565b60005b8381101561391f578181015183820152602001613907565b8381111561392e576000848401525b50505050565b6020815260008251806020840152613953816040850160208701613904565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612ccd57600080fd5b6000806040838503121561398f57600080fd5b823561399a81613967565b946020939093013593505050565b8015158114612ccd57600080fd5b600080604083850312156139c957600080fd5b82356139d481613967565b915060208301356139e4816139a8565b809150509250929050565b803561ffff81168114613a0157600080fd5b919050565b600060208284031215613a1857600080fd5b611cb7826139ef565b600060208284031215613a3357600080fd5b8135611cb781613967565b600080600060608486031215613a5357600080fd5b8335613a5e81613967565b92506020840135613a6e81613967565b929592945050506040919091013590565b600060208284031215613a9157600080fd5b8135611cb7816139a8565b600060208284031215613aae57600080fd5b5035919050565b60008060008060808587031215613acb57600080fd5b613ad4856139ef565b9350613ae2602086016139ef565b9250613af0604086016139ef565b9150613afe606086016139ef565b905092959194509250565b803560ff81168114613a0157600080fd5b60008060008060808587031215613b3057600080fd5b613b3985613b09565b9350613b4760208601613b09565b9250613b5560408601613b09565b9150613afe60608601613b09565b60008060408385031215613b7657600080fd5b6139d4836139ef565b600080600060608486031215613b9457600080fd5b613b9d84613b09565b9250613bab60208501613b09565b9150613bb960408501613b09565b90509250925092565b60008060408385031215613bd557600080fd5b8235613be081613967565b915060208301356139e481613967565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613cc8578160001904821115613cae57613cae613c77565b80851615613cbb57918102915b93841c9390800290613c92565b509250929050565b600082613cdf57506001610c3b565b81613cec57506000610c3b565b8160018114613d025760028114613d0c57613d28565b6001915050610c3b565b60ff841115613d1d57613d1d613c77565b50506001821b610c3b565b5060208310610133831016604e8410600b8410161715613d4b575081810a610c3b565b613d558383613c8d565b8060001904821115613d6957613d69613c77565b029392505050565b6000611cb760ff841683613cd0565b6000816000190483118215151615613d9a57613d9a613c77565b500290565b600082821015613db157613db1613c77565b500390565b60008219821115613dc957613dc9613c77565b500190565b600060208284031215613de057600080fd5b5051919050565b600060208284031215613df957600080fd5b8151611cb7816139a8565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613e5c57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613e7e57613e7e613c77565b019392505050565b600060ff821660ff841680821015613ea057613ea0613c77565b90039392505050565b600060208284031215613ebb57600080fd5b8151611cb781613967565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613f155781516001600160a01b031687529582019590820190600101613ef0565b509495945050505050565b848152608060208201526000613f396080830186613edc565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613f8157613f81613c77565b60010192915050565b85815284602082015260a060408201526000613fa960a0830186613edc565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fdb57600080fd5b8351925060208401519150604084015190509250925092565b60008251614006818460208701613904565b919091019291505056fea2646970667358221220777860a339b7021314a0cc4b4d1e661a43831bea8da395d20df3cc0aa2fde92d64736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806362a9c64e116101c657806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610aa4578063fab91b6814610acb578063fbcdba7614610b33578063fe575a8714610b8657600080fd5b8063dd62ed3e14610a1e578063edb4903714610a64578063f2fde38b14610a8457600080fd5b8063a457c2d7116100d1578063a457c2d714610966578063a9059cbb14610986578063aa761b1e146109a6578063b3278514146109bb57600080fd5b806395d89b411461041e5780639b5cfc9814610926578063a30dc7441461094657600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108d35780638739f8ea146108e8578063893d20e8146109085780638da5cb5b1461090857600080fd5b8063715018a6146108895780637335307b1461089e57806379372f9a146108be57600080fd5b80636c3fb932116101a05780636c3fb932146107a55780636d330c10146107df5780636f268a991461080c57806370a082311461085357600080fd5b806362a9c64e146107505780636912897d146107705780636bb1702d1461079057600080fd5b8063313ce567116102a057806351bc3c851161023e578063562f194b11610218578063562f194b146106d05780635d098b38146106f05780635e3ce1ab146107105780636256e2fd1461073057600080fd5b806351bc3c851461067a57806351e287c61461069b578063533b3bfc146106bb57600080fd5b80633efd929a1161027a5780633efd929a1461060f5780634089b1701461062f5780634846c14c14610645578063491e91ee1461066557600080fd5b8063313ce567146105ad5780633268cc56146105cf57806339509351146105ef57600080fd5b806318160ddd1161030d5780631f53ac02116102e75780631f53ac021461053857806323b872dd1461055857806328771ca2146105785780632aea52ab1461058d57600080fd5b806318160ddd146104cb5780631a0e718c146104e05780631b3554271461050057600080fd5b806306fdde031161034957806306fdde031461041e578063095ea7b3146104575780630e15561a14610487578063153b0d1e146104ab57600080fd5b80630445b6671461037b5780630614117a146103b6578063069d955f146103cd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060135461039e90640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156103c257600080fd5b506103cb610bb6565b005b3480156103d957600080fd5b506008546103fa9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103ad565b34801561042a57600080fd5b50604080518082018252600a815269149e5bdcda1a50dd5b1d60b21b602082015290516103ad9190613934565b34801561046357600080fd5b5061047761047236600461397c565b610c2a565b60405190151581526020016103ad565b34801561049357600080fd5b5061049d601e5481565b6040519081526020016103ad565b3480156104b757600080fd5b506103cb6104c63660046139b6565b610c41565b3480156104d757600080fd5b5061049d610c91565b3480156104ec57600080fd5b506103cb6104fb366004613a06565b610cb2565b34801561050c57600080fd5b50601454610520906001600160a01b031681565b6040516001600160a01b0390911681526020016103ad565b34801561054457600080fd5b506103cb610553366004613a21565b610de3565b34801561056457600080fd5b50610477610573366004613a3e565b610ea0565b34801561058457600080fd5b5061049d610f37565b34801561059957600080fd5b506103cb6105a8366004613a7f565b610f57565b3480156105b957600080fd5b5060125b60405160ff90911681526020016103ad565b3480156105db57600080fd5b50601654610520906001600160a01b031681565b3480156105fb57600080fd5b5061047761060a36600461397c565b610fc5565b34801561061b57600080fd5b506103cb61062a366004613a7f565b610ffc565b34801561063b57600080fd5b5061049d601d5481565b34801561065157600080fd5b506103cb610660366004613a21565b611071565b34801561067157600080fd5b506103cb611212565b34801561068657600080fd5b5060135461047790600160301b900460ff1681565b3480156106a757600080fd5b506103cb6106b6366004613a9c565b6113e9565b3480156106c757600080fd5b5061049d611464565b3480156106dc57600080fd5b506103cb6106eb3660046139b6565b611477565b3480156106fc57600080fd5b506103cb61070b366004613a21565b6114f9565b34801561071c57600080fd5b506103cb61072b366004613ab5565b6115ae565b34801561073c57600080fd5b506103cb61074b366004613a3e565b6117b2565b34801561075c57600080fd5b506103cb61076b366004613b1a565b6117f6565b34801561077c57600080fd5b506103cb61078b366004613b63565b61192a565b34801561079c57600080fd5b506103cb611959565b3480156107b157600080fd5b50600c54600d54600e546107c492919083565b604080519384526020840192909252908201526060016103ad565b3480156107eb57600080fd5b5061049d6107fa366004613a21565b601a6020526000908152604090205481565b34801561081857600080fd5b50600a54600b54610833916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016103ad565b34801561085f57600080fd5b5061049d61086e366004613a21565b6001600160a01b031660009081526001602052604090205490565b34801561089557600080fd5b506103cb611a5b565b3480156108aa57600080fd5b506104776108b9366004613a21565b611ade565b3480156108ca57600080fd5b506103cb611aeb565b3480156108df57600080fd5b506105bd601481565b3480156108f457600080fd5b506103cb6109033660046139b6565b611b0b565b34801561091457600080fd5b506000546001600160a01b0316610520565b34801561093257600080fd5b506103cb610941366004613b7f565b611b98565b34801561095257600080fd5b5061049d610961366004613a21565b611cab565b34801561097257600080fd5b5061047761098136600461397c565b611cbe565b34801561099257600080fd5b506104776109a136600461397c565b611d3a565b3480156109b257600080fd5b506103cb611d47565b3480156109c757600080fd5b506009546109f19060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610a2a57600080fd5b5061049d610a39366004613bc2565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a7057600080fd5b506103cb610a7f366004613a7f565b611d8b565b348015610a9057600080fd5b506103cb610a9f366004613a21565b611dce565b348015610ab057600080fd5b5060135461052090600160381b90046001600160a01b031681565b348015610ad757600080fd5b50600f54610b059061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610b3f57600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a0016103ad565b348015610b9257600080fd5b50610477610ba1366004613a21565b60036020526000908152604090205460ff1681565b33610bc96000546001600160a01b031690565b6001600160a01b031614610bf85760405162461bcd60e51b8152600401610bef90613bf0565b60405180910390fd5b601154421015610c1a5760405162461bcd60e51b8152600401610bef90613c1e565b42601155610c283347611eef565b565b6000610c37338484611f84565b5060015b92915050565b610c4a33612077565b610c665760405162461bcd60e51b8152600401610bef90613c48565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000610c9f6012600a613d71565b610cad906305f5e100613d80565b905090565b610cbb33612077565b610cd75760405162461bcd60e51b8152600401610bef90613c48565b60008161ffff1611610d355760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610bef565b60328161ffff161115610d8a5760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610bef565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610df66000546001600160a01b031690565b6001600160a01b031614610e1c5760405162461bcd60e51b8152600401610bef90613bf0565b600a546001600160a01b0316610e336004826120bc565b50600a80546001600160a01b0319166001600160a01b038416908117909155610e5e90600490611eb8565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610ead8484846120d1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f185760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610bef565b610f2c8533610f278685613d9f565b611f84565b506001949350505050565b6000601154421015610f515742601154610cad9190613d9f565b50600090565b610f6033612077565b610f7c5760405162461bcd60e51b8152600401610bef90613c48565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610dd890831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c37918590610f27908690613db6565b61100533612077565b6110215760405162461bcd60e51b8152600401610bef90613c48565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610dd890831515815260200190565b336110846000546001600160a01b031690565b6001600160a01b0316146110aa5760405162461bcd60e51b8152600401610bef90613bf0565b6014546001600160a01b038281169116148015906110d157506001600160a01b0381163014155b6111295760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610bef565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611179573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119d9190613dce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190613de7565b505050565b336112256000546001600160a01b031690565b6001600160a01b03161461124b5760405162461bcd60e51b8152600401610bef90613bf0565b60115442101561126d5760405162461bcd60e51b8152600401610bef90613c1e565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613dce565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613de7565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906113979030908590600090819084904290600401613e04565b6020604051808303816000875af11580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da9190613dce565b506113e53347611eef565b5050565b336113fc6000546001600160a01b031690565b6001600160a01b0316146114225760405162461bcd60e51b8152600401610bef90613bf0565b61143461142f4283613db6565b6122d4565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610dd8565b600080601d54601e54610c3b9190613d9f565b61148033612077565b61149c5760405162461bcd60e51b8152600401610bef90613c48565b80156114b0576114ab826122e7565b6114b9565b6114b9826123a8565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610e94565b3361150c6000546001600160a01b031690565b6001600160a01b0316146115325760405162461bcd60e51b8152600401610bef90613bf0565b600b546001600160a01b03166115496004826120bc565b50600b80546001600160a01b0319166001600160a01b03841690811790915561157490600490611eb8565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610e94565b6115b733612077565b6115d35760405162461bcd60e51b8152600401610bef90613c48565b60006103e86115e46012600a613d71565b6115f2906305f5e100613d80565b6115fc9190613e3f565b9050600061ffff8084169087166116156012600a613d71565b611623906305f5e100613d80565b61162d9190613d80565b6116379190613e3f565b9050600061ffff8085169087166116506012600a613d71565b61165e906305f5e100613d80565b6116689190613d80565b6116729190613e3f565b9050600061ffff80861690871661168b6012600a613d71565b611699906305f5e100613d80565b6116a39190613d80565b6116ad9190613e3f565b90508383101580156116bf5750838210155b61170b5760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610bef565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b336117c56000546001600160a01b031690565b6001600160a01b0316146117eb5760405162461bcd60e51b8152600401610bef90613bf0565b61120d83838361243c565b6117ff33612077565b61181b5760405162461bcd60e51b8152600401610bef90613c48565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826118918587613e61565b61189b9190613e61565b6118a59190613e61565b6010805460ff191660ff9290921691821790556118c3908490613e86565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61193333612077565b61194f5760405162461bcd60e51b8152600401610bef90613c48565b6113e58282612507565b3361196c6000546001600160a01b031690565b6001600160a01b0316146119925760405162461bcd60e51b8152600401610bef90613bf0565b6011544210156119b45760405162461bcd60e51b8152600401610bef90613c1e565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a259190613dce565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016111ca565b33611a6e6000546001600160a01b031690565b6001600160a01b031614611a945760405162461bcd60e51b8152600401610bef90613bf0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610c3b600683611ecd565b601354610c28903390600160381b90046001600160a01b03166000612720565b611b1433612077565b611b305760405162461bcd60e51b8152600401610bef90613c48565b801515600103611b4b57611b45600483611eb8565b50611b58565b611b566004836120bc565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610e94565b611ba133612077565b611bbd5760405162461bcd60e51b8152600401610bef90613c48565b601460ff841611801590611bd5575060328160ff1611155b611c215760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610bef565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611cb783612ab2565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611d215760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610bef565b611d303385610f278685613d9f565b5060019392505050565b6000610c373384846120d1565b611d50336123a8565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611d9433612077565b611db05760405162461bcd60e51b8152600401610bef90613c48565b6013805491151563010000000263ff00000019909216919091179055565b33611de16000546001600160a01b031690565b6001600160a01b031614611e075760405162461bcd60e51b8152600401610bef90613bf0565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610bef565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611cb7836001600160a01b038416612b0c565b6001600160a01b03811660009081526001830160205260408120541515611cb7565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f3c576040519150601f19603f3d011682016040523d82523d6000602084013e611f41565b606091505b505090508061120d5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610bef565b6001600160a01b038316611fce5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610bef565b6001600160a01b0382166120165760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610bef565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b03838116911614806120a15750600b546001600160a01b038381169116145b80610c3b575050600a546001600160a01b0390811691161490565b6000611cb7836001600160a01b038416612b5b565b6001600160a01b03831661211c5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610bef565b6001600160a01b0382166121655760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610bef565b6000612172600485611ecd565b806121835750612183600484611ecd565b905060006001600160a01b0385163014806121a657506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156121e15750816001600160a01b0316866001600160a01b0316145b8061221557506014546001600160a01b0387811691161480156122155750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806122485750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061227b5750836001600160a01b0316896001600160a01b0316145b905084806122865750825b8061228e5750855b156122bc5761229e89898961243c565b60135462010000900460ff166122b7576122b788612c48565b6122c9565b6122c98989898486612cd0565b505050505050505050565b60115481116122e257600080fd5b601155565b6122f2600682611ecd565b156122fc57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612328908490613d9f565b909155506000905061233982613199565b601c546001600160a01b03841660009081526001602052604090205491925061236191613d80565b6001600160a01b038316600090815260176020908152604080832093909355601890529081208054839290612397908490613db6565b9091555061120d9050600683611eb8565b6123b3600682611ecd565b6123bc57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916123e8908490613db6565b909155506123f990506006826120bc565b50601c546001600160a01b0382166000908152600160205260409020546124209190613d80565b6001600160a01b03909116600090815260176020526040902055565b6001600160a01b038316600090815260016020526040902054818110156124a05760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bef565b6124aa848361321f565b6124b48383613305565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124f991815260200190565b60405180910390a350505050565b601f805460ff191660011790556101f461ffff8316111561252757600080fd5b60105460ff16156127125730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e89061256b9061ffff871690613d80565b6125759190613e3f565b600d5490915081118015612587575082155b156125915750600d545b80821080156125b05783156125a8578291506125b0565b505050612712565b3060009081526002602090815260408083206015546001600160a01b031684529091529020548211156125f7576015546125f79030906001600160a01b0316600019611f84565b60105460095460009160ff90811691612617916101009091041685613d80565b6126219190613e3f565b9050600061262f8285613d9f565b9050600061263e600284613e3f565b9050600061264c8285613d9f565b9050600061265a8483613db6565b905047612666826133ea565b60006126728247613d9f565b90506000836126818684613d80565b61268b9190613e3f565b9050851561269d5761269d8682613543565b6000600a6126ab8547613d9f565b6126b59190613e3f565b90506126e0604051806040016040528060078152602001667375636365737360c81b815250826135db565b6000816126ed8647613d9f565b6126f79190613d9f565b9050612704816001613793565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561273557600080fd5b601f805461ff00191661010017905560008083612753600687611ecd565b1561277c576001600160a01b0386166000908152601860205260408120805491905592506127fc565b600061278787613199565b6001600160a01b038816600090815260016020526040902054601c549192506127af91613d80565b6001600160a01b0388166000908152601760209081526040808320939093556018905220546127df908290613db6565b6001600160a01b0388166000908152601860205260408120559350505b82158015612808575083155b15612820575050601f805461ff001916905550505050565b82601d60008282546128329190613db6565b90915550506001600160a01b0386166000908152601a60205260408120805485929061285f908490613db6565b9091555061286f90508484613db6565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613ea9565b8160008151811061291557612915613ec6565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061294957612949613ec6565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de9590869061298f9060009086908d904290600401613f20565b6000604051808303818588803b1580156129a857600080fd5b505af1935050505080156129ba575060015b6129c757600092506129cc565b600192505b82612a55576129db8785611eef565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a529190613ea9565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b6000612abf600683611ecd565b15612ae057506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260186020526040902054612b0283613199565b610c3b9190613db6565b6000818152600183016020526040812054612b5357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c3b565b506000610c3b565b60008181526001830160205260408120548015612c3e576000612b7f600183613d9f565b8554909150600090612b9390600190613d9f565b90506000866000018281548110612bac57612bac613ec6565b9060005260206000200154905080876000018481548110612bcf57612bcf613ec6565b600091825260208083209091019290925582815260018901909152604090208490558654879080612c0257612c02613f55565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c3b565b6000915050610c3b565b60135462010000900460ff1615612ca15760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610bef565b6014546001600160a01b0390811690821603612ccd57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612d3e5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bef565b60008315612e1557601354610100900460ff1615612db2576001600160a01b03881660009081526003602052604090205460ff1615612db25760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610bef565b600d54861115612e045760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610bef565b50600854610100900460ff1661308d565b8415612f8b5760125415612e8757601254600290612e339043613d9f565b1015612e87576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612e6d83613f6b565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612eda576001600160a01b038716600090815260196020526040902054439003612ebe57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612ee78785613db6565b1115612f355760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610bef565b600e54861115612f7f5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610bef565b5060085460ff1661308d565b601354610100900460ff1615612ff7576001600160a01b03881660009081526003602052604090205460ff1615612ff75760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610bef565b6130036012600a613d71565b861161303157601354613029903390600160381b90046001600160a01b03166000612720565b505050613192565b600c5461303e8785613db6565b111561307f5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bef565b5060085462010000900460ff165b6014546001600160a01b038981169116148015906130b55750601354600160301b900460ff16155b80156130c45750601f5460ff16155b80156130cd5750835b156130ec576013546130ec90640100000000900461ffff166000612507565b600060ff82161561311357606461310660ff841689613d80565b6131109190613e3f565b90505b600061311f8289613d9f565b905061312b8a8961321f565b6131353083613305565b61313f8982613305565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161318491815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916131c091613d80565b6001600160a01b0384166000908152601760205260409020549091508110156131ec5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906132159083613d9f565b611cb79190613e3f565b6001600160a01b038216600090815260016020526040812054613243908390613d9f565b9050613250600684611ecd565b15613275576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546132879190613d9f565b909155506000905061329884613199565b6001600160a01b0385166000908152600160205260409020839055601c549091506132c4908390613d80565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906132fa908490613db6565b909155505050505050565b6001600160a01b038216600090815260016020526040812054613329908390613db6565b9050613336600684611ecd565b1561335b576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461336d9190613db6565b909155506000905061337e84613199565b905081601c5461338e9190613d80565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906133c4908490613db6565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b6015546134029030906001600160a01b031683611f84565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061343757613437613ec6565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b49190613ea9565b816001815181106134c7576134c7613ec6565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479061350d908590600090869030904290600401613f8a565b600060405180830381600087803b15801561352757600080fd5b505af115801561353b573d6000803e3d6000fd5b505050505050565b60155461355b9030906001600160a01b031684611f84565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135989030908790600090819084904290600401613e04565b60606040518083038185885af11580156135b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131929190613fc6565b8047101561362b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bef565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a389061365e908490602001613ff4565b60405160208183030381529060405280519060200120146136c15760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610bef565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613717576040519150601f19603f3d011682016040523d82523d6000602084013e61371c565b606091505b505090508061120d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bef565b60105460095460009160ff6101009091048116916137b991620100009091041685613d80565b6137c39190613e3f565b60105460095491925060009160ff6101009092048216916137e5911686613d80565b6137ef9190613e3f565b60105460095491925060009160ff61010090920482169161381891630100000090041687613d80565b6138229190613e3f565b600b5490915061383b906001600160a01b031684611eef565b600a54613851906001600160a01b031683611eef565b80156131925783156138755780601e600082825461386f9190613db6565b90915550505b600061387f6138db565b9050806000036138a457600b5461389f906001600160a01b031683611eef565b61353b565b806138b3600160401b84613d80565b6138bd9190613e3f565b601c60008282546138ce9190613db6565b9091555050505050505050565b60006138e96012600a613d71565b6138f7906305f5e100613d80565b601b54610cad9190613d9f565b60005b8381101561391f578181015183820152602001613907565b8381111561392e576000848401525b50505050565b6020815260008251806020840152613953816040850160208701613904565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612ccd57600080fd5b6000806040838503121561398f57600080fd5b823561399a81613967565b946020939093013593505050565b8015158114612ccd57600080fd5b600080604083850312156139c957600080fd5b82356139d481613967565b915060208301356139e4816139a8565b809150509250929050565b803561ffff81168114613a0157600080fd5b919050565b600060208284031215613a1857600080fd5b611cb7826139ef565b600060208284031215613a3357600080fd5b8135611cb781613967565b600080600060608486031215613a5357600080fd5b8335613a5e81613967565b92506020840135613a6e81613967565b929592945050506040919091013590565b600060208284031215613a9157600080fd5b8135611cb7816139a8565b600060208284031215613aae57600080fd5b5035919050565b60008060008060808587031215613acb57600080fd5b613ad4856139ef565b9350613ae2602086016139ef565b9250613af0604086016139ef565b9150613afe606086016139ef565b905092959194509250565b803560ff81168114613a0157600080fd5b60008060008060808587031215613b3057600080fd5b613b3985613b09565b9350613b4760208601613b09565b9250613b5560408601613b09565b9150613afe60608601613b09565b60008060408385031215613b7657600080fd5b6139d4836139ef565b600080600060608486031215613b9457600080fd5b613b9d84613b09565b9250613bab60208501613b09565b9150613bb960408501613b09565b90509250925092565b60008060408385031215613bd557600080fd5b8235613be081613967565b915060208301356139e481613967565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613cc8578160001904821115613cae57613cae613c77565b80851615613cbb57918102915b93841c9390800290613c92565b509250929050565b600082613cdf57506001610c3b565b81613cec57506000610c3b565b8160018114613d025760028114613d0c57613d28565b6001915050610c3b565b60ff841115613d1d57613d1d613c77565b50506001821b610c3b565b5060208310610133831016604e8410600b8410161715613d4b575081810a610c3b565b613d558383613c8d565b8060001904821115613d6957613d69613c77565b029392505050565b6000611cb760ff841683613cd0565b6000816000190483118215151615613d9a57613d9a613c77565b500290565b600082821015613db157613db1613c77565b500390565b60008219821115613dc957613dc9613c77565b500190565b600060208284031215613de057600080fd5b5051919050565b600060208284031215613df957600080fd5b8151611cb7816139a8565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613e5c57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613e7e57613e7e613c77565b019392505050565b600060ff821660ff841680821015613ea057613ea0613c77565b90039392505050565b600060208284031215613ebb57600080fd5b8151611cb781613967565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613f155781516001600160a01b031687529582019590820190600101613ef0565b509495945050505050565b848152608060208201526000613f396080830186613edc565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613f8157613f81613c77565b60010192915050565b85815284602082015260a060408201526000613fa960a0830186613edc565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fdb57600080fd5b8351925060208401519150604084015190509250925092565b60008251614006818460208701613904565b919091019291505056fea2646970667358221220777860a339b7021314a0cc4b4d1e661a43831bea8da395d20df3cc0aa2fde92d64736f6c634300080d0033

Deployed Bytecode Sourcemap

16547:29402:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19177:32;;;;;;;;;;-1:-1:-1;19177:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;19177:32:0;;;;;;;;29897:229;;;;;;;;;;;;;:::i;:::-;;17956:94;;;;;;;;;;-1:-1:-1;17956:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;427:4:1;415:17;;;397:36;;469:17;;;464:2;449:18;;442:45;523:17;;503:18;;;496:45;;;;385:2;370:18;17956:94:0;207:340:1;22758:85:0;;;;;;;;;;-1:-1:-1;22830:10:0;;;;;;;;;;;-1:-1:-1;;;22830:10:0;;;;22758:85;;;;22830:10;22758:85;:::i;23365:161::-;;;;;;;;;;-1:-1:-1;23365:161:0;;;;;:::i;:::-;;:::i;:::-;;;1824:14:1;;1817:22;1799:41;;1787:2;1772:18;23365:161:0;1659:187:1;33841:27:0;;;;;;;;;;;;;;;;;;;1997:25:1;;;1985:2;1970:18;33841:27:0;1851:177:1;26199:132:0;;;;;;;;;;-1:-1:-1;26199:132:0;;;;;:::i;:::-;;:::i;22944:88::-;;;;;;;;;;;;;:::i;28701:294::-;;;;;;;;;;-1:-1:-1;28701:294:0;;;;;:::i;:::-;;:::i;19427:27::-;;;;;;;;;;-1:-1:-1;19427:27:0;;;;-1:-1:-1;;;;;19427:27:0;;;;;;-1:-1:-1;;;;;3060:32:1;;;3042:51;;3030:2;3015:18;19427:27:0;2896:203:1;31699:259:0;;;;;;;;;;-1:-1:-1;31699:259:0;;;;;:::i;:::-;;:::i;24708:392::-;;;;;;;;;;-1:-1:-1;24708:392:0;;;;;:::i;:::-;;:::i;32645:223::-;;;;;;;;;;;;;:::i;26026:144::-;;;;;;;;;;-1:-1:-1;26026:144:0;;;;;:::i;:::-;;:::i;22581:85::-;;;;;;;;;;-1:-1:-1;17207:2:0;22581:85;;;4243:4:1;4231:17;;;4213:36;;4201:2;4186:18;22581:85:0;4071:184:1;19502:28:0;;;;;;;;;;-1:-1:-1;19502:28:0;;;;-1:-1:-1;;;;;19502:28:0;;;24320:205;;;;;;;;;;-1:-1:-1;24320:205:0;;;;;:::i;:::-;;:::i;27029:140::-;;;;;;;;;;-1:-1:-1;27029:140:0;;;;;:::i;:::-;;:::i;33807:27::-;;;;;;;;;;;;;;;;30284:323;;;;;;;;;;-1:-1:-1;30284:323:0;;;;;:::i;:::-;;:::i;31050:641::-;;;;;;;;;;;;;:::i;19265:22::-;;;;;;;;;;-1:-1:-1;19265:22:0;;;;-1:-1:-1;;;19265:22:0;;;;;;29586:198;;;;;;;;;;-1:-1:-1;29586:198:0;;;;;:::i;:::-;;:::i;33036:146::-;;;;;;;;;;;;;:::i;26733:251::-;;;;;;;;;;-1:-1:-1;26733:251:0;;;;;:::i;:::-;;:::i;31966:301::-;;;;;;;;;;-1:-1:-1;31966:301:0;;;;;:::i;:::-;;:::i;27401:789::-;;;;;;;;;;-1:-1:-1;27401:789:0;;;;;:::i;:::-;;:::i;25108:149::-;;;;;;;;;;-1:-1:-1;25108:149:0;;;;;:::i;:::-;;:::i;28223:417::-;;;;;;;;;;-1:-1:-1;28223:417:0;;;;;:::i;:::-;;:::i;25838:145::-;;;;;;;;;;-1:-1:-1;25838:145:0;;;;;:::i;:::-;;:::i;30675:311::-;;;;;;;;;;;;;:::i;18431:24::-;;;;;;;;;;-1:-1:-1;18431:24:0;;;;;;;;;;;;;;;;6182:25:1;;;6238:2;6223:18;;6216:34;;;;6266:18;;;6259:34;6170:2;6155:18;18431:24:0;5980:319:1;33603:54:0;;;;;;;;;;-1:-1:-1;33603:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;18257:165;;;;;;;;;;-1:-1:-1;18257:165:0;;;;;;-1:-1:-1;;;;;18257:165:0;;;;;;;;;;;-1:-1:-1;;;;;6534:15:1;;;6516:34;;6586:15;;;;6581:2;6566:18;;6559:43;6451:18;18257:165:0;6304:304:1;23841:121:0;;;;;;;;;;-1:-1:-1;23841:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;23936:18:0;23909:7;23936:18;;;:9;:18;;;;;;;23841:121;8112:140;;;;;;;;;;;;;:::i;33190:135::-;;;;;;;;;;-1:-1:-1;33190:135:0;;;;;:::i;:::-;;:::i;25345:88::-;;;;;;;;;;;;;:::i;17216:34::-;;;;;;;;;;;;17248:2;17216:34;;26398:268;;;;;;;;;;-1:-1:-1;26398:268:0;;;;;:::i;:::-;;:::i;22672:80::-;;;;;;;;;;-1:-1:-1;22724:7:0;7976:6;-1:-1:-1;;;;;7976:6:0;22672:80;22944:88;29003:454;;;;;;;;;;-1:-1:-1;29003:454:0;;;;;:::i;:::-;;:::i;32876:152::-;;;;;;;;;;-1:-1:-1;32876:152:0;;;;;:::i;:::-;;:::i;23970:342::-;;;;;;;;;;-1:-1:-1;23970:342:0;;;;;:::i;:::-;;:::i;24533:167::-;;;;;;;;;;-1:-1:-1;24533:167:0;;;;;:::i;:::-;;:::i;25611:139::-;;;;;;;;;;;;;:::i;18059:189::-;;;;;;;;;;-1:-1:-1;18059:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7185:4:1;7173:17;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;;;;7335:17;;;7330:2;7315:18;;7308:45;7142:3;7127:19;18059:189:0;6940:419:1;23210:147:0;;;;;;;;;;-1:-1:-1;23210:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;23321:19:0;;;23294:7;23321:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;23210:147;27263:103;;;;;;;;;;-1:-1:-1;27263:103:0;;;;;:::i;:::-;;:::i;8260:223::-;;;;;;;;;;-1:-1:-1;8260:223:0;;;;;:::i;:::-;;:::i;19347:71::-;;;;;;;;;;-1:-1:-1;19347:71:0;;;;-1:-1:-1;;;19347:71:0;;-1:-1:-1;;;;;19347:71:0;;;18464:119;;;;;;;;;;-1:-1:-1;18464:119:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18464:119:0;;;;;;;;;7990:6:1;8023:15;;;8005:34;;8075:15;;;8070:2;8055:18;;8048:43;8127:15;;;8107:18;;;8100:43;;;;8179:15;;;8174:2;8159:18;;8152:43;7967:3;7952:19;18464:119:0;7757:444:1;32310:327:0;;;;;;;;;;-1:-1:-1;32548:14:0;;32582:11;;32310:327;;;8445:25:1;;;18813:1:0;8501:2:1;8486:18;;8479:45;32582:11:0;;;;8540:18:1;;;8533:45;;;;32582:11:0;32595:16;;;;8621:14:1;8614:22;8609:2;8594:18;;8587:50;32613:15:0;;;;;8681:14:1;8674:22;8668:3;8653:19;;8646:51;8432:3;8417:19;32310:327:0;8206:497:1;16809:45:0;;;;;;;;;;-1:-1:-1;16809:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29897:229;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;;;;;;;;;29976:20:::1;;29957:15;:39;;29949:68;;;;-1:-1:-1::0;;;29949:68:0::1;;;;;;;:::i;:::-;30049:15;30028:20;:36:::0;30075:43:::1;30084:10;30096:21;30075:8;:43::i;:::-;29897:229::o:0;23365:161::-;23442:4;23459:37;23468:10;23480:7;23489:6;23459:8;:37::i;:::-;-1:-1:-1;23514:4:0;23365:161;;;;;:::o;26199:132::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26287:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:36;;-1:-1:-1;;26287:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26199:132::o;22944:88::-;22999:7;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;;:11;:32;:::i;:::-;23010:19;;22944:88;:::o;28701:294::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;28799:1:::1;28787:9;:13;;;28779:58;;;::::0;-1:-1:-1;;;28779:58:0;;11642:2:1;28779:58:0::1;::::0;::::1;11624:21:1::0;11681:2;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;-1:-1:-1;;;11771:18:1;;;11764:31;11812:19;;28779:58:0::1;11440:397:1::0;28779:58:0::1;28869:2;28856:9;:15;;;;28848:57;;;::::0;-1:-1:-1;;;28848:57:0;;12044:2:1;28848:57:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:32;12102:18;;;12095:60;12172:18;;28848:57:0::1;11842:354:1::0;28848:57:0::1;28916:13;:25:::0;;-1:-1:-1;;28916:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;28957:30:::1;::::0;158:38:1;;;28957:30:0::1;::::0;146:2:1;131:18;28957:30:0::1;;;;;;;;28701:294:::0;:::o;31699:259::-;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;31791:10:::1;:14:::0;-1:-1:-1;;;;;31791:14:0::1;31816:25;:9;31791:14:::0;31816:16:::1;:25::i;:::-;-1:-1:-1::0;31852:10:0::1;:21:::0;;-1:-1:-1;;;;;;31852:21:0::1;-1:-1:-1::0;;;;;31852:21:0;::::1;::::0;;::::1;::::0;;;31884:29:::1;::::0;:9:::1;::::0;:13:::1;:29::i;:::-;-1:-1:-1::0;31929:21:0::1;::::0;-1:-1:-1;;;;;3060:32:1;;3042:51;;31929:21:0::1;::::0;3030:2:1;3015:18;31929:21:0::1;;;;;;;;31762:196;31699:259:::0;:::o;24708:392::-;24808:4;24825:36;24835:6;24843:9;24854:6;24825:9;:36::i;:::-;-1:-1:-1;;;;;24901:19:0;;24874:24;24901:19;;;:11;:19;;;;;;;;24921:10;24901:31;;;;;;;;24951:26;;;;24943:59;;;;-1:-1:-1;;;24943:59:0;;12619:2:1;24943:59:0;;;12601:21:1;12658:2;12638:18;;;12631:30;-1:-1:-1;;;12677:18:1;;;12670:50;12737:18;;24943:59:0;12417:344:1;24943:59:0;25015:55;25024:6;25032:10;25044:25;25063:6;25044:16;:25;:::i;:::-;25015:8;:55::i;:::-;-1:-1:-1;25088:4:0;;24708:392;-1:-1:-1;;;;24708:392:0:o;32645:223::-;32707:7;32749:20;;32731:15;:38;32727:115;;;32815:15;32792:20;;:38;;;;:::i;32727:115::-;-1:-1:-1;32859:1:0;;32645:223::o;26026:144::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;26096:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;26096:26:0;;::::1;;::::0;;26138:24:::1;::::0;::::1;::::0;::::1;::::0;26115:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;24320:205:0;24428:10;24402:4;24449:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24449:32:0;;;;;;;;;;24402:4;;24419:76;;24440:7;;24449:45;;24484:10;;24449:45;:::i;27029:140::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;27100:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;27100:20:0::1;-1:-1:-1::0;;27100:20:0;;::::1;;::::0;;27136:25:::1;::::0;::::1;::::0;::::1;::::0;27113:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;30284:323:0;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;30386:12:::1;::::0;-1:-1:-1;;;;;30370:28:0;;::::1;30386:12:::0;::::1;30370:28;::::0;::::1;::::0;:61:::1;;-1:-1:-1::0;;;;;;30402:29:0;::::1;30426:4;30402:29;;30370:61;30362:123;;;::::0;-1:-1:-1;;;30362:123:0;;13231:2:1;30362:123:0::1;::::0;::::1;13213:21:1::0;13270:2;13250:18;;;13243:30;13309:34;13289:18;;;13282:62;-1:-1:-1;;;13360:18:1;;;13353:34;13404:19;;30362:123:0::1;13029:400:1::0;30362:123:0::1;30568:30;::::0;-1:-1:-1;;;30568:30:0;;30592:4:::1;30568:30;::::0;::::1;3042:51:1::0;30518:12:0;;-1:-1:-1;;;;;30542:14:0;::::1;::::0;::::1;::::0;30557:10:::1;::::0;30542:14;;30568:15:::1;::::0;3015:18:1;;30568:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30542:57;::::0;-1:-1:-1;;;;;;30542:57:0::1;::::0;;;;;;-1:-1:-1;;;;;13815:32:1;;;30542:57:0::1;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;13770:18;;30542:57:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30351:256;30284:323:::0;:::o;31050:641::-;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;31127:20:::1;;31108:15;:39;;31100:68;;;;-1:-1:-1::0;;;31100:68:0::1;;;;;;;:::i;:::-;31202:15;31179:20;:38:::0;31267:12:::1;::::0;31308:39:::1;::::0;-1:-1:-1;;;31308:39:0;;31341:4:::1;31308:39;::::0;::::1;3042:51:1::0;-1:-1:-1;;;;;31267:12:0;;::::1;::::0;31228:25:::1;::::0;31267:12;;31308:24:::1;::::0;3015:18:1;;31308:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31389:11;::::0;31358:51:::1;::::0;-1:-1:-1;;;31358:51:0;;-1:-1:-1;;;;;31389:11:0;;::::1;31358:51;::::0;::::1;13797::1::0;13864:18;;;13857:34;;;31291:56:0;;-1:-1:-1;31358:22:0;::::1;::::0;::::1;::::0;13770:18:1;;31358:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31420:11:0::1;::::0;:209:::1;::::0;-1:-1:-1;;;31420:209:0;;-1:-1:-1;;;;;31420:11:0;;::::1;::::0;:59:::1;::::0;:209:::1;::::0;31502:4:::1;::::0;31522:6;;31420:11:::1;::::0;;;31502:4;;31603:15:::1;::::0;31420:209:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31640:43;31649:10;31661:21;31640:8;:43::i;:::-;31089:602;;31050:641::o:0;29586:198::-;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;29672:50:::1;29686:35;29706:15;29686:17:::0;:35:::1;:::i;:::-;29672:13;:50::i;:::-;29738:38;::::0;1997:25:1;;;29738:38:0::1;::::0;1985:2:1;1970:18;29738:38:0::1;1851:177:1::0;33036:146:0;33086:7;33106:14;33138:12;;33123;;:27;;;;:::i;26733:251::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;26830:7:::1;26827:100;;;26852:24;26871:4;26852:18;:24::i;:::-;26827:100;;;26905:22;26922:4;26905:16;:22::i;:::-;26943:33;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;26943:33:0::1;::::0;14905:18:1;26943:33:0::1;14764:284:1::0;31966:301:0;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;32070:20;;-1:-1:-1;;;;;32070:20:0::1;32101:31;:9;32070:20:::0;32101:16:::1;:31::i;:::-;-1:-1:-1::0;32143:20:0;:27;;-1:-1:-1;;;;;;32143:27:0::1;-1:-1:-1::0;;;;;32143:27:0;::::1;::::0;;::::1;::::0;;;32181:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;32232:27:0::1;::::0;-1:-1:-1;;;;;3060:32:1;;3042:51;;32232:27:0::1;::::0;3030:2:1;3015:18;32232:27:0::1;2896:203:1::0;27401:789:0;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;27546:16:::1;27580:4;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;::::0;:11:::1;:32;:::i;:::-;27565:19;;;;:::i;:::-;27546:38:::0;-1:-1:-1;27595:20:0::1;27618:45;::::0;;::::1;::::0;:32;::::1;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;::::0;:11:::1;:32;:::i;:::-;27618;;;;:::i;:::-;:45;;;;:::i;:::-;27595:68:::0;-1:-1:-1;27674:18:0::1;27695:43;::::0;;::::1;::::0;:30;::::1;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;::::0;:11:::1;:32;:::i;:::-;27695:30;;;;:::i;:::-;:43;;;;:::i;:::-;27674:64:::0;-1:-1:-1;27749:17:0::1;27769:42;::::0;;::::1;::::0;:29;::::1;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;::::0;:11:::1;:32;:::i;:::-;27769:29;;;;:::i;:::-;:42;;;;:::i;:::-;27749:62;;27925:8;27909:12;:24;;:50;;;;;27951:8;27937:10;:22;;27909:50;27900:110;;;::::0;-1:-1:-1;;;27900:110:0;;15477:2:1;27900:110:0::1;::::0;::::1;15459:21:1::0;;;15496:18;;;15489:30;15555:34;15535:18;;;15528:62;15607:18;;27900:110:0::1;15275:356:1::0;27900:110:0::1;28033:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;28023:7:::1;:56:::0;;;;;;;;;;;;;;28107:75;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;28092:12:0::1;:90:::0;;-1:-1:-1;;28092:90:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;28092:90:0;;;;::::1;-1:-1:-1::0;;28092:90:0;;;;;-1:-1:-1;;;28092:90:0;;::::1;::::0;;;::::1;::::0;;27401:789::o;25108:149::-;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;25206:43:::1;25223:6;25231:9;25242:6;25206:16;:43::i;28223:417::-:0;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;28361::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;28348:10:::1;:70:::0;;-1:-1:-1;;28348:70:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;28348:70:0;;;;::::1;-1:-1:-1::0;;28348:70:0;;;;;;;;::::1;;::::0;;28361:57;;28447:21:::1;28361:57:::0;;28447:21:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;28431:13;:65:::0;;-1:-1:-1;;28431:65:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;28525:28:::1;::::0;28541:12;;28525:28:::1;:::i;:::-;28507:15;:46:::0;;-1:-1:-1;;28507:46:0::1;;;::::0;;::::1;;;::::0;;28571:61:::1;::::0;;7173:17:1;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;7335:17;;;7330:2;7315:18;;7308:45;28571:61:0;::::1;::::0;7142:3:1;28571:61:0;;;;;;::::1;28223:417:::0;;;;:::o;25838:145::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;25933:42:::1;25952:8;25962:12;25933:18;:42::i;30675:311::-:0;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;30753:20:::1;;30734:15;:39;;30726:68;;;;-1:-1:-1::0;;;30726:68:0::1;;;;;;;:::i;:::-;30844:12;::::0;30885:39:::1;::::0;-1:-1:-1;;;30885:39:0;;30918:4:::1;30885:39;::::0;::::1;3042:51:1::0;-1:-1:-1;;;;;30844:12:0;;::::1;::::0;30805:25:::1;::::0;30844:12;;30885:24:::1;::::0;3015:18:1;;30885:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30935:43;::::0;-1:-1:-1;;;30935:43:0;;30959:10:::1;30935:43;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;;;30868:56:0;;-1:-1:-1;;;;;;30935:23:0;::::1;::::0;::::1;::::0;13770:18:1;;30935:43:0::1;13623:274:1::0;8112:140:0;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;8211:1:::1;8195:6:::0;;8174:40:::1;::::0;-1:-1:-1;;;;;8195:6:0;;::::1;::::0;8174:40:::1;::::0;8211:1;;8174:40:::1;8242:1;8225:19:::0;;-1:-1:-1;;;;;;8225:19:0::1;::::0;;8112:140::o;33190:135::-;33258:4;33282:35;:20;33312:4;33282:29;:35::i;25345:88::-;25410:11;;25388:37;;25399:10;;-1:-1:-1;;;25410:11:0;;-1:-1:-1;;;;;25410:11:0;25423:1;25388:10;:37::i;26398:268::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;26495:15;::::1;;26506:4;26495:15:::0;26492:109:::1;;26525:22;:9;26539:7:::0;26525:13:::1;:22::i;:::-;;26492:109;;;26576:25;:9;26593:7:::0;26576:16:::1;:25::i;:::-;;26492:109;26617:41;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;26617:41:0::1;::::0;14905:18:1;26617:41:0::1;14764:284:1::0;29003:454:0;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;17248:2:::1;29266:17;::::0;::::1;;::::0;::::1;::::0;:38:::1;;;29302:2;29287:11;:17;;;;29266:38;29258:76;;;::::0;-1:-1:-1;;;29258:76:0;;16247:2:1;29258:76:0::1;::::0;::::1;16229:21:1::0;16286:2;16266:18;;;16259:30;16325:27;16305:18;;;16298:55;16370:18;;29258:76:0::1;16045:349:1::0;29258:76:0::1;29357:35;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;29345:9:::1;:47:::0;;-1:-1:-1;;29345:47:0;;;::::1;::::0;::::1;;-1:-1:-1::0;;29345:47:0::1;::::0;;::::1;;::::0;;29408:41;;397:36:1;;;449:18;;;442:45;;;;503:18;;;496:45;;;;29408:41:0::1;::::0;370:18:1;29408:41:0::1;;;;;;;29003:454:::0;;;:::o;32876:152::-;32938:7;32958:14;32975:21;32991:4;32975:15;:21::i;:::-;32958:38;32876:152;-1:-1:-1;;;32876:152:0:o;23970:342::-;24113:10;24057:4;24101:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24101:32:0;;;;;;;;;;24152:35;;;;24144:60;;;;-1:-1:-1;;;24144:60:0;;16601:2:1;24144:60:0;;;16583:21:1;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:1;;;16652:42;16711:18;;24144:60:0;16399:336:1;24144:60:0;24217:65;24226:10;24238:7;24247:34;24266:15;24247:16;:34;:::i;24217:65::-;-1:-1:-1;24300:4:0;;23970:342;-1:-1:-1;;;23970:342:0:o;24533:167::-;24613:4;24630:40;24640:10;24652:9;24663:6;24630:9;:40::i;25611:139::-;25661:28;25678:10;25661:16;:28::i;:::-;25705:37;;;25724:10;14932:51:1;;25736:5:0;15014:2:1;14999:18;;14992:50;25705:37:0;;14905:18:1;25705:37:0;;;;;;;25611:139::o;27263:103::-;20442:23;20454:10;20442:11;:23::i;:::-;20434:57;;;;-1:-1:-1;;;20434:57:0;;;;;;;:::i;:::-;27333:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;27333:25:0;;::::1;::::0;;;::::1;::::0;;27263:103::o;8260:223::-;8049:10;8038:7;7949;7976:6;-1:-1:-1;;;;;7976:6:0;;7911:79;8038:7;-1:-1:-1;;;;;8038:21:0;;8030:54;;;;-1:-1:-1;;;8030:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8341:22:0;::::1;8333:60;;;::::0;-1:-1:-1;;;8333:60:0;;16942:2:1;8333:60:0::1;::::0;::::1;16924:21:1::0;16981:2;16961:18;;;16954:30;17020:27;17000:18;;;16993:55;17065:18;;8333:60:0::1;16740:349:1::0;8333:60:0::1;8430:6;::::0;;8409:38:::1;::::0;-1:-1:-1;;;;;8409:38:0;;::::1;::::0;8430:6;::::1;::::0;8409:38:::1;::::0;::::1;8458:6;:17:::0;;-1:-1:-1;;;;;;8458:17:0::1;-1:-1:-1::0;;;;;8458:17:0;;;::::1;::::0;;;::::1;::::0;;8260:223::o;14997:152::-;15067:4;15091:50;15096:3;-1:-1:-1;;;;;15116:23:0;;15091:4;:50::i;15323:167::-;-1:-1:-1;;;;;15457:23:0;;15403:4;13834:19;;;:12;;;:19;;;;;;:24;;15427:55;13737:129;36461:169;36532:9;36546:7;-1:-1:-1;;;;;36546:12:0;36567:6;36546:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36531:48;;;36598:4;36590:32;;;;-1:-1:-1;;;36590:32:0;;17506:2:1;36590:32:0;;;17488:21:1;17545:2;17525:18;;;17518:30;-1:-1:-1;;;17564:18:1;;;17557:45;17619:18;;36590:32:0;17304:339:1;23534:299:0;-1:-1:-1;;;;;23627:19:0;;23619:49;;;;-1:-1:-1;;;23619:49:0;;17850:2:1;23619:49:0;;;17832:21:1;17889:2;17869:18;;;17862:30;-1:-1:-1;;;17908:18:1;;;17901:47;17965:18;;23619:49:0;17648:341:1;23619:49:0;-1:-1:-1;;;;;23687:21:0;;23679:49;;;;-1:-1:-1;;;23679:49:0;;18196:2:1;23679:49:0;;;18178:21:1;18235:2;18215:18;;;18208:30;-1:-1:-1;;;18254:18:1;;;18247:45;18309:18;;23679:49:0;17994:339:1;23679:49:0;-1:-1:-1;;;;;23741:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23793:32;;1997:25:1;;;23793:32:0;;1970:18:1;23793:32:0;;;;;;;23534:299;;;:::o;23040:162::-;23097:4;7976:6;;-1:-1:-1;;;;;23121:15:0;;;7976:6;;23121:15;;:47;;-1:-1:-1;23148:20:0;;-1:-1:-1;;;;;23140:28:0;;;23148:20;;23140:28;23121:47;:73;;;-1:-1:-1;;23180:10:0;:14;-1:-1:-1;;;;;23180:14:0;;;23172:22;;;;23040:162::o;15157:158::-;15230:4;15254:53;15262:3;-1:-1:-1;;;;;15282:23:0;;15254:7;:53::i;41026:1106::-;-1:-1:-1;;;;;41123:20:0;;41115:51;;;;-1:-1:-1;;;41115:51:0;;18540:2:1;41115:51:0;;;18522:21:1;18579:2;18559:18;;;18552:30;-1:-1:-1;;;18598:18:1;;;18591:48;18656:18;;41115:51:0;18338:342:1;41115:51:0;-1:-1:-1;;;;;41185:23:0;;41177:52;;;;-1:-1:-1;;;41177:52:0;;18887:2:1;41177:52:0;;;18869:21:1;18926:2;18906:18;;;18899:30;-1:-1:-1;;;18945:18:1;;;18938:46;19001:18;;41177:52:0;18685:340:1;41177:52:0;41242:15;41261:26;:9;41280:6;41261:18;:26::i;:::-;:59;;;-1:-1:-1;41291:29:0;:9;41310;41291:18;:29::i;:::-;41242:79;-1:-1:-1;41334:23:0;-1:-1:-1;;;;;41361:23:0;;41379:4;41361:23;;:53;;-1:-1:-1;;;;;;41388:26:0;;41409:4;41388:26;41361:53;41459:11;;41531:12;;41334:81;;-1:-1:-1;;;;;;41459:11:0;;;;41426:22;;41521;;;41531:12;;41521:22;:53;;;;;41560:14;-1:-1:-1;;;;;41547:27:0;:9;-1:-1:-1;;;;;41547:27:0;;41521:53;41520:123;;;-1:-1:-1;41602:12:0;;-1:-1:-1;;;;;41589:25:0;;;41602:12;;41589:25;:53;;;;;41628:14;-1:-1:-1;;;;;41618:24:0;:6;-1:-1:-1;;;;;41618:24:0;;41589:53;41694:12;;41482:172;;-1:-1:-1;41667:11:0;;-1:-1:-1;;;;;41681:25:0;;;41694:12;;41681:25;;:56;;;41723:14;-1:-1:-1;;;;;41710:27:0;:9;-1:-1:-1;;;;;41710:27:0;;41681:56;41767:12;;41667:70;;-1:-1:-1;41748:10:0;;-1:-1:-1;;;;;41759:20:0;;;41767:12;;41759:20;;:47;;;41792:14;-1:-1:-1;;;;;41782:24:0;:6;-1:-1:-1;;;;;41782:24:0;;41759:47;41748:58;;41823:18;:41;;;;41845:19;41823:41;:55;;;;41868:10;41823:55;41819:306;;;41895:43;41912:6;41920:9;41931:6;41895:16;:43::i;:::-;41960:14;;;;;;;41955:60;;41993:22;42005:9;41993:11;:22::i;:::-;41819:306;;;42057:56;42072:6;42080:9;42091:6;42099:5;42106:6;42057:14;:56::i;:::-;41104:1028;;;;;;41026:1106;;;:::o;45419:227::-;45570:20;;45554:13;:36;45546:45;;;;;;45602:20;:36;45419:227::o;43901:361::-;43971:35;:20;44001:4;43971:29;:35::i;:::-;43970:36;43962:45;;;;;;-1:-1:-1;;;;;44034:15:0;;;;;;:9;:15;;;;;;44018:12;:31;;44034:15;;44018:12;;:31;;44034:15;;44018:31;:::i;:::-;;;;-1:-1:-1;44060:20:0;;-1:-1:-1;44083:16:0;44094:4;44083:10;:16::i;:::-;44154:12;;-1:-1:-1;;;;;44136:15:0;;;;;;:9;:15;;;;;;44060:39;;-1:-1:-1;44136:30:0;;;:::i;:::-;-1:-1:-1;;;;;44110:23:0;;;;;;:17;:23;;;;;;;;:56;;;;44177:14;:20;;;;;:36;;44201:12;;44110:23;44177:36;;44201:12;;44177:36;:::i;:::-;;;;-1:-1:-1;44224:30:0;;-1:-1:-1;44224:20:0;44249:4;44224:24;:30::i;44270:264::-;44337:35;:20;44367:4;44337:29;:35::i;:::-;44329:44;;;;;;-1:-1:-1;;;;;44400:15:0;;;;;;:9;:15;;;;;;44384:12;:31;;44400:15;;44384:12;;:31;;44400:15;;44384:31;:::i;:::-;;;;-1:-1:-1;44426:33:0;;-1:-1:-1;44426:20:0;44454:4;44426:27;:33::i;:::-;-1:-1:-1;44514:12:0;;-1:-1:-1;;;;;44496:15:0;;;;;;:9;:15;;;;;;:30;;44514:12;44496:30;:::i;:::-;-1:-1:-1;;;;;44470:23:0;;;;;;;:17;:23;;;;;:56;44270:264::o;35632:343::-;-1:-1:-1;;;;;35751:17:0;;35727:21;35751:17;;;:9;:17;;;;;;35787:23;;;;35779:60;;;;-1:-1:-1;;;35779:60:0;;19232:2:1;35779:60:0;;;19214:21:1;19271:2;19251:18;;;19244:30;-1:-1:-1;;;19290:18:1;;;19283:54;19354:18;;35779:60:0;19030:348:1;35779:60:0;35850:27;35863:6;35870;35850:12;:27::i;:::-;35888:28;35898:9;35909:6;35888:9;:28::i;:::-;35949:9;-1:-1:-1;;;;;35932:35:0;35941:6;-1:-1:-1;;;;;35932:35:0;;35960:6;35932:35;;;;1997:25:1;;1985:2;1970:18;;1851:177;35932:35:0;;;;;;;;35716:259;35632:343;;;:::o;36638:1683::-;20551:27;:34;;-1:-1:-1;;20551:34:0;20581:4;20551:34;;;36753:3:::1;36741:15;::::0;::::1;;;36733:24;;;::::0;::::1;;36772:13;::::0;::::1;;36768:31:::0;36792:7:::1;36768:31;36853:4;36809:23;36835:24:::0;;;:9:::1;:24;::::0;;;;;;36906:12:::1;::::0;-1:-1:-1;;;;;36906:12:0::1;36896:23:::0;;;;;;36835:24;;36809:23;36933:4:::1;::::0;36896:34:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:41;;;;:::i;:::-;36966:15:::0;;36874:63;;-1:-1:-1;36952:29:0;::::1;:46:::0;::::1;;;;36986:12;36985:13;36952:46;36948:94;;;-1:-1:-1::0;37027:15:0;;36948:94:::1;37077:29:::0;;::::1;37117:154:::0;::::1;;;37156:12;37152:108;;;37201:15;37187:29;;37152:108;;;37253:7;;;;;37152:108;37305:4;37285:26;::::0;;;:11:::1;:26;::::0;;;;;;;37320:11:::1;::::0;-1:-1:-1;;;;;37320:11:0::1;37285:48:::0;;;;;;;;:62;-1:-1:-1;37281:145:0::1;;;37394:11;::::0;37362:64:::1;::::0;37379:4:::1;::::0;-1:-1:-1;;;;;37394:11:0::1;-1:-1:-1::0;;37362:8:0::1;:64::i;:::-;37504:13;::::0;37480:10:::1;:20:::0;37439:25:::1;::::0;37504:13:::1;::::0;;::::1;::::0;37468:32:::1;::::0;37504:13:::1;37480:20:::0;;::::1;;37468:11:::0;:32:::1;:::i;:::-;37467:50;;;;:::i;:::-;37439:78:::0;-1:-1:-1;37528:22:0::1;37553:31;37439:78:::0;37553:11;:31:::1;:::i;:::-;37528:56:::0;-1:-1:-1;37595:16:0::1;37614:21;37634:1;37614:17:::0;:21:::1;:::i;:::-;37595:40:::0;-1:-1:-1;37646:19:0::1;37668:28;37595:40:::0;37668:17;:28:::1;:::i;:::-;37646:50:::0;-1:-1:-1;37707:17:0::1;37727:28;37741:14:::0;37646:50;37727:28:::1;:::i;:::-;37707:48:::0;-1:-1:-1;37794:21:0::1;37826:27;37707:48:::0;37826:16:::1;:27::i;:::-;37864:14;37882:41;37906:17:::0;37882:21:::1;:41;:::i;:::-;37864:60:::0;-1:-1:-1;37935:14:0::1;37975:9:::0;37953:18:::1;37960:11:::0;37864:60;37953:18:::1;:::i;:::-;37952:32;;;;:::i;:::-;37935:49:::0;-1:-1:-1;37999:12:0;;37995:62:::1;;38026:31;38040:8;38050:6;38026:13;:31::i;:::-;38068:14;38129:2;38086:39;38108:17:::0;38086:21:::1;:39;:::i;:::-;38085:46;;;;:::i;:::-;38068:63;;38142:37;;;;;;;;;;;;;;-1:-1:-1::0;;;38142:37:0::1;;::::0;38172:6:::1;38142:18;:37::i;:::-;38190:21;38259:6:::0;38215:41:::1;38239:17:::0;38215:21:::1;:41;:::i;:::-;:50;;;;:::i;:::-;38190:76;;38277:36;38294:13;38308:4;38277:16;:36::i;:::-;36722:1599;;;;;;;;;;;;;20596:1;-1:-1:-1::0;;20608:27:0;:35;;-1:-1:-1;;20608:35:0;;;36638:1683::o;42397:1496::-;42497:14;;;;;;;42496:15;42488:24;;;;;;42523:14;:21;;-1:-1:-1;;42523:21:0;;;;;;;42630:5;42652:35;:20;42682:4;42652:29;:35::i;:::-;42648:377;;;-1:-1:-1;;;;;42712:20:0;;;;;;:14;:20;;;;;;;42747:24;;;42712:20;-1:-1:-1;42648:377:0;;;42813:17;42833:16;42844:4;42833:10;:16::i;:::-;-1:-1:-1;;;;;42905:15:0;;;;;;:9;:15;;;;;;42890:12;;42813:36;;-1:-1:-1;42890:30:0;;;:::i;:::-;-1:-1:-1;;;;;42864:23:0;;;;;;:17;:23;;;;;;;;:56;;;;42944:14;:20;;;;:30;;42965:9;;42944:30;:::i;:::-;-1:-1:-1;;;;;42989:20:0;;43012:1;42989:20;;;:14;:20;;;;;:24;42935:39;-1:-1:-1;;42648:377:0;43041:11;;:33;;;;-1:-1:-1;43056:18:0;;43041:33;43037:108;;;-1:-1:-1;;43090:14:0;:22;;-1:-1:-1;;43090:22:0;;;-1:-1:-1;;;;42397:1496:0:o;43037:108::-;43173:6;43157:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;43190:25:0;;;;;;:19;:25;;;;;:35;;43219:6;;43190:25;:35;;43219:6;;43190:35;:::i;:::-;;;;-1:-1:-1;43236:23:0;;-1:-1:-1;43246:13:0;43236:23;;:::i;:::-;43296:16;;;43310:1;43296:16;;;;;;;;43236:23;;-1:-1:-1;43272:21:0;;43296:16;;;;;;;;;;-1:-1:-1;;43333:11:0;;:18;;;-1:-1:-1;;;43333:18:0;;;;43272:40;;-1:-1:-1;;;;;;43333:11:0;;;;:16;;-1:-1:-1;43333:18:0;;;;;;;;;;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43323:4;43328:1;43323:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;43323:28:0;;;-1:-1:-1;;;;;43323:28:0;;;;;43372:5;43362:4;43367:1;43362:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43362:15:0;;;:7;;;;;;;;;:15;43394:11;;:162;;-1:-1:-1;;;43394:162:0;;:11;;;:62;;43464:6;;43394:162;;:11;;43502:4;;43521;;43540:15;;43394:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43390:283;;43656:5;43642:19;;43390:283;;;43595:4;43581:18;;43390:283;43689:11;43685:114;;43717:22;43726:4;43732:6;43717:8;:22::i;:::-;43769:11;;;;;;;;;-1:-1:-1;;;;;43769:11:0;-1:-1:-1;;;;;43769:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43754:33;;43685:114;43814:38;;;21086:25:1;;;-1:-1:-1;;;;;21185:15:1;;;21180:2;21165:18;;21158:43;21237:15;;21217:18;;;21210:43;43814:38:0;;;;;;;21074:2:1;43814:38:0;;;-1:-1:-1;;43863:14:0;:22;;-1:-1:-1;;43863:22:0;;;-1:-1:-1;;;;;42397:1496:0:o;45066:227::-;45127:7;45151:35;:20;45181:4;45151:29;:35::i;:::-;45147:81;;;-1:-1:-1;;;;;;45208:20:0;;;;;:14;:20;;;;;;;45066:227::o;45147:81::-;-1:-1:-1;;;;;45265:20:0;;;;;;:14;:20;;;;;;45246:16;45280:4;45246:10;:16::i;:::-;:39;;;;:::i;12841:291::-;12904:4;13834:19;;;:12;;;:19;;;;;;12921:204;;-1:-1:-1;12964:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;13024:18;;13002:19;;;:12;;;:19;;;;;;:40;;;;13057:11;;12921:204;-1:-1:-1;13108:5:0;13101:12;;13140:589;13206:4;13244:19;;;:12;;;:19;;;;;;13278:15;;13274:448;;13310:21;13334:14;13347:1;13334:10;:14;:::i;:::-;13383:18;;13310:38;;-1:-1:-1;13363:17:0;;13383:22;;13404:1;;13383:22;:::i;:::-;13363:42;;13420:17;13440:3;:11;;13452:9;13440:22;;;;;;;;:::i;:::-;;;;;;;;;13420:42;;13506:9;13477:3;:11;;13489:13;13477:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13530:23;;;:12;;;:23;;;;;;:36;;;13581:17;;13530:3;;13581:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13620:3;:12;;:19;13633:5;13620:19;;;;;;;;;;;13613:26;;;13661:4;13654:11;;;;;;;;13274:448;13705:5;13698:12;;;;;42140:249;42207:14;;;;;;;42206:15;42198:51;;;;-1:-1:-1;;;42198:51:0;;21598:2:1;42198:51:0;;;21580:21:1;21637:2;21617:18;;;21610:30;21676:25;21656:18;;;21649:53;21719:18;;42198:51:0;21396:347:1;42198:51:0;42276:12;;-1:-1:-1;;;;;42276:12:0;;;42264:24;;;;42260:122;;42322:12;42305:14;:29;42349:14;:21;;-1:-1:-1;;42349:21:0;;;;;42260:122;42140:249;:::o;38781:2237::-;-1:-1:-1;;;;;38924:20:0;;;38897:24;38924:20;;;:9;:20;;;;;;;38979:17;;;;;;;;39015:23;;;;39007:60;;;;-1:-1:-1;;;39007:60:0;;19232:2:1;39007:60:0;;;19214:21:1;19271:2;19251:18;;;19244:30;-1:-1:-1;;;19290:18:1;;;19283:54;19354:18;;39007:60:0;19030:348:1;39007:60:0;39080:9;39104:6;39100:1393;;;39131:16;;;;;;;39127:108;;;-1:-1:-1;;;;;39177:21:0;;;;;;:13;:21;;;;;;;;39176:22;39168:51;;;;-1:-1:-1;;;39168:51:0;;21950:2:1;39168:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;39168:51:0;21748:340:1;39168:51:0;39269:15;;39259:25;;;39251:61;;;;-1:-1:-1;;;39251:61:0;;22295:2:1;39251:61:0;;;22277:21:1;22334:2;22314:18;;;22307:30;22373:25;22353:18;;;22346:53;22416:18;;39251:61:0;22093:347:1;39251:61:0;-1:-1:-1;39333:9:0;:17;;;;;;39100:1393;;;39374:5;39370:1123;;;39400:14;;:18;39396:221;;39456:14;;18813:1;;39443:27;;:12;:27;:::i;:::-;:46;39439:163;;;-1:-1:-1;;;;;39514:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;39514:31:0;39541:4;39514:31;;;39568:11;:14;;39514:31;39568:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;39439:163;39637:15;;;;;;;39633:157;;;-1:-1:-1;;;;;39681:21:0;;;;;;:10;:21;;;;;;39706:12;39681:37;;39673:46;;;;;;-1:-1:-1;;;;;39738:21:0;;;;;;:10;:21;;;;;39762:12;39738:36;;39633:157;39841:7;:17;39814:23;39831:6;39814:16;:23;:::i;:::-;:44;;39806:86;;;;-1:-1:-1;;;39806:86:0;;22827:2:1;39806:86:0;;;22809:21:1;22866:2;22846:18;;;22839:30;22905:31;22885:18;;;22878:59;22954:18;;39806:86:0;22625:353:1;39806:86:0;39925:14;;39915:24;;;39907:58;;;;-1:-1:-1;;;39907:58:0;;23185:2:1;39907:58:0;;;23167:21:1;23224:2;23204:18;;;23197:30;-1:-1:-1;;;23243:18:1;;;23236:51;23304:18;;39907:58:0;22983:345:1;39907:58:0;-1:-1:-1;39986:9:0;:16;;;39370:1123;;;40041:16;;;;;;;40037:108;;;-1:-1:-1;;;;;40087:21:0;;;;;;:13;:21;;;;;;;;40086:22;40078:51;;;;-1:-1:-1;;;40078:51:0;;21950:2:1;40078:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;40078:51:0;21748:340:1;40078:51:0;40175:20;17207:2;40175;:20;:::i;:::-;40165:6;:30;40161:187;;40292:11;;40269:38;;40280:10;;-1:-1:-1;;;40292:11:0;;-1:-1:-1;;;;;40292:11:0;40305:1;40269:10;:38::i;:::-;40326:7;;;;;40161:187;40401:7;:17;40372:25;40391:6;40372:16;:25;:::i;:::-;:46;;40364:75;;;;-1:-1:-1;;;40364:75:0;;23535:2:1;40364:75:0;;;23517:21:1;23574:2;23554:18;;;23547:30;-1:-1:-1;;;23593:18:1;;;23586:46;23649:18;;40364:75:0;23333:340:1;40364:75:0;-1:-1:-1;40460:9:0;:21;;;;;;39370:1123;40520:12;;-1:-1:-1;;;;;40510:22:0;;;40520:12;;40510:22;;;;40509:41;;-1:-1:-1;40539:10:0;;-1:-1:-1;;;40539:10:0;;;;40538:11;40509:41;:75;;;;-1:-1:-1;40556:27:0;;;;40555:28;40509:75;:85;;;;;40588:6;40509:85;40505:143;;;40628:13;;40609:39;;40628:13;;;;;40642:5;40609:18;:39::i;:::-;40661:19;40696:7;;;;40693:71;;40749:3;40734:12;;;;:6;:12;:::i;:::-;:18;;;;:::i;:::-;40720:32;;40693:71;40776:21;40800:20;40809:11;40800:6;:20;:::i;:::-;40776:44;;40831:27;40844:6;40851;40831:12;:27::i;:::-;40869:37;40887:4;40894:11;40869:9;:37::i;:::-;40917:35;40927:9;40938:13;40917:9;:35::i;:::-;40985:9;-1:-1:-1;;;;;40968:42:0;40977:6;-1:-1:-1;;;;;40968:42:0;;40996:13;40968:42;;;;1997:25:1;;1985:2;1970:18;;1851:177;40968:42:0;;;;;;;;38886:2132;;;;;38781:2237;;;;;;:::o;45654:292::-;-1:-1:-1;;;;;45768:17:0;;45712:7;45768:17;;;:9;:17;;;;;;45753:12;;45712:7;;45753:32;;;:::i;:::-;-1:-1:-1;;;;;45813:25:0;;;;;;:17;:25;;;;;;45732:53;;-1:-1:-1;45800:38:0;;45796:65;;;-1:-1:-1;45860:1:0;;45654:292;-1:-1:-1;;45654:292:0:o;45796:65::-;-1:-1:-1;;;;;45891:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;33710:5:0;45880:36;;:10;:36;:::i;:::-;45879:59;;;;:::i;35983:470::-;-1:-1:-1;;;;;36074:15:0;;36054:17;36074:15;;;:9;:15;;;;;;:24;;36092:6;;36074:24;:::i;:::-;36054:44;-1:-1:-1;36115:35:0;:20;36145:4;36115:29;:35::i;:::-;36111:116;;;-1:-1:-1;;;;;36167:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;35983:470:0:o;36111:116::-;36253:6;36237:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;36270:15:0;;-1:-1:-1;36288:16:0;36299:4;36288:10;:16::i;:::-;-1:-1:-1;;;;;36315:15:0;;;;;;:9;:15;;;;;:27;;;36379:12;;36270:34;;-1:-1:-1;36379:24:0;;36333:9;;36379:24;:::i;:::-;-1:-1:-1;;;;;36353:23:0;;;;;;:17;:23;;;;;;;;:50;;;;36414:14;:20;;;;;:31;;36438:7;;36353:23;36414:31;;36438:7;;36414:31;:::i;:::-;;;;-1:-1:-1;;;;;;35983:470:0:o;34325:467::-;-1:-1:-1;;;;;34413:15:0;;34393:17;34413:15;;;:9;:15;;;;;;:24;;34431:6;;34413:24;:::i;:::-;34393:44;-1:-1:-1;34454:35:0;:20;34484:4;34454:29;:35::i;:::-;34450:116;;;-1:-1:-1;;;;;34506:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34325:467:0:o;34450:116::-;34592:6;34576:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34609:15:0;;-1:-1:-1;34627:16:0;34638:4;34627:10;:16::i;:::-;34609:34;;34695:9;34680:12;;:24;;;;:::i;:::-;-1:-1:-1;;;;;34654:23:0;;;;;;:17;:23;;;;;;;;:50;;;;34715:14;:20;;;;;:31;;34739:7;;34654:23;34715:31;;34739:7;;34715:31;:::i;:::-;;;;-1:-1:-1;;;;;;;;34757:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34325:467:0:o;38329:444::-;38422:11;;38390:53;;38407:4;;-1:-1:-1;;;;;38422:11:0;38436:6;38390:8;:53::i;:::-;38478:16;;;38492:1;38478:16;;;;;;;;38454:21;;38478:16;;;;;;;;;;-1:-1:-1;38478:16:0;38454:40;;38523:4;38505;38510:1;38505:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38505:23:0;;;:7;;;;;;;;;;:23;;;;38549:11;;:18;;;-1:-1:-1;;;38549:18:0;;;;:11;;;;;:16;;:18;;;;;38505:7;;38549:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38539:4;38544:1;38539:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38539:28:0;;;:7;;;;;;;;;:28;38578:11;;:187;;-1:-1:-1;;;38578:187:0;;:11;;;:62;;:187;;38655:6;;38578:11;;38692:4;;38719;;38739:15;;38578:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38379:394;38329:444;:::o;33958:359::-;34072:11;;34040:58;;34057:4;;-1:-1:-1;;;;;34072:11:0;34086;34040:8;:58::i;:::-;34109:11;;:200;;-1:-1:-1;;;34109:200:0;;-1:-1:-1;;;;;34109:11:0;;;;:27;;34144:9;;34109:200;;34177:4;;34197:11;;34109;;;;34177:4;;34283:15;;34109:200;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9158:446::-;9275:6;9250:21;:31;;9242:73;;;;-1:-1:-1;;;9242:73:0;;24778:2:1;9242:73:0;;;24760:21:1;24817:2;24797:18;;;24790:30;24856:31;24836:18;;;24829:59;24905:18;;9242:73:0;24576:353:1;9242:73:0;9344:30;;8655:66;;9344:30;;9361:12;;9344:30;;;:::i;:::-;;;;;;;;;;;;;9334:41;;;;;;:58;9326:98;;;;-1:-1:-1;;;9326:98:0;;25417:2:1;9326:98:0;;;25399:21:1;25456:2;25436:18;;;25429:30;25495:29;25475:18;;;25468:57;25542:18;;9326:98:0;25215:351:1;9326:98:0;9456:51;;9438:12;;8559:48;;9495:6;;9438:12;9456:51;9438:12;9456:51;9495:6;8559:48;9456:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9437:70;;;9526:7;9518:78;;;;-1:-1:-1;;;9518:78:0;;25773:2:1;9518:78:0;;;25755:21:1;25812:2;25792:18;;;25785:30;25851:34;25831:18;;;25824:62;25922:28;25902:18;;;25895:56;25968:19;;9518:78:0;25571:422:1;34800:824:0;34947:15;;34923:10;:20;34887:22;;34947:15;;;;;;;;34913:30;;34923:20;;;;;34913:9;:30;:::i;:::-;34912:50;;;;:::i;:::-;35021:15;;35003:10;:14;34887:75;;-1:-1:-1;34973:16:0;;35021:15;;;;;;;;34993:24;;35003:14;34993:9;:24;:::i;:::-;34992:44;;;;:::i;:::-;35103:15;;35081:10;:18;34973:63;;-1:-1:-1;35047:20:0;;35103:15;;;;;;;;35071:28;;35081:18;;;;35071:9;:28;:::i;:::-;35070:48;;;;:::i;:::-;35138:20;;35047:71;;-1:-1:-1;35129:46:0;;-1:-1:-1;;;;;35138:20:0;35160:14;35129:8;:46::i;:::-;35195:10;:14;35186:34;;-1:-1:-1;;;;;35195:14:0;35211:8;35186;:34::i;:::-;35235:16;;35231:386;;35272:16;35268:67;;;35323:12;35307;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;35268:67:0;35350:19;35372:16;:14;:16::i;:::-;35350:38;;35407:11;35422:1;35407:16;35403:203;;35451:20;;35442:44;;-1:-1:-1;;;;;35451:20:0;35473:12;35442:8;:44::i;:::-;35403:203;;;35578:11;35543:31;-1:-1:-1;;;35543:12:0;:31;:::i;:::-;35542:47;;;;:::i;:::-;35525:12;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;35253:364:0;34876:748;;;34800:824;;:::o;45301:110::-;45349:7;17142:18;17207:2;17142;:18;:::i;:::-;17128:32;;:11;:32;:::i;:::-;45376:12;;:27;;;;:::i;552:258:1:-;624:1;634:113;648:6;645:1;642:13;634:113;;;724:11;;;718:18;705:11;;;698:39;670:2;663:10;634:113;;;765:6;762:1;759:13;756:48;;;800:1;791:6;786:3;782:16;775:27;756:48;;552:258;;;:::o;815:383::-;964:2;953:9;946:21;927:4;996:6;990:13;1039:6;1034:2;1023:9;1019:18;1012:34;1055:66;1114:6;1109:2;1098:9;1094:18;1089:2;1081:6;1077:15;1055:66;:::i;:::-;1182:2;1161:15;-1:-1:-1;;1157:29:1;1142:45;;;;1189:2;1138:54;;815:383;-1:-1:-1;;815:383:1:o;1203:131::-;-1:-1:-1;;;;;1278:31:1;;1268:42;;1258:70;;1324:1;1321;1314:12;1339:315;1407:6;1415;1468:2;1456:9;1447:7;1443:23;1439:32;1436:52;;;1484:1;1481;1474:12;1436:52;1523:9;1510:23;1542:31;1567:5;1542:31;:::i;:::-;1592:5;1644:2;1629:18;;;;1616:32;;-1:-1:-1;;;1339:315:1:o;2033:118::-;2119:5;2112:13;2105:21;2098:5;2095:32;2085:60;;2141:1;2138;2131:12;2156:382;2221:6;2229;2282:2;2270:9;2261:7;2257:23;2253:32;2250:52;;;2298:1;2295;2288:12;2250:52;2337:9;2324:23;2356:31;2381:5;2356:31;:::i;:::-;2406:5;-1:-1:-1;2463:2:1;2448:18;;2435:32;2476:30;2435:32;2476:30;:::i;:::-;2525:7;2515:17;;;2156:382;;;;;:::o;2543:159::-;2610:20;;2670:6;2659:18;;2649:29;;2639:57;;2692:1;2689;2682:12;2639:57;2543:159;;;:::o;2707:184::-;2765:6;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;2857:28;2875:9;2857:28;:::i;3104:255::-;3171:6;3224:2;3212:9;3203:7;3199:23;3195:32;3192:52;;;3240:1;3237;3230:12;3192:52;3279:9;3266:23;3298:31;3323:5;3298:31;:::i;3364:456::-;3441:6;3449;3457;3510:2;3498:9;3489:7;3485:23;3481:32;3478:52;;;3526:1;3523;3516:12;3478:52;3565:9;3552:23;3584:31;3609:5;3584:31;:::i;:::-;3634:5;-1:-1:-1;3691:2:1;3676:18;;3663:32;3704:33;3663:32;3704:33;:::i;:::-;3364:456;;3756:7;;-1:-1:-1;;;3810:2:1;3795:18;;;;3782:32;;3364:456::o;3825:241::-;3881:6;3934:2;3922:9;3913:7;3909:23;3905:32;3902:52;;;3950:1;3947;3940:12;3902:52;3989:9;3976:23;4008:28;4030:5;4008:28;:::i;4512:180::-;4571:6;4624:2;4612:9;4603:7;4599:23;4595:32;4592:52;;;4640:1;4637;4630:12;4592:52;-1:-1:-1;4663:23:1;;4512:180;-1:-1:-1;4512:180:1:o;4697:401::-;4779:6;4787;4795;4803;4856:3;4844:9;4835:7;4831:23;4827:33;4824:53;;;4873:1;4870;4863:12;4824:53;4896:28;4914:9;4896:28;:::i;:::-;4886:38;;4943:37;4976:2;4965:9;4961:18;4943:37;:::i;:::-;4933:47;;4999:37;5032:2;5021:9;5017:18;4999:37;:::i;:::-;4989:47;;5055:37;5088:2;5077:9;5073:18;5055:37;:::i;:::-;5045:47;;4697:401;;;;;;;:::o;5103:156::-;5169:20;;5229:4;5218:16;;5208:27;;5198:55;;5249:1;5246;5239:12;5264:393;5342:6;5350;5358;5366;5419:3;5407:9;5398:7;5394:23;5390:33;5387:53;;;5436:1;5433;5426:12;5387:53;5459:27;5476:9;5459:27;:::i;:::-;5449:37;;5505:36;5537:2;5526:9;5522:18;5505:36;:::i;:::-;5495:46;;5560:36;5592:2;5581:9;5577:18;5560:36;:::i;:::-;5550:46;;5615:36;5647:2;5636:9;5632:18;5615:36;:::i;5662:313::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:28;5844:9;5826:28;:::i;6613:322::-;6684:6;6692;6700;6753:2;6741:9;6732:7;6728:23;6724:32;6721:52;;;6769:1;6766;6759:12;6721:52;6792:27;6809:9;6792:27;:::i;:::-;6782:37;;6838:36;6870:2;6859:9;6855:18;6838:36;:::i;:::-;6828:46;;6893:36;6925:2;6914:9;6910:18;6893:36;:::i;:::-;6883:46;;6613:322;;;;;:::o;7364:388::-;7432:6;7440;7493:2;7481:9;7472:7;7468:23;7464:32;7461:52;;;7509:1;7506;7499:12;7461:52;7548:9;7535:23;7567:31;7592:5;7567:31;:::i;:::-;7617:5;-1:-1:-1;7674:2:1;7659:18;;7646:32;7687:33;7646:32;7687:33;:::i;8708:344::-;8910:2;8892:21;;;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8983:2:1;8968:18;;8961:50;9043:2;9028:18;;8708:344::o;9057:340::-;9259:2;9241:21;;;9298:2;9278:18;;;9271:30;-1:-1:-1;;;9332:2:1;9317:18;;9310:46;9388:2;9373:18;;9057:340::o;9402:345::-;9604:2;9586:21;;;9643:2;9623:18;;;9616:30;-1:-1:-1;;;9677:2:1;9662:18;;9655:51;9738:2;9723:18;;9402:345::o;9752:127::-;9813:10;9808:3;9804:20;9801:1;9794:31;9844:4;9841:1;9834:15;9868:4;9865:1;9858:15;9884:422;9973:1;10016:5;9973:1;10030:270;10051:7;10041:8;10038:21;10030:270;;;10110:4;10106:1;10102:6;10098:17;10092:4;10089:27;10086:53;;;10119:18;;:::i;:::-;10169:7;10159:8;10155:22;10152:55;;;10189:16;;;;10152:55;10268:22;;;;10228:15;;;;10030:270;;;10034:3;9884:422;;;;;:::o;10311:806::-;10360:5;10390:8;10380:80;;-1:-1:-1;10431:1:1;10445:5;;10380:80;10479:4;10469:76;;-1:-1:-1;10516:1:1;10530:5;;10469:76;10561:4;10579:1;10574:59;;;;10647:1;10642:130;;;;10554:218;;10574:59;10604:1;10595:10;;10618:5;;;10642:130;10679:3;10669:8;10666:17;10663:43;;;10686:18;;:::i;:::-;-1:-1:-1;;10742:1:1;10728:16;;10757:5;;10554:218;;10856:2;10846:8;10843:16;10837:3;10831:4;10828:13;10824:36;10818:2;10808:8;10805:16;10800:2;10794:4;10791:12;10787:35;10784:77;10781:159;;;-1:-1:-1;10893:19:1;;;10925:5;;10781:159;10972:34;10997:8;10991:4;10972:34;:::i;:::-;11042:6;11038:1;11034:6;11030:19;11021:7;11018:32;11015:58;;;11053:18;;:::i;:::-;11091:20;;10311:806;-1:-1:-1;;;10311:806:1:o;11122:140::-;11180:5;11209:47;11250:4;11240:8;11236:19;11230:4;11209:47;:::i;11267:168::-;11307:7;11373:1;11369;11365:6;11361:14;11358:1;11355:21;11350:1;11343:9;11336:17;11332:45;11329:71;;;11380:18;;:::i;:::-;-1:-1:-1;11420:9:1;;11267:168::o;12766:125::-;12806:4;12834:1;12831;12828:8;12825:34;;;12839:18;;:::i;:::-;-1:-1:-1;12876:9:1;;12766:125::o;12896:128::-;12936:3;12967:1;12963:6;12960:1;12957:13;12954:39;;;12973:18;;:::i;:::-;-1:-1:-1;13009:9:1;;12896:128::o;13434:184::-;13504:6;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;-1:-1:-1;13596:16:1;;13434:184;-1:-1:-1;13434:184:1:o;13902:245::-;13969:6;14022:2;14010:9;14001:7;13997:23;13993:32;13990:52;;;14038:1;14035;14028:12;13990:52;14070:9;14064:16;14089:28;14111:5;14089:28;:::i;14152:607::-;-1:-1:-1;;;;;14511:15:1;;;14493:34;;14558:2;14543:18;;14536:34;;;;14601:2;14586:18;;14579:34;;;;14644:2;14629:18;;14622:34;;;;14693:15;;;14687:3;14672:19;;14665:44;14473:3;14725:19;;14718:35;;;;14442:3;14427:19;;14152:607::o;15053:217::-;15093:1;15119;15109:132;;15163:10;15158:3;15154:20;15151:1;15144:31;15198:4;15195:1;15188:15;15226:4;15223:1;15216:15;15109:132;-1:-1:-1;15255:9:1;;15053:217::o;15636:204::-;15674:3;15710:4;15707:1;15703:12;15742:4;15739:1;15735:12;15777:3;15771:4;15767:14;15762:3;15759:23;15756:49;;;15785:18;;:::i;:::-;15821:13;;15636:204;-1:-1:-1;;;15636:204:1:o;15845:195::-;15883:4;15920;15917:1;15913:12;15952:4;15949:1;15945:12;15977:3;15972;15969:12;15966:38;;;15984:18;;:::i;:::-;16021:13;;;15845:195;-1:-1:-1;;;15845:195:1:o;19515:251::-;19585:6;19638:2;19626:9;19617:7;19613:23;19609:32;19606:52;;;19654:1;19651;19644:12;19606:52;19686:9;19680:16;19705:31;19730:5;19705:31;:::i;19771:127::-;19832:10;19827:3;19823:20;19820:1;19813:31;19863:4;19860:1;19853:15;19887:4;19884:1;19877:15;19903:461;19956:3;19994:5;19988:12;20021:6;20016:3;20009:19;20047:4;20076:2;20071:3;20067:12;20060:19;;20113:2;20106:5;20102:14;20134:1;20144:195;20158:6;20155:1;20152:13;20144:195;;;20223:13;;-1:-1:-1;;;;;20219:39:1;20207:52;;20279:12;;;;20314:15;;;;20255:1;20173:9;20144:195;;;-1:-1:-1;20355:3:1;;19903:461;-1:-1:-1;;;;;19903:461:1:o;20369:510::-;20640:6;20629:9;20622:25;20683:3;20678:2;20667:9;20663:18;20656:31;20603:4;20704:57;20756:3;20745:9;20741:19;20733:6;20704:57;:::i;:::-;-1:-1:-1;;;;;20797:32:1;;;;20792:2;20777:18;;20770:60;-1:-1:-1;20861:2:1;20846:18;20839:34;20696:65;20369:510;-1:-1:-1;;20369:510:1:o;21264:127::-;21325:10;21320:3;21316:20;21313:1;21306:31;21356:4;21353:1;21346:15;21380:4;21377:1;21370:15;22445:175;22482:3;22526:4;22519:5;22515:16;22555:4;22546:7;22543:17;22540:43;;22563:18;;:::i;:::-;22612:1;22599:15;;22445:175;-1:-1:-1;;22445:175:1:o;23678:582::-;23977:6;23966:9;23959:25;24020:6;24015:2;24004:9;24000:18;23993:34;24063:3;24058:2;24047:9;24043:18;24036:31;23940:4;24084:57;24136:3;24125:9;24121:19;24113:6;24084:57;:::i;:::-;-1:-1:-1;;;;;24177:32:1;;;;24172:2;24157:18;;24150:60;-1:-1:-1;24241:3:1;24226:19;24219:35;24076:65;23678:582;-1:-1:-1;;;23678:582:1:o;24265:306::-;24353:6;24361;24369;24422:2;24410:9;24401:7;24397:23;24393:32;24390:52;;;24438:1;24435;24428:12;24390:52;24467:9;24461:16;24451:26;;24517:2;24506:9;24502:18;24496:25;24486:35;;24561:2;24550:9;24546:18;24540:25;24530:35;;24265:306;;;;;:::o;24934:276::-;25065:3;25103:6;25097:13;25119:53;25165:6;25160:3;25153:4;25145:6;25141:17;25119:53;:::i;:::-;25188:16;;;;;24934:276;-1:-1:-1;;24934:276:1:o

Swarm Source

ipfs://777860a339b7021314a0cc4b4d1e661a43831bea8da395d20df3cc0aa2fde92d
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.