Token Dino

Overview ERC20

Price
$0.00 @ 0.000000 AVAX
Fully Diluted Market Cap
Total Supply:
995,511.544301 DINO

Holders:
3,481 addresses

Transfers:
-

Contract:
0x8d8Db824baFdb617646E80360509274909c481270x8d8Db824baFdb617646E80360509274909c48127

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Dino

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;

/**
 * @title SafeMathUint
 * @dev Math operations with safety TKNcks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0, "toInt256Safe: B LESS THAN ZERO");
        return b;
    }
}

pragma solidity ^0.8.0;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety TKNcks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(
            c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256),
            "mul: A B C combi values invalid with MIN_INT256"
        );
        require((b == 0) || (c / b == a), "mul: A B C combi values invalid");
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256, "div: b == 1 OR A == MIN_INT256");

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require(
            (b >= 0 && c <= a) || (b < 0 && c > a),
            "sub: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require(
            (b >= 0 && c >= a) || (b < 0 && c < a),
            "add: A B C combi values invalid"
        );
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256, "abs: A EQUAL MIN INT256");
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0, "toUint256Safe: A LESS THAN ZERO");
        return uint256(a);
    }
}

pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is TKNaper 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 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouTKNd) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouTKNd) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
    public
    view
    returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
    public
    view
    returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

// OpenZeppelin Contracts v4.3.2 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
        functionCallWithValue(
            target,
            data,
            value,
            "Address: low-level call with value failed"
        );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
    internal
    view
    returns (bytes memory)
    {
        return
        functionStaticCall(
            target,
            data,
            "Address: low-level static call failed"
        );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return
        functionDelegateCall(
            target,
            data,
            "Address: low-level delegate call failed"
        );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IJoeRouter01 {
    function factory() external pure returns (address);

    function WAVAX() external pure returns (address);

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

    function addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountAVAX,
        uint256 liquidity
    );

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

    function removeLiquidityAVAX(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountAVAX);

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

    function removeLiquidityAVAXWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountAVAX);

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

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

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

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

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

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

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

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

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

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

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


// pragma solidity >=0.6.2;

interface IJoeRouter02 is IJoeRouter01 {
    function removeLiquidityAVAXSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountAVAX);

    function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountAVAX);

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

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

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


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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
    external
    view
    returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
    external
    view
    returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
    external
    returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IJoeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function migrator() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setMigrator(address) external;
}


pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
    external
    returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
    external
    view
    returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

pragma solidity ^0.8.0;

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
    public
    virtual
    override
    returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
    public
    virtual
    override
    returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// OpenZeppelin Contracts v4.3.2 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        //unchecked {
        uint256 oldAllowance = token.allowance(address(this), spender);
        require(
            oldAllowance >= value,
            "SafeERC20: decreased allowance below zero"
        );
        uint256 newAllowance = oldAllowance - value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
        //}
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// OpenZeppelin Contracts v4.3.2 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
    public
    view
    returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
        totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
        (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

contract NODERewardManagement {
    using SafeMath for uint256;
    using IterableMapping for IterableMapping.Map;

    struct NodeEntity {
        string name;
        uint256 nodeLevel;
        uint256 creationTime;
        uint256 lastClaimTime;
    }

    IterableMapping.Map private nodeOwners;
    mapping(address => NodeEntity[]) private _nodesOfUser;
    
    mapping(address => uint256) public numberOfNodeV1;
    mapping(address => uint256) public numberOfNodeV2;

    uint256 public nodePrice;
    uint256 public nodeV2Price;
    uint256 public rewardPerNode;
    uint256 public rewardPerSecond;
    uint256 public claimTime;

    uint256 public MAX_NODE_V1;
    uint256 public MAX_NODE_V2;

    address public gateKeeper;
    address public token;

    bool public autoDistri = true;
    bool public distribution = false;

    uint256 public gasForDistribution = 300000;
    uint256 public lastDistributionCount = 0;
    uint256 public lastIndexProcessed = 0;

    uint256 public totalNodesCreated = 0;
    uint256 public totalNodesV2Created = 0;
    uint256 public totalRewardStaked = 0;

    constructor(
        uint256 _nodePrice,
        uint256 _nodeV2Price,
        uint256 _rewardPerNode,
        uint256 _claimTime,
        uint256 _MAX_NODE_V1,
        uint256 _MAX_NODE_V2
    ) {
        nodePrice = _nodePrice;
        nodeV2Price = _nodeV2Price;
        rewardPerNode = _rewardPerNode;
        rewardPerSecond = _rewardPerNode.div(86400);
        claimTime = _claimTime;
        gateKeeper = msg.sender;
        MAX_NODE_V1 = _MAX_NODE_V1;
        MAX_NODE_V2 = _MAX_NODE_V2;
    }

    modifier onlySentry() {
        require(msg.sender == token || msg.sender == gateKeeper, "Fuck off");
        _;
    }

    function setToken (address token_) external onlySentry {
        token = token_;
    }

    function upgradeNode(address account, string memory nodeName) external onlySentry {
        require(
            isNameAvailable(account, nodeName),
            "CREATE NODE: Name not available"
        );
        require(numberOfNodeV1[account] >= nodeV2Price, "don't have enough nodes");
        require(numberOfNodeV2[account] <= MAX_NODE_V2, "Node V2 limit has been reached");
        require(IERC20(token).balanceOf(account) >= nodePrice, "ERROR: DO NOT HAVE ENOUGH TOKEN");

        uint256 i = 0;
        uint256 nodeRemovedCounter = 0;
        while (nodeRemovedCounter < 20) {
            if (_nodesOfUser[account][i].nodeLevel == 0) {
                removeIndex(account, i);
                nodeRemovedCounter = nodeRemovedCounter.add(1);
                numberOfNodeV1[account] = numberOfNodeV1[account].sub(1);
            } else {
                i = i.add(1);
            }
        }

        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                nodeLevel: 1,
                creationTime: block.timestamp,
                lastClaimTime: block.timestamp
            })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        totalNodesCreated = totalNodesCreated.sub(nodeV2Price);
        totalNodesV2Created++;
        numberOfNodeV2[account] = numberOfNodeV2[account].add(1);
    }

    function createNode(address account, string memory nodeName) external onlySentry {
        require(
            isNameAvailable(account, nodeName),
            "CREATE NODE: Name not available"
        );
        require(numberOfNodeV1[account] <= MAX_NODE_V1, "Node V1 limit has been reached");

        _nodesOfUser[account].push(
            NodeEntity({
                name: nodeName,
                nodeLevel: 0,
                creationTime: block.timestamp,
                lastClaimTime: block.timestamp
            })
        );
        nodeOwners.set(account, _nodesOfUser[account].length);
        numberOfNodeV1[account] = numberOfNodeV1[account].add(1);
        totalNodesCreated++;
    }

    function isNameAvailable(address account, string memory nodeName)
    private
    view
    returns (bool)
    {
        NodeEntity[] memory nodes = _nodesOfUser[account];
        for (uint256 i = 0; i < nodes.length; i++) {
            if (keccak256(bytes(nodes[i].name)) == keccak256(bytes(nodeName))) {
                return false;
            }
        }
        return true;
    }

    function _burn(uint256 index) internal {
        require(index < nodeOwners.size());
        nodeOwners.remove(nodeOwners.getKeyAtIndex(index));
    }

    function _getNodeWithCreatime(
        NodeEntity[] storage nodes,
        uint256 _creationTime
    ) private view returns (NodeEntity storage) {
        uint256 numberOfNodes = nodes.length;
        require(
            numberOfNodes > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        bool found = false;
        int256 index = binary_search(nodes, 0, numberOfNodes, _creationTime);
        uint256 validIndex;
        if (index >= 0) {
            found = true;
            validIndex = uint256(index);
        }
        require(found, "NODE SEARCH: No NODE Found with this blocktime");
        return nodes[validIndex];
    }

    function binary_search(
        NodeEntity[] memory arr,
        uint256 low,
        uint256 high,
        uint256 x
    ) private view returns (int256) {
        if (high >= low) {
            uint256 mid = (high + low).div(2);
            if (arr[mid].creationTime == x) {
                return int256(mid);
            } else if (arr[mid].creationTime > x) {
                return binary_search(arr, low, mid - 1, x);
            } else {
                return binary_search(arr, mid + 1, high, x);
            }
        } else {
            return -1;
        }
    }
  
    function removeIndex(address account, uint256 index) private
    {   
        require(index < _nodesOfUser[account].length, "index > node of user length");

        for (uint256 i = index ; i < _nodesOfUser[account].length - 1; i ++)
        {
            _nodesOfUser[account][i] = _nodesOfUser[account][i + 1];
        }

        _nodesOfUser[account].pop();
    }

    function _getTotalNodes(address account) external view returns(NodeEntity[] memory) {
        return _nodesOfUser[account];
    }

    /**
     * cashout rewards from one selected node
     * @param account is the owner of the node
     * @param _creationTime is the id of the node
     */
    function _cashoutNodeReward(address account, uint256 _creationTime)
    external onlySentry
    {
        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        require(
            _nodesOfUser[account].length > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        
        _getNodeWithCreatime(_nodesOfUser[account], _creationTime).lastClaimTime = block.timestamp;
    }

    /**
     * cashout all node reward by specific node level
     * @param account is the owner of nodes
     * @param nodeLevel is the level user wants to cashout
     */
    function _cashoutAllNodesReward(address account, uint16 nodeLevel)
    external onlySentry
    {
        for (uint256 i = 0; i < _nodesOfUser[account].length; i++) {
            if (_nodesOfUser[account][i].nodeLevel == nodeLevel) {
                _nodesOfUser[account][i].lastClaimTime = block.timestamp;
            }
        }
    }

    /**
     * cashout all node reward 
     * @param account is the owner of nodes
     */
    function _cashoutAllNodesReward(address account)
    external onlySentry
    {
        require(_nodesOfUser[account].length > 0, "NODE: CREATIME must be higher than zero");
        NodeEntity storage _node;
        for (uint256 i = 0; i < _nodesOfUser[account].length; i++) {
            _nodesOfUser[account][i].lastClaimTime = block.timestamp;

        }
    }

    function claimable(NodeEntity memory node) private view returns (bool) {
        return node.lastClaimTime + claimTime <= block.timestamp;
    }

    /**
     * return total of reward from account
     * @param account the owner of nodes
     */
    function _getAllRewardAmountOf(address account)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");
        uint256 rewardCount = 0;

        for (uint256 i = 0; i < _nodesOfUser[account].length; i++) {
            rewardCount += _getRewardAmountOf(account, _nodesOfUser[account][i].creationTime);
        }

        return rewardCount;
    }

    /**
     * return total reward amount by selected level
     * @param account is the owner of nodes
     * @param nodeLevel is the selected level of the nodes
     */
    function _getAllRewardAmountOfByLevel(address account, uint16 nodeLevel)
    external
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        uint256 rewardCount = 0;

        for (uint256 i = 0; i < _nodesOfUser[account].length; i++) {
            if (_nodesOfUser[account][i].nodeLevel == nodeLevel) {
                rewardCount += _getRewardAmountOf(account, _nodesOfUser[account][i].creationTime);
            }
        }
        return rewardCount;
    }

    /**
     * return node reward for selected node from creationTime
     * @param account the owner of the node
     * @param _creationTime the id of the node
     */
    function _getRewardAmountOf(address account, uint256 _creationTime)
    public
    view
    returns (uint256)
    {
        require(isNodeOwner(account), "GET REWARD OF: NO NODE OWNER");

        require(_creationTime > 0, "NODE: CREATIME must be higher than zero");
        uint256 numberOfNodes = _nodesOfUser[account].length;
        require(
            _nodesOfUser[account].length > 0,
            "CASHOUT ERROR: You don't have nodes to cash-out"
        );
        NodeEntity storage node = _getNodeWithCreatime(_nodesOfUser[account], _creationTime);
        uint256 rewardNode = (block.timestamp - node.lastClaimTime).mul(rewardPerSecond);
        if (node.nodeLevel == 1) {
            rewardNode = rewardNode.mul(nodeV2Price);
        }
        
        return rewardNode;
    }

    function _getNodesNames(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "GET NAMES: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory names = nodes[0].name;
        string memory separator = "#";
        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];
            names = string(abi.encodePacked(names, separator, _node.name));
        }
        return names;
    }

    function _getNodesCreationTime(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "GET CREATIME: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _creationTimes = uint2str(nodes[0].creationTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _creationTimes = string(
                abi.encodePacked(
                    _creationTimes,
                    separator,
                    uint2str(_node.creationTime)
                )
            );
        }
        return _creationTimes;
    }

    function _getNodesLastClaimTime(address account)
    external
    view
    returns (string memory)
    {
        require(isNodeOwner(account), "LAST CLAIME TIME: NO NODE OWNER");
        NodeEntity[] memory nodes = _nodesOfUser[account];
        uint256 nodesCount = nodes.length;
        NodeEntity memory _node;
        string memory _lastClaimTimes = uint2str(nodes[0].lastClaimTime);
        string memory separator = "#";

        for (uint256 i = 1; i < nodesCount; i++) {
            _node = nodes[i];

            _lastClaimTimes = string(
                abi.encodePacked(
                    _lastClaimTimes,
                    separator,
                    uint2str(_node.lastClaimTime)
                )
            );
        }
        return _lastClaimTimes;
    }

    function uint2str(uint256 _i)
    internal
    pure
    returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function _changeNodePrice(uint256 newNodePrice) external onlySentry {
        nodePrice = newNodePrice;
    }

    function _changeRewardPerNode(uint256 newPrice) external onlySentry {
        rewardPerNode = newPrice;
    }

    function _changeClaimTime(uint256 newTime) external onlySentry {
        claimTime = newTime;
    }

    function _changeAutoDistri(bool newMode) external onlySentry {
        autoDistri = newMode;
    }

    function _changeGasDistri(uint256 newGasDistri) external onlySentry {
        gasForDistribution = newGasDistri;
    }

    function _getNodeNumberOf(address account) public view returns (uint256) {
        return nodeOwners.get(account);
    }

    function isNodeOwner(address account) private view returns (bool) {
        return nodeOwners.get(account) > 0;
    }

    function _isNodeOwner(address account) external view returns (bool) {
        return isNodeOwner(account);
    }
}

