ETH Price: $3,494.71 (+2.59%)
Gas: 3 Gwei

Token

CHEEMSINU (CINU)
 

Overview

Max Total Supply

4,138,058,057 CINU

Holders

708

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000693594 CINU

Value
$0.00
0x04f605ae2b6d307dfef4e1f57710d812979b404e
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:
CheemsInu

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-04-24
*/

/*
* 
CHEEMS INU 

Supply: 1 000 000 000 000 
Max Wallet: 10 000 000 000 at launch then 20 000 000 000
Max TX: 2 500 000 000 at launch then 10 000 000 000

Tax: 8% Buy 10% Sell 

SPLIT: 
 
20% LP
50% BUYBACKS
30% DEVELOPMENT/MARKETING

DO NOT BUY UNTIL CONTRACT ADDRESS IS POSTED IN TELEGRAM

https://t.me/cheemstokenbsc

*
*/

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

//Cheems Inu Eth Contract /////////////

contract CheemsInu 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;
    mapping ( address => bool ) public blackList;

    EnumerableSet.AddressSet private _excluded;

    //Token Info
    string private constant _name = 'CHEEMSINU';
    string private constant _symbol = 'CINU';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 4138058057 * 10**_decimals;

    //Amount to Swap variable (0.2%)
    uint256 currentAmountToSwap = 8276116 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (0.25%)
    uint16 public constant BalanceLimitDivider=400;
    //Divider for sellLimit based on circulating Supply (0.25%)
    uint16 public constant SellLimitDivider=400;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 9 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0x78eEa15417FeADEF60414F9FDf7886E72e29FA68);
    address public BuyBackWallet=payable(0x7bc10AF41bD6CA5ba88097d35d0Eb85350E49Ba7);
    //Uniswap router (Main & Testnet)
    address private uniswapV2Router=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 = 8276116 * 10**_decimals; // (0.2%)

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 90; // 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(uniswapV2Router);
        //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=8;
        _sellTax=10;
        _transferTax=10;

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

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(BuyBackWallet);
        _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(blackList[sender] == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[sender] = true;
                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(blackList[recipient] == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[recipient] = true;
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(blackList[sender] == false, "Sender address blacklisted!");
            require(blackList[recipient] == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[sender] = true;
                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*37) / 100);
        payable(BuyBackWallet).transfer((amount-(amount*37) / 100));
        emit Transfer(address(this), TeamWallet, (amount*37) / 100);
        emit Transfer(address(this), BuyBackWallet, (amount-(amount*37) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*37) / 100);
        payable(BuyBackWallet).transfer((amount-(amount*37) / 100));
        emit Transfer(address(this), TeamWallet, (amount*37) / 100);
        emit Transfer(address(this), BuyBackWallet, (amount-(amount*37) / 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 TeamChangeBuyBackWallet(address newBuyBackWallet) external onlyOwner{
      require(newBuyBackWallet != address(0),
      "Error: Cannot be 0 address.");
      BuyBackWallet=payable(newBuyBackWallet);
      emit ContractChangedAddress(BuyBackWallet);
    }
	
	//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 {
        blackList[ blacklistedAddress ] = true;
        emit ContractChangedAddress(blacklistedAddress);
    }

    function blacklistAddressArray ( address [] memory _address ) public onlyOwner {
        
        for ( uint256 x=0; x< _address.length ; x++ ){
            blackList[_address[x]] = true;
            
        }
        
    }

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

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        blackList[ blacklistedAddress ] = false;
        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.");
        uniswapV2Router=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() external onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

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

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

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        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":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyBackWallet","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":[],"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":"newBuyBackWallet","type":"address"}],"name":"TeamChangeBuyBackWallet","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":[{"internalType":"address","name":"","type":"address"}],"name":"blackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"blacklistAddressArray","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"submittedAddress","type":"address"}],"name":"checkAddressBlacklist","outputs":[{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"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"}]

