ETH Price: $2,636.28 (+1.89%)

Contract

0x2C22394Ac8F6c37295AC03577470fb1c8a690464
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve152887702022-08-06 12:37:27746 days ago1659789447IN
0x2C22394A...c8a690464
0 ETH0.000150446.18019517
Approve152887702022-08-06 12:37:27746 days ago1659789447IN
0x2C22394A...c8a690464
0 ETH0.000150446.18019517
Approve147463772022-05-10 3:54:30834 days ago1652154870IN
0x2C22394A...c8a690464
0 ETH0.0012043749.47532104
Approve146615522022-04-26 17:49:36848 days ago1650995376IN
0x2C22394A...c8a690464
0 ETH0.0016291866.92607797
Approve146570162022-04-26 0:41:34848 days ago1650933694IN
0x2C22394A...c8a690464
0 ETH0.0009700339.84878623
Approve146570112022-04-26 0:40:54848 days ago1650933654IN
0x2C22394A...c8a690464
0 ETH0.001079344.33751938
Approve145680192022-04-12 2:18:35862 days ago1649729915IN
0x2C22394A...c8a690464
0 ETH0.0022208747.63066541
Team Remove Rema...144202682022-03-20 1:14:13885 days ago1647738853IN
0x2C22394A...c8a690464
0 ETH0.0006274118.12710642
Team Release Liq...144202392022-03-20 1:08:08885 days ago1647738488IN
0x2C22394A...c8a690464
0 ETH0.0019667532.1559069
Approve143066882022-03-02 9:12:07903 days ago1646212327IN
0x2C22394A...c8a690464
0 ETH0.0014377530.83533205
Approve142721482022-02-25 0:42:06908 days ago1645749726IN
0x2C22394A...c8a690464
0 ETH0.0028837461.84703431
Approve142583202022-02-22 21:38:22911 days ago1645565902IN
0x2C22394A...c8a690464
0 ETH0.0034291773.54492239
Approve142571602022-02-22 17:17:48911 days ago1645550268IN
0x2C22394A...c8a690464
0 ETH0.00296857111.07009602
Approve142571582022-02-22 17:17:28911 days ago1645550248IN
0x2C22394A...c8a690464
0 ETH0.00533113114.33569459
Approve142571422022-02-22 17:12:58911 days ago1645549978IN
0x2C22394A...c8a690464
0 ETH0.0043483493.25812899
Approve142539232022-02-22 5:08:45911 days ago1645506525IN
0x2C22394A...c8a690464
0 ETH0.00484932104.00250789
Approve142451472022-02-20 20:38:38913 days ago1645389518IN
0x2C22394A...c8a690464
0 ETH0.0022230947.67830794
Team Withdraw AL...142398502022-02-20 0:59:43913 days ago1645318783IN
0x2C22394A...c8a690464
0 ETH0.00561751115.00232787
Approve142362322022-02-19 11:26:16914 days ago1645269976IN
0x2C22394A...c8a690464
0 ETH0.0020205443.33428698
Approve142362072022-02-19 11:20:11914 days ago1645269611IN
0x2C22394A...c8a690464
0 ETH0.0017720338.0045445
Approve142348402022-02-19 6:08:04914 days ago1645250884IN
0x2C22394A...c8a690464
0 ETH0.0022845448.99620089
Approve142322062022-02-18 20:23:42915 days ago1645215822IN
0x2C22394A...c8a690464
0 ETH0.0043904794.16161863
Team Withdraw AL...142319062022-02-18 19:16:57915 days ago1645211817IN
0x2C22394A...c8a690464
0 ETH0.0041552485.0666044
Approve142294352022-02-18 10:07:03915 days ago1645178823IN
0x2C22394A...c8a690464
0 ETH0.0038270882.07866579
Approve142284092022-02-18 6:17:59915 days ago1645165079IN
0x2C22394A...c8a690464
0 ETH0.0028228860.54183851
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
144202682022-03-20 1:14:13885 days ago1647738853
0x2C22394A...c8a690464
0.12170238 ETH
143294922022-03-05 22:02:49900 days ago1646517769
0x2C22394A...c8a690464
0.0014874 ETH
143294922022-03-05 22:02:49900 days ago1646517769
0x2C22394A...c8a690464
0.01338661 ETH
142994652022-03-01 6:29:19904 days ago1646116159
0x2C22394A...c8a690464
0.001615 ETH
142994652022-03-01 6:29:19904 days ago1646116159
0x2C22394A...c8a690464
0.01453507 ETH
142623272022-02-23 12:32:15910 days ago1645619535
0x2C22394A...c8a690464
0.00168929 ETH
142623272022-02-23 12:32:15910 days ago1645619535
0x2C22394A...c8a690464
0.01520367 ETH
142583282022-02-22 21:39:38911 days ago1645565978
0x2C22394A...c8a690464
0.00179817 ETH
142583282022-02-22 21:39:38911 days ago1645565978
0x2C22394A...c8a690464
0.01618358 ETH
142572212022-02-22 17:32:15911 days ago1645551135
0x2C22394A...c8a690464
0.00191624 ETH
142572212022-02-22 17:32:15911 days ago1645551135
0x2C22394A...c8a690464
0.01724619 ETH
142549872022-02-22 9:17:12911 days ago1645521432
0x2C22394A...c8a690464
0.00000021 ETH
142549872022-02-22 9:17:12911 days ago1645521432
0x2C22394A...c8a690464
0.00205483 ETH
142549872022-02-22 9:17:12911 days ago1645521432
0x2C22394A...c8a690464
0.01849351 ETH
142503352022-02-21 15:51:07912 days ago1645458667
0x2C22394A...c8a690464
0.00000052 ETH
142503352022-02-21 15:51:07912 days ago1645458667
0x2C22394A...c8a690464
0.00222678 ETH
142503352022-02-21 15:51:07912 days ago1645458667
0x2C22394A...c8a690464
0.02004108 ETH
142442482022-02-20 17:30:10913 days ago1645378210
0x2C22394A...c8a690464
0.00000091 ETH
142442482022-02-20 17:30:10913 days ago1645378210
0x2C22394A...c8a690464
0.00242484 ETH
142442482022-02-20 17:30:10913 days ago1645378210
0x2C22394A...c8a690464
0.02182357 ETH
142398502022-02-20 0:59:43913 days ago1645318783
0x2C22394A...c8a690464
0.04566588 ETH
142398502022-02-20 0:59:43913 days ago1645318783
0x2C22394A...c8a690464
0.04566588 ETH
142386832022-02-19 20:44:38914 days ago1645303478
0x2C22394A...c8a690464
0.00000121 ETH
142386832022-02-19 20:44:38914 days ago1645303478
0x2C22394A...c8a690464
0.0025639 ETH
142386832022-02-19 20:44:38914 days ago1645303478
0x2C22394A...c8a690464
0.02307518 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MoonMoon

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-16
*/

/*
* 
Moon Moon

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: 10% 

2% LP
2% Buybacks
2% Dev
4% Marketing

DO NOT BUY UNTIL CONTRACT ADDRESS IS POSTED IN TELEGRAM

*
*/

pragma solidity =0.8.7;

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

