Contract Address Details

0xc2eB9e06602D5E043905127A8F4f2E3a6BC057e7

Token
MILKYCHEEMS (MCINU)
Creator
0xc5e1a2–4f26c7 at 0xac7120–61b827
Balance
0 mADA
Tokens
Fetching tokens...
Transactions
733 Transactions
Transfers
964 Transfers
Gas Used
34,495,531
Last Balance Update
43074528
Contract name:
MILKYCHEEMS




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
200
EVM Version
default




Verified at
2022-04-05T14:18:42.184905Z

Contract source code

/*
* 
MilkyCheems
 
100 000 000 supply
max buy 1 000 000
max sell 500 000

8% tax

https://t.me/milkycheems

*
*/

pragma solidity =0.8.9;

// SPDX-License-Identifier: UNLICENSED

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() external 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) external 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));
    }
}

//MILKY CHEEMS CONTRACT 

contract MILKYCHEEMS is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    event ContractChanged(uint256 indexed value);
    event ContractChangedBool(bool indexed value);
    event ContractChangedAddress(address indexed value);
    event antiBotBan(address indexed value);
    
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'MILKYCHEEMS';
    string private constant _symbol = 'MCINU';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 150000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (0.5%)
    uint16 public constant SellLimitDivider=200;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 5 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0xC5e1a2854178b152b239068F4DC8d53cC34f26c7);
    address public walletTwo=payable(0xc07c764A7FbDC76f2373Fac86079F8AB5DF4c949);
    //TestNet
    address private PancakeRouter=0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C;
    //MainNet
    //address private PancakeRouter=0x10ED43C718714eb63d5aA57B78B54704E256024E;


    //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 private antiWhale = 1000000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 10; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
	uint256 private enableAutoBlacklist = 1; //Leave 1 if using, set to 0 if not using.
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;
       
    address private _pancakePairAddress; 
    IPancakeRouter02 private _pancakeRouter;

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // 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;
		
		//Sets buyLockTime
        buyLockTime=0;

        //Set Starting Taxes 
        
        _buyTax=8;
        _sellTax=8;
        _transferTax=0;

        _burnTax=0;
        _liquidityTax=20;
        _marketingTax=80;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(walletTwo);
        _excluded.add(msg.sender);
    
    }

    //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
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            //Sells can't exceed the sell limit
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_sellTax;


        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            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)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token
        _removeToken(sender,amount);
        //Adds token
        _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;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //adds Token to balances
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }

    //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() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_marketingTax+_liquidityTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //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
        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 marketing
        uint256 distributeBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB to Marketing
        marketingBalance+=distributeBNB;
    }
    //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 returns (uint256 tAmountSent, uint256 bnbAmountSent) {
        totalLPBNB+=bnbamount;
        uint256 minBNB = (bnbamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            minTokens,
            minBNB,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        bnbAmountSent = bnbamount;
        return (tAmountSent, bnbAmountSent);
    }

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

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

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

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

    function getTaxes() external view returns(uint256 burnTax,uint256 liquidityTax, uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) external view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() external view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() external{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
	
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
	bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function TeamWithdrawALLMarketingBNB() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*75) / 100);
        payable(walletTwo).transfer((amount-(amount*75) / 100));
        emit Transfer(address(this), TeamWallet, (amount*75) / 100);
        emit Transfer(address(this), walletTwo, (amount-(amount*75) / 100));
    } 
    function TeamWithdrawXMarketingBNB(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*75) / 100);
        payable(walletTwo).transfer((amount-(amount*75) / 100));
        emit Transfer(address(this), TeamWallet, (amount*75) / 100);
        emit Transfer(address(this), walletTwo, (amount-(amount*75) / 100));
    } 

    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) external onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
      emit ContractChanged(antiWhale);
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) external onlyOwner{
      require(newTeamWallet != address(0),
      "Error: Cannot be 0 address.");
      TeamWallet=payable(newTeamWallet);
      emit ContractChangedAddress(TeamWallet);
    }
    
    function TeamChangeWalletTwo(address newWalletTwo) external onlyOwner{
      require(newWalletTwo != address(0),
      "Error: Cannot be 0 address.");
      walletTwo=payable(newWalletTwo);
      emit ContractChangedAddress(walletTwo);
    }
	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) external onlyOwner{
        buyLockDisabled=disabled;
        emit ContractChangedBool(buyLockDisabled);
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds) external onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
            emit ContractChanged(buyLockTime);
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) external onlyOwner{
        currentAmountToSwap = newSwapAmount;
        emit ContractChanged(currentAmountToSwap);
    }
    
    //Allows wallet exclusion to be added after launch
    function addWalletExclusion(address exclusionAdd) external onlyOwner{
        _excluded.add(exclusionAdd);
        emit ContractChangedAddress(exclusionAdd);
    }

    //Allows you to remove wallet exclusions after launch
    function removeWalletExclusion(address exclusionRemove) external onlyOwner{
        _excluded.remove(exclusionRemove);
        emit ContractChangedAddress(exclusionRemove);
    }

    //Check if address is blacklisted (can be called by anyone)
    function checkAddressBlacklist(address submittedAddress) external view returns (bool isBlacklisted) {
        if (_isBlacklisted.contains(submittedAddress) == true) {
            isBlacklisted = true;
            return isBlacklisted;
        }
        if (_isBlacklisted.contains(submittedAddress) == false) {
            isBlacklisted = false;
            return isBlacklisted;
        }
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.add(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //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) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;

        emit ContractChanged(_burnTax);
        emit ContractChanged(_liquidityTax);
        emit ContractChanged(_buyTax);
        emit ContractChanged(_sellTax);
        emit ContractChanged(_transferTax);
    }

    //manually converts contract token to LP
    function TeamCreateLPandBNB() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdatePancakeRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        PancakeRouter=newRouter;
        emit ContractChangedAddress(PancakeRouter);
    }
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) external onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100,
        "Error: New sell limit above 1% of circulating supply.");
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
        emit ContractChanged(balanceLimit);
        emit ContractChanged(sellLimit);
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() external onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    //Adds time to LP lock in seconds.
    function TeamProlongLiquidityLockInSeconds(uint256 secondsUntilUnlock) external onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
        emit ContractChanged(secondsUntilUnlock+block.timestamp);
    }
    //Adds time to LP lock based on set time.
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime,
        "Error: New unlock time is shorter than old one.");
        _liquidityUnlockTime=newUnlockTime;
        emit ContractChanged(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IPancakeERC20 liquidityToken = IPancakeERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(TeamWallet, amount);
        emit Transfer(address(this), TeamWallet, amount);
        tWAddress = TeamWallet;
        amountSent = amount;
        return (tWAddress, amountSent);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity() external onlyOwner returns (uint256 newBalance) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        IPancakeERC20 liquidityToken = IPancakeERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_pancakeRouter),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialBNBBalance = address(this).balance;
        
        _pancakeRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newBNBBalance = address(this).balance-initialBNBBalance;
        marketingBalance+=newBNBBalance;
        newBalance=newBNBBalance;
        return newBalance;
    }
    //Releases all remaining BNB on the contract wallet, so BNB wont be burned
    function TeamRemoveRemainingBNB() external onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent,
        "Error: Not 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;
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ContractChanged","inputs":[{"type":"uint256","name":"value","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ContractChangedAddress","inputs":[{"type":"address","name":"value","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ContractChangedBool","inputs":[{"type":"bool","name":"value","internalType":"bool","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"antiBotBan","inputs":[{"type":"address","name":"value","internalType":"address","indexed":true}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"AddressResetBuyLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"BalanceLimitDivider","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"InitialSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"MaxBuyLockTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"SellLimitDivider","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetupEnableTrading","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetupLiquidityTokenAddress","inputs":[{"type":"address","name":"liquidityTokenAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamChangeAntiWhale","inputs":[{"type":"uint256","name":"newAntiWhale","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamChangeTeamWallet","inputs":[{"type":"address","name":"newTeamWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamChangeWalletTwo","inputs":[{"type":"address","name":"newWalletTwo","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamCreateLPandBNB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamDisableBuyLock","inputs":[{"type":"bool","name":"disabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamProlongLiquidityLockInSeconds","inputs":[{"type":"uint256","name":"secondsUntilUnlock","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"tWAddress","internalType":"address"},{"type":"uint256","name":"amountSent","internalType":"uint256"}],"name":"TeamReleaseLiquidity","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"newBalance","internalType":"uint256"}],"name":"TeamRemoveLiquidity","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamRemoveRemainingBNB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamSetBuyLockTime","inputs":[{"type":"uint256","name":"buyLockSeconds","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamSetTaxes","inputs":[{"type":"uint8","name":"burnTaxes","internalType":"uint8"},{"type":"uint8","name":"liquidityTaxes","internalType":"uint8"},{"type":"uint8","name":"marketingTaxes","internalType":"uint8"},{"type":"uint8","name":"buyTax","internalType":"uint8"},{"type":"uint8","name":"sellTax","internalType":"uint8"},{"type":"uint8","name":"transferTax","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamSwitchManualBNBConversion","inputs":[{"type":"bool","name":"manual","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamUpdateAmountToSwap","inputs":[{"type":"uint256","name":"newSwapAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamUpdateLimits","inputs":[{"type":"uint256","name":"newBalanceLimit","internalType":"uint256"},{"type":"uint256","name":"newSellLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"TeamWallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamWithdrawALLMarketingBNB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"TeamWithdrawXMarketingBNB","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAddressToBlacklist","inputs":[{"type":"address","name":"blacklistedAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addWalletExclusion","inputs":[{"type":"address","name":"exclusionAdd","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"buyLockDisabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyLockTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isBlacklisted","internalType":"bool"}],"name":"checkAddressBlacklist","inputs":[{"type":"address","name":"submittedAddress","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAddressBuyLockTimeInSeconds","inputs":[{"type":"address","name":"AddressToCheck","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBurnedTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBuyLockTimeInSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"sell","internalType":"uint256"}],"name":"getLimits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLiquidityReleaseTimeInSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"burnTax","internalType":"uint256"},{"type":"uint256","name":"liquidityTax","internalType":"uint256"},{"type":"uint256","name":"marketingTax","internalType":"uint256"},{"type":"uint256","name":"buyTax","internalType":"uint256"},{"type":"uint256","name":"sellTax","internalType":"uint256"},{"type":"uint256","name":"transferTax","internalType":"uint256"}],"name":"getTaxes","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"manualConversion","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketingBalance","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAddressFromBlacklist","inputs":[{"type":"address","name":"blacklistedAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeWalletExclusion","inputs":[{"type":"address","name":"exclusionRemove","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellLimit","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"teamUpdatePancakeRouter","inputs":[{"type":"address","name":"newRouter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLPBNB","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"walletTwo","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x60806040526004361061036b5760003560e01c8063715018a6116101c4578063c3a3c032116100f6578063e803050c1161009a578063f2fde38b1161006c578063f2fde38b14610aad578063f9ab736614610acd578063fa76995414610aed578063ffcfadde14610b0257005b8063e803050c14610a38578063f0590dd114610a58578063f24a1e7014610a78578063f2c816ae14610a8d57005b8063d8902ff5116100d3578063d8902ff514610992578063daf9a47a146109b2578063dd62ed3e146109d2578063e2fd002a14610a1857005b8063c3a3c03214610948578063c3f4f54f1461095d578063d11edf741461097257005b80638d2c5039116101685780639fa62d5f1161013a5780639fa62d5f146108c8578063a457c2d7146108e8578063a9059cbb14610908578063b766a3861461092857005b80638d2c50391461085a5780638da5cb5b1461082657806395d89b411461087a5780639bc845fb146108a857005b8063828e8b7e116101a1578063828e8b7e146107f757806386d0ada81461080c578063893d20e8146108265780638d060d771461084457005b8063715018a6146107b7578063762bb282146107cc5780637b9e987a146107e257005b806335e82f3a1161029d57806357ad67d111610241578063677a887011610213578063677a8870146107175780636eb8c7f1146107375780636f89e4091461075757806370a082311461078157005b806357ad67d1146106ac57806358e55365146106cc5780635c69f690146106e257806361cb2748146106f757005b806344f3c83a1161027a57806344f3c83a146106415780634ada218b146106575780634cdaf0ae146106765780634f91e48c1461069657005b806335e82f3a146105cd57806339509351146105ed5780633c7a309b1461060d57005b80631eb25d131161030f5780632bc47bd1116102e15780632bc47bd1146105535780633054f8a314610573578063311a869714610592578063313ce567146105b957005b80631eb25d131461047b57806323b872dd146104905780632594b343146104b05780632973ef2d146104e857005b80630fa5b215116103485780630fa5b215146104065780630fd99e161461042957806314ddc0951461045157806318160ddd1461046657005b80630200264b1461037457806306fdde03146103a9578063095ea7b3146103e657005b3661037257005b005b34801561038057600080fd5b5061039461038f366004613393565b610b17565b60405190151581526020015b60405180910390f35b3480156103b557600080fd5b5060408051808201909152600b81526a4d494c4b59434845454d5360a81b60208201525b6040516103a091906133b0565b3480156103f257600080fd5b50610394610401366004613405565b610b52565b34801561041257600080fd5b5061041b610b69565b6040519081526020016103a0565b34801561043557600080fd5b5061043e60c881565b60405161ffff90911681526020016103a0565b34801561045d57600080fd5b5060185461041b565b34801561047257600080fd5b50600c5461041b565b34801561048757600080fd5b5061041b610dc4565b34801561049c57600080fd5b506103946104ab366004613431565b610de1565b3480156104bc57600080fd5b50600a546104d0906001600160a01b031681565b6040516001600160a01b0390911681526020016103a0565b3480156104f457600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a0565b34801561055f57600080fd5b5061037261056e366004613472565b610e78565b34801561057f57600080fd5b5060175461039490610100900460ff1681565b34801561059e57600080fd5b506105a7603281565b60405160ff90911681526020016103a0565b3480156105c557600080fd5b5060096105a7565b3480156105d957600080fd5b506103726105e8366004613393565b61106d565b3480156105f957600080fd5b50610394610608366004613405565b6110d7565b34801561061957600080fd5b5061062261110e565b604080516001600160a01b0390931683526020830191909152016103a0565b34801561064d57600080fd5b5061041b60185481565b34801561066357600080fd5b5060195461039490610100900460ff1681565b34801561068257600080fd5b50610372610691366004613393565b6112c1565b3480156106a257600080fd5b5061041b600e5481565b3480156106b857600080fd5b506103726106c736600461349c565b61134a565b3480156106d857600080fd5b5061041b60155481565b3480156106ee57600080fd5b5061043e600581565b34801561070357600080fd5b50610372610712366004613393565b6116df565b34801561072357600080fd5b506009546104d0906001600160a01b031681565b34801561074357600080fd5b50610372610752366004613472565b611723565b34801561076357600080fd5b5061076c611792565b604080519283526020830191909152016103a0565b34801561078d57600080fd5b5061041b61079c366004613393565b6001600160a01b031660009081526001602052604090205490565b3480156107c357600080fd5b506103726117cf565b3480156107d857600080fd5b5061041b600d5481565b3480156107ee57600080fd5b50610372611852565b34801561080357600080fd5b506103726118a0565b34801561081857600080fd5b506019546103949060ff1681565b34801561083257600080fd5b506000546001600160a01b03166104d0565b34801561085057600080fd5b5061041b60165481565b34801561086657600080fd5b5061037261087536600461351e565b6118c4565b34801561088657600080fd5b506040805180820190915260058152644d43494e5560d81b60208201526103d9565b3480156108b457600080fd5b506103726108c3366004613393565b611942565b3480156108d457600080fd5b506103726108e336600461353b565b6119d9565b3480156108f457600080fd5b50610394610903366004613405565b611bf2565b34801561091457600080fd5b50610394610923366004613405565b611c6e565b34801561093457600080fd5b5061037261094336600461351e565b611c7b565b34801561095457600080fd5b5061041b611d03565b34801561096957600080fd5b5061041b611d23565b34801561097e57600080fd5b5061037261098d366004613472565b611d62565b34801561099e57600080fd5b506103726109ad366004613393565b611dbc565b3480156109be57600080fd5b506103726109cd366004613472565b611e53565b3480156109de57600080fd5b5061041b6109ed36600461355d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a2457600080fd5b50610372610a33366004613472565b611ec1565b348015610a4457600080fd5b5061041b610a53366004613393565b611f65565b348015610a6457600080fd5b50610372610a73366004613393565b611f9f565b348015610a8457600080fd5b50610372612036565b348015610a9957600080fd5b50610372610aa8366004613393565b61212a565b348015610ab957600080fd5b50610372610ac8366004613393565b61216e565b348015610ad957600080fd5b50610372610ae8366004613393565b612267565b348015610af957600080fd5b506103726122ab565b348015610b0e57600080fd5b50610372612309565b6000610b24600683612361565b151560011415610b3657506001919050565b610b41600683612361565b610b4d57506000919050565b919050565b6000610b5f338484612383565b5060015b92915050565b600033610b7e6000546001600160a01b031690565b6001600160a01b031614610bad5760405162461bcd60e51b8152600401610ba490613596565b60405180910390fd5b601a54421015610bcf5760405162461bcd60e51b8152600401610ba4906135cb565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5491906135f5565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610ca457600080fd5b505af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc919061360e565b5060145447906001600160a01b031663af2979eb30846064610cff82604b613641565b610d099190613660565b6064610d1688604b613641565b610d209190613660565b30426040518763ffffffff1660e01b8152600401610d4396959493929190613682565b602060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9591906135f5565b506000610da282476136bd565b90508060156000828254610db691906136d4565b909155509094505050505090565b610dd06009600a6137d0565b610dde906305f5e100613641565b81565b6000610dee848484612476565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e595760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610ba4565b610e6d8533610e6886856136bd565b612383565b506001949350505050565b33610e8b6000546001600160a01b031690565b6001600160a01b031614610eb15760405162461bcd60e51b8152600401610ba490613596565b601554811115610f195760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610ba4565b8060156000828254610f2b91906136bd565b90915550506009546001600160a01b03166108fc6064610f4c84604b613641565b610f569190613660565b6040518115909202916000818181858888f19350505050158015610f7e573d6000803e3d6000fd5b50600a546001600160a01b03166108fc6064610f9b84604b613641565b610fa59190613660565b610faf90846136bd565b6040518115909202916000818181858888f19350505050158015610fd7573d6000803e3d6000fd5b506009546001600160a01b031630600080516020613944833981519152606461100185604b613641565b61100b9190613660565b60405190815260200160405180910390a3600a546001600160a01b031630600080516020613944833981519152606461104585604b613641565b61104f9190613660565b61105990856136bd565b60405190815260200160405180910390a350565b336110806000546001600160a01b031690565b6001600160a01b0316146110a65760405162461bcd60e51b8152600401610ba490613596565b6110b16006826126d3565b506040516001600160a01b0382169060008051602061396483398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b5f918590610e689086906136d4565b600080336111246000546001600160a01b031690565b6001600160a01b03161461114a5760405162461bcd60e51b8152600401610ba490613596565b601a5442101561116c5760405162461bcd60e51b8152600401610ba4906135cb565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b1580156111b957600080fd5b505afa1580156111cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f191906135f5565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611279919061360e565b506009546040518281526001600160a01b039091169030906000805160206139448339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336112d46000546001600160a01b031690565b6001600160a01b0316146112fa5760405162461bcd60e51b8152600401610ba490613596565b6001600160a01b0381166113205760405162461bcd60e51b8152600401610ba4906137df565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b3361135d6000546001600160a01b031690565b6001600160a01b0316146113835760405162461bcd60e51b8152600401610ba490613596565b6000846113908789613816565b61139a9190613816565b90508060ff166064146113fe5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610ba4565b60148460ff1611156114785760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610ba4565b60148360ff1611156114f25760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610ba4565b60148260ff1611156115775760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610ba4565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff1660008051602061392483398151915260405160405180910390a260135460405164010000000090910460ff169060008051602061392483398151915290600090a260135460405160ff9091169060008051602061392483398151915290600090a260135460405161010090910460ff169060008051602061392483398151915290600090a26013546040516201000090910460ff169060008051602061392483398151915290600090a250505050505050565b336116f26000546001600160a01b031690565b6001600160a01b0316146117185760405162461bcd60e51b8152600401610ba490613596565b6110b16004826126d3565b336117366000546001600160a01b031690565b6001600160a01b03161461175c5760405162461bcd60e51b8152600401610ba490613596565b61176e61176942836136d4565b6126e8565b61177842826136d4565b60405160008051602061392483398151915290600090a250565b6000806117a16009600a6137d0565b600d546117ae9190613660565b6117ba6009600a6137d0565b600e546117c79190613660565b915091509091565b336117e26000546001600160a01b031690565b6001600160a01b0316146118085760405162461bcd60e51b8152600401610ba490613596565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336118656000546001600160a01b031690565b6001600160a01b03161461188b5760405162461bcd60e51b8152600401610ba490613596565b6019805461ff00191661010017905542601055565b6018546118ad90426136d4565b33600090815260036020526040902055565b905090565b336118d76000546001600160a01b031690565b6001600160a01b0316146118fd5760405162461bcd60e51b8152600401610ba490613596565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b336119556000546001600160a01b031690565b6001600160a01b03161461197b5760405162461bcd60e51b8152600401610ba490613596565b6001600160a01b0381166119a15760405162461bcd60e51b8152600401610ba4906137df565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061396483398151915290600090a250565b336119ec6000546001600160a01b031690565b6001600160a01b031614611a125760405162461bcd60e51b8152600401610ba490613596565b6064600c54611a219190613660565b8110611a8d5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610ba4565b611a996009600a6137d0565b611aa39083613641565b9150611ab16009600a6137d0565b611abb9082613641565b90506000603260ff16600c54611ad19190613660565b9050600060c861ffff16600c54611ae89190613660565b905081841015611b4e5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610ba4565b80831015611baf5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610ba4565b600d849055600e839055604051849060008051602061392483398151915290600090a2600e5460405160008051602061392483398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c555760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610ba4565b611c643385610e6886856136bd565b5060019392505050565b6000610b5f338484612476565b33611c8e6000546001600160a01b031690565b6001600160a01b031614611cb45760405162461bcd60e51b8152600401610ba490613596565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611d1d5742601a546118bf91906136bd565b50600090565b6000611d316009600a6137d0565b600c54611d406009600a6137d0565b611d4e906305f5e100613641565b611d5891906136bd565b6118bf9190613660565b33611d756000546001600160a01b031690565b6001600160a01b031614611d9b5760405162461bcd60e51b8152600401610ba490613596565b6008819055604051819060008051602061392483398151915290600090a250565b33611dcf6000546001600160a01b031690565b6001600160a01b031614611df55760405162461bcd60e51b8152600401610ba490613596565b6001600160a01b038116611e1b5760405162461bcd60e51b8152600401610ba4906137df565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061396483398151915290600090a250565b33611e666000546001600160a01b031690565b6001600160a01b031614611e8c5760405162461bcd60e51b8152600401610ba490613596565b611e986009600a6137d0565b611ea29082613641565b600f81905560405160008051602061392483398151915290600090a250565b33611ed46000546001600160a01b031690565b6001600160a01b031614611efa5760405162461bcd60e51b8152600401610ba490613596565b6005811115611f445760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610ba4565b6018819055604051819060008051602061392483398151915290600090a250565b6001600160a01b038116600090815260036020526040812054428111611f8e5750600092915050565b611f9842826136bd565b9392505050565b33611fb26000546001600160a01b031690565b6001600160a01b031614611fd85760405162461bcd60e51b8152600401610ba490613596565b6001600160a01b038116611ffe5760405162461bcd60e51b8152600401610ba4906137df565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061396483398151915290600090a250565b336120496000546001600160a01b031690565b6001600160a01b03161461206f5760405162461bcd60e51b8152600401610ba490613596565b601a544210156120915760405162461bcd60e51b8152600401610ba4906135cb565b6009546040516000916001600160a01b03169047908381818185875af1925050503d80600081146120de576040519150601f19603f3d011682016040523d82523d6000602084013e6120e3565b606091505b50509050806121275760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610ba4565b50565b3361213d6000546001600160a01b031690565b6001600160a01b0316146121635760405162461bcd60e51b8152600401610ba490613596565b6110b160068261234c565b336121816000546001600160a01b031690565b6001600160a01b0316146121a75760405162461bcd60e51b8152600401610ba490613596565b6001600160a01b03811661220c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361227a6000546001600160a01b031690565b6001600160a01b0316146122a05760405162461bcd60e51b8152600401610ba490613596565b6110b160048261234c565b336122be6000546001600160a01b031690565b6001600160a01b0316146122e45760405162461bcd60e51b8152600401610ba490613596565b6015805460009091556009546001600160a01b03166108fc6064610f4c84604b613641565b3361231c6000546001600160a01b031690565b6001600160a01b0316146123425760405162461bcd60e51b8152600401610ba490613596565b61234a612772565b565b6000611f98836001600160a01b0384166128c5565b6001600160a01b03811660009081526001830160205260408120541515611f98565b6001600160a01b0383166123cd5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610ba4565b6001600160a01b0382166124155760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610ba4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124c15760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610ba4565b6001600160a01b03821661250a5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610ba4565b6000612517600485612361565b806125285750612528600484612361565b905060006001600160a01b03851630148061254b57506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b9092041614801561258d5750816001600160a01b0316866001600160a01b0316145b806125c857506013546001600160a01b03878116600160301b909204161480156125c85750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806126025750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061263c5750836001600160a01b0316886001600160a01b0316145b905084806126475750825b8061264f5750855b156126645761265f898989612914565b6126c8565b601954610100900460ff166126bb5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610ba4565b6126c889898985856129cd565b505050505050505050565b6000611f98836001600160a01b038416612f87565b601a5481116127515760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610ba4565b601a819055604051819060008051602061392483398151915290600090a250565b6017805460ff1916600190811790915530600090815260209190915260408120546013549091906127ba90640100000000810460ff9081169165010000000000900416613816565b60ff16905060006008549050808310806127d6575061ffff8216155b156127e3575050506128b9565b60135460009061ffff84169061280490640100000000900460ff1684613641565b61280e9190613660565b9050600061281c82846136bd565b9050600061282b600284613660565b9050600061283982856136bd565b9050600061284784836136d4565b90504761285382613074565b600061285f82476136bd565b905060008361286e8684613641565b6128789190613660565b905061288486826131dc565b506000905061289384476136bd565b905080601560008282546128a791906136d4565b90915550505050505050505050505050505b6017805460ff19169055565b600081815260018301602052604081205461290c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b63565b506000610b63565b6001600160a01b038316600090815260016020526040902054818110156129785760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ba4565b61298284836132e1565b61298c8383613326565b826001600160a01b0316846001600160a01b0316600080516020613944833981519152846040516129bf91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612a3b5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ba4565b60008315612b4e57600e54861115612a875760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610ba4565b612a92600689612361565b15612ad65760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610ba4565b601154601054612ae691906136d4565b4211158015612af757506012546001145b15612b3d57612b0760068961234c565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612e34565b8415612cc157600d54612b6187856136d4565b1115612ba25760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610ba4565b600f54861115612bff5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610ba4565b612c0a600688612361565b15612c4e5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610ba4565b601154601054612c5e91906136d4565b4211158015612c6f57506012546001145b15612cb557612c7f60068861234c565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612e34565b612ccc600689612361565b15612d195760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610ba4565b612d24600688612361565b15612d715760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610ba4565b600d54612d7e87856136d4565b1115612dbf5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610ba4565b601154601054612dcf91906136d4565b4211158015612de057506012546001145b15612e2657612df060068961234c565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e5c575060195460ff16155b8015612e6b575060175460ff16155b8015612e745750835b15612e8157612e81612772565b6000612e9d8783601360039054906101000a900460ff1661334a565b601354909150600090612ed39089908590612ece9060ff640100000000820481169165010000000000900416613816565b61334a565b90506000612ee182846136d4565b612eeb908a6136bd565b9050612ef78b8a6132e1565b3060009081526001602052604081208054849290612f169084906136d4565b9250508190555082600c6000828254612f2f91906136bd565b90915550612f3f90508a82613326565b896001600160a01b03168b6001600160a01b031660008051602061394483398151915283604051612f7291815260200190565b60405180910390a35050505050505050505050565b6000818152600183016020526040812054801561306a576000612fab6001836136bd565b8554909150600090612fbf906001906136bd565b90506000866000018281548110612fd857612fd861383b565b9060005260206000200154905080876000018481548110612ffb57612ffb61383b565b60009182526020808320909101929092558281526001890190915260409020849055865487908061302e5761302e613851565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b63565b6000915050610b63565b60145461308c9030906001600160a01b031683612383565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130c1576130c161383b565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561311557600080fd5b505afa158015613129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314d9190613867565b816001815181106131605761316061383b565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac947906131a6908590600090869030904290600401613884565b600060405180830381600087803b1580156131c057600080fd5b505af11580156131d4573d6000803e3d6000fd5b505050505050565b60008082601660008282546131f191906136d4565b9091555060009050606461320685604b613641565b6132109190613660565b90506000606461322187604b613641565b61322b9190613660565b6014549091506132469030906001600160a01b031688612383565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906132829030908b908790899084904290600401613682565b6060604051808303818588803b15801561329b57600080fd5b505af11580156132af573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132d491906138f5565b5096979596505050505050565b6001600160a01b0382166000908152600160205260408120546133059083906136bd565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546133059083906136d4565b60006127108260ff168460ff16866133629190613641565b61336c9190613641565b6133769190613660565b949350505050565b6001600160a01b038116811461212757600080fd5b6000602082840312156133a557600080fd5b8135611f988161337e565b600060208083528351808285015260005b818110156133dd578581018301518582016040015282016133c1565b818111156133ef576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561341857600080fd5b82356134238161337e565b946020939093013593505050565b60008060006060848603121561344657600080fd5b83356134518161337e565b925060208401356134618161337e565b929592945050506040919091013590565b60006020828403121561348457600080fd5b5035919050565b803560ff81168114610b4d57600080fd5b60008060008060008060c087890312156134b557600080fd5b6134be8761348b565b95506134cc6020880161348b565b94506134da6040880161348b565b93506134e86060880161348b565b92506134f66080880161348b565b915061350460a0880161348b565b90509295509295509295565b801515811461212757600080fd5b60006020828403121561353057600080fd5b8135611f9881613510565b6000806040838503121561354e57600080fd5b50508035926020909101359150565b6000806040838503121561357057600080fd5b823561357b8161337e565b9150602083013561358b8161337e565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60006020828403121561360757600080fd5b5051919050565b60006020828403121561362057600080fd5b8151611f9881613510565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561365b5761365b61362b565b500290565b60008261367d57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000828210156136cf576136cf61362b565b500390565b600082198211156136e7576136e761362b565b500190565b600181815b8085111561372757816000190482111561370d5761370d61362b565b8085161561371a57918102915b93841c93908002906136f1565b509250929050565b60008261373e57506001610b63565b8161374b57506000610b63565b8160018114613761576002811461376b57613787565b6001915050610b63565b60ff84111561377c5761377c61362b565b50506001821b610b63565b5060208310610133831016604e8410600b84101617156137aa575081810a610b63565b6137b483836136ec565b80600019048211156137c8576137c861362b565b029392505050565b6000611f9860ff84168361372f565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156138335761383361362b565b019392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006020828403121561387957600080fd5b8151611f988161337e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138d45784516001600160a01b0316835293830193918301916001016138af565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561390a57600080fd5b835192506020840151915060408401519050925092509256fefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212204bf26e0cf2df20e2832920ae748deb7b0280adaffe3c161ae0ac0c90625e00ae64736f6c63430008090033