contract Dino is ERC20, Ownable, PaymentSplitter {
    using SafeMath for uint256;

    NODERewardManagement public nodeRewardManager;

    IJoeRouter02 public uniswapV2Router;

    struct ReferralUser {
        uint256 totalEggs;
        uint256 totalRewards;
    }

    address public uniswapV2Pair;
    address public futurUsePool;
    address public distributionPool;
    address[] private blacklistArray;
    bool public activeBlacklistMode;
    bool public openSell;
    bool public dailyTaxIsActive;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    uint256 public rewardsFee;
    uint256 public liquidityPoolFee;
    uint256 public futurFee;
    uint256 public totalFees;
    uint256 public maxBuy; // maximum tokens per transaction
    uint256 public maxWallet; // maximum tokens per wallet
    uint256 public transferTax; // maximum tokens per wallet
    uint256 public launchTime;

    uint256 public cashoutFee;

    uint256 private rwSwap;
    bool private swapping = false;
    bool private swapLiquify = true;
    uint256 public swapTokensAmount;

    mapping(address => bool) public feeExempts;
    mapping(address => uint256) public freeNodes;
    mapping(address => bool) public _isBlacklisted;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => ReferralUser) public referrals;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    constructor(
        address[] memory payees,
        uint256[] memory shares,
        address[] memory addresses,
        uint256[] memory balances,
        uint256[] memory fees,
        uint256 swapAmount,
        address uniV2Router
    ) ERC20("Dino", "DINO") PaymentSplitter(payees, shares) {

        futurUsePool = addresses[0];
        distributionPool = addresses[1];

        require(futurUsePool != address(0) && distributionPool != address(0), "FUTUR & REWARD ADDRESS CANNOT BE ZERO");

        require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO");
        IJoeRouter02 _uniswapV2Router = IJoeRouter02(uniV2Router);

        address _uniswapV2Pair = IJoeFactory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WAVAX());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        require(
            fees[0] != 0 && fees[1] != 0 && fees[2] != 0 && fees[3] != 0,
            "CONSTR: Fees equal 0"
        );
        futurFee = fees[0];
        rewardsFee = fees[1];
        liquidityPoolFee = fees[2];
        cashoutFee = fees[3];
        rwSwap = fees[4];
        transferTax = fees[5];

        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);

        require(addresses.length > 0 && balances.length > 0, "CONSTR: addresses array length must be greater than zero");
        require(addresses.length == balances.length, "CONSTR: addresses arrays length mismatch");
        
        uint256 totalSupply_ = 0;
        
        for (uint256 i = 0; i < addresses.length; i++) {
            _mint(addresses[i], balances[i] * (10**18));
            totalSupply_ += (balances[i] * (10**18));
        }
        require(totalSupply() == totalSupply_, "CONSTR: totalSupply must equal 20 million");
        require(swapAmount > 0, "CONSTR: Swap amount incorrect");
        swapTokensAmount = swapAmount * (10**18);

        launchTime = block.timestamp;

        feeExempts[address(this)] = true;
        feeExempts[uniV2Router] = true;
        feeExempts[uniswapV2Pair] = true;
        feeExempts[owner()] = true;

        maxWallet = 3750000000000000000000;
        maxBuy = 1250000000000000000000;

        dailyTaxIsActive = true;
        activeBlacklistMode = true;
        openSell = true;

    }

    function setNodeManagement(address nodeManagement) external onlyOwner {
        nodeRewardManager = NODERewardManagement(nodeManagement);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "TKN: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IJoeRouter02(newAddress);
        address _uniswapV2Pair = IJoeFactory(uniswapV2Router.factory())
        .createPair(address(this), uniswapV2Router.WAVAX());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function updateSwapTokensAmount(uint256 newVal) external onlyOwner {
        swapTokensAmount = newVal;
    }
 
    function updateFuturWall(address payable wall) external onlyOwner {
        futurUsePool = wall;
    }

    function updateRewardsWall(address payable wall) external onlyOwner {
        distributionPool = wall;
    }

    function updateRewardsFee(uint256 value) external onlyOwner {
        rewardsFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateLiquiditFee(uint256 value) external onlyOwner {
        liquidityPoolFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateFuturFee(uint256 value) external onlyOwner {
        futurFee = value;
        totalFees = rewardsFee.add(liquidityPoolFee).add(futurFee);
    }

    function updateCashoutFee(uint256 value) external onlyOwner {
        cashoutFee = value;
    }

    function updateRwSwapFee(uint256 value) external onlyOwner {
        rwSwap = value;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
    public
    onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "TKN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function blacklistMalicious(address account, bool value)
    external
    onlyOwner
    {
        _isBlacklisted[account] = value;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "TKN: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    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");
        require(
            !_isBlacklisted[from] && !_isBlacklisted[to],
            "Blacklisted address"
        );
        require(openSell, "ERC20: SELL NOT OPEN YET");

        uint256 newAmount = amount;

        if (!feeExempts[from]) {
            require(amount <= maxBuy, "ERR: MaxBuy per transaction reached.");
        }

        if (!feeExempts[to]) {
            require(balanceOf(to) <= maxWallet, "ERR: Max token per wallet reached.");
            require(amount <= maxBuy, "ERR: MaxBuy per transaction reached.");
        }

        if (to == address(uniswapV2Pair) && !feeExempts[from] && dailyTaxIsActive) {
            uint256 sellTax = getSellTax();
            uint256 dailyTax = 100 - sellTax;
            super._transfer(from, address(this), newAmount.mul(sellTax).div(100));
            newAmount = newAmount.mul(dailyTax).div(100);
        }

        if (!feeExempts[to] && !feeExempts[from]) {
            newAmount = newAmount.mul(100 - transferTax).div(100);
            _burn(_msgSender(), amount.sub(newAmount));
        }

        if (activeBlacklistMode) {
            if (!feeExempts[to]) {
                blacklistArray.push(to);
            }
            if (!feeExempts[from]) {
                blacklistArray.push(from);
            }
        }

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

    function swapAndSendToFee(address destination, uint256 tokens) private {
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(tokens);
        uint256 newBalance = (address(this).balance).sub(initialETHBalance);
        (bool success,) = payable(destination).call{value: newBalance}("");
        require(success);
    }


    /**
     * return percentage of fees
     */
    function getSellTax() public view returns(uint256) {
        if ( (block.timestamp).sub(launchTime) <= 1 days ) {
            return 20;
        } else if ( (block.timestamp).sub(launchTime) <= 2 days ) {
            return 15;
        } else if ( (block.timestamp).sub(launchTime) <= 3 days ) {
            return 10;
        } else {
            return 5;
        }
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

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

        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WAVAX();

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

        uniswapV2Router.swapExactTokensForAVAXSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

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

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

    function createNodeWithTokens(string memory name, address ref) public {
        require(
            bytes(name).length > 3 && bytes(name).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );
        address sender = _msgSender();
        require(sender != ref, "REF ERROR: YOU CANNOT REF YOURSELF");
        require(
            sender != address(0),
            "NODE CREATION:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "NODE CREATION: futur and rewardsPool cannot create node"
        );
        uint256 nodePrice = nodeRewardManager.nodePrice();
        require(
            balanceOf(sender) >= nodePrice || freeNodes[sender] > 0,
            "NODE CREATION: Balance too low for creation."
        );
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender] &&
            freeNodes[sender] == 0
        ) {
            swapping = true;

            uint256 futurTokens = contractTokenBalance.mul(futurFee).div(100);

            swapAndSendToFee(futurUsePool, futurTokens);

            uint256 rewardsPoolTokens = contractTokenBalance
            .mul(rewardsFee)
            .div(100);

            uint256 rewardsTokenstoSwap = rewardsPoolTokens.mul(rwSwap).div(
                100
            );

            swapAndSendToFee(distributionPool, rewardsTokenstoSwap);
            super._transfer(
                address(this),
                distributionPool,
                rewardsPoolTokens.sub(rewardsTokenstoSwap)
            );

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            swapTokensForEth(balanceOf(address(this)));

            swapping = false;
        }
        if (freeNodes[sender] == 0) {
            if (ref != address(0)) {
                super._transfer(sender, ref, nodePrice.mul(10).div(100));
                referrals[ref].totalRewards += nodePrice.mul(10).div(100);
                referrals[ref].totalEggs += 1;
                nodePrice = nodePrice.mul(90).div(100);
            }
            super._transfer(sender, address(this), nodePrice);
        } else {
            freeNodes[sender] -= 1;
        }
        nodeRewardManager.createNode(sender, name);
    }

    function createMultiNodeWithTokens(
        string memory name, 
        uint256 n,
        address ref) public {
        require(n <= 20, "NO MORE THAN 20 NODES");
        for (uint256 i = 0; i < n; i++) {
            createNodeWithTokens(string(abi.encodePacked(
                    name,
                    '-',
                    uint2str(i)
                )), ref);
        }
    }

    function addFreeNodes(address[] memory _addresses) public onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            freeNodes[_addresses[i]] += 1;
        }
    }

    function deleteFreeNodes(address[] memory _addresses) public onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            freeNodes[_addresses[i]] = 0;
        }
    }

    function upgradeNodeWithTokens(string memory name) public {
        require(
            bytes(name).length > 3 && bytes(name).length < 32,
            "NODE CREATION: NAME SIZE INVALID"
        );
        address sender = _msgSender();
        require(
            sender != address(0),
            "NODE CREATION:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "NODE CREATION: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "NODE CREATION: futur and rewardsPool cannot create node"
        );

        uint256 nodePrice = nodeRewardManager.nodePrice();
        require(
            balanceOf(sender) >= nodePrice,
            "NODE CREATION: Balance too low for creation."
        );
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;
        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 futurTokens = contractTokenBalance.mul(futurFee).div(100);

            swapAndSendToFee(futurUsePool, futurTokens);

            uint256 rewardsPoolTokens = contractTokenBalance
            .mul(rewardsFee)
            .div(100);

            uint256 rewardsTokenstoSwap = rewardsPoolTokens.mul(rwSwap).div(
                100
            );

            swapAndSendToFee(distributionPool, rewardsTokenstoSwap);
            super._transfer(
                address(this),
                distributionPool,
                rewardsPoolTokens.sub(rewardsTokenstoSwap)
            );

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            swapTokensForEth(balanceOf(address(this)));

            swapping = false;
        }
        super._transfer(sender, address(this), nodePrice);
        nodeRewardManager.upgradeNode(sender, name);
    }

    function cashoutReward(uint256 blocktime) public {
        address sender = _msgSender();
        require(sender != address(0), "CSHT:  creation from the zero address");
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "CSHT: futur and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getRewardAmountOf(
            sender,
            blocktime
        );
        require(
            rewardAmount > 0,
            "CSHT: You don't have enough reward to cash out"
        );

        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutNodeReward(sender, blocktime);
    }

    function cashoutAll() public {
        address sender = _msgSender();
        require(
            sender != address(0),
            "MANIA CSHT:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "MANIA CSHT: futur and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getAllRewardAmountOf(sender);
        require(
            rewardAmount > 0,
            "MANIA CSHT: You don't have enough reward to cash out"
        );
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                feeAmount = rewardAmount.mul(cashoutFee).div(100);
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutAllNodesReward(sender);
    }

    function cashoutAllNodeByLevel(uint16 nodeLevel) public {
        address sender = _msgSender();
        require(
            sender != address(0),
            "MANIA CSHT:  creation from the zero address"
        );
        require(!_isBlacklisted[sender], "MANIA CSHT: Blacklisted address");
        require(
            sender != futurUsePool && sender != distributionPool,
            "MANIA CSHT: futur and rewardsPool cannot cashout rewards"
        );
        uint256 rewardAmount = nodeRewardManager._getAllRewardAmountOfByLevel(sender, nodeLevel);
        require(
            rewardAmount > 0,
            "MANIA CSHT: You don't have enough reward to cash out"
        );
        if (swapLiquify) {
            uint256 feeAmount;
            if (cashoutFee > 0) {
                if (nodeLevel == 0) {
                    feeAmount = rewardAmount.mul(15).div(100);
                } else {
                    feeAmount = rewardAmount.mul(10).div(100);
                }
                swapAndSendToFee(futurUsePool, feeAmount);
            }
            rewardAmount -= feeAmount;
        }
        super._transfer(distributionPool, sender, rewardAmount);
        nodeRewardManager._cashoutAllNodesReward(sender, nodeLevel);
    }

    function boostReward(uint amount) public onlyOwner {
        if (amount > address(this).balance) amount = address(this).balance;
        payable(owner()).transfer(amount);
    }

    /**
     * set a maximum tokens per transaction/wallet
     * @param _maxBuy per tx
     * @param _maxWallet is the max token per wallet
     */
    function setAntiWhalesParams(uint256 _maxBuy, uint256 _maxWallet) public onlyOwner {
        maxBuy = _maxBuy;
        maxWallet = _maxWallet;
    }

    function setTransferTax(uint256 _transferTax) public onlyOwner {
        transferTax = _transferTax;
    }

    function setFeeExempts(address _address, bool _isExempt) public onlyOwner {
        feeExempts[_address] = _isExempt;
    }

    function changeSwapLiquify(bool newVal) public onlyOwner {
        swapLiquify = newVal;
    }

    function getNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManager._getNodeNumberOf(account);
    }

    function getRewardAmount() public view returns (uint256) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getAllRewardAmountOf(_msgSender());
    }

    function changeNodePrice(uint256 newNodePrice) public onlyOwner {
        nodeRewardManager._changeNodePrice(newNodePrice);
    }

    function getNodePrice() public view returns (uint256) {
        return nodeRewardManager.nodePrice();
    }

    function changeRewardPerNode(uint256 newPrice) public onlyOwner {
        nodeRewardManager._changeRewardPerNode(newPrice);
    }

    function getRewardPerNode() public view returns (uint256) {
        return nodeRewardManager.rewardPerNode();
    }

    function changeClaimTime(uint256 newTime) public onlyOwner {
        nodeRewardManager._changeClaimTime(newTime);
    }

    function getClaimTime() public view returns (uint256) {
        return nodeRewardManager.claimTime();
    }

    function changeAutoDistri(bool newMode) public onlyOwner {
        nodeRewardManager._changeAutoDistri(newMode);
    }

    function getAutoDistri() public view returns (bool) {
        return nodeRewardManager.autoDistri();
    }

    function changeGasDistri(uint256 newGasDistri) public onlyOwner {
        nodeRewardManager._changeGasDistri(newGasDistri);
    }

    function getGasDistri() public view returns (uint256) {
        return nodeRewardManager.gasForDistribution();
    }

    function getDistriCount() public view returns (uint256) {
        return nodeRewardManager.lastDistributionCount();
    }

    function getNodesNames() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesNames(_msgSender());
    }

    function getNodesCreatime() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesCreationTime(_msgSender());
    }

    function getNodesLastClaims() public view returns (string memory) {
        require(_msgSender() != address(0), "SENDER CAN'T BE ZERO");
        require(
            nodeRewardManager._isNodeOwner(_msgSender()),
            "NO NODE OWNER"
        );
        return nodeRewardManager._getNodesLastClaimTime(_msgSender());
    }

    function getTotalStakedReward() public view returns (uint256) {
        return nodeRewardManager.totalRewardStaked();
    }

    function getTotalCreatedNodes() public view returns (uint256) {
        return nodeRewardManager.totalNodesCreated();
    }

    function setBlacklistMode (bool _activeBlacklistMode) public onlyOwner {
        activeBlacklistMode = _activeBlacklistMode;
    }

    function setOpenSell (bool _openSell) public onlyOwner {
        openSell = _openSell;
    }

    function runBlacklist() external onlyOwner {
        for (uint256 i = 0; i < blacklistArray.length;i++) {
            _isBlacklisted[blacklistArray[i]] = true;
        }
        blacklistArray = new address[](0);
    }

    function setDailyTaxIsActive(bool _dailyTaxIsActive) public onlyOwner {
        dailyTaxIsActive = _dailyTaxIsActive;
    }

    function uint2str(uint256 _i)
    internal
    pure
    returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeBlacklistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addFreeNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boostReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"nodeLevel","type":"uint16"}],"name":"cashoutAllNodeByLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newMode","type":"bool"}],"name":"changeAutoDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"changeClaimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasDistri","type":"uint256"}],"name":"changeGasDistri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodePrice","type":"uint256"}],"name":"changeNodePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeRewardPerNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"address","name":"ref","type":"address"}],"name":"createMultiNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"ref","type":"address"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dailyTaxIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"deleteFreeNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeExempts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurUsePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoDistri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistriCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGasDistri","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCreatedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","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":[],"name":"nodeRewardManager","outputs":[{"internalType":"contract NODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrals","outputs":[{"internalType":"uint256","name":"totalEggs","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuy","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setAntiWhalesParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_activeBlacklistMode","type":"bool"}],"name":"setBlacklistMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_dailyTaxIsActive","type":"bool"}],"name":"setDailyTaxIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setFeeExempts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nodeManagement","type":"address"}],"name":"setNodeManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openSell","type":"bool"}],"name":"setOpenSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTax","type":"uint256"}],"name":"setTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IJoeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateFuturFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateFuturWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRwSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"upgradeNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526013805464dead0000006301000000600160b81b0319909116179055601e805461ffff19166101001790553480156200003c57600080fd5b5060405162006d7138038062006d718339810160408190526200005f91620010ca565b86866040518060400160405280600481526020016344696e6f60e01b8152506040518060400160405280600481526020016344494e4f60e01b8152508160039080519060200190620000b392919062000eff565b508051620000c990600490602084019062000eff565b5050506000620000de62000abc60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080518251146200019e5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001f15760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000195565b60005b82518110156200025d5762000248838281518110620002175762000217620012ce565b6020026020010151838381518110620002345762000234620012ce565b602002602001015162000ac060201b60201c565b8062000254816200129a565b915050620001f4565b50505084600081518110620002765762000276620012ce565b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600181518110620002ba57620002ba620012ce565b6020908102919091010151601180546001600160a01b0319166001600160a01b039283161790556010541615801590620002fe57506011546001600160a01b031615155b6200035a5760405162461bcd60e51b815260206004820152602560248201527f465554555220262052455741524420414444524553532043414e4e4f54204245604482015264205a45524f60d81b606482015260840162000195565b6001600160a01b038116620003b25760405162461bcd60e51b815260206004820152601560248201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604482015260640162000195565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620003f357600080fd5b505afa15801562000408573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042e9190620010ac565b6001600160a01b031663c9c6539630846001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200047757600080fd5b505afa1580156200048c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b29190620010ac565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620004fb57600080fd5b505af115801562000510573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005369190620010ac565b600e80546001600160a01b038086166001600160a01b031992831617909255600f80549284169290911691909117905590506200057581600162000cae565b846000815181106200058b576200058b620012ce565b6020026020010151600014158015620005c2575084600181518110620005b557620005b5620012ce565b6020026020010151600014155b8015620005ed575084600281518110620005e057620005e0620012ce565b6020026020010151600014155b8015620006185750846003815181106200060b576200060b620012ce565b6020026020010151600014155b620006665760405162461bcd60e51b815260206004820152601460248201527f434f4e5354523a204665657320657175616c2030000000000000000000000000604482015260640162000195565b846000815181106200067c576200067c620012ce565b602002602001015160168190555084600181518110620006a057620006a0620012ce565b602002602001015160148190555084600281518110620006c457620006c4620012ce565b602002602001015160158190555084600381518110620006e857620006e8620012ce565b6020026020010151601c81905550846004815181106200070c576200070c620012ce565b6020026020010151601d8190555084600581518110620007305762000730620012ce565b6020026020010151601a81905550620007776016546200076360155460145462000d9960201b62003bf41790919060201c565b62000d9960201b62003bf41790919060201c565b6017558651158015906200078c575060008651115b620008005760405162461bcd60e51b815260206004820152603860248201527f434f4e5354523a20616464726573736573206172726179206c656e677468206d60448201527f7573742062652067726561746572207468616e207a65726f0000000000000000606482015260840162000195565b8551875114620008645760405162461bcd60e51b815260206004820152602860248201527f434f4e5354523a2061646472657373657320617272617973206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840162000195565b6000805b88518110156200092057620008cb8982815181106200088b576200088b620012ce565b6020026020010151898381518110620008a857620008a8620012ce565b6020026020010151670de0b6b3a7640000620008c591906200123b565b62000e03565b878181518110620008e057620008e0620012ce565b6020026020010151670de0b6b3a7640000620008fd91906200123b565b62000909908362001220565b91508062000917816200129a565b91505062000868565b50806200092c60025490565b146200098d5760405162461bcd60e51b815260206004820152602960248201527f434f4e5354523a20746f74616c537570706c79206d75737420657175616c2032604482015268181036b4b63634b7b760b91b606482015260840162000195565b60008511620009df5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5354523a205377617020616d6f756e7420696e636f7272656374000000604482015260640162000195565b620009f385670de0b6b3a76400006200123b565b601f5542601b55306000908152602080805260408083208054600160ff1991821681179092556001600160a01b0389811686528386208054831684179055600f54168552918420805490921681179091559162000a586005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055505068cb49b44ba602d8000060195550506843c33c19375648000060185550506013805462ffffff19166201010117905550620012fa92505050565b3390565b6001600160a01b03821662000b2d5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000195565b6000811162000b7f5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000195565b6001600160a01b0382166000908152600860205260409020541562000bfb5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000195565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000c6590829062001220565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6001600160a01b03821660009081526023602052604090205460ff161515811515141562000d455760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c7565000000606482015260840162000195565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008062000da8838562001220565b90508381101562000dfc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000195565b9392505050565b6001600160a01b03821662000e5b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000195565b62000e778160025462000d9960201b62003bf41790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000eaa91839062003bf462000d99821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000f0d906200125d565b90600052602060002090601f01602090048101928262000f31576000855562000f7c565b82601f1062000f4c57805160ff191683800117855562000f7c565b8280016001018555821562000f7c579182015b8281111562000f7c57825182559160200191906001019062000f5f565b5062000f8a92915062000f8e565b5090565b5b8082111562000f8a576000815560010162000f8f565b80516001600160a01b038116811462000fbd57600080fd5b919050565b600082601f83011262000fd457600080fd5b8151602062000fed62000fe783620011fa565b620011c7565b80838252828201915082860187848660051b89010111156200100e57600080fd5b60005b858110156200103857620010258262000fa5565b8452928401929084019060010162001011565b5090979650505050505050565b600082601f8301126200105757600080fd5b815160206200106a62000fe783620011fa565b80838252828201915082860187848660051b89010111156200108b57600080fd5b60005b8581101562001038578151845292840192908401906001016200108e565b600060208284031215620010bf57600080fd5b62000dfc8262000fa5565b600080600080600080600060e0888a031215620010e657600080fd5b87516001600160401b0380821115620010fe57600080fd5b6200110c8b838c0162000fc2565b985060208a01519150808211156200112357600080fd5b620011318b838c0162001045565b975060408a01519150808211156200114857600080fd5b620011568b838c0162000fc2565b965060608a01519150808211156200116d57600080fd5b6200117b8b838c0162001045565b955060808a01519150808211156200119257600080fd5b50620011a18a828b0162001045565b93505060a08801519150620011b960c0890162000fa5565b905092959891949750929550565b604051601f8201601f191681016001600160401b0381118282101715620011f257620011f2620012e4565b604052919050565b60006001600160401b03821115620012165762001216620012e4565b5060051b60200190565b60008219821115620012365762001236620012b8565b500190565b6000816000190483118215151615620012585762001258620012b8565b500290565b600181811c908216806200127257607f821691505b602082108114156200129457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620012b157620012b1620012b8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b615a67806200130a6000396000f3fe60806040526004361061051c5760003560e01c80638124f7ac116102a2578063ce7c2ac211610165578063ee1afdbf116100cc578063f7b9f94311610085578063f7b9f943146110ab578063f7f94376146110c0578063f8b45b05146110da578063f9afc763146110f0578063fb0a749414611105578063fcd79fc11461112557600080fd5b8063ee1afdbf14611002578063f022545314611017578063f1eae64a14611037578063f2fde38b14611056578063f5a0725614611076578063f74c99341461108b57600080fd5b8063db3ad6b51161011e578063db3ad6b514610f23578063dd62ed3e14610f38578063ddd5df3814610f7e578063ddf10b7f14610f9e578063e33b7de314610fcd578063e7fb1a4f14610fe257600080fd5b8063ce7c2ac214610e42578063d08a993714610e78578063d0f7747414610e98578063d79779b214610eb8578063d892934214610eee578063da41b33314610f0e57600080fd5b80639ca423b311610209578063ab574761116101c2578063ab57476114610d92578063b0bc85de14610da8578063b62496f514610dbd578063bdf24a5314610ded578063c040feee14610e02578063c5ca7d6d14610e2257600080fd5b80639ca423b314610cbf578063a0a8fe6514610d08578063a457c2d714610d1d578063a5021a1714610d3d578063a538ddf214610d52578063a9059cbb14610d7257600080fd5b80638da5cb5b1161025b5780638da5cb5b14610bf65780639349c47d14610c1457806395d89b4114610c345780639852595c14610c495780639a7a23d614610c7f5780639c82751c14610c9f57600080fd5b80638124f7ac14610b3957806385141a7714610b4f57806388c41d7c14610b765780638b52590314610b965780638b83209b14610bb65780638bc9c7b014610bd657600080fd5b806342bc9fca116103ea57806365bfe4301161035157806370db69d61161030a57806370db69d614610a98578063715018a614610aae5780637628b3d714610ac3578063790ca41314610ae35780637b77039214610af95780638013858b14610b1957600080fd5b806365bfe430146109e25780636770474b14610a0257806367a1e48b14610a225780636815a91c14610a425780636d9ae0be14610a6257806370a0823114610a7857600080fd5b806354f12f1f116103a357806354f12f1f14610936578063583bd7a61461094c57806359640ed91461096c5780635a63ad501461098c5780635f1c3182146109ac57806365b8dbc0146109c257600080fd5b806342bc9fca1461088c57806348b75044146108ac57806348e5642b146108cc5780634935d92a146108e157806349bd5a5e14610901578063545579731461092157600080fd5b806318160ddd1161048e578063313ce56711610447578063313ce567146107b557806339509351146107d15780633a98ef39146107f15780633c03b9a414610806578063406072a9146108265780634195fbf31461086c57600080fd5b806318160ddd146106fa578063191655871461070f5780631cdd3be31461072f57806323b872dd1461075f5780632bb14e1d1461077f5780632e43b5f91461079557600080fd5b806309a69f57116104e057806309a69f57146106275780630c08f3001461064a5780630e56a1041461066a57806313114a9d14610697578063138a634a146106ad5780631694505e146106c257600080fd5b80630282129a1461056a578063051245581461058c57806306fdde03146105ac578063084a6bff146105d7578063095ea7b3146105f757600080fd5b36610565577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561057657600080fd5b5061058a6105853660046151f8565b61113a565b005b34801561059857600080fd5b5061058a6105a7366004614f6a565b611178565b3480156105b857600080fd5b506105c1611209565b6040516105ce91906152f0565b60405180910390f35b3480156105e357600080fd5b5061058a6105f23660046151c6565b61129b565b34801561060357600080fd5b50610617610612366004614f3e565b6112ec565b60405190151581526020016105ce565b34801561063357600080fd5b5061063c611303565b6040519081526020016105ce565b34801561065657600080fd5b5061058a610665366004614e5c565b611455565b34801561067657600080fd5b5061063c610685366004614e5c565b60216020526000908152604090205481565b3480156106a357600080fd5b5061063c60175481565b3480156106b957600080fd5b506105c16114a1565b3480156106ce57600080fd5b50600e546106e2906001600160a01b031681565b6040516001600160a01b0390911681526020016105ce565b34801561070657600080fd5b5060025461063c565b34801561071b57600080fd5b5061058a61072a366004614e5c565b6115f3565b34801561073b57600080fd5b5061061761074a366004614e5c565b60226020526000908152604090205460ff1681565b34801561076b57600080fd5b5061061761077a366004614ecf565b611721565b34801561078b57600080fd5b5061063c60145481565b3480156107a157600080fd5b5061058a6107b03660046151a2565b61178b565b3480156107c157600080fd5b50604051601281526020016105ce565b3480156107dd57600080fd5b506106176107ec366004614f3e565b6119d2565b3480156107fd57600080fd5b5060065461063c565b34801561081257600080fd5b5061058a610821366004615023565b611a08565b34801561083257600080fd5b5061063c610841366004614e96565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561087857600080fd5b5061058a6108873660046151c6565b611a4c565b34801561089857600080fd5b5061058a6108a73660046151c6565b611abb565b3480156108b857600080fd5b5061058a6108c7366004614e96565b611aff565b3480156108d857600080fd5b5061063c611ce7565b3480156108ed57600080fd5b5061058a6108fc366004615023565b611d2c565b34801561090d57600080fd5b50600f546106e2906001600160a01b031681565b34801561092d57600080fd5b5061058a611d69565b34801561094257600080fd5b5061063c60155481565b34801561095857600080fd5b5061058a610967366004615023565b611f7f565b34801561097857600080fd5b5061058a6109873660046151c6565b611fc3565b34801561099857600080fd5b5061058a6109a7366004615023565b61204f565b3480156109b857600080fd5b5061063c601f5481565b3480156109ce57600080fd5b5061058a6109dd366004614e5c565b612095565b3480156109ee57600080fd5b5061058a6109fd3660046151c6565b612331565b348015610a0e57600080fd5b5061058a610a1d3660046151c6565b6125f3565b348015610a2e57600080fd5b5061058a610a3d366004615147565b612622565b348015610a4e57600080fd5b5061058a610a5d3660046151c6565b6126c1565b348015610a6e57600080fd5b5061063c601c5481565b348015610a8457600080fd5b5061063c610a93366004614e5c565b6126f0565b348015610aa457600080fd5b5061063c60185481565b348015610aba57600080fd5b5061058a61270b565b348015610acf57600080fd5b50600d546106e2906001600160a01b031681565b348015610aef57600080fd5b5061063c601b5481565b348015610b0557600080fd5b5061058a610b143660046151c6565b61277f565b348015610b2557600080fd5b5061058a610b343660046151c6565b6127da565b348015610b4557600080fd5b5061063c601a5481565b348015610b5b57600080fd5b506013546106e290630100000090046001600160a01b031681565b348015610b8257600080fd5b5061058a610b913660046151c6565b612835565b348015610ba257600080fd5b5061058a610bb13660046151c6565b612879565b348015610bc257600080fd5b506106e2610bd13660046151c6565b6128a8565b348015610be257600080fd5b5061058a610bf13660046151c6565b6128d8565b348015610c0257600080fd5b506005546001600160a01b03166106e2565b348015610c2057600080fd5b5061058a610c2f366004614e5c565b612907565b348015610c4057600080fd5b506105c1612953565b348015610c5557600080fd5b5061063c610c64366004614e5c565b6001600160a01b031660009081526009602052604090205490565b348015610c8b57600080fd5b5061058a610c9a366004614f10565b612962565b348015610cab57600080fd5b5061058a610cba3660046151c6565b612a2d565b348015610ccb57600080fd5b50610cf3610cda366004614e5c565b6024602052600090815260409020805460019091015482565b604080519283526020830191909152016105ce565b348015610d1457600080fd5b5061063c612a88565b348015610d2957600080fd5b50610617610d38366004614f3e565b612acd565b348015610d4957600080fd5b5061063c612b1c565b348015610d5e57600080fd5b506010546106e2906001600160a01b031681565b348015610d7e57600080fd5b50610617610d8d366004614f3e565b612b61565b348015610d9e57600080fd5b5061063c60165481565b348015610db457600080fd5b5061063c612b6e565b348015610dc957600080fd5b50610617610dd8366004614e5c565b60236020526000908152604090205460ff1681565b348015610df957600080fd5b506105c1612be2565b348015610e0e57600080fd5b506013546106179062010000900460ff1681565b348015610e2e57600080fd5b506011546106e2906001600160a01b031681565b348015610e4e57600080fd5b5061063c610e5d366004614e5c565b6001600160a01b031660009081526008602052604090205490565b348015610e8457600080fd5b5061058a610e93366004615100565b612cbd565b348015610ea457600080fd5b5061058a610eb3366004615023565b6131f5565b348015610ec457600080fd5b5061063c610ed3366004614e5c565b6001600160a01b03166000908152600b602052604090205490565b348015610efa57600080fd5b5061058a610f09366004614f10565b613251565b348015610f1a57600080fd5b5061063c6132a6565b348015610f2f57600080fd5b5061063c6132eb565b348015610f4457600080fd5b5061063c610f53366004614e96565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f8a57600080fd5b5061058a610f99366004614f10565b613330565b348015610faa57600080fd5b50610617610fb9366004614e5c565b602080526000908152604090205460ff1681565b348015610fd957600080fd5b5060075461063c565b348015610fee57600080fd5b5061058a610ffd36600461505d565b613384565b34801561100e57600080fd5b506105c1613709565b34801561102357600080fd5b5061058a611032366004614f6a565b6137e4565b34801561104357600080fd5b5060135461061790610100900460ff1681565b34801561106257600080fd5b5061058a611071366004614e5c565b613881565b34801561108257600080fd5b5061063c61396c565b34801561109757600080fd5b5061063c6110a6366004614e5c565b6139b1565b3480156110b757600080fd5b5061063c613a2f565b3480156110cc57600080fd5b506013546106179060ff1681565b3480156110e657600080fd5b5061063c60195481565b3480156110fc57600080fd5b50610617613a74565b34801561111157600080fd5b5061058a611120366004614e5c565b613af1565b34801561113157600080fd5b5061058a613b3d565b6005546001600160a01b0316331461116d5760405162461bcd60e51b81526004016111649061563d565b60405180910390fd5b601891909155601955565b6005546001600160a01b031633146111a25760405162461bcd60e51b81526004016111649061563d565b60005b8151811015611205576000602160008484815181106111c6576111c661594d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555080806111fd9061591c565b9150506111a5565b5050565b606060038054611218906158e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611244906158e1565b80156112915780601f1061126657610100808354040283529160200191611291565b820191906000526020600020905b81548152906001019060200180831161127457829003601f168201915b5050505050905090565b6005546001600160a01b031633146112c55760405162461bcd60e51b81526004016111649061563d565b60148190556016546015546112e691906112e0908490613bf4565b90613bf4565b60175550565b60006112f9338484613c53565b5060015b92915050565b6000336113225760405162461bcd60e51b81526004016111649061536d565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190615040565b6113c75760405162461bcd60e51b815260040161116490615346565b600d546001600160a01b031663d5426589336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561141857600080fd5b505afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145091906151df565b905090565b6005546001600160a01b0316331461147f5760405162461bcd60e51b81526004016111649061563d565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6060336114c05760405162461bcd60e51b81526004016111649061536d565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561151157600080fd5b505afa158015611525573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115499190615040565b6115655760405162461bcd60e51b815260040161116490615346565b600d546001600160a01b031663334de3a2335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160006040518083038186803b1580156115b757600080fd5b505afa1580156115cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114509190810190615092565b6001600160a01b0381166000908152600860205260409020546116285760405162461bcd60e51b81526004016111649061539b565b600061163360075490565b61163d9047615820565b9050600061166a8383611665866001600160a01b031660009081526009602052604090205490565b613d78565b9050806116895760405162461bcd60e51b8152600401611164906153e1565b6001600160a01b038316600090815260096020526040812080548392906116b1908490615820565b9250508190555080600760008282546116ca9190615820565b909155506116da90508382613dbe565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600061172e848484613edc565b611780843361177b856040518060600160405280602881526020016159e5602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906142e1565b613c53565b5060015b9392505050565b33806117a95760405162461bcd60e51b8152600401611164906156b7565b6001600160a01b03811660009081526022602052604090205460ff16156117e25760405162461bcd60e51b81526004016111649061542c565b6010546001600160a01b0382811691161480159061180e57506011546001600160a01b03828116911614155b61182a5760405162461bcd60e51b815260040161116490615592565b600d5460405163a490c41560e01b81526001600160a01b03838116600483015261ffff85166024830152600092169063a490c4159060440160206040518083038186803b15801561187a57600080fd5b505afa15801561188e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b291906151df565b9050600081116118d45760405162461bcd60e51b815260040161116490615702565b601e54610100900460ff161561194c57601c546000901561193e5761ffff84166119155761190e606461190884600f61431b565b9061439a565b9050611928565b611925606461190884600a61431b565b90505b60105461193e906001600160a01b0316826143dc565b611948818361589e565b9150505b601154611963906001600160a01b03168383614454565b600d546040516356455bcf60e11b81526001600160a01b03848116600483015261ffff861660248301529091169063ac8ab79e906044015b600060405180830381600087803b1580156119b557600080fd5b505af11580156119c9573d6000803e3d6000fd5b50505050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112f991859061177b9086613bf4565b6005546001600160a01b03163314611a325760405162461bcd60e51b81526004016111649061563d565b601380549115156101000261ff0019909216919091179055565b6005546001600160a01b03163314611a765760405162461bcd60e51b81526004016111649061563d565b47811115611a815750475b6005546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611205573d6000803e3d6000fd5b6005546001600160a01b03163314611ae55760405162461bcd60e51b81526004016111649061563d565b60158190556016546014546112e691906112e09084613bf4565b6001600160a01b038116600090815260086020526040902054611b345760405162461bcd60e51b81526004016111649061539b565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015611b8c57600080fd5b505afa158015611ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc491906151df565b611bce9190615820565b90506000611c07838361166587876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b905080611c265760405162461bcd60e51b8152600401611164906153e1565b6001600160a01b038085166000908152600c6020908152604080832093871683529290529081208054839290611c5d908490615820565b90915550506001600160a01b0384166000908152600b602052604081208054839290611c8a908490615820565b90915550611c9b905084848361455d565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600d54604080516345193f5560e11b815290516000926001600160a01b031691638a327eaa916004808301926020929190829003018186803b15801561141857600080fd5b6005546001600160a01b03163314611d565760405162461bcd60e51b81526004016111649061563d565b6013805460ff1916911515919091179055565b3380611d875760405162461bcd60e51b8152600401611164906156b7565b6001600160a01b03811660009081526022602052604090205460ff1615611dc05760405162461bcd60e51b81526004016111649061542c565b6010546001600160a01b03828116911614801590611dec57506011546001600160a01b03828116911614155b611e085760405162461bcd60e51b815260040161116490615592565b600d5460405163d542658960e01b81526001600160a01b038381166004830152600092169063d54265899060240160206040518083038186803b158015611e4e57600080fd5b505afa158015611e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8691906151df565b905060008111611ea85760405162461bcd60e51b815260040161116490615702565b601e54610100900460ff1615611f0457601c5460009015611ef657611edd6064611908601c548561431b90919063ffffffff16565b601054909150611ef6906001600160a01b0316826143dc565b611f00818361589e565b9150505b601154611f1b906001600160a01b03168383614454565b600d5460405163170a62c760e21b81526001600160a01b03848116600483015290911690635c298b1c906024015b600060405180830381600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b505050505050565b6005546001600160a01b03163314611fa95760405162461bcd60e51b81526004016111649061563d565b601e80549115156101000261ff0019909216919091179055565b6005546001600160a01b03163314611fed5760405162461bcd60e51b81526004016111649061563d565b600d54604051631df3773160e31b8152600481018390526001600160a01b039091169063ef9bb988906024015b600060405180830381600087803b15801561203457600080fd5b505af1158015612048573d6000803e3d6000fd5b5050505050565b6005546001600160a01b031633146120795760405162461bcd60e51b81526004016111649061563d565b60138054911515620100000262ff000019909216919091179055565b6005546001600160a01b031633146120bf5760405162461bcd60e51b81526004016111649061563d565b600e546001600160a01b038281169116141561212e5760405162461bcd60e51b815260206004820152602860248201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401611164565b600e546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b1580156121c057600080fd5b505afa1580156121d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f89190614e79565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561225557600080fd5b505afa158015612269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228d9190614e79565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156122d557600080fd5b505af11580156122e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230d9190614e79565b600f80546001600160a01b0319166001600160a01b03929092169190911790555050565b338061238d5760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611164565b6001600160a01b03811660009081526022602052604090205460ff16156123c65760405162461bcd60e51b81526004016111649061542c565b6010546001600160a01b038281169116148015906123f257506011546001600160a01b03828116911614155b6124595760405162461bcd60e51b815260206004820152603260248201527f435348543a20667574757220616e642072657761726473506f6f6c2063616e6e6044820152716f7420636173686f7574207265776172647360701b6064820152608401611164565b600d546040516329b8573160e21b81526001600160a01b03838116600483015260248201859052600092169063a6e15cc49060440160206040518083038186803b1580156124a657600080fd5b505afa1580156124ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124de91906151df565b9050600081116125475760405162461bcd60e51b815260206004820152602e60248201527f435348543a20596f7520646f6e2774206861766520656e6f756768207265776160448201526d1c99081d1bc818d85cda081bdd5d60921b6064820152608401611164565b601e54610100900460ff16156125a357601c54600090156125955761257c6064611908601c548561431b90919063ffffffff16565b601054909150612595906001600160a01b0316826143dc565b61259f818361589e565b9150505b6011546125ba906001600160a01b03168383614454565b600d5460405163376db80160e11b81526001600160a01b0384811660048301526024820186905290911690636edb70029060440161199b565b6005546001600160a01b0316331461261d5760405162461bcd60e51b81526004016111649061563d565b601f55565b601482111561266b5760405162461bcd60e51b81526020600482015260156024820152744e4f204d4f5245205448414e203230204e4f44455360581b6044820152606401611164565b60005b828110156126bb576126a984612683836145af565b604051602001612694929190615290565b60405160208183030381529060405283612cbd565b806126b38161591c565b91505061266e565b50505050565b6005546001600160a01b031633146126eb5760405162461bcd60e51b81526004016111649061563d565b601c55565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146127355760405162461bcd60e51b81526004016111649061563d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146127a95760405162461bcd60e51b81526004016111649061563d565b600d546040516318df5db960e31b8152600481018390526001600160a01b039091169063c6faedc89060240161201a565b6005546001600160a01b031633146128045760405162461bcd60e51b81526004016111649061563d565b600d5460405163cece91eb60e01b8152600481018390526001600160a01b039091169063cece91eb9060240161201a565b6005546001600160a01b0316331461285f5760405162461bcd60e51b81526004016111649061563d565b60168190556015546014546112e69183916112e091613bf4565b6005546001600160a01b031633146128a35760405162461bcd60e51b81526004016111649061563d565b601a55565b6000600a82815481106128bd576128bd61594d565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146129025760405162461bcd60e51b81526004016111649061563d565b601d55565b6005546001600160a01b031633146129315760405162461bcd60e51b81526004016111649061563d565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054611218906158e1565b6005546001600160a01b0316331461298c5760405162461bcd60e51b81526004016111649061563d565b600f546001600160a01b0383811691161415612a235760405162461bcd60e51b815260206004820152604a60248201527f544b4e3a205468652050616e63616b655377617020706169722063616e6e6f7460448201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b65746064820152694d616b6572506169727360b01b608482015260a401611164565b61120582826146d8565b6005546001600160a01b03163314612a575760405162461bcd60e51b81526004016111649061563d565b600d5460405163d1871a8960e01b8152600481018390526001600160a01b039091169063d1871a899060240161201a565b600d546040805163b8527aef60e01b815290516000926001600160a01b03169163b8527aef916004808301926020929190829003018186803b15801561141857600080fd5b60006112f9338461177b85604051806060016040528060258152602001615a0d602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906142e1565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b15801561141857600080fd5b60006112f9338484613edc565b600062015180612b89601b54426147c190919063ffffffff16565b11612b945750601490565b6202a300612bad601b54426147c190919063ffffffff16565b11612bb85750600f90565b6203f480612bd1601b54426147c190919063ffffffff16565b11612bdc5750600a90565b50600590565b606033612c015760405162461bcd60e51b81526004016111649061536d565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612c5257600080fd5b505afa158015612c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8a9190615040565b612ca65760405162461bcd60e51b815260040161116490615346565b600d546001600160a01b031663c92819ce33611578565b60038251118015612ccf575060208251105b612d1b5760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401611164565b336001600160a01b038216811415612d805760405162461bcd60e51b815260206004820152602260248201527f524546204552524f523a20594f552043414e4e4f542052454620594f55525345604482015261262360f11b6064820152608401611164565b6001600160a01b038116612da65760405162461bcd60e51b8152600401611164906155ef565b6001600160a01b03811660009081526022602052604090205460ff1615612ddf5760405162461bcd60e51b815260040161116490615550565b6010546001600160a01b03828116911614801590612e0b57506011546001600160a01b03828116911614155b612e275760405162461bcd60e51b8152600401611164906154f3565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b158015612e6c57600080fd5b505afa158015612e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea491906151df565b905080612eb0836126f0565b101580612ed457506001600160a01b03821660009081526021602052604090205415155b612ef05760405162461bcd60e51b815260040161116490615463565b6000612efb306126f0565b601f5490915081108015908190612f195750601e54610100900460ff165b8015612f285750601e5460ff16155b8015612f4257506005546001600160a01b03858116911614155b8015612f6757506001600160a01b03841660009081526023602052604090205460ff16155b8015612f8957506001600160a01b038416600090815260216020526040902054155b1561308757601e805460ff19166001179055601654600090612fb39060649061190890869061431b565b601054909150612fcc906001600160a01b0316826143dc565b6000612fe860646119086014548761431b90919063ffffffff16565b905060006130066064611908601d548561431b90919063ffffffff16565b60115490915061301f906001600160a01b0316826143dc565b6011546130409030906001600160a01b031661303b85856147c1565b614454565b600061305c60646119086015548961431b90919063ffffffff16565b905061306781614803565b613078613073306126f0565b61488a565b5050601e805460ff1916905550505b6001600160a01b03841660009081526021602052604090205461315a576001600160a01b0385161561314a576130c8848661303b606461190888600a61431b565b6130d8606461190885600a61431b565b6001600160a01b03861660009081526024602052604081206001018054909190613103908490615820565b90915550506001600160a01b0385166000908152602460205260408120805460019290613131908490615820565b909155506131479050606461190885605a61431b565b92505b613155843085614454565b613189565b6001600160a01b038416600090815260216020526040812080546001929061318390849061589e565b90915550505b600d546040516312b8603f60e01b81526001600160a01b03909116906312b8603f906131bb9087908a906004016152cc565b600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b50505050505050505050565b6005546001600160a01b0316331461321f5760405162461bcd60e51b81526004016111649061563d565b600d54604051636d58441560e11b815282151560048201526001600160a01b039091169063dab0882a9060240161201a565b6005546001600160a01b0316331461327b5760405162461bcd60e51b81526004016111649061563d565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b600d546040805163fb10d6fb60e01b815290516000926001600160a01b03169163fb10d6fb916004808301926020929190829003018186803b15801561141857600080fd5b600d546040805163613ff46f60e01b815290516000926001600160a01b03169163613ff46f916004808301926020929190829003018186803b15801561141857600080fd5b6005546001600160a01b0316331461335a5760405162461bcd60e51b81526004016111649061563d565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b60038151118015613396575060208151105b6133e25760405162461bcd60e51b815260206004820181905260248201527f4e4f4445204352454154494f4e3a204e414d452053495a4520494e56414c49446044820152606401611164565b33806134005760405162461bcd60e51b8152600401611164906155ef565b6001600160a01b03811660009081526022602052604090205460ff16156134395760405162461bcd60e51b815260040161116490615550565b6010546001600160a01b0382811691161480159061346557506011546001600160a01b03828116911614155b6134815760405162461bcd60e51b8152600401611164906154f3565b600d5460408051631e3fd85760e31b815290516000926001600160a01b03169163f1fec2b8916004808301926020929190829003018186803b1580156134c657600080fd5b505afa1580156134da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fe91906151df565b90508061350a836126f0565b10156135285760405162461bcd60e51b815260040161116490615463565b6000613533306126f0565b601f54909150811080159081906135515750601e54610100900460ff165b80156135605750601e5460ff16155b801561357a57506005546001600160a01b03858116911614155b801561359f57506001600160a01b03841660009081526023602052604090205460ff16155b1561369357601e805460ff191660011790556016546000906135c99060649061190890869061431b565b6010549091506135e2906001600160a01b0316826143dc565b60006135fe60646119086014548761431b90919063ffffffff16565b9050600061361c6064611908601d548561431b90919063ffffffff16565b601154909150613635906001600160a01b0316826143dc565b6011546136519030906001600160a01b031661303b85856147c1565b600061366d60646119086015548961431b90919063ffffffff16565b905061367881614803565b613684613073306126f0565b5050601e805460ff1916905550505b61369e843085614454565b600d54604051637362e67960e11b81526001600160a01b039091169063e6c5ccf2906136d090879089906004016152cc565b600060405180830381600087803b1580156136ea57600080fd5b505af11580156136fe573d6000803e3d6000fd5b505050505050505050565b6060336137285760405162461bcd60e51b81526004016111649061536d565b600d546001600160a01b03166341ac82b0336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561377957600080fd5b505afa15801561378d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b19190615040565b6137cd5760405162461bcd60e51b815260040161116490615346565b600d546001600160a01b0316635759fb0233611578565b6005546001600160a01b0316331461380e5760405162461bcd60e51b81526004016111649061563d565b60005b8151811015611205576001602160008484815181106138325761383261594d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546138699190615820565b909155508190506138798161591c565b915050613811565b6005546001600160a01b031633146138ab5760405162461bcd60e51b81526004016111649061563d565b6001600160a01b0381166139105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611164565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604080516327b3bf1160e01b815290516000926001600160a01b0316916327b3bf11916004808301926020929190829003018186803b15801561141857600080fd5b600d5460405163112469f960e21b81526001600160a01b0383811660048301526000921690634491a7e49060240160206040518083038186803b1580156139f757600080fd5b505afa158015613a0b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fd91906151df565b600d5460408051636f60a39360e11b815290516000926001600160a01b03169163dec14726916004808301926020929190829003018186803b15801561141857600080fd5b600d54604080516385c44d9d60e01b815290516000926001600160a01b0316916385c44d9d916004808301926020929190829003018186803b158015613ab957600080fd5b505afa158015613acd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190615040565b6005546001600160a01b03163314613b1b5760405162461bcd60e51b81526004016111649061563d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314613b675760405162461bcd60e51b81526004016111649061563d565b60005b601254811015613bd35760016022600060128481548110613b8d57613b8d61594d565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905580613bcb8161591c565b915050613b6a565b506040805160008152602081019182905251613bf191601291614d8c565b50565b600080613c018385615820565b9050838110156117845760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611164565b6001600160a01b038316613cb55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611164565b6001600160a01b038216613d165760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611164565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b03841660009081526008602052604081205490918391613da2908661587f565b613dac919061585d565b613db6919061589e565b949350505050565b80471015613e0e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611164565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e5b576040519150601f19603f3d011682016040523d82523d6000602084013e613e60565b606091505b5050905080613ed75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611164565b505050565b6001600160a01b038316613f025760405162461bcd60e51b815260040161116490615672565b6001600160a01b038216613f285760405162461bcd60e51b815260040161116490615303565b6001600160a01b03831660009081526022602052604090205460ff16158015613f6a57506001600160a01b03821660009081526022602052604090205460ff16155b613fac5760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b6044820152606401611164565b601354610100900460ff166140035760405162461bcd60e51b815260206004820152601860248201527f45524332303a2053454c4c204e4f54204f50454e2059455400000000000000006044820152606401611164565b6001600160a01b0383166000908152602080526040902054819060ff16614046576018548211156140465760405162461bcd60e51b8152600401611164906154af565b6001600160a01b038316600090815260208052604090205460ff166140ec57601954614071846126f0565b11156140ca5760405162461bcd60e51b815260206004820152602260248201527f4552523a204d617820746f6b656e207065722077616c6c657420726561636865604482015261321760f11b6064820152608401611164565b6018548211156140ec5760405162461bcd60e51b8152600401611164906154af565b600f546001600160a01b03848116911614801561412157506001600160a01b038416600090815260208052604090205460ff16155b8015614135575060135462010000900460ff165b1561417d576000614144612b6e565b9050600061415382606461589e565b9050614169863061303b6064611908888861431b565b6141786064611908858461431b565b925050505b6001600160a01b038316600090815260208052604090205460ff161580156141bd57506001600160a01b038416600090815260208052604090205460ff16155b156141f5576141e06064611908601a5460646141d9919061589e565b849061431b565b90506141f5336141f084846147c1565b6149bd565b60135460ff16156142d6576001600160a01b038316600090815260208052604090205460ff1661426b57601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0385161790555b6001600160a01b038416600090815260208052604090205460ff166142d657601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0386161790555b6126bb848483614454565b600081848411156143055760405162461bcd60e51b815260040161116491906152f0565b506000614312848661589e565b95945050505050565b60008261432a575060006112fd565b6000614336838561587f565b905082614343858361585d565b146117845760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611164565b600061178483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614ac8565b476143e68261488a565b60006143f247836147c1565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114614441576040519150601f19603f3d011682016040523d82523d6000602084013e614446565b606091505b505090508061204857600080fd5b6001600160a01b03831661447a5760405162461bcd60e51b815260040161116490615672565b6001600160a01b0382166144a05760405162461bcd60e51b815260040161116490615303565b6144dd816040518060600160405280602681526020016159bf602691396001600160a01b03861660009081526020819052604090205491906142e1565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461450c9082613bf4565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613d6b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613ed7908490614af6565b6060816145d35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156145fd57806145e78161591c565b91506145f69050600a8361585d565b91506145d7565b60008167ffffffffffffffff81111561461857614618615963565b6040519080825280601f01601f191660200182016040528015614642576020820181803683370190505b509050815b85156146cf5761465860018261589e565b90506000614667600a8861585d565b61467290600a61587f565b61467c908861589e565b614687906030615838565b905060008160f81b9050808484815181106146a4576146a461594d565b60200101906001600160f81b031916908160001a9053506146c6600a8961585d565b97505050614647565b50949350505050565b6001600160a01b03821660009081526023602052604090205460ff161515811515141561476d5760405162461bcd60e51b815260206004820152603d60248201527f544b4e3a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401611164565b6001600160a01b038216600081815260236020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600061178483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506142e1565b600061481082600261439a565b9050600061481e83836147c1565b90504761482a8361488a565b600061483647836147c1565b90506148428382614bc8565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106148bf576148bf61594d565b6001600160a01b03928316602091820292909201810191909152600e54604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b15801561491357600080fd5b505afa158015614927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061494b9190614e79565b8160018151811061495e5761495e61594d565b6001600160a01b039283166020918202929092010152600e546149849130911684613c53565b600e54604051633b158ab160e11b81526001600160a01b039091169063762b156290611f49908590600090869030904290600401615756565b6001600160a01b038216614a1d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611164565b614a5a8160405180606001604052806022815260200161599d602291396001600160a01b03851660009081526020819052604090205491906142e1565b6001600160a01b038316600090815260208190526040902055600254614a8090826147c1565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008183614ae95760405162461bcd60e51b815260040161116491906152f0565b506000614312848661585d565b6000614b4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c819092919063ffffffff16565b805190915015613ed75780806020019051810190614b699190615040565b613ed75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611164565b600e54614be09030906001600160a01b031684613c53565b600e54604051637c8d9fb960e11b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f91b3f7290839060c4016060604051808303818588803b158015614c4857600080fd5b505af1158015614c5c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612048919061521a565b6060613db6848460008585843b614cda5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611164565b600080866001600160a01b03168587604051614cf69190615274565b60006040518083038185875af1925050503d8060008114614d33576040519150601f19603f3d011682016040523d82523d6000602084013e614d38565b606091505b5091509150614d48828286614d53565b979650505050505050565b60608315614d62575081611784565b825115614d725782518084602001fd5b8160405162461bcd60e51b815260040161116491906152f0565b828054828255906000526020600020908101928215614de1579160200282015b82811115614de157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614dac565b50614ded929150614df1565b5090565b5b80821115614ded5760008155600101614df2565b600082601f830112614e1757600080fd5b8135614e2a614e25826157f8565b6157c7565b818152846020838601011115614e3f57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215614e6e57600080fd5b813561178481615979565b600060208284031215614e8b57600080fd5b815161178481615979565b60008060408385031215614ea957600080fd5b8235614eb481615979565b91506020830135614ec481615979565b809150509250929050565b600080600060608486031215614ee457600080fd5b8335614eef81615979565b92506020840135614eff81615979565b929592945050506040919091013590565b60008060408385031215614f2357600080fd5b8235614f2e81615979565b91506020830135614ec48161598e565b60008060408385031215614f5157600080fd5b8235614f5c81615979565b946020939093013593505050565b60006020808385031215614f7d57600080fd5b823567ffffffffffffffff80821115614f9557600080fd5b818501915085601f830112614fa957600080fd5b813581811115614fbb57614fbb615963565b8060051b9150614fcc8483016157c7565b8181528481019084860184860187018a1015614fe757600080fd5b600095505b83861015615016578035945061500185615979565b84835260019590950194918601918601614fec565b5098975050505050505050565b60006020828403121561503557600080fd5b81356117848161598e565b60006020828403121561505257600080fd5b81516117848161598e565b60006020828403121561506f57600080fd5b813567ffffffffffffffff81111561508657600080fd5b613db684828501614e06565b6000602082840312156150a457600080fd5b815167ffffffffffffffff8111156150bb57600080fd5b8201601f810184136150cc57600080fd5b80516150da614e25826157f8565b8181528560208385010111156150ef57600080fd5b6143128260208301602086016158b5565b6000806040838503121561511357600080fd5b823567ffffffffffffffff81111561512a57600080fd5b61513685828601614e06565b9250506020830135614ec481615979565b60008060006060848603121561515c57600080fd5b833567ffffffffffffffff81111561517357600080fd5b61517f86828701614e06565b93505060208401359150604084013561519781615979565b809150509250925092565b6000602082840312156151b457600080fd5b813561ffff8116811461178457600080fd5b6000602082840312156151d857600080fd5b5035919050565b6000602082840312156151f157600080fd5b5051919050565b6000806040838503121561520b57600080fd5b50508035926020909101359150565b60008060006060848603121561522f57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526152608160208601602086016158b5565b601f01601f19169290920160200192915050565b600082516152868184602087016158b5565b9190910192915050565b600083516152a28184602088016158b5565b602d60f81b90830190815283516152c08160018401602088016158b5565b01600101949350505050565b6001600160a01b0383168152604060208201819052600090613db690830184615248565b6020815260006117846020830184615248565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b60208082526014908201527353454e4445522043414e2754204245205a45524f60601b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252601f908201527f4d414e494120435348543a20426c61636b6c6973746564206164647265737300604082015260600190565b6020808252602c908201527f4e4f4445204352454154494f4e3a2042616c616e636520746f6f206c6f77206660408201526b37b91031b932b0ba34b7b71760a11b606082015260800190565b60208082526024908201527f4552523a204d617842757920706572207472616e73616374696f6e20726561636040820152633432b21760e11b606082015260800190565b60208082526037908201527f4e4f4445204352454154494f4e3a20667574757220616e64207265776172647360408201527f506f6f6c2063616e6e6f7420637265617465206e6f6465000000000000000000606082015260800190565b60208082526022908201527f4e4f4445204352454154494f4e3a20426c61636b6c6973746564206164647265604082015261737360f01b606082015260800190565b60208082526038908201527f4d414e494120435348543a20667574757220616e642072657761726473506f6f60408201527f6c2063616e6e6f7420636173686f757420726577617264730000000000000000606082015260800190565b6020808252602e908201527f4e4f4445204352454154494f4e3a20206372656174696f6e2066726f6d20746860408201526d65207a65726f206164647265737360901b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602b908201527f4d414e494120435348543a20206372656174696f6e2066726f6d20746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526034908201527f4d414e494120435348543a20596f7520646f6e2774206861766520656e6f75676040820152731a081c995dd85c99081d1bc818d85cda081bdd5d60621b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156157a65784516001600160a01b031683529383019391830191600101615781565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156157f0576157f0615963565b604052919050565b600067ffffffffffffffff82111561581257615812615963565b50601f01601f191660200190565b6000821982111561583357615833615937565b500190565b600060ff821660ff84168060ff0382111561585557615855615937565b019392505050565b60008261587a57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561589957615899615937565b500290565b6000828210156158b0576158b0615937565b500390565b60005b838110156158d05781810151838201526020016158b8565b838111156126bb5750506000910152565b600181811c908216806158f557607f821691505b6020821081141561591657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561593057615930615937565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613bf157600080fd5b8015158114613bf157600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f6abe40163be67b18ddae1e8d8c8779f5603936cc2830ac4be428ed4dcb4bd6264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abcdc528bbe07a02b57609f9465dc51d65ab6541000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f0f08ce1844a6c7f5549375b5b032ecc751cfde0000000000000000000000000cb9d37fdcb7bcbc2ee4defaa6ef3aae64c0c3c55000000000000000000000000d0d0809a9354b4b8c54c9badd4e87c6a697a26ab0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aae6000000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000028

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abcdc528bbe07a02b57609f9465dc51d65ab6541000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f0f08ce1844a6c7f5549375b5b032ecc751cfde0000000000000000000000000cb9d37fdcb7bcbc2ee4defaa6ef3aae64c0c3c55000000000000000000000000d0d0809a9354b4b8c54c9badd4e87c6a697a26ab0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aae6000000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000028