//Moon Moon Contract /////////////

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

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

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

    //Token Info
    string private constant _name = 'MoonMoon';
    string private constant _symbol = 'MNMN';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 2000000000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (1%)
    uint8 public constant BalanceLimitDivider=100;
    //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(0x963Aa69545b799e6DE148A0c97CEcb74F4690029);
    address public walletTwo=payable(0x2fAf735616214FE58560923679291C31Ef024c1a);
    //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 = 2500000000 * 10**_decimals;

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

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

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

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between UniswapRouter and UniswapPair are tax and lock free
        address uniswapV2Router=address(_uniswapV2Router);
        bool isLiquidityTransfer = ((sender == _uniswapV2PairAddress && recipient == uniswapV2Router) 
        || (recipient == _uniswapV2PairAddress && sender == uniswapV2Router));

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

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

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


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

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_transferTax;


        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapV2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapV2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

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

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

    }

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

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

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

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

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

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

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

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

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

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

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

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

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

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

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

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

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

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

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

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

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes, uint8 buyTax, uint8 sellTax, uint8 transferTax) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

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

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

    //manually converts contract token to LP
    function TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        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":"uint8","name":"","type":"uint8"}],"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":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWalletTwo","type":"address"}],"name":"TeamChangeWalletTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamProlongLiquidityLockInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[{"internalType":"address","name":"tWAddress","type":"address"},{"internalType":"uint256","name":"amountSent","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveLiquidity","outputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"addWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionRemove","type":"address"}],"name":"removeWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"teamUpdateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletTwo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000552565b6200002290637735940062000611565b600855600980546001600160a01b031990811673963aa69545b799e6de148a0c97cecb74f4690029178255600a80548216732faf735616214fe58560923679291c31ef024c1a178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d1790915562000097919062000552565b620000a89064e8d4a5100062000611565b600c819055600d819055600e55620000c36009600a62000552565b620000d390639502f90062000611565b600f55603c6011556001601255348015620000ed57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001ce57600080fd5b505afa158015620001e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002099190620004b4565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026757600080fd5b505afa1580156200027c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a29190620004b4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002eb57600080fd5b505af115801562000300573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003269190620004b4565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556064620003646009600a62000552565b620003759064e8d4a5100062000611565b620003819190620004e6565b600d55610190620003956009600a62000552565b620003a69064e8d4a5100062000611565b620003b29190620004e6565b600e5560006018556013805465ffffffffffff1916655014000a0a0a179055600954620003f7906004906001600160a01b031662000442602090811b620022e617901c565b50600a546200041e906004906001600160a01b031662000442602090811b620022e617901c565b506200043a3360046200044260201b620022e61790919060201c565b505062000649565b600062000459836001600160a01b03841662000462565b90505b92915050565b6000818152600183016020526040812054620004ab575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200045c565b5060006200045c565b600060208284031215620004c757600080fd5b81516001600160a01b0381168114620004df57600080fd5b9392505050565b6000826200050457634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156200054a5781600019048211156200052e576200052e62000633565b808516156200053c57918102915b93841c93908002906200050e565b509250929050565b60006200045960ff8416836000826200056e575060016200045c565b816200057d575060006200045c565b8160018114620005965760028114620005a157620005c1565b60019150506200045c565b60ff841115620005b557620005b562000633565b50506001821b6200045c565b5060208310610133831016604e8410600b8410161715620005e6575081810a6200045c565b620005f2838362000509565b806000190482111562000609576200060962000633565b029392505050565b60008160001904831182151516156200062e576200062e62000633565b500290565b634e487b7160e01b600052601160045260246000fd5b61395380620006596000396000f3fe6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063d8902ff51161009a578063e803050c1161006c578063e803050c14610a6d578063f2c816ae14610a8d578063f2fde38b14610aad578063f9ab736614610acd57005b8063d8902ff5146109c7578063daf9a47a146109e7578063dd62ed3e14610a07578063e2fd002a14610a4d57005b8063b766a386116100d3578063b766a3861461095d578063c3a3c0321461097d578063c3f4f54f14610992578063d11edf74146109a757005b80639fa62d5f146108fd578063a457c2d71461091d578063a9059cbb1461093d57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087057806395d89b41146108905780639bc845fb146108bd5780639bf65770146108dd57005b8063828e8b7e1461082357806386d0ada814610838578063893d20e8146108525780638da5cb5b1461085257005b806370a08231116101a157806370a08231146107ad578063715018a6146107e3578063762bb282146107f85780637b9e987a1461080e57005b8063677a8870146107435780636eb8c7f1146107635780636f89e4091461078357005b806335e82f3a1161029d5780634cbf8e241161024157806358e1df921161021357806358e1df92146106e357806358e55365146106f85780635c69f6901461070e57806361cb27481461072357005b80634cbf8e24146106785780634cdaf0ae1461068d5780634f91e48c146106ad57806357ad67d1146106c357005b80633cc39b7a1161027a5780633cc39b7a1461060d5780634476f35a1461062357806344f3c83a146106435780634ada218b1461065957005b806335e82f3a1461059957806339509351146105b95780633c7a309b146105d957005b806323b872dd116103045780632973ef2d116102e15780632973ef2d146104d45780633054f8a31461053f578063311a86971461055e578063313ce5671461058557005b806323b872dd14610467578063243b529a146104875780632594b3431461049c57005b80630fd99e161161033d5780630fd99e16146103ff57806314ddc0951461042857806318160ddd1461043d5780631eb25d131461045257005b806306fdde0314610369578063095ea7b3146103ac5780630fa5b215146103dc57005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600881526726b7b7b726b7b7b760c11b60208201525b6040516103a39190613579565b60405180910390f35b3480156103b857600080fd5b506103cc6103c73660046133e2565b610aed565b60405190151581526020016103a3565b3480156103e857600080fd5b506103f1610b04565b6040519081526020016103a3565b34801561040b57600080fd5b5061041561019081565b60405161ffff90911681526020016103a3565b34801561043457600080fd5b506018546103f1565b34801561044957600080fd5b50600c546103f1565b34801561045e57600080fd5b506103f1610d5f565b34801561047357600080fd5b506103cc6104823660046133a1565b610d7d565b34801561049357600080fd5b50610367610e14565b3480156104a857600080fd5b50600a546104bc906001600160a01b031681565b6040516001600160a01b0390911681526020016103a3565b3480156104e057600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a3565b34801561054b57600080fd5b506017546103cc90610100900460ff1681565b34801561056a57600080fd5b50610573606481565b60405160ff90911681526020016103a3565b34801561059157600080fd5b506009610573565b3480156105a557600080fd5b506103676105b436600461332e565b610e57565b3480156105c557600080fd5b506103cc6105d43660046133e2565b610ec1565b3480156105e557600080fd5b506105ee610ef8565b604080516001600160a01b0390931683526020830191909152016103a3565b34801561061957600080fd5b506103f160165481565b34801561062f57600080fd5b5061036761063e366004613448565b6110ab565b34801561064f57600080fd5b506103f160185481565b34801561066557600080fd5b506019546103cc90610100900460ff1681565b34801561068457600080fd5b506103676112a0565b34801561069957600080fd5b506103676106a836600461332e565b611394565b3480156106b957600080fd5b506103f1600e5481565b3480156106cf57600080fd5b506103676106de3660046134ca565b61141d565b3480156106ef57600080fd5b506103676117b2565b34801561070457600080fd5b506103f160155481565b34801561071a57600080fd5b50610415600981565b34801561072f57600080fd5b5061036761073e36600461332e565b611810565b34801561074f57600080fd5b506009546104bc906001600160a01b031681565b34801561076f57600080fd5b5061036761077e366004613448565b611854565b34801561078f57600080fd5b506107986118c3565b604080519283526020830191909152016103a3565b3480156107b957600080fd5b506103f16107c836600461332e565b6001600160a01b031660009081526001602052604090205490565b3480156107ef57600080fd5b50610367611900565b34801561080457600080fd5b506103f1600d5481565b34801561081a57600080fd5b50610367611983565b34801561082f57600080fd5b506103676119d1565b34801561084457600080fd5b506019546103cc9060ff1681565b34801561085e57600080fd5b506000546001600160a01b03166104bc565b34801561087c57600080fd5b5061036761088b36600461332e565b6119f5565b34801561089c57600080fd5b5060408051808201909152600481526326a726a760e11b6020820152610396565b3480156108c957600080fd5b506103676108d836600461332e565b611a8c565b3480156108e957600080fd5b506103676108f836600461340e565b611b23565b34801561090957600080fd5b5061036761091836600461347a565b611ba1565b34801561092957600080fd5b506103cc6109383660046133e2565b611dbb565b34801561094957600080fd5b506103cc6109583660046133e2565b611e37565b34801561096957600080fd5b5061036761097836600461340e565b611e44565b34801561098957600080fd5b506103f1611ecc565b34801561099e57600080fd5b506103f1611eec565b3480156109b357600080fd5b506103676109c2366004613448565b611f2c565b3480156109d357600080fd5b506103676109e236600461332e565b611f86565b3480156109f357600080fd5b50610367610a02366004613448565b61201d565b348015610a1357600080fd5b506103f1610a22366004613368565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a5957600080fd5b50610367610a68366004613448565b61208b565b348015610a7957600080fd5b506103f1610a8836600461332e565b61212f565b348015610a9957600080fd5b50610367610aa836600461332e565b612169565b348015610ab957600080fd5b50610367610ac836600461332e565b6121ad565b348015610ad957600080fd5b50610367610ae836600461332e565b6122a6565b6000610afa3384846122fb565b5060015b92915050565b600033610b196000546001600160a01b031690565b6001600160a01b031614610b485760405162461bcd60e51b8152600401610b3f906135f8565b60405180910390fd5b601a54421015610b6a5760405162461bcd60e51b8152600401610b3f906135ce565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef9190613461565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061342b565b5060145447906001600160a01b031663af2979eb30846064610c9a82604b613822565b610ca49190613712565b6064610cb188604b613822565b610cbb9190613712565b30426040518763ffffffff1660e01b8152600401610cde9695949392919061353e565b602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190613461565b506000610d3d8247613841565b90508060156000828254610d5191906136d5565b909155509094505050505090565b610d6b6009600a613777565b610d7a9064e8d4a51000613822565b81565b6000610d8a8484846123ee565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610df55760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b3f565b610e098533610e048685613841565b6122fb565b506001949350505050565b33610e276000546001600160a01b031690565b6001600160a01b031614610e4d5760405162461bcd60e51b8152600401610b3f906135f8565b610e5561264b565b565b33610e6a6000546001600160a01b031690565b6001600160a01b031614610e905760405162461bcd60e51b8152600401610b3f906135f8565b610e9b60068261279e565b506040516001600160a01b038216906000805160206138fe83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610afa918590610e049086906136d5565b60008033610f0e6000546001600160a01b031690565b6001600160a01b031614610f345760405162461bcd60e51b8152600401610b3f906135f8565b601a54421015610f565760405162461bcd60e51b8152600401610b3f906135ce565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb9190613461565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611063919061342b565b506009546040518281526001600160a01b039091169030906000805160206138de8339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110be6000546001600160a01b031690565b6001600160a01b0316146110e45760405162461bcd60e51b8152600401610b3f906135f8565b60155481111561114c5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b3f565b806015600082825461115e9190613841565b90915550506009546001600160a01b03166108fc606461117f846032613822565b6111899190613712565b6040518115909202916000818181858888f193505050501580156111b1573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111ce846032613822565b6111d89190613712565b6111e29084613841565b6040518115909202916000818181858888f1935050505015801561120a573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138de8339815191526064611234856032613822565b61123e9190613712565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138de8339815191526064611278856032613822565b6112829190613712565b61128c9085613841565b60405190815260200160405180910390a350565b336112b36000546001600160a01b031690565b6001600160a01b0316146112d95760405162461bcd60e51b8152600401610b3f906135f8565b601a544210156112fb5760405162461bcd60e51b8152600401610b3f906135ce565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611348576040519150601f19603f3d011682016040523d82523d6000602084013e61134d565b606091505b50509050806113915760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b3f565b50565b336113a76000546001600160a01b031690565b6001600160a01b0316146113cd5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b0381166113f35760405162461bcd60e51b8152600401610b3f9061362d565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114306000546001600160a01b031690565b6001600160a01b0316146114565760405162461bcd60e51b8152600401610b3f906135f8565b60008461146387896136ed565b61146d91906136ed565b90508060ff166064146114d15760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b3f565b60148460ff16111561154b5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b3f565b60148360ff1611156115c55760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b3f565b60148260ff16111561164a5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b3f565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138be83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138be83398151915290600090a260135460405160ff909116906000805160206138be83398151915290600090a260135460405161010090910460ff16906000805160206138be83398151915290600090a26013546040516201000090910460ff16906000805160206138be83398151915290600090a250505050505050565b336117c56000546001600160a01b031690565b6001600160a01b0316146117eb5760405162461bcd60e51b8152600401610b3f906135f8565b6015805460009091556009546001600160a01b03166108fc606461117f846032613822565b336118236000546001600160a01b031690565b6001600160a01b0316146118495760405162461bcd60e51b8152600401610b3f906135f8565b610e9b60048261279e565b336118676000546001600160a01b031690565b6001600160a01b03161461188d5760405162461bcd60e51b8152600401610b3f906135f8565b61189f61189a42836136d5565b6127b3565b6118a942826136d5565b6040516000805160206138be83398151915290600090a250565b6000806118d26009600a613777565b600d546118df9190613712565b6118eb6009600a613777565b600e546118f89190613712565b915091509091565b336119136000546001600160a01b031690565b6001600160a01b0316146119395760405162461bcd60e51b8152600401610b3f906135f8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119966000546001600160a01b031690565b6001600160a01b0316146119bc5760405162461bcd60e51b8152600401610b3f906135f8565b6019805461ff00191661010017905542601055565b6018546119de90426136d5565b33600090815260036020526040902055565b905090565b33611a086000546001600160a01b031690565b6001600160a01b031614611a2e5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611a545760405162461bcd60e51b8152600401610b3f9061362d565b600b80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611aeb5760405162461bcd60e51b8152600401610b3f9061362d565b600980546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610b3f906135f8565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611bb46000546001600160a01b031690565b6001600160a01b031614611bda5760405162461bcd60e51b8152600401610b3f906135f8565b6064600c54611be99190613712565b8110611c555760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b3f565b611c616009600a613777565b611c6b9083613822565b9150611c796009600a613777565b611c839082613822565b90506000606460ff16600c54611c999190613712565b9050600061019061ffff16600c54611cb19190613712565b905081841015611d175760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b3f565b80831015611d785760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b3f565b600d849055600e83905560405184906000805160206138be83398151915290600090a2600e546040516000805160206138be83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e1e5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b3f565b611e2d3385610e048685613841565b5060019392505050565b6000610afa3384846123ee565b33611e576000546001600160a01b031690565b6001600160a01b031614611e7d5760405162461bcd60e51b8152600401610b3f906135f8565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611ee65742601a546119f09190613841565b50600090565b6000611efa6009600a613777565b600c54611f096009600a613777565b611f189064e8d4a51000613822565b611f229190613841565b6119f09190613712565b33611f3f6000546001600160a01b031690565b6001600160a01b031614611f655760405162461bcd60e51b8152600401610b3f906135f8565b600881905560405181906000805160206138be83398151915290600090a250565b33611f996000546001600160a01b031690565b6001600160a01b031614611fbf5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611fe55760405162461bcd60e51b8152600401610b3f9061362d565b600a80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b336120306000546001600160a01b031690565b6001600160a01b0316146120565760405162461bcd60e51b8152600401610b3f906135f8565b6120626009600a613777565b61206c9082613822565b600f8190556040516000805160206138be83398151915290600090a250565b3361209e6000546001600160a01b031690565b6001600160a01b0316146120c45760405162461bcd60e51b8152600401610b3f906135f8565b600981111561210e5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b3f565b601881905560405181906000805160206138be83398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121585750600092915050565b6121624282613841565b9392505050565b3361217c6000546001600160a01b031690565b6001600160a01b0316146121a25760405162461bcd60e51b8152600401610b3f906135f8565b610e9b6006826122e6565b336121c06000546001600160a01b031690565b6001600160a01b0316146121e65760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b03811661224b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b3f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b96000546001600160a01b031690565b6001600160a01b0316146122df5760405162461bcd60e51b8152600401610b3f906135f8565b610e9b6004825b6000612162836001600160a01b03841661283d565b6001600160a01b0383166123455760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b3f565b6001600160a01b03821661238d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b3f565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124395760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b3f565b6001600160a01b0382166124825760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b3f565b600061248f60048561288c565b806124a057506124a060048461288c565b905060006001600160a01b0385163014806124c357506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125055750816001600160a01b0316866001600160a01b0316145b8061254057506013546001600160a01b03878116600160301b909204161480156125405750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061257a5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b45750836001600160a01b0316886001600160a01b0316145b905084806125bf5750825b806125c75750855b156125dc576125d78989896128ae565b612640565b601954610100900460ff166126335760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b3f565b6126408989898585612967565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269390640100000000810460ff90811691650100000000009004166136ed565b60ff16905060006008549050808310806126af575061ffff8216155b156126bc57505050612792565b60135460009061ffff8416906126dd90640100000000900460ff1684613822565b6126e79190613712565b905060006126f58284613841565b90506000612704600284613712565b905060006127128285613841565b9050600061272084836136d5565b90504761272c82612f21565b60006127388247613841565b90506000836127478684613822565b6127519190613712565b905061275d8682613089565b506000905061276c8447613841565b9050806015600082825461278091906136d5565b90915550505050505050505050505050505b6017805460ff19169055565b6000612162836001600160a01b03841661318e565b601a54811161281c5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b3f565b601a81905560405181906000805160206138be83398151915290600090a250565b600081815260018301602052604081205461288457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610afe565b506000610afe565b6001600160a01b03811660009081526001830160205260408120541515612162565b6001600160a01b038316600090815260016020526040902054818110156129125760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b3f565b61291c848361327b565b61292683836132c0565b826001600160a01b0316846001600160a01b03166000805160206138de8339815191528460405161295991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129d55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b3f565b60008315612ae857600e54861115612a215760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b3f565b612a2c60068961288c565b15612a705760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b3f565b601154601054612a8091906136d5565b4211158015612a9157506012546001145b15612ad757612aa16006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dce565b8415612c5b57600d54612afb87856136d5565b1115612b3c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b3f565b600f54861115612b995760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b3f565b612ba460068861288c565b15612be85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b3f565b601154601054612bf891906136d5565b4211158015612c0957506012546001145b15612c4f57612c196006886122e6565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dce565b612c6660068961288c565b15612cb35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b3f565b612cbe60068861288c565b15612d0b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b3f565b600d54612d1887856136d5565b1115612d595760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b3f565b601154601054612d6991906136d5565b4211158015612d7a57506012546001145b15612dc057612d8a6006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612df6575060195460ff16155b8015612e05575060175460ff16155b8015612e0e5750835b15612e1b57612e1b61264b565b6000612e378783601360039054906101000a900460ff166132e4565b601354909150600090612e6d9089908590612e689060ff6401000000008204811691650100000000009004166136ed565b6132e4565b90506000612e7b82846136d5565b612e85908a613841565b9050612e918b8a61327b565b3060009081526001602052604081208054849290612eb09084906136d5565b9250508190555082600c6000828254612ec99190613841565b90915550612ed990508a826132c0565b896001600160a01b03168b6001600160a01b03166000805160206138de83398151915283604051612f0c91815260200190565b60405180910390a35050505050505050505050565b601454612f399030906001600160a01b0316836122fb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f6e57612f6e613884565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa919061334b565b8160018151811061300d5761300d613884565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac94790613053908590600090869030904290600401613664565b600060405180830381600087803b15801561306d57600080fd5b505af1158015613081573d6000803e3d6000fd5b505050505050565b600080826016600082825461309e91906136d5565b909155506000905060646130b385604b613822565b6130bd9190613712565b9050600060646130ce87604b613822565b6130d89190613712565b6014549091506130f39030906001600160a01b0316886122fb565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061312f9030908b90879089908490429060040161353e565b6060604051808303818588803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613181919061349c565b5096979596505050505050565b600081815260018301602052604081205480156132715760006131b2600183613841565b85549091506000906131c690600190613841565b905060008660000182815481106131df576131df613884565b906000526020600020015490508087600001848154811061320257613202613884565b6000918252602080832090910192909255828152600189019091526040902084905586548790806132355761323561386e565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610afe565b6000915050610afe565b6001600160a01b03821660009081526001602052604081205461329f908390613841565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461329f9083906136d5565b60006127108260ff168460ff16866132fc9190613822565b6133069190613822565b6133109190613712565b949350505050565b803560ff8116811461332957600080fd5b919050565b60006020828403121561334057600080fd5b81356121628161389a565b60006020828403121561335d57600080fd5b81516121628161389a565b6000806040838503121561337b57600080fd5b82356133868161389a565b915060208301356133968161389a565b809150509250929050565b6000806000606084860312156133b657600080fd5b83356133c18161389a565b925060208401356133d18161389a565b929592945050506040919091013590565b600080604083850312156133f557600080fd5b82356134008161389a565b946020939093013593505050565b60006020828403121561342057600080fd5b8135612162816138af565b60006020828403121561343d57600080fd5b8151612162816138af565b60006020828403121561345a57600080fd5b5035919050565b60006020828403121561347357600080fd5b5051919050565b6000806040838503121561348d57600080fd5b50508035926020909101359150565b6000806000606084860312156134b157600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156134e357600080fd5b6134ec87613318565b95506134fa60208801613318565b945061350860408801613318565b935061351660608801613318565b925061352460808801613318565b915061353260a08801613318565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b818110156135a65785810183015185820160400152820161358a565b818111156135b8576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136b45784516001600160a01b03168352938301939183019160010161368f565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156136e8576136e8613858565b500190565b600060ff821660ff84168060ff0382111561370a5761370a613858565b019392505050565b60008261372f57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561376f57816000190482111561375557613755613858565b8085161561376257918102915b93841c9390800290613739565b509250929050565b600061216260ff84168360008261379057506001610afe565b8161379d57506000610afe565b81600181146137b357600281146137bd576137d9565b6001915050610afe565b60ff8411156137ce576137ce613858565b50506001821b610afe565b5060208310610133831016604e8410600b84101617156137fc575081810a610afe565b6138068383613734565b806000190482111561381a5761381a613858565b029392505050565b600081600019048311821515161561383c5761383c613858565b500290565b60008282101561385357613853613858565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461139157600080fd5b801515811461139157600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212202bfad25e055ba6083cde7b06ad4c78b76eb3a9f368ba549ddad7e21501d5c5ba64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063d8902ff51161009a578063e803050c1161006c578063e803050c14610a6d578063f2c816ae14610a8d578063f2fde38b14610aad578063f9ab736614610acd57005b8063d8902ff5146109c7578063daf9a47a146109e7578063dd62ed3e14610a07578063e2fd002a14610a4d57005b8063b766a386116100d3578063b766a3861461095d578063c3a3c0321461097d578063c3f4f54f14610992578063d11edf74146109a757005b80639fa62d5f146108fd578063a457c2d71461091d578063a9059cbb1461093d57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087057806395d89b41146108905780639bc845fb146108bd5780639bf65770146108dd57005b8063828e8b7e1461082357806386d0ada814610838578063893d20e8146108525780638da5cb5b1461085257005b806370a08231116101a157806370a08231146107ad578063715018a6146107e3578063762bb282146107f85780637b9e987a1461080e57005b8063677a8870146107435780636eb8c7f1146107635780636f89e4091461078357005b806335e82f3a1161029d5780634cbf8e241161024157806358e1df921161021357806358e1df92146106e357806358e55365146106f85780635c69f6901461070e57806361cb27481461072357005b80634cbf8e24146106785780634cdaf0ae1461068d5780634f91e48c146106ad57806357ad67d1146106c357005b80633cc39b7a1161027a5780633cc39b7a1461060d5780634476f35a1461062357806344f3c83a146106435780634ada218b1461065957005b806335e82f3a1461059957806339509351146105b95780633c7a309b146105d957005b806323b872dd116103045780632973ef2d116102e15780632973ef2d146104d45780633054f8a31461053f578063311a86971461055e578063313ce5671461058557005b806323b872dd14610467578063243b529a146104875780632594b3431461049c57005b80630fd99e161161033d5780630fd99e16146103ff57806314ddc0951461042857806318160ddd1461043d5780631eb25d131461045257005b806306fdde0314610369578063095ea7b3146103ac5780630fa5b215146103dc57005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600881526726b7b7b726b7b7b760c11b60208201525b6040516103a39190613579565b60405180910390f35b3480156103b857600080fd5b506103cc6103c73660046133e2565b610aed565b60405190151581526020016103a3565b3480156103e857600080fd5b506103f1610b04565b6040519081526020016103a3565b34801561040b57600080fd5b5061041561019081565b60405161ffff90911681526020016103a3565b34801561043457600080fd5b506018546103f1565b34801561044957600080fd5b50600c546103f1565b34801561045e57600080fd5b506103f1610d5f565b34801561047357600080fd5b506103cc6104823660046133a1565b610d7d565b34801561049357600080fd5b50610367610e14565b3480156104a857600080fd5b50600a546104bc906001600160a01b031681565b6040516001600160a01b0390911681526020016103a3565b3480156104e057600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a3565b34801561054b57600080fd5b506017546103cc90610100900460ff1681565b34801561056a57600080fd5b50610573606481565b60405160ff90911681526020016103a3565b34801561059157600080fd5b506009610573565b3480156105a557600080fd5b506103676105b436600461332e565b610e57565b3480156105c557600080fd5b506103cc6105d43660046133e2565b610ec1565b3480156105e557600080fd5b506105ee610ef8565b604080516001600160a01b0390931683526020830191909152016103a3565b34801561061957600080fd5b506103f160165481565b34801561062f57600080fd5b5061036761063e366004613448565b6110ab565b34801561064f57600080fd5b506103f160185481565b34801561066557600080fd5b506019546103cc90610100900460ff1681565b34801561068457600080fd5b506103676112a0565b34801561069957600080fd5b506103676106a836600461332e565b611394565b3480156106b957600080fd5b506103f1600e5481565b3480156106cf57600080fd5b506103676106de3660046134ca565b61141d565b3480156106ef57600080fd5b506103676117b2565b34801561070457600080fd5b506103f160155481565b34801561071a57600080fd5b50610415600981565b34801561072f57600080fd5b5061036761073e36600461332e565b611810565b34801561074f57600080fd5b506009546104bc906001600160a01b031681565b34801561076f57600080fd5b5061036761077e366004613448565b611854565b34801561078f57600080fd5b506107986118c3565b604080519283526020830191909152016103a3565b3480156107b957600080fd5b506103f16107c836600461332e565b6001600160a01b031660009081526001602052604090205490565b3480156107ef57600080fd5b50610367611900565b34801561080457600080fd5b506103f1600d5481565b34801561081a57600080fd5b50610367611983565b34801561082f57600080fd5b506103676119d1565b34801561084457600080fd5b506019546103cc9060ff1681565b34801561085e57600080fd5b506000546001600160a01b03166104bc565b34801561087c57600080fd5b5061036761088b36600461332e565b6119f5565b34801561089c57600080fd5b5060408051808201909152600481526326a726a760e11b6020820152610396565b3480156108c957600080fd5b506103676108d836600461332e565b611a8c565b3480156108e957600080fd5b506103676108f836600461340e565b611b23565b34801561090957600080fd5b5061036761091836600461347a565b611ba1565b34801561092957600080fd5b506103cc6109383660046133e2565b611dbb565b34801561094957600080fd5b506103cc6109583660046133e2565b611e37565b34801561096957600080fd5b5061036761097836600461340e565b611e44565b34801561098957600080fd5b506103f1611ecc565b34801561099e57600080fd5b506103f1611eec565b3480156109b357600080fd5b506103676109c2366004613448565b611f2c565b3480156109d357600080fd5b506103676109e236600461332e565b611f86565b3480156109f357600080fd5b50610367610a02366004613448565b61201d565b348015610a1357600080fd5b506103f1610a22366004613368565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a5957600080fd5b50610367610a68366004613448565b61208b565b348015610a7957600080fd5b506103f1610a8836600461332e565b61212f565b348015610a9957600080fd5b50610367610aa836600461332e565b612169565b348015610ab957600080fd5b50610367610ac836600461332e565b6121ad565b348015610ad957600080fd5b50610367610ae836600461332e565b6122a6565b6000610afa3384846122fb565b5060015b92915050565b600033610b196000546001600160a01b031690565b6001600160a01b031614610b485760405162461bcd60e51b8152600401610b3f906135f8565b60405180910390fd5b601a54421015610b6a5760405162461bcd60e51b8152600401610b3f906135ce565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef9190613461565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061342b565b5060145447906001600160a01b031663af2979eb30846064610c9a82604b613822565b610ca49190613712565b6064610cb188604b613822565b610cbb9190613712565b30426040518763ffffffff1660e01b8152600401610cde9695949392919061353e565b602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190613461565b506000610d3d8247613841565b90508060156000828254610d5191906136d5565b909155509094505050505090565b610d6b6009600a613777565b610d7a9064e8d4a51000613822565b81565b6000610d8a8484846123ee565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610df55760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b3f565b610e098533610e048685613841565b6122fb565b506001949350505050565b33610e276000546001600160a01b031690565b6001600160a01b031614610e4d5760405162461bcd60e51b8152600401610b3f906135f8565b610e5561264b565b565b33610e6a6000546001600160a01b031690565b6001600160a01b031614610e905760405162461bcd60e51b8152600401610b3f906135f8565b610e9b60068261279e565b506040516001600160a01b038216906000805160206138fe83398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610afa918590610e049086906136d5565b60008033610f0e6000546001600160a01b031690565b6001600160a01b031614610f345760405162461bcd60e51b8152600401610b3f906135f8565b601a54421015610f565760405162461bcd60e51b8152600401610b3f906135ce565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb9190613461565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611063919061342b565b506009546040518281526001600160a01b039091169030906000805160206138de8339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110be6000546001600160a01b031690565b6001600160a01b0316146110e45760405162461bcd60e51b8152600401610b3f906135f8565b60155481111561114c5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b3f565b806015600082825461115e9190613841565b90915550506009546001600160a01b03166108fc606461117f846032613822565b6111899190613712565b6040518115909202916000818181858888f193505050501580156111b1573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111ce846032613822565b6111d89190613712565b6111e29084613841565b6040518115909202916000818181858888f1935050505015801561120a573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138de8339815191526064611234856032613822565b61123e9190613712565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138de8339815191526064611278856032613822565b6112829190613712565b61128c9085613841565b60405190815260200160405180910390a350565b336112b36000546001600160a01b031690565b6001600160a01b0316146112d95760405162461bcd60e51b8152600401610b3f906135f8565b601a544210156112fb5760405162461bcd60e51b8152600401610b3f906135ce565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611348576040519150601f19603f3d011682016040523d82523d6000602084013e61134d565b606091505b50509050806113915760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b3f565b50565b336113a76000546001600160a01b031690565b6001600160a01b0316146113cd5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b0381166113f35760405162461bcd60e51b8152600401610b3f9061362d565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114306000546001600160a01b031690565b6001600160a01b0316146114565760405162461bcd60e51b8152600401610b3f906135f8565b60008461146387896136ed565b61146d91906136ed565b90508060ff166064146114d15760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b3f565b60148460ff16111561154b5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b3f565b60148360ff1611156115c55760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b3f565b60148260ff16111561164a5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b3f565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138be83398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138be83398151915290600090a260135460405160ff909116906000805160206138be83398151915290600090a260135460405161010090910460ff16906000805160206138be83398151915290600090a26013546040516201000090910460ff16906000805160206138be83398151915290600090a250505050505050565b336117c56000546001600160a01b031690565b6001600160a01b0316146117eb5760405162461bcd60e51b8152600401610b3f906135f8565b6015805460009091556009546001600160a01b03166108fc606461117f846032613822565b336118236000546001600160a01b031690565b6001600160a01b0316146118495760405162461bcd60e51b8152600401610b3f906135f8565b610e9b60048261279e565b336118676000546001600160a01b031690565b6001600160a01b03161461188d5760405162461bcd60e51b8152600401610b3f906135f8565b61189f61189a42836136d5565b6127b3565b6118a942826136d5565b6040516000805160206138be83398151915290600090a250565b6000806118d26009600a613777565b600d546118df9190613712565b6118eb6009600a613777565b600e546118f89190613712565b915091509091565b336119136000546001600160a01b031690565b6001600160a01b0316146119395760405162461bcd60e51b8152600401610b3f906135f8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119966000546001600160a01b031690565b6001600160a01b0316146119bc5760405162461bcd60e51b8152600401610b3f906135f8565b6019805461ff00191661010017905542601055565b6018546119de90426136d5565b33600090815260036020526040902055565b905090565b33611a086000546001600160a01b031690565b6001600160a01b031614611a2e5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611a545760405162461bcd60e51b8152600401610b3f9061362d565b600b80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611aeb5760405162461bcd60e51b8152600401610b3f9061362d565b600980546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610b3f906135f8565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611bb46000546001600160a01b031690565b6001600160a01b031614611bda5760405162461bcd60e51b8152600401610b3f906135f8565b6064600c54611be99190613712565b8110611c555760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b3f565b611c616009600a613777565b611c6b9083613822565b9150611c796009600a613777565b611c839082613822565b90506000606460ff16600c54611c999190613712565b9050600061019061ffff16600c54611cb19190613712565b905081841015611d175760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b3f565b80831015611d785760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b3f565b600d849055600e83905560405184906000805160206138be83398151915290600090a2600e546040516000805160206138be83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e1e5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b3f565b611e2d3385610e048685613841565b5060019392505050565b6000610afa3384846123ee565b33611e576000546001600160a01b031690565b6001600160a01b031614611e7d5760405162461bcd60e51b8152600401610b3f906135f8565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611ee65742601a546119f09190613841565b50600090565b6000611efa6009600a613777565b600c54611f096009600a613777565b611f189064e8d4a51000613822565b611f229190613841565b6119f09190613712565b33611f3f6000546001600160a01b031690565b6001600160a01b031614611f655760405162461bcd60e51b8152600401610b3f906135f8565b600881905560405181906000805160206138be83398151915290600090a250565b33611f996000546001600160a01b031690565b6001600160a01b031614611fbf5760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b038116611fe55760405162461bcd60e51b8152600401610b3f9061362d565b600a80546001600160a01b0319166001600160a01b0383169081179091556040516000805160206138fe83398151915290600090a250565b336120306000546001600160a01b031690565b6001600160a01b0316146120565760405162461bcd60e51b8152600401610b3f906135f8565b6120626009600a613777565b61206c9082613822565b600f8190556040516000805160206138be83398151915290600090a250565b3361209e6000546001600160a01b031690565b6001600160a01b0316146120c45760405162461bcd60e51b8152600401610b3f906135f8565b600981111561210e5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b3f565b601881905560405181906000805160206138be83398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121585750600092915050565b6121624282613841565b9392505050565b3361217c6000546001600160a01b031690565b6001600160a01b0316146121a25760405162461bcd60e51b8152600401610b3f906135f8565b610e9b6006826122e6565b336121c06000546001600160a01b031690565b6001600160a01b0316146121e65760405162461bcd60e51b8152600401610b3f906135f8565b6001600160a01b03811661224b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b3f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b96000546001600160a01b031690565b6001600160a01b0316146122df5760405162461bcd60e51b8152600401610b3f906135f8565b610e9b6004825b6000612162836001600160a01b03841661283d565b6001600160a01b0383166123455760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b3f565b6001600160a01b03821661238d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b3f565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124395760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b3f565b6001600160a01b0382166124825760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b3f565b600061248f60048561288c565b806124a057506124a060048461288c565b905060006001600160a01b0385163014806124c357506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125055750816001600160a01b0316866001600160a01b0316145b8061254057506013546001600160a01b03878116600160301b909204161480156125405750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061257a5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b45750836001600160a01b0316886001600160a01b0316145b905084806125bf5750825b806125c75750855b156125dc576125d78989896128ae565b612640565b601954610100900460ff166126335760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b3f565b6126408989898585612967565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269390640100000000810460ff90811691650100000000009004166136ed565b60ff16905060006008549050808310806126af575061ffff8216155b156126bc57505050612792565b60135460009061ffff8416906126dd90640100000000900460ff1684613822565b6126e79190613712565b905060006126f58284613841565b90506000612704600284613712565b905060006127128285613841565b9050600061272084836136d5565b90504761272c82612f21565b60006127388247613841565b90506000836127478684613822565b6127519190613712565b905061275d8682613089565b506000905061276c8447613841565b9050806015600082825461278091906136d5565b90915550505050505050505050505050505b6017805460ff19169055565b6000612162836001600160a01b03841661318e565b601a54811161281c5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b3f565b601a81905560405181906000805160206138be83398151915290600090a250565b600081815260018301602052604081205461288457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610afe565b506000610afe565b6001600160a01b03811660009081526001830160205260408120541515612162565b6001600160a01b038316600090815260016020526040902054818110156129125760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b3f565b61291c848361327b565b61292683836132c0565b826001600160a01b0316846001600160a01b03166000805160206138de8339815191528460405161295991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129d55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b3f565b60008315612ae857600e54861115612a215760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b3f565b612a2c60068961288c565b15612a705760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b3f565b601154601054612a8091906136d5565b4211158015612a9157506012546001145b15612ad757612aa16006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dce565b8415612c5b57600d54612afb87856136d5565b1115612b3c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b3f565b600f54861115612b995760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b3f565b612ba460068861288c565b15612be85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b3f565b601154601054612bf891906136d5565b4211158015612c0957506012546001145b15612c4f57612c196006886122e6565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dce565b612c6660068961288c565b15612cb35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b3f565b612cbe60068861288c565b15612d0b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b3f565b600d54612d1887856136d5565b1115612d595760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b3f565b601154601054612d6991906136d5565b4211158015612d7a57506012546001145b15612dc057612d8a6006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612df6575060195460ff16155b8015612e05575060175460ff16155b8015612e0e5750835b15612e1b57612e1b61264b565b6000612e378783601360039054906101000a900460ff166132e4565b601354909150600090612e6d9089908590612e689060ff6401000000008204811691650100000000009004166136ed565b6132e4565b90506000612e7b82846136d5565b612e85908a613841565b9050612e918b8a61327b565b3060009081526001602052604081208054849290612eb09084906136d5565b9250508190555082600c6000828254612ec99190613841565b90915550612ed990508a826132c0565b896001600160a01b03168b6001600160a01b03166000805160206138de83398151915283604051612f0c91815260200190565b60405180910390a35050505050505050505050565b601454612f399030906001600160a01b0316836122fb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f6e57612f6e613884565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa919061334b565b8160018151811061300d5761300d613884565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac94790613053908590600090869030904290600401613664565b600060405180830381600087803b15801561306d57600080fd5b505af1158015613081573d6000803e3d6000fd5b505050505050565b600080826016600082825461309e91906136d5565b909155506000905060646130b385604b613822565b6130bd9190613712565b9050600060646130ce87604b613822565b6130d89190613712565b6014549091506130f39030906001600160a01b0316886122fb565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061312f9030908b90879089908490429060040161353e565b6060604051808303818588803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613181919061349c565b5096979596505050505050565b600081815260018301602052604081205480156132715760006131b2600183613841565b85549091506000906131c690600190613841565b905060008660000182815481106131df576131df613884565b906000526020600020015490508087600001848154811061320257613202613884565b6000918252602080832090910192909255828152600189019091526040902084905586548790806132355761323561386e565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610afe565b6000915050610afe565b6001600160a01b03821660009081526001602052604081205461329f908390613841565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461329f9083906136d5565b60006127108260ff168460ff16866132fc9190613822565b6133069190613822565b6133109190613712565b949350505050565b803560ff8116811461332957600080fd5b919050565b60006020828403121561334057600080fd5b81356121628161389a565b60006020828403121561335d57600080fd5b81516121628161389a565b6000806040838503121561337b57600080fd5b82356133868161389a565b915060208301356133968161389a565b809150509250929050565b6000806000606084860312156133b657600080fd5b83356133c18161389a565b925060208401356133d18161389a565b929592945050506040919091013590565b600080604083850312156133f557600080fd5b82356134008161389a565b946020939093013593505050565b60006020828403121561342057600080fd5b8135612162816138af565b60006020828403121561343d57600080fd5b8151612162816138af565b60006020828403121561345a57600080fd5b5035919050565b60006020828403121561347357600080fd5b5051919050565b6000806040838503121561348d57600080fd5b50508035926020909101359150565b6000806000606084860312156134b157600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156134e357600080fd5b6134ec87613318565b95506134fa60208801613318565b945061350860408801613318565b935061351660608801613318565b925061352460808801613318565b915061353260a08801613318565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b818110156135a65785810183015185820160400152820161358a565b818111156135b8576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136b45784516001600160a01b03168352938301939183019160010161368f565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156136e8576136e8613858565b500190565b600060ff821660ff84168060ff0382111561370a5761370a613858565b019392505050565b60008261372f57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561376f57816000190482111561375557613755613858565b8085161561376257918102915b93841c9390800290613739565b509250929050565b600061216260ff84168360008261379057506001610afe565b8161379d57506000610afe565b81600181146137b357600281146137bd576137d9565b6001915050610afe565b60ff8411156137ce576137ce613858565b50506001821b610afe565b5060208310610133831016604e8410600b84101617156137fc575081810a610afe565b6138068383613734565b806000190482111561381a5761381a613858565b029392505050565b600081600019048311821515161561383c5761383c613858565b500290565b60008282101561385357613853613858565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461139157600080fd5b801515811461139157600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212202bfad25e055ba6083cde7b06ad4c78b76eb3a9f368ba549ddad7e21501d5c5ba64736f6c63430008070033

