ETH Price: $3,256.13 (-0.84%)
Gas: 1 Gwei

Token

Bibos DAO (BIBO)
 

Overview

Max Total Supply

100,000,000 BIBO

Holders

38

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
166,981.866171517 BIBO

Value
$0.00
0x982be252407d54c8df1b93caed441ba7c6be3e12
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BibosDAO

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-05
*/

/*
 
BibosDAO

A DAO supporting the Bibos community. 
Floating. Hypnotizing. Divine? 
We are community of people who love and adore bibos today.

Supply: 100 000 000 
Max Wallet: 500 000 to start then 2 000 000
Max TX: 250 000 to start then 1 000 000

Tax: 7%

1% LP
3% Marketing/Dev
3% BIBO Buyback Wallet

*/

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 IuniswapV2ERC20 {
    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 IuniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

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

interface IuniswapV2Router01 {
    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 IuniswapV2Router02 is IuniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



/**
 * @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));
    }
}

//ShibaHood Contract /////////////

contract BibosDAO 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 = 'Bibos DAO';
    string private constant _symbol = 'BIBO';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 350000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 15 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //Wallets
    address public TeamWallet=payable(0x8b2e2fda0DBE799ef964DE56c57842163e080137);
    address public CharityWallet=payable(0x4AE00a8688c6f7AD3024E86910fFf8DE4a1953a2);
    //Uniswap router (Main & Testnet)
    address private uniswapRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private antiWhale = 2000000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 7; // 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 _uniswapV2PairAddress; 
    IuniswapV2Router02 private _uniswapV2Router;

    //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);
        // Uniswap Router
        _uniswapV2Router = IuniswapV2Router02(uniswapRouter);
        //Creates a Uniswap Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=0;

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

        _burnTax=0;
        _liquidityTax=10;
        _marketingTax=90;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(CharityWallet);
        _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 UniswapRouter and UniswapPair are tax and lock free
        address uniswapV2Router=address(_uniswapV2Router);
        bool isLiquidityTransfer = ((sender == _uniswapV2PairAddress && recipient == uniswapV2Router) 
        || (recipient == _uniswapV2PairAddress && sender == uniswapV2Router));

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

        //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 MarketingETH is only possible if sender is not uniswapV2 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!=_uniswapV2PairAddress)&&(!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 ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing ETH 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 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for marketing
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining BETHNB to Marketing
        marketingBalance+=distributeETH;
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapV2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _uniswapV2Router.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 ethamount) private returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

    //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 TeamWithdrawALLMarketingETH() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*50) / 100);
        payable(CharityWallet).transfer((amount-(amount*50) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*66) / 100);
        payable(CharityWallet).transfer((amount-(amount*50) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(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 TeamChangeCharityWallet(address newCharityWallet) external onlyOwner{
      require(newCharityWallet != address(0),
      "Error: Cannot be 0 address.");
      CharityWallet=payable(newCharityWallet);
      emit ContractChangedAddress(CharityWallet);
    }
	
	//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);
    }

    //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 TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        uniswapRouter=newRouter;
        emit ContractChangedAddress(newRouter);
    }
     //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(bool setTrading) external onlyOwner{
        require(!tradingEnabled, "Cannot disable once trading is enabled");
        tradingEnabled=setTrading;
        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");
        
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_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");
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialETHBalance = address(this).balance;
        
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        marketingBalance+=newETHBalance;
        newBalance=newETHBalance;
        return newBalance;
    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() 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 Security Audit

Contract ABI

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

6080604052620000126009600a620005c1565b620000219062055730620005d2565b600855600980546001600160a01b0319908116738b2e2fda0dbe799ef964de56c57842163e080137178255600a80548216734ae00a8688c6f7ad3024e86910fff8de4a1953a2178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d17909155620000969190620005c1565b620000a6906305f5e100620005d2565b600c819055600d819055600e55620000c16009600a620005c1565b620000d090621e8480620005d2565b600f5560076011556001601255348015620000ea57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001cb57600080fd5b505afa158015620001e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002069190620005f4565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026457600080fd5b505afa15801562000279573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029f9190620005f4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e857600080fd5b505af1158015620002fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003239190620005f4565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003616009600a620005c1565b62000371906305f5e100620005d2565b6200037d919062000626565b600d556064620003906009600a620005c1565b620003a0906305f5e100620005d2565b620003ac919062000626565b600e5560006018556013805465ffffffffffff1916655a0a00000505179055600954620003f1906004906001600160a01b03166200043c602090811b620022de17901c565b50600a5462000418906004906001600160a01b03166200043c602090811b620022de17901c565b50620004343360046200043c60201b620022de1790919060201c565b505062000649565b600062000453836001600160a01b0384166200045c565b90505b92915050565b6000818152600183016020526040812054620004a55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000456565b50600062000456565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000505578160001904821115620004e957620004e9620004ae565b80851615620004f757918102915b93841c9390800290620004c9565b509250929050565b6000826200051e5750600162000456565b816200052d5750600062000456565b8160018114620005465760028114620005515762000571565b600191505062000456565b60ff841115620005655762000565620004ae565b50506001821b62000456565b5060208310610133831016604e8410600b841016171562000596575081810a62000456565b620005a28383620004c4565b8060001904821115620005b957620005b9620004ae565b029392505050565b60006200045360ff8416836200050d565b6000816000190483118215151615620005ef57620005ef620004ae565b500290565b6000602082840312156200060757600080fd5b81516001600160a01b03811681146200061f57600080fd5b9392505050565b6000826200064457634e487b7160e01b600052601260045260246000fd5b500490565b61395480620006596000396000f3fe6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a78578063f2c816ae14610a98578063f2fde38b14610ab8578063f9ab736614610ad857005b8063daf9a47a146109d2578063dd62ed3e146109f2578063e2fd002a14610a38578063e60ccfb014610a5857005b8063b766a386116100d3578063b766a38614610968578063c3a3c03214610988578063c3f4f54f1461099d578063d11edf74146109b257005b80639fa62d5f14610908578063a457c2d714610928578063a9059cbb1461094857005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087b57806395d89b411461089b5780639bc845fb146108c85780639bf65770146108e857005b8063828e8b7e1461082e57806386d0ada814610843578063893d20e81461085d5780638da5cb5b1461085d57005b806370a08231116101a157806370a08231146107ad578063715018a6146107e3578063762bb282146107f85780637e9ae5da1461080e57005b8063677a88701461072b5780636eb8c7f1146107635780636f89e4091461078357005b8063395093511161029d5780634cdaf0ae1161024157806358e1df921161021357806358e1df92146106cb57806358e55365146106e05780635c69f690146106f657806361cb27481461070b57005b80634cdaf0ae146106555780634f91e48c1461067557806357ad67d11461068b57806358780a82146106ab57005b80634476f35a1161027a5780634476f35a146105eb57806344f3c83a1461060b5780634ada218b146106215780634cbf8e241461064057005b806339509351146105815780633c7a309b146105a15780633cc39b7a146105d557005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610507578063311a869714610526578063313ce5671461054d57806335e82f3a1461056157005b806323b872dd14610467578063243b529a146104875780632973ef2d1461049c57005b80630fd99e161161033d5780630fd99e161461040057806314ddc0951461042857806318160ddd1461043d5780631eb25d131461045257005b806306fdde0314610369578063095ea7b3146103ad5780630fa5b215146103dd57005b3661036757005b005b34801561037557600080fd5b506040805180820190915260098152684269626f732044414f60b81b60208201525b6040516103a49190613334565b60405180910390f35b3480156103b957600080fd5b506103cd6103c836600461339e565b610af8565b60405190151581526020016103a4565b3480156103e957600080fd5b506103f2610b0f565b6040519081526020016103a4565b34801561040c57600080fd5b50610415606481565b60405161ffff90911681526020016103a4565b34801561043457600080fd5b506018546103f2565b34801561044957600080fd5b50600c546103f2565b34801561045e57600080fd5b506103f2610d6a565b34801561047357600080fd5b506103cd6104823660046133ca565b610d87565b34801561049357600080fd5b50610367610e1e565b3480156104a857600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a4565b34801561051357600080fd5b506017546103cd90610100900460ff1681565b34801561053257600080fd5b5061053b603281565b60405160ff90911681526020016103a4565b34801561055957600080fd5b50600961053b565b34801561056d57600080fd5b5061036761057c36600461340b565b610e61565b34801561058d57600080fd5b506103cd61059c36600461339e565b610ecb565b3480156105ad57600080fd5b506105b6610f02565b604080516001600160a01b0390931683526020830191909152016103a4565b3480156105e157600080fd5b506103f260165481565b3480156105f757600080fd5b50610367610606366004613428565b6110c7565b34801561061757600080fd5b506103f260185481565b34801561062d57600080fd5b506019546103cd90610100900460ff1681565b34801561064c57600080fd5b5061036761122a565b34801561066157600080fd5b5061036761067036600461340b565b61131e565b34801561068157600080fd5b506103f2600e5481565b34801561069757600080fd5b506103676106a6366004613457565b6113a7565b3480156106b757600080fd5b506103676106c63660046134d9565b61173c565b3480156106d757600080fd5b506103676117fa565b3480156106ec57600080fd5b506103f260155481565b34801561070257600080fd5b50610415600f81565b34801561071757600080fd5b5061036761072636600461340b565b611858565b34801561073757600080fd5b5060095461074b906001600160a01b031681565b6040516001600160a01b0390911681526020016103a4565b34801561076f57600080fd5b5061036761077e366004613428565b61189c565b34801561078f57600080fd5b5061079861190b565b604080519283526020830191909152016103a4565b3480156107b957600080fd5b506103f26107c836600461340b565b6001600160a01b031660009081526001602052604090205490565b3480156107ef57600080fd5b50610367611948565b34801561080457600080fd5b506103f2600d5481565b34801561081a57600080fd5b5061036761082936600461340b565b6119cb565b34801561083a57600080fd5b50610367611a62565b34801561084f57600080fd5b506019546103cd9060ff1681565b34801561086957600080fd5b506000546001600160a01b031661074b565b34801561088757600080fd5b5061036761089636600461340b565b611a86565b3480156108a757600080fd5b506040805180820190915260048152634249424f60e01b6020820152610397565b3480156108d457600080fd5b506103676108e336600461340b565b611b1d565b3480156108f457600080fd5b506103676109033660046134d9565b611bb4565b34801561091457600080fd5b506103676109233660046134f6565b611c32565b34801561093457600080fd5b506103cd61094336600461339e565b611e4b565b34801561095457600080fd5b506103cd61096336600461339e565b611ec7565b34801561097457600080fd5b506103676109833660046134d9565b611ed4565b34801561099457600080fd5b506103f2611f5c565b3480156109a957600080fd5b506103f2611f7c565b3480156109be57600080fd5b506103676109cd366004613428565b611fbb565b3480156109de57600080fd5b506103676109ed366004613428565b612015565b3480156109fe57600080fd5b506103f2610a0d366004613518565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a4457600080fd5b50610367610a53366004613428565b612083565b348015610a6457600080fd5b50600a5461074b906001600160a01b031681565b348015610a8457600080fd5b506103f2610a9336600461340b565b612127565b348015610aa457600080fd5b50610367610ab336600461340b565b612161565b348015610ac457600080fd5b50610367610ad336600461340b565b6121a5565b348015610ae457600080fd5b50610367610af336600461340b565b61229e565b6000610b053384846122f3565b5060015b92915050565b600033610b246000546001600160a01b031690565b6001600160a01b031614610b535760405162461bcd60e51b8152600401610b4a90613551565b60405180910390fd5b601a54421015610b755760405162461bcd60e51b8152600401610b4a90613586565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa91906135b0565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4a57600080fd5b505af1158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8291906135c9565b5060145447906001600160a01b031663af2979eb30846064610ca582604b6135fc565b610caf919061361b565b6064610cbc88604b6135fc565b610cc6919061361b565b30426040518763ffffffff1660e01b8152600401610ce99695949392919061363d565b602060405180830381600087803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3b91906135b0565b506000610d488247613678565b90508060156000828254610d5c919061368f565b909155509094505050505090565b610d766009600a61378b565b610d84906305f5e1006135fc565b81565b6000610d948484846123e6565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610dff5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b4a565b610e138533610e0e8685613678565b6122f3565b506001949350505050565b33610e316000546001600160a01b031690565b6001600160a01b031614610e575760405162461bcd60e51b8152600401610b4a90613551565b610e5f612643565b565b33610e746000546001600160a01b031690565b6001600160a01b031614610e9a5760405162461bcd60e51b8152600401610b4a90613551565b610ea5600682612796565b506040516001600160a01b038216906000805160206138ff83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b05918590610e0e90869061368f565b60008033610f186000546001600160a01b031690565b6001600160a01b031614610f3e5760405162461bcd60e51b8152600401610b4a90613551565b601a54421015610f605760405162461bcd60e51b8152600401610b4a90613586565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe591906135b0565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d91906135c9565b506009546040518281526001600160a01b039091169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36009546001600160a01b031693509150509091565b336110da6000546001600160a01b031690565b6001600160a01b0316146111005760405162461bcd60e51b8152600401610b4a90613551565b6015548111156111685760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b4a565b806015600082825461117a9190613678565b90915550506009546001600160a01b03166108fc606461119b8460426135fc565b6111a5919061361b565b6040518115909202916000818181858888f193505050501580156111cd573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111ea8460326135fc565b6111f4919061361b565b6111fe9084613678565b6040518115909202916000818181858888f19350505050158015611226573d6000803e3d6000fd5b5050565b3361123d6000546001600160a01b031690565b6001600160a01b0316146112635760405162461bcd60e51b8152600401610b4a90613551565b601a544210156112855760405162461bcd60e51b8152600401610b4a90613586565b6009546040516000916001600160a01b03169047908381818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b505090508061131b5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b4a565b50565b336113316000546001600160a01b031690565b6001600160a01b0316146113575760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b03811661137d5760405162461bcd60e51b8152600401610b4a9061379a565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336113ba6000546001600160a01b031690565b6001600160a01b0316146113e05760405162461bcd60e51b8152600401610b4a90613551565b6000846113ed87896137d1565b6113f791906137d1565b90508060ff1660641461145b5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b4a565b60148460ff1611156114d55760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b4a565b60148360ff16111561154f5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b4a565b60148260ff1611156115d45760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b4a565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138df83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138df83398151915290600090a260135460405160ff909116906000805160206138df83398151915290600090a260135460405161010090910460ff16906000805160206138df83398151915290600090a26013546040516201000090910460ff16906000805160206138df83398151915290600090a250505050505050565b3361174f6000546001600160a01b031690565b6001600160a01b0316146117755760405162461bcd60e51b8152600401610b4a90613551565b601954610100900460ff16156117dc5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742064697361626c65206f6e63652074726164696e6720697320656044820152651b98589b195960d21b6064820152608401610b4a565b601980549115156101000261ff001990921691909117905542601055565b3361180d6000546001600160a01b031690565b6001600160a01b0316146118335760405162461bcd60e51b8152600401610b4a90613551565b6015805460009091556009546001600160a01b03166108fc606461119b8460326135fc565b3361186b6000546001600160a01b031690565b6001600160a01b0316146118915760405162461bcd60e51b8152600401610b4a90613551565b610ea5600482612796565b336118af6000546001600160a01b031690565b6001600160a01b0316146118d55760405162461bcd60e51b8152600401610b4a90613551565b6118e76118e2428361368f565b6127ab565b6118f1428261368f565b6040516000805160206138df83398151915290600090a250565b60008061191a6009600a61378b565b600d54611927919061361b565b6119336009600a61378b565b600e54611940919061361b565b915091509091565b3361195b6000546001600160a01b031690565b6001600160a01b0316146119815760405162461bcd60e51b8152600401610b4a90613551565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119de6000546001600160a01b031690565b6001600160a01b031614611a045760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611a2a5760405162461bcd60e51b8152600401610b4a9061379a565b600a80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b601854611a6f904261368f565b33600090815260036020526040902055565b905090565b33611a996000546001600160a01b031690565b6001600160a01b031614611abf5760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611ae55760405162461bcd60e51b8152600401610b4a9061379a565b600b80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b33611b306000546001600160a01b031690565b6001600160a01b031614611b565760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611b7c5760405162461bcd60e51b8152600401610b4a9061379a565b600980546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b33611bc76000546001600160a01b031690565b6001600160a01b031614611bed5760405162461bcd60e51b8152600401610b4a90613551565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c456000546001600160a01b031690565b6001600160a01b031614611c6b5760405162461bcd60e51b8152600401610b4a90613551565b6064600c54611c7a919061361b565b8110611ce65760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b4a565b611cf26009600a61378b565b611cfc90836135fc565b9150611d0a6009600a61378b565b611d1490826135fc565b90506000603260ff16600c54611d2a919061361b565b90506000606461ffff16600c54611d41919061361b565b905081841015611da75760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b4a565b80831015611e085760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b4a565b600d849055600e83905560405184906000805160206138df83398151915290600090a2600e546040516000805160206138df83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eae5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b4a565b611ebd3385610e0e8685613678565b5060019392505050565b6000610b053384846123e6565b33611ee76000546001600160a01b031690565b6001600160a01b031614611f0d5760405162461bcd60e51b8152600401610b4a90613551565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f765742601a54611a819190613678565b50600090565b6000611f8a6009600a61378b565b600c54611f996009600a61378b565b611fa7906305f5e1006135fc565b611fb19190613678565b611a81919061361b565b33611fce6000546001600160a01b031690565b6001600160a01b031614611ff45760405162461bcd60e51b8152600401610b4a90613551565b600881905560405181906000805160206138df83398151915290600090a250565b336120286000546001600160a01b031690565b6001600160a01b03161461204e5760405162461bcd60e51b8152600401610b4a90613551565b61205a6009600a61378b565b61206490826135fc565b600f8190556040516000805160206138df83398151915290600090a250565b336120966000546001600160a01b031690565b6001600160a01b0316146120bc5760405162461bcd60e51b8152600401610b4a90613551565b600f8111156121065760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b4a565b601881905560405181906000805160206138df83398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121505750600092915050565b61215a4282613678565b9392505050565b336121746000546001600160a01b031690565b6001600160a01b03161461219a5760405162461bcd60e51b8152600401610b4a90613551565b610ea56006826122de565b336121b86000546001600160a01b031690565b6001600160a01b0316146121de5760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b0381166122435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b16000546001600160a01b031690565b6001600160a01b0316146122d75760405162461bcd60e51b8152600401610b4a90613551565b610ea56004825b600061215a836001600160a01b038416612835565b6001600160a01b03831661233d5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b4a565b6001600160a01b0382166123855760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b4a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124315760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b4a565b6001600160a01b03821661247a5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b4a565b6000612487600485612884565b806124985750612498600484612884565b905060006001600160a01b0385163014806124bb57506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156124fd5750816001600160a01b0316866001600160a01b0316145b8061253857506013546001600160a01b03878116600160301b909204161480156125385750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125725750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125ac5750836001600160a01b0316886001600160a01b0316145b905084806125b75750825b806125bf5750855b156125d4576125cf8989896128a6565b612638565b601954610100900460ff1661262b5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b4a565b6126388989898585612971565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061268b90640100000000810460ff90811691650100000000009004166137d1565b60ff16905060006008549050808310806126a7575061ffff8216155b156126b45750505061278a565b60135460009061ffff8416906126d590640100000000900460ff16846135fc565b6126df919061361b565b905060006126ed8284613678565b905060006126fc60028461361b565b9050600061270a8285613678565b90506000612718848361368f565b90504761272482612f3d565b60006127308247613678565b905060008361273f86846135fc565b612749919061361b565b905061275586826130a5565b50600090506127648447613678565b90508060156000828254612778919061368f565b90915550505050505050505050505050505b6017805460ff19169055565b600061215a836001600160a01b0384166131aa565b601a5481116128145760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b4a565b601a81905560405181906000805160206138df83398151915290600090a250565b600081815260018301602052604081205461287c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b09565b506000610b09565b6001600160a01b0381166000908152600183016020526040812054151561215a565b6001600160a01b0383166000908152600160205260409020548181101561290a5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b4a565b6129148483613297565b61291e83836132dc565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161296391815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129df5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b4a565b60008315612af257600e54861115612a2b5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b4a565b612a36600689612884565b15612a7a5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b4a565b601154601054612a8a919061368f565b4211158015612a9b57506012546001145b15612ae157612aab6006896122de565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dd8565b8415612c6557600d54612b05878561368f565b1115612b465760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b4a565b600f54861115612ba35760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b4a565b612bae600688612884565b15612bf25760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b4a565b601154601054612c02919061368f565b4211158015612c1357506012546001145b15612c5957612c236006886122de565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dd8565b612c70600689612884565b15612cbd5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b4a565b612cc8600688612884565b15612d155760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b4a565b600d54612d22878561368f565b1115612d635760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b4a565b601154601054612d73919061368f565b4211158015612d8457506012546001145b15612dca57612d946006896122de565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e00575060195460ff16155b8015612e0f575060175460ff16155b8015612e185750835b15612e2557612e25612643565b6000612e418783601360039054906101000a900460ff16613300565b601354909150600090612e779089908590612e729060ff6401000000008204811691650100000000009004166137d1565b613300565b90506000612e85828461368f565b612e8f908a613678565b9050612e9b8b8a613297565b3060009081526001602052604081208054849290612eba90849061368f565b9250508190555082600c6000828254612ed39190613678565b90915550612ee390508a826132dc565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f2891815260200190565b60405180910390a35050505050505050505050565b601454612f559030906001600160a01b0316836122f3565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8a57612f8a6137f6565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fde57600080fd5b505afa158015612ff2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613016919061380c565b81600181518110613029576130296137f6565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061306f908590600090869030904290600401613829565b600060405180830381600087803b15801561308957600080fd5b505af115801561309d573d6000803e3d6000fd5b505050505050565b60008082601660008282546130ba919061368f565b909155506000905060646130cf85604b6135fc565b6130d9919061361b565b9050600060646130ea87604b6135fc565b6130f4919061361b565b60145490915061310f9030906001600160a01b0316886122f3565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061314b9030908b90879089908490429060040161363d565b6060604051808303818588803b15801561316457600080fd5b505af1158015613178573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061319d919061389a565b5096979596505050505050565b6000818152600183016020526040812054801561328d5760006131ce600183613678565b85549091506000906131e290600190613678565b905060008660000182815481106131fb576131fb6137f6565b906000526020600020015490508087600001848154811061321e5761321e6137f6565b600091825260208083209091019290925582815260018901909152604090208490558654879080613251576132516138c8565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b09565b6000915050610b09565b6001600160a01b0382166000908152600160205260408120546132bb908390613678565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132bb90839061368f565b60006127108260ff168460ff168661331891906135fc565b61332291906135fc565b61332c919061361b565b949350505050565b600060208083528351808285015260005b8181101561336157858101830151858201604001528201613345565b81811115613373576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461131b57600080fd5b600080604083850312156133b157600080fd5b82356133bc81613389565b946020939093013593505050565b6000806000606084860312156133df57600080fd5b83356133ea81613389565b925060208401356133fa81613389565b929592945050506040919091013590565b60006020828403121561341d57600080fd5b813561215a81613389565b60006020828403121561343a57600080fd5b5035919050565b803560ff8116811461345257600080fd5b919050565b60008060008060008060c0878903121561347057600080fd5b61347987613441565b955061348760208801613441565b945061349560408801613441565b93506134a360608801613441565b92506134b160808801613441565b91506134bf60a08801613441565b90509295509295509295565b801515811461131b57600080fd5b6000602082840312156134eb57600080fd5b813561215a816134cb565b6000806040838503121561350957600080fd5b50508035926020909101359150565b6000806040838503121561352b57600080fd5b823561353681613389565b9150602083013561354681613389565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135c257600080fd5b5051919050565b6000602082840312156135db57600080fd5b815161215a816134cb565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613616576136166135e6565b500290565b60008261363857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561368a5761368a6135e6565b500390565b600082198211156136a2576136a26135e6565b500190565b600181815b808511156136e25781600019048211156136c8576136c86135e6565b808516156136d557918102915b93841c93908002906136ac565b509250929050565b6000826136f957506001610b09565b8161370657506000610b09565b816001811461371c576002811461372657613742565b6001915050610b09565b60ff841115613737576137376135e6565b50506001821b610b09565b5060208310610133831016604e8410600b8410161715613765575081810a610b09565b61376f83836136a7565b8060001904821115613783576137836135e6565b029392505050565b600061215a60ff8416836136ea565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137ee576137ee6135e6565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561381e57600080fd5b815161215a81613389565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138795784516001600160a01b031683529383019391830191600101613854565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156138af57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212204601d4c26956c491c8fca2c8c5fcab6eca1bcd640ba3e24a18805173a536ab1864736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a78578063f2c816ae14610a98578063f2fde38b14610ab8578063f9ab736614610ad857005b8063daf9a47a146109d2578063dd62ed3e146109f2578063e2fd002a14610a38578063e60ccfb014610a5857005b8063b766a386116100d3578063b766a38614610968578063c3a3c03214610988578063c3f4f54f1461099d578063d11edf74146109b257005b80639fa62d5f14610908578063a457c2d714610928578063a9059cbb1461094857005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087b57806395d89b411461089b5780639bc845fb146108c85780639bf65770146108e857005b8063828e8b7e1461082e57806386d0ada814610843578063893d20e81461085d5780638da5cb5b1461085d57005b806370a08231116101a157806370a08231146107ad578063715018a6146107e3578063762bb282146107f85780637e9ae5da1461080e57005b8063677a88701461072b5780636eb8c7f1146107635780636f89e4091461078357005b8063395093511161029d5780634cdaf0ae1161024157806358e1df921161021357806358e1df92146106cb57806358e55365146106e05780635c69f690146106f657806361cb27481461070b57005b80634cdaf0ae146106555780634f91e48c1461067557806357ad67d11461068b57806358780a82146106ab57005b80634476f35a1161027a5780634476f35a146105eb57806344f3c83a1461060b5780634ada218b146106215780634cbf8e241461064057005b806339509351146105815780633c7a309b146105a15780633cc39b7a146105d557005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610507578063311a869714610526578063313ce5671461054d57806335e82f3a1461056157005b806323b872dd14610467578063243b529a146104875780632973ef2d1461049c57005b80630fd99e161161033d5780630fd99e161461040057806314ddc0951461042857806318160ddd1461043d5780631eb25d131461045257005b806306fdde0314610369578063095ea7b3146103ad5780630fa5b215146103dd57005b3661036757005b005b34801561037557600080fd5b506040805180820190915260098152684269626f732044414f60b81b60208201525b6040516103a49190613334565b60405180910390f35b3480156103b957600080fd5b506103cd6103c836600461339e565b610af8565b60405190151581526020016103a4565b3480156103e957600080fd5b506103f2610b0f565b6040519081526020016103a4565b34801561040c57600080fd5b50610415606481565b60405161ffff90911681526020016103a4565b34801561043457600080fd5b506018546103f2565b34801561044957600080fd5b50600c546103f2565b34801561045e57600080fd5b506103f2610d6a565b34801561047357600080fd5b506103cd6104823660046133ca565b610d87565b34801561049357600080fd5b50610367610e1e565b3480156104a857600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a4565b34801561051357600080fd5b506017546103cd90610100900460ff1681565b34801561053257600080fd5b5061053b603281565b60405160ff90911681526020016103a4565b34801561055957600080fd5b50600961053b565b34801561056d57600080fd5b5061036761057c36600461340b565b610e61565b34801561058d57600080fd5b506103cd61059c36600461339e565b610ecb565b3480156105ad57600080fd5b506105b6610f02565b604080516001600160a01b0390931683526020830191909152016103a4565b3480156105e157600080fd5b506103f260165481565b3480156105f757600080fd5b50610367610606366004613428565b6110c7565b34801561061757600080fd5b506103f260185481565b34801561062d57600080fd5b506019546103cd90610100900460ff1681565b34801561064c57600080fd5b5061036761122a565b34801561066157600080fd5b5061036761067036600461340b565b61131e565b34801561068157600080fd5b506103f2600e5481565b34801561069757600080fd5b506103676106a6366004613457565b6113a7565b3480156106b757600080fd5b506103676106c63660046134d9565b61173c565b3480156106d757600080fd5b506103676117fa565b3480156106ec57600080fd5b506103f260155481565b34801561070257600080fd5b50610415600f81565b34801561071757600080fd5b5061036761072636600461340b565b611858565b34801561073757600080fd5b5060095461074b906001600160a01b031681565b6040516001600160a01b0390911681526020016103a4565b34801561076f57600080fd5b5061036761077e366004613428565b61189c565b34801561078f57600080fd5b5061079861190b565b604080519283526020830191909152016103a4565b3480156107b957600080fd5b506103f26107c836600461340b565b6001600160a01b031660009081526001602052604090205490565b3480156107ef57600080fd5b50610367611948565b34801561080457600080fd5b506103f2600d5481565b34801561081a57600080fd5b5061036761082936600461340b565b6119cb565b34801561083a57600080fd5b50610367611a62565b34801561084f57600080fd5b506019546103cd9060ff1681565b34801561086957600080fd5b506000546001600160a01b031661074b565b34801561088757600080fd5b5061036761089636600461340b565b611a86565b3480156108a757600080fd5b506040805180820190915260048152634249424f60e01b6020820152610397565b3480156108d457600080fd5b506103676108e336600461340b565b611b1d565b3480156108f457600080fd5b506103676109033660046134d9565b611bb4565b34801561091457600080fd5b506103676109233660046134f6565b611c32565b34801561093457600080fd5b506103cd61094336600461339e565b611e4b565b34801561095457600080fd5b506103cd61096336600461339e565b611ec7565b34801561097457600080fd5b506103676109833660046134d9565b611ed4565b34801561099457600080fd5b506103f2611f5c565b3480156109a957600080fd5b506103f2611f7c565b3480156109be57600080fd5b506103676109cd366004613428565b611fbb565b3480156109de57600080fd5b506103676109ed366004613428565b612015565b3480156109fe57600080fd5b506103f2610a0d366004613518565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a4457600080fd5b50610367610a53366004613428565b612083565b348015610a6457600080fd5b50600a5461074b906001600160a01b031681565b348015610a8457600080fd5b506103f2610a9336600461340b565b612127565b348015610aa457600080fd5b50610367610ab336600461340b565b612161565b348015610ac457600080fd5b50610367610ad336600461340b565b6121a5565b348015610ae457600080fd5b50610367610af336600461340b565b61229e565b6000610b053384846122f3565b5060015b92915050565b600033610b246000546001600160a01b031690565b6001600160a01b031614610b535760405162461bcd60e51b8152600401610b4a90613551565b60405180910390fd5b601a54421015610b755760405162461bcd60e51b8152600401610b4a90613586565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa91906135b0565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4a57600080fd5b505af1158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8291906135c9565b5060145447906001600160a01b031663af2979eb30846064610ca582604b6135fc565b610caf919061361b565b6064610cbc88604b6135fc565b610cc6919061361b565b30426040518763ffffffff1660e01b8152600401610ce99695949392919061363d565b602060405180830381600087803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3b91906135b0565b506000610d488247613678565b90508060156000828254610d5c919061368f565b909155509094505050505090565b610d766009600a61378b565b610d84906305f5e1006135fc565b81565b6000610d948484846123e6565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610dff5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b4a565b610e138533610e0e8685613678565b6122f3565b506001949350505050565b33610e316000546001600160a01b031690565b6001600160a01b031614610e575760405162461bcd60e51b8152600401610b4a90613551565b610e5f612643565b565b33610e746000546001600160a01b031690565b6001600160a01b031614610e9a5760405162461bcd60e51b8152600401610b4a90613551565b610ea5600682612796565b506040516001600160a01b038216906000805160206138ff83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b05918590610e0e90869061368f565b60008033610f186000546001600160a01b031690565b6001600160a01b031614610f3e5760405162461bcd60e51b8152600401610b4a90613551565b601a54421015610f605760405162461bcd60e51b8152600401610b4a90613586565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe591906135b0565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d91906135c9565b506009546040518281526001600160a01b039091169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36009546001600160a01b031693509150509091565b336110da6000546001600160a01b031690565b6001600160a01b0316146111005760405162461bcd60e51b8152600401610b4a90613551565b6015548111156111685760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b4a565b806015600082825461117a9190613678565b90915550506009546001600160a01b03166108fc606461119b8460426135fc565b6111a5919061361b565b6040518115909202916000818181858888f193505050501580156111cd573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111ea8460326135fc565b6111f4919061361b565b6111fe9084613678565b6040518115909202916000818181858888f19350505050158015611226573d6000803e3d6000fd5b5050565b3361123d6000546001600160a01b031690565b6001600160a01b0316146112635760405162461bcd60e51b8152600401610b4a90613551565b601a544210156112855760405162461bcd60e51b8152600401610b4a90613586565b6009546040516000916001600160a01b03169047908381818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b505090508061131b5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b4a565b50565b336113316000546001600160a01b031690565b6001600160a01b0316146113575760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b03811661137d5760405162461bcd60e51b8152600401610b4a9061379a565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336113ba6000546001600160a01b031690565b6001600160a01b0316146113e05760405162461bcd60e51b8152600401610b4a90613551565b6000846113ed87896137d1565b6113f791906137d1565b90508060ff1660641461145b5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b4a565b60148460ff1611156114d55760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b4a565b60148360ff16111561154f5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b4a565b60148260ff1611156115d45760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b4a565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138df83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138df83398151915290600090a260135460405160ff909116906000805160206138df83398151915290600090a260135460405161010090910460ff16906000805160206138df83398151915290600090a26013546040516201000090910460ff16906000805160206138df83398151915290600090a250505050505050565b3361174f6000546001600160a01b031690565b6001600160a01b0316146117755760405162461bcd60e51b8152600401610b4a90613551565b601954610100900460ff16156117dc5760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742064697361626c65206f6e63652074726164696e6720697320656044820152651b98589b195960d21b6064820152608401610b4a565b601980549115156101000261ff001990921691909117905542601055565b3361180d6000546001600160a01b031690565b6001600160a01b0316146118335760405162461bcd60e51b8152600401610b4a90613551565b6015805460009091556009546001600160a01b03166108fc606461119b8460326135fc565b3361186b6000546001600160a01b031690565b6001600160a01b0316146118915760405162461bcd60e51b8152600401610b4a90613551565b610ea5600482612796565b336118af6000546001600160a01b031690565b6001600160a01b0316146118d55760405162461bcd60e51b8152600401610b4a90613551565b6118e76118e2428361368f565b6127ab565b6118f1428261368f565b6040516000805160206138df83398151915290600090a250565b60008061191a6009600a61378b565b600d54611927919061361b565b6119336009600a61378b565b600e54611940919061361b565b915091509091565b3361195b6000546001600160a01b031690565b6001600160a01b0316146119815760405162461bcd60e51b8152600401610b4a90613551565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119de6000546001600160a01b031690565b6001600160a01b031614611a045760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611a2a5760405162461bcd60e51b8152600401610b4a9061379a565b600a80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b601854611a6f904261368f565b33600090815260036020526040902055565b905090565b33611a996000546001600160a01b031690565b6001600160a01b031614611abf5760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611ae55760405162461bcd60e51b8152600401610b4a9061379a565b600b80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b33611b306000546001600160a01b031690565b6001600160a01b031614611b565760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b038116611b7c5760405162461bcd60e51b8152600401610b4a9061379a565b600980546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138ff83398151915290600090a250565b33611bc76000546001600160a01b031690565b6001600160a01b031614611bed5760405162461bcd60e51b8152600401610b4a90613551565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c456000546001600160a01b031690565b6001600160a01b031614611c6b5760405162461bcd60e51b8152600401610b4a90613551565b6064600c54611c7a919061361b565b8110611ce65760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b4a565b611cf26009600a61378b565b611cfc90836135fc565b9150611d0a6009600a61378b565b611d1490826135fc565b90506000603260ff16600c54611d2a919061361b565b90506000606461ffff16600c54611d41919061361b565b905081841015611da75760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b4a565b80831015611e085760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b4a565b600d849055600e83905560405184906000805160206138df83398151915290600090a2600e546040516000805160206138df83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eae5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b4a565b611ebd3385610e0e8685613678565b5060019392505050565b6000610b053384846123e6565b33611ee76000546001600160a01b031690565b6001600160a01b031614611f0d5760405162461bcd60e51b8152600401610b4a90613551565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f765742601a54611a819190613678565b50600090565b6000611f8a6009600a61378b565b600c54611f996009600a61378b565b611fa7906305f5e1006135fc565b611fb19190613678565b611a81919061361b565b33611fce6000546001600160a01b031690565b6001600160a01b031614611ff45760405162461bcd60e51b8152600401610b4a90613551565b600881905560405181906000805160206138df83398151915290600090a250565b336120286000546001600160a01b031690565b6001600160a01b03161461204e5760405162461bcd60e51b8152600401610b4a90613551565b61205a6009600a61378b565b61206490826135fc565b600f8190556040516000805160206138df83398151915290600090a250565b336120966000546001600160a01b031690565b6001600160a01b0316146120bc5760405162461bcd60e51b8152600401610b4a90613551565b600f8111156121065760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b4a565b601881905560405181906000805160206138df83398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121505750600092915050565b61215a4282613678565b9392505050565b336121746000546001600160a01b031690565b6001600160a01b03161461219a5760405162461bcd60e51b8152600401610b4a90613551565b610ea56006826122de565b336121b86000546001600160a01b031690565b6001600160a01b0316146121de5760405162461bcd60e51b8152600401610b4a90613551565b6001600160a01b0381166122435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b16000546001600160a01b031690565b6001600160a01b0316146122d75760405162461bcd60e51b8152600401610b4a90613551565b610ea56004825b600061215a836001600160a01b038416612835565b6001600160a01b03831661233d5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b4a565b6001600160a01b0382166123855760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b4a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124315760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b4a565b6001600160a01b03821661247a5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b4a565b6000612487600485612884565b806124985750612498600484612884565b905060006001600160a01b0385163014806124bb57506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156124fd5750816001600160a01b0316866001600160a01b0316145b8061253857506013546001600160a01b03878116600160301b909204161480156125385750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125725750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125ac5750836001600160a01b0316886001600160a01b0316145b905084806125b75750825b806125bf5750855b156125d4576125cf8989896128a6565b612638565b601954610100900460ff1661262b5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b4a565b6126388989898585612971565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061268b90640100000000810460ff90811691650100000000009004166137d1565b60ff16905060006008549050808310806126a7575061ffff8216155b156126b45750505061278a565b60135460009061ffff8416906126d590640100000000900460ff16846135fc565b6126df919061361b565b905060006126ed8284613678565b905060006126fc60028461361b565b9050600061270a8285613678565b90506000612718848361368f565b90504761272482612f3d565b60006127308247613678565b905060008361273f86846135fc565b612749919061361b565b905061275586826130a5565b50600090506127648447613678565b90508060156000828254612778919061368f565b90915550505050505050505050505050505b6017805460ff19169055565b600061215a836001600160a01b0384166131aa565b601a5481116128145760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b4a565b601a81905560405181906000805160206138df83398151915290600090a250565b600081815260018301602052604081205461287c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b09565b506000610b09565b6001600160a01b0381166000908152600183016020526040812054151561215a565b6001600160a01b0383166000908152600160205260409020548181101561290a5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b4a565b6129148483613297565b61291e83836132dc565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161296391815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129df5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b4a565b60008315612af257600e54861115612a2b5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b4a565b612a36600689612884565b15612a7a5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b4a565b601154601054612a8a919061368f565b4211158015612a9b57506012546001145b15612ae157612aab6006896122de565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dd8565b8415612c6557600d54612b05878561368f565b1115612b465760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b4a565b600f54861115612ba35760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b4a565b612bae600688612884565b15612bf25760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b4a565b601154601054612c02919061368f565b4211158015612c1357506012546001145b15612c5957612c236006886122de565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dd8565b612c70600689612884565b15612cbd5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b4a565b612cc8600688612884565b15612d155760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b4a565b600d54612d22878561368f565b1115612d635760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b4a565b601154601054612d73919061368f565b4211158015612d8457506012546001145b15612dca57612d946006896122de565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e00575060195460ff16155b8015612e0f575060175460ff16155b8015612e185750835b15612e2557612e25612643565b6000612e418783601360039054906101000a900460ff16613300565b601354909150600090612e779089908590612e729060ff6401000000008204811691650100000000009004166137d1565b613300565b90506000612e85828461368f565b612e8f908a613678565b9050612e9b8b8a613297565b3060009081526001602052604081208054849290612eba90849061368f565b9250508190555082600c6000828254612ed39190613678565b90915550612ee390508a826132dc565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f2891815260200190565b60405180910390a35050505050505050505050565b601454612f559030906001600160a01b0316836122f3565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8a57612f8a6137f6565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fde57600080fd5b505afa158015612ff2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613016919061380c565b81600181518110613029576130296137f6565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061306f908590600090869030904290600401613829565b600060405180830381600087803b15801561308957600080fd5b505af115801561309d573d6000803e3d6000fd5b505050505050565b60008082601660008282546130ba919061368f565b909155506000905060646130cf85604b6135fc565b6130d9919061361b565b9050600060646130ea87604b6135fc565b6130f4919061361b565b60145490915061310f9030906001600160a01b0316886122f3565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061314b9030908b90879089908490429060040161363d565b6060604051808303818588803b15801561316457600080fd5b505af1158015613178573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061319d919061389a565b5096979596505050505050565b6000818152600183016020526040812054801561328d5760006131ce600183613678565b85549091506000906131e290600190613678565b905060008660000182815481106131fb576131fb6137f6565b906000526020600020015490508087600001848154811061321e5761321e6137f6565b600091825260208083209091019290925582815260018901909152604090208490558654879080613251576132516138c8565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b09565b6000915050610b09565b6001600160a01b0382166000908152600160205260408120546132bb908390613678565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132bb90839061368f565b60006127108260ff168460ff168661331891906135fc565b61332291906135fc565b61332c919061361b565b949350505050565b600060208083528351808285015260005b8181101561336157858101830151858201604001528201613345565b81811115613373576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461131b57600080fd5b600080604083850312156133b157600080fd5b82356133bc81613389565b946020939093013593505050565b6000806000606084860312156133df57600080fd5b83356133ea81613389565b925060208401356133fa81613389565b929592945050506040919091013590565b60006020828403121561341d57600080fd5b813561215a81613389565b60006020828403121561343a57600080fd5b5035919050565b803560ff8116811461345257600080fd5b919050565b60008060008060008060c0878903121561347057600080fd5b61347987613441565b955061348760208801613441565b945061349560408801613441565b93506134a360608801613441565b92506134b160808801613441565b91506134bf60a08801613441565b90509295509295509295565b801515811461131b57600080fd5b6000602082840312156134eb57600080fd5b813561215a816134cb565b6000806040838503121561350957600080fd5b50508035926020909101359150565b6000806040838503121561352b57600080fd5b823561353681613389565b9150602083013561354681613389565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135c257600080fd5b5051919050565b6000602082840312156135db57600080fd5b815161215a816134cb565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613616576136166135e6565b500290565b60008261363857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561368a5761368a6135e6565b500390565b600082198211156136a2576136a26135e6565b500190565b600181815b808511156136e25781600019048211156136c8576136c86135e6565b808516156136d557918102915b93841c93908002906136ac565b509250929050565b6000826136f957506001610b09565b8161370657506000610b09565b816001811461371c576002811461372657613742565b6001915050610b09565b60ff841115613737576137376135e6565b50506001821b610b09565b5060208310610133831016604e8410600b8410161715613765575081810a610b09565b61376f83836136a7565b8060001904821115613783576137836135e6565b029392505050565b600061215a60ff8416836136ea565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137ee576137ee6135e6565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561381e57600080fd5b815161215a81613389565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138795784516001600160a01b031683529383019391830191600101613854565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156138af57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212204601d4c26956c491c8fca2c8c5fcab6eca1bcd640ba3e24a18805173a536ab1864736f6c63430008090033

Deployed Bytecode Sourcemap

27719:28426:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53799:94;;;;;;;;;;-1:-1:-1;53880:5:0;;;;;;;;;;;;-1:-1:-1;;;53880:5:0;;;;53799:94;;;;;;;:::i;:::-;;;;;;;;54684:161;;;;;;;;;;-1:-1:-1;54684:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;54684:161:0;1072:187:1;51900:1015:0;;;;;;;;;;;;;:::i;:::-;;;1410:25:1;;;1398:2;1383:18;51900:1015:0;1264:177:1;28861:43:0;;;;;;;;;;;;28901:3;28861:43;;;;;1620:6:1;1608:19;;;1590:38;;1578:2;1563:18;28861:43:0;1446:188:1;42713:102:0;;;;;;;;;;-1:-1:-1;42796:11:0;;42713:102;;54109:108;;;;;;;;;;-1:-1:-1;54191:18:0;;54109:108;;28518:64;;;;;;;;;;;;;:::i;55158:392::-;;;;;;;;;;-1:-1:-1;55158:392:0;;;;;:::i;:::-;;:::i;47940:83::-;;;;;;;;;;;;;:::i;42117:249::-;;;;;;;;;;-1:-1:-1;42291:8:0;;42117:249;;;42291:8;;;;;;2387:25:1;;42300:13:0;;;;;2443:2:1;2428:18;;2421:34;42314:13:0;;;;;2471:18:1;;;2464:34;;;;42328:7:0;;;2529:2:1;2514:18;;2507:34;42291:8:0;42336;;;;2572:3:1;2557:19;;2550:35;42345:12:0;;;;;2616:3:1;2601:19;;2594:35;2374:3;2359:19;42117:249:0;2100:535:1;43184:27:0;;;;;;;;;;-1:-1:-1;43184:27:0;;;;;;;;;;;28748:44;;;;;;;;;;;;28790:2;28748:44;;;;;2812:4:1;2800:17;;;2782:36;;2770:2;2755:18;28748:44:0;2640:184:1;54007:94:0;;;;;;;;;;-1:-1:-1;28510:1:0;54007:94;;46539:201;;;;;;;;;;-1:-1:-1;46539:201:0;;;;;:::i;:::-;;:::i;55585:205::-;;;;;;;;;;-1:-1:-1;55585:205:0;;;;;:::i;:::-;;:::i;51147:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3273:32:1;;;3255:51;;3337:2;3322:18;;3315:34;;;;3228:18;51147:695:0;3081:274:1;38158:25:0;;;;;;;;;;;;;;;;43560:342;;;;;;;;;;-1:-1:-1;43560:342:0;;;;;:::i;:::-;;:::i;43218:26::-;;;;;;;;;;;;;;;;49558;;;;;;;;;;-1:-1:-1;49558:26:0;;;;;;;;;;;53001:268;;;;;;;;;;;;;:::i;49964:243::-;;;;;;;;;;-1:-1:-1;49964:243:0;;;;;:::i;:::-;;:::i;29803:46::-;;;;;;;;;;;;;;;;46838:1048;;;;;;;;;;-1:-1:-1;46838:1048:0;;;;;:::i;:::-;;:::i;49671:227::-;;;;;;;;;;-1:-1:-1;49671:227:0;;;;;:::i;:::-;;:::i;43289:264::-;;;;;;;;;;;;;:::i;37420:31::-;;;;;;;;;;;;;;;;29041:49;;;;;;;;;;;;29080:10;29041:49;;46004:181;;;;;;;;;;-1:-1:-1;46004:181:0;;;;;:::i;:::-;;:::i;29257:77::-;;;;;;;;;;-1:-1:-1;29257:77:0;;;;-1:-1:-1;;;;;29257:77:0;;;;;;-1:-1:-1;;;;;4779:32:1;;;4761:51;;4749:2;4734:18;29257:77:0;4615:203:1;50454:232:0;;;;;;;;;;-1:-1:-1;50454:232:0;;;;;:::i;:::-;;:::i;41958:151::-;;;;;;;;;;;;;:::i;:::-;;;;4997:25:1;;;5053:2;5038:18;;5031:34;;;;4970:18;41958:151:0;4823:248:1;54225:121:0;;;;;;;;;;-1:-1:-1;54225:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54320:18:0;54293:7;54320:18;;;:9;:18;;;;;;;54225:121;9575:142;;;;;;;;;;;;;:::i;29747:49::-;;;;;;;;;;;;;;;;44598:270;;;;;;;;;;-1:-1:-1;44598:270:0;;;;;:::i;:::-;;:::i;42957:109::-;;;;;;;;;;;;;:::i;43251:28::-;;;;;;;;;;-1:-1:-1;43251:28:0;;;;;;;;53697:94;;;;;;;;;;-1:-1:-1;53749:7:0;8999:6;-1:-1:-1;;;;;8999:6:0;53697:94;;48035:245;;;;;;;;;;-1:-1:-1;48035:245:0;;;;;:::i;:::-;;:::i;53901:98::-;;;;;;;;;;-1:-1:-1;53984:7:0;;;;;;;;;;;;-1:-1:-1;;;53984:7:0;;;;53901:98;;44334:252;;;;;;;;;;-1:-1:-1;44334:252:0;;;;;:::i;:::-;;:::i;43987:165::-;;;;;;;;;;-1:-1:-1;43987:165:0;;;;;:::i;:::-;;:::i;48383:1045::-;;;;;;;;;;-1:-1:-1;48383:1045:0;;;;;:::i;:::-;;:::i;55798:342::-;;;;;;;;;;-1:-1:-1;55798:342:0;;;;;:::i;:::-;;:::i;54354:167::-;;;;;;;;;;-1:-1:-1;54354:167:0;;;;;:::i;:::-;;:::i;44929:156::-;;;;;;;;;;-1:-1:-1;44929:156:0;;;;;:::i;:::-;;:::i;41589:222::-;;;;;;;;;;;;;:::i;41819:131::-;;;;;;;;;;;;;:::i;45524:179::-;;;;;;;;;;-1:-1:-1;45524:179:0;;;;;:::i;:::-;;:::i;44158:164::-;;;;;;;;;;-1:-1:-1;44158:164:0;;;;;:::i;:::-;;:::i;54529:147::-;;;;;;;;;;-1:-1:-1;54529:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54640:19:0;;;54613:7;54640:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54529:147;45154:246;;;;;;;;;;-1:-1:-1;45154:246:0;;;;;:::i;:::-;;:::i;29341:80::-;;;;;;;;;;-1:-1:-1;29341:80:0;;;;-1:-1:-1;;;;;29341:80:0;;;42432:275;;;;;;;;;;-1:-1:-1;42432:275:0;;;;;:::i;:::-;;:::i;46265:193::-;;;;;;;;;;-1:-1:-1;46265:193:0;;;;;:::i;:::-;;:::i;9872:238::-;;;;;;;;;;-1:-1:-1;9872:238:0;;;;;:::i;:::-;;:::i;45771:166::-;;;;;;;;;;-1:-1:-1;45771:166:0;;;;;:::i;:::-;;:::i;54684:161::-;54761:4;54778:37;54787:10;54799:7;54808:6;54778:8;:37::i;:::-;-1:-1:-1;54833:4:0;54684:161;;;;;:::o;51900:1015::-;51959:18;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;;;;;;;;;52075:20:::1;;52056:15;:39;;52048:68;;;;-1:-1:-1::0;;;52048:68:0::1;;;;;;;:::i;:::-;52176:22;::::0;52227:39:::1;::::0;-1:-1:-1;;;52227:39:0;;52260:4:::1;52227:39;::::0;::::1;4761:51:1::0;52176:22:0;;;::::1;-1:-1:-1::0;;;;;52176:22:0::1;::::0;52127:30:::1;::::0;52176:22;;52227:24:::1;::::0;4734:18:1;;52227:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52310:16;::::0;52279:56:::1;::::0;-1:-1:-1;;;52279:56:0;;-1:-1:-1;;;;;52310:16:0;;::::1;52279:56;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;52210:56:0;;-1:-1:-1;52279:22:0;::::1;::::0;::::1;::::0;3228:18:1;;52279:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52478:16:0::1;::::0;52436:21:::1;::::0;-1:-1:-1;;;;;52478:16:0::1;:64;52565:4;52585:6:::0;52620:3:::1;52607:9;52585:6:::0;52614:2:::1;52607:9;:::i;:::-;52606:17;;;;:::i;:::-;52652:3;52639:9;:6:::0;52646:2:::1;52639:9;:::i;:::-;52638:17;;;;:::i;:::-;52678:4;52698:15;52478:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52739:21:0::1;52763:39;52785:17:::0;52763:21:::1;:39;:::i;:::-;52739:63;;52831:13;52813:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52866:13:0;;-1:-1:-1;;;;;51900:1015:0;:::o;28518:64::-;28569:13;28510:1;28569:2;:13;:::i;:::-;28557:25;;:9;:25;:::i;:::-;28518:64;:::o;55158:392::-;55258:4;55275:36;55285:6;55293:9;55304:6;55275:9;:36::i;:::-;-1:-1:-1;;;;;55351:19:0;;55324:24;55351:19;;;:11;:19;;;;;;;;55371:10;55351:31;;;;;;;;55401:26;;;;55393:59;;;;-1:-1:-1;;;55393:59:0;;9838:2:1;55393:59:0;;;9820:21:1;9877:2;9857:18;;;9850:30;-1:-1:-1;;;9896:18:1;;;9889:50;9956:18;;55393:59:0;9636:344:1;55393:59:0;55465:55;55474:6;55482:10;55494:25;55513:6;55494:16;:25;:::i;:::-;55465:8;:55::i;:::-;-1:-1:-1;55538:4:0;;55158:392;-1:-1:-1;;;;55158:392:0:o;47940:83::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;47995:20:::1;:18;:20::i;:::-;47940:83::o:0;46539:201::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46633:41:::1;:14;46655:18:::0;46633:21:::1;:41::i;:::-;-1:-1:-1::0;46690:42:0::1;::::0;-1:-1:-1;;;;;46690:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46690:42:0;;;::::1;46539:201:::0;:::o;55585:205::-;55693:10;55667:4;55714:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55714:32:0;;;;;;;;;;55667:4;;55684:76;;55705:7;;55714:45;;55749:10;;55714:45;:::i;51147:695::-;51207:17;;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;51342:20:::1;;51323:15;:39;;51315:68;;;;-1:-1:-1::0;;;51315:68:0::1;;;;;;;:::i;:::-;51453:22;::::0;51504:39:::1;::::0;-1:-1:-1;;;51504:39:0;;51537:4:::1;51504:39;::::0;::::1;4761:51:1::0;51453:22:0;;;::::1;-1:-1:-1::0;;;;;51453:22:0::1;::::0;51404:30:::1;::::0;51453:22;;51504:24:::1;::::0;4734:18:1;;51504:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51642:10;::::0;51618:43:::1;::::0;-1:-1:-1;;;51618:43:0;;-1:-1:-1;;;;;51642:10:0;;::::1;51618:43;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;51487:56:0;;-1:-1:-1;51618:23:0;::::1;::::0;::::1;::::0;3228:18:1;;51618:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51701:10:0::1;::::0;51677:43:::1;::::0;1410:25:1;;;-1:-1:-1;;;;;51701:10:0;;::::1;::::0;51694:4:::1;::::0;51677:43:::1;::::0;1398:2:1;1383:18;51677:43:0::1;;;;;;;51743:10;::::0;-1:-1:-1;;;;;51743:10:0::1;::::0;-1:-1:-1;51777:6:0;-1:-1:-1;;51147:695:0;;:::o;43560:342::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;43656:16:::1;;43648:6;:24;;43640:91;;;::::0;-1:-1:-1;;;43640:91:0;;10187:2:1;43640:91:0::1;::::0;::::1;10169:21:1::0;10226:2;10206:18;;;10199:30;10265:34;10245:18;;;10238:62;-1:-1:-1;;;10316:18:1;;;10309:43;10369:19;;43640:91:0::1;9985:409:1::0;43640:91:0::1;43760:6;43742:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43785:10:0::1;::::0;-1:-1:-1;;;;;43785:10:0::1;43777:47;43820:3;43807:9;:6:::0;43814:2:::1;43807:9;:::i;:::-;43806:17;;;;:::i;:::-;43777:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43843:13:0::1;::::0;-1:-1:-1;;;;;43843:13:0::1;43835:59;43889:3;43876:9;:6:::0;43883:2:::1;43876:9;:::i;:::-;43875:17;;;;:::i;:::-;43868:24;::::0;:6;:24:::1;:::i;:::-;43835:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43560:342:::0;:::o;53001:268::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;53091:20:::1;;53072:15;:39;;53064:68;;;;-1:-1:-1::0;;;53064:68:0::1;;;;;;;:::i;:::-;53157:10;::::0;:51:::1;::::0;53144:9:::1;::::0;-1:-1:-1;;;;;53157:10:0::1;::::0;53181:21:::1;::::0;53144:9;53157:51;53144:9;53157:51;53181:21;53157:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53143:65;;;53227:4;53219:42;;;::::0;-1:-1:-1;;;53219:42:0;;10811:2:1;53219:42:0::1;::::0;::::1;10793:21:1::0;10850:2;10830:18;;;10823:30;-1:-1:-1;;;10869:18:1;;;10862:46;10925:18;;53219:42:0::1;10609:340:1::0;53219:42:0::1;53053:216;53001:268::o:0;49964:243::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50068:35:0;::::1;50060:84;;;;-1:-1:-1::0;;;50060:84:0::1;;;;;;;:::i;:::-;50155:22;:44:::0;;-1:-1:-1;;;;;50155:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50155:44:0;;::::1;::::0;;;::::1;::::0;;49964:243::o;46838:1048::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46998:14:::1;47038::::0;47013:24:::1;47023:14:::0;47013:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;46998:54;;47071:8;:13;;47081:3;47071:13;47063:64;;;::::0;-1:-1:-1;;;47063:64:0;;11721:2:1;47063:64:0::1;::::0;::::1;11703:21:1::0;11760:2;11740:18;;;11733:30;11799:34;11779:18;;;11772:62;-1:-1:-1;;;11850:18:1;;;11843:36;11896:19;;47063:64:0::1;11519:402:1::0;47063:64:0::1;47156:2;47146:6;:12;;;;47138:95;;;::::0;-1:-1:-1;;;47138:95:0;;12128:2:1;47138:95:0::1;::::0;::::1;12110:21:1::0;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;12277:31;12257:18;;;12250:59;12326:19;;47138:95:0::1;11926:425:1::0;47138:95:0::1;47263:2;47252:7;:13;;;;47244:97;;;::::0;-1:-1:-1;;;47244:97:0;;12558:2:1;47244:97:0::1;::::0;::::1;12540:21:1::0;12597:2;12577:18;;;12570:30;12636:34;12616:18;;;12609:62;12707:32;12687:18;;;12680:60;12757:19;;47244:97:0::1;12356:426:1::0;47244:97:0::1;47375:2;47360:11;:17;;;;47352:105;;;::::0;-1:-1:-1;;;47352:105:0;;12989:2:1;47352:105:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;13067:34;13047:18;;;13040:62;13138:34;13118:18;;;13111:62;-1:-1:-1;;;13189:19:1;;;13182:33;13232:19;;47352:105:0::1;12787:470:1::0;47352:105:0::1;47479:9;47470:8;;:18;;;;;;;;;;;;;;;;;;47513:14;47499:13;;:28;;;;;;;;;;;;;;;;;;47552:14;47538:13;;:28;;;;;;;;;;;;;;;;;;47595:6;47587:7;;:14;;;;;;;;;;;;;;;;;;47621:7;47612:8;;:16;;;;;;;;;;;;;;;;;;47652:11;47639:12;;:24;;;;;;;;;;;;;;;;;;47697:8;;;;;;;;;;;47681:25;;-1:-1:-1::0;;;;;;;;;;;47681:25:0::1;;;;;;;;;47738:13;::::0;47722:30:::1;::::0;47738:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47722:30:0;;;::::1;47784:7;::::0;47768:24:::1;::::0;47784:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;47768:24:0;47784:7:::1;::::0;47768:24:::1;47824:8;::::0;47808:25:::1;::::0;47824:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47808:25:0;;;::::1;47865:12;::::0;47849:29:::1;::::0;47865:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47849:29:0;;;::::1;46987:899;46838:1048:::0;;;;;;:::o;49671:227::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;49754:14:::1;::::0;::::1;::::0;::::1;;;49753:15;49745:66;;;::::0;-1:-1:-1;;;49745:66:0;;13464:2:1;49745:66:0::1;::::0;::::1;13446:21:1::0;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:18:1;;;13586:36;13639:19;;49745:66:0::1;13262:402:1::0;49745:66:0::1;49822:14;:25:::0;;;::::1;;;;-1:-1:-1::0;;49822:25:0;;::::1;::::0;;;::::1;::::0;;49875:15:::1;49858:16;:32:::0;49671:227::o;43289:264::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;43372:16:::1;::::0;;43357:14:::1;43399:18:::0;;;43436:10:::1;::::0;-1:-1:-1;;;;;43436:10:0::1;43428:47;43471:3;43458:9;43372:16:::0;43465:2:::1;43458:9;:::i;46004:181::-:0;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46089:33:::1;:9;46106:15:::0;46089:16:::1;:33::i;50454:232::-:0;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;50554:57:::1;50576:34;50595:15;50576:18:::0;:34:::1;:::i;:::-;50554:21;:57::i;:::-;50643:34;50662:15;50643:18:::0;:34:::1;:::i;:::-;50627:51;::::0;-1:-1:-1;;;;;;;;;;;50627:51:0;;;::::1;50454:232:::0;:::o;41958:151::-;42001:15;;42062:13;28510:1;42062:2;:13;:::i;:::-;42049:12;;:26;;;;:::i;:::-;42087:13;28510:1;42087:2;:13;:::i;:::-;42077:9;;:23;;;;:::i;:::-;42042:59;;;;41958:151;;:::o;9575:142::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;9676:1:::1;9660:6:::0;;9639:40:::1;::::0;-1:-1:-1;;;;;9660:6:0;;::::1;::::0;9639:40:::1;::::0;9676:1;;9639:40:::1;9707:1;9690:19:::0;;-1:-1:-1;;;;;;9690:19:0::1;::::0;;9575:142::o;44598:270::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44692:30:0;::::1;44684:77;;;;-1:-1:-1::0;;;44684:77:0::1;;;;;;;:::i;:::-;44770:13;:39:::0;;-1:-1:-1;;;;;;44770:39:0::1;-1:-1:-1::0;;;;;44770:39:0;::::1;::::0;;::::1;::::0;;;44823:37:::1;::::0;-1:-1:-1;;;;;;;;;;;44823:37:0;-1:-1:-1;;44823:37:0::1;44598:270:::0;:::o;42957:109::-;43044:11;;43028:27;;:15;:27;:::i;:::-;43016:10;43007:20;;;;:8;:20;;;;;:48;42957:109::o;53776:7::-;53769:14;;53697:94;:::o;48035:245::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48125:23:0;::::1;48117:72;;;;-1:-1:-1::0;;;48117:72:0::1;;;;;;;:::i;:::-;48200:13;:23:::0;;-1:-1:-1;;;;;;48200:23:0::1;-1:-1:-1::0;;;;;48200:23:0;::::1;::::0;;::::1;::::0;;;48239:33:::1;::::0;-1:-1:-1;;;;;;;;;;;48239:33:0;-1:-1:-1;;48239:33:0::1;48035:245:::0;:::o;44334:252::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44422:27:0;::::1;44414:74;;;;-1:-1:-1::0;;;44414:74:0::1;;;;;;;:::i;:::-;44497:10;:33:::0;;-1:-1:-1;;;;;;44497:33:0::1;-1:-1:-1::0;;;;;44497:33:0;::::1;::::0;;::::1;::::0;;;44544:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44544:34:0;-1:-1:-1;;44544:34:0::1;44334:252:::0;:::o;43987:165::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;44068:16:::1;:23:::0;;-1:-1:-1;;44068:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44107:37:::1;::::0;44068:23:::1;44127:16:::0;;;44107:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44107:37:0::1;43987:165:::0;:::o;48383:1045::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;48621:3:::1;48602:18;;:22;;;;:::i;:::-;48589:12;:35;48581:110;;;::::0;-1:-1:-1;;;48581:110:0;;13871:2:1;48581:110:0::1;::::0;::::1;13853:21:1::0;13910:2;13890:18;;;13883:30;13949:34;13929:18;;;13922:62;-1:-1:-1;;;14000:18:1;;;13993:51;14061:19;;48581:110:0::1;13669:417:1::0;48581:110:0::1;48769:13;28510:1;48769:2;:13;:::i;:::-;48753:29;::::0;:15;:29:::1;:::i;:::-;48737:45:::0;-1:-1:-1;48819:13:0::1;28510:1;48819:2;:13;:::i;:::-;48806:26;::::0;:12;:26:::1;:::i;:::-;48793:39;;48899:26;28790:2;48926:38;;:18;;:38;;;;:::i;:::-;48899:65;;48975:23;28901:3;48999:35;;:18;;:35;;;;:::i;:::-;48975:59;;49073:18;49056:15;:35;;49047:103;;;::::0;-1:-1:-1;;;49047:103:0;;14293:2:1;49047:103:0::1;::::0;::::1;14275:21:1::0;14332:2;14312:18;;;14305:30;14371:34;14351:18;;;14344:62;-1:-1:-1;;;14422:18:1;;;14415:41;14473:19;;49047:103:0::1;14091:407:1::0;49047:103:0::1;49184:15;49170:12;:29;;49161:94;;;::::0;-1:-1:-1;;;49161:94:0;;14705:2:1;49161:94:0::1;::::0;::::1;14687:21:1::0;14744:2;14724:18;;;14717:30;14783:34;14763:18;;;14756:62;-1:-1:-1;;;14834:18:1;;;14827:38;14882:19;;49161:94:0::1;14503:404:1::0;49161:94:0::1;49268:12;:30:::0;;;49309:9:::1;:24:::0;;;49349:29:::1;::::0;49283:15;;-1:-1:-1;;;;;;;;;;;49349:29:0;-1:-1:-1;;49349:29:0::1;49410:9;::::0;49394:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49394:26:0;;;::::1;48474:954;;48383:1045:::0;;:::o;55798:342::-;55941:10;55885:4;55929:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55929:32:0;;;;;;;;;;55980:35;;;;55972:60;;;;-1:-1:-1;;;55972:60:0;;15114:2:1;55972:60:0;;;15096:21:1;15153:2;15133:18;;;15126:30;-1:-1:-1;;;15172:18:1;;;15165:42;15224:18;;55972:60:0;14912:336:1;55972:60:0;56045:65;56054:10;56066:7;56075:34;56094:15;56075:16;:34;:::i;56045:65::-;-1:-1:-1;56128:4:0;;55798:342;-1:-1:-1;;;55798:342:0:o;54354:167::-;54434:4;54451:40;54461:10;54473:9;54484:6;54451:9;:40::i;44929:156::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;45001:15:::1;:24:::0;;-1:-1:-1;;45001:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45041:36:::1;::::0;45001:24:::1;45061:15:::0;;;::::1;;45041:36;;::::0;::::1;::::0;-1:-1:-1;;45041:36:0::1;44929:156:::0;:::o;41589:222::-;41656:7;41694:20;;41678:15;:36;41675:110;;;41758:15;41737:20;;:36;;;;:::i;41675:110::-;-1:-1:-1;41802:1:0;;41589:222::o;41819:131::-;41868:7;41929:13;28510:1;41929:2;:13;:::i;:::-;41909:18;;28569:13;28510:1;28569:2;:13;:::i;:::-;28557:25;;:9;:25;:::i;:::-;41895:32;;;;:::i;:::-;41894:48;;;;:::i;45524:179::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;45608:19:::1;:35:::0;;;45659:36:::1;::::0;45630:13;;-1:-1:-1;;;;;;;;;;;45659:36:0;;;::::1;45524:179:::0;:::o;44158:164::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;44261:13:::1;28510:1;44261:2;:13;:::i;:::-;44246:28;::::0;:12;:28:::1;:::i;:::-;44236:9;:38:::0;;;44288:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44288:26:0;;;::::1;44158:164:::0;:::o;45154:246::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;29080:10:::1;45247:30:::0;::::1;;45239:64;;;::::0;-1:-1:-1;;;45239:64:0;;15455:2:1;45239:64:0::1;::::0;::::1;15437:21:1::0;15494:2;15474:18;;;15467:30;-1:-1:-1;;;15513:18:1;;;15506:52;15575:18;;45239:64:0::1;15253:346:1::0;45239:64:0::1;45318:11;:26:::0;;;45364:28:::1;::::0;45330:14;;-1:-1:-1;;;;;;;;;;;45364:28:0;;;::::1;45154:246:::0;:::o;42432:275::-;-1:-1:-1;;;;;42554:24:0;;42519:7;42554:24;;;:8;:24;;;;;;42601:15;42591:25;;42588:71;;-1:-1:-1;42647:1:0;;42432:275;-1:-1:-1;;42432:275:0:o;42588:71::-;42675:24;42684:15;42675:8;:24;:::i;:::-;42668:31;42432:275;-1:-1:-1;;;42432:275:0:o;46265:193::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46354:38:::1;:14;46373:18:::0;46354::::1;:38::i;9872:238::-:0;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9955:22:0;::::1;9947:73;;;::::0;-1:-1:-1;;;9947:73:0;;15806:2:1;9947:73:0::1;::::0;::::1;15788:21:1::0;15845:2;15825:18;;;15818:30;15884:34;15864:18;;;15857:62;-1:-1:-1;;;15935:18:1;;;15928:36;15981:19;;9947:73:0::1;15604:402:1::0;9947:73:0::1;10057:6;::::0;;10036:38:::1;::::0;-1:-1:-1;;;;;10036:38:0;;::::1;::::0;10057:6;::::1;::::0;10036:38:::1;::::0;::::1;10085:6;:17:::0;;-1:-1:-1;;;;;;10085:17:0::1;-1:-1:-1::0;;;;;10085:17:0;;;::::1;::::0;;;::::1;::::0;;9872:238::o;45771:166::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;45850:27:::1;:9;45864:12:::0;24625:152;24695:4;24719:50;24724:3;-1:-1:-1;;;;;24744:23:0;;24719:4;:50::i;54851:299::-;-1:-1:-1;;;;;54944:19:0;;54936:49;;;;-1:-1:-1;;;54936:49:0;;16213:2:1;54936:49:0;;;16195:21:1;16252:2;16232:18;;;16225:30;-1:-1:-1;;;16271:18:1;;;16264:47;16328:18;;54936:49:0;16011:341:1;54936:49:0;-1:-1:-1;;;;;55004:21:0;;54996:49;;;;-1:-1:-1;;;54996:49:0;;16559:2:1;54996:49:0;;;16541:21:1;16598:2;16578:18;;;16571:30;-1:-1:-1;;;16617:18:1;;;16610:45;16672:18;;54996:49:0;16357:339:1;54996:49:0;-1:-1:-1;;;;;55058:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55110:32;;1410:25:1;;;55110:32:0;;1383:18:1;55110:32:0;;;;;;;54851:299;;;:::o;31914:1540::-;-1:-1:-1;;;;;32010:20:0;;32002:51;;;;-1:-1:-1;;;32002:51:0;;16903:2:1;32002:51:0;;;16885:21:1;16942:2;16922:18;;;16915:30;-1:-1:-1;;;16961:18:1;;;16954:48;17019:18;;32002:51:0;16701:342:1;32002:51:0;-1:-1:-1;;;;;32072:23:0;;32064:52;;;;-1:-1:-1;;;32064:52:0;;17250:2:1;32064:52:0;;;17232:21:1;17289:2;17269:18;;;17262:30;-1:-1:-1;;;17308:18:1;;;17301:46;17364:18;;32064:52:0;17048:340:1;32064:52:0;32209:15;32228:26;:9;32247:6;32228:18;:26::i;:::-;:59;;;-1:-1:-1;32258:29:0;:9;32277;32258:18;:29::i;:::-;32209:79;-1:-1:-1;32387:23:0;-1:-1:-1;;;;;32412:21:0;;32428:4;32412:21;;:49;;-1:-1:-1;;;;;;32437:24:0;;32456:4;32437:24;32412:49;32596:16;;32663:21;;32387:75;;-1:-1:-1;;;;;;32596:16:0;;;;32564:23;;32653:31;;;-1:-1:-1;;;32663:21:0;;;;32653:31;:63;;;;;32701:15;-1:-1:-1;;;;;32688:28:0;:9;-1:-1:-1;;;;;32688:28:0;;32653:63;32652:144;;;-1:-1:-1;32745:21:0;;-1:-1:-1;;;;;32732:34:0;;;-1:-1:-1;;;32745:21:0;;;;32732:34;:63;;;;;32780:15;-1:-1:-1;;;;;32770:25:0;:6;-1:-1:-1;;;;;32770:25:0;;32732:63;32918:21;;32624:173;;-1:-1:-1;32899:10:0;;-1:-1:-1;;;;;32910:29:0;;;-1:-1:-1;;;32918:21:0;;;;32910:29;;:57;;;32952:15;-1:-1:-1;;;;;32942:25:0;:6;-1:-1:-1;;;;;32942:25:0;;32910:57;33001:21;;32899:68;;-1:-1:-1;32978:11:0;;-1:-1:-1;;;;;32990:32:0;;;-1:-1:-1;;;33001:21:0;;;;32990:32;;:63;;;33038:15;-1:-1:-1;;;;;33025:28:0;:9;-1:-1:-1;;;;;33025:28:0;;32990:63;32978:75;;33094:18;:41;;;;33116:19;33094:41;:55;;;;33139:10;33094:55;33091:356;;;33165:43;33182:6;33190:9;33201:6;33165:16;:43::i;:::-;33091:356;;;33327:14;;;;;;;33319:49;;;;-1:-1:-1;;;33319:49:0;;17595:2:1;33319:49:0;;;17577:21:1;17634:2;17614:18;;;17607:30;17673:25;17653:18;;;17646:53;17716:18;;33319:49:0;17393:347:1;33319:49:0;33383:52;33398:6;33405:9;33415:6;33422:5;33428:6;33383:14;:52::i;:::-;31991:1463;;;;;;31914:1540;;;:::o;38563:1582::-;38311:27;:34;;-1:-1:-1;;38311:34:0;38341:4;38311:34;;;;;;38665:4:::1;38311:27:::0;38647:24;;;::::1;::::0;;;;;;;;38712:13:::1;::::0;38647:24;;38311:27;38698::::1;::::0;38712:13;;::::1;38311:34:::0;38712:13;;::::1;::::0;38698;;::::1;;:27;:::i;:::-;38682:43;;;;38736:19;38758;;38736:41;;38904:11;38888:15;:27;:40;;;-1:-1:-1::0;38917:11:0::1;::::0;::::1;::::0;38888:40:::1;38885:77;;;38944:7;;;;;38885:77;39082:13;::::0;39043:25:::1;::::0;39069:36:::1;::::0;::::1;::::0;39070:25:::1;::::0;39082:13;;::::1;;;39070:11:::0;:25:::1;:::i;:::-;39069:36;;;;:::i;:::-;39043:62:::0;-1:-1:-1;39116:25:0::1;39143:29;39043:62:::0;39143:11;:29:::1;:::i;:::-;39116:56:::0;-1:-1:-1;39233:16:0::1;39250:19;39268:1;39250:17:::0;:19:::1;:::i;:::-;39233:36:::0;-1:-1:-1;39280:19:0::1;39300:26;39233:36:::0;39300:17;:26:::1;:::i;:::-;39280:46:::0;-1:-1:-1;39409:17:0::1;39427:29;39439:17:::0;39280:46;39427:29:::1;:::i;:::-;39409:47:::0;-1:-1:-1;39535:21:0::1;39567:27;39409:47:::0;39567:16:::1;:27::i;:::-;39605:14;39621:41;39645:17:::0;39621:21:::1;:41;:::i;:::-;39605:58:::0;-1:-1:-1;39763:14:0::1;39801:9:::0;39781:18:::1;39788:11:::0;39605:58;39781:18:::1;:::i;:::-;39780:30;;;;:::i;:::-;39763:47;;39821:31;39835:8;39845:6;39821:13;:31::i;:::-;-1:-1:-1::0;39977:21:0::1;::::0;-1:-1:-1;40000:41:0::1;40024:17:::0;40000:21:::1;:41;:::i;:::-;39977:65;;40124:13;40106:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38356:1:0::1;38368:27:::0;:35;;-1:-1:-1;;38368:35:0;;;38563:1582::o;24953:158::-;25026:4;25050:53;25058:3;-1:-1:-1;;;;;25078:23:0;;25050:7;:53::i;50739:343::-;50895:20;;50881:13;:34;50873:103;;;;-1:-1:-1;;;50873:103:0;;17947:2:1;50873:103:0;;;17929:21:1;17986:2;17966:18;;;17959:30;18025:34;18005:18;;;17998:62;-1:-1:-1;;;18076:18:1;;;18069:45;18131:19;;50873:103:0;17745:411:1;50873:103:0;50987:20;:34;;;51037:37;;51008:13;;-1:-1:-1;;;;;;;;;;;51037:37:0;;;;50739:343;:::o;19680:414::-;19743:4;22006:19;;;:12;;;:19;;;;;;19760:327;;-1:-1:-1;19803:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19986:18;;19964:19;;;:12;;;:19;;;;;;:40;;;;20019:11;;19760:327;-1:-1:-1;20070:5:0;20063:12;;25197:167;-1:-1:-1;;;;;25331:23:0;;25277:4;22006:19;;;:12;;;:19;;;;;;:24;;25301:55;21909:129;36754:400;-1:-1:-1;;;;;36873:17:0;;36849:21;36873:17;;;:9;:17;;;;;;36909:23;;;;36901:60;;;;-1:-1:-1;;;36901:60:0;;18363:2:1;36901:60:0;;;18345:21:1;18402:2;18382:18;;;18375:30;-1:-1:-1;;;18421:18:1;;;18414:54;18485:18;;36901:60:0;18161:348:1;36901:60:0;36997:27;37010:6;37017;36997:12;:27::i;:::-;37057:28;37067:9;37078:6;37057:9;:28::i;:::-;37127:9;-1:-1:-1;;;;;37111:33:0;37120:6;-1:-1:-1;;;;;37111:33:0;;37137:6;37111:33;;;;1410:25:1;;1398:2;1383:18;;1264:177;37111:33:0;;;;;;;;36838:316;36754:400;;;:::o;33524:3183::-;-1:-1:-1;;;;;33667:20:0;;;33640:24;33667:20;;;:9;:20;;;;;;;33722:17;;;;;;;;33758:23;;;;33750:60;;;;-1:-1:-1;;;33750:60:0;;18363:2:1;33750:60:0;;;18345:21:1;18402:2;18382:18;;;18375:30;-1:-1:-1;;;18421:18:1;;;18414:54;18485:18;;33750:60:0;18161:348:1;33750:60:0;33823:9;33846:6;33843:1673;;;33933:9;;33925:6;:17;;33917:44;;;;-1:-1:-1;;;33917:44:0;;18716:2:1;33917:44:0;;;18698:21:1;18755:2;18735:18;;;18728:30;-1:-1:-1;;;18774:18:1;;;18767:45;18829:18;;33917:44:0;18514:339:1;33917:44:0;33984:31;:14;34008:6;33984:23;:31::i;:::-;:40;33976:73;;;;-1:-1:-1;;;33976:73:0;;19060:2:1;33976:73:0;;;19042:21:1;19099:2;19079:18;;;19072:30;-1:-1:-1;;;19118:18:1;;;19111:50;19178:18;;33976:73:0;18858:344:1;33976:73:0;34106:11;;34087:16;;:30;;;;:::i;:::-;34068:15;:49;;:77;;;;;34121:19;;34144:1;34121:24;34068:77;34064:186;;;34166:26;:14;34185:6;34166:18;:26::i;:::-;-1:-1:-1;34216:18:0;;-1:-1:-1;;;;;34216:18:0;;;;;;;;34064:186;-1:-1:-1;34268:8:0;;;;;;;33843:1673;;;34301:5;34298:1218;;;34446:12;;34421:23;34438:6;34421:16;:23;:::i;:::-;:37;;34413:65;;;;-1:-1:-1;;;34413:65:0;;19409:2:1;34413:65:0;;;19391:21:1;19448:2;19428:18;;;19421:30;-1:-1:-1;;;19467:18:1;;;19460:46;19523:18;;34413:65:0;19207:340:1;34413:65:0;34502:9;;34492:6;:19;;34484:65;;;;-1:-1:-1;;;34484:65:0;;19754:2:1;34484:65:0;;;19736:21:1;19793:2;19773:18;;;19766:30;19832:34;19812:18;;;19805:62;-1:-1:-1;;;19883:18:1;;;19876:32;19925:19;;34484:65:0;19552:398:1;34484:65:0;34572:34;:14;34596:9;34572:23;:34::i;:::-;:43;34564:76;;;;-1:-1:-1;;;34564:76:0;;19060:2:1;34564:76:0;;;19042:21:1;19099:2;19079:18;;;19072:30;-1:-1:-1;;;19118:18:1;;;19111:50;19178:18;;34564:76:0;18858:344:1;34564:76:0;34697:11;;34678:16;;:30;;;;:::i;:::-;34659:15;:49;;:77;;;;;34712:19;;34735:1;34712:24;34659:77;34655:192;;;34757:29;:14;34776:9;34757:18;:29::i;:::-;-1:-1:-1;34810:21:0;;-1:-1:-1;;;;;34810:21:0;;;;;;;;34655:192;-1:-1:-1;34865:7:0;;;;34298:1218;;;35016:31;:14;35040:6;35016:23;:31::i;:::-;:40;35008:80;;;;-1:-1:-1;;;35008:80:0;;20157:2:1;35008:80:0;;;20139:21:1;20196:2;20176:18;;;20169:30;20235:29;20215:18;;;20208:57;20282:18;;35008:80:0;19955:351:1;35008:80:0;35111:34;:14;35135:9;35111:23;:34::i;:::-;:43;35103:86;;;;-1:-1:-1;;;35103:86:0;;20513:2:1;35103:86:0;;;20495:21:1;20552:2;20532:18;;;20525:30;20591:32;20571:18;;;20564:60;20641:18;;35103:86:0;20311:354:1;35103:86:0;35237:12;;35212:23;35229:6;35212:16;:23;:::i;:::-;:37;;35204:65;;;;-1:-1:-1;;;35204:65:0;;19409:2:1;35204:65:0;;;19391:21:1;19448:2;19428:18;;;19421:30;-1:-1:-1;;;19467:18:1;;;19460:46;19523:18;;35204:65:0;19207:340:1;35204:65:0;35326:11;;35307:16;;:30;;;;:::i;:::-;35288:15;:49;;:77;;;;;35341:19;;35364:1;35341:24;35288:77;35284:186;;;35386:26;:14;35405:6;35386:18;:26::i;:::-;-1:-1:-1;35436:18:0;;-1:-1:-1;;;;;35436:18:0;;;;;;;;35284:186;-1:-1:-1;35488:12:0;;;;;;;34298:1218;35853:21;;-1:-1:-1;;;;;35845:29:0;;;-1:-1:-1;;;35853:21:0;;;;35845:29;;;;35844:52;;-1:-1:-1;35879:16:0;;;;35878:17;35844:52;:84;;;;-1:-1:-1;35900:27:0;;;;35899:28;35844:84;:92;;;;;35930:6;35844:92;35841:130;;;35951:20;:18;:20::i;:::-;36040:23;36064:36;36078:6;36086:3;36091:8;;;;;;;;;;;36064:13;:36::i;:::-;36174:13;;36040:60;;-1:-1:-1;36111:21:0;;36133:55;;36147:6;;36155:3;;36160:27;;36174:13;;;;;;;36160;;;;:27;:::i;:::-;36133:13;:55::i;:::-;36111:77;-1:-1:-1;36252:19:0;36280:31;36111:77;36280:15;:31;:::i;:::-;36272:40;;:6;:40;:::i;:::-;36252:60;;36350:27;36363:6;36370;36350:12;:27::i;:::-;36472:4;36454:24;;;;:9;:24;;;;;:41;;36482:13;;36454:24;:41;;36482:13;;36454:41;:::i;:::-;;;;;;;;36550:15;36530:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36600:33:0;;-1:-1:-1;36610:9:0;36621:11;36600:9;:33::i;:::-;36675:9;-1:-1:-1;;;;;36659:38:0;36668:6;-1:-1:-1;;;;;36659:38:0;;36685:11;36659:38;;;;1410:25:1;;1398:2;1383:18;;1264:177;36659:38:0;;;;;;;;33629:3078;;;;;;33524:3183;;;;;:::o;40195:461::-;40288:16;;40256:58;;40273:4;;-1:-1:-1;;;;;40288:16:0;40307:6;40256:8;:58::i;:::-;40349:16;;;40363:1;40349:16;;;;;;;;40325:21;;40349:16;;;;;;;;;;-1:-1:-1;40349:16:0;40325:40;;40394:4;40376;40381:1;40376:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40376:23:0;;;:7;;;;;;;;;;:23;;;;40420:16;;:23;;;-1:-1:-1;;;40420:23:0;;;;:16;;;;;:21;;:23;;;;;40376:7;;40420:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40410:4;40415:1;40410:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40410:33:0;;;:7;;;;;;;;;:33;40456:16;;:192;;-1:-1:-1;;;40456:192:0;;:16;;;:67;;:192;;40538:6;;40456:16;;40575:4;;40602;;40622:15;;40456:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40245:411;40195:461;:::o;40783:686::-;40863:19;40884:21;40930:9;40918:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40950:14:0;;-1:-1:-1;40984:3:0;40968:12;:9;40978:2;40968:12;:::i;:::-;40967:20;;;;:::i;:::-;40950:37;-1:-1:-1;40998:17:0;41037:3;41019:14;:11;41031:2;41019:14;:::i;:::-;41018:22;;;;:::i;:::-;41083:16;;40998:42;;-1:-1:-1;41051:63:0;;41068:4;;-1:-1:-1;;;;;41083:16:0;41102:11;41051:8;:63::i;:::-;41125:16;;:218;;-1:-1:-1;;;41125:218:0;;-1:-1:-1;;;;;41125:16:0;;;;:32;;41165:9;;41125:218;;41198:4;;41218:11;;41244:9;;41268:6;;41198:4;;41317:15;;41125:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41368:11:0;;41406:9;;-1:-1:-1;;;;;;40783:686:0:o;20270:1553::-;20336:4;20475:19;;;:12;;;:19;;;;;;20511:15;;20507:1309;;20873:21;20897:14;20910:1;20897:10;:14;:::i;:::-;20946:18;;20873:38;;-1:-1:-1;20926:17:0;;20946:22;;20967:1;;20946:22;:::i;:::-;20926:42;;21213:17;21233:3;:11;;21245:9;21233:22;;;;;;;;:::i;:::-;;;;;;;;;21213:42;;21379:9;21350:3;:11;;21362:13;21350:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21456:23;;;:12;;;:23;;;;;;:36;;;21617:17;;21456:3;;21617:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21712:3;:12;;:19;21725:5;21712:19;;;;;;;;;;;21705:26;;;21755:4;21748:11;;;;;;;;20507:1309;21799:5;21792:12;;;;;37754:228;-1:-1:-1;;;;;37889:15:0;;37871:17;37889:15;;;:9;:15;;;;;;:22;;37905:6;;37889:22;:::i;:::-;-1:-1:-1;;;;;37949:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37754:228:0:o;37490:225::-;-1:-1:-1;;;;;37622:15:0;;37604:17;37622:15;;;:9;:15;;;;;;:22;;37638:6;;37622:22;:::i;37209:156::-;37299:7;37352:5;37338:10;37327:21;;37334:3;37327:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37326:31;;;;:::i;:::-;37319:38;37209:156;-1:-1:-1;;;;37209:156:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1639:456::-;1716:6;1724;1732;1785:2;1773:9;1764:7;1760:23;1756:32;1753:52;;;1801:1;1798;1791:12;1753:52;1840:9;1827:23;1859:31;1884:5;1859:31;:::i;:::-;1909:5;-1:-1:-1;1966:2:1;1951:18;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;1639:456;;2031:7;;-1:-1:-1;;;2085:2:1;2070:18;;;;2057:32;;1639:456::o;2829:247::-;2888:6;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2996:9;2983:23;3015:31;3040:5;3015:31;:::i;3360:180::-;3419:6;3472:2;3460:9;3451:7;3447:23;3443:32;3440:52;;;3488:1;3485;3478:12;3440:52;-1:-1:-1;3511:23:1;;3360:180;-1:-1:-1;3360:180:1:o;3545:156::-;3611:20;;3671:4;3660:16;;3650:27;;3640:55;;3691:1;3688;3681:12;3640:55;3545:156;;;:::o;3706:535::-;3798:6;3806;3814;3822;3830;3838;3891:3;3879:9;3870:7;3866:23;3862:33;3859:53;;;3908:1;3905;3898:12;3859:53;3931:27;3948:9;3931:27;:::i;:::-;3921:37;;3977:36;4009:2;3998:9;3994:18;3977:36;:::i;:::-;3967:46;;4032:36;4064:2;4053:9;4049:18;4032:36;:::i;:::-;4022:46;;4087:36;4119:2;4108:9;4104:18;4087:36;:::i;:::-;4077:46;;4142:37;4174:3;4163:9;4159:19;4142:37;:::i;:::-;4132:47;;4198:37;4230:3;4219:9;4215:19;4198:37;:::i;:::-;4188:47;;3706:535;;;;;;;;:::o;4246:118::-;4332:5;4325:13;4318:21;4311:5;4308:32;4298:60;;4354:1;4351;4344:12;4369:241;4425:6;4478:2;4466:9;4457:7;4453:23;4449:32;4446:52;;;4494:1;4491;4484:12;4446:52;4533:9;4520:23;4552:28;4574:5;4552:28;:::i;5076:248::-;5144:6;5152;5205:2;5193:9;5184:7;5180:23;5176:32;5173:52;;;5221:1;5218;5211:12;5173:52;-1:-1:-1;;5244:23:1;;;5314:2;5299:18;;;5286:32;;-1:-1:-1;5076:248:1:o;5329:388::-;5397:6;5405;5458:2;5446:9;5437:7;5433:23;5429:32;5426:52;;;5474:1;5471;5464:12;5426:52;5513:9;5500:23;5532:31;5557:5;5532:31;:::i;:::-;5582:5;-1:-1:-1;5639:2:1;5624:18;;5611:32;5652:33;5611:32;5652:33;:::i;:::-;5704:7;5694:17;;;5329:388;;;;;:::o;5722:356::-;5924:2;5906:21;;;5943:18;;;5936:30;6002:34;5997:2;5982:18;;5975:62;6069:2;6054:18;;5722:356::o;6083:340::-;6285:2;6267:21;;;6324:2;6304:18;;;6297:30;-1:-1:-1;;;6358:2:1;6343:18;;6336:46;6414:2;6399:18;;6083:340::o;6428:184::-;6498:6;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;-1:-1:-1;6590:16:1;;6428:184;-1:-1:-1;6428:184:1:o;6617:245::-;6684:6;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6785:9;6779:16;6804:28;6826:5;6804:28;:::i;6867:127::-;6928:10;6923:3;6919:20;6916:1;6909:31;6959:4;6956:1;6949:15;6983:4;6980:1;6973:15;6999:168;7039:7;7105:1;7101;7097:6;7093:14;7090:1;7087:21;7082:1;7075:9;7068:17;7064:45;7061:71;;;7112:18;;:::i;:::-;-1:-1:-1;7152:9:1;;6999:168::o;7172:217::-;7212:1;7238;7228:132;;7282:10;7277:3;7273:20;7270:1;7263:31;7317:4;7314:1;7307:15;7345:4;7342:1;7335:15;7228:132;-1:-1:-1;7374:9:1;;7172:217::o;7394:591::-;-1:-1:-1;;;;;7737:15:1;;;7719:34;;7784:2;7769:18;;7762:34;;;;7827:2;7812:18;;7805:34;;;;7870:2;7855:18;;7848:34;;;;7919:15;;;7913:3;7898:19;;7891:44;7699:3;7951:19;;7944:35;;;;7668:3;7653:19;;7394:591::o;7990:125::-;8030:4;8058:1;8055;8052:8;8049:34;;;8063:18;;:::i;:::-;-1:-1:-1;8100:9:1;;7990:125::o;8120:128::-;8160:3;8191:1;8187:6;8184:1;8181:13;8178:39;;;8197:18;;:::i;:::-;-1:-1:-1;8233:9:1;;8120:128::o;8253:422::-;8342:1;8385:5;8342:1;8399:270;8420:7;8410:8;8407:21;8399:270;;;8479:4;8475:1;8471:6;8467:17;8461:4;8458:27;8455:53;;;8488:18;;:::i;:::-;8538:7;8528:8;8524:22;8521:55;;;8558:16;;;;8521:55;8637:22;;;;8597:15;;;;8399:270;;;8403:3;8253:422;;;;;:::o;8680:806::-;8729:5;8759:8;8749:80;;-1:-1:-1;8800:1:1;8814:5;;8749:80;8848:4;8838:76;;-1:-1:-1;8885:1:1;8899:5;;8838:76;8930:4;8948:1;8943:59;;;;9016:1;9011:130;;;;8923:218;;8943:59;8973:1;8964:10;;8987:5;;;9011:130;9048:3;9038:8;9035:17;9032:43;;;9055:18;;:::i;:::-;-1:-1:-1;;9111:1:1;9097:16;;9126:5;;8923:218;;9225:2;9215:8;9212:16;9206:3;9200:4;9197:13;9193:36;9187:2;9177:8;9174:16;9169:2;9163:4;9160:12;9156:35;9153:77;9150:159;;;-1:-1:-1;9262:19:1;;;9294:5;;9150:159;9341:34;9366:8;9360:4;9341:34;:::i;:::-;9411:6;9407:1;9403:6;9399:19;9390:7;9387:32;9384:58;;;9422:18;;:::i;:::-;9460:20;;8680:806;-1:-1:-1;;;8680:806:1:o;9491:140::-;9549:5;9578:47;9619:4;9609:8;9605:19;9599:4;9578:47;:::i;10954:351::-;11156:2;11138:21;;;11195:2;11175:18;;;11168:30;11234:29;11229:2;11214:18;;11207:57;11296:2;11281:18;;10954:351::o;11310:204::-;11348:3;11384:4;11381:1;11377:12;11416:4;11413:1;11409:12;11451:3;11445:4;11441:14;11436:3;11433:23;11430:49;;;11459:18;;:::i;:::-;11495:13;;11310:204;-1:-1:-1;;;11310:204:1:o;20802:127::-;20863:10;20858:3;20854:20;20851:1;20844:31;20894:4;20891:1;20884:15;20918:4;20915:1;20908:15;20934:251;21004:6;21057:2;21045:9;21036:7;21032:23;21028:32;21025:52;;;21073:1;21070;21063:12;21025:52;21105:9;21099:16;21124:31;21149:5;21124:31;:::i;21190:980::-;21452:4;21500:3;21489:9;21485:19;21531:6;21520:9;21513:25;21557:2;21595:6;21590:2;21579:9;21575:18;21568:34;21638:3;21633:2;21622:9;21618:18;21611:31;21662:6;21697;21691:13;21728:6;21720;21713:22;21766:3;21755:9;21751:19;21744:26;;21805:2;21797:6;21793:15;21779:29;;21826:1;21836:195;21850:6;21847:1;21844:13;21836:195;;;21915:13;;-1:-1:-1;;;;;21911:39:1;21899:52;;22006:15;;;;21971:12;;;;21947:1;21865:9;21836:195;;;-1:-1:-1;;;;;;;22087:32:1;;;;22082:2;22067:18;;22060:60;-1:-1:-1;;;22151:3:1;22136:19;22129:35;22048:3;21190:980;-1:-1:-1;;;21190:980:1:o;22175:306::-;22263:6;22271;22279;22332:2;22320:9;22311:7;22307:23;22303:32;22300:52;;;22348:1;22345;22338:12;22300:52;22377:9;22371:16;22361:26;;22427:2;22416:9;22412:18;22406:25;22396:35;;22471:2;22460:9;22456:18;22450:25;22440:35;;22175:306;;;;;:::o;22486:127::-;22547:10;22542:3;22538:20;22535:1;22528:31;22578:4;22575:1;22568:15;22602:4;22599:1;22592:15

Swarm Source

ipfs://4601d4c26956c491c8fca2c8c5fcab6eca1bcd640ba3e24a18805173a536ab18
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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