-----Decoded View---------------
Arg [0] : payees (address[]): 0xabcdc528bbe07a02b57609f9465dc51d65ab6541
Arg [1] : shares (uint256[]): 100
Arg [2] : addresses (address[]): 0xf0f08ce1844a6c7f5549375b5b032ecc751cfde0,0xcb9d37fdcb7bcbc2ee4defaa6ef3aae64c0c3c55,0xd0d0809a9354b4b8c54c9badd4e87c6a697a26ab
Arg [3] : balances (uint256[]): 0,700000,300000
Arg [4] : fees (uint256[]): 2,60,10,15,30,40
Arg [5] : swapAmount (uint256): 60
Arg [6] : uniV2Router (address): 0x60ae616a2155ee3d9a68541ba4544862310933d4

-----Encoded View---------------
26 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [5] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [6] : 00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 000000000000000000000000abcdc528bbe07a02b57609f9465dc51d65ab6541
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 000000000000000000000000f0f08ce1844a6c7f5549375b5b032ecc751cfde0
Arg [13] : 000000000000000000000000cb9d37fdcb7bcbc2ee4defaa6ef3aae64c0c3c55
Arg [14] : 000000000000000000000000d0d0809a9354b4b8c54c9badd4e87c6a697a26ab
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [17] : 00000000000000000000000000000000000000000000000000000000000aae60
Arg [18] : 00000000000000000000000000000000000000000000000000000000000493e0
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [21] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [22] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [24] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000028


