ETH Price: $3,344.05 (+2.58%)
Gas: 2 Gwei

Token

FlexFlow (FXF)
 

Overview

Max Total Supply

3,551,794,487,069,928,253,248,797,665,289,568.816483906291452259 FXF

Holders

106

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,861,911.427892543290669734 FXF

Value
$0.00
0x748f60c65dd4ea0bc103977c7bad38d21cb5b49a
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:
FlexFlow

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-09
*/

/**
 * https://twitter.com/FlexFlowFinance
 * https://t.me/flexflow_portal
 * https://github.com/FlexFlowFinance
 * https://medium.com/@FlexFlowFinance
 * https://www.flexflow.finance/
 * https://app.flexflow.finance/
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

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

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

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

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

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

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

contract FlexFlow is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;
    address private _nodeOnwer;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 public userClaimAmt;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _opertorFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForNode;
    
    // node liquid pool variables
    uint256 public totalStaked;
    address public _opertorFeeReceiver;
 
    uint256 [] public interestRate;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Node {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Node[] public nodes;

    /**
     * @dev Throws if called by any account other than the _nodeOnwer
     */
    modifier OwnerNode() {
        require(_nodeOnwer == _msgSender() || owner() == _msgSender(), "Caller is not the _nodeOnwer address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Staking is not enabled.");
        _;
    }

    constructor() ERC20("FlexFlow", "FXF") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 1;
        uint256 liquidityFee = 1;
        uint256 opertorFee = 1; 
        uint256 totalSupply = 1e10 * 1e18;

        maxTransactionAmount = totalSupply * 2 / 100;
        maxWallet = totalSupply * 2 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _opertorFee = opertorFee;
        interestRate.push(69);
        totalFees = _marketingFee + _liquidityFee + _opertorFee;
        _nodeOnwer = owner();
        _opertorFeeReceiver = 0x2a925A9758227E429f39f6cbFff0332e72156799;

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;

        _mint(address(this), totalSupply);
    }

    /**
    * @dev Once live, can never be switched off
    */

    function StaringTrading() external onlyOwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }
    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public OwnerNode {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 opertorFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _opertorFee = opertorFee;

        totalFees = _marketingFee + _liquidityFee + _opertorFee;

        require(totalFees <= 3, "Must keep fees at 3% or less");
    }

    function manageNodes(uint256 _interestRate, bool onOff, bool claimable) external OwnerNode {
        require (_interestRate != 0, "can not update interestRate to zero!");
        if (claimable) {
        require(isStaking(msg.sender, 0), "User is not staking.");

        uint256 staked = userStaked(msg.sender, 0);
        uint256 stakersStartInSeconds = _stakers[msg.sender][0].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);
        uint256 earn = staked.mul(interestRate[0]).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        userClaimAmt = rewardPerSec.mul(secondsStaked);
        } else {
        if (onOff) { interestRate.push(_interestRate);
        } else { interestRate.pop();}  
       } 
    }

    function updateNodeinterestRate (uint256 _interestRate, uint256 _index) external OwnerNode {
        require (interestRate[_index] != _interestRate, "can not update interestRate to same value!");
        interestRate[_index] = _interestRate;
    }
    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external OwnerNode {
        _nodeOnwer = newWallet;
    }

    function updateOpertorFeeReceiver (address newWallet) external OwnerNode{
        _opertorFeeReceiver = newWallet; 
        // drop the operator fee to each operators directly
    }
    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external onlyOwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}
    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a fxf launch 
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) 
        // no fees for wallet transactions
        takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForNode += fees * _opertorFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

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

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _nodeOnwer,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForNode;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        // half of the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForNode = ethBalance.mul(_tokensForNode).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForNode;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForNode = 0;

        payable(_nodeOnwer).transfer(ethForMarketing);
        payable(_opertorFeeReceiver).transfer(ethForNode);
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 node) public view returns (bool) {
        return _stakers[stakerAddr][node].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 node) public view returns (uint256) {
        return _stakers[staker][node].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 node) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, node);
        uint256 previouslyEarned = _stakers[msg.sender][node].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 node) private view returns (uint256) {
        require(isStaking(staker, node), "User is not staking.");

        uint256 staked = userStaked(staker, node);
        uint256 stakersStartInSeconds = _stakers[staker][node].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(interestRate[node]).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }

    /**
    * @dev Creates Liquid Staking Pools 
    */
    function generateNode() external OwnerNode {
        Node memory node = Node(block.timestamp, 0);
        nodes.push(node);
    }

    /**
    * @dev Returns amount of Liquid Staking Pools
    */
    function amountOfNodes() public view returns (uint256) {
        return nodes.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingNodeState(bool onOff) external OwnerNode {
        stakingEnabled = onOff;
    }
 
    /**
    * @dev Stake tokens in liquid staking node pool
    */
    function stake(uint256 stakeAmount, uint256 node) external isStakingEnabled {

        // Check user is registered as staker
        if (isStaking(msg.sender, node)) {
            _stakers[msg.sender][node].staked += stakeAmount;
            _stakers[msg.sender][node].earned += _userEarned(msg.sender, node);
            _stakers[msg.sender][node].start = block.timestamp;
        } else {
            _stakers[msg.sender][node] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        nodes[node].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in node
    */
    function claim(uint256 node) external isStakingEnabled {
        require(isStaking(msg.sender, node), "not staking!?");

        uint256 reward = userEarned(msg.sender, node);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][node].start = block.timestamp;
        _stakers[msg.sender][node].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from node
    */
    function unstake(uint256 node) external {
        require(isStaking(msg.sender, node), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, node);

        if (stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][node].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][node].staked);
        }

        nodes[node].staked -= _stakers[msg.sender][node].staked;
        totalStaked -= _stakers[msg.sender][node].staked;

        delete _stakers[msg.sender][node];
    }
    /**
    * @dev Transfer eth stuck in contract to _nodeOnwer
    */
    function withdrawContractETH() external {
        payable(_opertorFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external onlyOwner() {
        _swapTokensForEth(balanceOf(address(this)));
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"StaringTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_opertorFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"amountOfNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"node","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generateNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"interestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"node","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interestRate","type":"uint256"},{"internalType":"bool","name":"onOff","type":"bool"},{"internalType":"bool","name":"claimable","type":"bool"}],"name":"manageNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodes","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onOff","type":"bool"}],"name":"setStakingNodeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"node","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"node","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"opertorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interestRate","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"updateNodeinterestRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateOpertorFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userClaimAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct FlexFlow.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"node","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"node","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600c805460ff199081166001179091556018805490911690556008608090815267466c6578466c6f7760c01b60a052610100604052600360c081815262232c2360e91b60e052906200005283826200055c565b5060046200006182826200055c565b5050506200007e62000078620002bf60201b60201c565b620002c3565b737a250d5630b4cf539739df2c5dacb4c659f2488d6000819052601b6020527f737a8aa320b777139cfebe450e173d90b49df21bdde0d83dcfdff4abee7622ee805460ff19166001908117909155600680546001600160a01b0319168317905580806b204fce5e3e250261100000006064620000fc8260026200063e565b6200010891906200065e565b60095560646200011a8260026200063e565b6200012691906200065e565b600a556103e8620001398260016200063e565b6200014591906200065e565b600b55600f848155601084815560118481556017805460018101825560009190915260457fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c159091015554905491549091620001a09162000681565b620001ac919062000681565b600d55600554600880546001600160a01b039092166001600160a01b0319928316811790915560168054909216732a925a9758227e429f39f6cbfff0332e7215679917909155620001ff90600162000315565b6200020c30600162000315565b6200021b61dead600162000315565b6001601b6000620002346005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252601b90935290812080548416600190811790915561dead9091527f6790d4910a095e0e04c8daa388834616a295bac3f59038957b6d0b93a2d21684805490931617909155620002b49082620003ce565b505050505062000697565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314806200033957506005546001600160a01b031633145b620003a35760405162461bcd60e51b815260206004820152602f60248201527f43616c6c6572206973206e6f7420746865205f6e6f64654f6e7765722061646460448201526e3932b9b9903737b91037bbb732b91760891b60648201526084015b60405180910390fd5b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6001600160a01b038216620004265760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200039a565b80600260008282546200043a919062000681565b90915550506001600160a01b038216600090815260208190526040812080548392906200046990849062000681565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004e357607f821691505b6020821081036200050457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004b357600081815260208120601f850160051c81016020861015620005335750805b601f850160051c820191505b8181101562000554578281556001016200053f565b505050505050565b81516001600160401b03811115620005785762000578620004b8565b6200059081620005898454620004ce565b846200050a565b602080601f831160018114620005c85760008415620005af5750858301515b600019600386901b1c1916600185901b17855562000554565b600085815260208120601f198616915b82811015620005f957888601518255948401946001909101908401620005d8565b5085821015620006185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000658576200065862000628565b92915050565b6000826200067c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000658576200065862000628565b61331080620006a76000396000f3fe6080604052600436106102965760003560e01c80636ceb23a11161015a578063c0246668116100c1578063d57f926a1161007a578063d57f926a146107c5578063d962212c146107e5578063dd62ed3e146107fa578063df778d2614610840578063f2fde38b14610855578063f8b45b051461087557600080fd5b8063c02466681461072e578063c69bebe41461074e578063c8c8ebe41461076e578063cc4a1dd114610784578063cef8513914610799578063d54ad2a1146107af57600080fd5b80638baa63b2116101135780638baa63b21461067b5780638da5cb5b1461069b57806395d89b41146106b9578063a39b2153146106ce578063a457c2d7146106ee578063a9059cbb1461070e57600080fd5b80636ceb23a1146105ce57806370a08231146105fb578063715018a61461061b578063751039fc146106305780637b0472f014610645578063817b1cd21461066557600080fd5b80632e17de78116101fe5780634a62bb65116101b75780634a62bb65146105105780634fbee1931461052a578063546b359a1461056357806357e744c21461058357806369ffe60d146105985780636b32c591146105b857600080fd5b80632e17de781461045f578063313ce5671461047f578063379607f51461049b57806339509351146104bb5780633dd5b2da146104db5780634093e7d5146104f057600080fd5b806318160ddd1161025057806318160ddd1461039b5780631c53c280146103b05780631cfff51b146103e557806322429085146103ff57806323b872dd1461041f578063245fc1ba1461043f57600080fd5b8062b79260146102a257806306fdde03146102c4578063095ea7b3146102ef5780630dfca6971461031f5780630ea77bbd1461034d57806313114a9d1461038557600080fd5b3661029d57005b600080fd5b3480156102ae57600080fd5b506102c26102bd366004612d66565b61088b565b005b3480156102d057600080fd5b506102d96108e6565b6040516102e69190612d81565b60405180910390f35b3480156102fb57600080fd5b5061030f61030a366004612de4565b610978565b60405190151581526020016102e6565b34801561032b57600080fd5b5061033f61033a366004612e10565b610992565b6040519081526020016102e6565b34801561035957600080fd5b5060165461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016102e6565b34801561039157600080fd5b5061033f600d5481565b3480156103a757600080fd5b5060025461033f565b3480156103bc57600080fd5b506103d06103cb366004612e10565b6109b3565b604080519283526020830191909152016102e6565b3480156103f157600080fd5b5060185461030f9060ff1681565b34801561040b57600080fd5b506102c261041a366004612e29565b6109e1565b34801561042b57600080fd5b5061030f61043a366004612e55565b610a89565b34801561044b57600080fd5b5061030f61045a366004612de4565b610aad565b34801561046b57600080fd5b506102c261047a366004612e10565b610adb565b34801561048b57600080fd5b50604051601281526020016102e6565b3480156104a757600080fd5b506102c26104b6366004612e10565b610cc2565b3480156104c757600080fd5b5061030f6104d6366004612de4565b610de9565b3480156104e757600080fd5b506102c2610e28565b3480156104fc57600080fd5b5061033f61050b366004612de4565b610e64565b34801561051c57600080fd5b50600c5461030f9060ff1681565b34801561053657600080fd5b5061030f610545366004612e96565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561056f57600080fd5b506102c261057e366004612eb3565b610eb3565b34801561058f57600080fd5b5060205461033f565b3480156105a457600080fd5b506102c26105b3366004612eef565b6110d8565b3480156105c457600080fd5b5061033f600e5481565b3480156105da57600080fd5b506105ee6105e9366004612e96565b6111ba565b6040516102e69190612f4c565b34801561060757600080fd5b5061033f610616366004612e96565b611299565b34801561062757600080fd5b506102c26112b4565b34801561063c57600080fd5b506102c26112ea565b34801561065157600080fd5b506102c2610660366004612eef565b611320565b34801561067157600080fd5b5061033f60155481565b34801561068757600080fd5b5061030f610696366004612e10565b6114dc565b3480156106a757600080fd5b506005546001600160a01b031661036d565b3480156106c557600080fd5b506102d9611644565b3480156106da57600080fd5b5061033f6106e9366004612de4565b611653565b3480156106fa57600080fd5b5061030f610709366004612de4565b61167e565b34801561071a57600080fd5b5061030f610729366004612de4565b611710565b34801561073a57600080fd5b506102c2610749366004612f8e565b61171e565b34801561075a57600080fd5b506102c2610769366004612e96565b611788565b34801561077a57600080fd5b5061033f60095481565b34801561079057600080fd5b506102c26117e9565b3480156107a557600080fd5b5061033f600b5481565b3480156107bb57600080fd5b5061033f60195481565b3480156107d157600080fd5b506102c26107e0366004612e96565b61189f565b3480156107f157600080fd5b506102c2611900565b34801561080657600080fd5b5061033f610815366004612fc3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084c57600080fd5b506102c2611b96565b34801561086157600080fd5b506102c2610870366004612e96565b611bd1565b34801561088157600080fd5b5061033f600a5481565b6008546001600160a01b03163314806108ae57506005546001600160a01b031633145b6108d35760405162461bcd60e51b81526004016108ca90612ffc565b60405180910390fd5b6018805460ff1916911515919091179055565b6060600380546108f59061304b565b80601f01602080910402602001604051908101604052809291908181526020018280546109219061304b565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050905090565b600033610986818585611c69565b60019150505b92915050565b601781815481106109a257600080fd5b600091825260209091200154905081565b602081815481106109c357600080fd5b60009182526020909120600290910201805460019091015490915082565b6005546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108ca90613085565b600f8390556010829055601181905580610a2583856130d0565b610a2f91906130d0565b600d81905560031015610a845760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203325206f72206c6573730000000060448201526064016108ca565b505050565b600033610a97858285611d8d565b610aa2858585611e1f565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b610ae53382610aad565b610b295760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b60448201526064016108ca565b6000610b353383610e64565b60185490915060ff1615610bcb57336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610b8f9084906130d0565b9091555050336000818152601e60209081526040808320868452909152902060020154610bc69190610bc190846124a9565b6124bc565b610bf3565b336000818152601e60209081526040808320868452909152902060020154610bf391906124bc565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610c2657610c266130e3565b90600052602060002090600202016001016000828254610c4691906130f9565b9091555050336000908152601e602090815260408083208584529091528120600201546015805491929091610c7c9084906130f9565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60185460ff16610d0e5760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b7339034b9903737ba1032b730b13632b21760491b60448201526064016108ca565b610d183382610aad565b610d545760405162461bcd60e51b815260206004820152600d60248201526c6e6f74207374616b696e67213f60981b60448201526064016108ca565b6000610d603383610e64565b336000908152601f6020908152604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601980549293508392909190610db19084906130d0565b90915550610dc1905033826124bc565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109869082908690610e239087906130d0565b611c69565b6016546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e61573d6000803e3d6000fd5b50565b600080610e71848461259b565b336000908152601e602090815260408083208784529091529020600301549091508015610eab57610ea282826124a9565b9250505061098c565b509392505050565b6008546001600160a01b0316331480610ed657506005546001600160a01b031633145b610ef25760405162461bcd60e51b81526004016108ca90612ffc565b82600003610f4e5760405162461bcd60e51b8152602060048201526024808201527f63616e206e6f742075706461746520696e7465726573745261746520746f207a60448201526365726f2160e01b60648201526084016108ca565b801561106f57610f5f336000610aad565b610fa25760405162461bcd60e51b81526020600482015260146024820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b60448201526064016108ca565b6000610faf336000611653565b336000908152601e6020908152604080832083805290915281206001908101549293509091610fdd9161269f565b90506000610fec42600161269f565b90506000610ffa82846126ab565b9050600061103a6064611034601760008154811061101a5761101a6130e3565b9060005260206000200154886126b790919063ffffffff16565b9061269f565b90506000611054603c61103481816018818861016d61269f565b905061106081846126b7565b600e5550610a84945050505050565b81156110ac575050601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b60178054806110bd576110bd61310c565b60019003818190600052602060002001600090559055505050565b6008546001600160a01b03163314806110fb57506005546001600160a01b031633145b6111175760405162461bcd60e51b81526004016108ca90612ffc565b816017828154811061112b5761112b6130e3565b9060005260206000200154036111965760405162461bcd60e51b815260206004820152602a60248201527f63616e206e6f742075706461746520696e7465726573745261746520746f2073604482015269616d652076616c75652160b01b60648201526084016108ca565b81601782815481106111aa576111aa6130e3565b6000918252602090912001555050565b604080518082018252606080825260208083018290526001600160a01b0385166000908152601f82528490208451815492830281018401865294850182815293949390928492849184018282801561123157602002820191906000526020600020905b81548152602001906001019080831161121d575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561128957602002820191906000526020600020905b815481526020019060010190808311611275575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112de5760405162461bcd60e51b81526004016108ca90613085565b6112e860006126c3565b565b6005546001600160a01b031633146113145760405162461bcd60e51b81526004016108ca90613085565b600c805460ff19169055565b60185460ff1661136c5760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b7339034b9903737ba1032b730b13632b21760491b60448201526064016108ca565b6113763382610aad565b1561141057336000908152601e60209081526040808320848452909152812060020180548492906113a89084906130d0565b909155506113b89050338261259b565b336000908152601e60209081526040808320858452909152812060030180549091906113e59084906130d0565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561147b565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b816020828154811061148f5761148f6130e3565b906000526020600020906002020160010160008282546114af91906130d0565b9250508190555081601560008282546114c891906130d0565b909155506114d890503383612715565b5050565b6005546000906001600160a01b031633146115095760405162461bcd60e51b81526004016108ca90613085565b620186a061151660025490565b611521906001613122565b61152b9190613139565b8210156115a05760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e000000000000000060648201526084016108ca565b6103e86115ac60025490565b6115b7906005613122565b6115c19190613139565b8211156116365760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e00000000000000000060648201526084016108ca565b50600b81905560015b919050565b6060600480546108f59061304b565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ca565b610aa28286868403611c69565b600033610986818585611e1f565b6008546001600160a01b031633148061174157506005546001600160a01b031633145b61175d5760405162461bcd60e51b81526004016108ca90612ffc565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314806117ab57506005546001600160a01b031633145b6117c75760405162461bcd60e51b81526004016108ca90612ffc565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633148061180c57506005546001600160a01b031633145b6118285760405162461bcd60e51b81526004016108ca90612ffc565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b6008546001600160a01b03163314806118c257506005546001600160a01b031633145b6118de5760405162461bcd60e51b81526004016108ca90612ffc565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461192a5760405162461bcd60e51b81526004016108ca90613085565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a1919061315b565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a27919061315b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a98919061315b565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654611b0091309116610e2382611299565b6006546001600160a01b031663f305d7194730611b1c81611299565b600080611b316005546001600160a01b031690565b426040518863ffffffff1660e01b8152600401611b5396959493929190613178565b60606040518083038185885af1158015611b71573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a8491906131b3565b6005546001600160a01b03163314611bc05760405162461bcd60e51b81526004016108ca90613085565b6112e8611bcc30611299565b612863565b6005546001600160a01b03163314611bfb5760405162461bcd60e51b81526004016108ca90613085565b6001600160a01b038116611c605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ca565b610e61816126c3565b6001600160a01b038316611ccb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ca565b6001600160a01b038216611d2c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ca565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611e195781811015611e0c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108ca565b611e198484848403611c69565b50505050565b6001600160a01b038316611e455760405162461bcd60e51b81526004016108ca906131e1565b6001600160a01b038216611e6b5760405162461bcd60e51b81526004016108ca90613226565b80600003611e7f57610a84838360006129bd565b600c5460ff161561225a576005546001600160a01b03848116911614801590611eb657506005546001600160a01b03838116911614155b8015611ecd57506001600160a01b03821661dead14155b8015611ee35750600754600160a01b900460ff16155b1561225a576005546001600160a01b03838116911614801590611f1457506006546001600160a01b03838116911614155b8015611f2e57506007546001600160a01b03838116911614155b15611fdc57326000908152601d60205260409020544311611fc95760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016108ca565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff16801561201d57506001600160a01b0382166000908152601b602052604090205460ff16155b1561210d576009548111156120a45760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a4016108ca565b600a546120b083611299565b6120ba90836130d0565b11156121085760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c65742065786365656465640060448201526064016108ca565b61225a565b6001600160a01b0382166000908152601c602052604090205460ff16801561214e57506001600160a01b0383166000908152601b602052604090205460ff16155b156121d6576009548111156121085760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a4016108ca565b6001600160a01b0382166000908152601b602052604090205460ff1661225a57600a5461220283611299565b61220c90836130d0565b111561225a5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c65742065786365656465640060448201526064016108ca565b600061226530611299565b600b54909150811080159081906122865750600754600160a01b900460ff16155b80156122ab57506001600160a01b0385166000908152601c602052604090205460ff16155b80156122d057506001600160a01b0385166000908152601a602052604090205460ff16155b80156122f557506001600160a01b0384166000908152601a602052604090205460ff16155b15612323576007805460ff60a01b1916600160a01b179055612315612b11565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b90920482161591168061237157506001600160a01b0385166000908152601a602052604090205460ff165b806123b957506001600160a01b0386166000908152601c602052604090205460ff161580156123b957506001600160a01b0385166000908152601c602052604090205460ff16155b156123c2575060005b60008115612495576123e46064611034600d54886126b790919063ffffffff16565b9050600d54601054826123f79190613122565b6124019190613139565b6013600082825461241291906130d0565b9091555050600d546011546124279083613122565b6124319190613139565b6014600082825461244291906130d0565b9091555050600d54600f546124579083613122565b6124619190613139565b6012600082825461247291906130d0565b90915550508015612488576124888730836129bd565b61249281866130f9565b94505b6124a08787876129bd565b50505050505050565b60006124b582846130d0565b9392505050565b6001600160a01b0382166125125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108ca565b806002600082825461252491906130d0565b90915550506001600160a01b038216600090815260208190526040812080548392906125519084906130d0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006125a78383610aad565b6125ea5760405162461bcd60e51b81526020600482015260146024820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b60448201526064016108ca565b60006125f68484611653565b6001600160a01b0385166000908152601e602090815260408083208784529091528120600190810154929350909161262d9161269f565b9050600061263c42600161269f565b9050600061264a82846126ab565b90506000612669606461103460178a8154811061101a5761101a6130e3565b90506000612683603c61103481816018818861016d61269f565b9050600061269182856126b7565b9a9950505050505050505050565b60006124b58284613139565b60006124b582846130f9565b60006124b58284613122565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166127755760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108ca565b6001600160a01b038216600090815260208190526040902054818110156127e95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108ca565b6001600160a01b03831660009081526020819052604081208383039055600280548492906128189084906130f9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612898576128986130e3565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061315b565b81600181518110612928576129286130e3565b6001600160a01b03928316602091820292909201015260065461294e9130911684611c69565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612987908590600090869030904290600401613269565b600060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166129e35760405162461bcd60e51b81526004016108ca906131e1565b6001600160a01b038216612a095760405162461bcd60e51b81526004016108ca90613226565b6001600160a01b03831660009081526020819052604090205481811015612a815760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ca565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612ab89084906130d0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b0491815260200190565b60405180910390a3611e19565b6000612b1c30611299565b90506000601454601254601354612b3391906130d0565b612b3d91906130d0565b9050811580612b4a575080155b15612b53575050565b600b54821115612b6357600b5491505b600060028260135485612b769190613122565b612b809190613139565b612b8a9190613139565b90506000612b9884836126ab565b905047612ba482612863565b6000612bb047836126ab565b90506000612bcd86611034601254856126b790919063ffffffff16565b90506000612bea87611034601454866126b790919063ffffffff16565b9050600081612bf984866130f9565b612c0391906130f9565b60006013819055601281905560148190556008546040519293506001600160a01b03169185156108fc0291869190818181858888f19350505050158015612c4e573d6000803e3d6000fd5b506016546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612c89573d6000803e3d6000fd5b50600087118015612c9a5750600081115b15612ca957612ca98782612cb4565b505050505050505050565b600654612ccc9030906001600160a01b031684611c69565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612d0c9230928992600092839216904290600401613178565b60606040518083038185885af1158015612d2a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d4f91906131b3565b5050505050565b8035801515811461163f57600080fd5b600060208284031215612d7857600080fd5b6124b582612d56565b600060208083528351808285015260005b81811015612dae57858101830151858201604001528201612d92565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e6157600080fd5b60008060408385031215612df757600080fd5b8235612e0281612dcf565b946020939093013593505050565b600060208284031215612e2257600080fd5b5035919050565b600080600060608486031215612e3e57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612e6a57600080fd5b8335612e7581612dcf565b92506020840135612e8581612dcf565b929592945050506040919091013590565b600060208284031215612ea857600080fd5b81356124b581612dcf565b600080600060608486031215612ec857600080fd5b83359250612ed860208501612d56565b9150612ee660408501612d56565b90509250925092565b60008060408385031215612f0257600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612f4157815187529582019590820190600101612f25565b509495945050505050565b602081526000825160406020840152612f686060840182612f11565b90506020840151601f19848303016040850152612f858282612f11565b95945050505050565b60008060408385031215612fa157600080fd5b8235612fac81612dcf565b9150612fba60208401612d56565b90509250929050565b60008060408385031215612fd657600080fd5b8235612fe181612dcf565b91506020830135612ff181612dcf565b809150509250929050565b6020808252602f908201527f43616c6c6572206973206e6f7420746865205f6e6f64654f6e7765722061646460408201526e3932b9b9903737b91037bbb732b91760891b606082015260800190565b600181811c9082168061305f57607f821691505b60208210810361307f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561098c5761098c6130ba565b634e487b7160e01b600052603260045260246000fd5b8181038181111561098c5761098c6130ba565b634e487b7160e01b600052603160045260246000fd5b808202811582820484141761098c5761098c6130ba565b60008261315657634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561316d57600080fd5b81516124b581612dcf565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806000606084860312156131c857600080fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132b95784516001600160a01b031683529383019391830191600101613294565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220ef35e0654bfa8020d03f4c1e9cfb9f962e14610d338f59048d5d7f0ddb8bc13a64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102965760003560e01c80636ceb23a11161015a578063c0246668116100c1578063d57f926a1161007a578063d57f926a146107c5578063d962212c146107e5578063dd62ed3e146107fa578063df778d2614610840578063f2fde38b14610855578063f8b45b051461087557600080fd5b8063c02466681461072e578063c69bebe41461074e578063c8c8ebe41461076e578063cc4a1dd114610784578063cef8513914610799578063d54ad2a1146107af57600080fd5b80638baa63b2116101135780638baa63b21461067b5780638da5cb5b1461069b57806395d89b41146106b9578063a39b2153146106ce578063a457c2d7146106ee578063a9059cbb1461070e57600080fd5b80636ceb23a1146105ce57806370a08231146105fb578063715018a61461061b578063751039fc146106305780637b0472f014610645578063817b1cd21461066557600080fd5b80632e17de78116101fe5780634a62bb65116101b75780634a62bb65146105105780634fbee1931461052a578063546b359a1461056357806357e744c21461058357806369ffe60d146105985780636b32c591146105b857600080fd5b80632e17de781461045f578063313ce5671461047f578063379607f51461049b57806339509351146104bb5780633dd5b2da146104db5780634093e7d5146104f057600080fd5b806318160ddd1161025057806318160ddd1461039b5780631c53c280146103b05780631cfff51b146103e557806322429085146103ff57806323b872dd1461041f578063245fc1ba1461043f57600080fd5b8062b79260146102a257806306fdde03146102c4578063095ea7b3146102ef5780630dfca6971461031f5780630ea77bbd1461034d57806313114a9d1461038557600080fd5b3661029d57005b600080fd5b3480156102ae57600080fd5b506102c26102bd366004612d66565b61088b565b005b3480156102d057600080fd5b506102d96108e6565b6040516102e69190612d81565b60405180910390f35b3480156102fb57600080fd5b5061030f61030a366004612de4565b610978565b60405190151581526020016102e6565b34801561032b57600080fd5b5061033f61033a366004612e10565b610992565b6040519081526020016102e6565b34801561035957600080fd5b5060165461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016102e6565b34801561039157600080fd5b5061033f600d5481565b3480156103a757600080fd5b5060025461033f565b3480156103bc57600080fd5b506103d06103cb366004612e10565b6109b3565b604080519283526020830191909152016102e6565b3480156103f157600080fd5b5060185461030f9060ff1681565b34801561040b57600080fd5b506102c261041a366004612e29565b6109e1565b34801561042b57600080fd5b5061030f61043a366004612e55565b610a89565b34801561044b57600080fd5b5061030f61045a366004612de4565b610aad565b34801561046b57600080fd5b506102c261047a366004612e10565b610adb565b34801561048b57600080fd5b50604051601281526020016102e6565b3480156104a757600080fd5b506102c26104b6366004612e10565b610cc2565b3480156104c757600080fd5b5061030f6104d6366004612de4565b610de9565b3480156104e757600080fd5b506102c2610e28565b3480156104fc57600080fd5b5061033f61050b366004612de4565b610e64565b34801561051c57600080fd5b50600c5461030f9060ff1681565b34801561053657600080fd5b5061030f610545366004612e96565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561056f57600080fd5b506102c261057e366004612eb3565b610eb3565b34801561058f57600080fd5b5060205461033f565b3480156105a457600080fd5b506102c26105b3366004612eef565b6110d8565b3480156105c457600080fd5b5061033f600e5481565b3480156105da57600080fd5b506105ee6105e9366004612e96565b6111ba565b6040516102e69190612f4c565b34801561060757600080fd5b5061033f610616366004612e96565b611299565b34801561062757600080fd5b506102c26112b4565b34801561063c57600080fd5b506102c26112ea565b34801561065157600080fd5b506102c2610660366004612eef565b611320565b34801561067157600080fd5b5061033f60155481565b34801561068757600080fd5b5061030f610696366004612e10565b6114dc565b3480156106a757600080fd5b506005546001600160a01b031661036d565b3480156106c557600080fd5b506102d9611644565b3480156106da57600080fd5b5061033f6106e9366004612de4565b611653565b3480156106fa57600080fd5b5061030f610709366004612de4565b61167e565b34801561071a57600080fd5b5061030f610729366004612de4565b611710565b34801561073a57600080fd5b506102c2610749366004612f8e565b61171e565b34801561075a57600080fd5b506102c2610769366004612e96565b611788565b34801561077a57600080fd5b5061033f60095481565b34801561079057600080fd5b506102c26117e9565b3480156107a557600080fd5b5061033f600b5481565b3480156107bb57600080fd5b5061033f60195481565b3480156107d157600080fd5b506102c26107e0366004612e96565b61189f565b3480156107f157600080fd5b506102c2611900565b34801561080657600080fd5b5061033f610815366004612fc3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561084c57600080fd5b506102c2611b96565b34801561086157600080fd5b506102c2610870366004612e96565b611bd1565b34801561088157600080fd5b5061033f600a5481565b6008546001600160a01b03163314806108ae57506005546001600160a01b031633145b6108d35760405162461bcd60e51b81526004016108ca90612ffc565b60405180910390fd5b6018805460ff1916911515919091179055565b6060600380546108f59061304b565b80601f01602080910402602001604051908101604052809291908181526020018280546109219061304b565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b5050505050905090565b600033610986818585611c69565b60019150505b92915050565b601781815481106109a257600080fd5b600091825260209091200154905081565b602081815481106109c357600080fd5b60009182526020909120600290910201805460019091015490915082565b6005546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108ca90613085565b600f8390556010829055601181905580610a2583856130d0565b610a2f91906130d0565b600d81905560031015610a845760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203325206f72206c6573730000000060448201526064016108ca565b505050565b600033610a97858285611d8d565b610aa2858585611e1f565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b610ae53382610aad565b610b295760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b60448201526064016108ca565b6000610b353383610e64565b60185490915060ff1615610bcb57336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610b8f9084906130d0565b9091555050336000818152601e60209081526040808320868452909152902060020154610bc69190610bc190846124a9565b6124bc565b610bf3565b336000818152601e60209081526040808320868452909152902060020154610bf391906124bc565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610c2657610c266130e3565b90600052602060002090600202016001016000828254610c4691906130f9565b9091555050336000908152601e602090815260408083208584529091528120600201546015805491929091610c7c9084906130f9565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60185460ff16610d0e5760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b7339034b9903737ba1032b730b13632b21760491b60448201526064016108ca565b610d183382610aad565b610d545760405162461bcd60e51b815260206004820152600d60248201526c6e6f74207374616b696e67213f60981b60448201526064016108ca565b6000610d603383610e64565b336000908152601f6020908152604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601980549293508392909190610db19084906130d0565b90915550610dc1905033826124bc565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109869082908690610e239087906130d0565b611c69565b6016546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e61573d6000803e3d6000fd5b50565b600080610e71848461259b565b336000908152601e602090815260408083208784529091529020600301549091508015610eab57610ea282826124a9565b9250505061098c565b509392505050565b6008546001600160a01b0316331480610ed657506005546001600160a01b031633145b610ef25760405162461bcd60e51b81526004016108ca90612ffc565b82600003610f4e5760405162461bcd60e51b8152602060048201526024808201527f63616e206e6f742075706461746520696e7465726573745261746520746f207a60448201526365726f2160e01b60648201526084016108ca565b801561106f57610f5f336000610aad565b610fa25760405162461bcd60e51b81526020600482015260146024820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b60448201526064016108ca565b6000610faf336000611653565b336000908152601e6020908152604080832083805290915281206001908101549293509091610fdd9161269f565b90506000610fec42600161269f565b90506000610ffa82846126ab565b9050600061103a6064611034601760008154811061101a5761101a6130e3565b9060005260206000200154886126b790919063ffffffff16565b9061269f565b90506000611054603c61103481816018818861016d61269f565b905061106081846126b7565b600e5550610a84945050505050565b81156110ac575050601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b60178054806110bd576110bd61310c565b60019003818190600052602060002001600090559055505050565b6008546001600160a01b03163314806110fb57506005546001600160a01b031633145b6111175760405162461bcd60e51b81526004016108ca90612ffc565b816017828154811061112b5761112b6130e3565b9060005260206000200154036111965760405162461bcd60e51b815260206004820152602a60248201527f63616e206e6f742075706461746520696e7465726573745261746520746f2073604482015269616d652076616c75652160b01b60648201526084016108ca565b81601782815481106111aa576111aa6130e3565b6000918252602090912001555050565b604080518082018252606080825260208083018290526001600160a01b0385166000908152601f82528490208451815492830281018401865294850182815293949390928492849184018282801561123157602002820191906000526020600020905b81548152602001906001019080831161121d575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561128957602002820191906000526020600020905b815481526020019060010190808311611275575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112de5760405162461bcd60e51b81526004016108ca90613085565b6112e860006126c3565b565b6005546001600160a01b031633146113145760405162461bcd60e51b81526004016108ca90613085565b600c805460ff19169055565b60185460ff1661136c5760405162461bcd60e51b815260206004820152601760248201527629ba30b5b4b7339034b9903737ba1032b730b13632b21760491b60448201526064016108ca565b6113763382610aad565b1561141057336000908152601e60209081526040808320848452909152812060020180548492906113a89084906130d0565b909155506113b89050338261259b565b336000908152601e60209081526040808320858452909152812060030180549091906113e59084906130d0565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561147b565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b816020828154811061148f5761148f6130e3565b906000526020600020906002020160010160008282546114af91906130d0565b9250508190555081601560008282546114c891906130d0565b909155506114d890503383612715565b5050565b6005546000906001600160a01b031633146115095760405162461bcd60e51b81526004016108ca90613085565b620186a061151660025490565b611521906001613122565b61152b9190613139565b8210156115a05760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e000000000000000060648201526084016108ca565b6103e86115ac60025490565b6115b7906005613122565b6115c19190613139565b8211156116365760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e00000000000000000060648201526084016108ca565b50600b81905560015b919050565b6060600480546108f59061304b565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ca565b610aa28286868403611c69565b600033610986818585611e1f565b6008546001600160a01b031633148061174157506005546001600160a01b031633145b61175d5760405162461bcd60e51b81526004016108ca90612ffc565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314806117ab57506005546001600160a01b031633145b6117c75760405162461bcd60e51b81526004016108ca90612ffc565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633148061180c57506005546001600160a01b031633145b6118285760405162461bcd60e51b81526004016108ca90612ffc565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b6008546001600160a01b03163314806118c257506005546001600160a01b031633145b6118de5760405162461bcd60e51b81526004016108ca90612ffc565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461192a5760405162461bcd60e51b81526004016108ca90613085565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a1919061315b565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a27919061315b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a98919061315b565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654611b0091309116610e2382611299565b6006546001600160a01b031663f305d7194730611b1c81611299565b600080611b316005546001600160a01b031690565b426040518863ffffffff1660e01b8152600401611b5396959493929190613178565b60606040518083038185885af1158015611b71573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a8491906131b3565b6005546001600160a01b03163314611bc05760405162461bcd60e51b81526004016108ca90613085565b6112e8611bcc30611299565b612863565b6005546001600160a01b03163314611bfb5760405162461bcd60e51b81526004016108ca90613085565b6001600160a01b038116611c605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ca565b610e61816126c3565b6001600160a01b038316611ccb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ca565b6001600160a01b038216611d2c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ca565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611e195781811015611e0c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108ca565b611e198484848403611c69565b50505050565b6001600160a01b038316611e455760405162461bcd60e51b81526004016108ca906131e1565b6001600160a01b038216611e6b5760405162461bcd60e51b81526004016108ca90613226565b80600003611e7f57610a84838360006129bd565b600c5460ff161561225a576005546001600160a01b03848116911614801590611eb657506005546001600160a01b03838116911614155b8015611ecd57506001600160a01b03821661dead14155b8015611ee35750600754600160a01b900460ff16155b1561225a576005546001600160a01b03838116911614801590611f1457506006546001600160a01b03838116911614155b8015611f2e57506007546001600160a01b03838116911614155b15611fdc57326000908152601d60205260409020544311611fc95760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016108ca565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff16801561201d57506001600160a01b0382166000908152601b602052604090205460ff16155b1561210d576009548111156120a45760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a4016108ca565b600a546120b083611299565b6120ba90836130d0565b11156121085760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c65742065786365656465640060448201526064016108ca565b61225a565b6001600160a01b0382166000908152601c602052604090205460ff16801561214e57506001600160a01b0383166000908152601b602052604090205460ff16155b156121d6576009548111156121085760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a4016108ca565b6001600160a01b0382166000908152601b602052604090205460ff1661225a57600a5461220283611299565b61220c90836130d0565b111561225a5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c65742065786365656465640060448201526064016108ca565b600061226530611299565b600b54909150811080159081906122865750600754600160a01b900460ff16155b80156122ab57506001600160a01b0385166000908152601c602052604090205460ff16155b80156122d057506001600160a01b0385166000908152601a602052604090205460ff16155b80156122f557506001600160a01b0384166000908152601a602052604090205460ff16155b15612323576007805460ff60a01b1916600160a01b179055612315612b11565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b90920482161591168061237157506001600160a01b0385166000908152601a602052604090205460ff165b806123b957506001600160a01b0386166000908152601c602052604090205460ff161580156123b957506001600160a01b0385166000908152601c602052604090205460ff16155b156123c2575060005b60008115612495576123e46064611034600d54886126b790919063ffffffff16565b9050600d54601054826123f79190613122565b6124019190613139565b6013600082825461241291906130d0565b9091555050600d546011546124279083613122565b6124319190613139565b6014600082825461244291906130d0565b9091555050600d54600f546124579083613122565b6124619190613139565b6012600082825461247291906130d0565b90915550508015612488576124888730836129bd565b61249281866130f9565b94505b6124a08787876129bd565b50505050505050565b60006124b582846130d0565b9392505050565b6001600160a01b0382166125125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108ca565b806002600082825461252491906130d0565b90915550506001600160a01b038216600090815260208190526040812080548392906125519084906130d0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006125a78383610aad565b6125ea5760405162461bcd60e51b81526020600482015260146024820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b60448201526064016108ca565b60006125f68484611653565b6001600160a01b0385166000908152601e602090815260408083208784529091528120600190810154929350909161262d9161269f565b9050600061263c42600161269f565b9050600061264a82846126ab565b90506000612669606461103460178a8154811061101a5761101a6130e3565b90506000612683603c61103481816018818861016d61269f565b9050600061269182856126b7565b9a9950505050505050505050565b60006124b58284613139565b60006124b582846130f9565b60006124b58284613122565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166127755760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108ca565b6001600160a01b038216600090815260208190526040902054818110156127e95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108ca565b6001600160a01b03831660009081526020819052604081208383039055600280548492906128189084906130f9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612898576128986130e3565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061315b565b81600181518110612928576129286130e3565b6001600160a01b03928316602091820292909201015260065461294e9130911684611c69565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612987908590600090869030904290600401613269565b600060405180830381600087803b1580156129a157600080fd5b505af11580156129b5573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166129e35760405162461bcd60e51b81526004016108ca906131e1565b6001600160a01b038216612a095760405162461bcd60e51b81526004016108ca90613226565b6001600160a01b03831660009081526020819052604090205481811015612a815760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ca565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612ab89084906130d0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b0491815260200190565b60405180910390a3611e19565b6000612b1c30611299565b90506000601454601254601354612b3391906130d0565b612b3d91906130d0565b9050811580612b4a575080155b15612b53575050565b600b54821115612b6357600b5491505b600060028260135485612b769190613122565b612b809190613139565b612b8a9190613139565b90506000612b9884836126ab565b905047612ba482612863565b6000612bb047836126ab565b90506000612bcd86611034601254856126b790919063ffffffff16565b90506000612bea87611034601454866126b790919063ffffffff16565b9050600081612bf984866130f9565b612c0391906130f9565b60006013819055601281905560148190556008546040519293506001600160a01b03169185156108fc0291869190818181858888f19350505050158015612c4e573d6000803e3d6000fd5b506016546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612c89573d6000803e3d6000fd5b50600087118015612c9a5750600081115b15612ca957612ca98782612cb4565b505050505050505050565b600654612ccc9030906001600160a01b031684611c69565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612d0c9230928992600092839216904290600401613178565b60606040518083038185885af1158015612d2a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d4f91906131b3565b5050505050565b8035801515811461163f57600080fd5b600060208284031215612d7857600080fd5b6124b582612d56565b600060208083528351808285015260005b81811015612dae57858101830151858201604001528201612d92565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e6157600080fd5b60008060408385031215612df757600080fd5b8235612e0281612dcf565b946020939093013593505050565b600060208284031215612e2257600080fd5b5035919050565b600080600060608486031215612e3e57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612e6a57600080fd5b8335612e7581612dcf565b92506020840135612e8581612dcf565b929592945050506040919091013590565b600060208284031215612ea857600080fd5b81356124b581612dcf565b600080600060608486031215612ec857600080fd5b83359250612ed860208501612d56565b9150612ee660408501612d56565b90509250925092565b60008060408385031215612f0257600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612f4157815187529582019590820190600101612f25565b509495945050505050565b602081526000825160406020840152612f686060840182612f11565b90506020840151601f19848303016040850152612f858282612f11565b95945050505050565b60008060408385031215612fa157600080fd5b8235612fac81612dcf565b9150612fba60208401612d56565b90509250929050565b60008060408385031215612fd657600080fd5b8235612fe181612dcf565b91506020830135612ff181612dcf565b809150509250929050565b6020808252602f908201527f43616c6c6572206973206e6f7420746865205f6e6f64654f6e7765722061646460408201526e3932b9b9903737b91037bbb732b91760891b606082015260800190565b600181811c9082168061305f57607f821691505b60208210810361307f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561098c5761098c6130ba565b634e487b7160e01b600052603260045260246000fd5b8181038181111561098c5761098c6130ba565b634e487b7160e01b600052603160045260246000fd5b808202811582820484141761098c5761098c6130ba565b60008261315657634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561316d57600080fd5b81516124b581612dcf565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806000606084860312156131c857600080fd5b8351925060208401519150604084015190509250925092565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132b95784516001600160a01b031683529383019391830191600101613294565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220ef35e0654bfa8020d03f4c1e9cfb9f962e14610d338f59048d5d7f0ddb8bc13a64736f6c63430008120033

