ETH Price: $3,663.01 (+0.72%)
 

Overview

Max Total Supply

1,000,000,000,000 QTINU

Holders

67

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,628,180,887.031118741 QTINU

Value
$0.00
0x12c307dc92b9e3fb0895825264726c60e757be57
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
QuentinTarantInu

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 2021-11-24
*/

pragma solidity ^0.8.4;

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


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    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 = msg.sender;
        _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() == msg.sender, "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 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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @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,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * 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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}




////////////////////////////////////////////////////////////////////////////////////////////////////////
//QuentinTarantInu Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract QuentinTarantInu is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

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


    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _whiteList;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromRaffle;

    mapping (address => bool) public _blacklist;
    bool isBlacklist = true;

    //Token Info
    string private constant _name = 'Quentin Tarant Inu';
    string private constant _symbol = 'QTINU';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000 * 10**6 * 10**_decimals;//equals 1.000.000.000.000 token

    uint256 swapLimit = 1000 * 10**5 * 10**_decimals;
    bool isSwapPegged = true;

    //Divider for the buyLimit based on circulating Supply (1%)
    uint16 public constant BuyLimitDivider=100;
    //Divider for the MaxBalance based on circulating Supply (1.5%)
    uint8 public constant BalanceLimitDivider=65;
    //Divider for the Whitelist MaxBalance based on initial Supply(1.5%)
    uint16 public constant WhiteListBalanceLimitDivider=65;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
    //Sellers get locked for MaxSellLockTime so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 1 seconds;
    // Team wallets
    address public constant TeamWallet=0x5aBA7a046988b907Aa014416CfFC0d8357385359;
    address public constant SecondTeamWallet=0x38079acC056348Ec3e0716DEa3927AD738e23076; //need ell or dev address
    //TODO: Change to Mainnet
    //TestNet
    //address private constant PancakeRouter=0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
    //MainNet
    // 0x10ED43C718714eb63d5aA57B78B54704E256024E
    address private constant PancakeRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 public  buyLimit = _circulatingSupply;
    address[] public triedToDump;

    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=95;

    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;
    bool botRekt = false;
    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;

    bool isTokenSwapManual = true;


    address private _pancakePairAddress;
    IPancakeRouter02 private  _pancakeRouter;

    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet||addr==SecondTeamWallet;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply*9/10;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        //contract gets 10% of the token to generate LP token and Marketing Budget fase
        //contract will sell token over the first 200 sells to generate maximum LP and BNB
        uint256 injectBalance=_circulatingSupply-deployerBalance;
        _balances[address(this)]=injectBalance;
       emit Transfer(address(0), address(this),injectBalance);

        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());

        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
        buyLimit=InitialSupply/BuyLimitDivider;

       //Sets sellLockTime to be 2 seconds by default
        sellLockTime=2 seconds;

        //Set Starting Tax to very high percentage(36%) to achieve maximum burn in the beginning
        //as in the beginning there is the highest token volume
        //any change in tax rate needs to be below maxTax(20%)
        _buyTax=11;
        _sellTax=11;//Sell Tax is lower, as otherwise slippage would be too high to sell
        _transferTax=11;
        //a small percentage gets added to the Contract token as 10% of token are already injected to
        //be converted to LP and MarketingBNB
        _liquidityTax=20;
        _marketingTax=80;
        //Team wallet and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(SecondTeamWallet);
        _excluded.add(msg.sender);
        //excludes Pancake Router, pair, contract and burn address from staking
        _excludedFromRaffle.add(address(_pancakeRouter));
        _excludedFromRaffle.add(_pancakePairAddress);
        _excludedFromRaffle.add(address(this));
        _excludedFromRaffle.add(0x000000000000000000000000000000000000dEaD);
        _excludedFromSellLock.add(address(_pancakeRouter));
        _excludedFromSellLock.add(_pancakePairAddress);
        _excludedFromSellLock.add(address(this));
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Transfer functionality////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");


        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));

        //transfers between PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter)
        || (recipient == _pancakePairAddress && sender == pancakeRouter));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_pancakePairAddress|| sender == pancakeRouter;
        bool isSell=recipient==_pancakePairAddress|| recipient == pancakeRouter;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{
            //once trading is enabled, it can't be turned off again
            if (!tradingEnabled) {
                if (sender != owner() && recipient != owner()) {
                    if (!wListed[sender] && !wListed[recipient]) {
                        if (botRekt) {
                           emit Transfer(sender,recipient,0);
                           return;
                        }
                        else {
                            require(tradingEnabled,"trading not yet enabled");
                        }
                    }
                }
            }
            if(whiteListTrading){
                _whiteListTransfer(sender,recipient,amount,isBuy,isSell);
            }
            else{
                _taxedTransfer(sender,recipient,amount,isBuy,isSell);
            }
        }
    }
    //if whitelist is active, all taxed transfers run through this
    function _whiteListTransfer(address sender, address recipient,uint256 amount,bool isBuy,bool isSell) private{
        //only apply whitelist restrictions during buys and transfers
        if(!isSell){
            //the recipient needs to be on Whitelist. Works for both buys and transfers.
            //transfers to other whitelisted addresses are allowed.
            require(_whiteList.contains(recipient),"recipient not on whitelist");
            //Limit is 1/500 of initialSupply during whitelist, to allow for a large whitelist without causing a massive
            //price impact of the whitelist
            require((_balances[recipient]+amount<=InitialSupply/WhiteListBalanceLimitDivider),"amount exceeds whitelist max");
        }
        _taxedTransfer(sender,recipient,amount,isBuy,isSell);

    }
    //applies taxes, checks for limits, locks generates autoLP and stakingBNB, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");


        swapLimit = sellLimit/2;

        uint8 tax;
        if(isSell){
            if(isBlacklist) {
                require(!_blacklist[sender]);
            }
            if(!_excludedFromSellLock.contains(sender)){
                //If seller sold less than sellLockTime(2h) ago, sell is declined, can be disabled by Team
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(50.000 Tokens at start, can be updated to circulating supply)
            if(amount>sellLimit) {
                triedToDump.push(sender);
            }
            require(amount<=sellLimit,"Dump protection");
            tax=_sellTax;

        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(balanceLimit==0 || recipientBalance+amount<=balanceLimit,"whale protection");
            require(buyLimit==0 || amount<=buyLimit, "whale protection");
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(balanceLimit==0 || recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }
        //Swapping AutoLP and MarketingBNB is only possible if sender is not pancake pair,
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier))
            _swapContractToken(amount);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);

        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);

        emit Transfer(sender,recipient,taxedAmount);



    }
    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);

        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //BNB Autostake/////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Autostake uses the balances of each holder to redistribute auto generated BNB.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawBNB can be used for any holder to withdraw BNB at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //adds Token to balances, adds new BNB to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        _balances[addr]=newAmount;

    }


    //removes Token, adds BNB to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
         _balances[addr]=newAmount;
    }

    //lock for the withdraw
    bool private _isTokenSwaping;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalTokenSwapGenerated;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;

    //marketing share of the TokenSwap tax
    uint8 public marketingShare=100;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, pancake and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isexcludedFromRaffle(address addr) public view returns (bool){
        return _excludedFromRaffle.contains(addr);
    }

    //distributes bnb between marketing share and dividents
    function _distributeFeesBNB(uint256 BNBamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (BNBamount * marketingShare) / 100;

        marketingBalance+=marketingSplit;

    }



    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    //tracks auto generated BNB, useful for ticker etc
    uint256 public totalLPBNB;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing BNB and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken(uint256 totalMax) private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_marketingTax;
        uint256 tokenToSwap=swapLimit;
        if(tokenToSwap > totalMax) {
            if(isSwapPegged) {
                tokenToSwap = totalMax;
            }
        }
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqBNBToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for BNB
        uint256 swapToken=liqBNBToken+tokenForMarketing;
        //Gets the initial BNB balance, so swap won't touch any staked BNB
        uint256 initialBNBBalance = address(this).balance;
        _swapTokenForBNB(swapToken);
        uint256 newBNB=(address(this).balance - initialBNBBalance);
        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP
        uint256 liqBNB = (newBNB*liqBNBToken)/swapToken;
        _addLiquidity(liqToken, liqBNB);
        //Get the BNB balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 generatedBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB between stakers and Marketing
        _distributeFeesBNB(generatedBNB);
    }
    //swaps tokens on the contract for BNB
    function _swapTokenForBNB(uint256 amount) private {
        _approve(address(this), address(_pancakeRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _pancakeRouter.WETH();

        _pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 bnbamount) private {
        totalLPBNB+=bnbamount;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //public functions /////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    function getBurnedTokens() public view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }

    function getWhitelistedStatus(address AddressToCheck) public view returns(bool){
        return _whiteList.contains(AddressToCheck);
    }
    //How long is a given address still locked from selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }

    //Functions every wallet can call
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    function AddressResetSellLock() public{
        _sellLock[msg.sender]=block.timestamp+sellLockTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;


    function getDumpers() public view returns(address[] memory) {
        return triedToDump;
    }


    function TeamSetWhitelistedAddressAlt(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
    }

    function TeamSetWhitelistedAddress(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
        _excluded.add(addy);
    }


    function TeamSetWhitelistedAddressesAlt( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
        }
    }

    function TeamSetWhitelistedAddresses( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
            _excluded.add(addy[i]);
        }
    }

    function TeamSetPeggedSwap(bool isPegged) public onlyTeam {
        isSwapPegged = isPegged;
    }


    //Excludes account from Staking
    function TeamExcludeFromRaffle(address addr) public onlyTeam{
        require(!isexcludedFromRaffle(addr));
        _excludedFromRaffle.add(addr);

    }

    //Includes excluded Account to staking
    function TeamIncludeToRaffle(address addr) public onlyTeam{
        require(isexcludedFromRaffle(addr));
        _excludedFromRaffle.remove(addr);
    }

    function TeamWithdrawMarketingBNB() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }


    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyTeam{
        sellLockDisabled=disabled;
    }
    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyTeam{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    }

    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyTeam{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax&&transferTax<=MaxTax,"taxes higher than max tax");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;

        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyTeam{
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking BNB
    function TeamManualGenerateTokenSwapBalance(uint256 _qty) public onlyTeam{
    _swapContractToken(_qty * 10**9);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromSellLock(address account) public onlyTeam {
        _excludedFromSellLock.add(account);
    }
    function TeamIncludeAccountToSellLock(address account) public onlyTeam {
        _excludedFromSellLock.remove(account);
    }

     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public tradingEnabled;
    bool public whiteListTrading;
    address private _liquidityTokenAddress;
    //Enables whitelist trading and locks Liquidity for a short time
    function SetupEnableWhitelistTrading() public onlyTeam{
        require(!tradingEnabled);
        //Sets up the excluded from staking list
        tradingEnabled=true;
        whiteListTrading=true;
    }
    //Enables trading for everyone
    function SetupEnableTrading() public onlyTeam{
        require(tradingEnabled&&whiteListTrading);
        whiteListTrading=false;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyTeam{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    //Functions for whitelist
    function SetupAddToWhitelist(address addressToAdd) public onlyTeam{
        _whiteList.add(addressToAdd);
    }
    function SetupAddArrayToWhitelist(address[] memory addressesToAdd) public onlyTeam{
        for(uint i=0; i<addressesToAdd.length; i++){
            _whiteList.add(addressesToAdd[i]);
        }
    }
    function SetupRemoveFromWhitelist(address addressToRemove) public onlyTeam{
        _whiteList.remove(addressToRemove);
    }


    function TeamRescueTokens(address tknAddress) public onlyTeam {
        IBEP20 token = IBEP20(tknAddress);
        uint256 ourBalance = token.balanceOf(address(this));
        require(ourBalance>0, "No tokens in our balance");
        token.transfer(msg.sender, ourBalance);
    }

    // Blacklists

    function setBlacklistEnabled(bool isBlacklistEnabled) public onlyTeam {
        isBlacklist = isBlacklistEnabled;
    }

    function setContractTokenSwapManual(bool manual) public onlyTeam {
        isTokenSwapManual = manual;
    }

    function setBlacklistedAddress(address toBlacklist) public onlyTeam {
        _blacklist[toBlacklist] = true;
    }

    function removeBlacklistedAddress(address toRemove) public onlyTeam {
        _blacklist[toRemove] = false;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Utilities/////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    function TeamAvoidBurning() public onlyTeam{
        (bool sent,) =msg.sender.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}
    fallback() external payable {}
    // IBEP20

    function getOwner() external view override returns (address) {
        return owner();
    }

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

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

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

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

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

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

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

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

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

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

    // IBEP20 - Helpers

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

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

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

    function setBuyLimit(uint256 newBuyLimit) onlyTeam public {
        buyLimit=newBuyLimit;
    }
    function setBalanceLimit(uint256 newBalanceLimit) onlyTeam public{
        balanceLimit=newBalanceLimit;
    }
    function setSellLimit(uint256 newSellLimit) onlyTeam public{
        sellLimit=newSellLimit;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SecondTeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressesToAdd","type":"address[]"}],"name":"SetupAddArrayToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAdd","type":"address"}],"name":"SetupAddToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableWhitelistTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"SetupRemoveFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamAvoidBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamExcludeFromRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamIncludeToRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"TeamManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"TeamRescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPegged","type":"bool"}],"name":"TeamSetPeggedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressesAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualBNBConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListBalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDumpers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getWhitelistedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isexcludedFromRaffle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"removeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"}],"name":"setBalanceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyLimit","type":"uint256"}],"name":"setBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"setContractTokenSwapManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"setSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenSwapGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"triedToDump","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600e805460ff191660011790556200001f6009600a620006c8565b6200002f906305f5e10062000787565b600f556010805460ff191660011790556200004d6009600a620006c8565b6200005e9064e8d4a5100062000787565b6011819055601281905560138190556014556016805467ff000000ff0000001916670100000000000000179055601a805460ff19166064179055348015620000a557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000600a6011546009620000fc919062000787565b6200010891906200065c565b33600081815260016020526040808220849055519293509091600080516020620040a783398151915290620001409085815260200190565b60405180910390a36000816011546200015a9190620007a9565b30600081815260016020526040808220849055519293509091600080516020620040a783398151915290620001929085815260200190565b60405180910390a3601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001fa57600080fd5b505afa1580156200020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023591906200062a565b6001600160a01b031663c9c6539630601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029357600080fd5b505afa158015620002a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ce91906200062a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200031757600080fd5b505af11580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035291906200062a565b601680546001600160a01b03929092166801000000000000000002600160401b600160e01b03199092169190911790556041620003926009600a620006c8565b620003a39064e8d4a5100062000787565b620003af91906200065c565b6012556064620003c26009600a620006c8565b620003d39064e8d4a5100062000787565b620003df91906200065c565b6013556064620003f26009600a620006c8565b620004039064e8d4a5100062000787565b6200040f91906200065c565b6014556002601f556016805466ffff0000ffffff191666501400000b0b0b1790556200045d6005735aba7a046988b907aa014416cffc0d8357385359620005b8602090811b620020b817901c565b506200048d7338079acc056348ec3e0716dea3927ad738e230766005620005b860201b620020b81790919060201c565b50620004a9336005620005b860201b620020b81790919060201c565b50601754620004d090600b906001600160a01b0316620005b8602090811b620020b817901c565b5062000501601660089054906101000a90046001600160a01b0316600b620005b860201b620020b81790919060201c565b506200051d30600b620005b860201b620020b81790919060201c565b506200053b61dead600b620005b860201b620020b81790919060201c565b5060175462000562906009906001600160a01b0316620005b8602090811b620020b817901c565b5062000593601660089054906101000a90046001600160a01b03166009620005b860201b620020b81790919060201c565b50620005af306009620005b860201b620020b81790919060201c565b505050620007d9565b6000620005cf836001600160a01b038416620005d8565b90505b92915050565b60008181526001830160205260408120546200062157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005d2565b506000620005d2565b6000602082840312156200063d57600080fd5b81516001600160a01b03811681146200065557600080fd5b9392505050565b6000826200067a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620006c0578160001904821115620006a457620006a4620007c3565b80851615620006b257918102915b93841c939080029062000684565b509250929050565b6000620005cf60ff841683600082620006e457506001620005d2565b81620006f357506000620005d2565b81600181146200070c5760028114620007175762000737565b6001915050620005d2565b60ff8411156200072b576200072b620007c3565b50506001821b620005d2565b5060208310610133831016604e8410600b84101617156200075c575081810a620005d2565b6200076883836200067f565b80600019048211156200077f576200077f620007c3565b029392505050565b6000816000190483118215151615620007a457620007a4620007c3565b500290565b600082821015620007be57620007be620007c3565b500390565b634e487b7160e01b600052601160045260246000fd5b6138be80620007e96000396000f3fe6080604052600436106104685760003560e01c80636f89e409116102485780639fa62d5f11610138578063d8e8de34116100bb578063e3aa94b011610082578063e3aa94b014610e28578063e77bf5f814610e48578063eb8e886314610e68578063f2fde38b14610e7d578063f88b0e4614610e9d578063f9963ca114610eb357005b8063d8e8de3414610d62578063da1144d614610d82578063dd31ee2d14610da2578063dd62ed3e14610dc2578063dff6bcbf14610e0857005b8063a9bf2c09116100ff578063a9bf2c0914610cd8578063b76289b814610cf8578063b85111db14610d18578063c3f4f54f14610d2d578063d51f383b14610d4257005b80639fa62d5f14610c28578063a20623ce14610c48578063a457c2d714610c78578063a6fc178a14610c98578063a9059cbb14610cb857005b80638728ecd1116101cb5780638da5cb5b116101925780638da5cb5b14610b24578063914e208a14610b7857806393ab98f214610b9a57806395d89b4114610bba5780639728c01914610be8578063988c5ec914610c0857005b80638728ecd114610ae5578063887c60fb14610b05578063893d20e814610b245780638d060d7714610b425780638d2c503914610b5857005b8063762bb2821161020f578063762bb28214610a765780637b9e987a14610a8c5780637f91937314610aa157806386d0ada814610ab65780638724cc7214610ad057005b80636f89e409146109c157806370a08231146109eb578063715018a614610a2157806371ab1f0914610a3657806373ddf08e14610a5657005b80632ce0a6ee1161036357806348e53164116102e657806357ad67d1116102ad57806357ad67d1146108fd578063588aeaf21461091d578063589210d91461093d57806358e553651461095357806363b263b314610969578063677a88701461099957005b806348e531641461087d57806348e907b7146108925780634ada218b146108a85780634cdaf0ae146108c75780634f91e48c146108e757005b8063395093511161032a57806339509351146107e75780633d8dbf5d146108075780633e9be909146108275780634089b170146108475780634607e6921461085d57005b80632ce0a6ee14610769578063311a869714610789578063313ce5671461079e5780633328b721146107b25780633478154b146107d257005b80631285073c116103eb5780631eb25d13116103b25780631eb25d131461068b5780631f8b845e1461059a578063230ffc42146106a057806323b872dd146106e05780632973ef2d1461070057005b80631285073c146105f757806314e91377146106165780631732ed7c1461063657806318160ddd1461065657806319e880841461066b57005b80630b1daa3e1161042f5780630b1daa3e1461055a5780630fa6c5ff1461057a5780630fd99e161461059a5780631193c691146105c25780631201cbd0146105d757005b8063029a1ecd1461047157806302a89e021461049157806306fdde03146104b157806309218ee7146104fe578063095ea7b31461052a57005b3661046f57005b005b34801561047d57600080fd5b5061046f61048c36600461325c565b610ed3565b34801561049d57600080fd5b5061046f6104ac3660046133e6565b610f23565b3480156104bd57600080fd5b506040805180820190915260128152715175656e74696e20546172616e7420496e7560701b60208201525b6040516104f59190613588565b60405180910390f35b34801561050a57600080fd5b50601a546105189060ff1681565b60405160ff90911681526020016104f5565b34801561053657600080fd5b5061054a61054536600461333e565b610f6e565b60405190151581526020016104f5565b34801561056657600080fd5b5061046f61057536600461325c565b610f85565b34801561058657600080fd5b5061046f61059536600461325c565b610fb5565b3480156105a657600080fd5b506105af606481565b60405161ffff90911681526020016104f5565b3480156105ce57600080fd5b5061046f610ff7565b3480156105e357600080fd5b5061046f6105f23660046133e6565b611044565b34801561060357600080fd5b50601f545b6040519081526020016104f5565b34801561062257600080fd5b5061046f6106313660046133e6565b61107c565b34801561064257600080fd5b5061046f610651366004613310565b6110bb565b34801561066257600080fd5b50601154610608565b34801561067757600080fd5b5061046f610686366004613310565b611114565b34801561069757600080fd5b50610608611164565b3480156106ac57600080fd5b506106c87338079acc056348ec3e0716dea3927ad738e2307681565b6040516001600160a01b0390911681526020016104f5565b3480156106ec57600080fd5b5061054a6106fb3660046132cf565b611182565b34801561070c57600080fd5b506016546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104f5565b34801561077557600080fd5b5061046f610784366004613420565b611219565b34801561079557600080fd5b50610518604181565b3480156107aa57600080fd5b506009610518565b3480156107be57600080fd5b5061046f6107cd36600461325c565b611243565b3480156107de57600080fd5b506105af600181565b3480156107f357600080fd5b5061054a61080236600461333e565b611289565b34801561081357600080fd5b5061046f61082236600461325c565b6112c0565b34801561083357600080fd5b5061046f61084236600461339f565b611309565b34801561085357600080fd5b5061060860195481565b34801561086957600080fd5b5061046f610878366004613420565b611395565b34801561088957600080fd5b5061046f6113d3565b34801561089e57600080fd5b5061060860185481565b3480156108b457600080fd5b5060205461054a90610100900460ff1681565b3480156108d357600080fd5b5061046f6108e236600461325c565b6113f2565b3480156108f357600080fd5b5061060860135481565b34801561090957600080fd5b5061046f6109183660046134bd565b611443565b34801561092957600080fd5b5061046f61093836600461325c565b6115d9565b34801561094957600080fd5b5061060860145481565b34801561095f57600080fd5b50610608601b5481565b34801561097557600080fd5b5061054a61098436600461325c565b60046020526000908152604090205460ff1681565b3480156109a557600080fd5b506106c8735aba7a046988b907aa014416cffc0d835738535981565b3480156109cd57600080fd5b506109d6611609565b604080519283526020830191909152016104f5565b3480156109f757600080fd5b50610608610a0636600461325c565b6001600160a01b031660009081526001602052604090205490565b348015610a2d57600080fd5b5061046f611646565b348015610a4257600080fd5b5060205461054a9062010000900460ff1681565b348015610a6257600080fd5b5061046f610a713660046134a2565b6116f9565b348015610a8257600080fd5b5061060860125481565b348015610a9857600080fd5b5061046f611734565b348015610aad57600080fd5b5061046f61178f565b348015610ac257600080fd5b5060205461054a9060ff1681565b348015610adc57600080fd5b506105af604181565b348015610af157600080fd5b50610608610b0036600461325c565b61185c565b348015610b1157600080fd5b50601e5461054a90610100900460ff1681565b348015610b3057600080fd5b506000546001600160a01b03166106c8565b348015610b4e57600080fd5b50610608601d5481565b348015610b6457600080fd5b5061046f610b733660046133e6565b61189b565b348015610b8457600080fd5b50610b8d6118d3565b6040516104f59190613575565b348015610ba657600080fd5b506106c8610bb5366004613420565b611935565b348015610bc657600080fd5b506040805180820190915260058152645154494e5560d81b60208201526104e8565b348015610bf457600080fd5b5061046f610c0336600461339f565b61195f565b348015610c1457600080fd5b5061054a610c2336600461325c565b611a26565b348015610c3457600080fd5b5061046f610c43366004613452565b611a33565b348015610c5457600080fd5b5061054a610c6336600461325c565b600d6020526000908152604090205460ff1681565b348015610c8457600080fd5b5061054a610c9336600461333e565b611a92565b348015610ca457600080fd5b5061046f610cb33660046133e6565b611b0e565b348015610cc457600080fd5b5061054a610cd336600461333e565b611b46565b348015610ce457600080fd5b5061046f610cf3366004613420565b611b53565b348015610d0457600080fd5b5061046f610d1336600461325c565b611b7d565b348015610d2457600080fd5b5061046f611bad565b348015610d3957600080fd5b50610608611c27565b348015610d4e57600080fd5b5061046f610d5d366004613420565b611c67565b348015610d6e57600080fd5b5061054a610d7d36600461325c565b611ce2565b348015610d8e57600080fd5b5061046f610d9d36600461336a565b611cef565b348015610dae57600080fd5b5061046f610dbd366004613420565b611d60565b348015610dce57600080fd5b50610608610ddd366004613296565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610e1457600080fd5b5061046f610e2336600461325c565b611d8a565b348015610e3457600080fd5b5061046f610e4336600461325c565b611dba565b348015610e5457600080fd5b5061046f610e6336600461325c565b611f33565b348015610e7457600080fd5b50610518605f81565b348015610e8957600080fd5b5061046f610e9836600461325c565b611f63565b348015610ea957600080fd5b50610608601f5481565b348015610ebf57600080fd5b5061046f610ece36600461325c565b61208c565b610edc336120cd565b610f015760405162461bcd60e51b8152600401610ef8906135dd565b60405180910390fd5b610f0a81611a26565b15610f1457600080fd5b610f1f600b826120b8565b5050565b610f2c336120cd565b610f485760405162461bcd60e51b8152600401610ef8906135dd565b601680549115156701000000000000000267ff0000000000000019909216919091179055565b6000610f7b338484612132565b5060015b92915050565b610f8e336120cd565b610faa5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600982612225565b610fbe336120cd565b610fda5760405162461bcd60e51b8152600401610ef8906135dd565b610fe381611a26565b610fec57600080fd5b610f1f600b82612225565b611000336120cd565b61101c5760405162461bcd60e51b8152600401610ef8906135dd565b602054610100900460ff161561103157600080fd5b6020805462ffff00191662010100179055565b61104d336120cd565b6110695760405162461bcd60e51b8152600401610ef8906135dd565b600e805460ff1916911515919091179055565b611085336120cd565b6110a15760405162461bcd60e51b8152600401610ef8906135dd565b601e80549115156101000261ff0019909216919091179055565b6110c4336120cd565b6110e05760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b0382166000908152600460205260409020805460ff191682151517905561110f6005836120b8565b505050565b61111d336120cd565b6111395760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6111706009600a613711565b61117f9064e8d4a510006137bc565b81565b600061118f84848461223a565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156111fa5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610ef8565b61120e853361120986856137db565b612132565b506001949350505050565b611222336120cd565b61123e5760405162461bcd60e51b8152600401610ef8906135dd565b601255565b61124c336120cd565b6112685760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f7b91859061120990869061366f565b6112c9336120cd565b6112e55760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b611312336120cd565b61132e5760405162461bcd60e51b8152600401610ef8906135dd565b60005b825181101561110f57816004600085848151811061135157611351613839565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061138d816137f2565b915050611331565b61139e336120cd565b6113ba5760405162461bcd60e51b8152600401610ef8906135dd565b6113d06113cb82633b9aca006137bc565b6125a7565b50565b601f546113e0904261366f565b33600090815260036020526040902055565b6113fb336120cd565b6114175760405162461bcd60e51b8152600401610ef8906135dd565b602080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b61144c336120cd565b6114685760405162461bcd60e51b8152600401610ef8906135dd565b6000846114758789613687565b61147f9190613687565b90508060ff166064146114e35760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610ef8565b605f60ff8516118015906114fb5750605f60ff841611155b801561150b5750605f60ff831611155b6115575760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610ef8565b506016805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b6115e2336120cd565b6115fe5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6005826120b8565b6000806116186009600a613711565b60125461162591906136ac565b6116316009600a613711565b60135461163e91906136ac565b915091509091565b336116596000546001600160a01b031690565b6001600160a01b0316146116af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ef8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611702336120cd565b61171e5760405162461bcd60e51b8152600401610ef8906135dd565b601a805460ff191660ff92909216919091179055565b61173d336120cd565b6117595760405162461bcd60e51b8152600401610ef8906135dd565b602054610100900460ff168015611778575060205462010000900460ff165b61178157600080fd5b6020805462ff000019169055565b611798336120cd565b6117b45760405162461bcd60e51b8152600401610ef8906135dd565b601b8054600091829055604051909190735aba7a046988b907aa014416cffc0d83573853599083908381818185875af1925050503d8060008114611814576040519150601f19603f3d011682016040523d82523d6000602084013e611819565b606091505b5050905080610f1f5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ef8565b6001600160a01b0381166000908152600360205260408120544281116118855750600092915050565b61188f42826137db565b9392505050565b905090565b6118a4336120cd565b6118c05760405162461bcd60e51b8152600401610ef8906135dd565b6020805460ff1916911515919091179055565b6060601580548060200260200160405190810160405280929190818152602001828054801561192b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161190d575b5050505050905090565b6015818154811061194557600080fd5b6000918252602090912001546001600160a01b0316905081565b611968336120cd565b6119845760405162461bcd60e51b8152600401610ef8906135dd565b60005b825181101561110f5781600460008584815181106119a7576119a7613839565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550611a138382815181106119fb576119fb613839565b602002602001015160056120b890919063ffffffff16565b5080611a1e816137f2565b915050611987565b6000610f7f600b836126fc565b611a3c336120cd565b611a585760405162461bcd60e51b8152600401610ef8906135dd565b611a646009600a613711565b611a6e90836137bc565b9150611a7c6009600a613711565b611a8690826137bc565b60129290925550601355565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611af55760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610ef8565b611b04338561120986856137db565b5060019392505050565b611b17336120cd565b611b335760405162461bcd60e51b8152600401610ef8906135dd565b6010805460ff1916911515919091179055565b6000610f7b33848461223a565b611b5c336120cd565b611b785760405162461bcd60e51b8152600401610ef8906135dd565b601355565b611b86336120cd565b611ba25760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6007826120b8565b611bb6336120cd565b611bd25760405162461bcd60e51b8152600401610ef8906135dd565b604051600090339047908381818185875af1925050503d8060008114611c14576040519150601f19603f3d011682016040523d82523d6000602084013e611c19565b606091505b50509050806113d057600080fd5b6000611c356009600a613711565b601154611c446009600a613711565b611c539064e8d4a510006137bc565b611c5d91906137db565b61189691906136ac565b611c70336120cd565b611c8c5760405162461bcd60e51b8152600401610ef8906135dd565b6001811115611cdd5760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610ef8565b601f55565b6000610f7f6007836126fc565b611cf8336120cd565b611d145760405162461bcd60e51b8152600401610ef8906135dd565b60005b8151811015610f1f57611d4d828281518110611d3557611d35613839565b602002602001015160076120b890919063ffffffff16565b5080611d58816137f2565b915050611d17565b611d69336120cd565b611d855760405162461bcd60e51b8152600401610ef8906135dd565b601455565b611d93336120cd565b611daf5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600582612225565b611dc3336120cd565b611ddf5760405162461bcd60e51b8152600401610ef8906135dd565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611e2357600080fd5b505afa158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b9190613439565b905060008111611ead5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610ef8565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611ef557600080fd5b505af1158015611f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2d9190613403565b50505050565b611f3c336120cd565b611f585760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600782612225565b33611f766000546001600160a01b031690565b6001600160a01b031614611fcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ef8565b6001600160a01b0381166120315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ef8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612095336120cd565b6120b15760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6009825b600061188f836001600160a01b03841661271e565b600080546001600160a01b038381169116148061210657506001600160a01b038216735aba7a046988b907aa014416cffc0d8357385359145b80610f7f57506001600160a01b0382167338079acc056348ec3e0716dea3927ad738e230761492915050565b6001600160a01b03831661217c5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610ef8565b6001600160a01b0382166121c45760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610ef8565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061188f836001600160a01b03841661276d565b6001600160a01b0383166122855760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610ef8565b6001600160a01b0382166122ce5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610ef8565b60006122db6005856126fc565b806122ec57506122ec6005846126fc565b905060006001600160a01b03851630148061230f57506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160401b909204161480156123515750816001600160a01b0316866001600160a01b0316145b8061238c57506016546001600160a01b03878116600160401b9092041614801561238c5750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806123c65750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806124005750836001600160a01b0316886001600160a01b0316145b9050848061240b5750825b806124135750855b156124285761242389898961285a565b61259c565b602054610100900460ff16612571576000546001600160a01b038a811691161480159061246357506000546001600160a01b03898116911614155b15612571576001600160a01b03891660009081526004602052604090205460ff161580156124aa57506001600160a01b03881660009081526004602052604090205460ff16155b15612571576016546301000000900460ff161561251a57876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060405161250791815260200190565b60405180910390a3505050505050505050565b602054610100900460ff166125715760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610ef8565b60205462010000900460ff161561258f576124238989898585612925565b61259c8989898585612a2e565b505050505050505050565b601e805460ff1916600190811790915530600090815260209190915260408120546016549091906125ec90600160301b810460ff90811691600160281b900416613687565b60ff1690506000600f5490508381111561260e5760105460ff161561260e5750825b8083108061261e575061ffff8216155b1561262b575050506126ef565b60165460009061ffff84169061264b90600160281b900460ff16846137bc565b61265591906136ac565b9050600061266382846137db565b905060006126726002846136ac565b9050600061268082856137db565b9050600061268e848361366f565b90504761269a82612e81565b60006126a682476137db565b90506000836126b586846137bc565b6126bf91906136ac565b90506126cb8682612fe9565b60006126d784476137db565b90506126e2816130b9565b5050505050505050505050505b50601e805460ff19169055565b6001600160a01b0381166000908152600183016020526040812054151561188f565b600081815260018301602052604081205461276557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f7f565b506000610f7f565b600081815260018301602052604081205480156128505760006127916001836137db565b85549091506000906127a5906001906137db565b905060008660000182815481106127be576127be613839565b90600052602060002001549050808760000184815481106127e1576127e1613839565b60009182526020808320909101929092558281526001890190915260409020849055865487908061281457612814613823565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f7f565b6000915050610f7f565b6001600160a01b038316600090815260016020526040902054818110156128be5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ef8565b6128c884836130f6565b6128d2838361313b565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291791815260200190565b60405180910390a350505050565b80612a1a576129356007856126fc565b6129815760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610ef8565b604161298f6009600a613711565b61299e9064e8d4a510006137bc565b6129a891906136ac565b6001600160a01b0385166000908152600160205260409020546129cc90859061366f565b1115612a1a5760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610ef8565b612a278585858585612a2e565b5050505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612a9c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ef8565b6002601354612aab91906136ac565b600f5560008315612c3757600e5460ff1615612ae7576001600160a01b0388166000908152600d602052604090205460ff1615612ae757600080fd5b612af26009896126fc565b612b8c576001600160a01b03881660009081526003602052604090205442101580612b245750601e54610100900460ff165b612b655760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610ef8565b601f54612b72904261366f565b6001600160a01b0389166000908152600360205260409020555b601354861115612be257601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b038a161790555b601354861115612c265760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610ef8565b50601654610100900460ff16612d6a565b8415612cac576012541580612c575750601254612c54878561366f565b11155b612c735760405162461bcd60e51b8152600401610ef890613609565b6014541580612c8457506014548611155b612ca05760405162461bcd60e51b8152600401610ef890613609565b5060165460ff16612d6a565b6012541580612cc65750601254612cc3878561366f565b11155b612ce25760405162461bcd60e51b8152600401610ef890613609565b612ced6009896126fc565b612d5c576001600160a01b03881660009081526003602052604090205442101580612d1f5750601e54610100900460ff165b612d5c5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610ef8565b5060165462010000900460ff165b6016546001600160a01b03898116600160401b9092041614801590612d92575060205460ff16155b8015612da15750601e5460ff16155b15612daf57612daf866125a7565b601654600090612ddf9088908490612dda9060ff600160281b8204811691600160301b900416613687565b61315f565b90506000612ded82896137db565b9050612df98a896130f6565b3060009081526001602052604081208054849290612e1890849061366f565b90915550612e289050898261313b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6d91815260200190565b60405180910390a350505050505050505050565b601754612e999030906001600160a01b031683612132565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ece57612ece613839565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f2257600080fd5b505afa158015612f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5a9190613279565b81600181518110612f6d57612f6d613839565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612fb3908590600090869030904290600401613633565b600060405180830381600087803b158015612fcd57600080fd5b505af1158015612fe1573d6000803e3d6000fd5b505050505050565b80601d6000828254612ffb919061366f565b90915550506017546130189030906001600160a01b031684612132565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a279190613474565b601a546000906064906130cf9060ff16846137bc565b6130d991906136ac565b905080601b60008282546130ed919061366f565b90915550505050565b6001600160a01b03821660009081526001602052604081205461311a9083906137db565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461311a90839061366f565b60006127108260ff168460ff168661317791906137bc565b61318191906137bc565b61318b91906136ac565b949350505050565b803561319e81613865565b919050565b600082601f8301126131b457600080fd5b8135602067ffffffffffffffff808311156131d1576131d161384f565b8260051b604051601f19603f830116810181811084821117156131f6576131f661384f565b6040528481528381019250868401828801850189101561321557600080fd5b600092505b8583101561323f5761322b81613193565b84529284019260019290920191840161321a565b50979650505050505050565b803560ff8116811461319e57600080fd5b60006020828403121561326e57600080fd5b813561188f81613865565b60006020828403121561328b57600080fd5b815161188f81613865565b600080604083850312156132a957600080fd5b82356132b481613865565b915060208301356132c481613865565b809150509250929050565b6000806000606084860312156132e457600080fd5b83356132ef81613865565b925060208401356132ff81613865565b929592945050506040919091013590565b6000806040838503121561332357600080fd5b823561332e81613865565b915060208301356132c48161387a565b6000806040838503121561335157600080fd5b823561335c81613865565b946020939093013593505050565b60006020828403121561337c57600080fd5b813567ffffffffffffffff81111561339357600080fd5b61318b848285016131a3565b600080604083850312156133b257600080fd5b823567ffffffffffffffff8111156133c957600080fd5b6133d5858286016131a3565b92505060208301356132c48161387a565b6000602082840312156133f857600080fd5b813561188f8161387a565b60006020828403121561341557600080fd5b815161188f8161387a565b60006020828403121561343257600080fd5b5035919050565b60006020828403121561344b57600080fd5b5051919050565b6000806040838503121561346557600080fd5b50508035926020909101359150565b60008060006060848603121561348957600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156134b457600080fd5b61188f8261324b565b60008060008060008060c087890312156134d657600080fd5b6134df8761324b565b95506134ed6020880161324b565b94506134fb6040880161324b565b93506135096060880161324b565b92506135176080880161324b565b915061352560a0880161324b565b90509295509295509295565b600081518084526020808501945080840160005b8381101561356a5781516001600160a01b031687529582019590820190600101613545565b509495945050505050565b60208152600061188f6020830184613531565b600060208083528351808285015260005b818110156135b557858101830151858201604001528201613599565b818111156135c7576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061365260a0830186613531565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156136825761368261380d565b500190565b600060ff821660ff84168060ff038211156136a4576136a461380d565b019392505050565b6000826136c957634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156137095781600019048211156136ef576136ef61380d565b808516156136fc57918102915b93841c93908002906136d3565b509250929050565b600061188f60ff84168360008261372a57506001610f7f565b8161373757506000610f7f565b816001811461374d576002811461375757613773565b6001915050610f7f565b60ff8411156137685761376861380d565b50506001821b610f7f565b5060208310610133831016604e8410600b8410161715613796575081810a610f7f565b6137a083836136ce565b80600019048211156137b4576137b461380d565b029392505050565b60008160001904831182151516156137d6576137d661380d565b500290565b6000828210156137ed576137ed61380d565b500390565b60006000198214156138065761380661380d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113d057600080fd5b80151581146113d057600080fdfea2646970667358221220d4c7994f289337f977d8b9263b292746bbee2fd44a1b7fcc15796d87570b74e764736f6c63430008070033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106104685760003560e01c80636f89e409116102485780639fa62d5f11610138578063d8e8de34116100bb578063e3aa94b011610082578063e3aa94b014610e28578063e77bf5f814610e48578063eb8e886314610e68578063f2fde38b14610e7d578063f88b0e4614610e9d578063f9963ca114610eb357005b8063d8e8de3414610d62578063da1144d614610d82578063dd31ee2d14610da2578063dd62ed3e14610dc2578063dff6bcbf14610e0857005b8063a9bf2c09116100ff578063a9bf2c0914610cd8578063b76289b814610cf8578063b85111db14610d18578063c3f4f54f14610d2d578063d51f383b14610d4257005b80639fa62d5f14610c28578063a20623ce14610c48578063a457c2d714610c78578063a6fc178a14610c98578063a9059cbb14610cb857005b80638728ecd1116101cb5780638da5cb5b116101925780638da5cb5b14610b24578063914e208a14610b7857806393ab98f214610b9a57806395d89b4114610bba5780639728c01914610be8578063988c5ec914610c0857005b80638728ecd114610ae5578063887c60fb14610b05578063893d20e814610b245780638d060d7714610b425780638d2c503914610b5857005b8063762bb2821161020f578063762bb28214610a765780637b9e987a14610a8c5780637f91937314610aa157806386d0ada814610ab65780638724cc7214610ad057005b80636f89e409146109c157806370a08231146109eb578063715018a614610a2157806371ab1f0914610a3657806373ddf08e14610a5657005b80632ce0a6ee1161036357806348e53164116102e657806357ad67d1116102ad57806357ad67d1146108fd578063588aeaf21461091d578063589210d91461093d57806358e553651461095357806363b263b314610969578063677a88701461099957005b806348e531641461087d57806348e907b7146108925780634ada218b146108a85780634cdaf0ae146108c75780634f91e48c146108e757005b8063395093511161032a57806339509351146107e75780633d8dbf5d146108075780633e9be909146108275780634089b170146108475780634607e6921461085d57005b80632ce0a6ee14610769578063311a869714610789578063313ce5671461079e5780633328b721146107b25780633478154b146107d257005b80631285073c116103eb5780631eb25d13116103b25780631eb25d131461068b5780631f8b845e1461059a578063230ffc42146106a057806323b872dd146106e05780632973ef2d1461070057005b80631285073c146105f757806314e91377146106165780631732ed7c1461063657806318160ddd1461065657806319e880841461066b57005b80630b1daa3e1161042f5780630b1daa3e1461055a5780630fa6c5ff1461057a5780630fd99e161461059a5780631193c691146105c25780631201cbd0146105d757005b8063029a1ecd1461047157806302a89e021461049157806306fdde03146104b157806309218ee7146104fe578063095ea7b31461052a57005b3661046f57005b005b34801561047d57600080fd5b5061046f61048c36600461325c565b610ed3565b34801561049d57600080fd5b5061046f6104ac3660046133e6565b610f23565b3480156104bd57600080fd5b506040805180820190915260128152715175656e74696e20546172616e7420496e7560701b60208201525b6040516104f59190613588565b60405180910390f35b34801561050a57600080fd5b50601a546105189060ff1681565b60405160ff90911681526020016104f5565b34801561053657600080fd5b5061054a61054536600461333e565b610f6e565b60405190151581526020016104f5565b34801561056657600080fd5b5061046f61057536600461325c565b610f85565b34801561058657600080fd5b5061046f61059536600461325c565b610fb5565b3480156105a657600080fd5b506105af606481565b60405161ffff90911681526020016104f5565b3480156105ce57600080fd5b5061046f610ff7565b3480156105e357600080fd5b5061046f6105f23660046133e6565b611044565b34801561060357600080fd5b50601f545b6040519081526020016104f5565b34801561062257600080fd5b5061046f6106313660046133e6565b61107c565b34801561064257600080fd5b5061046f610651366004613310565b6110bb565b34801561066257600080fd5b50601154610608565b34801561067757600080fd5b5061046f610686366004613310565b611114565b34801561069757600080fd5b50610608611164565b3480156106ac57600080fd5b506106c87338079acc056348ec3e0716dea3927ad738e2307681565b6040516001600160a01b0390911681526020016104f5565b3480156106ec57600080fd5b5061054a6106fb3660046132cf565b611182565b34801561070c57600080fd5b506016546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104f5565b34801561077557600080fd5b5061046f610784366004613420565b611219565b34801561079557600080fd5b50610518604181565b3480156107aa57600080fd5b506009610518565b3480156107be57600080fd5b5061046f6107cd36600461325c565b611243565b3480156107de57600080fd5b506105af600181565b3480156107f357600080fd5b5061054a61080236600461333e565b611289565b34801561081357600080fd5b5061046f61082236600461325c565b6112c0565b34801561083357600080fd5b5061046f61084236600461339f565b611309565b34801561085357600080fd5b5061060860195481565b34801561086957600080fd5b5061046f610878366004613420565b611395565b34801561088957600080fd5b5061046f6113d3565b34801561089e57600080fd5b5061060860185481565b3480156108b457600080fd5b5060205461054a90610100900460ff1681565b3480156108d357600080fd5b5061046f6108e236600461325c565b6113f2565b3480156108f357600080fd5b5061060860135481565b34801561090957600080fd5b5061046f6109183660046134bd565b611443565b34801561092957600080fd5b5061046f61093836600461325c565b6115d9565b34801561094957600080fd5b5061060860145481565b34801561095f57600080fd5b50610608601b5481565b34801561097557600080fd5b5061054a61098436600461325c565b60046020526000908152604090205460ff1681565b3480156109a557600080fd5b506106c8735aba7a046988b907aa014416cffc0d835738535981565b3480156109cd57600080fd5b506109d6611609565b604080519283526020830191909152016104f5565b3480156109f757600080fd5b50610608610a0636600461325c565b6001600160a01b031660009081526001602052604090205490565b348015610a2d57600080fd5b5061046f611646565b348015610a4257600080fd5b5060205461054a9062010000900460ff1681565b348015610a6257600080fd5b5061046f610a713660046134a2565b6116f9565b348015610a8257600080fd5b5061060860125481565b348015610a9857600080fd5b5061046f611734565b348015610aad57600080fd5b5061046f61178f565b348015610ac257600080fd5b5060205461054a9060ff1681565b348015610adc57600080fd5b506105af604181565b348015610af157600080fd5b50610608610b0036600461325c565b61185c565b348015610b1157600080fd5b50601e5461054a90610100900460ff1681565b348015610b3057600080fd5b506000546001600160a01b03166106c8565b348015610b4e57600080fd5b50610608601d5481565b348015610b6457600080fd5b5061046f610b733660046133e6565b61189b565b348015610b8457600080fd5b50610b8d6118d3565b6040516104f59190613575565b348015610ba657600080fd5b506106c8610bb5366004613420565b611935565b348015610bc657600080fd5b506040805180820190915260058152645154494e5560d81b60208201526104e8565b348015610bf457600080fd5b5061046f610c0336600461339f565b61195f565b348015610c1457600080fd5b5061054a610c2336600461325c565b611a26565b348015610c3457600080fd5b5061046f610c43366004613452565b611a33565b348015610c5457600080fd5b5061054a610c6336600461325c565b600d6020526000908152604090205460ff1681565b348015610c8457600080fd5b5061054a610c9336600461333e565b611a92565b348015610ca457600080fd5b5061046f610cb33660046133e6565b611b0e565b348015610cc457600080fd5b5061054a610cd336600461333e565b611b46565b348015610ce457600080fd5b5061046f610cf3366004613420565b611b53565b348015610d0457600080fd5b5061046f610d1336600461325c565b611b7d565b348015610d2457600080fd5b5061046f611bad565b348015610d3957600080fd5b50610608611c27565b348015610d4e57600080fd5b5061046f610d5d366004613420565b611c67565b348015610d6e57600080fd5b5061054a610d7d36600461325c565b611ce2565b348015610d8e57600080fd5b5061046f610d9d36600461336a565b611cef565b348015610dae57600080fd5b5061046f610dbd366004613420565b611d60565b348015610dce57600080fd5b50610608610ddd366004613296565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610e1457600080fd5b5061046f610e2336600461325c565b611d8a565b348015610e3457600080fd5b5061046f610e4336600461325c565b611dba565b348015610e5457600080fd5b5061046f610e6336600461325c565b611f33565b348015610e7457600080fd5b50610518605f81565b348015610e8957600080fd5b5061046f610e9836600461325c565b611f63565b348015610ea957600080fd5b50610608601f5481565b348015610ebf57600080fd5b5061046f610ece36600461325c565b61208c565b610edc336120cd565b610f015760405162461bcd60e51b8152600401610ef8906135dd565b60405180910390fd5b610f0a81611a26565b15610f1457600080fd5b610f1f600b826120b8565b5050565b610f2c336120cd565b610f485760405162461bcd60e51b8152600401610ef8906135dd565b601680549115156701000000000000000267ff0000000000000019909216919091179055565b6000610f7b338484612132565b5060015b92915050565b610f8e336120cd565b610faa5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600982612225565b610fbe336120cd565b610fda5760405162461bcd60e51b8152600401610ef8906135dd565b610fe381611a26565b610fec57600080fd5b610f1f600b82612225565b611000336120cd565b61101c5760405162461bcd60e51b8152600401610ef8906135dd565b602054610100900460ff161561103157600080fd5b6020805462ffff00191662010100179055565b61104d336120cd565b6110695760405162461bcd60e51b8152600401610ef8906135dd565b600e805460ff1916911515919091179055565b611085336120cd565b6110a15760405162461bcd60e51b8152600401610ef8906135dd565b601e80549115156101000261ff0019909216919091179055565b6110c4336120cd565b6110e05760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b0382166000908152600460205260409020805460ff191682151517905561110f6005836120b8565b505050565b61111d336120cd565b6111395760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6111706009600a613711565b61117f9064e8d4a510006137bc565b81565b600061118f84848461223a565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156111fa5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610ef8565b61120e853361120986856137db565b612132565b506001949350505050565b611222336120cd565b61123e5760405162461bcd60e51b8152600401610ef8906135dd565b601255565b61124c336120cd565b6112685760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610f7b91859061120990869061366f565b6112c9336120cd565b6112e55760405162461bcd60e51b8152600401610ef8906135dd565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b611312336120cd565b61132e5760405162461bcd60e51b8152600401610ef8906135dd565b60005b825181101561110f57816004600085848151811061135157611351613839565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061138d816137f2565b915050611331565b61139e336120cd565b6113ba5760405162461bcd60e51b8152600401610ef8906135dd565b6113d06113cb82633b9aca006137bc565b6125a7565b50565b601f546113e0904261366f565b33600090815260036020526040902055565b6113fb336120cd565b6114175760405162461bcd60e51b8152600401610ef8906135dd565b602080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b61144c336120cd565b6114685760405162461bcd60e51b8152600401610ef8906135dd565b6000846114758789613687565b61147f9190613687565b90508060ff166064146114e35760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610ef8565b605f60ff8516118015906114fb5750605f60ff841611155b801561150b5750605f60ff831611155b6115575760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610ef8565b506016805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b6115e2336120cd565b6115fe5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6005826120b8565b6000806116186009600a613711565b60125461162591906136ac565b6116316009600a613711565b60135461163e91906136ac565b915091509091565b336116596000546001600160a01b031690565b6001600160a01b0316146116af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ef8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611702336120cd565b61171e5760405162461bcd60e51b8152600401610ef8906135dd565b601a805460ff191660ff92909216919091179055565b61173d336120cd565b6117595760405162461bcd60e51b8152600401610ef8906135dd565b602054610100900460ff168015611778575060205462010000900460ff165b61178157600080fd5b6020805462ff000019169055565b611798336120cd565b6117b45760405162461bcd60e51b8152600401610ef8906135dd565b601b8054600091829055604051909190735aba7a046988b907aa014416cffc0d83573853599083908381818185875af1925050503d8060008114611814576040519150601f19603f3d011682016040523d82523d6000602084013e611819565b606091505b5050905080610f1f5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ef8565b6001600160a01b0381166000908152600360205260408120544281116118855750600092915050565b61188f42826137db565b9392505050565b905090565b6118a4336120cd565b6118c05760405162461bcd60e51b8152600401610ef8906135dd565b6020805460ff1916911515919091179055565b6060601580548060200260200160405190810160405280929190818152602001828054801561192b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161190d575b5050505050905090565b6015818154811061194557600080fd5b6000918252602090912001546001600160a01b0316905081565b611968336120cd565b6119845760405162461bcd60e51b8152600401610ef8906135dd565b60005b825181101561110f5781600460008584815181106119a7576119a7613839565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550611a138382815181106119fb576119fb613839565b602002602001015160056120b890919063ffffffff16565b5080611a1e816137f2565b915050611987565b6000610f7f600b836126fc565b611a3c336120cd565b611a585760405162461bcd60e51b8152600401610ef8906135dd565b611a646009600a613711565b611a6e90836137bc565b9150611a7c6009600a613711565b611a8690826137bc565b60129290925550601355565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611af55760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610ef8565b611b04338561120986856137db565b5060019392505050565b611b17336120cd565b611b335760405162461bcd60e51b8152600401610ef8906135dd565b6010805460ff1916911515919091179055565b6000610f7b33848461223a565b611b5c336120cd565b611b785760405162461bcd60e51b8152600401610ef8906135dd565b601355565b611b86336120cd565b611ba25760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6007826120b8565b611bb6336120cd565b611bd25760405162461bcd60e51b8152600401610ef8906135dd565b604051600090339047908381818185875af1925050503d8060008114611c14576040519150601f19603f3d011682016040523d82523d6000602084013e611c19565b606091505b50509050806113d057600080fd5b6000611c356009600a613711565b601154611c446009600a613711565b611c539064e8d4a510006137bc565b611c5d91906137db565b61189691906136ac565b611c70336120cd565b611c8c5760405162461bcd60e51b8152600401610ef8906135dd565b6001811115611cdd5760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610ef8565b601f55565b6000610f7f6007836126fc565b611cf8336120cd565b611d145760405162461bcd60e51b8152600401610ef8906135dd565b60005b8151811015610f1f57611d4d828281518110611d3557611d35613839565b602002602001015160076120b890919063ffffffff16565b5080611d58816137f2565b915050611d17565b611d69336120cd565b611d855760405162461bcd60e51b8152600401610ef8906135dd565b601455565b611d93336120cd565b611daf5760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600582612225565b611dc3336120cd565b611ddf5760405162461bcd60e51b8152600401610ef8906135dd565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611e2357600080fd5b505afa158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b9190613439565b905060008111611ead5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610ef8565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611ef557600080fd5b505af1158015611f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2d9190613403565b50505050565b611f3c336120cd565b611f585760405162461bcd60e51b8152600401610ef8906135dd565b610f1f600782612225565b33611f766000546001600160a01b031690565b6001600160a01b031614611fcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ef8565b6001600160a01b0381166120315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ef8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612095336120cd565b6120b15760405162461bcd60e51b8152600401610ef8906135dd565b610f1f6009825b600061188f836001600160a01b03841661271e565b600080546001600160a01b038381169116148061210657506001600160a01b038216735aba7a046988b907aa014416cffc0d8357385359145b80610f7f57506001600160a01b0382167338079acc056348ec3e0716dea3927ad738e230761492915050565b6001600160a01b03831661217c5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610ef8565b6001600160a01b0382166121c45760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610ef8565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061188f836001600160a01b03841661276d565b6001600160a01b0383166122855760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610ef8565b6001600160a01b0382166122ce5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610ef8565b60006122db6005856126fc565b806122ec57506122ec6005846126fc565b905060006001600160a01b03851630148061230f57506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160401b909204161480156123515750816001600160a01b0316866001600160a01b0316145b8061238c57506016546001600160a01b03878116600160401b9092041614801561238c5750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806123c65750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160401b9092041614806124005750836001600160a01b0316886001600160a01b0316145b9050848061240b5750825b806124135750855b156124285761242389898961285a565b61259c565b602054610100900460ff16612571576000546001600160a01b038a811691161480159061246357506000546001600160a01b03898116911614155b15612571576001600160a01b03891660009081526004602052604090205460ff161580156124aa57506001600160a01b03881660009081526004602052604090205460ff16155b15612571576016546301000000900460ff161561251a57876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060405161250791815260200190565b60405180910390a3505050505050505050565b602054610100900460ff166125715760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610ef8565b60205462010000900460ff161561258f576124238989898585612925565b61259c8989898585612a2e565b505050505050505050565b601e805460ff1916600190811790915530600090815260209190915260408120546016549091906125ec90600160301b810460ff90811691600160281b900416613687565b60ff1690506000600f5490508381111561260e5760105460ff161561260e5750825b8083108061261e575061ffff8216155b1561262b575050506126ef565b60165460009061ffff84169061264b90600160281b900460ff16846137bc565b61265591906136ac565b9050600061266382846137db565b905060006126726002846136ac565b9050600061268082856137db565b9050600061268e848361366f565b90504761269a82612e81565b60006126a682476137db565b90506000836126b586846137bc565b6126bf91906136ac565b90506126cb8682612fe9565b60006126d784476137db565b90506126e2816130b9565b5050505050505050505050505b50601e805460ff19169055565b6001600160a01b0381166000908152600183016020526040812054151561188f565b600081815260018301602052604081205461276557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f7f565b506000610f7f565b600081815260018301602052604081205480156128505760006127916001836137db565b85549091506000906127a5906001906137db565b905060008660000182815481106127be576127be613839565b90600052602060002001549050808760000184815481106127e1576127e1613839565b60009182526020808320909101929092558281526001890190915260409020849055865487908061281457612814613823565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f7f565b6000915050610f7f565b6001600160a01b038316600090815260016020526040902054818110156128be5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ef8565b6128c884836130f6565b6128d2838361313b565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291791815260200190565b60405180910390a350505050565b80612a1a576129356007856126fc565b6129815760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610ef8565b604161298f6009600a613711565b61299e9064e8d4a510006137bc565b6129a891906136ac565b6001600160a01b0385166000908152600160205260409020546129cc90859061366f565b1115612a1a5760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610ef8565b612a278585858585612a2e565b5050505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612a9c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ef8565b6002601354612aab91906136ac565b600f5560008315612c3757600e5460ff1615612ae7576001600160a01b0388166000908152600d602052604090205460ff1615612ae757600080fd5b612af26009896126fc565b612b8c576001600160a01b03881660009081526003602052604090205442101580612b245750601e54610100900460ff165b612b655760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610ef8565b601f54612b72904261366f565b6001600160a01b0389166000908152600360205260409020555b601354861115612be257601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b038a161790555b601354861115612c265760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610ef8565b50601654610100900460ff16612d6a565b8415612cac576012541580612c575750601254612c54878561366f565b11155b612c735760405162461bcd60e51b8152600401610ef890613609565b6014541580612c8457506014548611155b612ca05760405162461bcd60e51b8152600401610ef890613609565b5060165460ff16612d6a565b6012541580612cc65750601254612cc3878561366f565b11155b612ce25760405162461bcd60e51b8152600401610ef890613609565b612ced6009896126fc565b612d5c576001600160a01b03881660009081526003602052604090205442101580612d1f5750601e54610100900460ff165b612d5c5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610ef8565b5060165462010000900460ff165b6016546001600160a01b03898116600160401b9092041614801590612d92575060205460ff16155b8015612da15750601e5460ff16155b15612daf57612daf866125a7565b601654600090612ddf9088908490612dda9060ff600160281b8204811691600160301b900416613687565b61315f565b90506000612ded82896137db565b9050612df98a896130f6565b3060009081526001602052604081208054849290612e1890849061366f565b90915550612e289050898261313b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6d91815260200190565b60405180910390a350505050505050505050565b601754612e999030906001600160a01b031683612132565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ece57612ece613839565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f2257600080fd5b505afa158015612f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5a9190613279565b81600181518110612f6d57612f6d613839565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612fb3908590600090869030904290600401613633565b600060405180830381600087803b158015612fcd57600080fd5b505af1158015612fe1573d6000803e3d6000fd5b505050505050565b80601d6000828254612ffb919061366f565b90915550506017546130189030906001600160a01b031684612132565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a279190613474565b601a546000906064906130cf9060ff16846137bc565b6130d991906136ac565b905080601b60008282546130ed919061366f565b90915550505050565b6001600160a01b03821660009081526001602052604081205461311a9083906137db565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461311a90839061366f565b60006127108260ff168460ff168661317791906137bc565b61318191906137bc565b61318b91906136ac565b949350505050565b803561319e81613865565b919050565b600082601f8301126131b457600080fd5b8135602067ffffffffffffffff808311156131d1576131d161384f565b8260051b604051601f19603f830116810181811084821117156131f6576131f661384f565b6040528481528381019250868401828801850189101561321557600080fd5b600092505b8583101561323f5761322b81613193565b84529284019260019290920191840161321a565b50979650505050505050565b803560ff8116811461319e57600080fd5b60006020828403121561326e57600080fd5b813561188f81613865565b60006020828403121561328b57600080fd5b815161188f81613865565b600080604083850312156132a957600080fd5b82356132b481613865565b915060208301356132c481613865565b809150509250929050565b6000806000606084860312156132e457600080fd5b83356132ef81613865565b925060208401356132ff81613865565b929592945050506040919091013590565b6000806040838503121561332357600080fd5b823561332e81613865565b915060208301356132c48161387a565b6000806040838503121561335157600080fd5b823561335c81613865565b946020939093013593505050565b60006020828403121561337c57600080fd5b813567ffffffffffffffff81111561339357600080fd5b61318b848285016131a3565b600080604083850312156133b257600080fd5b823567ffffffffffffffff8111156133c957600080fd5b6133d5858286016131a3565b92505060208301356132c48161387a565b6000602082840312156133f857600080fd5b813561188f8161387a565b60006020828403121561341557600080fd5b815161188f8161387a565b60006020828403121561343257600080fd5b5035919050565b60006020828403121561344b57600080fd5b5051919050565b6000806040838503121561346557600080fd5b50508035926020909101359150565b60008060006060848603121561348957600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156134b457600080fd5b61188f8261324b565b60008060008060008060c087890312156134d657600080fd5b6134df8761324b565b95506134ed6020880161324b565b94506134fb6040880161324b565b93506135096060880161324b565b92506135176080880161324b565b915061352560a0880161324b565b90509295509295509295565b600081518084526020808501945080840160005b8381101561356a5781516001600160a01b031687529582019590820190600101613545565b509495945050505050565b60208152600061188f6020830184613531565b600060208083528351808285015260005b818110156135b557858101830151858201604001528201613599565b818111156135c7576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061365260a0830186613531565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156136825761368261380d565b500190565b600060ff821660ff84168060ff038211156136a4576136a461380d565b019392505050565b6000826136c957634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156137095781600019048211156136ef576136ef61380d565b808516156136fc57918102915b93841c93908002906136d3565b509250929050565b600061188f60ff84168360008261372a57506001610f7f565b8161373757506000610f7f565b816001811461374d576002811461375757613773565b6001915050610f7f565b60ff8411156137685761376861380d565b50506001821b610f7f565b5060208310610133831016604e8410600b8410161715613796575081810a610f7f565b6137a083836136ce565b80600019048211156137b4576137b461380d565b029392505050565b60008160001904831182151516156137d6576137d661380d565b500290565b6000828210156137ed576137ed61380d565b500390565b60006000198214156138065761380661380d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113d057600080fd5b80151581146113d057600080fdfea2646970667358221220d4c7994f289337f977d8b9263b292746bbee2fd44a1b7fcc15796d87570b74e764736f6c63430008070033

Deployed Bytecode Sourcemap

27621:32468:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50659:157;;;;;;;;;;-1:-1:-1;50659:157:0;;;;;:::i;:::-;;:::i;56039:110::-;;;;;;;;;;-1:-1:-1;56039:110:0;;;;;:::i;:::-;;:::i;57416:94::-;;;;;;;;;;-1:-1:-1;57497:5:0;;;;;;;;;;;;-1:-1:-1;;;57497:5:0;;;;57416:94;;;;;;;:::i;:::-;;;;;;;;43027:31;;;;;;;;;;-1:-1:-1;43027:31:0;;;;;;;;;;;19048:4:1;19036:17;;;19018:36;;19006:2;18991:18;43027:31:0;18876:184:1;58301:161:0;;;;;;;;;;-1:-1:-1;58301:161:0;;;;;:::i;:::-;;:::i;:::-;;;8509:14:1;;8502:22;8484:41;;8472:2;8457:18;58301:161:0;8344:187:1;53424:127:0;;;;;;;;;;-1:-1:-1;53424:127:0;;;;;:::i;:::-;;:::i;50868:155::-;;;;;;;;;;-1:-1:-1;50868:155:0;;;;;:::i;:::-;;:::i;29094:43::-;;;;;;;;;;;;29134:3;29094:43;;;;;17295:6:1;17283:19;;;17265:38;;17253:2;17238:18;29094:43:0;17121:188:1;54492:209:0;;;;;;;;;;;;;:::i;55910:121::-;;;;;;;;;;-1:-1:-1;55910:121:0;;;;;:::i;:::-;;:::i;48853:102::-;;;;;;;;;;-1:-1:-1;48935:12:0;;48853:102;;;8690:25:1;;;8678:2;8663:18;48853:102:0;8536:185:1;51521:103:0;;;;;;;;;;-1:-1:-1;51521:103:0;;;;;:::i;:::-;;:::i;49885:147::-;;;;;;;;;;-1:-1:-1;49885:147:0;;;;;:::i;:::-;;:::i;57726:108::-;;;;;;;;;;-1:-1:-1;57808:18:0;;57726:108;;49757:120;;;;;;;;;;-1:-1:-1;49757:120:0;;;;;:::i;:::-;;:::i;28464:70::-;;;;;;;;;;;;;:::i;29381:83::-;;;;;;;;;;;;29422:42;29381:83;;;;;-1:-1:-1;;;;;7143:32:1;;;7125:51;;7113:2;7098:18;29381:83:0;6979:203:1;58775:392:0;;;;;;;;;;-1:-1:-1;58775:392:0;;;;;:::i;:::-;;:::i;48111:246::-;;;;;;;;;;-1:-1:-1;48282:8:0;;48111:246;;;48282:8;;;;;;18623:25:1;;-1:-1:-1;;;48291:13:0;;;;18679:2:1;18664:18;;18657:34;-1:-1:-1;;;48305:13:0;;;;18707:18:1;;;18700:34;;;;48319:7:0;;;18765:2:1;18750:18;;18743:34;48282:8:0;48327;;;;18808:3:1;18793:19;;18786:35;48336:12:0;;;;;18852:3:1;18837:19;;18830:35;18610:3;18595:19;48111:246:0;18336:535:1;59868:112:0;;;;;;;;;;-1:-1:-1;59868:112:0;;;;;:::i;:::-;;:::i;28846:44::-;;;;;;;;;;;;28888:2;28846:44;;57624:94;;;;;;;;;;-1:-1:-1;28456:1:0;57624:94;;56282:115;;;;;;;;;;-1:-1:-1;56282:115:0;;;;;:::i;:::-;;:::i;29220:49::-;;;;;;;;;;;;29260:9;29220:49;;59202:205;;;;;;;;;;-1:-1:-1;59202:205:0;;;;;:::i;:::-;;:::i;56157:117::-;;;;;;;;;;-1:-1:-1;56157:117:0;;;;;:::i;:::-;;:::i;50042:210::-;;;;;;;;;;-1:-1:-1;50042:210:0;;;;;:::i;:::-;;:::i;42947:27::-;;;;;;;;;;;;;;;;52831:120;;;;;;;;;;-1:-1:-1;52831:120:0;;;;;:::i;:::-;;:::i;49095:107::-;;;;;;;;;;;;;:::i;42839:38::-;;;;;;;;;;;;;;;;54309:26;;;;;;;;;;-1:-1:-1;54309:26:0;;;;;;;;;;;54949:145;;;;;;;;;;-1:-1:-1;54949:145:0;;;;;:::i;:::-;;:::i;30042:46::-;;;;;;;;;;;;;;;;51990:591;;;;;;;;;;-1:-1:-1;51990:591:0;;;;;:::i;:::-;;:::i;53008:110::-;;;;;;;;;;-1:-1:-1;53008:110:0;;;;;:::i;:::-;;:::i;30095:45::-;;;;;;;;;;;;;;;;43110:31;;;;;;;;;;;;;;;;27942:40;;;;;;;;;;-1:-1:-1;27942:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29297:77;;;;;;;;;;;;29332:42;29297:77;;47954:149;;;;;;;;;;;;;:::i;:::-;;;;18257:25:1;;;18313:2;18298:18;;18291:34;;;;18230:18;47954:149:0;18083:248:1;57842:121:0;;;;;;;;;;-1:-1:-1;57842:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;57937:18:0;57910:7;57937:18;;;:9;:18;;;;;;;57842:121;9191:140;;;;;;;;;;;;;:::i;54342:28::-;;;;;;;;;;-1:-1:-1;54342:28:0;;;;;;;;;;;52656:107;;;;;;;;;;-1:-1:-1;52656:107:0;;;;;:::i;:::-;;:::i;29986:49::-;;;;;;;;;;;;;;;;54743:138;;;;;;;;;;;;;:::i;51031:233::-;;;;;;;;;;;;;:::i;49611:28::-;;;;;;;;;;-1:-1:-1;49611:28:0;;;;;;;;28971:54;;;;;;;;;;;;29023:2;28971:54;;48572:275;;;;;;;;;;-1:-1:-1;48572:275:0;;;;;:::i;:::-;;:::i;49542:28::-;;;;;;;;;;-1:-1:-1;49542:28:0;;;;;;;;;;;57314:94;;;;;;;;;;-1:-1:-1;57366:7:0;8615:6;-1:-1:-1;;;;;8615:6:0;57314:94;;44272:25;;;;;;;;;;;;;;;;51350:109;;;;;;;;;;-1:-1:-1;51350:109:0;;;;;:::i;:::-;;:::i;49650:97::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30147:28::-;;;;;;;;;;-1:-1:-1;30147:28:0;;;;;:::i;:::-;;:::i;57518:98::-;;;;;;;;;;-1:-1:-1;57601:7:0;;;;;;;;;;;;-1:-1:-1;;;57601:7:0;;;;57518:98;;50260:244;;;;;;;;;;-1:-1:-1;50260:244:0;;;;;:::i;:::-;;:::i;43460:130::-;;;;;;;;;;-1:-1:-1;43460:130:0;;;;;:::i;:::-;;:::i;53656:313::-;;;;;;;;;;-1:-1:-1;53656:313:0;;;;;:::i;:::-;;:::i;28214:43::-;;;;;;;;;;-1:-1:-1;28214:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59415:342;;;;;;;;;;-1:-1:-1;59415:342:0;;;;;:::i;:::-;;:::i;50512:100::-;;;;;;;;;;-1:-1:-1;50512:100:0;;;;;:::i;:::-;;:::i;57971:167::-;;;;;;;;;;-1:-1:-1;57971:167:0;;;;;:::i;:::-;;:::i;59986:100::-;;;;;;;;;;-1:-1:-1;59986:100:0;;;;;:::i;:::-;;:::i;55131:113::-;;;;;;;;;;-1:-1:-1;55131:113:0;;;;;:::i;:::-;;:::i;56737:151::-;;;;;;;;;;;;;:::i;47817:129::-;;;;;;;;;;;;;:::i;51695:201::-;;;;;;;;;;-1:-1:-1;51695:201:0;;;;;:::i;:::-;;:::i;48365:140::-;;;;;;;;;;-1:-1:-1;48365:140:0;;;;;:::i;:::-;;:::i;55250:203::-;;;;;;;;;;-1:-1:-1;55250:203:0;;;;;:::i;:::-;;:::i;59765:97::-;;;;;;;;;;-1:-1:-1;59765:97:0;;;;;:::i;:::-;;:::i;58146:147::-;;;;;;;;;;-1:-1:-1;58146:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;58257:19:0;;;58230:7;58257:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;58146:147;53124:111;;;;;;;;;;-1:-1:-1;53124:111:0;;;;;:::i;:::-;;:::i;55596:285::-;;;;;;;;;;-1:-1:-1;55596:285:0;;;;;:::i;:::-;;:::i;55459:127::-;;;;;;;;;;-1:-1:-1;55459:127:0;;;;;:::i;:::-;;:::i;30268:31::-;;;;;;;;;;;;30297:2;30268:31;;9486:236;;;;;;;;;;-1:-1:-1;9486:236:0;;;;;:::i;:::-;;:::i;49577:27::-;;;;;;;;;;;;;;;;53292:126;;;;;;;;;;-1:-1:-1;53292:126:0;;;;;:::i;:::-;;:::i;50659:157::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;;;;;;;;;50739:26:::1;50760:4;50739:20;:26::i;:::-;50738:27;50730:36;;;::::0;::::1;;50777:29;:19;50801:4:::0;50777:23:::1;:29::i;:::-;;50659:157:::0;:::o;56039:110::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;56115:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;56115:26:0;;::::1;::::0;;;::::1;::::0;;56039:110::o;58301:161::-;58378:4;58395:37;58404:10;58416:7;58425:6;58395:8;:37::i;:::-;-1:-1:-1;58450:4:0;58301:161;;;;;:::o;53424:127::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;53506:37:::1;:21;53535:7:::0;53506:28:::1;:37::i;50868:155::-:0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;50945:26:::1;50966:4;50945:20;:26::i;:::-;50937:35;;;::::0;::::1;;50983:32;:19;51010:4:::0;50983:26:::1;:32::i;54492:209::-:0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;54566:14:::1;::::0;::::1;::::0;::::1;;;54565:15;54557:24;;;::::0;::::1;;54642:14;:19:::0;;-1:-1:-1;;54672:21:0;;;;;54492:209::o;55910:121::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55991:11:::1;:32:::0;;-1:-1:-1;;55991:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55910:121::o;51521:103::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;51591:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;51591:25:0;;::::1;::::0;;;::::1;::::0;;51521:103::o;49885:147::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49973:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;49973:21:0::1;::::0;::::1;;;::::0;;50005:19:::1;:9;49973:13:::0;50005::::1;:19::i;:::-;;49885:147:::0;;:::o;49757:120::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49848:13:0;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;49848:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49757:120::o;28464:70::-;28521:13;28456:1;28521:2;:13;:::i;:::-;28503:31;;:15;:31;:::i;:::-;28464:70;:::o;58775:392::-;58875:4;58892:36;58902:6;58910:9;58921:6;58892:9;:36::i;:::-;-1:-1:-1;;;;;58968:19:0;;58941:24;58968:19;;;:11;:19;;;;;;;;58988:10;58968:31;;;;;;;;59018:26;;;;59010:59;;;;-1:-1:-1;;;59010:59:0;;11328:2:1;59010:59:0;;;11310:21:1;11367:2;11347:18;;;11340:30;-1:-1:-1;;;11386:18:1;;;11379:50;11446:18;;59010:59:0;11126:344:1;59010:59:0;59082:55;59091:6;59099:10;59111:25;59130:6;59111:16;:25;:::i;:::-;59082:8;:55::i;:::-;-1:-1:-1;59155:4:0;;58775:392;-1:-1:-1;;;;58775:392:0:o;59868:112::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;59944:12:::1;:28:::0;59868:112::o;56282:115::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56361:20:0::1;56384:5;56361:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;56361:28:0::1;::::0;;56282:115::o;59202:205::-;59310:10;59284:4;59331:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;59331:32:0;;;;;;;;;;59284:4;;59301:76;;59322:7;;59331:45;;59366:10;;59331:45;:::i;56157:117::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56236:23:0::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;56236:30:0::1;56262:4;56236:30;::::0;;56157:117::o;50042:210::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;50145:9:::1;50165:80;50176:4;:11;50174:1;:13;50165:80;;;50228:5;50209:7;:16;50217:4;50222:1;50217:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50209:16:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50209:16:0;:24;;-1:-1:-1;;50209:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50189:3;::::1;::::0;::::1;:::i;:::-;;;;50165:80;;52831:120:::0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;52911:32:::1;52930:12;:4:::0;52937:5:::1;52930:12;:::i;:::-;52911:18;:32::i;:::-;52831:120:::0;:::o;49095:107::-;49182:12;;49166:28;;:15;:28;:::i;:::-;49154:10;49144:21;;;;:9;:21;;;;;:50;49095:107::o;54949:145::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55042:22:::1;:44:::0;;-1:-1:-1;;;;;55042:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55042:44:0;;::::1;::::0;;;::::1;::::0;;54949:145::o;51990:591::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;52146:14:::1;52186::::0;52161:24:::1;52171:14:::0;52161:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;52146:54;;52219:8;:13;;52229:3;52219:13;52211:64;;;::::0;-1:-1:-1;;;52211:64:0;;12733:2:1;52211:64:0::1;::::0;::::1;12715:21:1::0;12772:2;12752:18;;;12745:30;12811:34;12791:18;;;12784:62;-1:-1:-1;;;12862:18:1;;;12855:36;12908:19;;52211:64:0::1;12531:402:1::0;52211:64:0::1;30297:2;52294:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;30297:2:0::1;52310:15;::::0;::::1;;;52294:31;:52;;;;-1:-1:-1::0;30297:2:0::1;52327:19;::::0;::::1;;;52294:52;52286:89;;;::::0;-1:-1:-1;;;52286:89:0;;14897:2:1;52286:89:0::1;::::0;::::1;14879:21:1::0;14936:2;14916:18;;;14909:30;14975:27;14955:18;;;14948:55;15020:18;;52286:89:0::1;14695:349:1::0;52286:89:0::1;-1:-1:-1::0;52388:8:0::1;:18:::0;;::::1;52549:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;52522:16:0;;::::1;52388:18;52522:16;-1:-1:-1::0;;52456:28:0;;::::1;-1:-1:-1::0;;;52456:28:0::1;52522:16:::0;;;;-1:-1:-1;;52417:28:0;;::::1;-1:-1:-1::0;;;52417:28:0::1;-1:-1:-1::0;;52388:18:0;;::::1;::::0;::::1;52417:28:::0;;;;-1:-1:-1;;52417:28:0;;;;;;;;;;::::1;52522:16:::0;;;;;;;;52497:14;::::1;52522:16:::0;;;;;;;::::1;52549:24;::::0;;;::::1;::::0;;51990:591::o;53008:110::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;53088:22:::1;:9;53102:7:::0;53088:13:::1;:22::i;47954:149::-:0;47995:15;;48056:13;28456:1;48056:2;:13;:::i;:::-;48043:12;;:26;;;;:::i;:::-;48081:13;28456:1;48081:2;:13;:::i;:::-;48071:9;;:23;;;;:::i;:::-;48036:59;;;;47954:149;;:::o;9191:140::-;8773:10;8762:7;8588;8615:6;-1:-1:-1;;;;;8615:6:0;;8550:79;8762:7;-1:-1:-1;;;;;8762:21:0;;8754:66;;;;-1:-1:-1;;;8754:66:0;;13484:2:1;8754:66:0;;;13466:21:1;;;13503:18;;;13496:30;13562:34;13542:18;;;13535:62;13614:18;;8754:66:0;13282:356:1;8754:66:0;9290:1:::1;9274:6:::0;;9253:40:::1;::::0;-1:-1:-1;;;;;9274:6:0;;::::1;::::0;9253:40:::1;::::0;9290:1;;9253:40:::1;9321:1;9304:19:::0;;-1:-1:-1;;;;;;9304:19:0::1;::::0;;9191:140::o;52656:107::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;52732:14:::1;:23:::0;;-1:-1:-1;;52732:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;52656:107::o;54743:138::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;54807:14:::1;::::0;::::1;::::0;::::1;;;:32:::0;::::1;;;-1:-1:-1::0;54823:16:0::1;::::0;;;::::1;;;54807:32;54799:41;;;::::0;::::1;;54851:16;:22:::0;;-1:-1:-1;;54851:22:0::1;::::0;;54743:138::o;51031:233::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;51108:16:::1;::::0;;51093:14:::1;51135:18:::0;;;;51178:36:::1;::::0;51108:16;;51093:14;29332:42:::1;::::0;51108:16;;51093:14;51178:36;51093:14;51178:36;51108:16;29332:42;51178:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51164:50;;;51233:4;51225:31;;;::::0;-1:-1:-1;;;51225:31:0;;15939:2:1;51225:31:0::1;::::0;::::1;15921:21:1::0;15978:2;15958:18;;;15951:30;-1:-1:-1;;;15997:18:1;;;15990:45;16052:18;;51225:31:0::1;15737:339:1::0;48572:275:0;-1:-1:-1;;;;;48693:25:0;;48658:7;48693:25;;;:9;:25;;;;;;48741:15;48731:25;;48728:71;;-1:-1:-1;48787:1:0;;48572:275;-1:-1:-1;;48572:275:0:o;48728:71::-;48815:24;48824:15;48815:8;:24;:::i;:::-;48808:31;48572:275;-1:-1:-1;;;48572:275:0:o;57393:7::-;57386:14;;57314:94;:::o;51350:109::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;51428:16:::1;:23:::0;;-1:-1:-1;;51428:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51350:109::o;49650:97::-;49692:16;49728:11;49721:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49721:18:0;;;;;;;;;;;;;;;;;;;;;;;49650:97;:::o;30147:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30147:28:0;;-1:-1:-1;30147:28:0;:::o;50260:244::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;50360:9:::1;50380:117;50391:4;:11;50389:1;:13;50380:117;;;50443:5;50424:7;:16;50432:4;50437:1;50432:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;50424:16:0::1;-1:-1:-1::0;;;;;50424:16:0::1;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;50463:22;50477:4;50482:1;50477:7;;;;;;;;:::i;:::-;;;;;;;50463:9;:13;;:22;;;;:::i;:::-;-1:-1:-1::0;50404:3:0;::::1;::::0;::::1;:::i;:::-;;;;50380:117;;43460:130:::0;43525:4;43548:34;:19;43577:4;43548:28;:34::i;53656:313::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;53822:13:::1;28456:1;53822:2;:13;:::i;:::-;53806:29;::::0;:15;:29:::1;:::i;:::-;53790:45:::0;-1:-1:-1;53872:13:0::1;28456:1;53872:2;:13;:::i;:::-;53859:26;::::0;:12;:26:::1;:::i;:::-;53896:12;:30:::0;;;;-1:-1:-1;53937:9:0::1;:24:::0;53656:313::o;59415:342::-;59558:10;59502:4;59546:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;59546:32:0;;;;;;;;;;59597:35;;;;59589:60;;;;-1:-1:-1;;;59589:60:0;;16635:2:1;59589:60:0;;;16617:21:1;16674:2;16654:18;;;16647:30;-1:-1:-1;;;16693:18:1;;;16686:42;16745:18;;59589:60:0;16433:336:1;59589:60:0;59662:65;59671:10;59683:7;59692:34;59711:15;59692:16;:34;:::i;59662:65::-;-1:-1:-1;59745:4:0;;59415:342;-1:-1:-1;;;59415:342:0:o;50512:100::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;50581:12:::1;:23:::0;;-1:-1:-1;;50581:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50512:100::o;57971:167::-;58051:4;58068:40;58078:10;58090:9;58101:6;58068:9;:40::i;59986:100::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;60056:9:::1;:22:::0;59986:100::o;55131:113::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55208:28:::1;:10;55223:12:::0;55208:14:::1;:28::i;56737:151::-:0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;56805:51:::1;::::0;56792:9:::1;::::0;56805:10:::1;::::0;56829:21:::1;::::0;56792:9;56805:51;56792:9;56805:51;56829:21;56805:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56791:65;;;56875:4;56867:13;;;::::0;::::1;47817:129:::0;47864:7;47925:13;28456:1;47925:2;:13;:::i;:::-;47905:18;;28521:13;28456:1;28521:2;:13;:::i;:::-;28503:31;;:15;:31;:::i;:::-;47891:32;;;;:::i;:::-;47890:48;;;;:::i;51695:201::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;29260:9:::1;51786:32:::0;::::1;;51778:67;;;::::0;-1:-1:-1;;;51778:67:0;;16283:2:1;51778:67:0::1;::::0;::::1;16265:21:1::0;16322:2;16302:18;;;16295:30;16361:25;16341:18;;;16334:53;16404:18;;51778:67:0::1;16081:347:1::0;51778:67:0::1;51860:12;:28:::0;51695:201::o;48365:140::-;48439:4;48462:35;:10;48482:14;48462:19;:35::i;55250:203::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55347:6:::1;55343:103;55359:14;:21;55357:1;:23;55343:103;;;55401:33;55416:14;55431:1;55416:17;;;;;;;;:::i;:::-;;;;;;;55401:10;:14;;:33;;;;:::i;:::-;-1:-1:-1::0;55382:3:0;::::1;::::0;::::1;:::i;:::-;;;;55343:103;;59765:97:::0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;59834:8:::1;:20:::0;59765:97::o;53124:111::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;53202:25:::1;:9;53219:7:::0;53202:16:::1;:25::i;55596:285::-:0;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55734:30:::1;::::0;-1:-1:-1;;;55734:30:0;;55758:4:::1;55734:30;::::0;::::1;7125:51:1::0;55691:10:0;;55669:12:::1;::::0;-1:-1:-1;;;;;55734:15:0;::::1;::::0;::::1;::::0;7098:18:1;;55734:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55713:51;;55794:1;55783:10;:12;55775:49;;;::::0;-1:-1:-1;;;55775:49:0;;14544:2:1;55775:49:0::1;::::0;::::1;14526:21:1::0;14583:2;14563:18;;;14556:30;14622:26;14602:18;;;14595:54;14666:18;;55775:49:0::1;14342:348:1::0;55775:49:0::1;55835:38;::::0;-1:-1:-1;;;55835:38:0;;55850:10:::1;55835:38;::::0;::::1;7361:51:1::0;7428:18;;;7421:34;;;-1:-1:-1;;;;;55835:14:0;::::1;::::0;::::1;::::0;7334:18:1;;55835:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55658:223;;55596:285:::0;:::o;55459:127::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;55544:34:::1;:10;55562:15:::0;55544:17:::1;:34::i;9486:236::-:0;8773:10;8762:7;8588;8615:6;-1:-1:-1;;;;;8615:6:0;;8550:79;8762:7;-1:-1:-1;;;;;8762:21:0;;8754:66;;;;-1:-1:-1;;;8754:66:0;;13484:2:1;8754:66:0;;;13466:21:1;;;13503:18;;;13496:30;13562:34;13542:18;;;13535:62;13614:18;;8754:66:0;13282:356:1;8754:66:0;-1:-1:-1;;;;;9567:22:0;::::1;9559:73;;;::::0;-1:-1:-1;;;9559:73:0;;10230:2:1;9559:73:0::1;::::0;::::1;10212:21:1::0;10269:2;10249:18;;;10242:30;10308:34;10288:18;;;10281:62;-1:-1:-1;;;10359:18:1;;;10352:36;10405:19;;9559:73:0::1;10028:402:1::0;9559:73:0::1;9669:6;::::0;;9648:38:::1;::::0;-1:-1:-1;;;;;9648:38:0;;::::1;::::0;9669:6;::::1;::::0;9648:38:::1;::::0;::::1;9697:6;:17:::0;;-1:-1:-1;;;;;;9697:17:0::1;-1:-1:-1::0;;;;;9697:17:0;;;::::1;::::0;;;::::1;::::0;;9486:236::o;53292:126::-;30833:19;30841:10;30833:7;:19::i;:::-;30825:50;;;;-1:-1:-1;;;30825:50:0;;;;;;;:::i;:::-;53376:34:::1;:21;53402:7:::0;24237:152;24307:4;24331:50;24336:3;-1:-1:-1;;;;;24356:23:0;;24331:4;:50::i;31113:139::-;31166:4;8615:6;;-1:-1:-1;;;;;31189:13:0;;;8615:6;;31189:13;;:31;;-1:-1:-1;;;;;;31204:16:0;;29332:42;31204:16;31189:31;:55;;;-1:-1:-1;;;;;;31222:22:0;;29422:42;31222:22;31182:62;31113:139;-1:-1:-1;;31113:139:0:o;58468:299::-;-1:-1:-1;;;;;58561:19:0;;58553:49;;;;-1:-1:-1;;;58553:49:0;;10637:2:1;58553:49:0;;;10619:21:1;10676:2;10656:18;;;10649:30;-1:-1:-1;;;10695:18:1;;;10688:47;10752:18;;58553:49:0;10435:341:1;58553:49:0;-1:-1:-1;;;;;58621:21:0;;58613:49;;;;-1:-1:-1;;;58613:49:0;;13140:2:1;58613:49:0;;;13122:21:1;13179:2;13159:18;;;13152:30;-1:-1:-1;;;13198:18:1;;;13191:45;13253:18;;58613:49:0;12938:339:1;58613:49:0;-1:-1:-1;;;;;58675:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;58727:32;;8690:25:1;;;58727:32:0;;8663:18:1;58727:32:0;;;;;;;58468:299;;;:::o;24565:158::-;24638:4;24662:53;24670:3;-1:-1:-1;;;;;24690:23:0;;24662:7;:53::i;34386:2127::-;-1:-1:-1;;;;;34482:20:0;;34474:51;;;;-1:-1:-1;;;34474:51:0;;9530:2:1;34474:51:0;;;9512:21:1;9569:2;9549:18;;;9542:30;-1:-1:-1;;;9588:18:1;;;9581:48;9646:18;;34474:51:0;9328:342:1;34474:51:0;-1:-1:-1;;;;;34544:23:0;;34536:52;;;;-1:-1:-1;;;34536:52:0;;10983:2:1;34536:52:0;;;10965:21:1;11022:2;11002:18;;;10995:30;-1:-1:-1;;;11041:18:1;;;11034:46;11097:18;;34536:52:0;10781:340:1;34536:52:0;34675:15;34694:26;:9;34713:6;34694:18;:26::i;:::-;:59;;;-1:-1:-1;34724:29:0;:9;34743;34724:18;:29::i;:::-;34675:79;-1:-1:-1;34845:23:0;-1:-1:-1;;;;;34870:21:0;;34886:4;34870:21;;:49;;-1:-1:-1;;;;;;34895:24:0;;34914:4;34895:24;34870:49;35044:14;;35109:19;;34845:75;;-1:-1:-1;;;;;;35044:14:0;;;;35014:21;;35099:29;;;-1:-1:-1;;;35109:19:0;;;;35099:29;:59;;;;;35145:13;-1:-1:-1;;;;;35132:26:0;:9;-1:-1:-1;;;;;35132:26:0;;35099:59;35098:135;;;-1:-1:-1;35186:19:0;;-1:-1:-1;;;;;35173:32:0;;;-1:-1:-1;;;35186:19:0;;;;35173:32;:59;;;;;35219:13;-1:-1:-1;;;;;35209:23:0;:6;-1:-1:-1;;;;;35209:23:0;;35173:59;35355:19;;35070:164;;-1:-1:-1;35336:10:0;;-1:-1:-1;;;;;35347:27:0;;;-1:-1:-1;;;35355:19:0;;;;35347:27;;:53;;;35387:13;-1:-1:-1;;;;;35377:23:0;:6;-1:-1:-1;;;;;35377:23:0;;35347:53;35434:19;;35336:64;;-1:-1:-1;35411:11:0;;-1:-1:-1;;;;;35423:30:0;;;-1:-1:-1;;;35434:19:0;;;;35423:30;;:59;;;35469:13;-1:-1:-1;;;;;35456:26:0;:9;-1:-1:-1;;;;;35456:26:0;;35423:59;35411:71;;35523:18;:41;;;;35545:19;35523:41;:55;;;;35568:10;35523:55;35520:986;;;35594:43;35611:6;35619:9;35630:6;35594:16;:43::i;:::-;35520:986;;;35752:14;;;;;;;35747:518;;8588:7;8615:6;-1:-1:-1;;;;;35791:17:0;;;8615:6;;35791:17;;;;:41;;-1:-1:-1;8588:7:0;8615:6;-1:-1:-1;;;;;35812:20:0;;;8615:6;;35812:20;;35791:41;35787:463;;;-1:-1:-1;;;;;35862:15:0;;;;;;:7;:15;;;;;;;;35861:16;:39;;;;-1:-1:-1;;;;;;35882:18:0;;;;;;:7;:18;;;;;;;;35881:19;35861:39;35857:374;;;35933:7;;;;;;;35929:279;;;35993:9;-1:-1:-1;;;;;35977:28:0;35986:6;-1:-1:-1;;;;;35977:28:0;;36003:1;35977:28;;;;8690:25:1;;8678:2;8663:18;;8536:185;35977:28:0;;;;;;;;36035:7;;;;;;34386:2127;;;:::o;35929:279::-;36139:14;;;;;;;36131:49;;;;-1:-1:-1;;;36131:49:0;;13845:2:1;36131:49:0;;;13827:21:1;13884:2;13864:18;;;13857:30;13923:25;13903:18;;;13896:53;13966:18;;36131:49:0;13643:347:1;36131:49:0;36282:16;;;;;;;36279:216;;;36318:56;36337:6;36344:9;36354:6;36361:5;36367:6;36318:18;:56::i;36279:216::-;36427:52;36442:6;36449:9;36459:6;36466:5;36472:6;36427:14;:52::i;:::-;34463:2050;;;;;;34386:2127;;;:::o;44677:1771::-;44425:27;:34;;-1:-1:-1;;44425:34:0;44455:4;44425:34;;;;;;44795:4:::1;44425:27:::0;44777:24;;;::::1;::::0;;;;;;;;44842:13:::1;::::0;44777:24;;44425:27;44828::::1;::::0;-1:-1:-1;;;44842:13:0;::::1;44425:34:::0;44842:13;;::::1;::::0;-1:-1:-1;;;44828:13:0;::::1;;:27;:::i;:::-;44812:43;;;;44866:19;44886:9;;44866:29;;44923:8;44909:11;:22;44906:127;;;44951:12;::::0;::::1;;44948:74;;;-1:-1:-1::0;44998:8:0;44948:74:::1;45159:11;45143:15;:27;:40;;;-1:-1:-1::0;45172:11:0::1;::::0;::::1;::::0;45143:40:::1;45140:77;;;45199:7;;;;;45140:77;45337:13;::::0;45298:25:::1;::::0;45324:36:::1;::::0;::::1;::::0;45325:25:::1;::::0;-1:-1:-1;;;45337:13:0;::::1;;;45325:11:::0;:25:::1;:::i;:::-;45324:36;;;;:::i;:::-;45298:62:::0;-1:-1:-1;45371:25:0::1;45398:29;45298:62:::0;45398:11;:29:::1;:::i;:::-;45371:56:::0;-1:-1:-1;45488:16:0::1;45505:19;45523:1;45505:17:::0;:19:::1;:::i;:::-;45488:36:::0;-1:-1:-1;45535:19:0::1;45555:26;45488:36:::0;45555:17;:26:::1;:::i;:::-;45535:46:::0;-1:-1:-1;45664:17:0::1;45682:29;45694:17:::0;45535:46;45682:29:::1;:::i;:::-;45664:47:::0;-1:-1:-1;45826:21:0::1;45858:27;45664:47:::0;45858:16:::1;:27::i;:::-;45896:14;45912:41;45936:17:::0;45912:21:::1;:41;:::i;:::-;45896:58:::0;-1:-1:-1;46054:14:0::1;46092:9:::0;46072:18:::1;46079:11:::0;45896:58;46072:18:::1;:::i;:::-;46071:30;;;;:::i;:::-;46054:47;;46112:31;46126:8;46136:6;46112:13;:31::i;:::-;46266:20;46288:41;46312:17:::0;46288:21:::1;:41;:::i;:::-;46266:64;;46408:32;46427:12;46408:18;:32::i;:::-;44742:1706;;;;;;;;;;;;44470:1;-1:-1:-1::0;44482:27:0;:35;;-1:-1:-1;;44482:35:0;;;44677:1771::o;24809:167::-;-1:-1:-1;;;;;24943:23:0;;24889:4;21618:19;;;:12;;;:19;;;;;;:24;;24913:55;21521:129;19292:414;19355:4;21618:19;;;:12;;;:19;;;;;;19372:327;;-1:-1:-1;19415:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19598:18;;19576:19;;;:12;;;:19;;;;;;:40;;;;19631:11;;19372:327;-1:-1:-1;19682:5:0;19675:12;;19882:1553;19948:4;20087:19;;;:12;;;:19;;;;;;20123:15;;20119:1309;;20485:21;20509:14;20522:1;20509:10;:14;:::i;:::-;20558:18;;20485:38;;-1:-1:-1;20538:17:0;;20558:22;;20579:1;;20558:22;:::i;:::-;20538:42;;20825:17;20845:3;:11;;20857:9;20845:22;;;;;;;;:::i;:::-;;;;;;;;;20825:42;;20991:9;20962:3;:11;;20974:13;20962:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21068:23;;;:12;;;:23;;;;;;:36;;;21229:17;;21068:3;;21229:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21324:3;:12;;:19;21337:5;21324:19;;;;;;;;;;;21317:26;;;21367:4;21360:11;;;;;;;;20119:1309;21411:5;21404:12;;;;;40779:432;-1:-1:-1;;;;;40898:17:0;;40874:21;40898:17;;;:9;:17;;;;;;40934:23;;;;40926:60;;;;-1:-1:-1;;;40926:60:0;;9877:2:1;40926:60:0;;;9859:21:1;9916:2;9896:18;;;9889:30;-1:-1:-1;;;9935:18:1;;;9928:54;9999:18;;40926:60:0;9675:348:1;40926:60:0;41042:27;41055:6;41062;41042:12;:27::i;:::-;41122:28;41132:9;41143:6;41122:9;:28::i;:::-;41184:9;-1:-1:-1;;;;;41168:33:0;41177:6;-1:-1:-1;;;;;41168:33:0;;41194:6;41168:33;;;;8690:25:1;;8678:2;8663:18;;8536:185;41168:33:0;;;;;;;;40863:348;40779:432;;;:::o;36587:822::-;36781:6;36777:560;;36970:30;:10;36990:9;36970:19;:30::i;:::-;36962:68;;;;-1:-1:-1;;;36962:68:0;;12378:2:1;36962:68:0;;;12360:21:1;12417:2;12397:18;;;12390:30;12456:28;12436:18;;;12429:56;12502:18;;36962:68:0;12176:350:1;36962:68:0;29023:2;28521:13;28456:1;28521:2;:13;:::i;:::-;28503:31;;:15;:31;:::i;:::-;37250:42;;;;:::i;:::-;-1:-1:-1;;;;;37221:20:0;;;;;;:9;:20;;;;;;:27;;37242:6;;37221:27;:::i;:::-;:71;;37212:113;;;;-1:-1:-1;;;37212:113:0;;11677:2:1;37212:113:0;;;11659:21:1;11716:2;11696:18;;;11689:30;11755;11735:18;;;11728:58;11803:18;;37212:113:0;11475:352:1;37212:113:0;37347:52;37362:6;37369:9;37379:6;37386:5;37392:6;37347:14;:52::i;:::-;36587:822;;;;;:::o;37510:3209::-;-1:-1:-1;;;;;37653:20:0;;;37626:24;37653:20;;;:9;:20;;;;;;;37708:17;;;;;;;;37744:23;;;;37736:60;;;;-1:-1:-1;;;37736:60:0;;9877:2:1;37736:60:0;;;9859:21:1;9916:2;9896:18;;;9889:30;-1:-1:-1;;;9935:18:1;;;9928:54;9999:18;;37736:60:0;9675:348:1;37736:60:0;37833:1;37823:9;;:11;;;;:::i;:::-;37811:9;:23;37847:9;37867:1765;;;;37895:11;;;;37892:79;;;-1:-1:-1;;;;;37936:18:0;;;;;;:10;:18;;;;;;;;37935:19;37927:28;;;;;;37989:38;:21;38020:6;37989:30;:38::i;:::-;37985:405;;-1:-1:-1;;;;;38163:17:0;;;;;;:9;:17;;;;;;38182:15;-1:-1:-1;38163:34:0;;:52;;-1:-1:-1;38199:16:0;;;;;;;38163:52;38155:82;;;;-1:-1:-1;;;38155:82:0;;16976:2:1;38155:82:0;;;16958:21:1;17015:2;16995:18;;;16988:30;-1:-1:-1;;;17034:18:1;;;17027:48;17092:18;;38155:82:0;16774:342:1;38155:82:0;38362:12;;38346:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;38328:17:0;;;;;;:9;:17;;;;;:46;37985:405;38525:9;;38518:6;:16;38515:80;;;38555:11;:24;;;;;;;-1:-1:-1;38555:24:0;;;;;;;;-1:-1:-1;;;;;;38555:24:0;-1:-1:-1;;;;;38555:24:0;;;;;38515:80;38625:9;;38617:6;:17;;38609:44;;;;-1:-1:-1;;;38609:44:0;;12034:2:1;38609:44:0;;;12016:21:1;12073:2;12053:18;;;12046:30;-1:-1:-1;;;12092:18:1;;;12085:45;12147:18;;38609:44:0;11832:339:1;38609:44:0;-1:-1:-1;38672:8:0;;;;;;;37867:1765;;;38703:5;38700:932;;;38823:12;;:15;;:56;;-1:-1:-1;38867:12:0;;38842:23;38859:6;38842:16;:23;:::i;:::-;:37;;38823:56;38815:84;;;;-1:-1:-1;;;38815:84:0;;;;;;;:::i;:::-;38922:8;;:11;;:31;;;38945:8;;38937:6;:16;;38922:31;38914:60;;;;-1:-1:-1;;;38914:60:0;;;;;;;:::i;:::-;-1:-1:-1;38993:7:0;;;;38700:932;;;39144:12;;:15;;:56;;-1:-1:-1;39188:12:0;;39163:23;39180:6;39163:16;:23;:::i;:::-;:37;;39144:56;39136:84;;;;-1:-1:-1;;;39136:84:0;;;;;;;:::i;:::-;39452:38;:21;39483:6;39452:30;:38::i;:::-;39448:139;;-1:-1:-1;;;;;39517:17:0;;;;;;:9;:17;;;;;;39536:15;-1:-1:-1;39517:34:0;;:52;;-1:-1:-1;39553:16:0;;;;;;;39517:52;39509:78;;;;-1:-1:-1;;;39509:78:0;;15596:2:1;39509:78:0;;;15578:21:1;15635:2;15615:18;;;15608:30;-1:-1:-1;;;15654:18:1;;;15647:44;15708:18;;39509:78:0;15394:338:1;39509:78:0;-1:-1:-1;39606:12:0;;;;;;;38700:932;39961:19;;-1:-1:-1;;;;;39953:27:0;;;-1:-1:-1;;;39961:19:0;;;;39953:27;;;;39952:50;;-1:-1:-1;39985:16:0;;;;39984:17;39952:50;:82;;;;-1:-1:-1;40006:27:0;;;;40005:28;39952:82;39949:126;;;40049:26;40068:6;40049:18;:26::i;:::-;40246:13;;40183:21;;40205:55;;40219:6;;40227:3;;40232:27;;40246:13;-1:-1:-1;;;40246:13:0;;;;;-1:-1:-1;;;40232:13:0;;;:27;:::i;:::-;40205:13;:55::i;:::-;40183:77;-1:-1:-1;40324:19:0;40344:22;40183:77;40344:6;:22;:::i;:::-;40324:42;;40424:27;40437:6;40444;40424:12;:27::i;:::-;40538:4;40520:24;;;;:9;:24;;;;;:41;;40548:13;;40520:24;:41;;40548:13;;40520:41;:::i;:::-;;;;-1:-1:-1;40616:33:0;;-1:-1:-1;40626:9:0;40637:11;40616:9;:33::i;:::-;40683:9;-1:-1:-1;;;;;40667:38:0;40676:6;-1:-1:-1;;;;;40667:38:0;;40693:11;40667:38;;;;8690:25:1;;8678:2;8663:18;;8536:185;40667:38:0;;;;;;;;37615:3104;;;;;37510:3209;;;;;:::o;46498:455::-;46591:14;;46559:56;;46576:4;;-1:-1:-1;;;;;46591:14:0;46608:6;46559:8;:56::i;:::-;46650:16;;;46664:1;46650:16;;;;;;;;46626:21;;46650:16;;;;;;;;;;-1:-1:-1;46650:16:0;46626:40;;46695:4;46677;46682:1;46677:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46677:23:0;;;:7;;;;;;;;;;:23;;;;46721:14;;:21;;;-1:-1:-1;;;46721:21:0;;;;:14;;;;;:19;;:21;;;;;46677:7;;46721:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46711:4;46716:1;46711:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46711:31:0;;;:7;;;;;;;;;:31;46755:14;;:190;;-1:-1:-1;;;46755:190:0;;:14;;;:65;;:190;;46835:6;;46755:14;;46872:4;;46899;;46919:15;;46755:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46548:405;46498:455;:::o;47080:397::-;47174:9;47162:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;47226:14:0;;47194:61;;47211:4;;-1:-1:-1;;;;;47226:14:0;47243:11;47194:8;:61::i;:::-;47266:14;;:203;;-1:-1:-1;;;47266:203:0;;47337:4;47266:203;;;7807:34:1;;;7857:18;;;7850:34;;;47266:14:0;7900:18:1;;;7893:34;;;7943:18;;;7936:34;7986:19;;;7979:44;47443:15:0;8039:19:1;;;8032:35;-1:-1:-1;;;;;47266:14:0;;;;:30;;47304:9;;7741:19:1;;47266:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43659:213::-;43796:14;;43758:22;;43814:3;;43784:26;;43796:14;;43784:9;:26;:::i;:::-;43783:34;;;;:::i;:::-;43758:59;;43848:14;43830:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;43659:213:0:o;42490:202::-;-1:-1:-1;;;;;42625:15:0;;42607:17;42625:15;;;:9;:15;;;;;;:22;;42641:6;;42625:22;:::i;:::-;-1:-1:-1;;;;;42659:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;42490:202:0:o;42206:200::-;-1:-1:-1;;;;;42338:15:0;;42320:17;42338:15;;;:9;:15;;;;;;:22;;42354:6;;42338:22;:::i;41266:156::-;41356:7;41409:5;41395:10;41384:21;;41391:3;41384:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;41383:31;;;;:::i;:::-;41376:38;41266:156;-1:-1:-1;;;;41266:156:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:919::-;207:5;260:3;253:4;245:6;241:17;237:27;227:55;;278:1;275;268:12;227:55;314:6;301:20;340:4;363:18;400:2;396;393:10;390:36;;;406:18;;:::i;:::-;452:2;449:1;445:10;484:2;478:9;547:2;543:7;538:2;534;530:11;526:25;518:6;514:38;602:6;590:10;587:22;582:2;570:10;567:18;564:46;561:72;;;613:18;;:::i;:::-;649:2;642:22;699:18;;;733:15;;;;-1:-1:-1;768:15:1;;;802;;;798:24;;795:33;-1:-1:-1;792:53:1;;;841:1;838;831:12;792:53;863:1;854:10;;873:169;887:2;884:1;881:9;873:169;;;944:23;963:3;944:23;:::i;:::-;932:36;;988:12;;;;905:1;898:9;;;;;1020:12;;873:169;;;-1:-1:-1;1060:6:1;153:919;-1:-1:-1;;;;;;;153:919:1:o;1077:156::-;1143:20;;1203:4;1192:16;;1182:27;;1172:55;;1223:1;1220;1213:12;1238:247;1297:6;1350:2;1338:9;1329:7;1325:23;1321:32;1318:52;;;1366:1;1363;1356:12;1318:52;1405:9;1392:23;1424:31;1449:5;1424:31;:::i;1490:251::-;1560:6;1613:2;1601:9;1592:7;1588:23;1584:32;1581:52;;;1629:1;1626;1619:12;1581:52;1661:9;1655:16;1680:31;1705:5;1680:31;:::i;1746:388::-;1814:6;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1930:9;1917:23;1949:31;1974:5;1949:31;:::i;:::-;1999:5;-1:-1:-1;2056:2:1;2041:18;;2028:32;2069:33;2028:32;2069:33;:::i;:::-;2121:7;2111:17;;;1746:388;;;;;:::o;2139:456::-;2216:6;2224;2232;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2340:9;2327:23;2359:31;2384:5;2359:31;:::i;:::-;2409:5;-1:-1:-1;2466:2:1;2451:18;;2438:32;2479:33;2438:32;2479:33;:::i;:::-;2139:456;;2531:7;;-1:-1:-1;;;2585:2:1;2570:18;;;;2557:32;;2139:456::o;2600:382::-;2665:6;2673;2726:2;2714:9;2705:7;2701:23;2697:32;2694:52;;;2742:1;2739;2732:12;2694:52;2781:9;2768:23;2800:31;2825:5;2800:31;:::i;:::-;2850:5;-1:-1:-1;2907:2:1;2892:18;;2879:32;2920:30;2879:32;2920:30;:::i;2987:315::-;3055:6;3063;3116:2;3104:9;3095:7;3091:23;3087:32;3084:52;;;3132:1;3129;3122:12;3084:52;3171:9;3158:23;3190:31;3215:5;3190:31;:::i;:::-;3240:5;3292:2;3277:18;;;;3264:32;;-1:-1:-1;;;2987:315:1:o;3307:348::-;3391:6;3444:2;3432:9;3423:7;3419:23;3415:32;3412:52;;;3460:1;3457;3450:12;3412:52;3500:9;3487:23;3533:18;3525:6;3522:30;3519:50;;;3565:1;3562;3555:12;3519:50;3588:61;3641:7;3632:6;3621:9;3617:22;3588:61;:::i;3660:477::-;3750:6;3758;3811:2;3799:9;3790:7;3786:23;3782:32;3779:52;;;3827:1;3824;3817:12;3779:52;3867:9;3854:23;3900:18;3892:6;3889:30;3886:50;;;3932:1;3929;3922:12;3886:50;3955:61;4008:7;3999:6;3988:9;3984:22;3955:61;:::i;:::-;3945:71;;;4066:2;4055:9;4051:18;4038:32;4079:28;4101:5;4079:28;:::i;4142:241::-;4198:6;4251:2;4239:9;4230:7;4226:23;4222:32;4219:52;;;4267:1;4264;4257:12;4219:52;4306:9;4293:23;4325:28;4347:5;4325:28;:::i;4388:245::-;4455:6;4508:2;4496:9;4487:7;4483:23;4479:32;4476:52;;;4524:1;4521;4514:12;4476:52;4556:9;4550:16;4575:28;4597:5;4575:28;:::i;4638:180::-;4697:6;4750:2;4738:9;4729:7;4725:23;4721:32;4718:52;;;4766:1;4763;4756:12;4718:52;-1:-1:-1;4789:23:1;;4638:180;-1:-1:-1;4638:180:1:o;4823:184::-;4893:6;4946:2;4934:9;4925:7;4921:23;4917:32;4914:52;;;4962:1;4959;4952:12;4914:52;-1:-1:-1;4985:16:1;;4823:184;-1:-1:-1;4823:184:1:o;5012:248::-;5080:6;5088;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;-1:-1:-1;;5180:23:1;;;5250:2;5235:18;;;5222:32;;-1:-1:-1;5012:248:1:o;5265:306::-;5353:6;5361;5369;5422:2;5410:9;5401:7;5397:23;5393:32;5390:52;;;5438:1;5435;5428:12;5390:52;5467:9;5461:16;5451:26;;5517:2;5506:9;5502:18;5496:25;5486:35;;5561:2;5550:9;5546:18;5540:25;5530:35;;5265:306;;;;;:::o;5576:182::-;5633:6;5686:2;5674:9;5665:7;5661:23;5657:32;5654:52;;;5702:1;5699;5692:12;5654:52;5725:27;5742:9;5725:27;:::i;5763:535::-;5855:6;5863;5871;5879;5887;5895;5948:3;5936:9;5927:7;5923:23;5919:33;5916:53;;;5965:1;5962;5955:12;5916:53;5988:27;6005:9;5988:27;:::i;:::-;5978:37;;6034:36;6066:2;6055:9;6051:18;6034:36;:::i;:::-;6024:46;;6089:36;6121:2;6110:9;6106:18;6089:36;:::i;:::-;6079:46;;6144:36;6176:2;6165:9;6161:18;6144:36;:::i;:::-;6134:46;;6199:37;6231:3;6220:9;6216:19;6199:37;:::i;:::-;6189:47;;6255:37;6287:3;6276:9;6272:19;6255:37;:::i;:::-;6245:47;;5763:535;;;;;;;;:::o;6303:461::-;6356:3;6394:5;6388:12;6421:6;6416:3;6409:19;6447:4;6476:2;6471:3;6467:12;6460:19;;6513:2;6506:5;6502:14;6534:1;6544:195;6558:6;6555:1;6552:13;6544:195;;;6623:13;;-1:-1:-1;;;;;6619:39:1;6607:52;;6679:12;;;;6714:15;;;;6655:1;6573:9;6544:195;;;-1:-1:-1;6755:3:1;;6303:461;-1:-1:-1;;;;;6303:461:1:o;8078:261::-;8257:2;8246:9;8239:21;8220:4;8277:56;8329:2;8318:9;8314:18;8306:6;8277:56;:::i;8726:597::-;8838:4;8867:2;8896;8885:9;8878:21;8928:6;8922:13;8971:6;8966:2;8955:9;8951:18;8944:34;8996:1;9006:140;9020:6;9017:1;9014:13;9006:140;;;9115:14;;;9111:23;;9105:30;9081:17;;;9100:2;9077:26;9070:66;9035:10;;9006:140;;;9164:6;9161:1;9158:13;9155:91;;;9234:1;9229:2;9220:6;9209:9;9205:22;9201:31;9194:42;9155:91;-1:-1:-1;9307:2:1;9286:15;-1:-1:-1;;9282:29:1;9267:45;;;;9314:2;9263:54;;8726:597;-1:-1:-1;;;8726:597:1:o;13995:342::-;14197:2;14179:21;;;14236:2;14216:18;;;14209:30;-1:-1:-1;;;14270:2:1;14255:18;;14248:48;14328:2;14313:18;;13995:342::o;15049:340::-;15251:2;15233:21;;;15290:2;15270:18;;;15263:30;-1:-1:-1;;;15324:2:1;15309:18;;15302:46;15380:2;15365:18;;15049:340::o;17496:582::-;17795:6;17784:9;17777:25;17838:6;17833:2;17822:9;17818:18;17811:34;17881:3;17876:2;17865:9;17861:18;17854:31;17758:4;17902:57;17954:3;17943:9;17939:19;17931:6;17902:57;:::i;:::-;-1:-1:-1;;;;;17995:32:1;;;;17990:2;17975:18;;17968:60;-1:-1:-1;18059:3:1;18044:19;18037:35;17894:65;17496:582;-1:-1:-1;;;17496:582:1:o;19065:128::-;19105:3;19136:1;19132:6;19129:1;19126:13;19123:39;;;19142:18;;:::i;:::-;-1:-1:-1;19178:9:1;;19065:128::o;19198:204::-;19236:3;19272:4;19269:1;19265:12;19304:4;19301:1;19297:12;19339:3;19333:4;19329:14;19324:3;19321:23;19318:49;;;19347:18;;:::i;:::-;19383:13;;19198:204;-1:-1:-1;;;19198:204:1:o;19407:217::-;19447:1;19473;19463:132;;19517:10;19512:3;19508:20;19505:1;19498:31;19552:4;19549:1;19542:15;19580:4;19577:1;19570:15;19463:132;-1:-1:-1;19609:9:1;;19407:217::o;19629:422::-;19718:1;19761:5;19718:1;19775:270;19796:7;19786:8;19783:21;19775:270;;;19855:4;19851:1;19847:6;19843:17;19837:4;19834:27;19831:53;;;19864:18;;:::i;:::-;19914:7;19904:8;19900:22;19897:55;;;19934:16;;;;19897:55;20013:22;;;;19973:15;;;;19775:270;;;19779:3;19629:422;;;;;:::o;20056:140::-;20114:5;20143:47;20184:4;20174:8;20170:19;20164:4;20250:5;20280:8;20270:80;;-1:-1:-1;20321:1:1;20335:5;;20270:80;20369:4;20359:76;;-1:-1:-1;20406:1:1;20420:5;;20359:76;20451:4;20469:1;20464:59;;;;20537:1;20532:130;;;;20444:218;;20464:59;20494:1;20485:10;;20508:5;;;20532:130;20569:3;20559:8;20556:17;20553:43;;;20576:18;;:::i;:::-;-1:-1:-1;;20632:1:1;20618:16;;20647:5;;20444:218;;20746:2;20736:8;20733:16;20727:3;20721:4;20718:13;20714:36;20708:2;20698:8;20695:16;20690:2;20684:4;20681:12;20677:35;20674:77;20671:159;;;-1:-1:-1;20783:19:1;;;20815:5;;20671:159;20862:34;20887:8;20881:4;20862:34;:::i;:::-;20932:6;20928:1;20924:6;20920:19;20911:7;20908:32;20905:58;;;20943:18;;:::i;:::-;20981:20;;20201:806;-1:-1:-1;;;20201:806:1:o;21012:168::-;21052:7;21118:1;21114;21110:6;21106:14;21103:1;21100:21;21095:1;21088:9;21081:17;21077:45;21074:71;;;21125:18;;:::i;:::-;-1:-1:-1;21165:9:1;;21012:168::o;21185:125::-;21225:4;21253:1;21250;21247:8;21244:34;;;21258:18;;:::i;:::-;-1:-1:-1;21295:9:1;;21185:125::o;21315:135::-;21354:3;-1:-1:-1;;21375:17:1;;21372:43;;;21395:18;;:::i;:::-;-1:-1:-1;21442:1:1;21431:13;;21315:135::o;21455:127::-;21516:10;21511:3;21507:20;21504:1;21497:31;21547:4;21544:1;21537:15;21571:4;21568:1;21561:15;21587:127;21648:10;21643:3;21639:20;21636:1;21629:31;21679:4;21676:1;21669:15;21703:4;21700:1;21693:15;21719:127;21780:10;21775:3;21771:20;21768:1;21761:31;21811:4;21808:1;21801:15;21835:4;21832:1;21825:15;21851:127;21912:10;21907:3;21903:20;21900:1;21893:31;21943:4;21940:1;21933:15;21967:4;21964:1;21957:15;21983:131;-1:-1:-1;;;;;22058:31:1;;22048:42;;22038:70;;22104:1;22101;22094:12;22119:118;22205:5;22198:13;22191:21;22184:5;22181:32;22171:60;;22227:1;22224;22217:12

Swarm Source

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

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