Deployed ByteCode Sourcemap

68800:25235:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50002:40;27246:10;50002:40;;;-1:-1:-1;;;;;9974:32:1;;;9956:51;;50032:9:0;10038:2:1;10023:18;;10016:34;9929:18;50002:40:0;;;;;;;68800:25235;;;;;89142:151;;;;;;;;;;-1:-1:-1;89142:151:0;;;;;:::i;:::-;;:::i;:::-;;82950:192;;;;;;;;;;-1:-1:-1;82950:192:0;;;;;:::i;:::-;;:::i;33336:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74102:166;;;;;;;;;;-1:-1:-1;74102:166:0;;;;;:::i;:::-;;:::i;35588:194::-;;;;;;;;;;-1:-1:-1;35588:194:0;;;;;:::i;:::-;;:::i;:::-;;;12038:14:1;;12031:22;12013:41;;12001:2;11986:18;35588:194:0;11873:187:1;89803:324:0;;;;;;;;;;;;;:::i;:::-;;;28377:25:1;;;28365:2;28350:18;89803:324:0;28231:177:1;73872:104:0;;;;;;;;;;-1:-1:-1;73872:104:0;;;;;:::i;:::-;;:::i;69986:44::-;;;;;;;;;;-1:-1:-1;69986:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;69511:24;;;;;;;;;;;;;;;;91541:321;;;;;;;;;;;;;:::i;68945:35::-;;;;;;;;;;-1:-1:-1;68945:35:0;;;;-1:-1:-1;;;;;68945:35:0;;;;;;-1:-1:-1;;;;;9730:32:1;;;9712:51;;9700:2;9685:18;68945:35:0;9566:203:1;34456:108:0;;;;;;;;;;-1:-1:-1;34544:12:0;;34456:108;;51808:616;;;;;;;;;;-1:-1:-1;51808:616:0;;;;;:::i;:::-;;:::i;70037:46::-;;;;;;;;;;-1:-1:-1;70037:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36264:454;;;;;;;;;;-1:-1:-1;36264:454:0;;;;;:::i;:::-;;:::i;69411:25::-;;;;;;;;;;;;;;;;87520:1272;;;;;;;;;;-1:-1:-1;87520:1272:0;;;;;:::i;:::-;;:::i;34298:93::-;;;;;;;;;;-1:-1:-1;34298:93:0;;34381:2;30117:36:1;;30105:2;30090:18;34298:93:0;29975:184:1;37127:288:0;;;;;;;;;;-1:-1:-1;37127:288:0;;;;;:::i;:::-;;:::i;50133:91::-;;;;;;;;;;-1:-1:-1;50204:12:0;;50133:91;;92957:94;;;;;;;;;;-1:-1:-1;92957:94:0;;;;;:::i;:::-;;:::i;51262:155::-;;;;;;;;;;-1:-1:-1;51262:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;51379:21:0;;;51347:7;51379:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51262:155;88800:180;;;;;;;;;;-1:-1:-1;88800:180:0;;;;;:::i;:::-;;:::i;74276:173::-;;;;;;;;;;-1:-1:-1;74276:173:0;;;;;:::i;:::-;;:::i;52692:700::-;;;;;;;;;;-1:-1:-1;52692:700:0;;;;;:::i;:::-;;:::i;92551:125::-;;;;;;;;;;;;;:::i;92817:132::-;;;;;;;;;;-1:-1:-1;92817:132:0;;;;;:::i;:::-;;:::i;69084:28::-;;;;;;;;;;-1:-1:-1;69084:28:0;;;;-1:-1:-1;;;;;69084:28:0;;;86440:1072;;;;;;;;;;;;;:::i;69443:31::-;;;;;;;;;;;;;;;;89550:96;;;;;;;;;;-1:-1:-1;89550:96:0;;;;;:::i;:::-;;:::i;91145:131::-;;;;;;;;;;-1:-1:-1;91145:131:0;;;;;:::i;:::-;;:::i;93290:125::-;;;;;;;;;;-1:-1:-1;93290:125:0;;;;;:::i;:::-;;:::i;69897:31::-;;;;;;;;;;;;;;;;73262:482;;;;;;;;;;-1:-1:-1;73262:482:0;;;;;:::i;:::-;;:::i;85341:1091::-;;;;;;;;;;-1:-1:-1;85341:1091:0;;;;;:::i;:::-;;:::i;73752:111::-;;;;;;;;;;-1:-1:-1;73752:111:0;;;;;:::i;:::-;;:::i;82343:401::-;;;;;;;;;;-1:-1:-1;82343:401:0;;;;;:::i;:::-;;:::i;74627:97::-;;;;;;;;;;-1:-1:-1;74627:97:0;;;;;:::i;:::-;;:::i;69760:25::-;;;;;;;;;;;;;;;;34627:157;;;;;;;;;;-1:-1:-1;34627:157:0;;;;;:::i;:::-;;:::i;69542:21::-;;;;;;;;;;;;;;;;28551:148;;;;;;;;;;;;;:::i;68891:45::-;;;;;;;;;;-1:-1:-1;68891:45:0;;;;-1:-1:-1;;;;;68891:45:0;;;69726:25;;;;;;;;;;;;;;;;90391:131;;;;;;;;;;-1:-1:-1;90391:131:0;;;;;:::i;:::-;;:::i;90135:::-;;;;;;;;;;-1:-1:-1;90135:131:0;;;;;:::i;:::-;;:::i;69664:26::-;;;;;;;;;;;;;;;;69332:70;;;;;;;;;;-1:-1:-1;69332:70:0;;;;;;;-1:-1:-1;;;;;69332:70:0;;;74457:162;;;;;;;;;;-1:-1:-1;74457:162:0;;;;;:::i;:::-;;:::i;89301:108::-;;;;;;;;;;-1:-1:-1;89301:108:0;;;;;:::i;:::-;;:::i;51508:100::-;;;;;;;;;;-1:-1:-1;51508:100:0;;;;;:::i;:::-;;:::i;74732:92::-;;;;;;;;;;-1:-1:-1;74732:92:0;;;;;:::i;:::-;;:::i;27909:79::-;;;;;;;;;;-1:-1:-1;27974:6:0;;-1:-1:-1;;;;;27974:6:0;27909:79;;73984:110;;;;;;;;;;-1:-1:-1;73984:110:0;;;;;:::i;:::-;;:::i;33555:104::-;;;;;;;;;;;;;:::i;50984:109::-;;;;;;;;;;-1:-1:-1;50984:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;51067:18:0;51040:7;51067:18;;;:9;:18;;;;;;;50984:109;74832:313;;;;;;;;;;-1:-1:-1;74832:313:0;;;;;:::i;:::-;;:::i;90655:121::-;;;;;;;;;;-1:-1:-1;90655:121:0;;;;;:::i;:::-;;:::i;70154:49::-;;;;;;;;;;-1:-1:-1;70154:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;29572:25:1;;;29628:2;29613:18;;29606:34;;;;29545:18;70154:49:0;29398:248:1;92684:125:0;;;;;;;;;;;;;:::i;37918:388::-;;;;;;;;;;-1:-1:-1;37918:388:0;;;;;:::i;:::-;;:::i;90274:109::-;;;;;;;;;;;;;:::i;69119:27::-;;;;;;;;;;-1:-1:-1;69119:27:0;;;;-1:-1:-1;;;;;69119:27:0;;;34997:200;;;;;;;;;;-1:-1:-1;34997:200:0;;;;;:::i;:::-;;:::i;69481:23::-;;;;;;;;;;;;;;;;77733:383;;;;;;;;;;;;;:::i;70090:57::-;;;;;;;;;;-1:-1:-1;70090:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;91870:331;;;;;;;;;;;;;:::i;69295:28::-;;;;;;;;;;-1:-1:-1;69295:28:0;;;;;;;;;;;69153:31;;;;;;;;;;-1:-1:-1;69153:31:0;;;;-1:-1:-1;;;;;69153:31:0;;;50780:105;;;;;;;;;;-1:-1:-1;50780:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;50861:16:0;50834:7;50861:16;;;:7;:16;;;;;;;50780:105;79590:2745;;;;;;;;;;-1:-1:-1;79590:2745:0;;;;;:::i;:::-;;:::i;90901:120::-;;;;;;;;;;-1:-1:-1;90901:120:0;;;;;:::i;:::-;;:::i;50570:119::-;;;;;;;;;;-1:-1:-1;50570:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;50655:26:0;50628:7;50655:26;;;:19;:26;;;;;;;50570:119;75153:141;;;;;;;;;;-1:-1:-1;75153:141:0;;;;;:::i;:::-;;:::i;91410:123::-;;;;;;;;;;;;;:::i;90530:117::-;;;;;;;;;;;;;:::i;35260:181::-;;;;;;;;;;-1:-1:-1;35260:181:0;;;;;:::i;:::-;-1:-1:-1;;;;;35406:18:0;;;35374:7;35406:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35260:181;89417:125;;;;;;;;;;-1:-1:-1;89417:125:0;;;;;:::i;:::-;;:::i;69937:42::-;;;;;;;;;;-1:-1:-1;69937:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50318:95;;;;;;;;;;-1:-1:-1;50391:14:0;;50318:95;;83150:2183;;;;;;;;;;-1:-1:-1;83150:2183:0;;;;;:::i;:::-;;:::i;92209:334::-;;;;;;;;;;;;;:::i;82752:190::-;;;;;;;;;;-1:-1:-1;82752:190:0;;;;;:::i;:::-;;:::i;69268:20::-;;;;;;;;;;-1:-1:-1;69268:20:0;;;;;;;;;;;28854:281;;;;;;;;;;-1:-1:-1;28854:281:0;;;;;:::i;:::-;;:::i;90784:109::-;;;;;;;;;;;;;:::i;89654:141::-;;;;;;;;;;-1:-1:-1;89654:141:0;;;;;:::i;:::-;;:::i;91284:118::-;;;;;;;;;;;;;:::i;69230:31::-;;;;;;;;;;-1:-1:-1;69230:31:0;;;;;;;;69604:24;;;;;;;;;;;;;;;;91029:108;;;;;;;;;;;;;:::i;73109:145::-;;;;;;;;;;-1:-1:-1;73109:145:0;;;;;:::i;:::-;;:::i;93059:223::-;;;;;;;;;;;;;:::i;89142:151::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;;;;;;;;;89236:6:::1;:16:::0;;;;89263:9:::1;:22:::0;89142:151::o;82950:192::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;83037:9:::1;83032:103;83056:10;:17;83052:1;:21;83032:103;;;83122:1;83095:9;:24;83105:10;83116:1;83105:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;83095:24:0::1;-1:-1:-1::0;;;;;83095:24:0::1;;;;;;;;;;;;:28;;;;83075:3;;;;;:::i;:::-;;;;83032:103;;;;82950:192:::0;:::o;33336:100::-;33390:13;33423:5;33416:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33336:100;:::o;74102:166::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74173:10:::1;:18:::0;;;74251:8:::1;::::0;74229:16:::1;::::0;74214:46:::1;::::0;74251:8;74214:32:::1;::::0;74186:5;;74214:14:::1;:32::i;:::-;:36:::0;::::1;:46::i;:::-;74202:9;:58:::0;-1:-1:-1;74102:166:0:o;35588:194::-;35691:4;35713:39;27246:10;35736:7;35745:6;35713:8;:39::i;:::-;-1:-1:-1;35770:4:0;35588:194;;;;;:::o;89803:324::-;89851:7;27246:10;89871:59;;;;-1:-1:-1;;;89871:59:0;;;;;;;:::i;:::-;89963:17;;-1:-1:-1;;;;;89963:17:0;:30;27246:10;89963:44;;-1:-1:-1;;;;;;89963:44:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;89963:44:0;;;9712:51:1;9685:18;;89963:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89941:107;;;;-1:-1:-1;;;89941:107:0;;;;;;;:::i;:::-;90066:17;;-1:-1:-1;;;;;90066:17:0;:39;27246:10;90066:53;;-1:-1:-1;;;;;;90066:53:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;90066:53:0;;;9712:51:1;9685:18;;90066:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90059:60;;89803:324;:::o;73872:104::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;73949:12:::1;:19:::0;;-1:-1:-1;;;;;;73949:19:0::1;-1:-1:-1::0;;;;;73949:19:0;;;::::1;::::0;;;::::1;::::0;;73872:104::o;91541:321::-;91587:13;27246:10;91613:59;;;;-1:-1:-1;;;91613:59:0;;;;;;;:::i;:::-;91705:17;;-1:-1:-1;;;;;91705:17:0;:30;27246:10;91705:44;;-1:-1:-1;;;;;;91705:44:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;91705:44:0;;;9712:51:1;9685:18;;91705:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91683:107;;;;-1:-1:-1;;;91683:107:0;;;;;;;:::i;:::-;91808:17;;-1:-1:-1;;;;;91808:17:0;:32;27246:10;91841:12;91808:46;;-1:-1:-1;;;;;;91808:46:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;91808:46:0;;;9712:51:1;9685:18;;91808:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;91808:46:0;;;;;;;;;;;;:::i;51808:616::-;-1:-1:-1;;;;;51884:16:0;;51903:1;51884:16;;;:7;:16;;;;;;51876:71;;;;-1:-1:-1;;;51876:71:0;;;;;;;:::i;:::-;51960:21;52008:15;50391:14;;;50318:95;52008:15;51984:39;;:21;:39;:::i;:::-;51960:63;;52034:15;52052:108;52082:7;52104:13;52132:17;52141:7;-1:-1:-1;;;;;51067:18:0;51040:7;51067:18;;;:9;:18;;;;;;;50984:109;52132:17;52052:15;:108::i;:::-;52034:126;-1:-1:-1;52181:12:0;52173:68;;;;-1:-1:-1;;;52173:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52254:18:0;;;;;;:9;:18;;;;;:29;;52276:7;;52254:18;:29;;52276:7;;52254:29;:::i;:::-;;;;;;;;52312:7;52294:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;52332:35:0;;-1:-1:-1;52350:7:0;52359;52332:17;:35::i;:::-;52383:33;;;-1:-1:-1;;;;;9974:32:1;;9956:51;;10038:2;10023:18;;10016:34;;;52383:33:0;;9929:18:1;52383:33:0;;;;;;;51865:559;;51808:616;:::o;36264:454::-;36404:4;36421:36;36431:6;36439:9;36450:6;36421:9;:36::i;:::-;36468:220;36491:6;27246:10;36539:138;36595:6;36539:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36539:19:0;;;;;;:11;:19;;;;;;;;27246:10;36539:33;;;;;;;;;;:37;:138::i;:::-;36468:8;:220::i;:::-;-1:-1:-1;36706:4:0;36264:454;;;;;;:::o;87520:1272::-;27246:10;;87627:113;;;;-1:-1:-1;;;87627:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;87760:22:0;;;;;;:14;:22;;;;;;;;87759:23;87751:67;;;;-1:-1:-1;;;87751:67:0;;;;;;;:::i;:::-;87861:12;;-1:-1:-1;;;;;87851:22:0;;;87861:12;;87851:22;;;;:52;;-1:-1:-1;87887:16:0;;-1:-1:-1;;;;;87877:26:0;;;87887:16;;87877:26;;87851:52;87829:158;;;;-1:-1:-1;;;87829:158:0;;;;;;;:::i;:::-;88021:17;;:65;;-1:-1:-1;;;88021:65:0;;-1:-1:-1;;;;;10882:32:1;;;88021:65:0;;;10864:51:1;10963:6;10951:19;;10931:18;;;10924:47;87998:20:0;;88021:17;;:46;;10837:18:1;;88021:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87998:88;;88134:1;88119:12;:16;88097:118;;;;-1:-1:-1;;;88097:118:0;;;;;;;:::i;:::-;88230:11;;;;;;;88226:423;;;88294:10;;88258:17;;88294:14;88290:308;;88333:14;;;88329:194;;88384:29;88409:3;88384:20;:12;88401:2;88384:16;:20::i;:::-;:24;;:29::i;:::-;88372:41;;88329:194;;;88474:29;88499:3;88474:20;:12;88491:2;88474:16;:20::i;:29::-;88462:41;;88329:194;88558:12;;88541:41;;-1:-1:-1;;;;;88558:12:0;88572:9;88541:16;:41::i;:::-;88612:25;88628:9;88612:25;;:::i;:::-;;;88243:406;88226:423;88675:16;;88659:55;;-1:-1:-1;;;;;88675:16:0;88693:6;88701:12;88659:15;:55::i;:::-;88725:17;;:59;;-1:-1:-1;;;88725:59:0;;-1:-1:-1;;;;;10882:32:1;;;88725:59:0;;;10864:51:1;10963:6;10951:19;;10931:18;;;10924:47;88725:17:0;;;;:40;;10837:18:1;;88725:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87576:1216;;87520:1272;:::o;37127:288::-;27246:10;37230:4;37324:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;37324:34:0;;;;;;;;;;37230:4;;37252:133;;37302:7;;37324:50;;37363:10;37324:38;:50::i;92957:94::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;93023:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;93023:20:0;;::::1;::::0;;;::::1;::::0;;92957:94::o;88800:180::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;88875:21:::1;88866:6;:30;88862:66;;;-1:-1:-1::0;88907:21:0::1;88862:66;27974:6:::0;;88939:33:::1;::::0;-1:-1:-1;;;;;27974:6:0;;;;88939:33;::::1;;;::::0;88965:6;;88939:33:::1;::::0;;;88965:6;27974;88939:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;74276:173:::0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74348:16:::1;:24:::0;;;74432:8:::1;::::0;74395:10:::1;::::0;:46:::1;::::0;74432:8;74395:32:::1;::::0;74367:5;74395:14:::1;:32::i;52692:700::-:0;-1:-1:-1;;;;;52774:16:0;;52793:1;52774:16;;;:7;:16;;;;;;52766:71;;;;-1:-1:-1;;;52766:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50655:26:0;;52850:21;50655:26;;;:19;:26;;;;;;52874:30;;-1:-1:-1;;;52874:30:0;;52898:4;52874:30;;;9712:51:1;-1:-1:-1;;;;;52874:15:0;;;;;9685:18:1;;52874:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;52850:86;;52947:15;52965:115;52995:7;53017:13;53045:24;53054:5;53061:7;-1:-1:-1;;;;;51379:21:0;;;51347:7;51379:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;51262:155;52965:115;52947:133;-1:-1:-1;53101:12:0;53093:68;;;;-1:-1:-1;;;53093:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53174:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;53208:7;;53174:21;:41;;53208:7;;53174:41;:::i;:::-;;;;-1:-1:-1;;;;;;;53226:26:0;;;;;;:19;:26;;;;;:37;;53256:7;;53226:26;:37;;53256:7;;53226:37;:::i;:::-;;;;-1:-1:-1;53276:47:0;;-1:-1:-1;53299:5:0;53306:7;53315;53276:22;:47::i;:::-;53339:45;;;-1:-1:-1;;;;;9974:32:1;;;9956:51;;10038:2;10023:18;;10016:34;;;53339:45:0;;;;;9929:18:1;53339:45:0;;;;;;;52755:637;;52692:700;;:::o;92551:125::-;92631:17;;:37;;;-1:-1:-1;;;92631:37:0;;;;92604:7;;-1:-1:-1;;;;;92631:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;92817:132;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;92899:19:::1;:42:::0;;-1:-1:-1;;92899:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;92817:132::o;86440:1072::-;27246:10;;86520:113;;;;-1:-1:-1;;;86520:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;86653:22:0;;;;;;:14;:22;;;;;;;;86652:23;86644:67;;;;-1:-1:-1;;;86644:67:0;;;;;;;:::i;:::-;86754:12;;-1:-1:-1;;;;;86744:22:0;;;86754:12;;86744:22;;;;:52;;-1:-1:-1;86780:16:0;;-1:-1:-1;;;;;86770:26:0;;;86780:16;;86770:26;;86744:52;86722:158;;;;-1:-1:-1;;;86722:158:0;;;;;;;:::i;:::-;86914:17;;:47;;-1:-1:-1;;;86914:47:0;;-1:-1:-1;;;;;9730:32:1;;;86914:47:0;;;9712:51:1;86891:20:0;;86914:17;;:39;;9685:18:1;;86914:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86891:70;;87009:1;86994:12;:16;86972:118;;;;-1:-1:-1;;;86972:118:0;;;;;;;:::i;:::-;87105:11;;;;;;;87101:279;;;87169:10;;87133:17;;87169:14;87165:164;;87216:37;87249:3;87216:28;87233:10;;87216:12;:16;;:28;;;;:::i;:37::-;87289:12;;87204:49;;-1:-1:-1;87272:41:0;;-1:-1:-1;;;;;87289:12:0;87204:49;87272:16;:41::i;:::-;87343:25;87359:9;87343:25;;:::i;:::-;;;87118:262;87101:279;87406:16;;87390:55;;-1:-1:-1;;;;;87406:16:0;87424:6;87432:12;87390:15;:55::i;:::-;87456:17;;:48;;-1:-1:-1;;;87456:48:0;;-1:-1:-1;;;;;9730:32:1;;;87456:48:0;;;9712:51:1;87456:17:0;;;;:40;;9685:18:1;;87456:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86469:1043;;86440:1072::o;89550:96::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;89618:11:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;89618:20:0;;::::1;::::0;;;::::1;::::0;;89550:96::o;91145:131::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;91220:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;91220:48:0;;::::1;::::0;::::1;28377:25:1::0;;;-1:-1:-1;;;;;91220:17:0;;::::1;::::0;:34:::1;::::0;28350:18:1;;91220:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;91145:131:::0;:::o;93290:125::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;93371:16:::1;:36:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;93371:36:0;;::::1;::::0;;;::::1;::::0;;93290:125::o;73262:482::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;73371:15:::1;::::0;-1:-1:-1;;;;;73349:38:0;;::::1;73371:15:::0;::::1;73349:38;;73341:91;;;::::0;-1:-1:-1;;;73341:91:0;;19594:2:1;73341:91:0::1;::::0;::::1;19576:21:1::0;19633:2;19613:18;;;19606:30;19672:34;19652:18;;;19645:62;-1:-1:-1;;;19723:18:1;;;19716:38;19771:19;;73341:91:0::1;19392:404:1::0;73341:91:0::1;73490:15;::::0;73448:59:::1;::::0;-1:-1:-1;;;;;73490:15:0;;::::1;::::0;73448:59;::::1;::::0;::::1;::::0;73490:15:::1;::::0;73448:59:::1;73518:15;:42:::0;;-1:-1:-1;;;;;;73518:42:0::1;-1:-1:-1::0;;;;;73518:42:0;::::1;::::0;;::::1;::::0;;;73608:25:::1;::::0;;-1:-1:-1;;;73608:25:0;;;;-1:-1:-1;;73518:42:0;73608:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;73518:42;73608:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;73596:59:0::1;;73664:4;73671:15;;;;;;;;;-1:-1:-1::0;;;;;73671:15:0::1;-1:-1:-1::0;;;;;73671:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73596:99;::::0;-1:-1:-1;;;;;;73596:99:0::1;::::0;;;;;;-1:-1:-1;;;;;10291:15:1;;;73596:99:0::1;::::0;::::1;10273:34:1::0;10343:15;;10323:18;;;10316:43;10208:18;;73596:99:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73706:13;:30:::0;;-1:-1:-1;;;;;;73706:30:0::1;-1:-1:-1::0;;;;;73706:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;73262:482:0:o;85341:1091::-;27246:10;;85441:70;;;;-1:-1:-1;;;85441:70:0;;15650:2:1;85441:70:0;;;15632:21:1;15689:2;15669:18;;;15662:30;15728:34;15708:18;;;15701:62;-1:-1:-1;;;15779:18:1;;;15772:35;15824:19;;85441:70:0;15448:401:1;85441:70:0;-1:-1:-1;;;;;85531:22:0;;;;;;:14;:22;;;;;;;;85530:23;85522:67;;;;-1:-1:-1;;;85522:67:0;;;;;;;:::i;:::-;85632:12;;-1:-1:-1;;;;;85622:22:0;;;85632:12;;85622:22;;;;:52;;-1:-1:-1;85658:16:0;;-1:-1:-1;;;;;85648:26:0;;;85658:16;;85648:26;;85622:52;85600:152;;;;-1:-1:-1;;;85600:152:0;;12958:2:1;85600:152:0;;;12940:21:1;12997:2;12977:18;;;12970:30;13036:34;13016:18;;;13009:62;-1:-1:-1;;;13087:18:1;;;13080:48;13145:19;;85600:152:0;12756:414:1;85600:152:0;85786:17;;:92;;-1:-1:-1;;;85786:92:0;;-1:-1:-1;;;;;9974:32:1;;;85786:92:0;;;9956:51:1;10023:18;;;10016:34;;;85763:20:0;;85786:17;;:36;;9929:18:1;;85786:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85763:115;;85926:1;85911:12;:16;85889:112;;;;-1:-1:-1;;;85889:112:0;;17642:2:1;85889:112:0;;;17624:21:1;17681:2;17661:18;;;17654:30;17720:34;17700:18;;;17693:62;-1:-1:-1;;;17771:18:1;;;17764:44;17825:19;;85889:112:0;17440:410:1;85889:112:0;86018:11;;;;;;;86014:279;;;86082:10;;86046:17;;86082:14;86078:164;;86129:37;86162:3;86129:28;86146:10;;86129:12;:16;;:28;;;;:::i;:37::-;86202:12;;86117:49;;-1:-1:-1;86185:41:0;;-1:-1:-1;;;;;86202:12:0;86117:49;86185:16;:41::i;:::-;86256:25;86272:9;86256:25;;:::i;:::-;;;86031:262;86014:279;86319:16;;86303:55;;-1:-1:-1;;;;;86319:16:0;86337:6;86345:12;86303:15;:55::i;:::-;86369:17;;:55;;-1:-1:-1;;;86369:55:0;;-1:-1:-1;;;;;9974:32:1;;;86369:55:0;;;9956:51:1;10023:18;;;10016:34;;;86369:17:0;;;;:36;;9929:18:1;;86369:55:0;9774:282:1;73752:111:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;73830:16:::1;:25:::0;73752:111::o;82343:401::-;82482:2;82477:1;:7;;82469:41;;;;-1:-1:-1;;;82469:41:0;;25723:2:1;82469:41:0;;;25705:21:1;25762:2;25742:18;;;25735:30;-1:-1:-1;;;25781:18:1;;;25774:51;25842:18;;82469:41:0;25521:345:1;82469:41:0;82526:9;82521:216;82545:1;82541;:5;82521:216;;;82568:157;82635:4;82688:11;82697:1;82688:8;:11::i;:::-;82596:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82721:3;82568:20;:157::i;:::-;82548:3;;;;:::i;:::-;;;;82521:216;;;;82343:401;;;:::o;74627:97::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74698:10:::1;:18:::0;74627:97::o;34627:157::-;-1:-1:-1;;;;;34758:18:0;34726:7;34758:18;;;;;;;;;;;;34627:157::o;28551:148::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;28642:6:::1;::::0;28621:40:::1;::::0;28658:1:::1;::::0;-1:-1:-1;;;;;28642:6:0::1;::::0;28621:40:::1;::::0;28658:1;;28621:40:::1;28672:6;:19:::0;;-1:-1:-1;;;;;;28672:19:0::1;::::0;;28551:148::o;90391:131::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;90466:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;90466:48:0;;::::1;::::0;::::1;28377:25:1::0;;;-1:-1:-1;;;;;90466:17:0;;::::1;::::0;:38:::1;::::0;28350:18:1;;90466:48:0::1;28231:177:1::0;90135:131:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;90210:17:::1;::::0;:48:::1;::::0;-1:-1:-1;;;90210:48:0;;::::1;::::0;::::1;28377:25:1::0;;;-1:-1:-1;;;;;90210:17:0;;::::1;::::0;:34:::1;::::0;28350:18:1;;90210:48:0::1;28231:177:1::0;74457:162:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74526:8:::1;:16:::0;;;74580::::1;::::0;74565:10:::1;::::0;:46:::1;::::0;74537:5;;74565:32:::1;::::0;:14:::1;:32::i;89301:108::-:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;89375:11:::1;:26:::0;89301:108::o;51508:100::-;51559:7;51586;51594:5;51586:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;51586:14:0;;51508:100;-1:-1:-1;;51508:100:0:o;74732:92::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74802:6:::1;:14:::0;74732:92::o;73984:110::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74063:16:::1;:23:::0;;-1:-1:-1;;;;;;74063:23:0::1;-1:-1:-1::0;;;;;74063:23:0;;;::::1;::::0;;;::::1;::::0;;73984:110::o;33555:104::-;33611:13;33644:7;33637:14;;;;;:::i;74832:313::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;74968:13:::1;::::0;-1:-1:-1;;;;;74960:21:0;;::::1;74968:13:::0;::::1;74960:21;;74938:145;;;::::0;-1:-1:-1;;;74938:145:0;;21599:2:1;74938:145:0::1;::::0;::::1;21581:21:1::0;21638:2;21618:18;;;21611:30;21677:34;21657:18;;;21650:62;21748:34;21728:18;;;21721:62;-1:-1:-1;;;21799:19:1;;;21792:41;21850:19;;74938:145:0::1;21397:478:1::0;74938:145:0::1;75096:41;75125:4;75131:5;75096:28;:41::i;90655:121::-:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;90725:17:::1;::::0;:43:::1;::::0;-1:-1:-1;;;90725:43:0;;::::1;::::0;::::1;28377:25:1::0;;;-1:-1:-1;;;;;90725:17:0;;::::1;::::0;:34:::1;::::0;28350:18:1;;90725:43:0::1;28231:177:1::0;92684:125:0;92764:17;;:37;;;-1:-1:-1;;;92764:37:0;;;;92737:7;;-1:-1:-1;;;;;92764:17:0;;:35;;:37;;;;;;;;;;;;;;:17;:37;;;;;;;;;;37918:388;38026:4;38048:228;27246:10;38098:7;38120:145;38177:15;38120:145;;;;;;;;;;;;;;;;;27246:10;38120:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38120:34:0;;;;;;;;;;;;:38;:145::i;90274:109::-;90346:17;;:29;;;-1:-1:-1;;;90346:29:0;;;;90319:7;;-1:-1:-1;;;;;90346:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;34997:200;35103:4;35125:42;27246:10;35149:9;35160:6;35125:9;:42::i;77733:383::-;77775:7;77837:6;77800:33;77822:10;;77801:15;77800:21;;:33;;;;:::i;:::-;:43;77795:314;;-1:-1:-1;77868:2:0;;77733:383::o;77795:314::-;77930:6;77893:33;77915:10;;77894:15;77893:21;;:33;;;;:::i;:::-;:43;77888:221;;-1:-1:-1;77961:2:0;;77733:383::o;77888:221::-;78023:6;77986:33;78008:10;;77987:15;77986:21;;:33;;;;:::i;:::-;:43;77981:128;;-1:-1:-1;78054:2:0;;77733:383::o;77981:128::-;-1:-1:-1;78096:1:0;;77733:383::o;91870:331::-;91919:13;27246:10;91945:59;;;;-1:-1:-1;;;91945:59:0;;;;;;;:::i;:::-;92037:17;;-1:-1:-1;;;;;92037:17:0;:30;27246:10;92037:44;;-1:-1:-1;;;;;;92037:44:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;92037:44:0;;;9712:51:1;9685:18;;92037:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92015:107;;;;-1:-1:-1;;;92015:107:0;;;;;;;:::i;:::-;92140:17;;-1:-1:-1;;;;;92140:17:0;:39;27246:10;92180:12;27166:98;79590:2745;79714:1;79699:4;79693:18;:22;:49;;;;;79740:2;79725:4;79719:18;:23;79693:49;79671:131;;;;-1:-1:-1;;;79671:131:0;;14123:2:1;79671:131:0;;;14105:21:1;;;14142:18;;;14135:30;14201:34;14181:18;;;14174:62;14253:18;;79671:131:0;13921:356:1;79671:131:0;27246:10;-1:-1:-1;;;;;79861:13:0;;;;;79853:60;;;;-1:-1:-1;;;79853:60:0;;16056:2:1;79853:60:0;;;16038:21:1;16095:2;16075:18;;;16068:30;16134:34;16114:18;;;16107:62;-1:-1:-1;;;16185:18:1;;;16178:32;16227:19;;79853:60:0;15854:398:1;79853:60:0;-1:-1:-1;;;;;79946:20:0;;79924:116;;;;-1:-1:-1;;;79924:116:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;80060:22:0;;;;;;:14;:22;;;;;;;;80059:23;80051:70;;;;-1:-1:-1;;;80051:70:0;;;;;;;:::i;:::-;80164:12;;-1:-1:-1;;;;;80154:22:0;;;80164:12;;80154:22;;;;:52;;-1:-1:-1;80190:16:0;;-1:-1:-1;;;;;80180:26:0;;;80190:16;;80180:26;;80154:52;80132:157;;;;-1:-1:-1;;;80132:157:0;;;;;;;:::i;:::-;80320:17;;:29;;;-1:-1:-1;;;80320:29:0;;;;80300:17;;-1:-1:-1;;;;;80320:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80300:49;;80403:9;80382:17;80392:6;80382:9;:17::i;:::-;:30;;:55;;;-1:-1:-1;;;;;;80416:17:0;;80436:1;80416:17;;;:9;:17;;;;;;:21;;80382:55;80360:149;;;;-1:-1:-1;;;80360:149:0;;;;;;;:::i;:::-;80520:28;80551:24;80569:4;80551:9;:24::i;:::-;80630:16;;80520:55;;-1:-1:-1;80606:40:0;;;;;;;80675;;-1:-1:-1;80704:11:0;;;;;;;80675:40;:66;;;;-1:-1:-1;80733:8:0;;;;80732:9;80675:66;:100;;;;-1:-1:-1;27974:6:0;;-1:-1:-1;;;;;80758:17:0;;;27974:6;;80758:17;;80675:100;:151;;;;-1:-1:-1;;;;;;80793:33:0;;;;;;:25;:33;;;;;;;;80792:34;80675:151;:190;;;;-1:-1:-1;;;;;;80843:17:0;;;;;;:9;:17;;;;;;:22;80675:190;80657:1140;;;80892:8;:15;;-1:-1:-1;;80892:15:0;80903:4;80892:15;;;80971:8;;80892;;80946:43;;80985:3;;80946:34;;:20;;:24;:34::i;:43::-;81023:12;;80924:65;;-1:-1:-1;81006:43:0;;-1:-1:-1;;;;;81023:12:0;80924:65;81006:16;:43::i;:::-;81066:25;81094:73;81163:3;81094:50;81133:10;;81094:20;:38;;:50;;;;:::i;:73::-;81066:101;;81184:27;81214:70;81266:3;81214:29;81236:6;;81214:17;:21;;:29;;;;:::i;:70::-;81318:16;;81184:100;;-1:-1:-1;81301:55:0;;-1:-1:-1;;;;;81318:16:0;81184:100;81301:16;:55::i;:::-;81437:16;;81371:158;;81413:4;;-1:-1:-1;;;;;81437:16:0;81472:42;:17;81494:19;81472:21;:42::i;:::-;81371:15;:158::i;:::-;81546:18;81567:83;81632:3;81567:42;81592:16;;81567:20;:24;;:42;;;;:::i;:83::-;81546:104;;81667:26;81682:10;81667:14;:26::i;:::-;81710:42;81727:24;81745:4;81727:9;:24::i;:::-;81710:16;:42::i;:::-;-1:-1:-1;;81769:8:0;:16;;-1:-1:-1;;81769:16:0;;;-1:-1:-1;;80657:1140:0;-1:-1:-1;;;;;81811:17:0;;;;;;:9;:17;;;;;;81807:468;;-1:-1:-1;;;;;81854:17:0;;;81850:295;;81892:56;81908:6;81916:3;81921:26;81943:3;81921:17;:9;81935:2;81921:13;:17::i;81892:56::-;81998:26;82020:3;81998:17;:9;82012:2;81998:13;:17::i;:26::-;-1:-1:-1;;;;;81967:14:0;;;;;;:9;:14;;;;;:27;;:57;;:27;;:14;:57;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;82043:14:0;;;;;;:9;:14;;;;;:29;;82071:1;;82043:14;:29;;82071:1;;82043:29;:::i;:::-;;;;-1:-1:-1;82103:26:0;;-1:-1:-1;82125:3:0;82103:17;:9;82117:2;82103:13;:17::i;:26::-;82091:38;;81850:295;82159:49;82175:6;82191:4;82198:9;82159:15;:49::i;:::-;81807:468;;;-1:-1:-1;;;;;82241:17:0;;;;;;:9;:17;;;;;:22;;82262:1;;82241:17;:22;;82262:1;;82241:22;:::i;:::-;;;;-1:-1:-1;;81807:468:0;82285:17;;:42;;-1:-1:-1;;;82285:42:0;;-1:-1:-1;;;;;82285:17:0;;;;:28;;:42;;82314:6;;82322:4;;82285:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79660:2675;;;;79590:2745;;:::o;90901:120::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;90969:17:::1;::::0;:44:::1;::::0;-1:-1:-1;;;90969:44:0;;12038:14:1;;12031:22;90969:44:0::1;::::0;::::1;12013:41:1::0;-1:-1:-1;;;;;90969:17:0;;::::1;::::0;:35:::1;::::0;11986:18:1;;90969:44:0::1;11873:187:1::0;75153:141:0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75255:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;75255:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;75153:141::o;91410:123::-;91484:17;;:41;;;-1:-1:-1;;;91484:41:0;;;;91457:7;;-1:-1:-1;;;;;91484:17:0;;:39;;:41;;;;;;;;;;;;;;:17;:41;;;;;;;;;;90530:117;90606:17;;:33;;;-1:-1:-1;;;90606:33:0;;;;90579:7;;-1:-1:-1;;;;;90606:17:0;;:31;;:33;;;;;;;;;;;;;;:17;:33;;;;;;;;;;89417:125;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;89502:20:0;;;::::1;;::::0;;;:10:::1;:20:::0;;;;;:32;;-1:-1:-1;;89502:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;89417:125::o;83150:2183::-;83262:1;83247:4;83241:18;:22;:49;;;;;83288:2;83273:4;83267:18;:23;83241:49;83219:131;;;;-1:-1:-1;;;83219:131:0;;14123:2:1;83219:131:0;;;14105:21:1;;;14142:18;;;14135:30;14201:34;14181:18;;;14174:62;14253:18;;83219:131:0;13921:356:1;83219:131:0;27246:10;;83401:116;;;;-1:-1:-1;;;83401:116:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;83537:22:0;;;;;;:14;:22;;;;;;;;83536:23;83528:70;;;;-1:-1:-1;;;83528:70:0;;;;;;;:::i;:::-;83641:12;;-1:-1:-1;;;;;83631:22:0;;;83641:12;;83631:22;;;;:52;;-1:-1:-1;83667:16:0;;-1:-1:-1;;;;;83657:26:0;;;83667:16;;83657:26;;83631:52;83609:157;;;;-1:-1:-1;;;83609:157:0;;;;;;;:::i;:::-;83799:17;;:29;;;-1:-1:-1;;;83799:29:0;;;;83779:17;;-1:-1:-1;;;;;83799:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83779:49;;83882:9;83861:17;83871:6;83861:9;:17::i;:::-;:30;;83839:124;;;;-1:-1:-1;;;83839:124:0;;;;;;;:::i;:::-;83974:28;84005:24;84023:4;84005:9;:24::i;:::-;84084:16;;83974:55;;-1:-1:-1;84060:40:0;;;;;;;84129;;-1:-1:-1;84158:11:0;;;;;;;84129:40;:66;;;;-1:-1:-1;84187:8:0;;;;84186:9;84129:66;:100;;;;-1:-1:-1;27974:6:0;;-1:-1:-1;;;;;84212:17:0;;;27974:6;;84212:17;;84129:100;:151;;;;-1:-1:-1;;;;;;84247:33:0;;;;;;:25;:33;;;;;;;;84246:34;84129:151;84111:1101;;;84307:8;:15;;-1:-1:-1;;84307:15:0;84318:4;84307:15;;;84386:8;;84307;;84361:43;;84400:3;;84361:34;;:20;;:24;:34::i;:43::-;84438:12;;84339:65;;-1:-1:-1;84421:43:0;;-1:-1:-1;;;;;84438:12:0;84339:65;84421:16;:43::i;:::-;84481:25;84509:73;84578:3;84509:50;84548:10;;84509:20;:38;;:50;;;;:::i;:73::-;84481:101;;84599:27;84629:70;84681:3;84629:29;84651:6;;84629:17;:21;;:29;;;;:::i;:70::-;84733:16;;84599:100;;-1:-1:-1;84716:55:0;;-1:-1:-1;;;;;84733:16:0;84599:100;84716:16;:55::i;:::-;84852:16;;84786:158;;84828:4;;-1:-1:-1;;;;;84852:16:0;84887:42;:17;84909:19;84887:21;:42::i;84786:158::-;84961:18;84982:83;85047:3;84982:42;85007:16;;84982:20;:24;;:42;;;;:::i;:83::-;84961:104;;85082:26;85097:10;85082:14;:26::i;:::-;85125:42;85142:24;85160:4;85142:9;:24::i;85125:42::-;-1:-1:-1;;85184:8:0;:16;;-1:-1:-1;;85184:16:0;;;-1:-1:-1;;84111:1101:0;85222:49;85238:6;85254:4;85261:9;85222:15;:49::i;:::-;85282:17;;:43;;-1:-1:-1;;;85282:43:0;;-1:-1:-1;;;;;85282:17:0;;;;:29;;:43;;85312:6;;85320:4;;85282:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83208:2125;;;;83150:2183;:::o;92209:334::-;92260:13;27246:10;92286:59;;;;-1:-1:-1;;;92286:59:0;;;;;;;:::i;:::-;92378:17;;-1:-1:-1;;;;;92378:17:0;:30;27246:10;92378:44;;-1:-1:-1;;;;;;92378:44:0;;;;;;;-1:-1:-1;;;;;9730:32:1;;;92378:44:0;;;9712:51:1;9685:18;;92378:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92356:107;;;;-1:-1:-1;;;92356:107:0;;;;;;;:::i;:::-;92481:17;;-1:-1:-1;;;;;92481:17:0;:40;27246:10;92522:12;27166:98;82752:190;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;82836:9:::1;82831:104;82855:10;:17;82851:1;:21;82831:104;;;82922:1;82894:9;:24;82904:10;82915:1;82904:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;82894:24:0::1;-1:-1:-1::0;;;;;82894:24:0::1;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;82874:3:0;;-1:-1:-1;82874:3:0::1;::::0;::::1;:::i;:::-;;;;82831:104;;28854:281:::0;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28957:22:0;::::1;28935:110;;;::::0;-1:-1:-1;;;28935:110:0;;14484:2:1;28935:110:0::1;::::0;::::1;14466:21:1::0;14523:2;14503:18;;;14496:30;14562:34;14542:18;;;14535:62;-1:-1:-1;;;14613:18:1;;;14606:36;14659:19;;28935:110:0::1;14282:402:1::0;28935:110:0::1;29082:6;::::0;29061:38:::1;::::0;-1:-1:-1;;;;;29061:38:0;;::::1;::::0;29082:6:::1;::::0;29061:38:::1;::::0;29082:6:::1;::::0;29061:38:::1;29110:6;:17:::0;;-1:-1:-1;;;;;;29110:17:0::1;-1:-1:-1::0;;;;;29110:17:0;;;::::1;::::0;;;::::1;::::0;;28854:281::o;90784:109::-;90856:17;;:29;;;-1:-1:-1;;;90856:29:0;;;;90829:7;;-1:-1:-1;;;;;90856:17:0;;:27;;:29;;;;;;;;;;;;;;:17;:29;;;;;;;;;;89654:141;89744:17;;:43;;-1:-1:-1;;;89744:43:0;;-1:-1:-1;;;;;9730:32:1;;;89744:43:0;;;9712:51:1;89717:7:0;;89744:17;;:34;;9685:18:1;;89744:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;91284:118::-;91356:17;;:38;;;-1:-1:-1;;;91356:38:0;;;;91329:7;;-1:-1:-1;;;;;91356:17:0;;:36;;:38;;;;;;;;;;;;;;:17;:38;;;;;;;;;;91029:108;91099:17;;:30;;;-1:-1:-1;;;91099:30:0;;;;91075:4;;-1:-1:-1;;;;;91099:17:0;;:28;;:30;;;;;;;;;;;;;;:17;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73109:145::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;73190:17:::1;:56:::0;;-1:-1:-1;;;;;;73190:56:0::1;-1:-1:-1::0;;;;;73190:56:0;;;::::1;::::0;;;::::1;::::0;;73109:145::o;93059:223::-;28121:6;;-1:-1:-1;;;;;28121:6:0;27246:10;28121:22;28113:67;;;;-1:-1:-1;;;28113:67:0;;;;;;;:::i;:::-;93118:9:::1;93113:118;93137:14;:21:::0;93133:25;::::1;93113:118;;;93215:4;93179:14;:33;93194:14;93209:1;93194:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;93194:17:0::1;93179:33:::0;;;::::1;::::0;;;;;;;;:40;;-1:-1:-1;;93179:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;93159:3;::::1;::::0;::::1;:::i;:::-;;;;93113:118;;;-1:-1:-1::0;93258:16:0::1;::::0;;93272:1:::1;93258:16:::0;;::::1;::::0;::::1;::::0;;;;93241:33;::::1;::::0;:14:::1;::::0;:33:::1;:::i;:::-;;93059:223::o:0;2910:181::-;2968:7;;3000:5;3004:1;3000;:5;:::i;:::-;2988:17;;3029:1;3024;:6;;3016:46;;;;-1:-1:-1;;;3016:46:0;;15294:2:1;3016:46:0;;;15276:21:1;15333:2;15313:18;;;15306:30;15372:29;15352:18;;;15345:57;15419:18;;3016:46:0;15092:351:1;41297:380:0;-1:-1:-1;;;;;41433:19:0;;41425:68;;;;-1:-1:-1;;;41425:68:0;;26073:2:1;41425:68:0;;;26055:21:1;26112:2;26092:18;;;26085:30;26151:34;26131:18;;;26124:62;-1:-1:-1;;;26202:18:1;;;26195:34;26246:19;;41425:68:0;25871:400:1;41425:68:0;-1:-1:-1;;;;;41512:21:0;;41504:68;;;;-1:-1:-1;;;41504:68:0;;14891:2:1;41504:68:0;;;14873:21:1;14930:2;14910:18;;;14903:30;14969:34;14949:18;;;14942:62;-1:-1:-1;;;15020:18:1;;;15013:32;15062:19;;41504:68:0;14689:398:1;41504:68:0;-1:-1:-1;;;;;41585:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;41637:32;;28377:25:1;;;41637:32:0;;28350:18:1;41637:32:0;;;;;;;;41297:380;;;:::o;53570:257::-;53789:12;;-1:-1:-1;;;;;53769:16:0;;53716:7;53769:16;;;:7;:16;;;;;;53716:7;;53804:15;;53753:32;;:13;:32;:::i;:::-;53752:49;;;;:::i;:::-;:67;;;;:::i;:::-;53736:83;53570:257;-1:-1:-1;;;;53570:257:0:o;11132:391::-;11261:6;11236:21;:31;;11214:110;;;;-1:-1:-1;;;11214:110:0;;18057:2:1;11214:110:0;;;18039:21:1;18096:2;18076:18;;;18069:30;18135:31;18115:18;;;18108:59;18184:18;;11214:110:0;17855:353:1;11214:110:0;11338:12;11356:9;-1:-1:-1;;;;;11356:14:0;11378:6;11356:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11337:52;;;11422:7;11400:115;;;;-1:-1:-1;;;11400:115:0;;17215:2:1;11400:115:0;;;17197:21:1;17254:2;17234:18;;;17227:30;17293:34;17273:18;;;17266:62;17364:28;17344:18;;;17337:56;17410:19;;11400:115:0;17013:422:1;11400:115:0;11203:320;11132:391;;:::o;75660:1647::-;-1:-1:-1;;;;;75792:18:0;;75784:68;;;;-1:-1:-1;;;75784:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75871:16:0;;75863:64;;;;-1:-1:-1;;;75863:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75961:20:0;;;;;;:14;:20;;;;;;;;75960:21;:44;;;;-1:-1:-1;;;;;;75986:18:0;;;;;;:14;:18;;;;;;;;75985:19;75960:44;75938:113;;;;-1:-1:-1;;;75938:113:0;;20846:2:1;75938:113:0;;;20828:21:1;20885:2;20865:18;;;20858:30;-1:-1:-1;;;20904:18:1;;;20897:49;20963:18;;75938:113:0;20644:343:1;75938:113:0;76070:8;;;;;;;76062:45;;;;-1:-1:-1;;;76062:45:0;;26836:2:1;76062:45:0;;;26818:21:1;26875:2;26855:18;;;26848:30;26914:26;26894:18;;;26887:54;26958:18;;76062:45:0;26634:348:1;76062:45:0;-1:-1:-1;;;;;76164:16:0;;76120:17;76164:16;;;:10;:16;;;;;;76140:6;;76164:16;;76159:115;;76215:6;;76205;:16;;76197:65;;;;-1:-1:-1;;;76197:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;76291:14:0;;;;;;:10;:14;;;;;;;;76286:201;;76347:9;;76330:13;76340:2;76330:9;:13::i;:::-;:26;;76322:73;;;;-1:-1:-1;;;76322:73:0;;23749:2:1;76322:73:0;;;23731:21:1;23788:2;23768:18;;;23761:30;23827:34;23807:18;;;23800:62;-1:-1:-1;;;23878:18:1;;;23871:32;23920:19;;76322:73:0;23547:398:1;76322:73:0;76428:6;;76418;:16;;76410:65;;;;-1:-1:-1;;;76410:65:0;;;;;;;:::i;:::-;76517:13;;-1:-1:-1;;;;;76503:28:0;;;76517:13;;76503:28;:49;;;;-1:-1:-1;;;;;;76536:16:0;;;;;;:10;:16;;;;;;;;76535:17;76503:49;:69;;;;-1:-1:-1;76556:16:0;;;;;;;76503:69;76499:322;;;76589:15;76607:12;:10;:12::i;:::-;76589:30;-1:-1:-1;76634:16:0;76653:13;76589:30;76653:3;:13;:::i;:::-;76634:32;-1:-1:-1;76681:69:0;76697:4;76711;76718:31;76745:3;76718:22;:9;76732:7;76718:13;:22::i;76681:69::-;76777:32;76805:3;76777:23;:9;76791:8;76777:13;:23::i;:32::-;76765:44;;76574:247;;76499:322;-1:-1:-1;;;;;76838:14:0;;;;;;:10;:14;;;;;;;;76837:15;:36;;;;-1:-1:-1;;;;;;76857:16:0;;;;;;:10;:16;;;;;;;;76856:17;76837:36;76833:179;;;76902:41;76939:3;76902:32;76922:11;;76916:3;:17;;;;:::i;:::-;76902:9;;:13;:32::i;:41::-;76890:53;-1:-1:-1;76958:42:0;27246:10;76978:21;:6;76989:9;76978:10;:21::i;:::-;76958:5;:42::i;:::-;77028:19;;;;77024:227;;;-1:-1:-1;;;;;77069:14:0;;;;;;:10;:14;;;;;;;;77064:79;;77104:14;:23;;;;;;;-1:-1:-1;77104:23:0;;;;;;;;-1:-1:-1;;;;;;77104:23:0;-1:-1:-1;;;;;77104:23:0;;;;;77064:79;-1:-1:-1;;;;;77162:16:0;;;;;;:10;:16;;;;;;;;77157:83;;77199:14;:25;;;;;;;-1:-1:-1;77199:25:0;;;;;;;;-1:-1:-1;;;;;;77199:25:0;-1:-1:-1;;;;;77199:25:0;;;;;77157:83;77263:36;77279:4;77285:2;77289:9;77263:15;:36::i;3813:226::-;3933:7;3969:12;3961:6;;;;3953:29;;;;-1:-1:-1;;;3953:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3993:9:0;4005:5;4009:1;4005;:5;:::i;:::-;3993:17;3813:226;-1:-1:-1;;;;;3813:226:0:o;4298:471::-;4356:7;4601:6;4597:47;;-1:-1:-1;4631:1:0;4624:8;;4597:47;4656:9;4668:5;4672:1;4668;:5;:::i;:::-;4656:17;-1:-1:-1;4701:1:0;4692:5;4696:1;4656:17;4692:5;:::i;:::-;:10;4684:56;;;;-1:-1:-1;;;4684:56:0;;24152:2:1;4684:56:0;;;24134:21:1;24191:2;24171:18;;;24164:30;24230:34;24210:18;;;24203:62;-1:-1:-1;;;24281:18:1;;;24274:31;24322:19;;4684:56:0;23950:397:1;5245:132:0;5303:7;5330:39;5334:1;5337;5330:39;;;;;;;;;;;;;;;;;:3;:39::i;77315:356::-;77425:21;77457:24;77474:6;77457:16;:24::i;:::-;77492:18;77513:46;77514:21;77541:17;77513:27;:46::i;:::-;77492:67;;77571:12;77596:11;-1:-1:-1;;;;;77588:25:0;77621:10;77588:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77570:66;;;77655:7;77647:16;;;;;38796:610;-1:-1:-1;;;;;38936:20:0;;38928:70;;;;-1:-1:-1;;;38928:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39017:23:0;;39009:71;;;;-1:-1:-1;;;39009:71:0;;;;;;;:::i;:::-;39173:108;39209:6;39173:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39173:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;39153:17:0;;;:9;:17;;;;;;;;;;;:128;;;;39315:20;;;;;;;:32;;39340:6;39315:24;:32::i;:::-;-1:-1:-1;;;;;39292:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;39363:35;28377:25:1;;;39292:20:0;;39363:35;;;;;;28350:18:1;39363:35:0;28231:177:1;43035:248:0;43206:58;;;-1:-1:-1;;;;;9974:32:1;;43206:58:0;;;9956:51:1;10023:18;;;;10016:34;;;43206:58:0;;;;;;;;;;9929:18:1;;;;43206:58:0;;;;;;;;-1:-1:-1;;;;;43206:58:0;-1:-1:-1;;;43206:58:0;;;43152:123;;43186:5;;43152:19;:123::i;93423:609::-;93491:27;93540:7;93536:50;;-1:-1:-1;;93564:10:0;;;;;;;;;;;;-1:-1:-1;;;93564:10:0;;;;;93423:609::o;93536:50::-;93608:2;93596:9;93643:69;93650:6;;93643:69;;93673:5;;;;:::i;:::-;;-1:-1:-1;93693:7:0;;-1:-1:-1;93698:2:0;93693:7;;:::i;:::-;;;93643:69;;;93722:17;93752:3;93742:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93742:14:0;-1:-1:-1;93722:34:0;-1:-1:-1;93779:3:0;93793:202;93800:7;;93793:202;;93828:5;93832:1;93828;:5;:::i;:::-;93824:9;-1:-1:-1;93848:10:0;93879:7;93884:2;93879;:7;:::i;:::-;93878:14;;93890:2;93878:14;:::i;:::-;93873:19;;:2;:19;:::i;:::-;93862:31;;:2;:31;:::i;:::-;93848:46;;93909:9;93928:4;93921:12;;93909:24;;93958:2;93948:4;93953:1;93948:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;93948:12:0;;;;;;;;-1:-1:-1;93975:8:0;93981:2;93975:8;;:::i;:::-;;;93809:186;;93793:202;;;-1:-1:-1;94019:4:0;93423:609;-1:-1:-1;;;;93423:609:0:o;75302:350::-;-1:-1:-1;;;;;75407:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;75385:151;;;;-1:-1:-1;;;75385:151:0;;20416:2:1;75385:151:0;;;20398:21:1;20455:2;20435:18;;;20428:30;20494:34;20474:18;;;20467:62;20565:31;20545:18;;;20538:59;20614:19;;75385:151:0;20214:425:1;75385:151:0;-1:-1:-1;;;;;75547:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;75547:39:0;;;;;;;;;;75604:40;;75547:39;;:31;75604:40;;;75302:350;;:::o;3374:136::-;3432:7;3459:43;3463:1;3466;3459:43;;;;;;;;;;;;;;;;;:3;:43::i;78124:420::-;78183:12;78198:13;:6;78209:1;78198:10;:13::i;:::-;78183:28;-1:-1:-1;78222:17:0;78242:16;:6;78183:28;78242:10;:16::i;:::-;78222:36;-1:-1:-1;78296:21:0;78330:22;78347:4;78330:16;:22::i;:::-;78365:18;78386:41;:21;78412:14;78386:25;:41::i;:::-;78365:62;;78440:35;78453:9;78464:10;78440:12;:35::i;:::-;78493:43;;;29853:25:1;;;29909:2;29894:18;;29887:34;;;29937:18;;;29930:34;;;78493:43:0;;29841:2:1;29826:18;78493:43:0;;;;;;;78172:372;;;;78124:420;:::o;78552:505::-;78642:16;;;78656:1;78642:16;;;;;;;;78618:21;;78642:16;;;;;;;;;;-1:-1:-1;78642:16:0;78618:40;;78687:4;78669;78674:1;78669:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78669:23:0;;;:7;;;;;;;;;;:23;;;;78713:15;;:23;;;-1:-1:-1;;;78713:23:0;;;;:15;;;;;:21;;:23;;;;;78669:7;;78713:23;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78703:4;78708:1;78703:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78703:33:0;;;:7;;;;;;;;;:33;78781:15;;78749:62;;78766:4;;78781:15;78799:11;78749:8;:62::i;:::-;78824:15;;:225;;-1:-1:-1;;;78824:225:0;;-1:-1:-1;;;;;78824:15:0;;;;:67;;:225;;78906:11;;78824:15;;78976:4;;79003;;79023:15;;78824:225;;;:::i;40404:455::-;-1:-1:-1;;;;;40488:21:0;;40480:67;;;;-1:-1:-1;;;40480:67:0;;24915:2:1;40480:67:0;;;24897:21:1;24954:2;24934:18;;;24927:30;24993:34;24973:18;;;24966:62;-1:-1:-1;;;25044:18:1;;;25037:31;25085:19;;40480:67:0;24713:397:1;40480:67:0;40643:105;40680:6;40643:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40643:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;40622:18:0;;:9;:18;;;;;;;;;;:126;40774:12;;:24;;40791:6;40774:16;:24::i;:::-;40759:12;:39;40814:37;;28377:25:1;;;40840:1:0;;-1:-1:-1;;;;;40814:37:0;;;;;28365:2:1;28350:18;40814:37:0;;;;;;;40404:455;;:::o;5873:312::-;5993:7;6028:12;6021:5;6013:28;;;;-1:-1:-1;;;6013:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6052:9:0;6064:5;6068:1;6064;:5;:::i;45950:802::-;46374:23;46400:106;46442:4;46400:106;;;;;;;;;;;;;;;;;46408:5;-1:-1:-1;;;;;46400:27:0;;;:106;;;;;:::i;:::-;46521:17;;46374:132;;-1:-1:-1;46521:21:0;46517:228;;46636:10;46625:30;;;;;;;;;;;;:::i;:::-;46599:134;;;;-1:-1:-1;;;46599:134:0;;27189:2:1;46599:134:0;;;27171:21:1;27228:2;27208:18;;;27201:30;27267:34;27247:18;;;27240:62;-1:-1:-1;;;27318:18:1;;;27311:40;27368:19;;46599:134:0;26987:406:1;79065:517:0;79245:15;;79213:62;;79230:4;;-1:-1:-1;;;;;79245:15:0;79263:11;79213:8;:62::i;:::-;79318:15;;:256;;-1:-1:-1;;;79318:256:0;;79391:4;79318:256;;;11602:34:1;11652:18;;;11645:34;;;79318:15:0;11695:18:1;;;11688:34;;;11738:18;;;11731:34;;;11781:19;;;11774:44;79548:15:0;11834:19:1;;;11827:35;-1:-1:-1;;;;;79318:15:0;;;;:32;;79358:9;;11536:19:1;;79318:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12546:229::-;12683:12;12715:52;12737:6;12745:4;12751:1;12754:12;12683;10295:20;;14062:60;;;;-1:-1:-1;;;14062:60:0;;26478:2:1;14062:60:0;;;26460:21:1;26517:2;26497:18;;;26490:30;26556:31;26536:18;;;26529:59;26605:18;;14062:60:0;26276:353:1;14062:60:0;14136:12;14150:23;14177:6;-1:-1:-1;;;;;14177:11:0;14196:5;14217:4;14177:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14135:97;;;;14250:51;14267:7;14276:10;14288:12;14250:16;:51::i;:::-;14243:58;13738:571;-1:-1:-1;;;;;;;13738:571:0:o;16638:712::-;16788:12;16817:7;16813:530;;;-1:-1:-1;16848:10:0;16841:17;;16813:530;16962:17;;:21;16958:374;;17160:10;17154:17;17221:15;17208:10;17204:2;17200:19;17193:44;16958:374;17303:12;17296:20;;-1:-1:-1;;;17296:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:464:1;57:5;110:3;103:4;95:6;91:17;87:27;77:55;;128:1;125;118:12;77:55;164:6;151:20;195:49;211:32;240:2;211:32;:::i;:::-;195:49;:::i;:::-;269:2;260:7;253:19;315:3;308:4;303:2;295:6;291:15;287:26;284:35;281:55;;;332:1;329;322:12;281:55;397:2;390:4;382:6;378:17;371:4;362:7;358:18;345:55;445:1;420:16;;;438:4;416:27;409:38;;;;424:7;14:464;-1:-1:-1;;;14:464:1:o;483:247::-;542:6;595:2;583:9;574:7;570:23;566:32;563:52;;;611:1;608;601:12;563:52;650:9;637:23;669:31;694:5;669:31;:::i;735:251::-;805:6;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;906:9;900:16;925:31;950:5;925:31;:::i;1251:388::-;1319:6;1327;1380:2;1368:9;1359:7;1355:23;1351:32;1348:52;;;1396:1;1393;1386:12;1348:52;1435:9;1422:23;1454:31;1479:5;1454:31;:::i;:::-;1504:5;-1:-1:-1;1561:2:1;1546:18;;1533:32;1574:33;1533:32;1574:33;:::i;:::-;1626:7;1616:17;;;1251:388;;;;;:::o;1644:456::-;1721:6;1729;1737;1790:2;1778:9;1769:7;1765:23;1761:32;1758:52;;;1806:1;1803;1796:12;1758:52;1845:9;1832:23;1864:31;1889:5;1864:31;:::i;:::-;1914:5;-1:-1:-1;1971:2:1;1956:18;;1943:32;1984:33;1943:32;1984:33;:::i;:::-;1644:456;;2036:7;;-1:-1:-1;;;2090:2:1;2075:18;;;;2062:32;;1644:456::o;2105:382::-;2170:6;2178;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2286:9;2273:23;2305:31;2330:5;2305:31;:::i;:::-;2355:5;-1:-1:-1;2412:2:1;2397:18;;2384:32;2425:30;2384:32;2425:30;:::i;2492:315::-;2560:6;2568;2621:2;2609:9;2600:7;2596:23;2592:32;2589:52;;;2637:1;2634;2627:12;2589:52;2676:9;2663:23;2695:31;2720:5;2695:31;:::i;:::-;2745:5;2797:2;2782:18;;;;2769:32;;-1:-1:-1;;;2492:315:1:o;2812:1032::-;2896:6;2927:2;2970;2958:9;2949:7;2945:23;2941:32;2938:52;;;2986:1;2983;2976:12;2938:52;3026:9;3013:23;3055:18;3096:2;3088:6;3085:14;3082:34;;;3112:1;3109;3102:12;3082:34;3150:6;3139:9;3135:22;3125:32;;3195:7;3188:4;3184:2;3180:13;3176:27;3166:55;;3217:1;3214;3207:12;3166:55;3253:2;3240:16;3275:2;3271;3268:10;3265:36;;;3281:18;;:::i;:::-;3327:2;3324:1;3320:10;3310:20;;3350:28;3374:2;3370;3366:11;3350:28;:::i;:::-;3412:15;;;3443:12;;;;3475:11;;;3505;;;3501:20;;3498:33;-1:-1:-1;3495:53:1;;;3544:1;3541;3534:12;3495:53;3566:1;3557:10;;3576:238;3590:2;3587:1;3584:9;3576:238;;;3661:3;3648:17;3635:30;;3678:31;3703:5;3678:31;:::i;:::-;3722:18;;;3608:1;3601:9;;;;;3760:12;;;;3792;;3576:238;;;-1:-1:-1;3833:5:1;2812:1032;-1:-1:-1;;;;;;;;2812:1032:1:o;3849:241::-;3905:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:52;;;3974:1;3971;3964:12;3926:52;4013:9;4000:23;4032:28;4054:5;4032:28;:::i;4095:245::-;4162:6;4215:2;4203:9;4194:7;4190:23;4186:32;4183:52;;;4231:1;4228;4221:12;4183:52;4263:9;4257:16;4282:28;4304:5;4282:28;:::i;5020:322::-;5089:6;5142:2;5130:9;5121:7;5117:23;5113:32;5110:52;;;5158:1;5155;5148:12;5110:52;5198:9;5185:23;5231:18;5223:6;5220:30;5217:50;;;5263:1;5260;5253:12;5217:50;5286;5328:7;5319:6;5308:9;5304:22;5286:50;:::i;5347:636::-;5427:6;5480:2;5468:9;5459:7;5455:23;5451:32;5448:52;;;5496:1;5493;5486:12;5448:52;5529:9;5523:16;5562:18;5554:6;5551:30;5548:50;;;5594:1;5591;5584:12;5548:50;5617:22;;5670:4;5662:13;;5658:27;-1:-1:-1;5648:55:1;;5699:1;5696;5689:12;5648:55;5728:2;5722:9;5753:49;5769:32;5798:2;5769:32;:::i;5753:49::-;5825:2;5818:5;5811:17;5865:7;5860:2;5855;5851;5847:11;5843:20;5840:33;5837:53;;;5886:1;5883;5876:12;5837:53;5899:54;5950:2;5945;5938:5;5934:14;5929:2;5925;5921:11;5899:54;:::i;5988:457::-;6066:6;6074;6127:2;6115:9;6106:7;6102:23;6098:32;6095:52;;;6143:1;6140;6133:12;6095:52;6183:9;6170:23;6216:18;6208:6;6205:30;6202:50;;;6248:1;6245;6238:12;6202:50;6271;6313:7;6304:6;6293:9;6289:22;6271:50;:::i;:::-;6261:60;;;6371:2;6360:9;6356:18;6343:32;6384:31;6409:5;6384:31;:::i;6450:525::-;6537:6;6545;6553;6606:2;6594:9;6585:7;6581:23;6577:32;6574:52;;;6622:1;6619;6612:12;6574:52;6662:9;6649:23;6695:18;6687:6;6684:30;6681:50;;;6727:1;6724;6717:12;6681:50;6750;6792:7;6783:6;6772:9;6768:22;6750:50;:::i;:::-;6740:60;;;6847:2;6836:9;6832:18;6819:32;6809:42;;6901:2;6890:9;6886:18;6873:32;6914:31;6939:5;6914:31;:::i;:::-;6964:5;6954:15;;;6450:525;;;;;:::o;6980:272::-;7038:6;7091:2;7079:9;7070:7;7066:23;7062:32;7059:52;;;7107:1;7104;7097:12;7059:52;7146:9;7133:23;7196:6;7189:5;7185:18;7178:5;7175:29;7165:57;;7218:1;7215;7208:12;7257:180;7316:6;7369:2;7357:9;7348:7;7344:23;7340:32;7337:52;;;7385:1;7382;7375:12;7337:52;-1:-1:-1;7408:23:1;;7257:180;-1:-1:-1;7257:180:1:o;7442:184::-;7512:6;7565:2;7553:9;7544:7;7540:23;7536:32;7533:52;;;7581:1;7578;7571:12;7533:52;-1:-1:-1;7604:16:1;;7442:184;-1:-1:-1;7442:184:1:o;7631:248::-;7699:6;7707;7760:2;7748:9;7739:7;7735:23;7731:32;7728:52;;;7776:1;7773;7766:12;7728:52;-1:-1:-1;;7799:23:1;;;7869:2;7854:18;;;7841:32;;-1:-1:-1;7631:248:1:o;7884:306::-;7972:6;7980;7988;8041:2;8029:9;8020:7;8016:23;8012:32;8009:52;;;8057:1;8054;8047:12;8009:52;8086:9;8080:16;8070:26;;8136:2;8125:9;8121:18;8115:25;8105:35;;8180:2;8169:9;8165:18;8159:25;8149:35;;7884:306;;;;;:::o;8195:258::-;8237:3;8275:5;8269:12;8302:6;8297:3;8290:19;8318:63;8374:6;8367:4;8362:3;8358:14;8351:4;8344:5;8340:16;8318:63;:::i;:::-;8435:2;8414:15;-1:-1:-1;;8410:29:1;8401:39;;;;8442:4;8397:50;;8195:258;-1:-1:-1;;8195:258:1:o;8458:274::-;8587:3;8625:6;8619:13;8641:53;8687:6;8682:3;8675:4;8667:6;8663:17;8641:53;:::i;:::-;8710:16;;;;;8458:274;-1:-1:-1;;8458:274:1:o;8737:614::-;9017:3;9055:6;9049:13;9071:53;9117:6;9112:3;9105:4;9097:6;9093:17;9071:53;:::i;:::-;-1:-1:-1;;;9146:16:1;;;9171:18;;;9214:13;;9236:65;9214:13;9288:1;9277:13;;9270:4;9258:17;;9236:65;:::i;:::-;9321:20;9343:1;9317:28;;8737:614;-1:-1:-1;;;;8737:614:1:o;10370:317::-;-1:-1:-1;;;;;10547:32:1;;10529:51;;10616:2;10611;10596:18;;10589:30;;;-1:-1:-1;;10636:45:1;;10662:18;;10654:6;10636:45;:::i;12531:220::-;12680:2;12669:9;12662:21;12643:4;12700:45;12741:2;12730:9;12726:18;12718:6;12700:45;:::i;13175:399::-;13377:2;13359:21;;;13416:2;13396:18;;;13389:30;13455:34;13450:2;13435:18;;13428:62;-1:-1:-1;;;13521:2:1;13506:18;;13499:33;13564:3;13549:19;;13175:399::o;13579:337::-;13781:2;13763:21;;;13820:2;13800:18;;;13793:30;-1:-1:-1;;;13854:2:1;13839:18;;13832:43;13907:2;13892:18;;13579:337::o;16257:344::-;16459:2;16441:21;;;16498:2;16478:18;;;16471:30;-1:-1:-1;;;16532:2:1;16517:18;;16510:50;16592:2;16577:18;;16257:344::o;16606:402::-;16808:2;16790:21;;;16847:2;16827:18;;;16820:30;16886:34;16881:2;16866:18;;16859:62;-1:-1:-1;;;16952:2:1;16937:18;;16930:36;16998:3;16983:19;;16606:402::o;18620:407::-;18822:2;18804:21;;;18861:2;18841:18;;;18834:30;18900:34;18895:2;18880:18;;18873:62;-1:-1:-1;;;18966:2:1;18951:18;;18944:41;19017:3;19002:19;;18620:407::o;19032:355::-;19234:2;19216:21;;;19273:2;19253:18;;;19246:30;19312:33;19307:2;19292:18;;19285:61;19378:2;19363:18;;19032:355::o;19801:408::-;20003:2;19985:21;;;20042:2;20022:18;;;20015:30;20081:34;20076:2;20061:18;;20054:62;-1:-1:-1;;;20147:2:1;20132:18;;20125:42;20199:3;20184:19;;19801:408::o;20992:400::-;21194:2;21176:21;;;21233:2;21213:18;;;21206:30;21272:34;21267:2;21252:18;;21245:62;-1:-1:-1;;;21338:2:1;21323:18;;21316:34;21382:3;21367:19;;20992:400::o;21880:419::-;22082:2;22064:21;;;22121:2;22101:18;;;22094:30;22160:34;22155:2;22140:18;;22133:62;22231:25;22226:2;22211:18;;22204:53;22289:3;22274:19;;21880:419::o;22304:398::-;22506:2;22488:21;;;22545:2;22525:18;;;22518:30;22584:34;22579:2;22564:18;;22557:62;-1:-1:-1;;;22650:2:1;22635:18;;22628:32;22692:3;22677:19;;22304:398::o;22707:420::-;22909:2;22891:21;;;22948:2;22928:18;;;22921:30;22987:34;22982:2;22967:18;;22960:62;23058:26;23053:2;23038:18;;23031:54;23117:3;23102:19;;22707:420::o;23132:410::-;23334:2;23316:21;;;23373:2;23353:18;;;23346:30;23412:34;23407:2;23392:18;;23385:62;-1:-1:-1;;;23478:2:1;23463:18;;23456:44;23532:3;23517:19;;23132:410::o;24352:356::-;24554:2;24536:21;;;24573:18;;;24566:30;24632:34;24627:2;24612:18;;24605:62;24699:2;24684:18;;24352:356::o;25115:401::-;25317:2;25299:21;;;25356:2;25336:18;;;25329:30;25395:34;25390:2;25375:18;;25368:62;-1:-1:-1;;;25461:2:1;25446:18;;25439:35;25506:3;25491:19;;25115:401::o;27398:407::-;27600:2;27582:21;;;27639:2;27619:18;;;27612:30;27678:34;27673:2;27658:18;;27651:62;-1:-1:-1;;;27744:2:1;27729:18;;27722:41;27795:3;27780:19;;27398:407::o;27810:416::-;28012:2;27994:21;;;28051:2;28031:18;;;28024:30;28090:34;28085:2;28070:18;;28063:62;-1:-1:-1;;;28156:2:1;28141:18;;28134:50;28216:3;28201:19;;27810:416::o;28413:980::-;28675:4;28723:3;28712:9;28708:19;28754:6;28743:9;28736:25;28780:2;28818:6;28813:2;28802:9;28798:18;28791:34;28861:3;28856:2;28845:9;28841:18;28834:31;28885:6;28920;28914:13;28951:6;28943;28936:22;28989:3;28978:9;28974:19;28967:26;;29028:2;29020:6;29016:15;29002:29;;29049:1;29059:195;29073:6;29070:1;29067:13;29059:195;;;29138:13;;-1:-1:-1;;;;;29134:39:1;29122:52;;29229:15;;;;29194:12;;;;29170:1;29088:9;29059:195;;;-1:-1:-1;;;;;;;29310:32:1;;;;29305:2;29290:18;;29283:60;-1:-1:-1;;;29374:3:1;29359:19;29352:35;29271:3;28413:980;-1:-1:-1;;;28413:980:1:o;30164:275::-;30235:2;30229:9;30300:2;30281:13;;-1:-1:-1;;30277:27:1;30265:40;;30335:18;30320:34;;30356:22;;;30317:62;30314:88;;;30382:18;;:::i;:::-;30418:2;30411:22;30164:275;;-1:-1:-1;30164:275:1:o;30444:187::-;30493:4;30526:18;30518:6;30515:30;30512:56;;;30548:18;;:::i;:::-;-1:-1:-1;30614:2:1;30593:15;-1:-1:-1;;30589:29:1;30620:4;30585:40;;30444:187::o;30636:128::-;30676:3;30707:1;30703:6;30700:1;30697:13;30694:39;;;30713:18;;:::i;:::-;-1:-1:-1;30749:9:1;;30636:128::o;30769:204::-;30807:3;30843:4;30840:1;30836:12;30875:4;30872:1;30868:12;30910:3;30904:4;30900:14;30895:3;30892:23;30889:49;;;30918:18;;:::i;:::-;30954:13;;30769:204;-1:-1:-1;;;30769:204:1:o;30978:217::-;31018:1;31044;31034:132;;31088:10;31083:3;31079:20;31076:1;31069:31;31123:4;31120:1;31113:15;31151:4;31148:1;31141:15;31034:132;-1:-1:-1;31180:9:1;;30978:217::o;31200:168::-;31240:7;31306:1;31302;31298:6;31294:14;31291:1;31288:21;31283:1;31276:9;31269:17;31265:45;31262:71;;;31313:18;;:::i;:::-;-1:-1:-1;31353:9:1;;31200:168::o;31373:125::-;31413:4;31441:1;31438;31435:8;31432:34;;;31446:18;;:::i;:::-;-1:-1:-1;31483:9:1;;31373:125::o;31503:258::-;31575:1;31585:113;31599:6;31596:1;31593:13;31585:113;;;31675:11;;;31669:18;31656:11;;;31649:39;31621:2;31614:10;31585:113;;;31716:6;31713:1;31710:13;31707:48;;;-1:-1:-1;;31751:1:1;31733:16;;31726:27;31503:258::o;31766:380::-;31845:1;31841:12;;;;31888;;;31909:61;;31963:4;31955:6;31951:17;31941:27;;31909:61;32016:2;32008:6;32005:14;31985:18;31982:38;31979:161;;;32062:10;32057:3;32053:20;32050:1;32043:31;32097:4;32094:1;32087:15;32125:4;32122:1;32115:15;31979:161;;31766:380;;;:::o;32151:135::-;32190:3;-1:-1:-1;;32211:17:1;;32208:43;;;32231:18;;:::i;:::-;-1:-1:-1;32278:1:1;32267:13;;32151:135::o;32291:127::-;32352:10;32347:3;32343:20;32340:1;32333:31;32383:4;32380:1;32373:15;32407:4;32404:1;32397:15;32423:127;32484:10;32479:3;32475:20;32472:1;32465:31;32515:4;32512:1;32505:15;32539:4;32536:1;32529:15;32555:127;32616:10;32611:3;32607:20;32604:1;32597:31;32647:4;32644:1;32637:15;32671:4;32668:1;32661:15;32687:131;-1:-1:-1;;;;;32762:31:1;;32752:42;;32742:70;;32808:1;32805;32798:12;32823:118;32909:5;32902:13;32895:21;32888:5;32885:32;32875:60;;32931:1;32928;32921:12

Swarm Source

ipfs://f6abe40163be67b18ddae1e8d8c8779f5603936cc2830ac4be428ed4dcb4bd62
Loading