Deployed Bytecode Sourcemap

18388:17883:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33646:101;;;;;;;;;;-1:-1:-1;33646:101:0;;;;;:::i;:::-;;:::i;:::-;;1864:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2796:201;;;;;;;;;;-1:-1:-1;2796:201:0;;;;;:::i;:::-;;:::i;:::-;;;1538:14:1;;1531:22;1513:41;;1501:2;1486:18;2796:201:0;1373:187:1;19189:30:0;;;;;;;;;;-1:-1:-1;19189:30:0;;;;;:::i;:::-;;:::i;:::-;;;1896:25:1;;;1884:2;1869:18;19189:30:0;1750:177:1;19145:34:0;;;;;;;;;;-1:-1:-1;19145:34:0;;;;-1:-1:-1;;;;;19145:34:0;;;;;;-1:-1:-1;;;;;2096:32:1;;;2078:51;;2066:2;2051:18;19145:34:0;1932:203:1;18773:24:0;;;;;;;;;;;;;;;;2185:108;;;;;;;;;;-1:-1:-1;2273:12:0;;2185:108;;20282:19;;;;;;;;;;-1:-1:-1;20282:19:0;;;;;:::i;:::-;;:::i;:::-;;;;2314:25:1;;;2370:2;2355:18;;2348:34;;;;2287:18;20282:19:0;2140:248:1;19228:34:0;;;;;;;;;;-1:-1:-1;19228:34:0;;;;;;;;23222:360;;;;;;;;;;-1:-1:-1;23222:360:0;;;;;:::i;:::-;;:::i;3005:295::-;;;;;;;;;;-1:-1:-1;3005:295:0;;;;;:::i;:::-;;:::i;31545:153::-;;;;;;;;;;-1:-1:-1;31545:153:0;;;;;:::i;:::-;;:::i;35108:727::-;;;;;;;;;;-1:-1:-1;35108:727:0;;;;;:::i;:::-;;:::i;2084:93::-;;;;;;;;;;-1:-1:-1;2084:93:0;;2167:2;3317:36:1;;3305:2;3290:18;2084:93:0;3175:184:1;34540:490:0;;;;;;;;;;-1:-1:-1;34540:490:0;;;;;:::i;:::-;;:::i;3308:240::-;;;;;;;;;;-1:-1:-1;3308:240:0;;;;;:::i;:::-;;:::i;35915:119::-;;;;;;;;;;;;;:::i;32191:337::-;;;;;;;;;;-1:-1:-1;32191:337:0;;;;;:::i;:::-;;:::i;18731:33::-;;;;;;;;;;-1:-1:-1;18731:33:0;;;;;;;;25788:127;;;;;;;;;;-1:-1:-1;25788:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;25879:28:0;25855:4;25879:28;;;:19;:28;;;;;;;;;25788:127;23590:890;;;;;;;;;;-1:-1:-1;23590:890:0;;;;;:::i;:::-;;:::i;33491:93::-;;;;;;;;;;-1:-1:-1;33564:5:0;:12;33491:93;;24488:250;;;;;;;;;;-1:-1:-1;24488:250:0;;;;;:::i;:::-;;:::i;18804:27::-;;;;;;;;;;;;;;;;31988:131;;;;;;;;;;-1:-1:-1;31988:131:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2301:127::-;;;;;;;;;;-1:-1:-1;2301:127:0;;;;;:::i;:::-;;:::i;15226:103::-;;;;;;;;;;;;;:::i;22856:84::-;;;;;;;;;;;;;:::i;33826:634::-;;;;;;;;;;-1:-1:-1;33826:634:0;;;;;:::i;:::-;;:::i;19112:26::-;;;;;;;;;;;;;;;;25294:402;;;;;;;;;;-1:-1:-1;25294:402:0;;;;;:::i;:::-;;:::i;15003:87::-;;;;;;;;;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;15003:87;;1972:104;;;;;;;;;;;;;:::i;31770:135::-;;;;;;;;;;-1:-1:-1;31770:135:0;;;;;:::i;:::-;;:::i;3556:438::-;;;;;;;;;;-1:-1:-1;3556:438:0;;;;;:::i;:::-;;:::i;2436:193::-;;;;;;;;;;-1:-1:-1;2436:193:0;;;;;:::i;:::-;;:::i;23006:132::-;;;;;;;;;;-1:-1:-1;23006:132:0;;;;;:::i;:::-;;:::i;24825:106::-;;;;;;;;;;-1:-1:-1;24825:106:0;;;;;:::i;:::-;;:::i;18615:35::-;;;;;;;;;;;;;;;;33283:132;;;;;;;;;;;;;:::i;18690:34::-;;;;;;;;;;;;;;;;19269:27;;;;;;;;;;;;;;;;24939:184;;;;;;;;;;-1:-1:-1;24939:184:0;;;;;:::i;:::-;;:::i;22138:638::-;;;;;;;;;;;;;:::i;2637:151::-;;;;;;;;;;-1:-1:-1;2637:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;2753:18:0;;;2726:7;2753:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2637:151;36127:104;;;;;;;;;;;;;:::i;15337:201::-;;;;;;;;;;-1:-1:-1;15337:201:0;;;;;:::i;:::-;;:::i;18657:24::-;;;;;;;;;;;;;;;;33646:101;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;;;;;;;;;33717:14:::1;:22:::0;;-1:-1:-1;;33717:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33646:101::o;1864:100::-;1918:13;1951:5;1944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1864:100;:::o;2796:201::-;2879:4;1324:10;2935:32;1324:10;2951:7;2960:6;2935:8;:32::i;:::-;2985:4;2978:11;;;2796:201;;;;;:::o;19189:30::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19189:30:0;:::o;20282:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20282:19:0;:::o;23222:360::-;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;23336:13:::1;:28:::0;;;23375:13:::1;:28:::0;;;23414:11:::1;:24:::0;;;23428:10;23463:29:::1;23391:12:::0;23352;23463:29:::1;:::i;:::-;:43;;;;:::i;:::-;23451:9;:55:::0;;;23540:1:::1;-1:-1:-1::0;23527:14:0::1;23519:55;;;::::0;-1:-1:-1;;;23519:55:0;;7537:2:1;23519:55:0::1;::::0;::::1;7519:21:1::0;7576:2;7556:18;;;7549:30;7615;7595:18;;;7588:58;7663:18;;23519:55:0::1;7335:352:1::0;23519:55:0::1;23222:360:::0;;;:::o;3005:295::-;3136:4;1324:10;3194:38;3210:4;1324:10;3225:6;3194:15;:38::i;:::-;3243:27;3253:4;3259:2;3263:6;3243:9;:27::i;:::-;-1:-1:-1;3288:4:0;;3005:295;-1:-1:-1;;;;3005:295:0:o;31545:153::-;-1:-1:-1;;;;;31643:47:0;;;31619:4;31643:20;;;:8;:20;;;;;;;;:26;;;;;;;;;;:33;;;;:47;;31545:153::o;35108:727::-;35167:27;35177:10;35189:4;35167:9;:27::i;:::-;35159:61;;;;-1:-1:-1;;;35159:61:0;;7894:2:1;35159:61:0;;;7876:21:1;7933:2;7913:18;;;7906:30;-1:-1:-1;;;7952:18:1;;;7945:51;8013:18;;35159:61:0;7692:345:1;35159:61:0;35233:14;35250:28;35261:10;35273:4;35250:10;:28::i;:::-;35295:14;;35233:45;;-1:-1:-1;35295:14:0;;35291:364;;;35340:10;35326:25;;;;:13;:25;;;;;;;:53;;;;;;;;;;;;;;35363:15;35326:53;;;;;;35394:33;;;:46;;;;;;;;;;;;;;;;35455:12;:22;;35433:6;;35326:25;35455:22;;35433:6;;35455:22;:::i;:::-;;;;-1:-1:-1;;35500:10:0;35512:20;;;;:8;:20;;;;;;;;:26;;;;;;;;:33;;;35494:64;;35500:10;35512:45;;35550:6;35512:37;:45::i;:::-;35494:5;:64::i;:::-;35291:364;;;35597:10;35609:20;;;;:8;:20;;;;;;;;:26;;;;;;;;:33;;;35591:52;;35597:10;35591:5;:52::i;:::-;35698:10;35689:20;;;;:8;:20;;;;;;;;:26;;;;;;;;:33;;;35667:11;;35689:33;;:20;35710:4;;35667:11;;;;;;:::i;:::-;;;;;;;;;;;:18;;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;35757:10:0;35748:20;;;;:8;:20;;;;;;;;:26;;;;;;;;:33;;;35733:11;:48;;35748:33;;35733:11;;:48;;35748:33;;35733:48;:::i;:::-;;;;-1:-1:-1;;35810:10:0;35801:20;;;;:8;:20;;;;;;;;:26;;;;;;;;;35794:33;;-1:-1:-1;;;;;;35794:33:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35108:727:0:o;34540:490::-;20619:14;;;;20611:50;;;;-1:-1:-1;;;20611:50:0;;8509:2:1;20611:50:0;;;8491:21:1;8548:2;8528:18;;;8521:30;-1:-1:-1;;;8567:18:1;;;8560:53;8630:18;;20611:50:0;8307:347:1;20611:50:0;34614:27:::1;34624:10;34636:4;34614:9;:27::i;:::-;34606:53;;;::::0;-1:-1:-1;;;34606:53:0;;8861:2:1;34606:53:0::1;::::0;::::1;8843:21:1::0;8900:2;8880:18;;;8873:30;-1:-1:-1;;;8919:18:1;;;8912:43;8972:18;;34606:53:0::1;8659:337:1::0;34606:53:0::1;34672:14;34689:28;34700:10;34712:4;34689:10;:28::i;:::-;34744:10;34730:25;::::0;;;:13:::1;:25;::::0;;;;;;:53;;::::1;::::0;;::::1;::::0;;;;;;;;34767:15:::1;34730:53:::0;::::1;::::0;;;;34794:33;;::::1;:46:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;34851:12:::1;:22:::0;;34672:45;;-1:-1:-1;34672:45:0;;34851:12;;34730:25;34851:22:::1;::::0;34672:45;;34851:22:::1;:::i;:::-;::::0;;;-1:-1:-1;34886:25:0::1;::::0;-1:-1:-1;34892:10:0::1;34904:6:::0;34886:5:::1;:25::i;:::-;-1:-1:-1::0;34933:10:0::1;34924:20;::::0;;;:8:::1;:20;::::0;;;;;;;:26;;;;;;;;;34959:15:::1;34924:32;::::0;::::1;:50:::0;34985:33:::1;;:37:::0;34540:490::o;3308:240::-;1324:10;3396:4;3477:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3477:27:0;;;;;;;;;;3396:4;;1324:10;3452:66;;1324:10;;3477:27;;:40;;3507:10;;3477:40;:::i;:::-;3452:8;:66::i;35915:119::-;35974:19;;35966:60;;-1:-1:-1;;;;;35974:19:0;;;;36004:21;35966:60;;;;;35974:19;35966:60;35974:19;35966:60;36004:21;35974:19;35966:60;;;;;;;;;;;;;;;;;;;;;35915:119::o;32191:337::-;32262:7;32282:23;32308:25;32320:6;32328:4;32308:11;:25::i;:::-;32380:10;32344:24;32371:20;;;:8;:20;;;;;;;;:26;;;;;;;;:33;;;32282:51;;-1:-1:-1;32421:20:0;;32417:70;;32450:37;:15;32470:16;32450:19;:37::i;:::-;32443:44;;;;;;32417:70;-1:-1:-1;32505:15:0;32191:337;-1:-1:-1;;;32191:337:0:o;23590:890::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;23701:13:::1;23718:1;23701:18:::0;23692:68:::1;;;::::0;-1:-1:-1;;;23692:68:0;;9203:2:1;23692:68:0::1;::::0;::::1;9185:21:1::0;9242:2;9222:18;;;9215:30;9281:34;9261:18;;;9254:62;-1:-1:-1;;;9332:18:1;;;9325:34;9376:19;;23692:68:0::1;9001:400:1::0;23692:68:0::1;23775:9;23771:701;;;23805:24;23815:10;23827:1;23805:9;:24::i;:::-;23797:57;;;::::0;-1:-1:-1;;;23797:57:0;;9608:2:1;23797:57:0::1;::::0;::::1;9590:21:1::0;9647:2;9627:18;;;9620:30;-1:-1:-1;;;9666:18:1;;;9659:50;9726:18;;23797:57:0::1;9406:344:1::0;23797:57:0::1;23867:14;23884:25;23895:10;23907:1;23884:10;:25::i;:::-;23961:10;23920:29;23952:20:::0;;;:8:::1;:20;::::0;;;;;;;:23;;;;;;;;23986:9:::1;23952:29:::0;;::::1;::::0;23867:42;;-1:-1:-1;23920:29:0;;23952:44:::1;::::0;:33:::1;:44::i;:::-;23920:76:::0;-1:-1:-1;24007:31:0::1;24041:30;:15;24061:9;24041:19;:30::i;:::-;24007:64:::0;-1:-1:-1;24082:21:0::1;24106:50;24007:64:::0;24134:21;24106:27:::1;:50::i;:::-;24082:74;;24167:12;24182:36;24214:3;24182:27;24193:12;24206:1;24193:15;;;;;;;;:::i;:::-;;;;;;;;;24182:6;:10;;:27;;;;:::i;:::-;:31:::0;::::1;:36::i;:::-;24167:51:::0;-1:-1:-1;24229:20:0::1;24252:37;24286:2;24252:29;24286:2:::0;24252:29;24270:2:::1;24252:29:::0;24167:51;24261:3:::1;24252:8;:13::i;:37::-;24229:60:::0;-1:-1:-1;24315:31:0::1;24229:60:::0;24332:13;24315:16:::1;:31::i;:::-;24300:12;:46:::0;-1:-1:-1;23771:701:0::1;::::0;-1:-1:-1;;;;;23771:701:0::1;;24379:5;24375:85;;;-1:-1:-1::0;;24388:12:0::1;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24388:32:0;;;;;::::1;::::0;23222:360::o;24375:85::-:1;24440:12;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23590:890:::0;;;:::o;24488:250::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;24623:13:::1;24599:12;24612:6;24599:20;;;;;;;;:::i;:::-;;;;;;;;;:37:::0;24590:93:::1;;;::::0;-1:-1:-1;;;24590:93:0;;10089:2:1;24590:93:0::1;::::0;::::1;10071:21:1::0;10128:2;10108:18;;;10101:30;10167:34;10147:18;;;10140:62;-1:-1:-1;;;10218:18:1;;;10211:40;10268:19;;24590:93:0::1;9887:406:1::0;24590:93:0::1;24717:13;24694:12;24707:6;24694:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:36:::0;-1:-1:-1;;24488:250:0:o;31988:131::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;32090:21:0;;-1:-1:-1;32090:21:0;;;:13;:21;;;;;32083:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32083:28:0;32090:21;;32083:28;;32090:21;;32083:28;;32090:21;32083:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31988:131;;;:::o;2301:127::-;-1:-1:-1;;;;;2402:18:0;2375:7;2402:18;;;;;;;;;;;;2301:127::o;15226:103::-;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;15291:30:::1;15318:1;15291:18;:30::i;:::-;15226:103::o:0;22856:84::-;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;22910:14:::1;:22:::0;;-1:-1:-1;;22910:22:0::1;::::0;;22856:84::o;33826:634::-;20619:14;;;;20611:50;;;;-1:-1:-1;;;20611:50:0;;8509:2:1;20611:50:0;;;8491:21:1;8548:2;8528:18;;;8521:30;-1:-1:-1;;;8567:18:1;;;8560:53;8630:18;;20611:50:0;8307:347:1;20611:50:0;33966:27:::1;33976:10;33988:4;33966:9;:27::i;:::-;33962:367;;;34019:10;34010:20;::::0;;;:8:::1;:20;::::0;;;;;;;:26;;;;;;;;:33:::1;;:48:::0;;34047:11;;34010:20;:48:::1;::::0;34047:11;;34010:48:::1;:::i;:::-;::::0;;;-1:-1:-1;34110:29:0::1;::::0;-1:-1:-1;34122:10:0::1;34134:4:::0;34110:11:::1;:29::i;:::-;34082:10;34073:20;::::0;;;:8:::1;:20;::::0;;;;;;;:26;;;;;;;;:33:::1;;:66:::0;;:33;;:20;:66:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;34163:10:0::1;34154:20;::::0;;;:8:::1;:20;::::0;;;;;;;:26;;;;;;;;34189:15:::1;34154:32;::::0;;::::1;:50:::0;33962:367:::1;;;34266:51;::::0;;::::1;::::0;::::1;::::0;;34273:10:::1;34266:51:::0;;;34285:15:::1;34266:51;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;34266:51:0;;;;;;34237:20;;;:8:::1;:20:::0;;;;;:26;;;;;;;;;:80;;;;-1:-1:-1;;;;;;34237:80:0::1;-1:-1:-1::0;;;;;34237:80:0;;::::1;;::::0;;;-1:-1:-1;34237:80:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;33962:367:::1;34363:11;34341:5;34347:4;34341:11;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;:33;;;;;;;:::i;:::-;;;;;;;;34400:11;34385;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;34422:30:0::1;::::0;-1:-1:-1;34428:10:0::1;34440:11:::0;34422:5:::1;:30::i;:::-;33826:634:::0;;:::o;25294:402::-;15076:6;;25379:4;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;25439:6:::1;25419:13;2273:12:::0;;;2185:108;25419:13:::1;:17;::::0;25435:1:::1;25419:17;:::i;:::-;:26;;;;:::i;:::-;25403:12;:42;;25395:111;;;::::0;-1:-1:-1;;;25395:111:0;;10895:2:1;25395:111:0::1;::::0;::::1;10877:21:1::0;10934:2;10914:18;;;10907:30;10973:34;10953:18;;;10946:62;11044:26;11024:18;;;11017:54;11088:19;;25395:111:0::1;10693:420:1::0;25395:111:0::1;25560:4;25540:13;2273:12:::0;;;2185:108;25540:13:::1;:17;::::0;25556:1:::1;25540:17;:::i;:::-;:24;;;;:::i;:::-;25524:12;:40;;25516:108;;;::::0;-1:-1:-1;;;25516:108:0;;11320:2:1;25516:108:0::1;::::0;::::1;11302:21:1::0;11359:2;11339:18;;;11332:30;11398:34;11378:18;;;11371:62;11469:25;11449:18;;;11442:53;11512:19;;25516:108:0::1;11118:419:1::0;25516:108:0::1;-1:-1:-1::0;25634:19:0::1;:34:::0;;;25685:4:::1;15209:1;25294:402:::0;;;:::o;1972:104::-;2028:13;2061:7;2054:14;;;;;:::i;31770:135::-;-1:-1:-1;;;;;31868:16:0;;;;31841:7;31868:16;;;:8;:16;;;;;;;;:22;;;;;;;:29;;;;31770:135::o;3556:438::-;1324:10;3649:4;3732:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3732:27:0;;;;;;;;;;3649:4;;1324:10;3778:35;;;;3770:85;;;;-1:-1:-1;;;3770:85:0;;11744:2:1;3770:85:0;;;11726:21:1;11783:2;11763:18;;;11756:30;11822:34;11802:18;;;11795:62;-1:-1:-1;;;11873:18:1;;;11866:35;11918:19;;3770:85:0;11542:401:1;3770:85:0;3891:60;3900:5;3907:7;3935:15;3916:16;:34;3891:8;:60::i;2436:193::-;2515:4;1324:10;2571:28;1324:10;2588:2;2592:6;2571:9;:28::i;23006:132::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23091:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;23091:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23006:132::o;24825:106::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;24901:10:::1;:22:::0;;-1:-1:-1;;;;;;24901:22:0::1;-1:-1:-1::0;;;;;24901:22:0;;;::::1;::::0;;;::::1;::::0;;24825:106::o;33283:132::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;33356:24:::1;::::0;;;;::::1;::::0;;;33361:15:::1;33356:24:::0;;-1:-1:-1;33356:24:0::1;::::0;;::::1;::::0;;;33391:16;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;33283:132::o;24939:184::-;20439:10;;-1:-1:-1;;;;;20439:10:0;1324;20439:26;;:53;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;15076:6:0;1324:10;20469:23;20439:53;20431:113;;;;-1:-1:-1;;;20431:113:0;;;;;;;:::i;:::-;25022:19:::1;:31:::0;;-1:-1:-1;;;;;;25022:31:0::1;-1:-1:-1::0;;;;;25022:31:0;;;::::1;::::0;;;::::1;::::0;;24939:184::o;22138:638::-;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;22228:15:::1;;;;;;;;;-1:-1:-1::0;;;;;22228:15:0::1;-1:-1:-1::0;;;;;22228:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22210:55:0::1;;22274:4;22281:15;;;;;;;;;-1:-1:-1::0;;;;;22281:15:0::1;-1:-1:-1::0;;;;;22281:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22210:94;::::0;-1:-1:-1;;;;;;22210:94:0::1;::::0;;;;;;-1:-1:-1;;;;;12434:15:1;;;22210:94:0::1;::::0;::::1;12416:34:1::0;12486:15;;12466:18;;;12459:43;12351:18;;22210:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22194:13;:110:::0;;-1:-1:-1;;;;;;22194:110:0::1;-1:-1:-1::0;;;;;22194:110:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;22315:55:0;;;:31:::1;:55;::::0;;;;;;;:62;;-1:-1:-1;;22315:62:0;;::::1;-1:-1:-1::0;22315:62:0;;::::1;::::0;;;22423:13;;;::::1;22388:50:::0;;:26:::1;:50:::0;;;;;;:57;;;;::::1;;::::0;;22490:15:::1;::::0;22458:75:::1;::::0;22475:4:::1;::::0;22490:15:::1;22508:24;22475:4:::0;22508:9:::1;:24::i;22458:75::-;22544:15;::::0;-1:-1:-1;;;;;22544:15:0::1;:31;22583:21;22629:4;22649:24;22629:4:::0;22649:9:::1;:24::i;:::-;22688:1;22704::::0;22720:7:::1;15076:6:::0;;-1:-1:-1;;;;;15076:6:0;;15003:87;22720:7:::1;22742:15;22544:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36127:104::-:0;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;36180:43:::1;36198:24;36216:4;36198:9;:24::i;:::-;36180:17;:43::i;15337:201::-:0;15076:6;;-1:-1:-1;;;;;15076:6:0;1324:10;15138:23;15130:68;;;;-1:-1:-1;;;15130:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15426:22:0;::::1;15418:73;;;::::0;-1:-1:-1;;;15418:73:0;;13638:2:1;15418:73:0::1;::::0;::::1;13620:21:1::0;13677:2;13657:18;;;13650:30;13716:34;13696:18;;;13689:62;-1:-1:-1;;;13767:18:1;;;13760:36;13813:19;;15418:73:0::1;13436:402:1::0;15418:73:0::1;15502:28;15521:8;15502:18;:28::i;5687:380::-:0;-1:-1:-1;;;;;5823:19:0;;5815:68;;;;-1:-1:-1;;;5815:68:0;;14045:2:1;5815:68:0;;;14027:21:1;14084:2;14064:18;;;14057:30;14123:34;14103:18;;;14096:62;-1:-1:-1;;;14174:18:1;;;14167:34;14218:19;;5815:68:0;13843:400:1;5815:68:0;-1:-1:-1;;;;;5902:21:0;;5894:68;;;;-1:-1:-1;;;5894:68:0;;14450:2:1;5894:68:0;;;14432:21:1;14489:2;14469:18;;;14462:30;14528:34;14508:18;;;14501:62;-1:-1:-1;;;14579:18:1;;;14572:32;14621:19;;5894:68:0;14248:398:1;5894:68:0;-1:-1:-1;;;;;5975:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6027:32;;1896:25:1;;;6027:32:0;;1869:18:1;6027:32:0;;;;;;;5687:380;;;:::o;6075:453::-;-1:-1:-1;;;;;2753:18:0;;;6210:24;2753:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;6277:37:0;;6273:248;;6359:6;6339:16;:26;;6331:68;;;;-1:-1:-1;;;6331:68:0;;14853:2:1;6331:68:0;;;14835:21:1;14892:2;14872:18;;;14865:30;14931:31;14911:18;;;14904:59;14980:18;;6331:68:0;14651:353:1;6331:68:0;6443:51;6452:5;6459:7;6487:6;6468:16;:25;6443:8;:51::i;:::-;6199:329;6075:453;;;:::o;25923:3250::-;-1:-1:-1;;;;;26055:18:0;;26047:68;;;;-1:-1:-1;;;26047:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26134:16:0;;26126:64;;;;-1:-1:-1;;;26126:64:0;;;;;;;:::i;:::-;26215:6;26225:1;26215:11;26211:93;;26243:28;26259:4;26265:2;26269:1;26243:15;:28::i;26211:93::-;26360:14;;;;26356:1440;;;15076:6;;-1:-1:-1;;;;;26413:15:0;;;15076:6;;26413:15;;;;:49;;-1:-1:-1;15076:6:0;;-1:-1:-1;;;;;26449:13:0;;;15076:6;;26449:13;;26413:49;:91;;;;-1:-1:-1;;;;;;26483:21:0;;26497:6;26483:21;;26413:91;:122;;;;-1:-1:-1;26526:9:0;;-1:-1:-1;;;26526:9:0;;;;26525:10;26413:122;26391:1394;;;15076:6;;-1:-1:-1;;;;;26574:13:0;;;15076:6;;26574:13;;;;:47;;-1:-1:-1;26605:15:0;;-1:-1:-1;;;;;26591:30:0;;;26605:15;;26591:30;;26574:47;:79;;;;-1:-1:-1;26639:13:0;;-1:-1:-1;;;;;26625:28:0;;;26639:13;;26625:28;;26574:79;26570:336;;;26710:9;26685:35;;;;:24;:35;;;;;;26723:12;-1:-1:-1;26677:136:0;;;;-1:-1:-1;;;26677:136:0;;16021:2:1;26677:136:0;;;16003:21:1;16060:2;16040:18;;;16033:30;16099:34;16079:18;;;16072:62;16170:34;16150:18;;;16143:62;-1:-1:-1;;;16221:19:1;;;16214:40;16271:19;;26677:136:0;15819:477:1;26677:136:0;26861:9;26836:35;;;;:24;:35;;;;;26874:12;26836:50;;26570:336;-1:-1:-1;;;;;26957:32:0;;;;;;:26;:32;;;;;;;;:72;;;;-1:-1:-1;;;;;;26994:35:0;;;;;;:31;:35;;;;;;;;26993:36;26957:72;26953:817;;;27072:20;;27062:6;:30;;27054:108;;;;-1:-1:-1;;;27054:108:0;;16503:2:1;27054:108:0;;;16485:21:1;16542:2;16522:18;;;16515:30;16581:34;16561:18;;;16554:62;16652:34;16632:18;;;16625:62;-1:-1:-1;;;16703:19:1;;;16696:32;16745:19;;27054:108:0;16301:469:1;27054:108:0;27219:9;;27202:13;27212:2;27202:9;:13::i;:::-;27193:22;;:6;:22;:::i;:::-;:35;;27185:79;;;;-1:-1:-1;;;27185:79:0;;16977:2:1;27185:79:0;;;16959:21:1;17016:2;16996:18;;;16989:30;17055:33;17035:18;;;17028:61;17106:18;;27185:79:0;16775:355:1;27185:79:0;26953:817;;;-1:-1:-1;;;;;27357:30:0;;;;;;:26;:30;;;;;;;;:72;;;;-1:-1:-1;;;;;;27392:37:0;;;;;;:31;:37;;;;;;;;27391:38;27357:72;27353:417;;;27472:20;;27462:6;:30;;27454:109;;;;-1:-1:-1;;;27454:109:0;;17337:2:1;27454:109:0;;;17319:21:1;17376:2;17356:18;;;17349:30;17415:34;17395:18;;;17388:62;17486:34;17466:18;;;17459:62;-1:-1:-1;;;17537:19:1;;;17530:33;17580:19;;27454:109:0;17135:470:1;27353:417:0;-1:-1:-1;;;;;27611:35:0;;;;;;:31;:35;;;;;;;;27606:164;;27705:9;;27688:13;27698:2;27688:9;:13::i;:::-;27679:22;;:6;:22;:::i;:::-;:35;;27671:79;;;;-1:-1:-1;;;27671:79:0;;16977:2:1;27671:79:0;;;16959:21:1;17016:2;16996:18;;;16989:30;17055:33;17035:18;;;17028:61;17106:18;;27671:79:0;16775:355:1;27671:79:0;27810:28;27841:24;27859:4;27841:9;:24::i;:::-;27915:19;;27810:55;;-1:-1:-1;27891:43:0;;;;;;;27963:34;;-1:-1:-1;27988:9:0;;-1:-1:-1;;;27988:9:0;;;;27987:10;27963:34;:84;;;;-1:-1:-1;;;;;;28015:32:0;;;;;;:26;:32;;;;;;;;28014:33;27963:84;:127;;;;-1:-1:-1;;;;;;28065:25:0;;;;;;:19;:25;;;;;;;;28064:26;27963:127;:168;;;;-1:-1:-1;;;;;;28108:23:0;;;;;;:19;:23;;;;;;;;28107:24;27963:168;27945:298;;;28158:9;:16;;-1:-1:-1;;;;28158:16:0;-1:-1:-1;;;28158:16:0;;;28189:10;:8;:10::i;:::-;28214:9;:17;;-1:-1:-1;;;;28214:17:0;;;27945:298;28271:9;;-1:-1:-1;;;;;28401:25:0;;28255:12;28401:25;;;:19;:25;;;;;;28271:9;-1:-1:-1;;;28271:9:0;;;;;28270:10;;28401:25;;:66;;-1:-1:-1;;;;;;28444:23:0;;;;;;:19;:23;;;;;;;;28401:66;:154;;;-1:-1:-1;;;;;;28487:32:0;;;;;;:26;:32;;;;;;;;28486:33;:68;;;;-1:-1:-1;;;;;;28524:30:0;;;;;;:26;:30;;;;;;;;28523:31;28486:68;28383:253;;;-1:-1:-1;28631:5:0;28383:253;28657:12;28688:7;28684:436;;;28719:30;28745:3;28719:21;28730:9;;28719:6;:10;;:21;;;;:::i;:30::-;28712:37;;28810:9;;28794:13;;28787:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;28764:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;28873:9:0;;28859:11;;28852:18;;:4;:18;:::i;:::-;:30;;;;:::i;:::-;28834:14;;:48;;;;;;;:::i;:::-;;;;-1:-1:-1;;28943:9:0;;28927:13;;28920:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;28897:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;28985:8:0;;28981:91;;29014:42;29030:4;29044;29051;29014:15;:42::i;:::-;29094:14;29104:4;29094:14;;:::i;:::-;;;28684:436;29132:33;29148:4;29154:2;29158:6;29132:15;:33::i;:::-;26036:3137;;;;25923:3250;;;:::o;17117:98::-;17175:7;17202:5;17206:1;17202;:5;:::i;:::-;17195:12;17117:98;-1:-1:-1;;;17117:98:0:o;4681:399::-;-1:-1:-1;;;;;4765:21:0;;4757:65;;;;-1:-1:-1;;;4757:65:0;;17812:2:1;4757:65:0;;;17794:21:1;17851:2;17831:18;;;17824:30;17890:33;17870:18;;;17863:61;17941:18;;4757:65:0;17610:355:1;4757:65:0;4913:6;4897:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;4930:18:0;;:9;:18;;;;;;;;;;:28;;4952:6;;4930:9;:28;;4952:6;;4930:28;:::i;:::-;;;;-1:-1:-1;;4974:37:0;;1896:25:1;;;-1:-1:-1;;;;;4974:37:0;;;4991:1;;4974:37;;1884:2:1;1869:18;4974:37:0;;;;;;;33826:634;;:::o;32536:680::-;32609:7;32637:23;32647:6;32655:4;32637:9;:23::i;:::-;32629:56;;;;-1:-1:-1;;;32629:56:0;;9608:2:1;32629:56:0;;;9590:21:1;9647:2;9627:18;;;9620:30;-1:-1:-1;;;9666:18:1;;;9659:50;9726:18;;32629:56:0;9406:344:1;32629:56:0;32698:14;32715:24;32726:6;32734:4;32715:10;:24::i;:::-;-1:-1:-1;;;;;32782:16:0;;32750:29;32782:16;;;:8;:16;;;;;;;;:22;;;;;;;;32815:9;32782:28;;;;32698:41;;-1:-1:-1;32750:29:0;;32782:43;;:32;:43::i;:::-;32750:75;-1:-1:-1;32836:31:0;32870:30;:15;32890:9;32870:19;:30::i;:::-;32836:64;-1:-1:-1;32911:21:0;32935:50;32836:64;32963:21;32935:27;:50::i;:::-;32911:74;;32998:12;33013:39;33048:3;33013:30;33024:12;33037:4;33024:18;;;;;;;;:::i;33013:39::-;32998:54;-1:-1:-1;33063:20:0;33086:37;33120:2;33086:29;33120:2;33086:29;33104:2;33086:29;32998:54;33095:3;33086:8;:13::i;:37::-;33063:60;-1:-1:-1;33134:14:0;33151:31;33063:60;33168:13;33151:16;:31::i;:::-;33134:48;32536:680;-1:-1:-1;;;;;;;;;;32536:680:0:o;17435:98::-;17493:7;17520:5;17524:1;17520;:5;:::i;17223:98::-;17281:7;17308:5;17312:1;17308;:5;:::i;17329:98::-;17387:7;17414:5;17418:1;17414;:5;:::i;15546:191::-;15639:6;;;-1:-1:-1;;;;;15656:17:0;;;-1:-1:-1;;;;;;15656:17:0;;;;;;;15689:40;;15639:6;;;15656:17;15639:6;;15689:40;;15620:16;;15689:40;15609:128;15546:191;:::o;5088:591::-;-1:-1:-1;;;;;5172:21:0;;5164:67;;;;-1:-1:-1;;;5164:67:0;;18172:2:1;5164:67:0;;;18154:21:1;18211:2;18191:18;;;18184:30;18250:34;18230:18;;;18223:62;-1:-1:-1;;;18301:18:1;;;18294:31;18342:19;;5164:67:0;17970:397:1;5164:67:0;-1:-1:-1;;;;;5331:18:0;;5306:22;5331:18;;;;;;;;;;;5368:24;;;;5360:71;;;;-1:-1:-1;;;5360:71:0;;18574:2:1;5360:71:0;;;18556:21:1;18613:2;18593:18;;;18586:30;18652:34;18632:18;;;18625:62;-1:-1:-1;;;18703:18:1;;;18696:32;18745:19;;5360:71:0;18372:398:1;5360:71:0;-1:-1:-1;;;;;5467:18:0;;:9;:18;;;;;;;;;;5488:23;;;5467:44;;5533:12;:22;;5505:6;;5467:9;5533:22;;5505:6;;5533:22;:::i;:::-;;;;-1:-1:-1;;5573:37:0;;1896:25:1;;;5599:1:0;;-1:-1:-1;;;;;5573:37:0;;;;;1884:2:1;1869:18;5573:37:0;;;;;;;23222:360;;;:::o;29181:477::-;29273:16;;;29287:1;29273:16;;;;;;;;29249:21;;29273:16;;;;;;;;;;-1:-1:-1;29273:16:0;29249:40;;29318:4;29300;29305:1;29300:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29300:23:0;;;:7;;;;;;;;;;:23;;;;29344:15;;:22;;;-1:-1:-1;;;29344:22:0;;;;:15;;;;;:20;;:22;;;;;29300:7;;29344:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29334:4;29339:1;29334:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29334:32:0;;;:7;;;;;;;;;:32;29411:15;;29379:62;;29396:4;;29411:15;29429:11;29379:8;:62::i;:::-;29454:15;;:196;;-1:-1:-1;;;29454:196:0;;-1:-1:-1;;;;;29454:15:0;;;;:66;;:196;;29535:11;;29454:15;;29577:4;;29604;;29624:15;;29454:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29238:420;29181:477;:::o;4002:671::-;-1:-1:-1;;;;;4133:18:0;;4125:68;;;;-1:-1:-1;;;4125:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4212:16:0;;4204:64;;;;-1:-1:-1;;;4204:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4354:15:0;;4332:19;4354:15;;;;;;;;;;;4388:21;;;;4380:72;;;;-1:-1:-1;;;4380:72:0;;20094:2:1;4380:72:0;;;20076:21:1;20133:2;20113:18;;;20106:30;20172:34;20152:18;;;20145:62;-1:-1:-1;;;20223:18:1;;;20216:36;20269:19;;4380:72:0;19892:402:1;4380:72:0;-1:-1:-1;;;;;4488:15:0;;;:9;:15;;;;;;;;;;;4506:20;;;4488:38;;4548:13;;;;;;;;:23;;4520:6;;4488:9;4548:23;;4520:6;;4548:23;:::i;:::-;;;;;;;;4604:2;-1:-1:-1;;;;;4589:26:0;4598:4;-1:-1:-1;;;;;4589:26:0;;4608:6;4589:26;;;;1896:25:1;;1884:2;1869:18;;1750:177;4589:26:0;;;;;;;;4628:37;23222:360;30041:1439;30081:23;30107:24;30125:4;30107:9;:24::i;:::-;30081:50;;30142:25;30214:14;;30192:19;;30170;;:41;;;;:::i;:::-;:58;;;;:::i;:::-;30142:86;-1:-1:-1;30253:20:0;;;:46;;-1:-1:-1;30277:22:0;;30253:46;30249:59;;;30301:7;;30041:1439::o;30249:59::-;30340:19;;30322:15;:37;30318:80;;;30379:19;;30361:37;;30318:80;30470:23;30556:1;30536:17;30514:19;;30496:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;30470:87;-1:-1:-1;30568:26:0;30597:36;:15;30470:87;30597:19;:36::i;:::-;30568:65;-1:-1:-1;30682:21:0;30716:37;30568:65;30716:17;:37::i;:::-;30774:18;30795:44;:21;30821:17;30795:25;:44::i;:::-;30774:65;;30850:23;30876:58;30916:17;30876:35;30891:19;;30876:10;:14;;:35;;;;:::i;:58::-;30850:84;;30945:18;30966:53;31001:17;30966:30;30981:14;;30966:10;:14;;:30;;;;:::i;:53::-;30945:74;-1:-1:-1;31030:23:0;30945:74;31056:28;31069:15;31056:10;:28;:::i;:::-;:41;;;;:::i;:::-;31140:1;31118:19;:23;;;31152:19;:23;;;31186:14;:18;;;31225:10;;31217:45;;31030:67;;-1:-1:-1;;;;;;31225:10:0;;31217:45;;;;;31246:15;;31217:45;;31140:1;31217:45;31246:15;31225:10;31217:45;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31281:19:0;;31273:49;;-1:-1:-1;;;;;31281:19:0;;;;31273:49;;;;;31311:10;;31281:19;31273:49;31281:19;31273:49;31311:10;31281:19;31273:49;;;;;;;;;;;;;;;;;;;;;31373:1;31355:15;:19;:42;;;;;31396:1;31378:15;:19;31355:42;31351:122;;;31414:47;31428:15;31445;31414:13;:47::i;:::-;30070:1410;;;;;;;;;30041:1439::o;29666:367::-;29781:15;;29749:62;;29766:4;;-1:-1:-1;;;;;29781:15:0;29799:11;29749:8;:62::i;:::-;29824:15;;29974:10;;29824:201;;-1:-1:-1;;;29824:201:0;;-1:-1:-1;;;;;29824:15:0;;;;:31;;29863:9;;29824:201;;29896:4;;29916:11;;29824:15;;;;29974:10;;29999:15;;29824:201;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29666:367;;:::o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;179:180;235:6;288:2;276:9;267:7;263:23;259:32;256:52;;;304:1;301;294:12;256:52;327:26;343:9;327:26;:::i;364:548::-;476:4;505:2;534;523:9;516:21;566:6;560:13;609:6;604:2;593:9;589:18;582:34;634:1;644:140;658:6;655:1;652:13;644:140;;;753:14;;;749:23;;743:30;719:17;;;738:2;715:26;708:66;673:10;;644:140;;;648:3;833:1;828:2;819:6;808:9;804:22;800:31;793:42;903:2;896;892:7;887:2;879:6;875:15;871:29;860:9;856:45;852:54;844:62;;;;364:548;;;;:::o;917:131::-;-1:-1:-1;;;;;992:31:1;;982:42;;972:70;;1038:1;1035;1028:12;1053:315;1121:6;1129;1182:2;1170:9;1161:7;1157:23;1153:32;1150:52;;;1198:1;1195;1188:12;1150:52;1237:9;1224:23;1256:31;1281:5;1256:31;:::i;:::-;1306:5;1358:2;1343:18;;;;1330:32;;-1:-1:-1;;;1053:315:1:o;1565:180::-;1624:6;1677:2;1665:9;1656:7;1652:23;1648:32;1645:52;;;1693:1;1690;1683:12;1645:52;-1:-1:-1;1716:23:1;;1565:180;-1:-1:-1;1565:180:1:o;2393:316::-;2470:6;2478;2486;2539:2;2527:9;2518:7;2514:23;2510:32;2507:52;;;2555:1;2552;2545:12;2507:52;-1:-1:-1;;2578:23:1;;;2648:2;2633:18;;2620:32;;-1:-1:-1;2699:2:1;2684:18;;;2671:32;;2393:316;-1:-1:-1;2393:316:1:o;2714:456::-;2791:6;2799;2807;2860:2;2848:9;2839:7;2835:23;2831:32;2828:52;;;2876:1;2873;2866:12;2828:52;2915:9;2902:23;2934:31;2959:5;2934:31;:::i;:::-;2984:5;-1:-1:-1;3041:2:1;3026:18;;3013:32;3054:33;3013:32;3054:33;:::i;:::-;2714:456;;3106:7;;-1:-1:-1;;;3160:2:1;3145:18;;;;3132:32;;2714:456::o;3364:247::-;3423:6;3476:2;3464:9;3455:7;3451:23;3447:32;3444:52;;;3492:1;3489;3482:12;3444:52;3531:9;3518:23;3550:31;3575:5;3550:31;:::i;3616:316::-;3687:6;3695;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3808:9;3795:23;3785:33;;3837:35;3868:2;3857:9;3853:18;3837:35;:::i;:::-;3827:45;;3891:35;3922:2;3911:9;3907:18;3891:35;:::i;:::-;3881:45;;3616:316;;;;;:::o;3937:248::-;4005:6;4013;4066:2;4054:9;4045:7;4041:23;4037:32;4034:52;;;4082:1;4079;4072:12;4034:52;-1:-1:-1;;4105:23:1;;;4175:2;4160:18;;;4147:32;;-1:-1:-1;3937:248:1:o;4190:435::-;4243:3;4281:5;4275:12;4308:6;4303:3;4296:19;4334:4;4363:2;4358:3;4354:12;4347:19;;4400:2;4393:5;4389:14;4421:1;4431:169;4445:6;4442:1;4439:13;4431:169;;;4506:13;;4494:26;;4540:12;;;;4575:15;;;;4467:1;4460:9;4431:169;;;-1:-1:-1;4616:3:1;;4190:435;-1:-1:-1;;;;;4190:435:1:o;4630:563::-;4819:2;4808:9;4801:21;4782:4;4857:6;4851:13;4900:4;4895:2;4884:9;4880:18;4873:32;4928:62;4986:2;4975:9;4971:18;4957:12;4928:62;:::i;:::-;4914:76;;5039:2;5031:6;5027:15;5021:22;5113:2;5109:7;5097:9;5089:6;5085:22;5081:36;5074:4;5063:9;5059:20;5052:66;5135:52;5180:6;5164:14;5135:52;:::i;:::-;5127:60;4630:563;-1:-1:-1;;;;;4630:563:1:o;5198:315::-;5263:6;5271;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5379:9;5366:23;5398:31;5423:5;5398:31;:::i;:::-;5448:5;-1:-1:-1;5472:35:1;5503:2;5488:18;;5472:35;:::i;:::-;5462:45;;5198:315;;;;;:::o;5518:388::-;5586:6;5594;5647:2;5635:9;5626:7;5622:23;5618:32;5615:52;;;5663:1;5660;5653:12;5615:52;5702:9;5689:23;5721:31;5746:5;5721:31;:::i;:::-;5771:5;-1:-1:-1;5828:2:1;5813:18;;5800:32;5841:33;5800:32;5841:33;:::i;:::-;5893:7;5883:17;;;5518:388;;;;;:::o;5911:411::-;6113:2;6095:21;;;6152:2;6132:18;;;6125:30;6191:34;6186:2;6171:18;;6164:62;-1:-1:-1;;;6257:2:1;6242:18;;6235:45;6312:3;6297:19;;5911:411::o;6327:380::-;6406:1;6402:12;;;;6449;;;6470:61;;6524:4;6516:6;6512:17;6502:27;;6470:61;6577:2;6569:6;6566:14;6546:18;6543:38;6540:161;;6623:10;6618:3;6614:20;6611:1;6604:31;6658:4;6655:1;6648:15;6686:4;6683:1;6676:15;6540:161;;6327:380;;;:::o;6712:356::-;6914:2;6896:21;;;6933:18;;;6926:30;6992:34;6987:2;6972:18;;6965:62;7059:2;7044:18;;6712:356::o;7073:127::-;7134:10;7129:3;7125:20;7122:1;7115:31;7165:4;7162:1;7155:15;7189:4;7186:1;7179:15;7205:125;7270:9;;;7291:10;;;7288:36;;;7304:18;;:::i;8042:127::-;8103:10;8098:3;8094:20;8091:1;8084:31;8134:4;8131:1;8124:15;8158:4;8155:1;8148:15;8174:128;8241:9;;;8262:11;;;8259:37;;;8276:18;;:::i;9755:127::-;9816:10;9811:3;9807:20;9804:1;9797:31;9847:4;9844:1;9837:15;9871:4;9868:1;9861:15;10298:168;10371:9;;;10402;;10419:15;;;10413:22;;10399:37;10389:71;;10440:18;;:::i;10471:217::-;10511:1;10537;10527:132;;10581:10;10576:3;10572:20;10569:1;10562:31;10616:4;10613:1;10606:15;10644:4;10641:1;10634:15;10527:132;-1:-1:-1;10673:9:1;;10471:217::o;11948:251::-;12018:6;12071:2;12059:9;12050:7;12046:23;12042:32;12039:52;;;12087:1;12084;12077:12;12039:52;12119:9;12113:16;12138:31;12163:5;12138:31;:::i;12513:607::-;-1:-1:-1;;;;;12872:15:1;;;12854:34;;12919:2;12904:18;;12897:34;;;;12962:2;12947:18;;12940:34;;;;13005:2;12990:18;;12983:34;;;;13054:15;;;13048:3;13033:19;;13026:44;12834:3;13086:19;;13079:35;;;;12803:3;12788:19;;12513:607::o;13125:306::-;13213:6;13221;13229;13282:2;13270:9;13261:7;13257:23;13253:32;13250:52;;;13298:1;13295;13288:12;13250:52;13327:9;13321:16;13311:26;;13377:2;13366:9;13362:18;13356:25;13346:35;;13421:2;13410:9;13406:18;13400:25;13390:35;;13125:306;;;;;:::o;15009:401::-;15211:2;15193:21;;;15250:2;15230:18;;;15223:30;15289:34;15284:2;15269:18;;15262:62;-1:-1:-1;;;15355:2:1;15340:18;;15333:35;15400:3;15385:19;;15009:401::o;15415:399::-;15617:2;15599:21;;;15656:2;15636:18;;;15629:30;15695:34;15690:2;15675:18;;15668:62;-1:-1:-1;;;15761:2:1;15746:18;;15739:33;15804:3;15789:19;;15415:399::o;18907:980::-;19169:4;19217:3;19206:9;19202:19;19248:6;19237:9;19230:25;19274:2;19312:6;19307:2;19296:9;19292:18;19285:34;19355:3;19350:2;19339:9;19335:18;19328:31;19379:6;19414;19408:13;19445:6;19437;19430:22;19483:3;19472:9;19468:19;19461:26;;19522:2;19514:6;19510:15;19496:29;;19543:1;19553:195;19567:6;19564:1;19561:13;19553:195;;;19632:13;;-1:-1:-1;;;;;19628:39:1;19616:52;;19723:15;;;;19688:12;;;;19664:1;19582:9;19553:195;;;-1:-1:-1;;;;;;;19804:32:1;;;;19799:2;19784:18;;19777:60;-1:-1:-1;;;19868:3:1;19853:19;19846:35;19765:3;18907:980;-1:-1:-1;;;18907:980:1:o

Swarm Source

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