6080604052620000126009600a620005c2565b6200002190627e4894620005d3565b600755600880546001600160a01b03199081167378eea15417feadef60414f9fdf7886e72e29fa6817909155600980548216737bc10af41bd6ca5ba88097d35d0eb85350e49ba7178155600a8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d1782556200009591620005c2565b620000a59063f6a5c149620005d3565b600b819055600c819055600d55620000c06009600a620005c2565b620000cf90627e4894620005d3565b600e55605a6010556001601155348015620000e957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600a54601380546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001ca57600080fd5b505afa158015620001df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002059190620005f5565b6001600160a01b031663c9c6539630601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026357600080fd5b505afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e9190620005f5565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e757600080fd5b505af1158015620002fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003229190620005f5565b601280546001600160a01b0392909216660100000000000002600160301b600160d01b0319909216919091179055610190620003616009600a620005c2565b620003719063f6a5c149620005d3565b6200037d919062000627565b600c55610190620003916009600a620005c2565b620003a19063f6a5c149620005d3565b620003ad919062000627565b600d5560006017556012805465ffffffffffff1916655014000a0a08179055600854620003f2906005906001600160a01b03166200043d602090811b620024b017901c565b5060095462000419906005906001600160a01b03166200043d602090811b620024b017901c565b50620004353360056200043d60201b620024b01790919060201c565b50506200064a565b600062000454836001600160a01b0384166200045d565b90505b92915050565b6000818152600183016020526040812054620004a65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000457565b50600062000457565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000506578160001904821115620004ea57620004ea620004af565b80851615620004f857918102915b93841c9390800290620004ca565b509250929050565b6000826200051f5750600162000457565b816200052e5750600062000457565b8160018114620005475760028114620005525762000572565b600191505062000457565b60ff841115620005665762000566620004af565b50506001821b62000457565b5060208310610133831016604e8410600b841016171562000597575081810a62000457565b620005a38383620004c5565b8060001904821115620005ba57620005ba620004af565b029392505050565b60006200045460ff8416836200050e565b6000816000190483118215151615620005f057620005f0620004af565b500290565b6000602082840312156200060857600080fd5b81516001600160a01b03811681146200062057600080fd5b9392505050565b6000826200064557634e487b7160e01b600052601260045260246000fd5b500490565b613c7d806200065a6000396000f3fe6080604052600436106103815760003560e01c80636e94312d116101cf5780639fa62d5f11610101578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610adc578063f2c816ae14610afc578063f2fde38b14610b1c578063f9ab736614610b3c57005b8063daf9a47a14610a36578063dd62ed3e14610a56578063e2fd002a14610a9c578063e7278d6b14610abc57005b8063be636012116100d3578063be636012146109cc578063c3a3c032146109ec578063c3f4f54f14610a01578063d11edf7414610a1657005b80639fa62d5f1461094c578063a457c2d71461096c578063a9059cbb1461098c578063b766a386146109ac57005b8063828e8b7e11610173578063929dffda11610145578063929dffda146108bf57806395d89b41146108df5780639bc845fb1461090c5780639bf657701461092c57005b8063828e8b7e1461087257806386d0ada814610887578063893d20e8146108a15780638da5cb5b146108a157005b806370a08231116101ac57806370a08231146107fc578063715018a614610832578063762bb282146108475780637b9e987a1461085d57005b80636e94312d146107925780636eb8c7f1146107b25780636f89e409146107d257005b806339509351116102b35780634cdaf0ae1161024c57806358e553651161021e57806358e553651461070f5780635c69f6901461072557806361cb27481461073a578063677a88701461075a57005b80634cdaf0ae146106a45780634f91e48c146106c457806357ad67d1146106da57806358e1df92146106fa57005b806344f3c83a1161028557806344f3c83a1461062a5780634838d165146106405780634ada218b146106705780634cbf8e241461068f57005b806339509351146105a05780633c7a309b146105c05780633cc39b7a146105f45780634476f35a1461060a57005b80631eb25d13116103255780633054f8a3116102f75780633054f8a314610545578063311a86971461043d578063313ce5671461056457806335e82f3a1461058057005b80631eb25d131461049057806323b872dd146104a5578063243b529a146104c55780632973ef2d146104da57005b80630fa5b2151161035e5780630fa5b2151461041a5780630fd99e161461043d57806314ddc0951461046657806318160ddd1461047b57005b80630200264b1461038a57806306fdde03146103bf578063095ea7b3146103fa57005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004613561565b610b5c565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b50604080518082019091526009815268434845454d53494e5560b81b60208201525b6040516103b6919061357e565b34801561040657600080fd5b506103aa6104153660046135d3565b610bb7565b34801561042657600080fd5b5061042f610bce565b6040519081526020016103b6565b34801561044957600080fd5b5061045361019081565b60405161ffff90911681526020016103b6565b34801561047257600080fd5b5060175461042f565b34801561048757600080fd5b50600b5461042f565b34801561049c57600080fd5b5061042f610e29565b3480156104b157600080fd5b506103aa6104c03660046135ff565b610e46565b3480156104d157600080fd5b50610388610edd565b3480156104e657600080fd5b506012546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103b6565b34801561055157600080fd5b506016546103aa90610100900460ff1681565b34801561057057600080fd5b50604051600981526020016103b6565b34801561058c57600080fd5b5061038861059b366004613561565b610f20565b3480156105ac57600080fd5b506103aa6105bb3660046135d3565b610f90565b3480156105cc57600080fd5b506105d5610fc7565b604080516001600160a01b0390931683526020830191909152016103b6565b34801561060057600080fd5b5061042f60155481565b34801561061657600080fd5b50610388610625366004613640565b61117a565b34801561063657600080fd5b5061042f60175481565b34801561064c57600080fd5b506103aa61065b366004613561565b60046020526000908152604090205460ff1681565b34801561067c57600080fd5b506018546103aa90610100900460ff1681565b34801561069b57600080fd5b5061038861136f565b3480156106b057600080fd5b506103886106bf366004613561565b611463565b3480156106d057600080fd5b5061042f600d5481565b3480156106e657600080fd5b506103886106f536600461366a565b6114ec565b34801561070657600080fd5b50610388611881565b34801561071b57600080fd5b5061042f60145481565b34801561073157600080fd5b50610453600981565b34801561074657600080fd5b50610388610755366004613561565b6118df565b34801561076657600080fd5b5060085461077a906001600160a01b031681565b6040516001600160a01b0390911681526020016103b6565b34801561079e57600080fd5b5060095461077a906001600160a01b031681565b3480156107be57600080fd5b506103886107cd366004613640565b611949565b3480156107de57600080fd5b506107e76119b8565b604080519283526020830191909152016103b6565b34801561080857600080fd5b5061042f610817366004613561565b6001600160a01b031660009081526001602052604090205490565b34801561083e57600080fd5b506103886119f5565b34801561085357600080fd5b5061042f600c5481565b34801561086957600080fd5b50610388611a78565b34801561087e57600080fd5b50610388611ac6565b34801561089357600080fd5b506018546103aa9060ff1681565b3480156108ad57600080fd5b506000546001600160a01b031661077a565b3480156108cb57600080fd5b506103886108da366004613561565b611aea565b3480156108eb57600080fd5b5060408051808201909152600481526343494e5560e01b60208201526103ed565b34801561091857600080fd5b50610388610927366004613561565b611b81565b34801561093857600080fd5b506103886109473660046136ec565b611c18565b34801561095857600080fd5b50610388610967366004613709565b611c96565b34801561097857600080fd5b506103aa6109873660046135d3565b611eb2565b34801561099857600080fd5b506103aa6109a73660046135d3565b611f2e565b3480156109b857600080fd5b506103886109c73660046136ec565b611f3b565b3480156109d857600080fd5b506103886109e7366004613561565b611fc3565b3480156109f857600080fd5b5061042f61205a565b348015610a0d57600080fd5b5061042f61207a565b348015610a2257600080fd5b50610388610a31366004613640565b6120b9565b348015610a4257600080fd5b50610388610a51366004613640565b612113565b348015610a6257600080fd5b5061042f610a7136600461372b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610aa857600080fd5b50610388610ab7366004613640565b612181565b348015610ac857600080fd5b50610388610ad736600461377a565b612225565b348015610ae857600080fd5b5061042f610af7366004613561565b6122ca565b348015610b0857600080fd5b50610388610b17366004613561565b612304565b348015610b2857600080fd5b50610388610b37366004613561565b612377565b348015610b4857600080fd5b50610388610b57366004613561565b612470565b6001600160a01b03811660009081526004602052604081205460ff16151560011415610b8a57506001919050565b6001600160a01b03821660009081526004602052604090205460ff16610bb257506000919050565b919050565b6000610bc43384846124c5565b5060015b92915050565b600033610be36000546001600160a01b031690565b6001600160a01b031614610c125760405162461bcd60e51b8152600401610c099061383f565b60405180910390fd5b601954421015610c345760405162461bcd60e51b8152600401610c0990613874565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb9919061389e565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906138b7565b5060135447906001600160a01b031663af2979eb30846064610d6482604b6138ea565b610d6e9190613909565b6064610d7b88604b6138ea565b610d859190613909565b30426040518763ffffffff1660e01b8152600401610da89695949392919061392b565b602060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa919061389e565b506000610e078247613966565b90508060146000828254610e1b919061397d565b909155509094505050505090565b610e356009600a613a79565b610e439063f6a5c1496138ea565b81565b6000610e538484846125b8565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610ebe5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c09565b610ed28533610ecd8685613966565b6124c5565b506001949350505050565b33610ef06000546001600160a01b031690565b6001600160a01b031614610f165760405162461bcd60e51b8152600401610c099061383f565b610f1e612815565b565b33610f336000546001600160a01b031690565b6001600160a01b031614610f595760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116600081815260046020526040808220805460ff1916905551600080516020613c288339815191529190a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bc4918590610ecd90869061397d565b60008033610fdd6000546001600160a01b031690565b6001600160a01b0316146110035760405162461bcd60e51b8152600401610c099061383f565b6019544210156110255760405162461bcd60e51b8152600401610c0990613874565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561107257600080fd5b505afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa919061389e565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b1580156110fa57600080fd5b505af115801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906138b7565b506008546040518281526001600160a01b03909116903090600080516020613c088339815191529060200160405180910390a36008546001600160a01b031693509150509091565b3361118d6000546001600160a01b031690565b6001600160a01b0316146111b35760405162461bcd60e51b8152600401610c099061383f565b60145481111561121b5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610c09565b806014600082825461122d9190613966565b90915550506008546001600160a01b03166108fc606461124e8460256138ea565b6112589190613909565b6040518115909202916000818181858888f19350505050158015611280573d6000803e3d6000fd5b506009546001600160a01b03166108fc606461129d8460256138ea565b6112a79190613909565b6112b19084613966565b6040518115909202916000818181858888f193505050501580156112d9573d6000803e3d6000fd5b506008546001600160a01b031630600080516020613c0883398151915260646113038560256138ea565b61130d9190613909565b60405190815260200160405180910390a36009546001600160a01b031630600080516020613c0883398151915260646113478560256138ea565b6113519190613909565b61135b9085613966565b60405190815260200160405180910390a350565b336113826000546001600160a01b031690565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610c099061383f565b6019544210156113ca5760405162461bcd60e51b8152600401610c0990613874565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611417576040519150601f19603f3d011682016040523d82523d6000602084013e61141c565b606091505b50509050806114605760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610c09565b50565b336114766000546001600160a01b031690565b6001600160a01b03161461149c5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166114c25760405162461bcd60e51b8152600401610c0990613a88565b601880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114ff6000546001600160a01b031690565b6001600160a01b0316146115255760405162461bcd60e51b8152600401610c099061383f565b6000846115328789613abf565b61153c9190613abf565b90508060ff166064146115a05760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610c09565b60148460ff16111561161a5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610c09565b60148360ff1611156116945760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610c09565b60148260ff1611156117195760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610c09565b86601260036101000a81548160ff021916908360ff16021790555085601260046101000a81548160ff021916908360ff16021790555084601260056101000a81548160ff021916908360ff16021790555083601260006101000a81548160ff021916908360ff16021790555082601260016101000a81548160ff021916908360ff16021790555081601260026101000a81548160ff021916908360ff160217905550601260039054906101000a900460ff1660ff16600080516020613be883398151915260405160405180910390a260125460405164010000000090910460ff1690600080516020613be883398151915290600090a260125460405160ff90911690600080516020613be883398151915290600090a260125460405161010090910460ff1690600080516020613be883398151915290600090a26012546040516201000090910460ff1690600080516020613be883398151915290600090a250505050505050565b336118946000546001600160a01b031690565b6001600160a01b0316146118ba5760405162461bcd60e51b8152600401610c099061383f565b6014805460009091556008546001600160a01b03166108fc606461124e8460256138ea565b336118f26000546001600160a01b031690565b6001600160a01b0316146119185760405162461bcd60e51b8152600401610c099061383f565b611923600582612968565b506040516001600160a01b03821690600080516020613c2883398151915290600090a250565b3361195c6000546001600160a01b031690565b6001600160a01b0316146119825760405162461bcd60e51b8152600401610c099061383f565b61199461198f428361397d565b61297d565b61199e428261397d565b604051600080516020613be883398151915290600090a250565b6000806119c76009600a613a79565b600c546119d49190613909565b6119e06009600a613a79565b600d546119ed9190613909565b915091509091565b33611a086000546001600160a01b031690565b6001600160a01b031614611a2e5760405162461bcd60e51b8152600401610c099061383f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a8b6000546001600160a01b031690565b6001600160a01b031614611ab15760405162461bcd60e51b8152600401610c099061383f565b6018805461ff00191661010017905542600f55565b601754611ad3904261397d565b33600090815260036020526040902055565b905090565b33611afd6000546001600160a01b031690565b6001600160a01b031614611b235760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116611b495760405162461bcd60e51b8152600401610c0990613a88565b600a80546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b33611b946000546001600160a01b031690565b6001600160a01b031614611bba5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116611be05760405162461bcd60e51b8152600401610c0990613a88565b600880546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b33611c2b6000546001600160a01b031690565b6001600160a01b031614611c515760405162461bcd60e51b8152600401610c099061383f565b6018805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611ca96000546001600160a01b031690565b6001600160a01b031614611ccf5760405162461bcd60e51b8152600401610c099061383f565b6064600b54611cde9190613909565b8110611d4a5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610c09565b611d566009600a613a79565b611d6090836138ea565b9150611d6e6009600a613a79565b611d7890826138ea565b9050600061019061ffff16600b54611d909190613909565b9050600061019061ffff16600b54611da89190613909565b905081841015611e0e5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610c09565b80831015611e6f5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610c09565b600c849055600d8390556040518490600080516020613be883398151915290600090a2600d54604051600080516020613be883398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611f155760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c09565b611f243385610ecd8685613966565b5060019392505050565b6000610bc43384846125b8565b33611f4e6000546001600160a01b031690565b6001600160a01b031614611f745760405162461bcd60e51b8152600401610c099061383f565b6016805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611fd66000546001600160a01b031690565b6001600160a01b031614611ffc5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166120225760405162461bcd60e51b8152600401610c0990613a88565b600980546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b60006019544210156120745742601954611ae59190613966565b50600090565b60006120886009600a613a79565b600b546120976009600a613a79565b6120a59063f6a5c1496138ea565b6120af9190613966565b611ae59190613909565b336120cc6000546001600160a01b031690565b6001600160a01b0316146120f25760405162461bcd60e51b8152600401610c099061383f565b60078190556040518190600080516020613be883398151915290600090a250565b336121266000546001600160a01b031690565b6001600160a01b03161461214c5760405162461bcd60e51b8152600401610c099061383f565b6121586009600a613a79565b61216290826138ea565b600e819055604051600080516020613be883398151915290600090a250565b336121946000546001600160a01b031690565b6001600160a01b0316146121ba5760405162461bcd60e51b8152600401610c099061383f565b60098111156122045760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610c09565b60178190556040518190600080516020613be883398151915290600090a250565b336122386000546001600160a01b031690565b6001600160a01b03161461225e5760405162461bcd60e51b8152600401610c099061383f565b60005b81518110156122c65760016004600084848151811061228257612282613ae4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806122be81613afa565b915050612261565b5050565b6001600160a01b0381166000908152600360205260408120544281116122f35750600092915050565b6122fd4282613966565b9392505050565b336123176000546001600160a01b031690565b6001600160a01b03161461233d5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116600081815260046020526040808220805460ff1916600117905551600080516020613c288339815191529190a250565b3361238a6000546001600160a01b031690565b6001600160a01b0316146123b05760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166124155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c09565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336124836000546001600160a01b031690565b6001600160a01b0316146124a95760405162461bcd60e51b8152600401610c099061383f565b6119236005825b60006122fd836001600160a01b038416612a07565b6001600160a01b03831661250f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c09565b6001600160a01b0382166125575760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c09565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166126035760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c09565b6001600160a01b03821661264c5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c09565b6000612659600585612a56565b8061266a575061266a600584612a56565b905060006001600160a01b03851630148061268d57506001600160a01b03841630145b6013546012549192506001600160a01b0390811691600091888116600160301b909204161480156126cf5750816001600160a01b0316866001600160a01b0316145b8061270a57506012546001600160a01b03878116600160301b9092041614801561270a5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127445750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b90920416148061277e5750836001600160a01b0316886001600160a01b0316145b905084806127895750825b806127915750855b156127a6576127a1898989612a78565b61280a565b601854610100900460ff166127fd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610c09565b61280a8989898585612b31565b505050505050505050565b6016805460ff19166001908117909155306000908152602091909152604081205460125490919061285d90640100000000810460ff9081169165010000000000900416613abf565b60ff1690506000600754905080831080612879575061ffff8216155b156128865750505061295c565b60125460009061ffff8416906128a790640100000000900460ff16846138ea565b6128b19190613909565b905060006128bf8284613966565b905060006128ce600284613909565b905060006128dc8285613966565b905060006128ea848361397d565b9050476128f68261314a565b60006129028247613966565b905060008361291186846138ea565b61291b9190613909565b905061292786826132b2565b50600090506129368447613966565b9050806014600082825461294a919061397d565b90915550505050505050505050505050505b6016805460ff19169055565b60006122fd836001600160a01b0384166133b7565b60195481116129e65760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610c09565b60198190556040518190600080516020613be883398151915290600090a250565b6000818152600183016020526040812054612a4e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc8565b506000610bc8565b6001600160a01b038116600090815260018301602052604081205415156122fd565b6001600160a01b03831660009081526001602052604090205481811015612adc5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c09565b612ae684836134a4565b612af083836134e9565b826001600160a01b0316846001600160a01b0316600080516020613c0883398151915284604051612b2391815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b9f5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c09565b60008315612ccc57600d54861115612beb5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610c09565b6001600160a01b03881660009081526004602052604090205460ff1615612c4b5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c09565b601054600f54612c5b919061397d565b4211158015612c6c57506011546001145b15612cbb576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b50601254610100900460ff16612ff7565b8415612e5957600c54612cdf878561397d565b1115612d205760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c09565b600e54861115612d7d5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610c09565b6001600160a01b03871660009081526004602052604090205460ff1615612ddd5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c09565b601054600f54612ded919061397d565b4211158015612dfe57506011546001145b15612e4d576001600160a01b038716600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125460ff16612ff7565b6001600160a01b03881660009081526004602052604090205460ff1615612ec25760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610c09565b6001600160a01b03871660009081526004602052604090205460ff1615612f2b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610c09565b600c54612f38878561397d565b1115612f795760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c09565b601054600f54612f89919061397d565b4211158015612f9a57506011546001145b15612fe9576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125462010000900460ff165b6012546001600160a01b03898116600160301b909204161480159061301f575060185460ff16155b801561302e575060165460ff16155b80156130375750835b1561304457613044612815565b60006130608783601260039054906101000a900460ff1661350d565b60125490915060009061309690899085906130919060ff640100000000820481169165010000000000900416613abf565b61350d565b905060006130a4828461397d565b6130ae908a613966565b90506130ba8b8a6134a4565b30600090815260016020526040812080548492906130d990849061397d565b9250508190555082600b60008282546130f29190613966565b9091555061310290508a826134e9565b896001600160a01b03168b6001600160a01b0316600080516020613c088339815191528360405161313591815260200190565b60405180910390a35050505050505050505050565b6013546131629030906001600160a01b0316836124c5565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061319757613197613ae4565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131eb57600080fd5b505afa1580156131ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132239190613b15565b8160018151811061323657613236613ae4565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac9479061327c908590600090869030904290600401613b32565b600060405180830381600087803b15801561329657600080fd5b505af11580156132aa573d6000803e3d6000fd5b505050505050565b60008082601560008282546132c7919061397d565b909155506000905060646132dc85604b6138ea565b6132e69190613909565b9050600060646132f787604b6138ea565b6133019190613909565b60135490915061331c9030906001600160a01b0316886124c5565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906133589030908b90879089908490429060040161392b565b6060604051808303818588803b15801561337157600080fd5b505af1158015613385573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133aa9190613ba3565b5096979596505050505050565b6000818152600183016020526040812054801561349a5760006133db600183613966565b85549091506000906133ef90600190613966565b9050600086600001828154811061340857613408613ae4565b906000526020600020015490508087600001848154811061342b5761342b613ae4565b60009182526020808320909101929092558281526001890190915260409020849055865487908061345e5761345e613bd1565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc8565b6000915050610bc8565b6001600160a01b0382166000908152600160205260408120546134c8908390613966565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546134c890839061397d565b60006127108260ff168460ff168661352591906138ea565b61352f91906138ea565b6135399190613909565b949350505050565b6001600160a01b038116811461146057600080fd5b8035610bb281613541565b60006020828403121561357357600080fd5b81356122fd81613541565b600060208083528351808285015260005b818110156135ab5785810183015185820160400152820161358f565b818111156135bd576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156135e657600080fd5b82356135f181613541565b946020939093013593505050565b60008060006060848603121561361457600080fd5b833561361f81613541565b9250602084013561362f81613541565b929592945050506040919091013590565b60006020828403121561365257600080fd5b5035919050565b803560ff81168114610bb257600080fd5b60008060008060008060c0878903121561368357600080fd5b61368c87613659565b955061369a60208801613659565b94506136a860408801613659565b93506136b660608801613659565b92506136c460808801613659565b91506136d260a08801613659565b90509295509295509295565b801515811461146057600080fd5b6000602082840312156136fe57600080fd5b81356122fd816136de565b6000806040838503121561371c57600080fd5b50508035926020909101359150565b6000806040838503121561373e57600080fd5b823561374981613541565b9150602083013561375981613541565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561378d57600080fd5b823567ffffffffffffffff808211156137a557600080fd5b818501915085601f8301126137b957600080fd5b8135818111156137cb576137cb613764565b8060051b604051601f19603f830116810181811085821117156137f0576137f0613764565b60405291825284820192508381018501918883111561380e57600080fd5b938501935b828510156138335761382485613556565b84529385019392850192613813565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156138b057600080fd5b5051919050565b6000602082840312156138c957600080fd5b81516122fd816136de565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613904576139046138d4565b500290565b60008261392657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082821015613978576139786138d4565b500390565b60008219821115613990576139906138d4565b500190565b600181815b808511156139d05781600019048211156139b6576139b66138d4565b808516156139c357918102915b93841c939080029061399a565b509250929050565b6000826139e757506001610bc8565b816139f457506000610bc8565b8160018114613a0a5760028114613a1457613a30565b6001915050610bc8565b60ff841115613a2557613a256138d4565b50506001821b610bc8565b5060208310610133831016604e8410600b8410161715613a53575081810a610bc8565b613a5d8383613995565b8060001904821115613a7157613a716138d4565b029392505050565b60006122fd60ff8416836139d8565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff03821115613adc57613adc6138d4565b019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b0e57613b0e6138d4565b5060010190565b600060208284031215613b2757600080fd5b81516122fd81613541565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b825784516001600160a01b031683529383019391830191600101613b5d565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613bb857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220624d34016fb7d3bfef185d52a6090cf54292b4783b1401eea33f44652042416864736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103815760003560e01c80636e94312d116101cf5780639fa62d5f11610101578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610adc578063f2c816ae14610afc578063f2fde38b14610b1c578063f9ab736614610b3c57005b8063daf9a47a14610a36578063dd62ed3e14610a56578063e2fd002a14610a9c578063e7278d6b14610abc57005b8063be636012116100d3578063be636012146109cc578063c3a3c032146109ec578063c3f4f54f14610a01578063d11edf7414610a1657005b80639fa62d5f1461094c578063a457c2d71461096c578063a9059cbb1461098c578063b766a386146109ac57005b8063828e8b7e11610173578063929dffda11610145578063929dffda146108bf57806395d89b41146108df5780639bc845fb1461090c5780639bf657701461092c57005b8063828e8b7e1461087257806386d0ada814610887578063893d20e8146108a15780638da5cb5b146108a157005b806370a08231116101ac57806370a08231146107fc578063715018a614610832578063762bb282146108475780637b9e987a1461085d57005b80636e94312d146107925780636eb8c7f1146107b25780636f89e409146107d257005b806339509351116102b35780634cdaf0ae1161024c57806358e553651161021e57806358e553651461070f5780635c69f6901461072557806361cb27481461073a578063677a88701461075a57005b80634cdaf0ae146106a45780634f91e48c146106c457806357ad67d1146106da57806358e1df92146106fa57005b806344f3c83a1161028557806344f3c83a1461062a5780634838d165146106405780634ada218b146106705780634cbf8e241461068f57005b806339509351146105a05780633c7a309b146105c05780633cc39b7a146105f45780634476f35a1461060a57005b80631eb25d13116103255780633054f8a3116102f75780633054f8a314610545578063311a86971461043d578063313ce5671461056457806335e82f3a1461058057005b80631eb25d131461049057806323b872dd146104a5578063243b529a146104c55780632973ef2d146104da57005b80630fa5b2151161035e5780630fa5b2151461041a5780630fd99e161461043d57806314ddc0951461046657806318160ddd1461047b57005b80630200264b1461038a57806306fdde03146103bf578063095ea7b3146103fa57005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004613561565b610b5c565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b50604080518082019091526009815268434845454d53494e5560b81b60208201525b6040516103b6919061357e565b34801561040657600080fd5b506103aa6104153660046135d3565b610bb7565b34801561042657600080fd5b5061042f610bce565b6040519081526020016103b6565b34801561044957600080fd5b5061045361019081565b60405161ffff90911681526020016103b6565b34801561047257600080fd5b5060175461042f565b34801561048757600080fd5b50600b5461042f565b34801561049c57600080fd5b5061042f610e29565b3480156104b157600080fd5b506103aa6104c03660046135ff565b610e46565b3480156104d157600080fd5b50610388610edd565b3480156104e657600080fd5b506012546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103b6565b34801561055157600080fd5b506016546103aa90610100900460ff1681565b34801561057057600080fd5b50604051600981526020016103b6565b34801561058c57600080fd5b5061038861059b366004613561565b610f20565b3480156105ac57600080fd5b506103aa6105bb3660046135d3565b610f90565b3480156105cc57600080fd5b506105d5610fc7565b604080516001600160a01b0390931683526020830191909152016103b6565b34801561060057600080fd5b5061042f60155481565b34801561061657600080fd5b50610388610625366004613640565b61117a565b34801561063657600080fd5b5061042f60175481565b34801561064c57600080fd5b506103aa61065b366004613561565b60046020526000908152604090205460ff1681565b34801561067c57600080fd5b506018546103aa90610100900460ff1681565b34801561069b57600080fd5b5061038861136f565b3480156106b057600080fd5b506103886106bf366004613561565b611463565b3480156106d057600080fd5b5061042f600d5481565b3480156106e657600080fd5b506103886106f536600461366a565b6114ec565b34801561070657600080fd5b50610388611881565b34801561071b57600080fd5b5061042f60145481565b34801561073157600080fd5b50610453600981565b34801561074657600080fd5b50610388610755366004613561565b6118df565b34801561076657600080fd5b5060085461077a906001600160a01b031681565b6040516001600160a01b0390911681526020016103b6565b34801561079e57600080fd5b5060095461077a906001600160a01b031681565b3480156107be57600080fd5b506103886107cd366004613640565b611949565b3480156107de57600080fd5b506107e76119b8565b604080519283526020830191909152016103b6565b34801561080857600080fd5b5061042f610817366004613561565b6001600160a01b031660009081526001602052604090205490565b34801561083e57600080fd5b506103886119f5565b34801561085357600080fd5b5061042f600c5481565b34801561086957600080fd5b50610388611a78565b34801561087e57600080fd5b50610388611ac6565b34801561089357600080fd5b506018546103aa9060ff1681565b3480156108ad57600080fd5b506000546001600160a01b031661077a565b3480156108cb57600080fd5b506103886108da366004613561565b611aea565b3480156108eb57600080fd5b5060408051808201909152600481526343494e5560e01b60208201526103ed565b34801561091857600080fd5b50610388610927366004613561565b611b81565b34801561093857600080fd5b506103886109473660046136ec565b611c18565b34801561095857600080fd5b50610388610967366004613709565b611c96565b34801561097857600080fd5b506103aa6109873660046135d3565b611eb2565b34801561099857600080fd5b506103aa6109a73660046135d3565b611f2e565b3480156109b857600080fd5b506103886109c73660046136ec565b611f3b565b3480156109d857600080fd5b506103886109e7366004613561565b611fc3565b3480156109f857600080fd5b5061042f61205a565b348015610a0d57600080fd5b5061042f61207a565b348015610a2257600080fd5b50610388610a31366004613640565b6120b9565b348015610a4257600080fd5b50610388610a51366004613640565b612113565b348015610a6257600080fd5b5061042f610a7136600461372b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610aa857600080fd5b50610388610ab7366004613640565b612181565b348015610ac857600080fd5b50610388610ad736600461377a565b612225565b348015610ae857600080fd5b5061042f610af7366004613561565b6122ca565b348015610b0857600080fd5b50610388610b17366004613561565b612304565b348015610b2857600080fd5b50610388610b37366004613561565b612377565b348015610b4857600080fd5b50610388610b57366004613561565b612470565b6001600160a01b03811660009081526004602052604081205460ff16151560011415610b8a57506001919050565b6001600160a01b03821660009081526004602052604090205460ff16610bb257506000919050565b919050565b6000610bc43384846124c5565b5060015b92915050565b600033610be36000546001600160a01b031690565b6001600160a01b031614610c125760405162461bcd60e51b8152600401610c099061383f565b60405180910390fd5b601954421015610c345760405162461bcd60e51b8152600401610c0990613874565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb9919061389e565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906138b7565b5060135447906001600160a01b031663af2979eb30846064610d6482604b6138ea565b610d6e9190613909565b6064610d7b88604b6138ea565b610d859190613909565b30426040518763ffffffff1660e01b8152600401610da89695949392919061392b565b602060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa919061389e565b506000610e078247613966565b90508060146000828254610e1b919061397d565b909155509094505050505090565b610e356009600a613a79565b610e439063f6a5c1496138ea565b81565b6000610e538484846125b8565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610ebe5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c09565b610ed28533610ecd8685613966565b6124c5565b506001949350505050565b33610ef06000546001600160a01b031690565b6001600160a01b031614610f165760405162461bcd60e51b8152600401610c099061383f565b610f1e612815565b565b33610f336000546001600160a01b031690565b6001600160a01b031614610f595760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116600081815260046020526040808220805460ff1916905551600080516020613c288339815191529190a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bc4918590610ecd90869061397d565b60008033610fdd6000546001600160a01b031690565b6001600160a01b0316146110035760405162461bcd60e51b8152600401610c099061383f565b6019544210156110255760405162461bcd60e51b8152600401610c0990613874565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561107257600080fd5b505afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa919061389e565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b1580156110fa57600080fd5b505af115801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906138b7565b506008546040518281526001600160a01b03909116903090600080516020613c088339815191529060200160405180910390a36008546001600160a01b031693509150509091565b3361118d6000546001600160a01b031690565b6001600160a01b0316146111b35760405162461bcd60e51b8152600401610c099061383f565b60145481111561121b5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610c09565b806014600082825461122d9190613966565b90915550506008546001600160a01b03166108fc606461124e8460256138ea565b6112589190613909565b6040518115909202916000818181858888f19350505050158015611280573d6000803e3d6000fd5b506009546001600160a01b03166108fc606461129d8460256138ea565b6112a79190613909565b6112b19084613966565b6040518115909202916000818181858888f193505050501580156112d9573d6000803e3d6000fd5b506008546001600160a01b031630600080516020613c0883398151915260646113038560256138ea565b61130d9190613909565b60405190815260200160405180910390a36009546001600160a01b031630600080516020613c0883398151915260646113478560256138ea565b6113519190613909565b61135b9085613966565b60405190815260200160405180910390a350565b336113826000546001600160a01b031690565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610c099061383f565b6019544210156113ca5760405162461bcd60e51b8152600401610c0990613874565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611417576040519150601f19603f3d011682016040523d82523d6000602084013e61141c565b606091505b50509050806114605760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610c09565b50565b336114766000546001600160a01b031690565b6001600160a01b03161461149c5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166114c25760405162461bcd60e51b8152600401610c0990613a88565b601880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114ff6000546001600160a01b031690565b6001600160a01b0316146115255760405162461bcd60e51b8152600401610c099061383f565b6000846115328789613abf565b61153c9190613abf565b90508060ff166064146115a05760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610c09565b60148460ff16111561161a5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610c09565b60148360ff1611156116945760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610c09565b60148260ff1611156117195760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610c09565b86601260036101000a81548160ff021916908360ff16021790555085601260046101000a81548160ff021916908360ff16021790555084601260056101000a81548160ff021916908360ff16021790555083601260006101000a81548160ff021916908360ff16021790555082601260016101000a81548160ff021916908360ff16021790555081601260026101000a81548160ff021916908360ff160217905550601260039054906101000a900460ff1660ff16600080516020613be883398151915260405160405180910390a260125460405164010000000090910460ff1690600080516020613be883398151915290600090a260125460405160ff90911690600080516020613be883398151915290600090a260125460405161010090910460ff1690600080516020613be883398151915290600090a26012546040516201000090910460ff1690600080516020613be883398151915290600090a250505050505050565b336118946000546001600160a01b031690565b6001600160a01b0316146118ba5760405162461bcd60e51b8152600401610c099061383f565b6014805460009091556008546001600160a01b03166108fc606461124e8460256138ea565b336118f26000546001600160a01b031690565b6001600160a01b0316146119185760405162461bcd60e51b8152600401610c099061383f565b611923600582612968565b506040516001600160a01b03821690600080516020613c2883398151915290600090a250565b3361195c6000546001600160a01b031690565b6001600160a01b0316146119825760405162461bcd60e51b8152600401610c099061383f565b61199461198f428361397d565b61297d565b61199e428261397d565b604051600080516020613be883398151915290600090a250565b6000806119c76009600a613a79565b600c546119d49190613909565b6119e06009600a613a79565b600d546119ed9190613909565b915091509091565b33611a086000546001600160a01b031690565b6001600160a01b031614611a2e5760405162461bcd60e51b8152600401610c099061383f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a8b6000546001600160a01b031690565b6001600160a01b031614611ab15760405162461bcd60e51b8152600401610c099061383f565b6018805461ff00191661010017905542600f55565b601754611ad3904261397d565b33600090815260036020526040902055565b905090565b33611afd6000546001600160a01b031690565b6001600160a01b031614611b235760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116611b495760405162461bcd60e51b8152600401610c0990613a88565b600a80546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b33611b946000546001600160a01b031690565b6001600160a01b031614611bba5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116611be05760405162461bcd60e51b8152600401610c0990613a88565b600880546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b33611c2b6000546001600160a01b031690565b6001600160a01b031614611c515760405162461bcd60e51b8152600401610c099061383f565b6018805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611ca96000546001600160a01b031690565b6001600160a01b031614611ccf5760405162461bcd60e51b8152600401610c099061383f565b6064600b54611cde9190613909565b8110611d4a5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610c09565b611d566009600a613a79565b611d6090836138ea565b9150611d6e6009600a613a79565b611d7890826138ea565b9050600061019061ffff16600b54611d909190613909565b9050600061019061ffff16600b54611da89190613909565b905081841015611e0e5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610c09565b80831015611e6f5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610c09565b600c849055600d8390556040518490600080516020613be883398151915290600090a2600d54604051600080516020613be883398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611f155760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c09565b611f243385610ecd8685613966565b5060019392505050565b6000610bc43384846125b8565b33611f4e6000546001600160a01b031690565b6001600160a01b031614611f745760405162461bcd60e51b8152600401610c099061383f565b6016805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611fd66000546001600160a01b031690565b6001600160a01b031614611ffc5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166120225760405162461bcd60e51b8152600401610c0990613a88565b600980546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c2883398151915290600090a250565b60006019544210156120745742601954611ae59190613966565b50600090565b60006120886009600a613a79565b600b546120976009600a613a79565b6120a59063f6a5c1496138ea565b6120af9190613966565b611ae59190613909565b336120cc6000546001600160a01b031690565b6001600160a01b0316146120f25760405162461bcd60e51b8152600401610c099061383f565b60078190556040518190600080516020613be883398151915290600090a250565b336121266000546001600160a01b031690565b6001600160a01b03161461214c5760405162461bcd60e51b8152600401610c099061383f565b6121586009600a613a79565b61216290826138ea565b600e819055604051600080516020613be883398151915290600090a250565b336121946000546001600160a01b031690565b6001600160a01b0316146121ba5760405162461bcd60e51b8152600401610c099061383f565b60098111156122045760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610c09565b60178190556040518190600080516020613be883398151915290600090a250565b336122386000546001600160a01b031690565b6001600160a01b03161461225e5760405162461bcd60e51b8152600401610c099061383f565b60005b81518110156122c65760016004600084848151811061228257612282613ae4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806122be81613afa565b915050612261565b5050565b6001600160a01b0381166000908152600360205260408120544281116122f35750600092915050565b6122fd4282613966565b9392505050565b336123176000546001600160a01b031690565b6001600160a01b03161461233d5760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b038116600081815260046020526040808220805460ff1916600117905551600080516020613c288339815191529190a250565b3361238a6000546001600160a01b031690565b6001600160a01b0316146123b05760405162461bcd60e51b8152600401610c099061383f565b6001600160a01b0381166124155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c09565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336124836000546001600160a01b031690565b6001600160a01b0316146124a95760405162461bcd60e51b8152600401610c099061383f565b6119236005825b60006122fd836001600160a01b038416612a07565b6001600160a01b03831661250f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c09565b6001600160a01b0382166125575760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c09565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166126035760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c09565b6001600160a01b03821661264c5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c09565b6000612659600585612a56565b8061266a575061266a600584612a56565b905060006001600160a01b03851630148061268d57506001600160a01b03841630145b6013546012549192506001600160a01b0390811691600091888116600160301b909204161480156126cf5750816001600160a01b0316866001600160a01b0316145b8061270a57506012546001600160a01b03878116600160301b9092041614801561270a5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127445750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b90920416148061277e5750836001600160a01b0316886001600160a01b0316145b905084806127895750825b806127915750855b156127a6576127a1898989612a78565b61280a565b601854610100900460ff166127fd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610c09565b61280a8989898585612b31565b505050505050505050565b6016805460ff19166001908117909155306000908152602091909152604081205460125490919061285d90640100000000810460ff9081169165010000000000900416613abf565b60ff1690506000600754905080831080612879575061ffff8216155b156128865750505061295c565b60125460009061ffff8416906128a790640100000000900460ff16846138ea565b6128b19190613909565b905060006128bf8284613966565b905060006128ce600284613909565b905060006128dc8285613966565b905060006128ea848361397d565b9050476128f68261314a565b60006129028247613966565b905060008361291186846138ea565b61291b9190613909565b905061292786826132b2565b50600090506129368447613966565b9050806014600082825461294a919061397d565b90915550505050505050505050505050505b6016805460ff19169055565b60006122fd836001600160a01b0384166133b7565b60195481116129e65760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610c09565b60198190556040518190600080516020613be883398151915290600090a250565b6000818152600183016020526040812054612a4e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc8565b506000610bc8565b6001600160a01b038116600090815260018301602052604081205415156122fd565b6001600160a01b03831660009081526001602052604090205481811015612adc5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c09565b612ae684836134a4565b612af083836134e9565b826001600160a01b0316846001600160a01b0316600080516020613c0883398151915284604051612b2391815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b9f5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c09565b60008315612ccc57600d54861115612beb5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610c09565b6001600160a01b03881660009081526004602052604090205460ff1615612c4b5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c09565b601054600f54612c5b919061397d565b4211158015612c6c57506011546001145b15612cbb576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b50601254610100900460ff16612ff7565b8415612e5957600c54612cdf878561397d565b1115612d205760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c09565b600e54861115612d7d5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610c09565b6001600160a01b03871660009081526004602052604090205460ff1615612ddd5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c09565b601054600f54612ded919061397d565b4211158015612dfe57506011546001145b15612e4d576001600160a01b038716600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125460ff16612ff7565b6001600160a01b03881660009081526004602052604090205460ff1615612ec25760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610c09565b6001600160a01b03871660009081526004602052604090205460ff1615612f2b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610c09565b600c54612f38878561397d565b1115612f795760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c09565b601054600f54612f89919061397d565b4211158015612f9a57506011546001145b15612fe9576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125462010000900460ff165b6012546001600160a01b03898116600160301b909204161480159061301f575060185460ff16155b801561302e575060165460ff16155b80156130375750835b1561304457613044612815565b60006130608783601260039054906101000a900460ff1661350d565b60125490915060009061309690899085906130919060ff640100000000820481169165010000000000900416613abf565b61350d565b905060006130a4828461397d565b6130ae908a613966565b90506130ba8b8a6134a4565b30600090815260016020526040812080548492906130d990849061397d565b9250508190555082600b60008282546130f29190613966565b9091555061310290508a826134e9565b896001600160a01b03168b6001600160a01b0316600080516020613c088339815191528360405161313591815260200190565b60405180910390a35050505050505050505050565b6013546131629030906001600160a01b0316836124c5565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061319757613197613ae4565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131eb57600080fd5b505afa1580156131ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132239190613b15565b8160018151811061323657613236613ae4565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac9479061327c908590600090869030904290600401613b32565b600060405180830381600087803b15801561329657600080fd5b505af11580156132aa573d6000803e3d6000fd5b505050505050565b60008082601560008282546132c7919061397d565b909155506000905060646132dc85604b6138ea565b6132e69190613909565b9050600060646132f787604b6138ea565b6133019190613909565b60135490915061331c9030906001600160a01b0316886124c5565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906133589030908b90879089908490429060040161392b565b6060604051808303818588803b15801561337157600080fd5b505af1158015613385573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133aa9190613ba3565b5096979596505050505050565b6000818152600183016020526040812054801561349a5760006133db600183613966565b85549091506000906133ef90600190613966565b9050600086600001828154811061340857613408613ae4565b906000526020600020015490508087600001848154811061342b5761342b613ae4565b60009182526020808320909101929092558281526001890190915260409020849055865487908061345e5761345e613bd1565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc8565b6000915050610bc8565b6001600160a01b0382166000908152600160205260408120546134c8908390613966565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546134c890839061397d565b60006127108260ff168460ff168661352591906138ea565b61352f91906138ea565b6135399190613909565b949350505050565b6001600160a01b038116811461146057600080fd5b8035610bb281613541565b60006020828403121561357357600080fd5b81356122fd81613541565b600060208083528351808285015260005b818110156135ab5785810183015185820160400152820161358f565b818111156135bd576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156135e657600080fd5b82356135f181613541565b946020939093013593505050565b60008060006060848603121561361457600080fd5b833561361f81613541565b9250602084013561362f81613541565b929592945050506040919091013590565b60006020828403121561365257600080fd5b5035919050565b803560ff81168114610bb257600080fd5b60008060008060008060c0878903121561368357600080fd5b61368c87613659565b955061369a60208801613659565b94506136a860408801613659565b93506136b660608801613659565b92506136c460808801613659565b91506136d260a08801613659565b90509295509295509295565b801515811461146057600080fd5b6000602082840312156136fe57600080fd5b81356122fd816136de565b6000806040838503121561371c57600080fd5b50508035926020909101359150565b6000806040838503121561373e57600080fd5b823561374981613541565b9150602083013561375981613541565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561378d57600080fd5b823567ffffffffffffffff808211156137a557600080fd5b818501915085601f8301126137b957600080fd5b8135818111156137cb576137cb613764565b8060051b604051601f19603f830116810181811085821117156137f0576137f0613764565b60405291825284820192508381018501918883111561380e57600080fd5b938501935b828510156138335761382485613556565b84529385019392850192613813565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156138b057600080fd5b5051919050565b6000602082840312156138c957600080fd5b81516122fd816136de565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613904576139046138d4565b500290565b60008261392657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082821015613978576139786138d4565b500390565b60008219821115613990576139906138d4565b500190565b600181815b808511156139d05781600019048211156139b6576139b66138d4565b808516156139c357918102915b93841c939080029061399a565b509250929050565b6000826139e757506001610bc8565b816139f457506000610bc8565b8160018114613a0a5760028114613a1457613a30565b6001915050610bc8565b60ff841115613a2557613a256138d4565b50506001821b610bc8565b5060208310610133831016604e8410600b8410161715613a53575081810a610bc8565b613a5d8383613995565b8060001904821115613a7157613a716138d4565b029392505050565b60006122fd60ff8416836139d8565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff03821115613adc57613adc6138d4565b019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b0e57613b0e6138d4565b5060010190565b600060208284031215613b2757600080fd5b81516122fd81613541565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b825784516001600160a01b031683529383019391830191600101613b5d565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613bb857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220624d34016fb7d3bfef185d52a6090cf54292b4783b1401eea33f44652042416864736f6c63430008090033