Deployed Bytecode Sourcemap

27674:28611:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53939:94;;;;;;;;;;-1:-1:-1;54020:5:0;;;;;;;;;;;;-1:-1:-1;;;54020:5:0;;;;53939:94;;;;;;;:::i;:::-;;;;;;;;54824:161;;;;;;;;;;-1:-1:-1;54824:161:0;;;;;:::i;:::-;;:::i;:::-;;;5289:14:1;;5282:22;5264:41;;5252:2;5237:18;54824:161:0;5124:187:1;52040:1015:0;;;;;;;;;;;;;:::i;:::-;;;17171:25:1;;;17159:2;17144:18;52040:1015:0;17025:177:1;28827:43:0;;;;;;;;;;;;28867:3;28827:43;;;;;17006:6:1;16994:19;;;16976:38;;16964:2;16949:18;28827:43:0;16832:188:1;42684:102:0;;;;;;;;;;-1:-1:-1;42767:11:0;;42684:102;;54249:108;;;;;;;;;;-1:-1:-1;54331:18:0;;54249:108;;28472:68;;;;;;;;;;;;;:::i;55298:392::-;;;;;;;;;;-1:-1:-1;55298:392:0;;;;;:::i;:::-;;:::i;48175:83::-;;;;;;;;;;;;;:::i;29309:76::-;;;;;;;;;;-1:-1:-1;29309:76:0;;;;-1:-1:-1;;;;;29309:76:0;;;;;;-1:-1:-1;;;;;4205:32:1;;;4187:51;;4175:2;4160:18;29309:76:0;4041:203:1;42088:249:0;;;;;;;;;;-1:-1:-1;42262:8:0;;42088:249;;;42262:8;;;;;;18732:25:1;;42271:13:0;;;;;18788:2:1;18773:18;;18766:34;42285:13:0;;;;;18816:18:1;;;18809:34;;;;42299:7:0;;;18874:2:1;18859:18;;18852:34;42262:8:0;42307;;;;18917:3:1;18902:19;;18895:35;42316:12:0;;;;;18961:3:1;18946:19;;18939:35;18719:3;18704:19;42088:249:0;18445:535:1;43155:27:0;;;;;;;;;;-1:-1:-1;43155:27:0;;;;;;;;;;;28710:45;;;;;;;;;;;;28752:3;28710:45;;;;;19157:4:1;19145:17;;;19127:36;;19115:2;19100:18;28710:45:0;18985:184:1;54147:94:0;;;;;;;;;;-1:-1:-1;28464:1:0;54147:94;;46774:201;;;;;;;;;;-1:-1:-1;46774:201:0;;;;;:::i;:::-;;:::i;55725:205::-;;;;;;;;;;-1:-1:-1;55725:205:0;;;;;:::i;:::-;;:::i;51287:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4441:32:1;;;4423:51;;4505:2;4490:18;;4483:34;;;;4396:18;51287:695:0;4249:274:1;38129:25:0;;;;;;;;;;;;;;;;43675:486;;;;;;;;;;-1:-1:-1;43675:486:0;;;;;:::i;:::-;;:::i;43189:26::-;;;;;;;;;;;;;;;;49795;;;;;;;;;;-1:-1:-1;49795:26:0;;;;;;;;;;;53141:268;;;;;;;;;;;;;:::i;50104:243::-;;;;;;;;;;-1:-1:-1;50104:243:0;;;;;:::i;:::-;;:::i;29769:46::-;;;;;;;;;;;;;;;;47073:1048;;;;;;;;;;-1:-1:-1;47073:1048:0;;;;;:::i;:::-;;:::i;43260:408::-;;;;;;;;;;;;;:::i;37391:31::-;;;;;;;;;;;;;;;;29007:48;;;;;;;;;;;;29046:9;29007:48;;46239:181;;;;;;;;;;-1:-1:-1;46239:181:0;;;;;:::i;:::-;;:::i;29225:77::-;;;;;;;;;;-1:-1:-1;29225:77:0;;;;-1:-1:-1;;;;;29225:77:0;;;50594:232;;;;;;;;;;-1:-1:-1;50594:232:0;;;;;:::i;:::-;;:::i;41929:151::-;;;;;;;;;;;;;:::i;:::-;;;;18366:25:1;;;18422:2;18407:18;;18400:34;;;;18339:18;41929:151:0;18192:248:1;54365:121:0;;;;;;;;;;-1:-1:-1;54365:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54460:18:0;54433:7;54460:18;;;:9;:18;;;;;;;54365:121;9530:142;;;;;;;;;;;;;:::i;29713:49::-;;;;;;;;;;;;;;;;49909:129;;;;;;;;;;;;;:::i;42928:109::-;;;;;;;;;;;;;:::i;43222:28::-;;;;;;;;;;-1:-1:-1;43222:28:0;;;;;;;;53837:94;;;;;;;;;;-1:-1:-1;53889:7:0;8954:6;-1:-1:-1;;;;;8954:6:0;53837:94;;48270:247;;;;;;;;;;-1:-1:-1;48270:247:0;;;;;:::i;:::-;;:::i;54041:98::-;;;;;;;;;;-1:-1:-1;54124:7:0;;;;;;;;;;;;-1:-1:-1;;;54124:7:0;;;;54041:98;;44593:252;;;;;;;;;;-1:-1:-1;44593:252:0;;;;;:::i;:::-;;:::i;44246:165::-;;;;;;;;;;-1:-1:-1;44246:165:0;;;;;:::i;:::-;;:::i;48620:1045::-;;;;;;;;;;-1:-1:-1;48620:1045:0;;;;;:::i;:::-;;:::i;55938:342::-;;;;;;;;;;-1:-1:-1;55938:342:0;;;;;:::i;:::-;;:::i;54494:167::-;;;;;;;;;;-1:-1:-1;54494:167:0;;;;;:::i;:::-;;:::i;45164:156::-;;;;;;;;;;-1:-1:-1;45164:156:0;;;;;:::i;:::-;;:::i;41560:222::-;;;;;;;;;;;;;:::i;41790:131::-;;;;;;;;;;;;;:::i;45759:179::-;;;;;;;;;;-1:-1:-1;45759:179:0;;;;;:::i;:::-;;:::i;44857:246::-;;;;;;;;;;-1:-1:-1;44857:246:0;;;;;:::i;:::-;;:::i;44417:164::-;;;;;;;;;;-1:-1:-1;44417:164:0;;;;;:::i;:::-;;:::i;54669:147::-;;;;;;;;;;-1:-1:-1;54669:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54780:19:0;;;54753:7;54780:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54669:147;45389:246;;;;;;;;;;-1:-1:-1;45389:246:0;;;;;:::i;:::-;;:::i;42403:275::-;;;;;;;;;;-1:-1:-1;42403:275:0;;;;;:::i;:::-;;:::i;46500:193::-;;;;;;;;;;-1:-1:-1;46500:193:0;;;;;:::i;:::-;;:::i;9827:238::-;;;;;;;;;;-1:-1:-1;9827:238:0;;;;;:::i;:::-;;:::i;46006:166::-;;;;;;;;;;-1:-1:-1;46006:166:0;;;;;:::i;:::-;;:::i;54824:161::-;54901:4;54918:37;54927:10;54939:7;54948:6;54918:8;:37::i;:::-;-1:-1:-1;54973:4:0;54824:161;;;;;:::o;52040:1015::-;52099:18;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;;;;;;;;;52215:20:::1;;52196:15;:39;;52188:68;;;;-1:-1:-1::0;;;52188:68:0::1;;;;;;;:::i;:::-;52316:22;::::0;52367:39:::1;::::0;-1:-1:-1;;;52367:39:0;;52400:4:::1;52367:39;::::0;::::1;4187:51:1::0;52316:22:0;;;::::1;-1:-1:-1::0;;;;;52316:22:0::1;::::0;52267:30:::1;::::0;52316:22;;52367:24:::1;::::0;4160:18:1;;52367:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52450:16;::::0;52419:56:::1;::::0;-1:-1:-1;;;52419:56:0;;-1:-1:-1;;;;;52450:16:0;;::::1;52419:56;::::0;::::1;4423:51:1::0;4490:18;;;4483:34;;;52350:56:0;;-1:-1:-1;52419:22:0;::::1;::::0;::::1;::::0;4396:18:1;;52419:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52618:16:0::1;::::0;52576:21:::1;::::0;-1:-1:-1;;;;;52618:16:0::1;:64;52705:4;52725:6:::0;52760:3:::1;52747:9;52725:6:::0;52754:2:::1;52747:9;:::i;:::-;52746:17;;;;:::i;:::-;52792:3;52779:9;:6:::0;52786:2:::1;52779:9;:::i;:::-;52778:17;;;;:::i;:::-;52818:4;52838:15;52618:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52879:21:0::1;52903:39;52925:17:::0;52903:21:::1;:39;:::i;:::-;52879:63;;52971:13;52953:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53006:13:0;;-1:-1:-1;;;;;52040:1015:0;:::o;28472:68::-;28527:13;28464:1;28527:2;:13;:::i;:::-;28511:29;;:13;:29;:::i;:::-;28472:68;:::o;55298:392::-;55398:4;55415:36;55425:6;55433:9;55444:6;55415:9;:36::i;:::-;-1:-1:-1;;;;;55491:19:0;;55464:24;55491:19;;;:11;:19;;;;;;;;55511:10;55491:31;;;;;;;;55541:26;;;;55533:59;;;;-1:-1:-1;;;55533:59:0;;9870:2:1;55533:59:0;;;9852:21:1;9909:2;9889:18;;;9882:30;-1:-1:-1;;;9928:18:1;;;9921:50;9988:18;;55533:59:0;9668:344:1;55533:59:0;55605:55;55614:6;55622:10;55634:25;55653:6;55634:16;:25;:::i;:::-;55605:8;:55::i;:::-;-1:-1:-1;55678:4:0;;55298:392;-1:-1:-1;;;;55298:392:0:o;48175:83::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;48230:20:::1;:18;:20::i;:::-;48175:83::o:0;46774:201::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;46868:41:::1;:14;46890:18:::0;46868:21:::1;:41::i;:::-;-1:-1:-1::0;46925:42:0::1;::::0;-1:-1:-1;;;;;46925:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46925:42:0;;;::::1;46774:201:::0;:::o;55725:205::-;55833:10;55807:4;55854:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55854:32:0;;;;;;;;;;55807:4;;55824:76;;55845:7;;55854:45;;55889:10;;55854:45;:::i;51287:695::-;51347:17;;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;51482:20:::1;;51463:15;:39;;51455:68;;;;-1:-1:-1::0;;;51455:68:0::1;;;;;;;:::i;:::-;51593:22;::::0;51644:39:::1;::::0;-1:-1:-1;;;51644:39:0;;51677:4:::1;51644:39;::::0;::::1;4187:51:1::0;51593:22:0;;;::::1;-1:-1:-1::0;;;;;51593:22:0::1;::::0;51544:30:::1;::::0;51593:22;;51644:24:::1;::::0;4160:18:1;;51644:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51782:10;::::0;51758:43:::1;::::0;-1:-1:-1;;;51758:43:0;;-1:-1:-1;;;;;51782:10:0;;::::1;51758:43;::::0;::::1;4423:51:1::0;4490:18;;;4483:34;;;51627:56:0;;-1:-1:-1;51758:23:0;::::1;::::0;::::1;::::0;4396:18:1;;51758:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51841:10:0::1;::::0;51817:43:::1;::::0;17171:25:1;;;-1:-1:-1;;;;;51841:10:0;;::::1;::::0;51834:4:::1;::::0;-1:-1:-1;;;;;;;;;;;51817:43:0;17159:2:1;17144:18;51817:43:0::1;;;;;;;51883:10;::::0;-1:-1:-1;;;;;51883:10:0::1;::::0;-1:-1:-1;51917:6:0;-1:-1:-1;;51287:695:0;;:::o;43675:486::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;43771:16:::1;;43763:6;:24;;43755:91;;;::::0;-1:-1:-1;;;43755:91:0;;7165:2:1;43755:91:0::1;::::0;::::1;7147:21:1::0;7204:2;7184:18;;;7177:30;7243:34;7223:18;;;7216:62;-1:-1:-1;;;7294:18:1;;;7287:43;7347:19;;43755:91:0::1;6963:409:1::0;43755:91:0::1;43875:6;43857:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43900:10:0::1;::::0;-1:-1:-1;;;;;43900:10:0::1;43892:47;43935:3;43922:9;:6:::0;43929:2:::1;43922:9;:::i;:::-;43921:17;;;;:::i;:::-;43892:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43958:9:0::1;::::0;-1:-1:-1;;;;;43958:9:0::1;43950:55;44000:3;43987:9;:6:::0;43994:2:::1;43987:9;:::i;:::-;43986:17;;;;:::i;:::-;43979:24;::::0;:6;:24:::1;:::i;:::-;43950:55;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44045:10:0::1;::::0;-1:-1:-1;;;;;44045:10:0::1;44038:4;-1:-1:-1::0;;;;;;;;;;;44071:3:0::1;44058:9;:6:::0;44065:2:::1;44058:9;:::i;:::-;44057:17;;;;:::i;:::-;44021:54;::::0;17171:25:1;;;17159:2;17144:18;44021:54:0::1;;;;;;;44115:9;::::0;-1:-1:-1;;;;;44115:9:0::1;44108:4;-1:-1:-1::0;;;;;;;;;;;44148:3:0::1;44135:9;:6:::0;44142:2:::1;44135:9;:::i;:::-;44134:17;;;;:::i;:::-;44127:24;::::0;:6;:24:::1;:::i;:::-;44091:62;::::0;17171:25:1;;;17159:2;17144:18;44091:62:0::1;;;;;;;43675:486:::0;:::o;53141:268::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;53231:20:::1;;53212:15;:39;;53204:68;;;;-1:-1:-1::0;;;53204:68:0::1;;;;;;;:::i;:::-;53297:10;::::0;:51:::1;::::0;53284:9:::1;::::0;-1:-1:-1;;;;;53297:10:0::1;::::0;53321:21:::1;::::0;53284:9;53297:51;53284:9;53297:51;53321:21;53297:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53283:65;;;53367:4;53359:42;;;::::0;-1:-1:-1;;;53359:42:0;;13217:2:1;53359:42:0::1;::::0;::::1;13199:21:1::0;13256:2;13236:18;;;13229:30;-1:-1:-1;;;13275:18:1;;;13268:46;13331:18;;53359:42:0::1;13015:340:1::0;53359:42:0::1;53193:216;53141:268::o:0;50104:243::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50208:35:0;::::1;50200:84;;;;-1:-1:-1::0;;;50200:84:0::1;;;;;;;:::i;:::-;50295:22;:44:::0;;-1:-1:-1;;;;;50295:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50295:44:0;;::::1;::::0;;;::::1;::::0;;50104:243::o;47073:1048::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;47233:14:::1;47273::::0;47248:24:::1;47258:14:::0;47248:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47233:54;;47306:8;:13;;47316:3;47306:13;47298:64;;;::::0;-1:-1:-1;;;47298:64:0;;10563:2:1;47298:64:0::1;::::0;::::1;10545:21:1::0;10602:2;10582:18;;;10575:30;10641:34;10621:18;;;10614:62;-1:-1:-1;;;10692:18:1;;;10685:36;10738:19;;47298:64:0::1;10361:402:1::0;47298:64:0::1;47391:2;47381:6;:12;;;;47373:95;;;::::0;-1:-1:-1;;;47373:95:0;;8398:2:1;47373:95:0::1;::::0;::::1;8380:21:1::0;8437:2;8417:18;;;8410:30;8476:34;8456:18;;;8449:62;8547:31;8527:18;;;8520:59;8596:19;;47373:95:0::1;8196:425:1::0;47373:95:0::1;47498:2;47487:7;:13;;;;47479:97;;;::::0;-1:-1:-1;;;47479:97:0;;13907:2:1;47479:97:0::1;::::0;::::1;13889:21:1::0;13946:2;13926:18;;;13919:30;13985:34;13965:18;;;13958:62;14056:32;14036:18;;;14029:60;14106:19;;47479:97:0::1;13705:426:1::0;47479:97:0::1;47610:2;47595:11;:17;;;;47587:105;;;::::0;-1:-1:-1;;;47587:105:0;;14338:2:1;47587:105:0::1;::::0;::::1;14320:21:1::0;14377:2;14357:18;;;14350:30;14416:34;14396:18;;;14389:62;14487:34;14467:18;;;14460:62;-1:-1:-1;;;14538:19:1;;;14531:33;14581:19;;47587:105:0::1;14136:470:1::0;47587:105:0::1;47714:9;47705:8;;:18;;;;;;;;;;;;;;;;;;47748:14;47734:13;;:28;;;;;;;;;;;;;;;;;;47787:14;47773:13;;:28;;;;;;;;;;;;;;;;;;47830:6;47822:7;;:14;;;;;;;;;;;;;;;;;;47856:7;47847:8;;:16;;;;;;;;;;;;;;;;;;47887:11;47874:12;;:24;;;;;;;;;;;;;;;;;;47932:8;;;;;;;;;;;47916:25;;-1:-1:-1::0;;;;;;;;;;;47916:25:0::1;;;;;;;;;47973:13;::::0;47957:30:::1;::::0;47973:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47957:30:0;;;::::1;48019:7;::::0;48003:24:::1;::::0;48019:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;48003:24:0;48019:7:::1;::::0;48003:24:::1;48059:8;::::0;48043:25:::1;::::0;48059:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48043:25:0;;;::::1;48100:12;::::0;48084:29:::1;::::0;48100:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48084:29:0;;;::::1;47222:899;47073:1048:::0;;;;;;:::o;43260:408::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;43343:16:::1;::::0;;43328:14:::1;43370:18:::0;;;43407:10:::1;::::0;-1:-1:-1;;;;;43407:10:0::1;43399:47;43442:3;43429:9;43343:16:::0;43436:2:::1;43429:9;:::i;46239:181::-:0;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;46324:33:::1;:9;46341:15:::0;46324:16:::1;:33::i;50594:232::-:0;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;50694:57:::1;50716:34;50735:15;50716:18:::0;:34:::1;:::i;:::-;50694:21;:57::i;:::-;50783:34;50802:15;50783:18:::0;:34:::1;:::i;:::-;50767:51;::::0;-1:-1:-1;;;;;;;;;;;50767:51:0;;;::::1;50594:232:::0;:::o;41929:151::-;41972:15;;42033:13;28464:1;42033:2;:13;:::i;:::-;42020:12;;:26;;;;:::i;:::-;42058:13;28464:1;42058:2;:13;:::i;:::-;42048:9;;:23;;;;:::i;:::-;42013:59;;;;41929:151;;:::o;9530:142::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;9631:1:::1;9615:6:::0;;9594:40:::1;::::0;-1:-1:-1;;;;;9615:6:0;;::::1;::::0;9594:40:::1;::::0;9631:1;;9594:40:::1;9662:1;9645:19:::0;;-1:-1:-1;;;;;;9645:19:0::1;::::0;;9530:142::o;49909:129::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;49968:14:::1;:19:::0;;-1:-1:-1;;49968:19:0::1;;;::::0;;50015:15:::1;49998:16;:32:::0;49909:129::o;42928:109::-;43015:11;;42999:27;;:15;:27;:::i;:::-;42987:10;42978:20;;;;:8;:20;;;;;:48;42928:109::o;53916:7::-;53909:14;;53837:94;:::o;48270:247::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48360:23:0;::::1;48352:72;;;;-1:-1:-1::0;;;48352:72:0::1;;;;;;;:::i;:::-;48435:15;:25:::0;;-1:-1:-1;;;;;;48435:25:0::1;-1:-1:-1::0;;;;;48435:25:0;::::1;::::0;;::::1;::::0;;;48476:33:::1;::::0;-1:-1:-1;;;;;;;;;;;48476:33:0;-1:-1:-1;;48476:33:0::1;48270:247:::0;:::o;44593:252::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44681:27:0;::::1;44673:74;;;;-1:-1:-1::0;;;44673:74:0::1;;;;;;;:::i;:::-;44756:10;:33:::0;;-1:-1:-1;;;;;;44756:33:0::1;-1:-1:-1::0;;;;;44756:33:0;::::1;::::0;;::::1;::::0;;;44803:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44803:34:0;-1:-1:-1;;44803:34:0::1;44593:252:::0;:::o;44246:165::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;44327:16:::1;:23:::0;;-1:-1:-1;;44327:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44366:37:::1;::::0;44327:23:::1;44386:16:::0;;;44366:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44366:37:0::1;44246:165:::0;:::o;48620:1045::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;48858:3:::1;48839:18;;:22;;;;:::i;:::-;48826:12;:35;48818:110;;;::::0;-1:-1:-1;;;48818:110:0;;12436:2:1;48818:110:0::1;::::0;::::1;12418:21:1::0;12475:2;12455:18;;;12448:30;12514:34;12494:18;;;12487:62;-1:-1:-1;;;12565:18:1;;;12558:51;12626:19;;48818:110:0::1;12234:417:1::0;48818:110:0::1;49006:13;28464:1;49006:2;:13;:::i;:::-;48990:29;::::0;:15;:29:::1;:::i;:::-;48974:45:::0;-1:-1:-1;49056:13:0::1;28464:1;49056:2;:13;:::i;:::-;49043:26;::::0;:12;:26:::1;:::i;:::-;49030:39;;49136:26;28752:3;49163:38;;:18;;:38;;;;:::i;:::-;49136:65;;49212:23;28867:3;49236:35;;:18;;:35;;;;:::i;:::-;49212:59;;49310:18;49293:15;:35;;49284:103;;;::::0;-1:-1:-1;;;49284:103:0;;7986:2:1;49284:103:0::1;::::0;::::1;7968:21:1::0;8025:2;8005:18;;;7998:30;8064:34;8044:18;;;8037:62;-1:-1:-1;;;8115:18:1;;;8108:41;8166:19;;49284:103:0::1;7784:407:1::0;49284:103:0::1;49421:15;49407:12;:29;;49398:94;;;::::0;-1:-1:-1;;;49398:94:0;;11314:2:1;49398:94:0::1;::::0;::::1;11296:21:1::0;11353:2;11333:18;;;11326:30;11392:34;11372:18;;;11365:62;-1:-1:-1;;;11443:18:1;;;11436:38;11491:19;;49398:94:0::1;11112:404:1::0;49398:94:0::1;49505:12;:30:::0;;;49546:9:::1;:24:::0;;;49586:29:::1;::::0;49520:15;;-1:-1:-1;;;;;;;;;;;49586:29:0;-1:-1:-1;;49586:29:0::1;49647:9;::::0;49631:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49631:26:0;;;::::1;48711:954;;48620:1045:::0;;:::o;55938:342::-;56081:10;56025:4;56069:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56069:32:0;;;;;;;;;;56120:35;;;;56112:60;;;;-1:-1:-1;;;56112:60:0;;16693:2:1;56112:60:0;;;16675:21:1;16732:2;16712:18;;;16705:30;-1:-1:-1;;;16751:18:1;;;16744:42;16803:18;;56112:60:0;16491:336:1;56112:60:0;56185:65;56194:10;56206:7;56215:34;56234:15;56215:16;:34;:::i;56185:65::-;-1:-1:-1;56268:4:0;;55938:342;-1:-1:-1;;;55938:342:0:o;54494:167::-;54574:4;54591:40;54601:10;54613:9;54624:6;54591:9;:40::i;45164:156::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;45236:15:::1;:24:::0;;-1:-1:-1;;45236:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45276:36:::1;::::0;45236:24:::1;45296:15:::0;;;::::1;;45276:36;;::::0;::::1;::::0;-1:-1:-1;;45276:36:0::1;45164:156:::0;:::o;41560:222::-;41627:7;41665:20;;41649:15;:36;41646:110;;;41729:15;41708:20;;:36;;;;:::i;41646:110::-;-1:-1:-1;41773:1:0;;41560:222::o;41790:131::-;41839:7;41900:13;28464:1;41900:2;:13;:::i;:::-;41880:18;;28527:13;28464:1;28527:2;:13;:::i;:::-;28511:29;;:13;:29;:::i;:::-;41866:32;;;;:::i;:::-;41865:48;;;;:::i;45759:179::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;45843:19:::1;:35:::0;;;45894:36:::1;::::0;45865:13;;-1:-1:-1;;;;;;;;;;;45894:36:0;;;::::1;45759:179:::0;:::o;44857:246::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44943:26:0;::::1;44935:73;;;;-1:-1:-1::0;;;44935:73:0::1;;;;;;;:::i;:::-;45017:9;:31:::0;;-1:-1:-1;;;;;;45017:31:0::1;-1:-1:-1::0;;;;;45017:31:0;::::1;::::0;;::::1;::::0;;;45062:33:::1;::::0;-1:-1:-1;;;;;;;;;;;45062:33:0;-1:-1:-1;;45062:33:0::1;44857:246:::0;:::o;44417:164::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;44520:13:::1;28464:1;44520:2;:13;:::i;:::-;44505:28;::::0;:12;:28:::1;:::i;:::-;44495:9;:38:::0;;;44547:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44547:26:0;;;::::1;44417:164:::0;:::o;45389:246::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;29046:9:::1;45482:30:::0;::::1;;45474:64;;;::::0;-1:-1:-1;;;45474:64:0;;9519:2:1;45474:64:0::1;::::0;::::1;9501:21:1::0;9558:2;9538:18;;;9531:30;-1:-1:-1;;;9577:18:1;;;9570:52;9639:18;;45474:64:0::1;9317:346:1::0;45474:64:0::1;45553:11;:26:::0;;;45599:28:::1;::::0;45565:14;;-1:-1:-1;;;;;;;;;;;45599:28:0;;;::::1;45389:246:::0;:::o;42403:275::-;-1:-1:-1;;;;;42525:24:0;;42490:7;42525:24;;;:8;:24;;;;;;42572:15;42562:25;;42559:71;;-1:-1:-1;42618:1:0;;42403:275;-1:-1:-1;;42403:275:0:o;42559:71::-;42646:24;42655:15;42646:8;:24;:::i;:::-;42639:31;42403:275;-1:-1:-1;;;42403:275:0:o;46500:193::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;46589:38:::1;:14;46608:18:::0;46589::::1;:38::i;9827:238::-:0;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9910:22:0;::::1;9902:73;;;::::0;-1:-1:-1;;;9902:73:0;;7579:2:1;9902:73:0::1;::::0;::::1;7561:21:1::0;7618:2;7598:18;;;7591:30;7657:34;7637:18;;;7630:62;-1:-1:-1;;;7708:18:1;;;7701:36;7754:19;;9902:73:0::1;7377:402:1::0;9902:73:0::1;10012:6;::::0;;9991:38:::1;::::0;-1:-1:-1;;;;;9991:38:0;;::::1;::::0;10012:6;::::1;::::0;9991:38:::1;::::0;::::1;10040:6;:17:::0;;-1:-1:-1;;;;;;10040:17:0::1;-1:-1:-1::0;;;;;10040:17:0;;;::::1;::::0;;;::::1;::::0;;9827:238::o;46006:166::-;9112:10;9101:7;8927;8954:6;-1:-1:-1;;;;;8954:6:0;;8889:79;9101:7;-1:-1:-1;;;;;9101:21:0;;9093:66;;;;-1:-1:-1;;;9093:66:0;;;;;;;:::i;:::-;46085:27:::1;:9;46099:12:::0;24580:152;24650:4;24674:50;24679:3;-1:-1:-1;;;;;24699:23:0;;24674:4;:50::i;54991:299::-;-1:-1:-1;;;;;55084:19:0;;55076:49;;;;-1:-1:-1;;;55076:49:0;;8828:2:1;55076:49:0;;;8810:21:1;8867:2;8847:18;;;8840:30;-1:-1:-1;;;8886:18:1;;;8879:47;8943:18;;55076:49:0;8626:341:1;55076:49:0;-1:-1:-1;;;;;55144:21:0;;55136:49;;;;-1:-1:-1;;;55136:49:0;;10970:2:1;55136:49:0;;;10952:21:1;11009:2;10989:18;;;10982:30;-1:-1:-1;;;11028:18:1;;;11021:45;11083:18;;55136:49:0;10768:339:1;55136:49:0;-1:-1:-1;;;;;55198:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55250:32;;17171:25:1;;;55250:32:0;;17144:18:1;55250:32:0;;;;;;;54991:299;;;:::o;31885:1540::-;-1:-1:-1;;;;;31981:20:0;;31973:51;;;;-1:-1:-1;;;31973:51:0;;6120:2:1;31973:51:0;;;6102:21:1;6159:2;6139:18;;;6132:30;-1:-1:-1;;;6178:18:1;;;6171:48;6236:18;;31973:51:0;5918:342:1;31973:51:0;-1:-1:-1;;;;;32043:23:0;;32035:52;;;;-1:-1:-1;;;32035:52:0;;9174:2:1;32035:52:0;;;9156:21:1;9213:2;9193:18;;;9186:30;-1:-1:-1;;;9232:18:1;;;9225:46;9288:18;;32035:52:0;8972:340:1;32035:52:0;32180:15;32199:26;:9;32218:6;32199:18;:26::i;:::-;:59;;;-1:-1:-1;32229:29:0;:9;32248;32229:18;:29::i;:::-;32180:79;-1:-1:-1;32358:23:0;-1:-1:-1;;;;;32383:21:0;;32399:4;32383:21;;:49;;-1:-1:-1;;;;;;32408:24:0;;32427:4;32408:24;32383:49;32567:16;;32634:21;;32358:75;;-1:-1:-1;;;;;;32567:16:0;;;;32535:23;;32624:31;;;-1:-1:-1;;;32634:21:0;;;;32624:31;:63;;;;;32672:15;-1:-1:-1;;;;;32659:28:0;:9;-1:-1:-1;;;;;32659:28:0;;32624:63;32623:144;;;-1:-1:-1;32716:21:0;;-1:-1:-1;;;;;32703:34:0;;;-1:-1:-1;;;32716:21:0;;;;32703:34;:63;;;;;32751:15;-1:-1:-1;;;;;32741:25:0;:6;-1:-1:-1;;;;;32741:25:0;;32703:63;32889:21;;32595:173;;-1:-1:-1;32870:10:0;;-1:-1:-1;;;;;32881:29:0;;;-1:-1:-1;;;32889:21:0;;;;32881:29;;:57;;;32923:15;-1:-1:-1;;;;;32913:25:0;:6;-1:-1:-1;;;;;32913:25:0;;32881:57;32972:21;;32870:68;;-1:-1:-1;32949:11:0;;-1:-1:-1;;;;;32961:32:0;;;-1:-1:-1;;;32972:21:0;;;;32961:32;;:63;;;33009:15;-1:-1:-1;;;;;32996:28:0;:9;-1:-1:-1;;;;;32996:28:0;;32961:63;32949:75;;33065:18;:41;;;;33087:19;33065:41;:55;;;;33110:10;33065:55;33062:356;;;33136:43;33153:6;33161:9;33172:6;33136:16;:43::i;:::-;33062:356;;;33298:14;;;;;;;33290:49;;;;-1:-1:-1;;;33290:49:0;;12084:2:1;33290:49:0;;;12066:21:1;12123:2;12103:18;;;12096:30;12162:25;12142:18;;;12135:53;12205:18;;33290:49:0;11882:347:1;33290:49:0;33354:52;33369:6;33376:9;33386:6;33393:5;33399:6;33354:14;:52::i;:::-;31962:1463;;;;;;31885:1540;;;:::o;38534:1582::-;38282:27;:34;;-1:-1:-1;;38282:34:0;38312:4;38282:34;;;;;;38636:4:::1;38282:27:::0;38618:24;;;::::1;::::0;;;;;;;;38683:13:::1;::::0;38618:24;;38282:27;38669::::1;::::0;38683:13;;::::1;38282:34:::0;38683:13;;::::1;::::0;38669;;::::1;;:27;:::i;:::-;38653:43;;;;38707:19;38729;;38707:41;;38875:11;38859:15;:27;:40;;;-1:-1:-1::0;38888:11:0::1;::::0;::::1;::::0;38859:40:::1;38856:77;;;38915:7;;;;;38856:77;39053:13;::::0;39014:25:::1;::::0;39040:36:::1;::::0;::::1;::::0;39041:25:::1;::::0;39053:13;;::::1;;;39041:11:::0;:25:::1;:::i;:::-;39040:36;;;;:::i;:::-;39014:62:::0;-1:-1:-1;39087:25:0::1;39114:29;39014:62:::0;39114:11;:29:::1;:::i;:::-;39087:56:::0;-1:-1:-1;39204:16:0::1;39221:19;39239:1;39221:17:::0;:19:::1;:::i;:::-;39204:36:::0;-1:-1:-1;39251:19:0::1;39271:26;39204:36:::0;39271:17;:26:::1;:::i;:::-;39251:46:::0;-1:-1:-1;39380:17:0::1;39398:29;39410:17:::0;39251:46;39398:29:::1;:::i;:::-;39380:47:::0;-1:-1:-1;39506:21:0::1;39538:27;39380:47:::0;39538:16:::1;:27::i;:::-;39576:14;39592:41;39616:17:::0;39592:21:::1;:41;:::i;:::-;39576:58:::0;-1:-1:-1;39734:14:0::1;39772:9:::0;39752:18:::1;39759:11:::0;39576:58;39752:18:::1;:::i;:::-;39751:30;;;;:::i;:::-;39734:47;;39792:31;39806:8;39816:6;39792:13;:31::i;:::-;-1:-1:-1::0;39948:21:0::1;::::0;-1:-1:-1;39971:41:0::1;39995:17:::0;39971:21:::1;:41;:::i;:::-;39948:65;;40095:13;40077:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38327:1:0::1;38339:27:::0;:35;;-1:-1:-1;;38339:35:0;;;38534:1582::o;24908:158::-;24981:4;25005:53;25013:3;-1:-1:-1;;;;;25033:23:0;;25005:7;:53::i;50879:343::-;51035:20;;51021:13;:34;51013:103;;;;-1:-1:-1;;;51013:103:0;;15169:2:1;51013:103:0;;;15151:21:1;15208:2;15188:18;;;15181:30;15247:34;15227:18;;;15220:62;-1:-1:-1;;;15298:18:1;;;15291:45;15353:19;;51013:103:0;14967:411:1;51013:103:0;51127:20;:34;;;51177:37;;51148:13;;-1:-1:-1;;;;;;;;;;;51177:37:0;;;;50879:343;:::o;19635:414::-;19698:4;21961:19;;;:12;;;:19;;;;;;19715:327;;-1:-1:-1;19758:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19941:18;;19919:19;;;:12;;;:19;;;;;;:40;;;;19974:11;;19715:327;-1:-1:-1;20025:5:0;20018:12;;25152:167;-1:-1:-1;;;;;25286:23:0;;25232:4;21961:19;;;:12;;;:19;;;;;;:24;;25256:55;21864:129;36725:400;-1:-1:-1;;;;;36844:17:0;;36820:21;36844:17;;;:9;:17;;;;;;36880:23;;;;36872:60;;;;-1:-1:-1;;;36872:60:0;;6812:2:1;36872:60:0;;;6794:21:1;6851:2;6831:18;;;6824:30;-1:-1:-1;;;6870:18:1;;;6863:54;6934:18;;36872:60:0;6610:348:1;36872:60:0;36968:27;36981:6;36988;36968:12;:27::i;:::-;37028:28;37038:9;37049:6;37028:9;:28::i;:::-;37098:9;-1:-1:-1;;;;;37082:33:0;37091:6;-1:-1:-1;;;;;37082:33:0;-1:-1:-1;;;;;;;;;;;37108:6:0;37082:33;;;;17171:25:1;;17159:2;17144:18;;17025:177;37082:33:0;;;;;;;;36809:316;36725:400;;;:::o;33495:3183::-;-1:-1:-1;;;;;33638:20:0;;;33611:24;33638:20;;;:9;:20;;;;;;;33693:17;;;;;;;;33729:23;;;;33721:60;;;;-1:-1:-1;;;33721:60:0;;6812:2:1;33721:60:0;;;6794:21:1;6851:2;6831:18;;;6824:30;-1:-1:-1;;;6870:18:1;;;6863:54;6934:18;;33721:60:0;6610:348:1;33721:60:0;33794:9;33817:6;33814:1673;;;33904:9;;33896:6;:17;;33888:44;;;;-1:-1:-1;;;33888:44:0;;10219:2:1;33888:44:0;;;10201:21:1;10258:2;10238:18;;;10231:30;-1:-1:-1;;;10277:18:1;;;10270:45;10332:18;;33888:44:0;10017:339:1;33888:44:0;33955:31;:14;33979:6;33955:23;:31::i;:::-;:40;33947:73;;;;-1:-1:-1;;;33947:73:0;;15585:2:1;33947:73:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:50;15703:18;;33947:73:0;15383:344:1;33947:73:0;34077:11;;34058:16;;:30;;;;:::i;:::-;34039:15;:49;;:77;;;;;34092:19;;34115:1;34092:24;34039:77;34035:186;;;34137:26;:14;34156:6;34137:18;:26::i;:::-;-1:-1:-1;34187:18:0;;-1:-1:-1;;;;;34187:18:0;;;;;;;;34035:186;-1:-1:-1;34239:8:0;;;;;;;33814:1673;;;34272:5;34269:1218;;;34417:12;;34392:23;34409:6;34392:16;:23;:::i;:::-;:37;;34384:65;;;;-1:-1:-1;;;34384:65:0;;13562:2:1;34384:65:0;;;13544:21:1;13601:2;13581:18;;;13574:30;-1:-1:-1;;;13620:18:1;;;13613:46;13676:18;;34384:65:0;13360:340:1;34384:65:0;34473:9;;34463:6;:19;;34455:65;;;;-1:-1:-1;;;34455:65:0;;15934:2:1;34455:65:0;;;15916:21:1;15973:2;15953:18;;;15946:30;16012:34;15992:18;;;15985:62;-1:-1:-1;;;16063:18:1;;;16056:32;16105:19;;34455:65:0;15732:398:1;34455:65:0;34543:34;:14;34567:9;34543:23;:34::i;:::-;:43;34535:76;;;;-1:-1:-1;;;34535:76:0;;15585:2:1;34535:76:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:50;15703:18;;34535:76:0;15383:344:1;34535:76:0;34668:11;;34649:16;;:30;;;;:::i;:::-;34630:15;:49;;:77;;;;;34683:19;;34706:1;34683:24;34630:77;34626:192;;;34728:29;:14;34747:9;34728:18;:29::i;:::-;-1:-1:-1;34781:21:0;;-1:-1:-1;;;;;34781:21:0;;;;;;;;34626:192;-1:-1:-1;34836:7:0;;;;34269:1218;;;34987:31;:14;35011:6;34987:23;:31::i;:::-;:40;34979:80;;;;-1:-1:-1;;;34979:80:0;;16337:2:1;34979:80:0;;;16319:21:1;16376:2;16356:18;;;16349:30;16415:29;16395:18;;;16388:57;16462:18;;34979:80:0;16135:351:1;34979:80:0;35082:34;:14;35106:9;35082:23;:34::i;:::-;:43;35074:86;;;;-1:-1:-1;;;35074:86:0;;12858:2:1;35074:86:0;;;12840:21:1;12897:2;12877:18;;;12870:30;12936:32;12916:18;;;12909:60;12986:18;;35074:86:0;12656:354:1;35074:86:0;35208:12;;35183:23;35200:6;35183:16;:23;:::i;:::-;:37;;35175:65;;;;-1:-1:-1;;;35175:65:0;;13562:2:1;35175:65:0;;;13544:21:1;13601:2;13581:18;;;13574:30;-1:-1:-1;;;13620:18:1;;;13613:46;13676:18;;35175:65:0;13360:340:1;35175:65:0;35297:11;;35278:16;;:30;;;;:::i;:::-;35259:15;:49;;:77;;;;;35312:19;;35335:1;35312:24;35259:77;35255:186;;;35357:26;:14;35376:6;35357:18;:26::i;:::-;-1:-1:-1;35407:18:0;;-1:-1:-1;;;;;35407:18:0;;;;;;;;35255:186;-1:-1:-1;35459:12:0;;;;;;;34269:1218;35824:21;;-1:-1:-1;;;;;35816:29:0;;;-1:-1:-1;;;35824:21:0;;;;35816:29;;;;35815:52;;-1:-1:-1;35850:16:0;;;;35849:17;35815:52;:84;;;;-1:-1:-1;35871:27:0;;;;35870:28;35815:84;:92;;;;;35901:6;35815:92;35812:130;;;35922:20;:18;:20::i;:::-;36011:23;36035:36;36049:6;36057:3;36062:8;;;;;;;;;;;36035:13;:36::i;:::-;36145:13;;36011:60;;-1:-1:-1;36082:21:0;;36104:55;;36118:6;;36126:3;;36131:27;;36145:13;;;;;;;36131;;;;:27;:::i;:::-;36104:13;:55::i;:::-;36082:77;-1:-1:-1;36223:19:0;36251:31;36082:77;36251:15;:31;:::i;:::-;36243:40;;:6;:40;:::i;:::-;36223:60;;36321:27;36334:6;36341;36321:12;:27::i;:::-;36443:4;36425:24;;;;:9;:24;;;;;:41;;36453:13;;36425:24;:41;;36453:13;;36425:41;:::i;:::-;;;;;;;;36521:15;36501:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36571:33:0;;-1:-1:-1;36581:9:0;36592:11;36571:9;:33::i;:::-;36646:9;-1:-1:-1;;;;;36630:38:0;36639:6;-1:-1:-1;;;;;36630:38:0;-1:-1:-1;;;;;;;;;;;36656:11:0;36630:38;;;;17171:25:1;;17159:2;17144:18;;17025:177;36630:38:0;;;;;;;;33600:3078;;;;;;33495:3183;;;;;:::o;40166:461::-;40259:16;;40227:58;;40244:4;;-1:-1:-1;;;;;40259:16:0;40278:6;40227:8;:58::i;:::-;40320:16;;;40334:1;40320:16;;;;;;;;40296:21;;40320:16;;;;;;;;;;-1:-1:-1;40320:16:0;40296:40;;40365:4;40347;40352:1;40347:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40347:23:0;;;:7;;;;;;;;;;:23;;;;40391:16;;:23;;;-1:-1:-1;;;40391:23:0;;;;:16;;;;;:21;;:23;;;;;40347:7;;40391:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40381:4;40386:1;40381:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40381:33:0;;;:7;;;;;;;;;:33;40427:16;;:192;;-1:-1:-1;;;40427:192:0;;:16;;;:67;;:192;;40509:6;;40427:16;;40546:4;;40573;;40593:15;;40427:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40216:411;40166:461;:::o;40754:686::-;40834:19;40855:21;40901:9;40889:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40921:14:0;;-1:-1:-1;40955:3:0;40939:12;:9;40949:2;40939:12;:::i;:::-;40938:20;;;;:::i;:::-;40921:37;-1:-1:-1;40969:17:0;41008:3;40990:14;:11;41002:2;40990:14;:::i;:::-;40989:22;;;;:::i;:::-;41054:16;;40969:42;;-1:-1:-1;41022:63:0;;41039:4;;-1:-1:-1;;;;;41054:16:0;41073:11;41022:8;:63::i;:::-;41096:16;;:218;;-1:-1:-1;;;41096:218:0;;-1:-1:-1;;;;;41096:16:0;;;;:32;;41136:9;;41096:218;;41169:4;;41189:11;;41215:9;;41239:6;;41169:4;;41288:15;;41096:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41339:11:0;;41377:9;;-1:-1:-1;;;;;;40754:686:0:o;20225:1553::-;20291:4;20430:19;;;:12;;;:19;;;;;;20466:15;;20462:1309;;20828:21;20852:14;20865:1;20852:10;:14;:::i;:::-;20901:18;;20828:38;;-1:-1:-1;20881:17:0;;20901:22;;20922:1;;20901:22;:::i;:::-;20881:42;;21168:17;21188:3;:11;;21200:9;21188:22;;;;;;;;:::i;:::-;;;;;;;;;21168:42;;21334:9;21305:3;:11;;21317:13;21305:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21411:23;;;:12;;;:23;;;;;;:36;;;21572:17;;21411:3;;21572:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21667:3;:12;;:19;21680:5;21667:19;;;;;;;;;;;21660:26;;;21710:4;21703:11;;;;;;;;20462:1309;21754:5;21747:12;;;;;37725:228;-1:-1:-1;;;;;37860:15:0;;37842:17;37860:15;;;:9;:15;;;;;;:22;;37876:6;;37860:22;:::i;:::-;-1:-1:-1;;;;;37920:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37725:228:0:o;37461:225::-;-1:-1:-1;;;;;37593:15:0;;37575:17;37593:15;;;:9;:15;;;;;;:22;;37609:6;;37593:22;:::i;37180:156::-;37270:7;37323:5;37309:10;37298:21;;37305:3;37298:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37297:31;;;;:::i;:::-;37290:38;37180:156;-1:-1:-1;;;;37180:156:0:o;14::1:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:247::-;234:6;287:2;275:9;266:7;262:23;258:32;255:52;;;303:1;300;293:12;255:52;342:9;329:23;361:31;386:5;361:31;:::i;427:251::-;497:6;550:2;538:9;529:7;525:23;521:32;518:52;;;566:1;563;556:12;518:52;598:9;592:16;617:31;642:5;617:31;:::i;683:388::-;751:6;759;812:2;800:9;791:7;787:23;783:32;780:52;;;828:1;825;818:12;780:52;867:9;854:23;886:31;911:5;886:31;:::i;:::-;936:5;-1:-1:-1;993:2:1;978:18;;965:32;1006:33;965:32;1006:33;:::i;:::-;1058:7;1048:17;;;683:388;;;;;:::o;1076:456::-;1153:6;1161;1169;1222:2;1210:9;1201:7;1197:23;1193:32;1190:52;;;1238:1;1235;1228:12;1190:52;1277:9;1264:23;1296:31;1321:5;1296:31;:::i;:::-;1346:5;-1:-1:-1;1403:2:1;1388:18;;1375:32;1416:33;1375:32;1416:33;:::i;:::-;1076:456;;1468:7;;-1:-1:-1;;;1522:2:1;1507:18;;;;1494:32;;1076:456::o;1537:315::-;1605:6;1613;1666:2;1654:9;1645:7;1641:23;1637:32;1634:52;;;1682:1;1679;1672:12;1634:52;1721:9;1708:23;1740:31;1765:5;1740:31;:::i;:::-;1790:5;1842:2;1827:18;;;;1814:32;;-1:-1:-1;;;1537:315:1:o;1857:241::-;1913:6;1966:2;1954:9;1945:7;1941:23;1937:32;1934:52;;;1982:1;1979;1972:12;1934:52;2021:9;2008:23;2040:28;2062:5;2040:28;:::i;2103:245::-;2170:6;2223:2;2211:9;2202:7;2198:23;2194:32;2191:52;;;2239:1;2236;2229:12;2191:52;2271:9;2265:16;2290:28;2312:5;2290:28;:::i;2353:180::-;2412:6;2465:2;2453:9;2444:7;2440:23;2436:32;2433:52;;;2481:1;2478;2471:12;2433:52;-1:-1:-1;2504:23:1;;2353:180;-1:-1:-1;2353:180:1:o;2538:184::-;2608:6;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;-1:-1:-1;2700:16:1;;2538:184;-1:-1:-1;2538:184:1:o;2727:248::-;2795:6;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;-1:-1:-1;;2895:23:1;;;2965:2;2950:18;;;2937:32;;-1:-1:-1;2727:248:1:o;2980:306::-;3068:6;3076;3084;3137:2;3125:9;3116:7;3112:23;3108:32;3105:52;;;3153:1;3150;3143:12;3105:52;3182:9;3176:16;3166:26;;3232:2;3221:9;3217:18;3211:25;3201:35;;3276:2;3265:9;3261:18;3255:25;3245:35;;2980:306;;;;;:::o;3291:535::-;3383:6;3391;3399;3407;3415;3423;3476:3;3464:9;3455:7;3451:23;3447:33;3444:53;;;3493:1;3490;3483:12;3444:53;3516:27;3533:9;3516:27;:::i;:::-;3506:37;;3562:36;3594:2;3583:9;3579:18;3562:36;:::i;:::-;3552:46;;3617:36;3649:2;3638:9;3634:18;3617:36;:::i;:::-;3607:46;;3672:36;3704:2;3693:9;3689:18;3672:36;:::i;:::-;3662:46;;3727:37;3759:3;3748:9;3744:19;3727:37;:::i;:::-;3717:47;;3783:37;3815:3;3804:9;3800:19;3783:37;:::i;:::-;3773:47;;3291:535;;;;;;;;:::o;4528:591::-;-1:-1:-1;;;;;4871:15:1;;;4853:34;;4918:2;4903:18;;4896:34;;;;4961:2;4946:18;;4939:34;;;;5004:2;4989:18;;4982:34;;;;5053:15;;;5047:3;5032:19;;5025:44;4833:3;5085:19;;5078:35;;;;4802:3;4787:19;;4528:591::o;5316:597::-;5428:4;5457:2;5486;5475:9;5468:21;5518:6;5512:13;5561:6;5556:2;5545:9;5541:18;5534:34;5586:1;5596:140;5610:6;5607:1;5604:13;5596:140;;;5705:14;;;5701:23;;5695:30;5671:17;;;5690:2;5667:26;5660:66;5625:10;;5596:140;;;5754:6;5751:1;5748:13;5745:91;;;5824:1;5819:2;5810:6;5799:9;5795:22;5791:31;5784:42;5745:91;-1:-1:-1;5897:2:1;5876:15;-1:-1:-1;;5872:29:1;5857:45;;;;5904:2;5853:54;;5316:597;-1:-1:-1;;;5316:597:1:o;6265:340::-;6467:2;6449:21;;;6506:2;6486:18;;;6479:30;-1:-1:-1;;;6540:2:1;6525:18;;6518:46;6596:2;6581:18;;6265:340::o;11521:356::-;11723:2;11705:21;;;11742:18;;;11735:30;11801:34;11796:2;11781:18;;11774:62;11868:2;11853:18;;11521:356::o;14611:351::-;14813:2;14795:21;;;14852:2;14832:18;;;14825:30;14891:29;14886:2;14871:18;;14864:57;14953:2;14938:18;;14611:351::o;17207:980::-;17469:4;17517:3;17506:9;17502:19;17548:6;17537:9;17530:25;17574:2;17612:6;17607:2;17596:9;17592:18;17585:34;17655:3;17650:2;17639:9;17635:18;17628:31;17679:6;17714;17708:13;17745:6;17737;17730:22;17783:3;17772:9;17768:19;17761:26;;17822:2;17814:6;17810:15;17796:29;;17843:1;17853:195;17867:6;17864:1;17861:13;17853:195;;;17932:13;;-1:-1:-1;;;;;17928:39:1;17916:52;;18023:15;;;;17988:12;;;;17964:1;17882:9;17853:195;;;-1:-1:-1;;;;;;;18104:32:1;;;;18099:2;18084:18;;18077:60;-1:-1:-1;;;18168:3:1;18153:19;18146:35;18065:3;17207:980;-1:-1:-1;;;17207:980:1:o;19174:128::-;19214:3;19245:1;19241:6;19238:1;19235:13;19232:39;;;19251:18;;:::i;:::-;-1:-1:-1;19287:9:1;;19174:128::o;19307:204::-;19345:3;19381:4;19378:1;19374:12;19413:4;19410:1;19406:12;19448:3;19442:4;19438:14;19433:3;19430:23;19427:49;;;19456:18;;:::i;:::-;19492:13;;19307:204;-1:-1:-1;;;19307:204:1:o;19516:217::-;19556:1;19582;19572:132;;19626:10;19621:3;19617:20;19614:1;19607:31;19661:4;19658:1;19651:15;19689:4;19686:1;19679:15;19572:132;-1:-1:-1;19718:9:1;;19516:217::o;19738:422::-;19827:1;19870:5;19827:1;19884:270;19905:7;19895:8;19892:21;19884:270;;;19964:4;19960:1;19956:6;19952:17;19946:4;19943:27;19940:53;;;19973:18;;:::i;:::-;20023:7;20013:8;20009:22;20006:55;;;20043:16;;;;20006:55;20122:22;;;;20082:15;;;;19884:270;;;19888:3;19738:422;;;;;:::o;20165:140::-;20223:5;20252:47;20293:4;20283:8;20279:19;20273:4;20359:5;20389:8;20379:80;;-1:-1:-1;20430:1:1;20444:5;;20379:80;20478:4;20468:76;;-1:-1:-1;20515:1:1;20529:5;;20468:76;20560:4;20578:1;20573:59;;;;20646:1;20641:130;;;;20553:218;;20573:59;20603:1;20594:10;;20617:5;;;20641:130;20678:3;20668:8;20665:17;20662:43;;;20685:18;;:::i;:::-;-1:-1:-1;;20741:1:1;20727:16;;20756:5;;20553:218;;20855:2;20845:8;20842:16;20836:3;20830:4;20827:13;20823:36;20817:2;20807:8;20804:16;20799:2;20793:4;20790:12;20786:35;20783:77;20780:159;;;-1:-1:-1;20892:19:1;;;20924:5;;20780:159;20971:34;20996:8;20990:4;20971:34;:::i;:::-;21041:6;21037:1;21033:6;21029:19;21020:7;21017:32;21014:58;;;21052:18;;:::i;:::-;21090:20;;20310:806;-1:-1:-1;;;20310:806:1:o;21121:168::-;21161:7;21227:1;21223;21219:6;21215:14;21212:1;21209:21;21204:1;21197:9;21190:17;21186:45;21183:71;;;21234:18;;:::i;:::-;-1:-1:-1;21274:9:1;;21121:168::o;21294:125::-;21334:4;21362:1;21359;21356:8;21353:34;;;21367:18;;:::i;:::-;-1:-1:-1;21404:9:1;;21294:125::o;21424:127::-;21485:10;21480:3;21476:20;21473:1;21466:31;21516:4;21513:1;21506:15;21540:4;21537:1;21530:15;21556:127;21617:10;21612:3;21608:20;21605:1;21598:31;21648:4;21645:1;21638:15;21672:4;21669:1;21662:15;21688:127;21749:10;21744:3;21740:20;21737:1;21730:31;21780:4;21777:1;21770:15;21804:4;21801:1;21794:15;21952:131;-1:-1:-1;;;;;22027:31:1;;22017:42;;22007:70;;22073:1;22070;22063:12;22088:118;22174:5;22167:13;22160:21;22153:5;22150:32;22140:60;;22196:1;22193;22186:12

Swarm Source

ipfs://2bfad25e055ba6083cde7b06ad4c78b76eb3a9f368ba549ddad7e21501d5c5ba

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.