Deployed Bytecode Sourcemap

27743:29304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47071:386;;;;;;;;;;-1:-1:-1;47071:386:0;;;;;:::i;:::-;;:::i;:::-;;;706:14:1;;699:22;681:41;;669:2;654:18;47071:386:0;;;;;;;;54701:94;;;;;;;;;;-1:-1:-1;54782:5:0;;;;;;;;;;;;-1:-1:-1;;;54782:5:0;;;;54701:94;;;;;;;:::i;55586:161::-;;;;;;;;;;-1:-1:-1;55586:161:0;;;;;:::i;:::-;;:::i;52802:1015::-;;;;;;;;;;;;;:::i;:::-;;;1801:25:1;;;1789:2;1774:18;52802:1015:0;1655:177:1;28900:43:0;;;;;;;;;;;;28940:3;28900:43;;;;;2011:6:1;1999:19;;;1981:38;;1969:2;1954:18;28900:43:0;1837:188:1;42709:102:0;;;;;;;;;;-1:-1:-1;42792:11:0;;42709:102;;55011:108;;;;;;;;;;-1:-1:-1;55093:18:0;;55011:108;;28540:65;;;;;;;;;;;;;:::i;56060:392::-;;;;;;;;;;-1:-1:-1;56060:392:0;;;;;:::i;:::-;;:::i;48937:83::-;;;;;;;;;;;;;:::i;42113:249::-;;;;;;;;;;-1:-1:-1;42287:8:0;;42113:249;;;42287:8;;;;;;2778:25:1;;42296:13:0;;;;;2834:2:1;2819:18;;2812:34;42310:13:0;;;;;2862:18:1;;;2855:34;;;;42324:7:0;;;2920:2:1;2905:18;;2898:34;42287:8:0;42332;;;;2963:3:1;2948:19;;2941:35;42341:12:0;;;;;3007:3:1;2992:19;;2985:35;2765:3;2750:19;42113:249:0;2491:535:1;43180:27:0;;;;;;;;;;-1:-1:-1;43180:27:0;;;;;;;;;;;54909:94;;;;;;;;;;-1:-1:-1;54909:94:0;;28532:1;3173:36:1;;3161:2;3146:18;54909:94:0;3031:184:1;47538:199:0;;;;;;;;;;-1:-1:-1;47538:199:0;;;;;:::i;:::-;;:::i;56487:205::-;;;;;;;;;;-1:-1:-1;56487:205:0;;;;;:::i;:::-;;:::i;52049:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3412:32:1;;;3394:51;;3476:2;3461:18;;3454:34;;;;3367:18;52049:695:0;3220:274:1;38154:25:0;;;;;;;;;;;;;;;;43708:494;;;;;;;;;;-1:-1:-1;43708:494:0;;;;;:::i;:::-;;:::i;43214:26::-;;;;;;;;;;;;;;;;28278:44;;;;;;;;;;-1:-1:-1;28278:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50557:26;;;;;;;;;;-1:-1:-1;50557:26:0;;;;;;;;;;;53903:268;;;;;;;;;;;;;:::i;50866:243::-;;;;;;;;;;-1:-1:-1;50866:243:0;;;;;:::i;:::-;;:::i;29846:46::-;;;;;;;;;;;;;;;;47835:1048;;;;;;;;;;-1:-1:-1;47835:1048:0;;;;;:::i;:::-;;:::i;43285:416::-;;;;;;;;;;;;;:::i;37416:31::-;;;;;;;;;;;;;;;;29080:48;;;;;;;;;;;;29119:9;29080:48;;46304:181;;;;;;;;;;-1:-1:-1;46304:181:0;;;;;:::i;:::-;;:::i;29298:77::-;;;;;;;;;;-1:-1:-1;29298:77:0;;;;-1:-1:-1;;;;;29298:77:0;;;;;;-1:-1:-1;;;;;4549:32:1;;;4531:51;;4519:2;4504:18;29298:77:0;4385:203:1;29382:80:0;;;;;;;;;;-1:-1:-1;29382:80:0;;;;-1:-1:-1;;;;;29382:80:0;;;51356:232;;;;;;;;;;-1:-1:-1;51356:232:0;;;;;:::i;:::-;;:::i;41954:151::-;;;;;;;;;;;;;:::i;:::-;;;;4767:25:1;;;4823:2;4808:18;;4801:34;;;;4740:18;41954:151:0;4593:248:1;55127:121:0;;;;;;;;;;-1:-1:-1;55127:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;55222:18:0;55195:7;55222:18;;;:9;:18;;;;;;;55127:121;9594:142;;;;;;;;;;;;;:::i;29790:49::-;;;;;;;;;;;;;;;;50671:129;;;;;;;;;;;;;:::i;42953:109::-;;;;;;;;;;;;;:::i;43247:28::-;;;;;;;;;;-1:-1:-1;43247:28:0;;;;;;;;54599:94;;;;;;;;;;-1:-1:-1;54651:7:0;9018:6;-1:-1:-1;;;;;9018:6:0;54599:94;;49032:247;;;;;;;;;;-1:-1:-1;49032:247:0;;;;;:::i;:::-;;:::i;54803:98::-;;;;;;;;;;-1:-1:-1;54886:7:0;;;;;;;;;;;;-1:-1:-1;;;54886:7:0;;;;54803:98;;44634:252;;;;;;;;;;-1:-1:-1;44634:252:0;;;;;:::i;:::-;;:::i;44287:165::-;;;;;;;;;;-1:-1:-1;44287:165:0;;;;;:::i;:::-;;:::i;49382:1045::-;;;;;;;;;;-1:-1:-1;49382:1045:0;;;;;:::i;:::-;;:::i;56700:342::-;;;;;;;;;;-1:-1:-1;56700:342:0;;;;;:::i;:::-;;:::i;55256:167::-;;;;;;;;;;-1:-1:-1;55256:167:0;;;;;:::i;:::-;;:::i;45229:156::-;;;;;;;;;;-1:-1:-1;45229:156:0;;;;;:::i;:::-;;:::i;44898:270::-;;;;;;;;;;-1:-1:-1;44898:270:0;;;;;:::i;:::-;;:::i;41585:222::-;;;;;;;;;;;;;:::i;41815:131::-;;;;;;;;;;;;;:::i;45824:179::-;;;;;;;;;;-1:-1:-1;45824:179:0;;;;;:::i;:::-;;:::i;44458:164::-;;;;;;;;;;-1:-1:-1;44458:164:0;;;;;:::i;:::-;;:::i;55431:147::-;;;;;;;;;;-1:-1:-1;55431:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;55542:19:0;;;55515:7;55542:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;55431:147;45454:246;;;;;;;;;;-1:-1:-1;45454:246:0;;;;;:::i;:::-;;:::i;46766:232::-;;;;;;;;;;-1:-1:-1;46766:232:0;;;;;:::i;:::-;;:::i;42428:275::-;;;;;;;;;;-1:-1:-1;42428:275:0;;;;;:::i;:::-;;:::i;46565:193::-;;;;;;;;;;-1:-1:-1;46565:193:0;;;;;:::i;:::-;;:::i;9891:238::-;;;;;;;;;;-1:-1:-1;9891:238:0;;;;;:::i;:::-;;:::i;46071:166::-;;;;;;;;;;-1:-1:-1;46071:166:0;;;;;:::i;:::-;;:::i;47071:386::-;-1:-1:-1;;;;;47196:27:0;;47151:18;47196:27;;;:9;:27;;;;;;;;:35;;:27;:35;47192:123;;;-1:-1:-1;47264:4:0;;47071:386;-1:-1:-1;47071:386:0:o;47192:123::-;-1:-1:-1;;;;;47329:27:0;;;;;;:9;:27;;;;;;;;47325:125;;-1:-1:-1;47398:5:0;;47071:386;-1:-1:-1;47071:386:0:o;47325:125::-;47071:386;;;:::o;55586:161::-;55663:4;55680:37;55689:10;55701:7;55710:6;55680:8;:37::i;:::-;-1:-1:-1;55735:4:0;55586:161;;;;;:::o;52802:1015::-;52861:18;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;;;;;;;;;52977:20:::1;;52958:15;:39;;52950:68;;;;-1:-1:-1::0;;;52950:68:0::1;;;;;;;:::i;:::-;53078:22;::::0;53129:39:::1;::::0;-1:-1:-1;;;53129:39:0;;53162:4:::1;53129:39;::::0;::::1;4531:51:1::0;53078:22:0;;;::::1;-1:-1:-1::0;;;;;53078:22:0::1;::::0;53029:30:::1;::::0;53078:22;;53129:24:::1;::::0;4504:18:1;;53129:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53212:16;::::0;53181:56:::1;::::0;-1:-1:-1;;;53181:56:0;;-1:-1:-1;;;;;53212:16:0;;::::1;53181:56;::::0;::::1;3394:51:1::0;3461:18;;;3454:34;;;53112:56:0;;-1:-1:-1;53181:22:0;::::1;::::0;::::1;::::0;3367:18:1;;53181:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53380:16:0::1;::::0;53338:21:::1;::::0;-1:-1:-1;;;;;53380:16:0::1;:64;53467:4;53487:6:::0;53522:3:::1;53509:9;53487:6:::0;53516:2:::1;53509:9;:::i;:::-;53508:17;;;;:::i;:::-;53554:3;53541:9;:6:::0;53548:2:::1;53541:9;:::i;:::-;53540:17;;;;:::i;:::-;53580:4;53600:15;53380:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53641:21:0::1;53665:39;53687:17:::0;53665:21:::1;:39;:::i;:::-;53641:63;;53733:13;53715:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53768:13:0;;-1:-1:-1;;;;;52802:1015:0;:::o;28540:65::-;28592:13;28532:1;28592:2;:13;:::i;:::-;28579:26;;:10;:26;:::i;:::-;28540:65;:::o;56060:392::-;56160:4;56177:36;56187:6;56195:9;56206:6;56177:9;:36::i;:::-;-1:-1:-1;;;;;56253:19:0;;56226:24;56253:19;;;:11;:19;;;;;;;;56273:10;56253:31;;;;;;;;56303:26;;;;56295:59;;;;-1:-1:-1;;;56295:59:0;;11235:2:1;56295:59:0;;;11217:21:1;11274:2;11254:18;;;11247:30;-1:-1:-1;;;11293:18:1;;;11286:50;11353:18;;56295:59:0;11033:344:1;56295:59:0;56367:55;56376:6;56384:10;56396:25;56415:6;56396:16;:25;:::i;:::-;56367:8;:55::i;:::-;-1:-1:-1;56440:4:0;;56060:392;-1:-1:-1;;;;56060:392:0:o;48937:83::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;48992:20:::1;:18;:20::i;:::-;48937:83::o:0;47538:199::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47632:31:0;::::1;47666:5;47632:31:::0;;;:9:::1;:31;::::0;;;;;:39;;-1:-1:-1;;47632:39:0::1;::::0;;47687:42;-1:-1:-1;;;;;;;;;;;47687:42:0;47666:5;47687:42:::1;47538:199:::0;:::o;56487:205::-;56595:10;56569:4;56616:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56616:32:0;;;;;;;;;;56569:4;;56586:76;;56607:7;;56616:45;;56651:10;;56616:45;:::i;52049:695::-;52109:17;;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;52244:20:::1;;52225:15;:39;;52217:68;;;;-1:-1:-1::0;;;52217:68:0::1;;;;;;;:::i;:::-;52355:22;::::0;52406:39:::1;::::0;-1:-1:-1;;;52406:39:0;;52439:4:::1;52406:39;::::0;::::1;4531:51:1::0;52355:22:0;;;::::1;-1:-1:-1::0;;;;;52355:22:0::1;::::0;52306:30:::1;::::0;52355:22;;52406:24:::1;::::0;4504:18:1;;52406:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52544:10;::::0;52520:43:::1;::::0;-1:-1:-1;;;52520:43:0;;-1:-1:-1;;;;;52544:10:0;;::::1;52520:43;::::0;::::1;3394:51:1::0;3461:18;;;3454:34;;;52389:56:0;;-1:-1:-1;52520:23:0;::::1;::::0;::::1;::::0;3367:18:1;;52520:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52603:10:0::1;::::0;52579:43:::1;::::0;1801:25:1;;;-1:-1:-1;;;;;52603:10:0;;::::1;::::0;52596:4:::1;::::0;-1:-1:-1;;;;;;;;;;;52579:43:0;1789:2:1;1774:18;52579:43:0::1;;;;;;;52645:10;::::0;-1:-1:-1;;;;;52645:10:0::1;::::0;-1:-1:-1;52679:6:0;-1:-1:-1;;52049:695:0;;:::o;43708:494::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;43804:16:::1;;43796:6;:24;;43788:91;;;::::0;-1:-1:-1;;;43788:91:0;;11584:2:1;43788:91:0::1;::::0;::::1;11566:21:1::0;11623:2;11603:18;;;11596:30;11662:34;11642:18;;;11635:62;-1:-1:-1;;;11713:18:1;;;11706:43;11766:19;;43788:91:0::1;11382:409:1::0;43788:91:0::1;43908:6;43890:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43933:10:0::1;::::0;-1:-1:-1;;;;;43933:10:0::1;43925:47;43968:3;43955:9;:6:::0;43962:2:::1;43955:9;:::i;:::-;43954:17;;;;:::i;:::-;43925:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43991:13:0::1;::::0;-1:-1:-1;;;;;43991:13:0::1;43983:59;44037:3;44024:9;:6:::0;44031:2:::1;44024:9;:::i;:::-;44023:17;;;;:::i;:::-;44016:24;::::0;:6;:24:::1;:::i;:::-;43983:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44082:10:0::1;::::0;-1:-1:-1;;;;;44082:10:0::1;44075:4;-1:-1:-1::0;;;;;;;;;;;44108:3:0::1;44095:9;:6:::0;44102:2:::1;44095:9;:::i;:::-;44094:17;;;;:::i;:::-;44058:54;::::0;1801:25:1;;;1789:2;1774:18;44058:54:0::1;;;;;;;44152:13;::::0;-1:-1:-1;;;;;44152:13:0::1;44145:4;-1:-1:-1::0;;;;;;;;;;;44189:3:0::1;44176:9;:6:::0;44183:2:::1;44176:9;:::i;:::-;44175:17;;;;:::i;:::-;44168:24;::::0;:6;:24:::1;:::i;:::-;44128:66;::::0;1801:25:1;;;1789:2;1774:18;44128:66:0::1;;;;;;;43708:494:::0;:::o;53903:268::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;53993:20:::1;;53974:15;:39;;53966:68;;;;-1:-1:-1::0;;;53966:68:0::1;;;;;;;:::i;:::-;54059:10;::::0;:51:::1;::::0;54046:9:::1;::::0;-1:-1:-1;;;;;54059:10:0::1;::::0;54083:21:::1;::::0;54046:9;54059:51;54046:9;54059:51;54083:21;54059:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54045:65;;;54129:4;54121:42;;;::::0;-1:-1:-1;;;54121:42:0;;12208:2:1;54121:42:0::1;::::0;::::1;12190:21:1::0;12247:2;12227:18;;;12220:30;-1:-1:-1;;;12266:18:1;;;12259:46;12322:18;;54121:42:0::1;12006:340:1::0;54121:42:0::1;53955:216;53903:268::o:0;50866:243::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50970:35:0;::::1;50962:84;;;;-1:-1:-1::0;;;50962:84:0::1;;;;;;;:::i;:::-;51057:22;:44:::0;;-1:-1:-1;;;;;51057:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;51057:44:0;;::::1;::::0;;;::::1;::::0;;50866:243::o;47835:1048::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;47995:14:::1;48035::::0;48010:24:::1;48020:14:::0;48010:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47995:54;;48068:8;:13;;48078:3;48068:13;48060:64;;;::::0;-1:-1:-1;;;48060:64:0;;13118:2:1;48060:64:0::1;::::0;::::1;13100:21:1::0;13157:2;13137:18;;;13130:30;13196:34;13176:18;;;13169:62;-1:-1:-1;;;13247:18:1;;;13240:36;13293:19;;48060:64:0::1;12916:402:1::0;48060:64:0::1;48153:2;48143:6;:12;;;;48135:95;;;::::0;-1:-1:-1;;;48135:95:0;;13525:2:1;48135:95:0::1;::::0;::::1;13507:21:1::0;13564:2;13544:18;;;13537:30;13603:34;13583:18;;;13576:62;13674:31;13654:18;;;13647:59;13723:19;;48135:95:0::1;13323:425:1::0;48135:95:0::1;48260:2;48249:7;:13;;;;48241:97;;;::::0;-1:-1:-1;;;48241:97:0;;13955:2:1;48241:97:0::1;::::0;::::1;13937:21:1::0;13994:2;13974:18;;;13967:30;14033:34;14013:18;;;14006:62;14104:32;14084:18;;;14077:60;14154:19;;48241:97:0::1;13753:426:1::0;48241:97:0::1;48372:2;48357:11;:17;;;;48349:105;;;::::0;-1:-1:-1;;;48349:105:0;;14386:2:1;48349:105:0::1;::::0;::::1;14368:21:1::0;14425:2;14405:18;;;14398:30;14464:34;14444:18;;;14437:62;14535:34;14515:18;;;14508:62;-1:-1:-1;;;14586:19:1;;;14579:33;14629:19;;48349:105:0::1;14184:470:1::0;48349:105:0::1;48476:9;48467:8;;:18;;;;;;;;;;;;;;;;;;48510:14;48496:13;;:28;;;;;;;;;;;;;;;;;;48549:14;48535:13;;:28;;;;;;;;;;;;;;;;;;48592:6;48584:7;;:14;;;;;;;;;;;;;;;;;;48618:7;48609:8;;:16;;;;;;;;;;;;;;;;;;48649:11;48636:12;;:24;;;;;;;;;;;;;;;;;;48694:8;;;;;;;;;;;48678:25;;-1:-1:-1::0;;;;;;;;;;;48678:25:0::1;;;;;;;;;48735:13;::::0;48719:30:::1;::::0;48735:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48719:30:0;;;::::1;48781:7;::::0;48765:24:::1;::::0;48781:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;48765:24:0;48781:7:::1;::::0;48765:24:::1;48821:8;::::0;48805:25:::1;::::0;48821:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48805:25:0;;;::::1;48862:12;::::0;48846:29:::1;::::0;48862:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48846:29:0;;;::::1;47984:899;47835:1048:::0;;;;;;:::o;43285:416::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;43368:16:::1;::::0;;43353:14:::1;43395:18:::0;;;43432:10:::1;::::0;-1:-1:-1;;;;;43432:10:0::1;43424:47;43467:3;43454:9;43368:16:::0;43461:2:::1;43454:9;:::i;46304:181::-:0;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;46389:33:::1;:9;46406:15:::0;46389:16:::1;:33::i;:::-;-1:-1:-1::0;46438:39:0::1;::::0;-1:-1:-1;;;;;46438:39:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46438:39:0;;;::::1;46304:181:::0;:::o;51356:232::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;51456:57:::1;51478:34;51497:15;51478:18:::0;:34:::1;:::i;:::-;51456:21;:57::i;:::-;51545:34;51564:15;51545:18:::0;:34:::1;:::i;:::-;51529:51;::::0;-1:-1:-1;;;;;;;;;;;51529:51:0;;;::::1;51356:232:::0;:::o;41954:151::-;41997:15;;42058:13;28532:1;42058:2;:13;:::i;:::-;42045:12;;:26;;;;:::i;:::-;42083:13;28532:1;42083:2;:13;:::i;:::-;42073:9;;:23;;;;:::i;:::-;42038:59;;;;41954:151;;:::o;9594:142::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;9695:1:::1;9679:6:::0;;9658:40:::1;::::0;-1:-1:-1;;;;;9679:6:0;;::::1;::::0;9658:40:::1;::::0;9695:1;;9658:40:::1;9726:1;9709:19:::0;;-1:-1:-1;;;;;;9709:19:0::1;::::0;;9594:142::o;50671:129::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;50730:14:::1;:19:::0;;-1:-1:-1;;50730:19:0::1;;;::::0;;50777:15:::1;50760:16;:32:::0;50671:129::o;42953:109::-;43040:11;;43024:27;;:15;:27;:::i;:::-;43012:10;43003:20;;;;:8;:20;;;;;:48;42953:109::o;54678:7::-;54671:14;;54599:94;:::o;49032:247::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49122:23:0;::::1;49114:72;;;;-1:-1:-1::0;;;49114:72:0::1;;;;;;;:::i;:::-;49197:15;:25:::0;;-1:-1:-1;;;;;;49197:25:0::1;-1:-1:-1::0;;;;;49197:25:0;::::1;::::0;;::::1;::::0;;;49238:33:::1;::::0;-1:-1:-1;;;;;;;;;;;49238:33:0;-1:-1:-1;;49238:33:0::1;49032:247:::0;:::o;44634:252::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44722:27:0;::::1;44714:74;;;;-1:-1:-1::0;;;44714:74:0::1;;;;;;;:::i;:::-;44797:10;:33:::0;;-1:-1:-1;;;;;;44797:33:0::1;-1:-1:-1::0;;;;;44797:33:0;::::1;::::0;;::::1;::::0;;;44844:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44844:34:0;-1:-1:-1;;44844:34:0::1;44634:252:::0;:::o;44287:165::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;44368:16:::1;:23:::0;;-1:-1:-1;;44368:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44407:37:::1;::::0;44368:23:::1;44427:16:::0;;;44407:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44407:37:0::1;44287:165:::0;:::o;49382:1045::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;49620:3:::1;49601:18;;:22;;;;:::i;:::-;49588:12;:35;49580:110;;;::::0;-1:-1:-1;;;49580:110:0;;14861:2:1;49580:110:0::1;::::0;::::1;14843:21:1::0;14900:2;14880:18;;;14873:30;14939:34;14919:18;;;14912:62;-1:-1:-1;;;14990:18:1;;;14983:51;15051:19;;49580:110:0::1;14659:417:1::0;49580:110:0::1;49768:13;28532:1;49768:2;:13;:::i;:::-;49752:29;::::0;:15;:29:::1;:::i;:::-;49736:45:::0;-1:-1:-1;49818:13:0::1;28532:1;49818:2;:13;:::i;:::-;49805:26;::::0;:12;:26:::1;:::i;:::-;49792:39;;49898:26;28825:3;49925:38;;:18;;:38;;;;:::i;:::-;49898:65;;49974:23;28940:3;49998:35;;:18;;:35;;;;:::i;:::-;49974:59;;50072:18;50055:15;:35;;50046:103;;;::::0;-1:-1:-1;;;50046:103:0;;15283:2:1;50046:103:0::1;::::0;::::1;15265:21:1::0;15322:2;15302:18;;;15295:30;15361:34;15341:18;;;15334:62;-1:-1:-1;;;15412:18:1;;;15405:41;15463:19;;50046:103:0::1;15081:407:1::0;50046:103:0::1;50183:15;50169:12;:29;;50160:94;;;::::0;-1:-1:-1;;;50160:94:0;;15695:2:1;50160:94:0::1;::::0;::::1;15677:21:1::0;15734:2;15714:18;;;15707:30;15773:34;15753:18;;;15746:62;-1:-1:-1;;;15824:18:1;;;15817:38;15872:19;;50160:94:0::1;15493:404:1::0;50160:94:0::1;50267:12;:30:::0;;;50308:9:::1;:24:::0;;;50348:29:::1;::::0;50282:15;;-1:-1:-1;;;;;;;;;;;50348:29:0;-1:-1:-1;;50348:29:0::1;50409:9;::::0;50393:26:::1;::::0;-1:-1:-1;;;;;;;;;;;50393:26:0;;;::::1;49473:954;;49382:1045:::0;;:::o;56700:342::-;56843:10;56787:4;56831:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56831:32:0;;;;;;;;;;56882:35;;;;56874:60;;;;-1:-1:-1;;;56874:60:0;;16104:2:1;56874:60:0;;;16086:21:1;16143:2;16123:18;;;16116:30;-1:-1:-1;;;16162:18:1;;;16155:42;16214:18;;56874:60:0;15902:336:1;56874:60:0;56947:65;56956:10;56968:7;56977:34;56996:15;56977:16;:34;:::i;56947:65::-;-1:-1:-1;57030:4:0;;56700:342;-1:-1:-1;;;56700:342:0:o;55256:167::-;55336:4;55353:40;55363:10;55375:9;55386:6;55353:9;:40::i;45229:156::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;45301:15:::1;:24:::0;;-1:-1:-1;;45301:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45341:36:::1;::::0;45301:24:::1;45361:15:::0;;;::::1;;45341:36;;::::0;::::1;::::0;-1:-1:-1;;45341:36:0::1;45229:156:::0;:::o;44898:270::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44992:30:0;::::1;44984:77;;;;-1:-1:-1::0;;;44984:77:0::1;;;;;;;:::i;:::-;45070:13;:39:::0;;-1:-1:-1;;;;;;45070:39:0::1;-1:-1:-1::0;;;;;45070:39:0;::::1;::::0;;::::1;::::0;;;45123:37:::1;::::0;-1:-1:-1;;;;;;;;;;;45123:37:0;-1:-1:-1;;45123:37:0::1;44898:270:::0;:::o;41585:222::-;41652:7;41690:20;;41674:15;:36;41671:110;;;41754:15;41733:20;;:36;;;;:::i;41671:110::-;-1:-1:-1;41798:1:0;;41585:222::o;41815:131::-;41864:7;41925:13;28532:1;41925:2;:13;:::i;:::-;41905:18;;28592:13;28532:1;28592:2;:13;:::i;:::-;28579:26;;:10;:26;:::i;:::-;41891:32;;;;:::i;:::-;41890:48;;;;:::i;45824:179::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;45908:19:::1;:35:::0;;;45959:36:::1;::::0;45930:13;;-1:-1:-1;;;;;;;;;;;45959:36:0;;;::::1;45824:179:::0;:::o;44458:164::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;44561:13:::1;28532:1;44561:2;:13;:::i;:::-;44546:28;::::0;:12;:28:::1;:::i;:::-;44536:9;:38:::0;;;44588:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44588:26:0;;;::::1;44458:164:::0;:::o;45454:246::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;29119:9:::1;45547:30:::0;::::1;;45539:64;;;::::0;-1:-1:-1;;;45539:64:0;;16445:2:1;45539:64:0::1;::::0;::::1;16427:21:1::0;16484:2;16464:18;;;16457:30;-1:-1:-1;;;16503:18:1;;;16496:52;16565:18;;45539:64:0::1;16243:346:1::0;45539:64:0::1;45618:11;:26:::0;;;45664:28:::1;::::0;45630:14;;-1:-1:-1;;;;;;;;;;;45664:28:0;;;::::1;45454:246:::0;:::o;46766:232::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;46872:9:::1;46866:115;46888:8;:15;46885:1;:18;46866:115;;;46951:4;46926:9;:22;46936:8;46945:1;46936:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46926:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46926:22:0;:29;;-1:-1:-1;;46926:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46906:3;::::1;::::0;::::1;:::i;:::-;;;;46866:115;;;;46766:232:::0;:::o;42428:275::-;-1:-1:-1;;;;;42550:24:0;;42515:7;42550:24;;;:8;:24;;;;;;42597:15;42587:25;;42584:71;;-1:-1:-1;42643:1:0;;42428:275;-1:-1:-1;;42428:275:0:o;42584:71::-;42671:24;42680:15;42671:8;:24;:::i;:::-;42664:31;42428:275;-1:-1:-1;;;42428:275:0:o;46565:193::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46654:31:0;::::1;;::::0;;;:9:::1;:31;::::0;;;;;:38;;-1:-1:-1;;46654:38:0::1;46688:4;46654:38;::::0;;46708:42;-1:-1:-1;;;;;;;;;;;46708:42:0;46654:31;46708:42:::1;46565:193:::0;:::o;9891:238::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9974:22:0;::::1;9966:73;;;::::0;-1:-1:-1;;;9966:73:0;;17068:2:1;9966:73:0::1;::::0;::::1;17050:21:1::0;17107:2;17087:18;;;17080:30;17146:34;17126:18;;;17119:62;-1:-1:-1;;;17197:18:1;;;17190:36;17243:19;;9966:73:0::1;16866:402:1::0;9966:73:0::1;10076:6;::::0;;10055:38:::1;::::0;-1:-1:-1;;;;;10055:38:0;;::::1;::::0;10076:6;::::1;::::0;10055:38:::1;::::0;::::1;10104:6;:17:::0;;-1:-1:-1;;;;;;10104:17:0::1;-1:-1:-1::0;;;;;10104:17:0;;;::::1;::::0;;;::::1;::::0;;9891:238::o;46071:166::-;9176:10;9165:7;8991;9018:6;-1:-1:-1;;;;;9018:6:0;;8953:79;9165:7;-1:-1:-1;;;;;9165:21:0;;9157:66;;;;-1:-1:-1;;;9157:66:0;;;;;;;:::i;:::-;46150:27:::1;:9;46164:12:::0;24644:152;24714:4;24738:50;24743:3;-1:-1:-1;;;;;24763:23:0;;24738:4;:50::i;55753:299::-;-1:-1:-1;;;;;55846:19:0;;55838:49;;;;-1:-1:-1;;;55838:49:0;;17475:2:1;55838:49:0;;;17457:21:1;17514:2;17494:18;;;17487:30;-1:-1:-1;;;17533:18:1;;;17526:47;17590:18;;55838:49:0;17273:341:1;55838:49:0;-1:-1:-1;;;;;55906:21:0;;55898:49;;;;-1:-1:-1;;;55898:49:0;;17821:2:1;55898:49:0;;;17803:21:1;17860:2;17840:18;;;17833:30;-1:-1:-1;;;17879:18:1;;;17872:45;17934:18;;55898:49:0;17619:339:1;55898:49:0;-1:-1:-1;;;;;55960:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;56012:32;;1801:25:1;;;56012:32:0;;1774:18:1;56012:32:0;;;;;;;55753:299;;;:::o;31972:1540::-;-1:-1:-1;;;;;32068:20:0;;32060:51;;;;-1:-1:-1;;;32060:51:0;;18165:2:1;32060:51:0;;;18147:21:1;18204:2;18184:18;;;18177:30;-1:-1:-1;;;18223:18:1;;;18216:48;18281:18;;32060:51:0;17963:342:1;32060:51:0;-1:-1:-1;;;;;32130:23:0;;32122:52;;;;-1:-1:-1;;;32122:52:0;;18512:2:1;32122:52:0;;;18494:21:1;18551:2;18531:18;;;18524:30;-1:-1:-1;;;18570:18:1;;;18563:46;18626:18;;32122:52:0;18310:340:1;32122:52:0;32267:15;32286:26;:9;32305:6;32286:18;:26::i;:::-;:59;;;-1:-1:-1;32316:29:0;:9;32335;32316:18;:29::i;:::-;32267:79;-1:-1:-1;32445:23:0;-1:-1:-1;;;;;32470:21:0;;32486:4;32470:21;;:49;;-1:-1:-1;;;;;;32495:24:0;;32514:4;32495:24;32470:49;32654:16;;32721:21;;32445:75;;-1:-1:-1;;;;;;32654:16:0;;;;32622:23;;32711:31;;;-1:-1:-1;;;32721:21:0;;;;32711:31;:63;;;;;32759:15;-1:-1:-1;;;;;32746:28:0;:9;-1:-1:-1;;;;;32746:28:0;;32711:63;32710:144;;;-1:-1:-1;32803:21:0;;-1:-1:-1;;;;;32790:34:0;;;-1:-1:-1;;;32803:21:0;;;;32790:34;:63;;;;;32838:15;-1:-1:-1;;;;;32828:25:0;:6;-1:-1:-1;;;;;32828:25:0;;32790:63;32976:21;;32682:173;;-1:-1:-1;32957:10:0;;-1:-1:-1;;;;;32968:29:0;;;-1:-1:-1;;;32976:21:0;;;;32968:29;;:57;;;33010:15;-1:-1:-1;;;;;33000:25:0;:6;-1:-1:-1;;;;;33000:25:0;;32968:57;33059:21;;32957:68;;-1:-1:-1;33036:11:0;;-1:-1:-1;;;;;33048:32:0;;;-1:-1:-1;;;33059:21:0;;;;33048:32;;:63;;;33096:15;-1:-1:-1;;;;;33083:28:0;:9;-1:-1:-1;;;;;33083:28:0;;33048:63;33036:75;;33152:18;:41;;;;33174:19;33152:41;:55;;;;33197:10;33152:55;33149:356;;;33223:43;33240:6;33248:9;33259:6;33223:16;:43::i;:::-;33149:356;;;33385:14;;;;;;;33377:49;;;;-1:-1:-1;;;33377:49:0;;18857:2:1;33377:49:0;;;18839:21:1;18896:2;18876:18;;;18869:30;18935:25;18915:18;;;18908:53;18978:18;;33377:49:0;18655:347:1;33377:49:0;33441:52;33456:6;33463:9;33473:6;33480:5;33486:6;33441:14;:52::i;:::-;32049:1463;;;;;;31972:1540;;;:::o;38559:1582::-;38307:27;:34;;-1:-1:-1;;38307:34:0;38337:4;38307:34;;;;;;38661:4:::1;38307:27:::0;38643:24;;;::::1;::::0;;;;;;;;38708:13:::1;::::0;38643:24;;38307:27;38694::::1;::::0;38708:13;;::::1;38307:34:::0;38708:13;;::::1;::::0;38694;;::::1;;:27;:::i;:::-;38678:43;;;;38732:19;38754;;38732:41;;38900:11;38884:15;:27;:40;;;-1:-1:-1::0;38913:11:0::1;::::0;::::1;::::0;38884:40:::1;38881:77;;;38940:7;;;;;38881:77;39078:13;::::0;39039:25:::1;::::0;39065:36:::1;::::0;::::1;::::0;39066:25:::1;::::0;39078:13;;::::1;;;39066:11:::0;:25:::1;:::i;:::-;39065:36;;;;:::i;:::-;39039:62:::0;-1:-1:-1;39112:25:0::1;39139:29;39039:62:::0;39139:11;:29:::1;:::i;:::-;39112:56:::0;-1:-1:-1;39229:16:0::1;39246:19;39264:1;39246:17:::0;:19:::1;:::i;:::-;39229:36:::0;-1:-1:-1;39276:19:0::1;39296:26;39229:36:::0;39296:17;:26:::1;:::i;:::-;39276:46:::0;-1:-1:-1;39405:17:0::1;39423:29;39435:17:::0;39276:46;39423:29:::1;:::i;:::-;39405:47:::0;-1:-1:-1;39531:21:0::1;39563:27;39405:47:::0;39563:16:::1;:27::i;:::-;39601:14;39617:41;39641:17:::0;39617:21:::1;:41;:::i;:::-;39601:58:::0;-1:-1:-1;39759:14:0::1;39797:9:::0;39777:18:::1;39784:11:::0;39601:58;39777:18:::1;:::i;:::-;39776:30;;;;:::i;:::-;39759:47;;39817:31;39831:8;39841:6;39817:13;:31::i;:::-;-1:-1:-1::0;39973:21:0::1;::::0;-1:-1:-1;39996:41:0::1;40020:17:::0;39996:21:::1;:41;:::i;:::-;39973:65;;40120:13;40102:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38352:1:0::1;38364:27:::0;:35;;-1:-1:-1;;38364:35:0;;;38559:1582::o;24972:158::-;25045:4;25069:53;25077:3;-1:-1:-1;;;;;25097:23:0;;25069:7;:53::i;51641:343::-;51797:20;;51783:13;:34;51775:103;;;;-1:-1:-1;;;51775:103:0;;19209:2:1;51775:103:0;;;19191:21:1;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;-1:-1:-1;;;19338:18:1;;;19331:45;19393:19;;51775:103:0;19007:411:1;51775:103:0;51889:20;:34;;;51939:37;;51910:13;;-1:-1:-1;;;;;;;;;;;51939:37:0;;;;51641:343;:::o;19699:414::-;19762:4;22025:19;;;:12;;;:19;;;;;;19779:327;;-1:-1:-1;19822:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20005:18;;19983:19;;;:12;;;:19;;;;;;:40;;;;20038:11;;19779:327;-1:-1:-1;20089:5:0;20082:12;;25216:167;-1:-1:-1;;;;;25350:23:0;;25296:4;22025:19;;;:12;;;:19;;;;;;:24;;25320:55;21928:129;36750:400;-1:-1:-1;;;;;36869:17:0;;36845:21;36869:17;;;:9;:17;;;;;;36905:23;;;;36897:60;;;;-1:-1:-1;;;36897:60:0;;19625:2:1;36897:60:0;;;19607:21:1;19664:2;19644:18;;;19637:30;-1:-1:-1;;;19683:18:1;;;19676:54;19747:18;;36897:60:0;19423:348:1;36897:60:0;36993:27;37006:6;37013;36993:12;:27::i;:::-;37053:28;37063:9;37074:6;37053:9;:28::i;:::-;37123:9;-1:-1:-1;;;;;37107:33:0;37116:6;-1:-1:-1;;;;;37107:33:0;-1:-1:-1;;;;;;;;;;;37133:6:0;37107:33;;;;1801:25:1;;1789:2;1774:18;;1655:177;37107:33:0;;;;;;;;36834:316;36750:400;;;:::o;33582:3121::-;-1:-1:-1;;;;;33725:20:0;;;33698:24;33725:20;;;:9;:20;;;;;;;33780:17;;;;;;;;33816:23;;;;33808:60;;;;-1:-1:-1;;;33808:60:0;;19625:2:1;33808:60:0;;;19607:21:1;19664:2;19644:18;;;19637:30;-1:-1:-1;;;19683:18:1;;;19676:54;19747:18;;33808:60:0;19423:348:1;33808:60:0;33881:9;33904:6;33901:1611;;;33991:9;;33983:6;:17;;33975:44;;;;-1:-1:-1;;;33975:44:0;;19978:2:1;33975:44:0;;;19960:21:1;20017:2;19997:18;;;19990:30;-1:-1:-1;;;20036:18:1;;;20029:45;20091:18;;33975:44:0;19776:339:1;33975:44:0;-1:-1:-1;;;;;34042:17:0;;;;;;:9;:17;;;;;;;;:26;34034:59;;;;-1:-1:-1;;;34034:59:0;;20322:2:1;34034:59:0;;;20304:21:1;20361:2;20341:18;;;20334:30;-1:-1:-1;;;20380:18:1;;;20373:50;20440:18;;34034:59:0;20120:344:1;34034:59:0;34150:11;;34131:16;;:30;;;;:::i;:::-;34112:15;:49;;:77;;;;;34165:19;;34188:1;34165:24;34112:77;34108:184;;;-1:-1:-1;;;;;34210:17:0;;;;;;:9;:17;;;;;;:24;;-1:-1:-1;;34210:24:0;34230:4;34210:24;;;34258:18;;;34210:17;34258:18;34108:184;-1:-1:-1;34310:8:0;;;;;;;33901:1611;;;34343:5;34340:1172;;;34488:12;;34463:23;34480:6;34463:16;:23;:::i;:::-;:37;;34455:65;;;;-1:-1:-1;;;34455:65:0;;20671:2:1;34455:65:0;;;20653:21:1;20710:2;20690:18;;;20683:30;-1:-1:-1;;;20729:18:1;;;20722:46;20785:18;;34455:65:0;20469:340:1;34455:65:0;34544:9;;34534:6;:19;;34526:65;;;;-1:-1:-1;;;34526:65:0;;21016:2:1;34526:65:0;;;20998:21:1;21055:2;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;-1:-1:-1;;;21145:18:1;;;21138:32;21187:19;;34526:65:0;20814:398:1;34526:65:0;-1:-1:-1;;;;;34614:20:0;;;;;;:9;:20;;;;;;;;:29;34606:62;;;;-1:-1:-1;;;34606:62:0;;20322:2:1;34606:62:0;;;20304:21:1;20361:2;20341:18;;;20334:30;-1:-1:-1;;;20380:18:1;;;20373:50;20440:18;;34606:62:0;20120:344:1;34606:62:0;34725:11;;34706:16;;:30;;;;:::i;:::-;34687:15;:49;;:77;;;;;34740:19;;34763:1;34740:24;34687:77;34683:190;;;-1:-1:-1;;;;;34785:20:0;;;;;;:9;:20;;;;;;:27;;-1:-1:-1;;34785:27:0;34808:4;34785:27;;;34836:21;;;34785:20;34836:21;34683:190;-1:-1:-1;34891:7:0;;;;34340:1172;;;-1:-1:-1;;;;;35042:17:0;;;;;;:9;:17;;;;;;;;:26;35034:66;;;;-1:-1:-1;;;35034:66:0;;21419:2:1;35034:66:0;;;21401:21:1;21458:2;21438:18;;;21431:30;21497:29;21477:18;;;21470:57;21544:18;;35034:66:0;21217:351:1;35034:66:0;-1:-1:-1;;;;;35123:20:0;;;;;;:9;:20;;;;;;;;:29;35115:72;;;;-1:-1:-1;;;35115:72:0;;21775:2:1;35115:72:0;;;21757:21:1;21814:2;21794:18;;;21787:30;21853:32;21833:18;;;21826:60;21903:18;;35115:72:0;21573:354:1;35115:72:0;35235:12;;35210:23;35227:6;35210:16;:23;:::i;:::-;:37;;35202:65;;;;-1:-1:-1;;;35202:65:0;;20671:2:1;35202:65:0;;;20653:21:1;20710:2;20690:18;;;20683:30;-1:-1:-1;;;20729:18:1;;;20722:46;20785:18;;35202:65:0;20469:340:1;35202:65:0;35324:11;;35305:16;;:30;;;;:::i;:::-;35286:15;:49;;:77;;;;;35339:19;;35362:1;35339:24;35286:77;35282:184;;;-1:-1:-1;;;;;35384:17:0;;;;;;:9;:17;;;;;;:24;;-1:-1:-1;;35384:24:0;35404:4;35384:24;;;35432:18;;;35384:17;35432:18;35282:184;-1:-1:-1;35484:12:0;;;;;;;34340:1172;35849:21;;-1:-1:-1;;;;;35841:29:0;;;-1:-1:-1;;;35849:21:0;;;;35841:29;;;;35840:52;;-1:-1:-1;35875:16:0;;;;35874:17;35840:52;:84;;;;-1:-1:-1;35896:27:0;;;;35895:28;35840:84;:92;;;;;35926:6;35840:92;35837:130;;;35947:20;:18;:20::i;:::-;36036:23;36060:36;36074:6;36082:3;36087:8;;;;;;;;;;;36060:13;:36::i;:::-;36170:13;;36036:60;;-1:-1:-1;36107:21:0;;36129:55;;36143:6;;36151:3;;36156:27;;36170:13;;;;;;;36156;;;;:27;:::i;:::-;36129:13;:55::i;:::-;36107:77;-1:-1:-1;36248:19:0;36276:31;36107:77;36276:15;:31;:::i;:::-;36268:40;;:6;:40;:::i;:::-;36248:60;;36346:27;36359:6;36366;36346:12;:27::i;:::-;36468:4;36450:24;;;;:9;:24;;;;;:41;;36478:13;;36450:24;:41;;36478:13;;36450:41;:::i;:::-;;;;;;;;36546:15;36526:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36596:33:0;;-1:-1:-1;36606:9:0;36617:11;36596:9;:33::i;:::-;36671:9;-1:-1:-1;;;;;36655:38:0;36664:6;-1:-1:-1;;;;;36655:38:0;-1:-1:-1;;;;;;;;;;;36681:11:0;36655:38;;;;1801:25:1;;1789:2;1774:18;;1655:177;36655:38:0;;;;;;;;33687:3016;;;;;;33582:3121;;;;;:::o;40191:461::-;40284:16;;40252:58;;40269:4;;-1:-1:-1;;;;;40284:16:0;40303:6;40252:8;:58::i;:::-;40345:16;;;40359:1;40345:16;;;;;;;;40321:21;;40345:16;;;;;;;;;;-1:-1:-1;40345:16:0;40321:40;;40390:4;40372;40377:1;40372:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40372:23:0;;;:7;;;;;;;;;;:23;;;;40416:16;;:23;;;-1:-1:-1;;;40416:23:0;;;;:16;;;;;:21;;:23;;;;;40372:7;;40416:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40406:4;40411:1;40406:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40406:33:0;;;:7;;;;;;;;;:33;40452:16;;:192;;-1:-1:-1;;;40452:192:0;;:16;;;:67;;:192;;40534:6;;40452:16;;40571:4;;40598;;40618:15;;40452:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40241:411;40191:461;:::o;40779:686::-;40859:19;40880:21;40926:9;40914:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40946:14:0;;-1:-1:-1;40980:3:0;40964:12;:9;40974:2;40964:12;:::i;:::-;40963:20;;;;:::i;:::-;40946:37;-1:-1:-1;40994:17:0;41033:3;41015:14;:11;41027:2;41015:14;:::i;:::-;41014:22;;;;:::i;:::-;41079:16;;40994:42;;-1:-1:-1;41047:63:0;;41064:4;;-1:-1:-1;;;;;41079:16:0;41098:11;41047:8;:63::i;:::-;41121:16;;:218;;-1:-1:-1;;;41121:218:0;;-1:-1:-1;;;;;41121:16:0;;;;:32;;41161:9;;41121:218;;41194:4;;41214:11;;41240:9;;41264:6;;41194:4;;41313:15;;41121:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41364:11:0;;41402:9;;-1:-1:-1;;;;;;40779:686:0:o;20289:1553::-;20355:4;20494:19;;;:12;;;:19;;;;;;20530:15;;20526:1309;;20892:21;20916:14;20929:1;20916:10;:14;:::i;:::-;20965:18;;20892:38;;-1:-1:-1;20945:17:0;;20965:22;;20986:1;;20965:22;:::i;:::-;20945:42;;21232:17;21252:3;:11;;21264:9;21252:22;;;;;;;;:::i;:::-;;;;;;;;;21232:42;;21398:9;21369:3;:11;;21381:13;21369:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21475:23;;;:12;;;:23;;;;;;:36;;;21636:17;;21475:3;;21636:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21731:3;:12;;:19;21744:5;21731:19;;;;;;;;;;;21724:26;;;21774:4;21767:11;;;;;;;;20526:1309;21818:5;21811:12;;;;;37750:228;-1:-1:-1;;;;;37885:15:0;;37867:17;37885:15;;;:9;:15;;;;;;:22;;37901:6;;37885:22;:::i;:::-;-1:-1:-1;;;;;37945:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37750:228:0:o;37486:225::-;-1:-1:-1;;;;;37618:15:0;;37600:17;37618:15;;;:9;:15;;;;;;:22;;37634:6;;37618:22;:::i;37205:156::-;37295:7;37348:5;37334:10;37323:21;;37330:3;37323:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37322:31;;;;:::i;:::-;37315:38;37205:156;-1:-1:-1;;;;37205:156:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;733:597::-;845:4;874:2;903;892:9;885:21;935:6;929:13;978:6;973:2;962:9;958:18;951:34;1003:1;1013:140;1027:6;1024:1;1021:13;1013:140;;;1122:14;;;1118:23;;1112:30;1088:17;;;1107:2;1084:26;1077:66;1042:10;;1013:140;;;1171:6;1168:1;1165:13;1162:91;;;1241:1;1236:2;1227:6;1216:9;1212:22;1208:31;1201:42;1162:91;-1:-1:-1;1314:2:1;1293:15;-1:-1:-1;;1289:29:1;1274:45;;;;1321:2;1270:54;;733:597;-1:-1:-1;;;733:597:1:o;1335:315::-;1403:6;1411;1464:2;1452:9;1443:7;1439:23;1435:32;1432:52;;;1480:1;1477;1470:12;1432:52;1519:9;1506:23;1538:31;1563:5;1538:31;:::i;:::-;1588:5;1640:2;1625:18;;;;1612:32;;-1:-1:-1;;;1335:315:1:o;2030:456::-;2107:6;2115;2123;2176:2;2164:9;2155:7;2151:23;2147:32;2144:52;;;2192:1;2189;2182:12;2144:52;2231:9;2218:23;2250:31;2275:5;2250:31;:::i;:::-;2300:5;-1:-1:-1;2357:2:1;2342:18;;2329:32;2370:33;2329:32;2370:33;:::i;:::-;2030:456;;2422:7;;-1:-1:-1;;;2476:2:1;2461:18;;;;2448:32;;2030:456::o;3499:180::-;3558:6;3611:2;3599:9;3590:7;3586:23;3582:32;3579:52;;;3627:1;3624;3617:12;3579:52;-1:-1:-1;3650:23:1;;3499:180;-1:-1:-1;3499:180:1:o;3684:156::-;3750:20;;3810:4;3799:16;;3789:27;;3779:55;;3830:1;3827;3820:12;3845:535;3937:6;3945;3953;3961;3969;3977;4030:3;4018:9;4009:7;4005:23;4001:33;3998:53;;;4047:1;4044;4037:12;3998:53;4070:27;4087:9;4070:27;:::i;:::-;4060:37;;4116:36;4148:2;4137:9;4133:18;4116:36;:::i;:::-;4106:46;;4171:36;4203:2;4192:9;4188:18;4171:36;:::i;:::-;4161:46;;4226:36;4258:2;4247:9;4243:18;4226:36;:::i;:::-;4216:46;;4281:37;4313:3;4302:9;4298:19;4281:37;:::i;:::-;4271:47;;4337:37;4369:3;4358:9;4354:19;4337:37;:::i;:::-;4327:47;;3845:535;;;;;;;;:::o;4846:118::-;4932:5;4925:13;4918:21;4911:5;4908:32;4898:60;;4954:1;4951;4944:12;4969:241;5025:6;5078:2;5066:9;5057:7;5053:23;5049:32;5046:52;;;5094:1;5091;5084:12;5046:52;5133:9;5120:23;5152:28;5174:5;5152:28;:::i;5215:248::-;5283:6;5291;5344:2;5332:9;5323:7;5319:23;5315:32;5312:52;;;5360:1;5357;5350:12;5312:52;-1:-1:-1;;5383:23:1;;;5453:2;5438:18;;;5425:32;;-1:-1:-1;5215:248:1:o;5468:388::-;5536:6;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5652:9;5639:23;5671:31;5696:5;5671:31;:::i;:::-;5721:5;-1:-1:-1;5778:2:1;5763:18;;5750:32;5791:33;5750:32;5791:33;:::i;:::-;5843:7;5833:17;;;5468:388;;;;;:::o;5861:127::-;5922:10;5917:3;5913:20;5910:1;5903:31;5953:4;5950:1;5943:15;5977:4;5974:1;5967:15;5993:1121;6077:6;6108:2;6151;6139:9;6130:7;6126:23;6122:32;6119:52;;;6167:1;6164;6157:12;6119:52;6207:9;6194:23;6236:18;6277:2;6269:6;6266:14;6263:34;;;6293:1;6290;6283:12;6263:34;6331:6;6320:9;6316:22;6306:32;;6376:7;6369:4;6365:2;6361:13;6357:27;6347:55;;6398:1;6395;6388:12;6347:55;6434:2;6421:16;6456:2;6452;6449:10;6446:36;;;6462:18;;:::i;:::-;6508:2;6505:1;6501:10;6540:2;6534:9;6603:2;6599:7;6594:2;6590;6586:11;6582:25;6574:6;6570:38;6658:6;6646:10;6643:22;6638:2;6626:10;6623:18;6620:46;6617:72;;;6669:18;;:::i;:::-;6705:2;6698:22;6755:18;;;6789:15;;;;-1:-1:-1;6831:11:1;;;6827:20;;;6859:19;;;6856:39;;;6891:1;6888;6881:12;6856:39;6915:11;;;;6935:148;6951:6;6946:3;6943:15;6935:148;;;7017:23;7036:3;7017:23;:::i;:::-;7005:36;;6968:12;;;;7061;;;;6935:148;;;7102:6;5993:1121;-1:-1:-1;;;;;;;;5993:1121:1:o;7119:356::-;7321:2;7303:21;;;7340:18;;;7333:30;7399:34;7394:2;7379:18;;7372:62;7466:2;7451:18;;7119:356::o;7480:340::-;7682:2;7664:21;;;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7755:2:1;7740:18;;7733:46;7811:2;7796:18;;7480:340::o;7825:184::-;7895:6;7948:2;7936:9;7927:7;7923:23;7919:32;7916:52;;;7964:1;7961;7954:12;7916:52;-1:-1:-1;7987:16:1;;7825:184;-1:-1:-1;7825:184:1:o;8014:245::-;8081:6;8134:2;8122:9;8113:7;8109:23;8105:32;8102:52;;;8150:1;8147;8140:12;8102:52;8182:9;8176:16;8201:28;8223:5;8201:28;:::i;8264:127::-;8325:10;8320:3;8316:20;8313:1;8306:31;8356:4;8353:1;8346:15;8380:4;8377:1;8370:15;8396:168;8436:7;8502:1;8498;8494:6;8490:14;8487:1;8484:21;8479:1;8472:9;8465:17;8461:45;8458:71;;;8509:18;;:::i;:::-;-1:-1:-1;8549:9:1;;8396:168::o;8569:217::-;8609:1;8635;8625:132;;8679:10;8674:3;8670:20;8667:1;8660:31;8714:4;8711:1;8704:15;8742:4;8739:1;8732:15;8625:132;-1:-1:-1;8771:9:1;;8569:217::o;8791:591::-;-1:-1:-1;;;;;9134:15:1;;;9116:34;;9181:2;9166:18;;9159:34;;;;9224:2;9209:18;;9202:34;;;;9267:2;9252:18;;9245:34;;;;9316:15;;;9310:3;9295:19;;9288:44;9096:3;9348:19;;9341:35;;;;9065:3;9050:19;;8791:591::o;9387:125::-;9427:4;9455:1;9452;9449:8;9446:34;;;9460:18;;:::i;:::-;-1:-1:-1;9497:9:1;;9387:125::o;9517:128::-;9557:3;9588:1;9584:6;9581:1;9578:13;9575:39;;;9594:18;;:::i;:::-;-1:-1:-1;9630:9:1;;9517:128::o;9650:422::-;9739:1;9782:5;9739:1;9796:270;9817:7;9807:8;9804:21;9796:270;;;9876:4;9872:1;9868:6;9864:17;9858:4;9855:27;9852:53;;;9885:18;;:::i;:::-;9935:7;9925:8;9921:22;9918:55;;;9955:16;;;;9918:55;10034:22;;;;9994:15;;;;9796:270;;;9800:3;9650:422;;;;;:::o;10077:806::-;10126:5;10156:8;10146:80;;-1:-1:-1;10197:1:1;10211:5;;10146:80;10245:4;10235:76;;-1:-1:-1;10282:1:1;10296:5;;10235:76;10327:4;10345:1;10340:59;;;;10413:1;10408:130;;;;10320:218;;10340:59;10370:1;10361:10;;10384:5;;;10408:130;10445:3;10435:8;10432:17;10429:43;;;10452:18;;:::i;:::-;-1:-1:-1;;10508:1:1;10494:16;;10523:5;;10320:218;;10622:2;10612:8;10609:16;10603:3;10597:4;10594:13;10590:36;10584:2;10574:8;10571:16;10566:2;10560:4;10557:12;10553:35;10550:77;10547:159;;;-1:-1:-1;10659:19:1;;;10691:5;;10547:159;10738:34;10763:8;10757:4;10738:34;:::i;:::-;10808:6;10804:1;10800:6;10796:19;10787:7;10784:32;10781:58;;;10819:18;;:::i;:::-;10857:20;;10077:806;-1:-1:-1;;;10077:806:1:o;10888:140::-;10946:5;10975:47;11016:4;11006:8;11002:19;10996:4;10975:47;:::i;12351:351::-;12553:2;12535:21;;;12592:2;12572:18;;;12565:30;12631:29;12626:2;12611:18;;12604:57;12693:2;12678:18;;12351:351::o;12707:204::-;12745:3;12781:4;12778:1;12774:12;12813:4;12810:1;12806:12;12848:3;12842:4;12838:14;12833:3;12830:23;12827:49;;;12856:18;;:::i;:::-;12892:13;;12707:204;-1:-1:-1;;;12707:204:1:o;16594:127::-;16655:10;16650:3;16646:20;16643:1;16636:31;16686:4;16683:1;16676:15;16710:4;16707:1;16700:15;16726:135;16765:3;-1:-1:-1;;16786:17:1;;16783:43;;;16806:18;;:::i;:::-;-1:-1:-1;16853:1:1;16842:13;;16726:135::o;21932:251::-;22002:6;22055:2;22043:9;22034:7;22030:23;22026:32;22023:52;;;22071:1;22068;22061:12;22023:52;22103:9;22097:16;22122:31;22147:5;22122:31;:::i;22188:980::-;22450:4;22498:3;22487:9;22483:19;22529:6;22518:9;22511:25;22555:2;22593:6;22588:2;22577:9;22573:18;22566:34;22636:3;22631:2;22620:9;22616:18;22609:31;22660:6;22695;22689:13;22726:6;22718;22711:22;22764:3;22753:9;22749:19;22742:26;;22803:2;22795:6;22791:15;22777:29;;22824:1;22834:195;22848:6;22845:1;22842:13;22834:195;;;22913:13;;-1:-1:-1;;;;;22909:39:1;22897:52;;23004:15;;;;22969:12;;;;22945:1;22863:9;22834:195;;;-1:-1:-1;;;;;;;23085:32:1;;;;23080:2;23065:18;;23058:60;-1:-1:-1;;;23149:3:1;23134:19;23127:35;23046:3;22188:980;-1:-1:-1;;;22188:980:1:o;23173:306::-;23261:6;23269;23277;23330:2;23318:9;23309:7;23305:23;23301:32;23298:52;;;23346:1;23343;23336:12;23298:52;23375:9;23369:16;23359:26;;23425:2;23414:9;23410:18;23404:25;23394:35;;23469:2;23458:9;23454:18;23448:25;23438:35;;23173:306;;;;;:::o;23484:127::-;23545:10;23540:3;23536:20;23533:1;23526:31;23576:4;23573:1;23566:15;23600:4;23597:1;23590:15

Swarm Source

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