ETH Price: $2,529.65 (-0.12%)

Token

Firebot (FIREBOT)
 

Overview

Max Total Supply

942,000.639248625593538935 FIREBOT

Holders

209

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 FIREBOT

Value
$0.00
0x21fd08a5dd27ae6c1f4550f7c1114ace78a837bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
UltimateToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-24
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

pragma solidity 0.8.18;


interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}

interface IFee {
    function payFee(
        uint256 _tokenType
    ) external payable;
}
contract UltimateToken is IERC20, Ownable {
    using SafeERC20 for IERC20;
    IUniswapV2Caller public constant uniswapV2Caller =
        IUniswapV2Caller(0x1CcFE8c40eF259566433716002E379dFfFbf5a3e);
    IFee public constant feeContract = IFee(0xfd6439AEfF9d2389856B7486b9e74a6DacaDcDCe);
    address public baseTokenForPair;
    uint8 private _decimals;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    string private _name;
    string private _symbol;

    uint256 private _rewardFee;
    uint256 private _previousRewardFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _treasuryFee;
    uint256 private _previousTreasuryFee;

    uint256 private _burnFee;
    uint256 private _previousBurnFee;

    bool private inSwapAndLiquify;
    uint16 public sellRewardFee;
    uint16 public buyRewardFee;
    uint16 public sellLiquidityFee;
    uint16 public buyLiquidityFee;

    uint16 public sellMarketingFee;
    uint16 public buyMarketingFee;

    uint16 public sellTreasuryFee;
    uint16 public buyTreasuryFee;

    uint16 public sellBurnFee;
    uint16 public buyBurnFee;

    address public marketingWallet;
    bool public isMarketingFeeBaseToken;
    address public treasuryWallet;



    uint256 public minAmountToTakeFee;
    uint256 public maxWallet;
    uint256 public maxTransactionAmount;


    IUniswapV2Router02 public mainRouter;
    address public mainPair;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;
    uint256 private _treasuryFeeTokens;

    event UpdateLiquidityFee(
        uint16 newSellLiquidityFee,
        uint16 newBuyLiquidityFee,
        uint16 oldSellLiquidityFee,
        uint16 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint16 newSellMarketingFee,
        uint16 newBuyMarketingFee,
        uint16 oldSellMarketingFee,
        uint16 oldBuyMarketingFee
    );
    event UpdateTreasuryFee(
        uint16 newSellTreasuryFee,
        uint16 newBuyTreasuryFee,
        uint16 oldSellTreasuryFee,
        uint16 oldBuyTreasuryFee
    );
    event UpdateBurnFee(
        uint16 newSellBurnFee,
        uint16 newBuyBurnFee,
        uint16 oldSellBurnFee,
        uint16 oldBuyBurnFee
    );
    event UpdateRewardFee(
        uint16 newSellRewardFee,
        uint16 newBuyRewardFee,
        uint16 oldSellRewardFee,
        uint16 oldBuyRewardFee
    );  
    event UpdateMarketingWallet(
        address indexed newMarketingWallet,
        bool newIsMarketingFeeBaseToken,
        address indexed oldMarketingWallet,
        bool oldIsMarketingFeeBaseToken
    );
    event UpdateTreasuryWallet(
        address indexed newTreasuryWallet,
        address indexed oldTreasuryWallet
    );

    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludedFromFee(address indexed account, bool isEx);
    event SwapAndLiquify(uint256 tokensForLiquidity, uint256 baseTokenForLiquidity);
    event MarketingFeeTaken(
        uint256 marketingFeeTokens,
        uint256 marketingFeeBaseTokenSwapped
    );
    event TreasuryFeeTaken(
        uint256 amount
    );
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldRouter);
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    constructor(
        string memory __name,
        string memory __symbol,
        uint8 __decimals,
        uint256 _totalSupply,
        uint256 _maxWallet,
        uint256 _maxTransactionAmount,
        address[4] memory _accounts,
        bool _isMarketingFeeBaseToken,
        uint16[10] memory _fees
    ) {
        baseTokenForPair=_accounts[2];
        _decimals = __decimals;
        _name = __name;
        _symbol = __symbol;
        _tTotal = _totalSupply ;
        _rTotal = (MAX - (MAX % _tTotal));
        _rOwned[_msgSender()] = _rTotal;
        _tOwned[_msgSender()] = _tTotal;
        require(_accounts[0] != address(0), "marketing wallet can not be 0");
        require(_accounts[1] != address(0), "Router address can not be 0");
        require(_accounts[3] != address(0), "Treasury wallet can not be 0");
        require(_accounts[3] != _accounts[0], "Treasury wallet can not be same with marketing wallet");
        require(_fees[0]+(_fees[2])+(_fees[4]) + _fees[6] + _fees[8] <= 300, "sell total fee <= 30%");
        require(_fees[1]+(_fees[3])+(_fees[5]) + _fees[7] + _fees[9] <= 300, "buy total fee <= 30%");
        require(_fees[0] < 150, "each fee < 15%");
        require(_fees[1] < 150, "each fee < 15%");
        require(_fees[2] < 150, "each fee < 15%");
        require(_fees[3] < 150, "each fee < 15%");
        require(_fees[4] < 150, "each fee < 15%");
        require(_fees[5] < 150, "each fee < 15%");
        require(_fees[6] < 150, "each fee < 15%");
        require(_fees[7] < 150, "each fee < 15%");
        require(_fees[8] < 150, "each fee < 15%");
        require(_fees[9] < 150, "each fee < 15%");
        marketingWallet = _accounts[0];
        treasuryWallet = _accounts[3];
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        emit UpdateMarketingWallet(
            marketingWallet,
            isMarketingFeeBaseToken,
            address(0),
            false
        );
        emit UpdateTreasuryWallet(
            treasuryWallet,
            address(0)
        );
        mainRouter = IUniswapV2Router02(_accounts[1]);
        if(baseTokenForPair != mainRouter.WETH()){            
            IERC20(baseTokenForPair).approve(address(mainRouter), MAX);            
        }
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), address(mainRouter), MAX);
        emit UpdateUniswapV2Router(address(mainRouter), address(0));
        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForPair
        );
        
        sellLiquidityFee = _fees[0];
        buyLiquidityFee = _fees[1];
        emit UpdateLiquidityFee(
            sellLiquidityFee,
            buyLiquidityFee,
            0,
            0
        );
        sellMarketingFee = _fees[2];
        buyMarketingFee = _fees[3];
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        sellTreasuryFee = _fees[6];
        buyTreasuryFee = _fees[7];
        emit UpdateTreasuryFee(
            sellTreasuryFee,
            buyTreasuryFee,
            0,
            0
        );
        sellBurnFee = _fees[8];
        buyBurnFee = _fees[9];
        emit UpdateBurnFee(
            sellBurnFee,
            buyBurnFee,
            0,
            0
        );
        sellRewardFee = _fees[4];
        buyRewardFee = _fees[5];
        emit UpdateRewardFee(
            sellRewardFee,
            buyRewardFee,
            0,
            0
        );
        minAmountToTakeFee = _totalSupply/(10000);
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);
        require(_maxTransactionAmount>=_totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");
        require(_maxWallet>=_totalSupply / 10000, "maxWallet >= total supply / 10000");
        maxWallet=_maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=_maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        _isExcluded[address(0xdead)] = true;
        _excluded.push(address(0xdead));
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[treasuryWallet] = true;
        _excluded.push(treasuryWallet);

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingWallet] = true;
        isExcludedFromFee[treasuryWallet] = true;
        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;
        isExcludedFromMaxTransactionAmount[treasuryWallet]=true;
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;
        _setAutomatedMarketMakerPair(mainPair, true);
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    function updateUniswapV2Pair(address _baseTokenForPair) external onlyOwner
    {
        require(
            _baseTokenForPair != baseTokenForPair,
            "The baseTokenForPair already has that address"
        );
        baseTokenForPair=_baseTokenForPair;
        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForPair
        );
        if(baseTokenForPair != mainRouter.WETH()){
            IERC20(baseTokenForPair).approve(address(mainRouter), MAX);            
        }
        _setAutomatedMarketMakerPair(mainPair, true);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(mainRouter),
            "The router already has that address"
        );
        emit UpdateUniswapV2Router(newAddress, address(mainRouter));
        mainRouter = IUniswapV2Router02(newAddress);
        _approve(address(this), address(mainRouter), MAX);
        if(baseTokenForPair != mainRouter.WETH()){
            IERC20(baseTokenForPair).approve(address(mainRouter), MAX);            
        }   
        address _mainPair = IUniswapV2Factory(mainRouter.factory())
            .createPair(address(this), baseTokenForPair);
        mainPair = _mainPair;
        _setAutomatedMarketMakerPair(mainPair, true);
    }
  
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        (           
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tMarketing,
            uint256 tTreasury,
            uint256 tBurn
        ) = _getTValues(amount);
        uint256 currentRate = _getRate();
        {
            //burn
            _tTotal = _tTotal - tBurn;
            _rTotal = _rTotal - tBurn*currentRate;
            emit Transfer(sender, address(0), tBurn);
        }
        {
            //marketing & liquidity & treasury burn fee collected in the token contract
            _liquidityFeeTokens = _liquidityFeeTokens+tLiquidity;
            _marketingFeeTokens = _marketingFeeTokens+tMarketing;
            _treasuryFeeTokens = _treasuryFeeTokens+tTreasury;
            uint256 tTotalFee = tLiquidity+tMarketing+tTreasury;
            _rOwned[address(this)] = _rOwned[address(this)]+tTotalFee * currentRate;
            if (_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)]+tTotalFee;
        }
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        }
        _reflectFee(tFee*currentRate, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=_tTotal / 10000, "maxWallet >= total supply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=_tTotal / 10000, "maxTransactionAmount >= total supply / 10000");  
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }   
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal-(rFee);
        _tFeeTotal = _tFeeTotal+(tFee);
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateRewardFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTreasury = calculateTreasuryFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        uint256 tTransferAmount = calculateTransferAmount(tAmount);
        return (tTransferAmount, tFee, tLiquidity, tMarketing, tTreasury, tBurn);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply/(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply-(_rOwned[_excluded[i]]);
            tSupply = tSupply-(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal/(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function removeAllFee() private {
        _previousRewardFee = _rewardFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousTreasuryFee = _treasuryFee;
        _previousBurnFee = _burnFee;

        _burnFee = 0;
        _treasuryFee = 0;
        _marketingFee = 0;
        _rewardFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _burnFee = _previousBurnFee;
        _treasuryFee = _previousTreasuryFee;
        _rewardFee = _previousRewardFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
    }

    function calculateRewardFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(_rewardFee)/(10**3);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(_liquidityFee)/(10**3);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(_marketingFee)/(10**3);
    }

    function calculateTreasuryFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(_treasuryFee)/(10**3);
    }

    function calculateBurnFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(_burnFee)/(10**3);
    }
    function calculateTransferAmount(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*(1000 - _burnFee - _treasuryFee - _rewardFee - _liquidityFee - _marketingFee)/(10**3);
    }

    /////////////////////////////////////////////////////////////////////////////////
    function name() external view returns (string memory) {
        return _name;
    }

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), 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)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()]-amount
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender]-(
                subtractedValue
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcluded[account];
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        uint256 currentRate = _getRate();
        if (!deductTransferFee) {            
            uint256 rAmount = tAmount*currentRate;
            return rAmount;
        } else {
            (           
                uint256 tTransferAmount,
                ,
                ,
                ,
                ,               
            ) = _getTValues(tAmount);
            uint256 rTransferAmount = tTransferAmount * currentRate;
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount/(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        require(
            _excluded.length + 1 <= 50,
            "Cannot exclude more than 50 accounts.  Include a previously excluded address."
        );
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                uint256 prev_rOwned=_rOwned[account];
                _rOwned[account]=_tOwned[account]*_getRate();
                _rTotal=_rTotal-prev_rOwned+_rOwned[account];
                _isExcluded[account] = false;
                _excluded[i] = _excluded[_excluded.length - 1];
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    function updateLiquidityFee(
        uint16 _sellLiquidityFee,
        uint16 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee+(sellMarketingFee)+(sellRewardFee) + sellTreasuryFee + sellBurnFee <= 300,
            "sell total fee <= 30%"
        );
        require(
            _buyLiquidityFee+(buyMarketingFee)+(buyRewardFee) + buyTreasuryFee + buyBurnFee <= 300,
            "buy total fee <= 30%"
        );
        require(_sellLiquidityFee<= 150, "sell fee <= 15%");
        require(_buyLiquidityFee<= 150, "buy fee <= 15%");
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;        
    }

    function updateMarketingFee(
        uint16 _sellMarketingFee,
        uint16 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee+(sellLiquidityFee)+(sellRewardFee) + sellTreasuryFee + sellBurnFee <= 300,
            "sell total fee <= 30%"
        );
        require(
            _buyMarketingFee+(buyLiquidityFee)+(buyRewardFee) + buyTreasuryFee + buyBurnFee <= 300,
            "buy total fee <= 30%"
        );
        require(_sellMarketingFee<= 150, "sell fee <= 15%");
        require(_buyMarketingFee<= 150, "buy fee <= 15%");
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;        
    }

    function updateRewardFee(
        uint16 _sellRewardFee,
        uint16 _buyRewardFee
    ) external onlyOwner {
        require(
            _sellRewardFee+(sellLiquidityFee)+(sellMarketingFee) + sellTreasuryFee + sellBurnFee <= 300,
            "sell total fee <= 30%"
        );
        require(
            _buyRewardFee+(buyLiquidityFee)+(buyMarketingFee) + buyTreasuryFee + buyBurnFee <= 300,
            "buy total fee <= 30%"
        );
        require(_sellRewardFee<= 150, "sell fee <= 15%");
        require(_buyRewardFee<= 150, "buy fee <= 15%");
        emit UpdateRewardFee(
            _sellRewardFee, 
            _buyRewardFee,
            sellRewardFee, 
            buyRewardFee
        );
        sellRewardFee = _sellRewardFee;
        buyRewardFee = _buyRewardFee;        
    }

    function updateTreasuryFee(
        uint16 _sellTreasuryFee,
        uint16 _buyTreasuryFee
    ) external onlyOwner {
        require(
            _sellTreasuryFee+(sellLiquidityFee)+(sellMarketingFee) + sellRewardFee + sellBurnFee <= 300,
            "sell total fee <= 30%"
        );
        require(
            _buyTreasuryFee+(buyLiquidityFee)+(buyMarketingFee) + buyRewardFee + buyBurnFee <= 300,
            "buy total fee <= 30%"
        );
        require(_sellTreasuryFee<= 150, "sell fee <= 15%");
        require(_buyTreasuryFee<= 150, "buy fee <= 15%");
        emit UpdateTreasuryFee(
            _sellTreasuryFee, 
            _buyTreasuryFee,
            sellTreasuryFee, 
            buyTreasuryFee
        );
        sellTreasuryFee = _sellTreasuryFee;
        buyTreasuryFee = _buyTreasuryFee;        
    }

    function updateBurnFee(
        uint16 _sellBurnFee,
        uint16 _buyBurnFee
    ) external onlyOwner {
        require(
            _sellBurnFee+(sellLiquidityFee)+(sellMarketingFee) + sellTreasuryFee + sellRewardFee <= 300,
            "sell total fee <= 30%"
        );
        require(
            _buyBurnFee+(buyLiquidityFee)+(buyMarketingFee) + buyTreasuryFee + buyRewardFee <= 300,
            "buy total fee <= 30%"
        );
        require(_sellBurnFee<= 150, "sell fee <= 15%");
        require(_buyBurnFee<= 150, "buy fee <= 15%");
        emit UpdateBurnFee(
            _sellBurnFee, 
            _buyBurnFee,
            sellBurnFee, 
            buyBurnFee
        );
        sellBurnFee = _sellBurnFee;
        buyBurnFee = _buyBurnFee;        
    }

    function updateMarketingWallet(
        address _marketingWallet,
        bool _isMarketingFeeBaseToken
    ) external onlyOwner {
        require(_marketingWallet != address(0), "marketing wallet can't be 0");
        require(_marketingWallet != treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,
            marketingWallet, isMarketingFeeBaseToken);
        marketingWallet = _marketingWallet;
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        isExcludedFromFee[_marketingWallet] = true;    
        isExcludedFromMaxTransactionAmount[_marketingWallet]=true;    
    }

    function updateTreasuryWallet(
        address _treasuryWallet
    ) external onlyOwner {
        require(_treasuryWallet != address(0), "Treasury wallet can't be 0");
        require(_treasuryWallet != address(this), "Treasury wallet can't be the same as token");
        require(marketingWallet != _treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateTreasuryWallet(_treasuryWallet,
            treasuryWallet);
        treasuryWallet = _treasuryWallet;
        isExcludedFromFee[_treasuryWallet] = true;    
        isExcludedFromMaxTransactionAmount[_treasuryWallet]=true;           
    }

    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)
        external
        onlyOwner
    {
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);
        minAmountToTakeFee = _minAmountToTakeFee;        
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) excludeFromReward(pair);
        else includeInReward(pair);
        isExcludedFromMaxTransactionAmount[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFee(address account, bool isEx) external onlyOwner {
        require(isExcludedFromFee[account] != isEx, "already");
        isExcludedFromFee[account] = isEx;
        emit ExcludedFromFee(account, isEx);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");        
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minAmountToTakeFee;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            balanceOf(mainPair) > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }
        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _rewardFee = buyRewardFee;
                _liquidityFee = buyLiquidityFee;
                _marketingFee = buyMarketingFee;
                _treasuryFee = buyTreasuryFee;
                _burnFee = buyBurnFee;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _rewardFee = sellRewardFee;
                _liquidityFee = sellLiquidityFee;
                _marketingFee = sellMarketingFee;
                _treasuryFee = sellTreasuryFee;
                _burnFee = sellBurnFee;
            }
        }
        _tokenTransfer(from, to, amount);
        restoreAllFee();
        if (!inSwapAndLiquify) {
            if (!isExcludedFromMaxTransactionAmount[from]) {
                require(
                    amount < maxTransactionAmount,
                    "ERC20: exceeds transfer limit"
                );
            }
            if (!isExcludedFromMaxTransactionAmount[to]) {
                require(
                    balanceOf(to) < maxWallet,
                    "ERC20: exceeds max wallet limit"
                );
            }
        }
    }

    function takeFee() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens + _treasuryFeeTokens;
        if (totalTokensTaken == 0 || contractBalance < totalTokensTaken) {
            return;
        }

        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = _liquidityFeeTokens / 2;
        uint256 initialBaseTokenBalance = baseTokenForPair==mainRouter.WETH() ? address(this).balance
            : IERC20(baseTokenForPair).balanceOf(address(this));
        uint256 baseTokenForLiquidity;
        uint256 baseTokenForTreasury;
        if (isMarketingFeeBaseToken) {
            uint256 tokensForSwap=tokensForLiquidity+_marketingFeeTokens + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForPair==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForPair).balanceOf(address(this))-initialBaseTokenBalance;
            uint256 baseTokenForMarketing = baseTokenBalance*_marketingFeeTokens/tokensForSwap;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForMarketing - baseTokenForLiquidity;
            if(baseTokenForMarketing>0){
                if(baseTokenForPair==mainRouter.WETH()){
                    (bool success, )=address(marketingWallet).call{value: baseTokenForMarketing}("");
                    if(success){                       
                        emit MarketingFeeTaken(0, baseTokenForMarketing);
                    }
                }else{
                    IERC20(baseTokenForPair).safeTransfer(marketingWallet, baseTokenForMarketing);
                    emit MarketingFeeTaken(0, baseTokenForMarketing);
                }       
            }            
        } else {
            uint256 tokensForSwap=tokensForLiquidity + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForPair==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForPair).balanceOf(address(this))-initialBaseTokenBalance;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForLiquidity;
            
            if(_marketingFeeTokens>0){
                _transfer(address(this), marketingWallet, _marketingFeeTokens);
                emit MarketingFeeTaken(_marketingFeeTokens, 0);
            }            
        }

        if (tokensForLiquidity > 0 && baseTokenForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, baseTokenForLiquidity);
            emit SwapAndLiquify(tokensForLiquidity, baseTokenForLiquidity);
        }
        if(baseTokenForTreasury>0){
            if(baseTokenForPair==mainRouter.WETH()){
                (bool success, )=address(treasuryWallet).call{value: baseTokenForTreasury}("");
                if(success){                    
                    emit TreasuryFeeTaken(baseTokenForTreasury);
                }
            }else{
                IERC20(baseTokenForPair).safeTransfer(treasuryWallet, baseTokenForTreasury);
                emit TreasuryFeeTaken(baseTokenForTreasury);
            }       
        }
        _marketingFeeTokens = 0;
        _treasuryFeeTokens = 0;
        _liquidityFeeTokens = 0;
        if(owner()!=address(0))
            _transfer(address(this), owner(), balanceOf(address(this)));  
        else
            _transfer(address(this), treasuryWallet, balanceOf(address(this)));  
    }
    
    function swapTokensForBaseToken(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = baseTokenForPair;
        if (path[1] == mainRouter.WETH()){
            mainRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                address(this),
                block.timestamp
            );
        }else{
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    address(mainRouter),
                    tokenAmount,
                    0, // accept any amount of BaseToken
                    path,
                    block.timestamp
                );
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private {        
        if (baseTokenForPair == mainRouter.WETH()) 
            mainRouter.addLiquidityETH{value: baseTokenAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                address(0xdead),
                block.timestamp
            );
        else{
            mainRouter.addLiquidity(
                address(this),
                baseTokenForPair,
                tokenAmount,
                baseTokenAmount,
                0,
                0,
                address(0xdead),
                block.timestamp
            );
        }            
    }

    function treasuryBurn() payable external{
        address[] memory path = new address[](2);
        path[0] = baseTokenForPair;
        path[1] = address(this);
        
        if (path[0] == mainRouter.WETH()){
            mainRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:msg.value}(
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }else{
            uint256 amount = IERC20(baseTokenForPair).balanceOf(_msgSender());
            IERC20(baseTokenForPair).safeTransferFrom(_msgSender(), address(this), amount);
            mainRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                amount,
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }      
        {
            //burn
            if(_isExcluded[treasuryWallet]){
                _tTotal = _tTotal - _tOwned[treasuryWallet];
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                emit Transfer(treasuryWallet, address(0), _tOwned[treasuryWallet]);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;      
            }else{
                uint256 _tBurn = tokenFromReflection(_rOwned[treasuryWallet]);
                _tTotal = _tTotal - _tBurn;
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                emit Transfer(treasuryWallet, address(0), _tBurn);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;  
            }        
        }
    }
    function withdrawETH() external onlyOwner {
        (bool success, )=address(owner()).call{value: address(this).balance}("");
        require(success, "Failed in withdrawal");
    }
    function withdrawToken(address token) external onlyOwner{
        require(address(this) != token, "Not allowed");
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));
    }
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"__name","type":"string"},{"internalType":"string","name":"__symbol","type":"string"},{"internalType":"uint8","name":"__decimals","type":"uint8"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"},{"internalType":"address[4]","name":"_accounts","type":"address[4]"},{"internalType":"bool","name":"_isMarketingFeeBaseToken","type":"bool"},{"internalType":"uint16[10]","name":"_fees","type":"uint16[10]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isEx","type":"bool"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketingFeeTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeBaseTokenSwapped","type":"uint256"}],"name":"MarketingFeeTaken","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":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseTokenForLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellBurnFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyBurnFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellBurnFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyBurnFee","type":"uint16"}],"name":"UpdateBurnFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyLiquidityFee","type":"uint16"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyMarketingFee","type":"uint16"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsMarketingFeeBaseToken","type":"bool"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"oldIsMarketingFeeBaseToken","type":"bool"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAmountToTakeFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMinAmountToTakeFee","type":"uint256"}],"name":"UpdateMinAmountToTakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyRewardFee","type":"uint16"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellTreasuryFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyTreasuryFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellTreasuryFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyTreasuryFee","type":"uint16"}],"name":"UpdateTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasuryWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldTreasuryWallet","type":"address"}],"name":"UpdateTreasuryWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldRouter","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"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":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseTokenForPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeContract","outputs":[{"internalType":"contract IFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMarketingFeeBaseToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToTakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"treasuryBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellBurnFee","type":"uint16"},{"internalType":"uint16","name":"_buyBurnFee","type":"uint16"}],"name":"updateBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"bool","name":"_isMarketingFeeBaseToken","type":"bool"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToTakeFee","type":"uint256"}],"name":"updateMinAmountToTakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellRewardFee","type":"uint16"},{"internalType":"uint16","name":"_buyRewardFee","type":"uint16"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellTreasuryFee","type":"uint16"},{"internalType":"uint16","name":"_buyTreasuryFee","type":"uint16"}],"name":"updateTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseTokenForPair","type":"address"}],"name":"updateUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620074ab380380620074ab833981016040819052620000349162001c4b565b6200003f33620010cf565b8260026020020151600180546001600160a01b039092166001600160a81b031990921691909117600160a01b60ff8a1602179055600a620000818a8262001dce565b50600b62000090898262001dce565b506007869055620000a48660001962001eb0565b620000b29060001962001edd565b60088190553360009081526002602090815260408083209390935560075460039091529190205582516001600160a01b0316620001365760405162461bcd60e51b815260206004820152601d60248201527f6d61726b6574696e672077616c6c65742063616e206e6f74206265203000000060448201526064015b60405180910390fd5b60208301516001600160a01b0316620001925760405162461bcd60e51b815260206004820152601b60248201527f526f7574657220616464726573732063616e206e6f742062652030000000000060448201526064016200012d565b60608301516001600160a01b0316620001ee5760405162461bcd60e51b815260206004820152601c60248201527f54726561737572792077616c6c65742063616e206e6f7420626520300000000060448201526064016200012d565b825160608401516001600160a01b03918216911603620002775760405162461bcd60e51b815260206004820152603560248201527f54726561737572792077616c6c65742063616e206e6f742062652073616d652060448201527f77697468206d61726b6574696e672077616c6c6574000000000000000000000060648201526084016200012d565b61010081015160c082015160808301516040840151845161012c94939291620002a09162001ef9565b620002ac919062001ef9565b620002b8919062001ef9565b620002c4919062001ef9565b61ffff161115620003185760405162461bcd60e51b815260206004820152601560248201527f73656c6c20746f74616c20666565203c3d20333025000000000000000000000060448201526064016200012d565b61012081015160e082015160a08301516060840151602085015161012c94939291620003449162001ef9565b62000350919062001ef9565b6200035c919062001ef9565b62000368919062001ef9565b61ffff161115620003bc5760405162461bcd60e51b815260206004820152601460248201527f62757920746f74616c20666565203c3d2033302500000000000000000000000060448201526064016200012d565b8051609661ffff90911610620004065760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816001602002015161ffff1610620004545760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816002602002015161ffff1610620004a25760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816003602002015161ffff1610620004f05760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816004602002015161ffff16106200053e5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816005602002015161ffff16106200058c5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816006602002015161ffff1610620005da5760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816007602002015161ffff1610620006285760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816008602002015161ffff1610620006765760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b6096816009602002015161ffff1610620006c45760405162461bcd60e51b815260206004820152600e60248201526d6561636820666565203c2031352560901b60448201526064016200012d565b8251601780546060860151601880546001600160a01b039283166001600160a01b031991909116179055851515600160a01b9081026001600160a81b0319909316948216948517831793849055604080519190940460ff16151581526000602082018190529492909116909117917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a36018546040516000916001600160a01b0316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df183908390a3602083810151601c80546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b81529051919263ad5c4648926004808401938290030181865afa158015620007f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000817919062001f1e565b6001546001600160a01b03908116911614620008ac57600154601c5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000884573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008aa919062001f3c565b505b620008cf30731ccfe8c40ef259566433716002e379dfffbf5a3e6000196200111f565b601c54620008eb9030906001600160a01b03166000196200111f565b601c546040516000916001600160a01b0316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e908390a3601c60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000977573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200099d919062001f1e565b6001546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620009ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a15919062001f1e565b601d80546001600160a01b0319166001600160a01b039290921691909117905580516016805460208085015163ffffffff60281b1990921661ffff9485166501000000000090810261ffff60381b19169190911767010000000000000093861684021793849055604080519185048616825292909304909316928201929092526000818301819052606082015290517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a16040818101516016805460608086015163ffffffff60481b1990921661ffff948516690100000000000000000090810261ffff60581b1916919091176b0100000000000000000000009386168402179384905585519084048516815291909204909216602083015260008284018190529082015290517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a160c08101516016805460e084015163ffffffff60681b1990911661ffff9384166d010000000000000000000000000090810261ffff60781b191691909117600160781b9285168302179283905560408051918404851682529190920490921660208201526000818301819052606082015290517f2893ef6309f9df0d45b134fcb021eb854592432db91782f02ce6b9029d1470319181900360800190a16101008101516016805461012084015163ffffffff60881b1990911661ffff938416600160881b90810261ffff60981b191691909117600160981b9285168302179283905560408051918404851682529190920490921660208201526000818301819052606082015290517f01f5c7a45d273917dfc98816f1dd17a88893a7338e7beaa4d305fc8c84f8fe259181900360800190a16080808201516016805460a085015161ffff908116630100000090810264ffff0000001961010096841687021664ffffffff00199094169390931792909217928390556040805194840482168552919092049091166020830152600090820181905260608201527f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a4572910160405180910390a162000d406127108762001f5a565b601981905560408051918252600060208301527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a162000d8c6127108762001f5a565b84101562000df25760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b60648201526084016200012d565b62000e006127108762001f5a565b85101562000e5b5760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b60648201526084016200012d565b601a85905560408051868152600060208201527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b84905560408051858152600060208201527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1600560209081527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba8054600160ff1991821681179092556006805480840182556000805160206200748b833981519152908101805461dead6001600160a01b031991821617909155306000818152604080822080548816891790558554808901875585018054851684179055601880546001600160a01b03908116845282842080548a168b17905581548854808c019099559790960180549787169790951696909617909355818152601e8852828120805487168817905560178054851682528382208054881689179055855485168252838220805488168917905533808352848320805489168a1790557f8a622fd893f993f50f1795ae2bf707bdf4143f678ec4998626679a2f447616df805489168a179055601f9099527fef94442dfc0e910ca743614215a10fad3ff708bf5378f9c5c958c9192b3bf0048054881689179055918152828120805487168817905590548316815281812080548616871790559254821683528083208054851686179055948252939020805490911682179055601d546200108892169062001247565b60405186815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050505050505062001fd3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620011835760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200012d565b6001600160a01b038216620011e65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200012d565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216600090815260208052604090205481151560ff909116151503620012de5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084016200012d565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200131c57620013168262001386565b62001327565b62001327826200158d565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab910160405180910390a25050565b6000546001600160a01b03163314620013d15760405162461bcd60e51b815260206004820181905260248201526000805160206200746b83398151915260448201526064016200012d565b6001600160a01b03811660009081526005602052604090205460ff16156200143c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016200012d565b6006546032906200144f90600162001f71565b1115620014db5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a4016200012d565b6001600160a01b0381166000908152600260205260409020541562001538576001600160a01b0381166000908152600260205260409020546200151e9062001803565b6001600160a01b0382166000908152600360205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091526000805160206200748b8339815191520180546001600160a01b0319169091179055565b6000546001600160a01b03163314620015d85760405162461bcd60e51b815260206004820181905260248201526000805160206200746b83398151915260448201526064016200012d565b6001600160a01b03811660009081526005602052604090205460ff16620016425760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016200012d565b60005b600654811015620017ff57816001600160a01b03166006828154811062001670576200167062001d29565b6000918252602090912001546001600160a01b031603620017ea576001600160a01b038216600090815260026020526040902054620016ae6200188d565b6001600160a01b038416600090815260036020526040902054620016d3919062001f87565b6001600160a01b0384166000908152600260205260409020819055600854620016fe90839062001edd565b6200170a919062001f71565b6008556001600160a01b0383166000908152600560205260409020805460ff19169055600680546200173f9060019062001edd565b8154811062001752576200175262001d29565b600091825260209091200154600680546001600160a01b03909216918490811062001781576200178162001d29565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506006805480620017c357620017c362001fa1565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80620017f68162001fb7565b91505062001645565b5050565b60006008548211156200186c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016200012d565b6000620018786200188d565b905062001886818462001f5a565b9392505050565b600080806200189b620018b3565b9092509050620018ac818362001f5a565b9250505090565b6008546007546000918291825b60065481101562001a1b57826002600060068481548110620018e657620018e662001d29565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806200195557508160036000600684815481106200192e576200192e62001d29565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156200196c57600854600754945094505050509091565b600260006006838154811062001986576200198662001d29565b60009182526020808320909101546001600160a01b03168352820192909252604001902054620019b7908462001edd565b92506003600060068381548110620019d357620019d362001d29565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001a04908362001edd565b91508062001a128162001fb7565b915050620018c0565b5060075460085462001a2e919062001f5a565b82101562001a46576008546007549350935050509091565b90939092509050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562001a905762001a9062001a4f565b604052919050565b600082601f83011262001aaa57600080fd5b81516001600160401b0381111562001ac65762001ac662001a4f565b602062001adc601f8301601f1916820162001a65565b828152858284870101111562001af157600080fd5b60005b8381101562001b1157858101830151828201840152820162001af4565b506000928101909101919091529392505050565b80516001600160a01b038116811462001b3d57600080fd5b919050565b600082601f83011262001b5457600080fd5b604051608081016001600160401b038111828210171562001b795762001b7962001a4f565b60405280608084018581111562001b8f57600080fd5b845b8181101562001bb45762001ba58162001b25565b83526020928301920162001b91565b509195945050505050565b8051801515811462001b3d57600080fd5b600082601f83011262001be257600080fd5b6040516101408082016001600160401b038111838210171562001c095762001c0962001a4f565b6040528301818582111562001c1d57600080fd5b845b8281101562001bb457805161ffff8116811462001c3c5760008081fd5b82526020918201910162001c1f565b60008060008060008060008060006102a08a8c03121562001c6b57600080fd5b89516001600160401b038082111562001c8357600080fd5b62001c918d838e0162001a98565b9a5060208c015191508082111562001ca857600080fd5b5062001cb78c828d0162001a98565b98505060408a015160ff8116811462001ccf57600080fd5b8097505060608a0151955060808a0151945060a08a0151935062001cf78b60c08c0162001b42565b925062001d086101408b0162001bbf565b915062001d1a8b6101608c0162001bd0565b90509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062001d5457607f821691505b60208210810362001d7557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562001dc957600081815260208120601f850160051c8101602086101562001da45750805b601f850160051c820191505b8181101562001dc55782815560010162001db0565b5050505b505050565b81516001600160401b0381111562001dea5762001dea62001a4f565b62001e028162001dfb845462001d3f565b8462001d7b565b602080601f83116001811462001e3a576000841562001e215750858301515b600019600386901b1c1916600185901b17855562001dc5565b600085815260208120601f198616915b8281101562001e6b5788860151825594840194600190910190840162001e4a565b508582101562001e8a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b60008262001ec25762001ec262001e9a565b500690565b634e487b7160e01b600052601160045260246000fd5b8181038181111562001ef35762001ef362001ec7565b92915050565b61ffff81811683821601908082111562001f175762001f1762001ec7565b5092915050565b60006020828403121562001f3157600080fd5b620018868262001b25565b60006020828403121562001f4f57600080fd5b620018868262001bbf565b60008262001f6c5762001f6c62001e9a565b500490565b8082018082111562001ef35762001ef362001ec7565b808202811582820484141762001ef35762001ef362001ec7565b634e487b7160e01b600052603160045260246000fd5b60006001820162001fcc5762001fcc62001ec7565b5060010190565b6154888062001fe36000396000f3fe6080604052600436106103b15760003560e01c80638276e5b0116101e7578063b62496f51161010d578063e086e5ec116100a0578063f2fde38b1161006f578063f2fde38b14610b8b578063f637434214610bab578063f8b45b0514610bcd578063fc59d23d14610be357600080fd5b8063e086e5ec14610b02578063e71dc3f514610b17578063e9481eee14610b39578063f11a24d314610b6957600080fd5b8063d68f8cde116100dc578063d68f8cde14610a5c578063dd62ed3e14610a7c578063de0aad5314610ac2578063df8408fe14610ae257600080fd5b8063b62496f5146109d7578063c8c8ebe414610a06578063cf089e1314610a1c578063cf188ad014610a3c57600080fd5b80639213691311610185578063a457c2d711610154578063a457c2d714610955578063a9059cbb14610975578063aa49802314610995578063adb873bd146109b557600080fd5b806392136913146108de578063948384dc1461090057806395d89b41146109205780639a7a23d61461093557600080fd5b806389476069116101c157806389476069146108785780638da5cb5b146108985780638f0bc167146108b657806391c1004a146108be57600080fd5b80638276e5b0146107ff57806385af30c51461081f57806388f820201461083f57600080fd5b80634626402b116102d757806370a082311161026a5780637bce5a04116102395780637bce5a04146107755780637c75ad3a146107975780637cf84bd7146107bf578063809d458d146107df57600080fd5b806370a0823114610700578063715018a61461072057806373b9e82c1461073557806375f0a8741461075557600080fd5b806357e62b98116102a657806357e62b981461067b5780635c068a8c1461069c57806365b8dbc0146106be5780636b2fb124146106de57600080fd5b80634626402b146105eb5780634707c5511461060b57806352390c021461062b5780635342acb41461064b57600080fd5b80632073bd851161034f578063313ce5671161031e578063313ce5671461055f5780633685d4191461058b57806339509351146105ab5780634549b039146105cb57600080fd5b80632073bd85146104df57806323b872dd146104ff5780632ae2f1211461051f5780632d8381191461053f57600080fd5b80630cfe2f3f1161038b5780630cfe2f3f1461045457806313114a9d1461048957806318160ddd146104a85780631c499ab0146104bd57600080fd5b806306e29712146103bd57806306fdde0314610402578063095ea7b31461042457600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103e573fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561040e57600080fd5b50610417610bf9565b6040516103f99190614e8d565b34801561043057600080fd5b5061044461043f366004614ed5565b610c8b565b60405190151581526020016103f9565b34801561046057600080fd5b50601654610476906301000000900461ffff1681565b60405161ffff90911681526020016103f9565b34801561049557600080fd5b506009545b6040519081526020016103f9565b3480156104b457600080fd5b5060075461049a565b3480156104c957600080fd5b506104dd6104d8366004614f01565b610ca2565b005b3480156104eb57600080fd5b506104dd6104fa366004614f31565b610d80565b34801561050b57600080fd5b5061044461051a366004614f64565b610f7f565b34801561052b57600080fd5b506104dd61053a366004614fb3565b610fd2565b34801561054b57600080fd5b5061049a61055a366004614f01565b6110b6565b34801561056b57600080fd5b50600154600160a01b900460ff1660405160ff90911681526020016103f9565b34801561059757600080fd5b506104dd6105a6366004614fec565b611133565b3480156105b757600080fd5b506104446105c6366004614ed5565b61136b565b3480156105d757600080fd5b5061049a6105e6366004615009565b6113a2565b3480156105f757600080fd5b506018546103e5906001600160a01b031681565b34801561061757600080fd5b506104dd610626366004614fb3565b61144f565b34801561063757600080fd5b506104dd610646366004614fec565b6115b5565b34801561065757600080fd5b50610444610666366004614fec565b601e6020526000908152604090205460ff1681565b34801561068757600080fd5b5060175461044490600160a01b900460ff1681565b3480156106a857600080fd5b5060165461047690600160781b900461ffff1681565b3480156106ca57600080fd5b506104dd6106d9366004614fec565b6117a3565b3480156106ea57600080fd5b5060165461047690600160681b900461ffff1681565b34801561070c57600080fd5b5061049a61071b366004614fec565b611ab5565b34801561072c57600080fd5b506104dd611b14565b34801561074157600080fd5b506104dd610750366004614f01565b611b4a565b34801561076157600080fd5b506017546103e5906001600160a01b031681565b34801561078157600080fd5b5060165461047690600160581b900461ffff1681565b3480156107a357600080fd5b506103e5731ccfe8c40ef259566433716002e379dfffbf5a3e81565b3480156107cb57600080fd5b506001546103e5906001600160a01b031681565b3480156107eb57600080fd5b506104dd6107fa366004614fec565b611bff565b34801561080b57600080fd5b506104dd61081a366004614f31565b611da5565b34801561082b57600080fd5b50601d546103e5906001600160a01b031681565b34801561084b57600080fd5b5061044461085a366004614fec565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561088457600080fd5b506104dd610893366004614fec565b611fa4565b3480156108a457600080fd5b506000546001600160a01b03166103e5565b6104dd6120a5565b3480156108ca57600080fd5b506104dd6108d9366004614fec565b6124fd565b3480156108ea57600080fd5b5060165461047690600160481b900461ffff1681565b34801561090c57600080fd5b506104dd61091b366004614f31565b6127c0565b34801561092c57600080fd5b506104176129bb565b34801561094157600080fd5b506104dd610950366004614fb3565b6129ca565b34801561096157600080fd5b50610444610970366004614ed5565b6129fe565b34801561098157600080fd5b50610444610990366004614ed5565b612a35565b3480156109a157600080fd5b506104dd6109b0366004614f01565b612a42565b3480156109c157600080fd5b5060165461047690600160881b900461ffff1681565b3480156109e357600080fd5b506104446109f2366004614fec565b602080526000908152604090205460ff1681565b348015610a1257600080fd5b5061049a601b5481565b348015610a2857600080fd5b506104dd610a37366004614f31565b612b22565b348015610a4857600080fd5b50601c546103e5906001600160a01b031681565b348015610a6857600080fd5b506104dd610a77366004614f31565b612d27565b348015610a8857600080fd5b5061049a610a9736600461502e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b348015610ace57600080fd5b5060165461047690610100900461ffff1681565b348015610aee57600080fd5b506104dd610afd366004614fb3565b612f2c565b348015610b0e57600080fd5b506104dd613008565b348015610b2357600080fd5b5060165461047690600160981b900461ffff1681565b348015610b4557600080fd5b50610444610b54366004614fec565b601f6020526000908152604090205460ff1681565b348015610b7557600080fd5b5060165461047690600160381b900461ffff1681565b348015610b9757600080fd5b506104dd610ba6366004614fec565b6130cc565b348015610bb757600080fd5b5060165461047690600160281b900461ffff1681565b348015610bd957600080fd5b5061049a601a5481565b348015610bef57600080fd5b5061049a60195481565b6060600a8054610c089061505c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c349061505c565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c98338484613164565b5060015b92915050565b6000546001600160a01b03163314610cd55760405162461bcd60e51b8152600401610ccc90615096565b60405180910390fd5b612710600754610ce591906150e1565b811015610d3e5760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610ccc565b601a546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601a55565b6000546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff6101008204811691600160681b8104821691600160481b8204811691610de391600160281b9091041687615103565b610ded9190615103565b610df79190615103565b610e019190615103565b61ffff161115610e235760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff63010000008204811691600160781b8104821691600160581b8204811691610e5e91600160381b9091041686615103565b610e689190615103565b610e729190615103565b610e7c9190615103565b61ffff161115610e9e5760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115610ec35760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115610ee85760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f01f5c7a45d273917dfc98816f1dd17a88893a7338e7beaa4d305fc8c84f8fe259181900360800190a16016805463ffffffff60881b1916600160881b61ffff9485160261ffff60981b191617600160981b9290931691909102919091179055565b6000610f8c848484613288565b6001600160a01b038416600090815260046020908152604080832033808552925290912054610fc7918691610fc29086906151cc565b613164565b5060015b9392505050565b6000546001600160a01b03163314610ffc5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166000908152601f602052604090205481151560ff9091161515036110565760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610ccc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b600060085482111561111d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ccc565b6000611127613646565b9050610fcb81846150e1565b6000546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811660009081526005602052604090205460ff166111c55760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610ccc565b60005b60065481101561136757816001600160a01b0316600682815481106111ef576111ef6151df565b6000918252602090912001546001600160a01b031603611355576001600160a01b03821660009081526002602052604090205461122a613646565b6001600160a01b03841660009081526003602052604090205461124d91906151f5565b6001600160a01b03841660009081526002602052604090208190556008546112769083906151cc565b611280919061520c565b6008556001600160a01b0383166000908152600560205260409020805460ff19169055600680546112b3906001906151cc565b815481106112c3576112c36151df565b600091825260209091200154600680546001600160a01b0390921691849081106112ef576112ef6151df565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600680548061132e5761132e61521f565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061135f81615235565b9150506111c8565b5050565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610c98918590610fc290869061520c565b60006007548311156113f65760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ccc565b6000611400613646565b90508261141d57600061141382866151f5565b9250610c9c915050565b600061142885613669565b505050505090506000828261143d91906151f5565b9350610c9c92505050565b5092915050565b6000546001600160a01b031633146114795760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610ccc565b6018546001600160a01b03908116908316036114fd5760405162461bcd60e51b8152600401610ccc9061524e565b601754604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360178054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601e60209081526040808320805460ff199081166001908117909255601f909352922080549091169091179055565b6000546001600160a01b031633146115df5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811660009081526005602052604090205460ff16156116485760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ccc565b60065460329061165990600161520c565b11156116e35760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610ccc565b6001600160a01b0381166000908152600260205260409020541561173d576001600160a01b038116600090815260026020526040902054611723906110b6565b6001600160a01b0382166000908152600360205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b6000546001600160a01b031633146117cd5760405162461bcd60e51b8152600401610ccc90615096565b601c546001600160a01b03908116908216036118375760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610ccc565b601c546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601c80546001600160a01b0319166001600160a01b03831690811790915561189e903090600019613164565b601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191591906152a1565b6001546001600160a01b039081169116146119a657600154601c5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a491906152be565b505b601c546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1491906152a1565b6001546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8991906152a1565b601d80546001600160a01b0319166001600160a01b0383169081179091559091506113679060016136d3565b6001600160a01b03811660009081526005602052604081205460ff1615611af257506001600160a01b031660009081526003602052604090205490565b6001600160a01b038216600090815260026020526040902054610c9c906110b6565b6000546001600160a01b03163314611b3e5760405162461bcd60e51b8152600401610ccc90615096565b611b486000613803565b565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610ccc90615096565b60008111611bbd5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610ccc565b6019546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601955565b6000546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b038116611c7f5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610ccc565b306001600160a01b03821603611cea5760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610ccc565b6017546001600160a01b03808316911603611d175760405162461bcd60e51b8152600401610ccc9061524e565b6018546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601880546001600160a01b039092166001600160a01b0319909216821790556000908152601e60209081526040808320805460ff199081166001908117909255601f909352922080549091169091179055565b6000546001600160a01b03163314611dcf5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b82048116916101008104821691600160481b8204811691611e0891600160281b9091041687615103565b611e129190615103565b611e1c9190615103565b611e269190615103565b61ffff161115611e485760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b820481169163010000008104821691600160581b8204811691611e8391600160381b9091041686615103565b611e8d9190615103565b611e979190615103565b611ea19190615103565b61ffff161115611ec35760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115611ee85760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115611f0d5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160681b8404811682840152600160781b9093049092166060830152517f2893ef6309f9df0d45b134fcb021eb854592432db91782f02ce6b9029d1470319181900360800190a16016805463ffffffff60681b1916600160681b61ffff9485160261ffff60781b191617600160781b9290931691909102919091179055565b6000546001600160a01b03163314611fce5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811630036120145760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610ccc565b6120a26120296000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209191906152db565b6001600160a01b0384169190613853565b50565b604080516002808252606082018352600092602083019080368337505060015482519293506001600160a01b0316918391506000906120e6576120e66151df565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061211a5761211a6151df565b6001600160a01b03928316602091820292909201810191909152601c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612173573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219791906152a1565b6001600160a01b0316816000815181106121b3576121b36151df565b60200260200101516001600160a01b03160361223d57601c5460185460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de959234926122069260009288929116904290600401615338565b6000604051808303818588803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b5050505050612345565b6001546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba91906152db565b90506122d4336001546001600160a01b03169030846138bb565b601c54601854604051635c11d79560e01b81526001600160a01b0392831692635c11d795926123119286926000928992911690429060040161536d565b600060405180830381600087803b15801561232b57600080fd5b505af115801561233f573d6000803e3d6000fd5b50505050505b6018546001600160a01b031660009081526005602052604090205460ff1615612433576018546001600160a01b031660009081526003602052604090205460075461239091906151cc565b6007556018546001600160a01b03166000908152600260205260409020546008546123bb91906151cc565b6008556018546001600160a01b03166000818152600360209081526040808320549051908152919291600080516020615433833981519152910160405180910390a3601880546001600160a01b0390811660009081526002602090815260408083208390559354909216815260039091529081205550565b6018546001600160a01b0316600090815260026020526040812054612457906110b6565b90508060075461246791906151cc565b6007556018546001600160a01b031660009081526002602052604090205460085461249291906151cc565b6008556018546040518281526000916001600160a01b0316906000805160206154338339815191529060200160405180910390a350601880546001600160a01b0390811660009081526002602090815260408083208390559354909216815260039091529081205550565b6000546001600160a01b031633146125275760405162461bcd60e51b8152600401610ccc90615096565b6001546001600160a01b039081169082160361259b5760405162461bcd60e51b815260206004820152602d60248201527f5468652062617365546f6b656e466f725061697220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610ccc565b600180546001600160a01b0319166001600160a01b0383811691909117909155601c546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa1580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262191906152a1565b6001546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015612672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269691906152a1565b601d80546001600160a01b0319166001600160a01b03928316179055601c54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa1580156126f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271891906152a1565b6001546001600160a01b039081169116146127a957600154601c5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a791906152be565b505b601d546120a2906001600160a01b031660016136d3565b6000546001600160a01b031633146127ea5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b8104821691600160481b820481169161282591600160281b9091041687615103565b61282f9190615103565b6128399190615103565b6128439190615103565b61ffff1611156128655760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b8104821691600160581b82048116916128a091600160381b9091041686615103565b6128aa9190615103565b6128b49190615103565b6128be9190615103565b61ffff1611156128e05760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff1611156129055760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff16111561292a5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152610100840481168284015263010000009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a16016805464ffffffff00191661010061ffff9485160264ffff00000019161763010000009290931691909102919091179055565b6060600b8054610c089061505c565b6000546001600160a01b031633146129f45760405162461bcd60e51b8152600401610ccc90615096565b61136782826136d3565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610c98918590610fc29086906151cc565b6000610c98338484613288565b6000546001600160a01b03163314612a6c5760405162461bcd60e51b8152600401610ccc90615096565b612710600754612a7c91906150e1565b811015612ae05760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610ccc565b601b546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601b55565b6000546001600160a01b03163314612b4c5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b81048216916101008204811691612b8591600160281b9091041687615103565b612b8f9190615103565b612b999190615103565b612ba39190615103565b61ffff161115612bc55760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b810482169163010000008204811691612c0091600160381b9091041686615103565b612c0a9190615103565b612c149190615103565b612c1e9190615103565b61ffff161115612c405760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115612c655760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115612c8a5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160481b8404811682840152600160581b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1601680546cffffffff0000000000000000001916600160481b61ffff9485160261ffff60581b191617600160581b9290931691909102919091179055565b6000546001600160a01b03163314612d515760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b81048216916101008204811691612d8a91600160481b9091041687615103565b612d949190615103565b612d9e9190615103565b612da89190615103565b61ffff161115612dca5760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b810482169163010000008204811691612e0591600160581b9091041686615103565b612e0f9190615103565b612e199190615103565b612e239190615103565b61ffff161115612e455760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115612e6a5760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115612e8f5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160281b8404811682840152600160381b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a16016805468ffffffff00000000001916600160281b61ffff9485160268ffff00000000000000191617600160381b9290931691909102919091179055565b6000546001600160a01b03163314612f565760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166000908152601e602052604090205481151560ff909116151503612fb05760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610ccc565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa991016110aa565b6000546001600160a01b031633146130325760405162461bcd60e51b8152600401610ccc90615096565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461307f576040519150601f19603f3d011682016040523d82523d6000602084013e613084565b606091505b50509050806120a25760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610ccc565b6000546001600160a01b031633146130f65760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811661315b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ccc565b6120a281613803565b6001600160a01b0383166131c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ccc565b6001600160a01b0382166132275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ccc565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166132ec5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ccc565b6001600160a01b03821661334e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ccc565b600061335930611ab5565b6019546016549192508210159060ff161580156133735750805b80156133945750601d54600090613392906001600160a01b0316611ab5565b115b80156133b757506001600160a01b038416600090815260208052604090205460ff165b156133c4576133c46138f9565b6133ff600c8054600d55600e8054600f5560108054601155601280546013556014805460155560009081905590819055908190559182905555565b60165460ff1615801561342b57506001600160a01b0385166000908152601e602052604090205460ff16155b801561345057506001600160a01b0384166000908152601e602052604090205460ff16155b1561351d576001600160a01b038516600090815260208052604090205460ff16156134bc5760165461ffff630100000082048116600c55600160381b82048116600e55600160581b82048116601055600160781b82048116601255600160981b9091041660145561351d565b6001600160a01b038416600090815260208052604090205460ff161561351d5760165461ffff61010082048116600c55600160281b82048116600e55600160481b82048116601055600160681b82048116601255600160881b909104166014555b613528858585614189565b61354b601554601455601354601255600d54600c55600f54600e55601154601055565b60165460ff1661363f576001600160a01b0385166000908152601f602052604090205460ff166135c657601b5483106135c65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610ccc565b6001600160a01b0384166000908152601f602052604090205460ff1661363f57601a546135f285611ab5565b1061363f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610ccc565b5050505050565b6000806000613653614622565b909250905061366281836150e1565b9250505090565b600080600080600080600061367d886147a5565b9050600061368a896147c2565b905060006136978a6147d5565b905060006136a48b6147e8565b905060006136b18c6147fb565b905060006136be8d61480e565b9d959c50939a50919850965094509092505050565b6001600160a01b038216600090815260208052604090205481151560ff9091161515036137685760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610ccc565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556137a25761379d826115b5565b6137ab565b6137ab82611133565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91016110aa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526138b690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614861565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138f39085906323b872dd60e01b9060840161387f565b50505050565b6016805460ff19166001179055600061391130611ab5565b90506000602354602254602154613928919061520c565b613932919061520c565b905080158061394057508082105b1561394c57505061417d565b6000600260215461395d91906150e1565b90506000601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d891906152a1565b6001546001600160a01b03908116911614613a5e576001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5991906152db565b613a60565b475b9050600080601760149054906101000a900460ff1615613d8c57600060235460225486613a8d919061520c565b613a97919061520c565b90508015613aa857613aa881614933565b601c54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1691906152a1565b6001546001600160a01b03908116911614613ba6576001546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9791906152db565b613ba191906151cc565b613bb0565b613bb085476151cc565b905060008260225483613bc391906151f5565b613bcd91906150e1565b905082613bda88846151f5565b613be491906150e1565b945084613bf182846151cc565b613bfb91906151cc565b93508015613d8457601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a91906152a1565b6001546001600160a01b03918216911603613d2c576017546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613cdc576040519150601f19603f3d011682016040523d82523d6000602084013e613ce1565b606091505b505090508015613d26576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50613d84565b601754600154613d49916001600160a01b03918216911683613853565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613f40565b600060235485613d9c919061520c565b90508015613dad57613dad81614933565b601c54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1b91906152a1565b6001546001600160a01b03908116911614613eab576001546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9c91906152db565b613ea691906151cc565b613eb5565b613eb585476151cc565b905081613ec287836151f5565b613ecc91906150e1565b9350613ed884826151cc565b60225490935015613f3d57601754602254613f009130916001600160a01b0390911690613288565b60225460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613f505750600082115b15613f9957613f5f8483614b01565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b801561411257601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061401691906152a1565b6001546001600160a01b039182169116036140c1576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b5050905080156140bb576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50614112565b6018546001546140de916001600160a01b03918216911683613853565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602281905560238190556021819055546001600160a01b03161561415b57614156306141486000546001600160a01b031690565b61415130611ab5565b613288565b614176565b6018546141769030906001600160a01b031661415182611ab5565b5050505050505b6016805460ff19169055565b60008060008060008061419b87613669565b95509550955095509550955060006141b1613646565b9050816007546141c191906151cc565b6007556141ce81836151f5565b6008546141db91906151cc565b6008556040518281526000906001600160a01b038c16906000805160206154338339815191529060200160405180910390a38460215461421b919061520c565b60215560225461422c90859061520c565b60225560235461423d90849061520c565b60235560008361424d868861520c565b614257919061520c565b905061426382826151f5565b3060009081526002602052604090205461427d919061520c565b3060009081526002602090815260408083209390935560059052205460ff16156142cd57306000908152600360205260409020546142bc90829061520c565b306000908152600360205260409020555b506001600160a01b038a1660009081526005602052604090205460ff16801561430f57506001600160a01b03891660009081526005602052604090205460ff16155b156143e2576001600160a01b038a166000908152600360205260409020546143389089906151cc565b6001600160a01b038b1660009081526003602052604090205561435b81896151f5565b6001600160a01b038b1660009081526002602052604090205461437e91906151cc565b6001600160a01b038b166000908152600260205260409020556143a181886151f5565b6001600160a01b038a166000908152600260205260409020546143c4919061520c565b6001600160a01b038a166000908152600260205260409020556145c8565b6001600160a01b038a1660009081526005602052604090205460ff1615801561442357506001600160a01b03891660009081526005602052604090205460ff165b156144af5761443281896151f5565b6001600160a01b038b1660009081526002602052604090205461445591906151cc565b6001600160a01b03808c16600090815260026020908152604080832094909455918c1681526003909152205461448c90889061520c565b6001600160a01b038a166000908152600360205260409020556143a181886151f5565b6001600160a01b038a1660009081526005602052604090205460ff1680156144ef57506001600160a01b03891660009081526005602052604090205460ff165b1561453b576001600160a01b038a166000908152600360205260409020546145189089906151cc565b6001600160a01b038b1660009081526003602052604090205561443281896151f5565b61454581896151f5565b6001600160a01b038b1660009081526002602052604090205461456891906151cc565b6001600160a01b038b1660009081526002602052604090205561458b81886151f5565b6001600160a01b038a166000908152600260205260409020546145ae919061520c565b6001600160a01b038a166000908152600260205260409020555b6145db6145d582886151f5565b87614cc2565b886001600160a01b03168a6001600160a01b03166000805160206154338339815191528960405161460e91815260200190565b60405180910390a350505050505050505050565b6008546007546000918291825b60065481101561477457826002600060068481548110614651576146516151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806146bc5750816003600060068481548110614695576146956151df565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156146d257600854600754945094505050509091565b60026000600683815481106146e9576146e96151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461471890846151cc565b92506003600060068381548110614731576147316151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461476090836151cc565b91508061476c81615235565b91505061462f565b5060075460085461478591906150e1565b82101561479c576008546007549350935050509091565b90939092509050565b60006103e8600c54836147b891906151f5565b610c9c91906150e1565b60006103e8600e54836147b891906151f5565b60006103e8601054836147b891906151f5565b60006103e8601254836147b891906151f5565b60006103e8601454836147b891906151f5565b60006103e8601054600e54600c546012546014546103e861482f91906151cc565b61483991906151cc565b61484391906151cc565b61484d91906151cc565b61485791906151cc565b6147b890846151f5565b60006148b6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614ce89092919063ffffffff16565b8051909150156138b657808060200190518101906148d491906152be565b6138b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ccc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614968576149686151df565b6001600160a01b0392831660209182029290920101526001805483519216918391908110614998576149986151df565b6001600160a01b03928316602091820292909201810191909152601c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156149f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a1591906152a1565b6001600160a01b031681600181518110614a3157614a316151df565b60200260200101516001600160a01b031603614ab657601c5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614a8090859060009086903090429060040161536d565b600060405180830381600087803b158015614a9a57600080fd5b505af1158015614aae573d6000803e3d6000fd5b505050505050565b601c54604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e9943691614a80916001600160a01b0316908690600090879042906004016153a9565b601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7891906152a1565b6001546001600160a01b03918216911603614c2057601c5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614bfb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061363f91906153e8565b601c5460015460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614c9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363f91906153e8565b81600854614cd091906151cc565b600855600954614ce190829061520c565b6009555050565b6060614cf78484600085614cff565b949350505050565b606082471015614d605760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ccc565b6001600160a01b0385163b614db75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ccc565b600080866001600160a01b03168587604051614dd39190615416565b60006040518083038185875af1925050503d8060008114614e10576040519150601f19603f3d011682016040523d82523d6000602084013e614e15565b606091505b5091509150614e25828286614e30565b979650505050505050565b60608315614e3f575081610fcb565b825115614e4f5782518084602001fd5b8160405162461bcd60e51b8152600401610ccc9190614e8d565b60005b83811015614e84578181015183820152602001614e6c565b50506000910152565b6020815260008251806020840152614eac816040850160208701614e69565b601f01601f19169190910160400192915050565b6001600160a01b03811681146120a257600080fd5b60008060408385031215614ee857600080fd5b8235614ef381614ec0565b946020939093013593505050565b600060208284031215614f1357600080fd5b5035919050565b803561ffff81168114614f2c57600080fd5b919050565b60008060408385031215614f4457600080fd5b614f4d83614f1a565b9150614f5b60208401614f1a565b90509250929050565b600080600060608486031215614f7957600080fd5b8335614f8481614ec0565b92506020840135614f9481614ec0565b929592945050506040919091013590565b80151581146120a257600080fd5b60008060408385031215614fc657600080fd5b8235614fd181614ec0565b91506020830135614fe181614fa5565b809150509250929050565b600060208284031215614ffe57600080fd5b8135610fcb81614ec0565b6000806040838503121561501c57600080fd5b823591506020830135614fe181614fa5565b6000806040838503121561504157600080fd5b823561504c81614ec0565b91506020830135614fe181614ec0565b600181811c9082168061507057607f821691505b60208210810361509057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826150fe57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff818116838216019080821115611448576114486150cb565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b81810381811115610c9c57610c9c6150cb565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c9c57610c9c6150cb565b80820180821115610c9c57610c9c6150cb565b634e487b7160e01b600052603160045260246000fd5b600060018201615247576152476150cb565b5060010190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b6000602082840312156152b357600080fd5b8151610fcb81614ec0565b6000602082840312156152d057600080fd5b8151610fcb81614fa5565b6000602082840312156152ed57600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561532d5781516001600160a01b031687529582019590820190600101615308565b509495945050505050565b84815260806020820152600061535160808301866152f4565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061538c60a08301866152f4565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a0606082015260006153d660a08301856152f4565b90508260808301529695505050505050565b6000806000606084860312156153fd57600080fd5b8351925060208401519150604084015190509250925092565b60008251615428818460208701614e69565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204f5de6a43eec31e653f04b8bbb5462b4cb3f090da2defcffdc9d19bc2c35a58e64736f6c634300081200334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572f652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000035ca6f43f8580fbe9711bcd0db5b2518838af62f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007cb1126fd682b46cddc264c397d4cab7340a313200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000746697265626f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746495245424f5400000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103b15760003560e01c80638276e5b0116101e7578063b62496f51161010d578063e086e5ec116100a0578063f2fde38b1161006f578063f2fde38b14610b8b578063f637434214610bab578063f8b45b0514610bcd578063fc59d23d14610be357600080fd5b8063e086e5ec14610b02578063e71dc3f514610b17578063e9481eee14610b39578063f11a24d314610b6957600080fd5b8063d68f8cde116100dc578063d68f8cde14610a5c578063dd62ed3e14610a7c578063de0aad5314610ac2578063df8408fe14610ae257600080fd5b8063b62496f5146109d7578063c8c8ebe414610a06578063cf089e1314610a1c578063cf188ad014610a3c57600080fd5b80639213691311610185578063a457c2d711610154578063a457c2d714610955578063a9059cbb14610975578063aa49802314610995578063adb873bd146109b557600080fd5b806392136913146108de578063948384dc1461090057806395d89b41146109205780639a7a23d61461093557600080fd5b806389476069116101c157806389476069146108785780638da5cb5b146108985780638f0bc167146108b657806391c1004a146108be57600080fd5b80638276e5b0146107ff57806385af30c51461081f57806388f820201461083f57600080fd5b80634626402b116102d757806370a082311161026a5780637bce5a04116102395780637bce5a04146107755780637c75ad3a146107975780637cf84bd7146107bf578063809d458d146107df57600080fd5b806370a0823114610700578063715018a61461072057806373b9e82c1461073557806375f0a8741461075557600080fd5b806357e62b98116102a657806357e62b981461067b5780635c068a8c1461069c57806365b8dbc0146106be5780636b2fb124146106de57600080fd5b80634626402b146105eb5780634707c5511461060b57806352390c021461062b5780635342acb41461064b57600080fd5b80632073bd851161034f578063313ce5671161031e578063313ce5671461055f5780633685d4191461058b57806339509351146105ab5780634549b039146105cb57600080fd5b80632073bd85146104df57806323b872dd146104ff5780632ae2f1211461051f5780632d8381191461053f57600080fd5b80630cfe2f3f1161038b5780630cfe2f3f1461045457806313114a9d1461048957806318160ddd146104a85780631c499ab0146104bd57600080fd5b806306e29712146103bd57806306fdde0314610402578063095ea7b31461042457600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103e573fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561040e57600080fd5b50610417610bf9565b6040516103f99190614e8d565b34801561043057600080fd5b5061044461043f366004614ed5565b610c8b565b60405190151581526020016103f9565b34801561046057600080fd5b50601654610476906301000000900461ffff1681565b60405161ffff90911681526020016103f9565b34801561049557600080fd5b506009545b6040519081526020016103f9565b3480156104b457600080fd5b5060075461049a565b3480156104c957600080fd5b506104dd6104d8366004614f01565b610ca2565b005b3480156104eb57600080fd5b506104dd6104fa366004614f31565b610d80565b34801561050b57600080fd5b5061044461051a366004614f64565b610f7f565b34801561052b57600080fd5b506104dd61053a366004614fb3565b610fd2565b34801561054b57600080fd5b5061049a61055a366004614f01565b6110b6565b34801561056b57600080fd5b50600154600160a01b900460ff1660405160ff90911681526020016103f9565b34801561059757600080fd5b506104dd6105a6366004614fec565b611133565b3480156105b757600080fd5b506104446105c6366004614ed5565b61136b565b3480156105d757600080fd5b5061049a6105e6366004615009565b6113a2565b3480156105f757600080fd5b506018546103e5906001600160a01b031681565b34801561061757600080fd5b506104dd610626366004614fb3565b61144f565b34801561063757600080fd5b506104dd610646366004614fec565b6115b5565b34801561065757600080fd5b50610444610666366004614fec565b601e6020526000908152604090205460ff1681565b34801561068757600080fd5b5060175461044490600160a01b900460ff1681565b3480156106a857600080fd5b5060165461047690600160781b900461ffff1681565b3480156106ca57600080fd5b506104dd6106d9366004614fec565b6117a3565b3480156106ea57600080fd5b5060165461047690600160681b900461ffff1681565b34801561070c57600080fd5b5061049a61071b366004614fec565b611ab5565b34801561072c57600080fd5b506104dd611b14565b34801561074157600080fd5b506104dd610750366004614f01565b611b4a565b34801561076157600080fd5b506017546103e5906001600160a01b031681565b34801561078157600080fd5b5060165461047690600160581b900461ffff1681565b3480156107a357600080fd5b506103e5731ccfe8c40ef259566433716002e379dfffbf5a3e81565b3480156107cb57600080fd5b506001546103e5906001600160a01b031681565b3480156107eb57600080fd5b506104dd6107fa366004614fec565b611bff565b34801561080b57600080fd5b506104dd61081a366004614f31565b611da5565b34801561082b57600080fd5b50601d546103e5906001600160a01b031681565b34801561084b57600080fd5b5061044461085a366004614fec565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561088457600080fd5b506104dd610893366004614fec565b611fa4565b3480156108a457600080fd5b506000546001600160a01b03166103e5565b6104dd6120a5565b3480156108ca57600080fd5b506104dd6108d9366004614fec565b6124fd565b3480156108ea57600080fd5b5060165461047690600160481b900461ffff1681565b34801561090c57600080fd5b506104dd61091b366004614f31565b6127c0565b34801561092c57600080fd5b506104176129bb565b34801561094157600080fd5b506104dd610950366004614fb3565b6129ca565b34801561096157600080fd5b50610444610970366004614ed5565b6129fe565b34801561098157600080fd5b50610444610990366004614ed5565b612a35565b3480156109a157600080fd5b506104dd6109b0366004614f01565b612a42565b3480156109c157600080fd5b5060165461047690600160881b900461ffff1681565b3480156109e357600080fd5b506104446109f2366004614fec565b602080526000908152604090205460ff1681565b348015610a1257600080fd5b5061049a601b5481565b348015610a2857600080fd5b506104dd610a37366004614f31565b612b22565b348015610a4857600080fd5b50601c546103e5906001600160a01b031681565b348015610a6857600080fd5b506104dd610a77366004614f31565b612d27565b348015610a8857600080fd5b5061049a610a9736600461502e565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b348015610ace57600080fd5b5060165461047690610100900461ffff1681565b348015610aee57600080fd5b506104dd610afd366004614fb3565b612f2c565b348015610b0e57600080fd5b506104dd613008565b348015610b2357600080fd5b5060165461047690600160981b900461ffff1681565b348015610b4557600080fd5b50610444610b54366004614fec565b601f6020526000908152604090205460ff1681565b348015610b7557600080fd5b5060165461047690600160381b900461ffff1681565b348015610b9757600080fd5b506104dd610ba6366004614fec565b6130cc565b348015610bb757600080fd5b5060165461047690600160281b900461ffff1681565b348015610bd957600080fd5b5061049a601a5481565b348015610bef57600080fd5b5061049a60195481565b6060600a8054610c089061505c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c349061505c565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c98338484613164565b5060015b92915050565b6000546001600160a01b03163314610cd55760405162461bcd60e51b8152600401610ccc90615096565b60405180910390fd5b612710600754610ce591906150e1565b811015610d3e5760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610ccc565b601a546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601a55565b6000546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff6101008204811691600160681b8104821691600160481b8204811691610de391600160281b9091041687615103565b610ded9190615103565b610df79190615103565b610e019190615103565b61ffff161115610e235760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff63010000008204811691600160781b8104821691600160581b8204811691610e5e91600160381b9091041686615103565b610e689190615103565b610e729190615103565b610e7c9190615103565b61ffff161115610e9e5760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115610ec35760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115610ee85760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f01f5c7a45d273917dfc98816f1dd17a88893a7338e7beaa4d305fc8c84f8fe259181900360800190a16016805463ffffffff60881b1916600160881b61ffff9485160261ffff60981b191617600160981b9290931691909102919091179055565b6000610f8c848484613288565b6001600160a01b038416600090815260046020908152604080832033808552925290912054610fc7918691610fc29086906151cc565b613164565b5060015b9392505050565b6000546001600160a01b03163314610ffc5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166000908152601f602052604090205481151560ff9091161515036110565760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610ccc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b600060085482111561111d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ccc565b6000611127613646565b9050610fcb81846150e1565b6000546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811660009081526005602052604090205460ff166111c55760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610ccc565b60005b60065481101561136757816001600160a01b0316600682815481106111ef576111ef6151df565b6000918252602090912001546001600160a01b031603611355576001600160a01b03821660009081526002602052604090205461122a613646565b6001600160a01b03841660009081526003602052604090205461124d91906151f5565b6001600160a01b03841660009081526002602052604090208190556008546112769083906151cc565b611280919061520c565b6008556001600160a01b0383166000908152600560205260409020805460ff19169055600680546112b3906001906151cc565b815481106112c3576112c36151df565b600091825260209091200154600680546001600160a01b0390921691849081106112ef576112ef6151df565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600680548061132e5761132e61521f565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061135f81615235565b9150506111c8565b5050565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610c98918590610fc290869061520c565b60006007548311156113f65760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ccc565b6000611400613646565b90508261141d57600061141382866151f5565b9250610c9c915050565b600061142885613669565b505050505090506000828261143d91906151f5565b9350610c9c92505050565b5092915050565b6000546001600160a01b031633146114795760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166114cf5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610ccc565b6018546001600160a01b03908116908316036114fd5760405162461bcd60e51b8152600401610ccc9061524e565b601754604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360178054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601e60209081526040808320805460ff199081166001908117909255601f909352922080549091169091179055565b6000546001600160a01b031633146115df5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811660009081526005602052604090205460ff16156116485760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ccc565b60065460329061165990600161520c565b11156116e35760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610ccc565b6001600160a01b0381166000908152600260205260409020541561173d576001600160a01b038116600090815260026020526040902054611723906110b6565b6001600160a01b0382166000908152600360205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b6000546001600160a01b031633146117cd5760405162461bcd60e51b8152600401610ccc90615096565b601c546001600160a01b03908116908216036118375760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610ccc565b601c546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601c80546001600160a01b0319166001600160a01b03831690811790915561189e903090600019613164565b601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191591906152a1565b6001546001600160a01b039081169116146119a657600154601c5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a491906152be565b505b601c546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1491906152a1565b6001546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8991906152a1565b601d80546001600160a01b0319166001600160a01b0383169081179091559091506113679060016136d3565b6001600160a01b03811660009081526005602052604081205460ff1615611af257506001600160a01b031660009081526003602052604090205490565b6001600160a01b038216600090815260026020526040902054610c9c906110b6565b6000546001600160a01b03163314611b3e5760405162461bcd60e51b8152600401610ccc90615096565b611b486000613803565b565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610ccc90615096565b60008111611bbd5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610ccc565b6019546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601955565b6000546001600160a01b03163314611c295760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b038116611c7f5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610ccc565b306001600160a01b03821603611cea5760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610ccc565b6017546001600160a01b03808316911603611d175760405162461bcd60e51b8152600401610ccc9061524e565b6018546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601880546001600160a01b039092166001600160a01b0319909216821790556000908152601e60209081526040808320805460ff199081166001908117909255601f909352922080549091169091179055565b6000546001600160a01b03163314611dcf5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b82048116916101008104821691600160481b8204811691611e0891600160281b9091041687615103565b611e129190615103565b611e1c9190615103565b611e269190615103565b61ffff161115611e485760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b820481169163010000008104821691600160581b8204811691611e8391600160381b9091041686615103565b611e8d9190615103565b611e979190615103565b611ea19190615103565b61ffff161115611ec35760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115611ee85760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115611f0d5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160681b8404811682840152600160781b9093049092166060830152517f2893ef6309f9df0d45b134fcb021eb854592432db91782f02ce6b9029d1470319181900360800190a16016805463ffffffff60681b1916600160681b61ffff9485160261ffff60781b191617600160781b9290931691909102919091179055565b6000546001600160a01b03163314611fce5760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811630036120145760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610ccc565b6120a26120296000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209191906152db565b6001600160a01b0384169190613853565b50565b604080516002808252606082018352600092602083019080368337505060015482519293506001600160a01b0316918391506000906120e6576120e66151df565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061211a5761211a6151df565b6001600160a01b03928316602091820292909201810191909152601c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612173573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219791906152a1565b6001600160a01b0316816000815181106121b3576121b36151df565b60200260200101516001600160a01b03160361223d57601c5460185460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de959234926122069260009288929116904290600401615338565b6000604051808303818588803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b5050505050612345565b6001546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba91906152db565b90506122d4336001546001600160a01b03169030846138bb565b601c54601854604051635c11d79560e01b81526001600160a01b0392831692635c11d795926123119286926000928992911690429060040161536d565b600060405180830381600087803b15801561232b57600080fd5b505af115801561233f573d6000803e3d6000fd5b50505050505b6018546001600160a01b031660009081526005602052604090205460ff1615612433576018546001600160a01b031660009081526003602052604090205460075461239091906151cc565b6007556018546001600160a01b03166000908152600260205260409020546008546123bb91906151cc565b6008556018546001600160a01b03166000818152600360209081526040808320549051908152919291600080516020615433833981519152910160405180910390a3601880546001600160a01b0390811660009081526002602090815260408083208390559354909216815260039091529081205550565b6018546001600160a01b0316600090815260026020526040812054612457906110b6565b90508060075461246791906151cc565b6007556018546001600160a01b031660009081526002602052604090205460085461249291906151cc565b6008556018546040518281526000916001600160a01b0316906000805160206154338339815191529060200160405180910390a350601880546001600160a01b0390811660009081526002602090815260408083208390559354909216815260039091529081205550565b6000546001600160a01b031633146125275760405162461bcd60e51b8152600401610ccc90615096565b6001546001600160a01b039081169082160361259b5760405162461bcd60e51b815260206004820152602d60248201527f5468652062617365546f6b656e466f725061697220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610ccc565b600180546001600160a01b0319166001600160a01b0383811691909117909155601c546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa1580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262191906152a1565b6001546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015612672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269691906152a1565b601d80546001600160a01b0319166001600160a01b03928316179055601c54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa1580156126f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271891906152a1565b6001546001600160a01b039081169116146127a957600154601c5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a791906152be565b505b601d546120a2906001600160a01b031660016136d3565b6000546001600160a01b031633146127ea5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b8104821691600160481b820481169161282591600160281b9091041687615103565b61282f9190615103565b6128399190615103565b6128439190615103565b61ffff1611156128655760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b8104821691600160581b82048116916128a091600160381b9091041686615103565b6128aa9190615103565b6128b49190615103565b6128be9190615103565b61ffff1611156128e05760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff1611156129055760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff16111561292a5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152610100840481168284015263010000009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a16016805464ffffffff00191661010061ffff9485160264ffff00000019161763010000009290931691909102919091179055565b6060600b8054610c089061505c565b6000546001600160a01b031633146129f45760405162461bcd60e51b8152600401610ccc90615096565b61136782826136d3565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610c98918590610fc29086906151cc565b6000610c98338484613288565b6000546001600160a01b03163314612a6c5760405162461bcd60e51b8152600401610ccc90615096565b612710600754612a7c91906150e1565b811015612ae05760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610ccc565b601b546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601b55565b6000546001600160a01b03163314612b4c5760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b81048216916101008204811691612b8591600160281b9091041687615103565b612b8f9190615103565b612b999190615103565b612ba39190615103565b61ffff161115612bc55760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b810482169163010000008204811691612c0091600160381b9091041686615103565b612c0a9190615103565b612c149190615103565b612c1e9190615103565b61ffff161115612c405760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115612c655760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115612c8a5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160481b8404811682840152600160581b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1601680546cffffffff0000000000000000001916600160481b61ffff9485160261ffff60581b191617600160581b9290931691909102919091179055565b6000546001600160a01b03163314612d515760405162461bcd60e51b8152600401610ccc90615096565b60165461012c9061ffff600160881b8204811691600160681b81048216916101008204811691612d8a91600160481b9091041687615103565b612d949190615103565b612d9e9190615103565b612da89190615103565b61ffff161115612dca5760405162461bcd60e51b8152600401610ccc9061511e565b60165461012c9061ffff600160981b8204811691600160781b810482169163010000008204811691612e0591600160581b9091041686615103565b612e0f9190615103565b612e199190615103565b612e239190615103565b61ffff161115612e455760405162461bcd60e51b8152600401610ccc9061514d565b60968261ffff161115612e6a5760405162461bcd60e51b8152600401610ccc9061517b565b60968161ffff161115612e8f5760405162461bcd60e51b8152600401610ccc906151a4565b6016546040805161ffff85811682528481166020830152600160281b8404811682840152600160381b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a16016805468ffffffff00000000001916600160281b61ffff9485160268ffff00000000000000191617600160381b9290931691909102919091179055565b6000546001600160a01b03163314612f565760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b0382166000908152601e602052604090205481151560ff909116151503612fb05760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610ccc565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa991016110aa565b6000546001600160a01b031633146130325760405162461bcd60e51b8152600401610ccc90615096565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461307f576040519150601f19603f3d011682016040523d82523d6000602084013e613084565b606091505b50509050806120a25760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610ccc565b6000546001600160a01b031633146130f65760405162461bcd60e51b8152600401610ccc90615096565b6001600160a01b03811661315b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ccc565b6120a281613803565b6001600160a01b0383166131c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ccc565b6001600160a01b0382166132275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ccc565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166132ec5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ccc565b6001600160a01b03821661334e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ccc565b600061335930611ab5565b6019546016549192508210159060ff161580156133735750805b80156133945750601d54600090613392906001600160a01b0316611ab5565b115b80156133b757506001600160a01b038416600090815260208052604090205460ff165b156133c4576133c46138f9565b6133ff600c8054600d55600e8054600f5560108054601155601280546013556014805460155560009081905590819055908190559182905555565b60165460ff1615801561342b57506001600160a01b0385166000908152601e602052604090205460ff16155b801561345057506001600160a01b0384166000908152601e602052604090205460ff16155b1561351d576001600160a01b038516600090815260208052604090205460ff16156134bc5760165461ffff630100000082048116600c55600160381b82048116600e55600160581b82048116601055600160781b82048116601255600160981b9091041660145561351d565b6001600160a01b038416600090815260208052604090205460ff161561351d5760165461ffff61010082048116600c55600160281b82048116600e55600160481b82048116601055600160681b82048116601255600160881b909104166014555b613528858585614189565b61354b601554601455601354601255600d54600c55600f54600e55601154601055565b60165460ff1661363f576001600160a01b0385166000908152601f602052604090205460ff166135c657601b5483106135c65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610ccc565b6001600160a01b0384166000908152601f602052604090205460ff1661363f57601a546135f285611ab5565b1061363f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610ccc565b5050505050565b6000806000613653614622565b909250905061366281836150e1565b9250505090565b600080600080600080600061367d886147a5565b9050600061368a896147c2565b905060006136978a6147d5565b905060006136a48b6147e8565b905060006136b18c6147fb565b905060006136be8d61480e565b9d959c50939a50919850965094509092505050565b6001600160a01b038216600090815260208052604090205481151560ff9091161515036137685760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610ccc565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556137a25761379d826115b5565b6137ab565b6137ab82611133565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91016110aa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526138b690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614861565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526138f39085906323b872dd60e01b9060840161387f565b50505050565b6016805460ff19166001179055600061391130611ab5565b90506000602354602254602154613928919061520c565b613932919061520c565b905080158061394057508082105b1561394c57505061417d565b6000600260215461395d91906150e1565b90506000601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d891906152a1565b6001546001600160a01b03908116911614613a5e576001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5991906152db565b613a60565b475b9050600080601760149054906101000a900460ff1615613d8c57600060235460225486613a8d919061520c565b613a97919061520c565b90508015613aa857613aa881614933565b601c54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1691906152a1565b6001546001600160a01b03908116911614613ba6576001546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9791906152db565b613ba191906151cc565b613bb0565b613bb085476151cc565b905060008260225483613bc391906151f5565b613bcd91906150e1565b905082613bda88846151f5565b613be491906150e1565b945084613bf182846151cc565b613bfb91906151cc565b93508015613d8457601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a91906152a1565b6001546001600160a01b03918216911603613d2c576017546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613cdc576040519150601f19603f3d011682016040523d82523d6000602084013e613ce1565b606091505b505090508015613d26576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50613d84565b601754600154613d49916001600160a01b03918216911683613853565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613f40565b600060235485613d9c919061520c565b90508015613dad57613dad81614933565b601c54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1b91906152a1565b6001546001600160a01b03908116911614613eab576001546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e9c91906152db565b613ea691906151cc565b613eb5565b613eb585476151cc565b905081613ec287836151f5565b613ecc91906150e1565b9350613ed884826151cc565b60225490935015613f3d57601754602254613f009130916001600160a01b0390911690613288565b60225460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613f505750600082115b15613f9957613f5f8483614b01565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b801561411257601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061401691906152a1565b6001546001600160a01b039182169116036140c1576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b5050905080156140bb576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50614112565b6018546001546140de916001600160a01b03918216911683613853565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602281905560238190556021819055546001600160a01b03161561415b57614156306141486000546001600160a01b031690565b61415130611ab5565b613288565b614176565b6018546141769030906001600160a01b031661415182611ab5565b5050505050505b6016805460ff19169055565b60008060008060008061419b87613669565b95509550955095509550955060006141b1613646565b9050816007546141c191906151cc565b6007556141ce81836151f5565b6008546141db91906151cc565b6008556040518281526000906001600160a01b038c16906000805160206154338339815191529060200160405180910390a38460215461421b919061520c565b60215560225461422c90859061520c565b60225560235461423d90849061520c565b60235560008361424d868861520c565b614257919061520c565b905061426382826151f5565b3060009081526002602052604090205461427d919061520c565b3060009081526002602090815260408083209390935560059052205460ff16156142cd57306000908152600360205260409020546142bc90829061520c565b306000908152600360205260409020555b506001600160a01b038a1660009081526005602052604090205460ff16801561430f57506001600160a01b03891660009081526005602052604090205460ff16155b156143e2576001600160a01b038a166000908152600360205260409020546143389089906151cc565b6001600160a01b038b1660009081526003602052604090205561435b81896151f5565b6001600160a01b038b1660009081526002602052604090205461437e91906151cc565b6001600160a01b038b166000908152600260205260409020556143a181886151f5565b6001600160a01b038a166000908152600260205260409020546143c4919061520c565b6001600160a01b038a166000908152600260205260409020556145c8565b6001600160a01b038a1660009081526005602052604090205460ff1615801561442357506001600160a01b03891660009081526005602052604090205460ff165b156144af5761443281896151f5565b6001600160a01b038b1660009081526002602052604090205461445591906151cc565b6001600160a01b03808c16600090815260026020908152604080832094909455918c1681526003909152205461448c90889061520c565b6001600160a01b038a166000908152600360205260409020556143a181886151f5565b6001600160a01b038a1660009081526005602052604090205460ff1680156144ef57506001600160a01b03891660009081526005602052604090205460ff165b1561453b576001600160a01b038a166000908152600360205260409020546145189089906151cc565b6001600160a01b038b1660009081526003602052604090205561443281896151f5565b61454581896151f5565b6001600160a01b038b1660009081526002602052604090205461456891906151cc565b6001600160a01b038b1660009081526002602052604090205561458b81886151f5565b6001600160a01b038a166000908152600260205260409020546145ae919061520c565b6001600160a01b038a166000908152600260205260409020555b6145db6145d582886151f5565b87614cc2565b886001600160a01b03168a6001600160a01b03166000805160206154338339815191528960405161460e91815260200190565b60405180910390a350505050505050505050565b6008546007546000918291825b60065481101561477457826002600060068481548110614651576146516151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806146bc5750816003600060068481548110614695576146956151df565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156146d257600854600754945094505050509091565b60026000600683815481106146e9576146e96151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461471890846151cc565b92506003600060068381548110614731576147316151df565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461476090836151cc565b91508061476c81615235565b91505061462f565b5060075460085461478591906150e1565b82101561479c576008546007549350935050509091565b90939092509050565b60006103e8600c54836147b891906151f5565b610c9c91906150e1565b60006103e8600e54836147b891906151f5565b60006103e8601054836147b891906151f5565b60006103e8601254836147b891906151f5565b60006103e8601454836147b891906151f5565b60006103e8601054600e54600c546012546014546103e861482f91906151cc565b61483991906151cc565b61484391906151cc565b61484d91906151cc565b61485791906151cc565b6147b890846151f5565b60006148b6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614ce89092919063ffffffff16565b8051909150156138b657808060200190518101906148d491906152be565b6138b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ccc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614968576149686151df565b6001600160a01b0392831660209182029290920101526001805483519216918391908110614998576149986151df565b6001600160a01b03928316602091820292909201810191909152601c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156149f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a1591906152a1565b6001600160a01b031681600181518110614a3157614a316151df565b60200260200101516001600160a01b031603614ab657601c5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614a8090859060009086903090429060040161536d565b600060405180830381600087803b158015614a9a57600080fd5b505af1158015614aae573d6000803e3d6000fd5b505050505050565b601c54604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e9943691614a80916001600160a01b0316908690600090879042906004016153a9565b601c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7891906152a1565b6001546001600160a01b03918216911603614c2057601c5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614bfb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061363f91906153e8565b601c5460015460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614c9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363f91906153e8565b81600854614cd091906151cc565b600855600954614ce190829061520c565b6009555050565b6060614cf78484600085614cff565b949350505050565b606082471015614d605760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ccc565b6001600160a01b0385163b614db75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ccc565b600080866001600160a01b03168587604051614dd39190615416565b60006040518083038185875af1925050503d8060008114614e10576040519150601f19603f3d011682016040523d82523d6000602084013e614e15565b606091505b5091509150614e25828286614e30565b979650505050505050565b60608315614e3f575081610fcb565b825115614e4f5782518084602001fd5b8160405162461bcd60e51b8152600401610ccc9190614e8d565b60005b83811015614e84578181015183820152602001614e6c565b50506000910152565b6020815260008251806020840152614eac816040850160208701614e69565b601f01601f19169190910160400192915050565b6001600160a01b03811681146120a257600080fd5b60008060408385031215614ee857600080fd5b8235614ef381614ec0565b946020939093013593505050565b600060208284031215614f1357600080fd5b5035919050565b803561ffff81168114614f2c57600080fd5b919050565b60008060408385031215614f4457600080fd5b614f4d83614f1a565b9150614f5b60208401614f1a565b90509250929050565b600080600060608486031215614f7957600080fd5b8335614f8481614ec0565b92506020840135614f9481614ec0565b929592945050506040919091013590565b80151581146120a257600080fd5b60008060408385031215614fc657600080fd5b8235614fd181614ec0565b91506020830135614fe181614fa5565b809150509250929050565b600060208284031215614ffe57600080fd5b8135610fcb81614ec0565b6000806040838503121561501c57600080fd5b823591506020830135614fe181614fa5565b6000806040838503121561504157600080fd5b823561504c81614ec0565b91506020830135614fe181614ec0565b600181811c9082168061507057607f821691505b60208210810361509057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826150fe57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff818116838216019080821115611448576114486150cb565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b81810381811115610c9c57610c9c6150cb565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c9c57610c9c6150cb565b80820180821115610c9c57610c9c6150cb565b634e487b7160e01b600052603160045260246000fd5b600060018201615247576152476150cb565b5060010190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b6000602082840312156152b357600080fd5b8151610fcb81614ec0565b6000602082840312156152d057600080fd5b8151610fcb81614fa5565b6000602082840312156152ed57600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561532d5781516001600160a01b031687529582019590820190600101615308565b509495945050505050565b84815260806020820152600061535160808301866152f4565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061538c60a08301866152f4565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a0606082015260006153d660a08301856152f4565b90508260808301529695505050505050565b6000806000606084860312156153fd57600080fd5b8351925060208401519150604084015190509250925092565b60008251615428818460208701614e69565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204f5de6a43eec31e653f04b8bbb5462b4cb3f090da2defcffdc9d19bc2c35a58e64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000035ca6f43f8580fbe9711bcd0db5b2518838af62f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007cb1126fd682b46cddc264c397d4cab7340a313200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000746697265626f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746495245424f5400000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : __name (string): Firebot
Arg [1] : __symbol (string): FIREBOT
Arg [2] : __decimals (uint8): 18
Arg [3] : _totalSupply (uint256): 1000000000000000000000000
Arg [4] : _maxWallet (uint256): 1000000000000000000000000
Arg [5] : _maxTransactionAmount (uint256): 1000000000000000000000000
Arg [6] : _accounts (address[4]): 0x35cA6f43F8580FBe9711Bcd0dB5b2518838af62f,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x7CB1126FD682B46CDdC264c397D4cAb7340A3132
Arg [7] : _isMarketingFeeBaseToken (bool): True
Arg [8] : _fees (uint16[10]): 1,1,2,2,0,0,0,0,2,2

-----Encoded View---------------
25 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [4] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [5] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [6] : 00000000000000000000000035ca6f43f8580fbe9711bcd0db5b2518838af62f
Arg [7] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [8] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [9] : 0000000000000000000000007cb1126fd682b46cddc264c397d4cab7340a3132
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [22] : 46697265626f7400000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [24] : 46495245424f5400000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

26432:39511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26641:83;;;;;;;;;;;;26681:42;26641:83;;;;;-1:-1:-1;;;;;191:32:1;;;173:51;;161:2;146:18;26641:83:0;;;;;;;;43782:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44779:193::-;;;;;;;;;;-1:-1:-1;44779:193:0;;;;;:::i;:::-;;:::i;:::-;;;1512:14:1;;1505:22;1487:41;;1475:2;1460:18;44779:193:0;1347:187:1;27720:26:0;;;;;;;;;;-1:-1:-1;27720:26:0;;;;;;;;;;;;;;1713:6:1;1701:19;;;1683:38;;1671:2;1656:18;27720:26:0;1539:188:1;46156:89:0;;;;;;;;;;-1:-1:-1;46227:10:0;;46156:89;;;1878:25:1;;;1866:2;1851:18;46156:89:0;1732:177:1;44065:97:0;;;;;;;;;;-1:-1:-1;44147:7:0;;44065:97;;39680:243;;;;;;;;;;-1:-1:-1;39680:243:0;;;;;:::i;:::-;;:::i;:::-;;52360:794;;;;;;;;;;-1:-1:-1;52360:794:0;;;;;:::i;:::-;;:::i;44980:350::-;;;;;;;;;;-1:-1:-1;44980:350:0;;;;;:::i;:::-;;:::i;55759:323::-;;;;;;;;;;-1:-1:-1;55759:323:0;;;;;:::i;:::-;;:::i;46981:319::-;;;;;;;;;;-1:-1:-1;46981:319:0;;;;;:::i;:::-;;:::i;43972:85::-;;;;;;;;;;-1:-1:-1;44040:9:0;;-1:-1:-1;;;44040:9:0;;;;43972:85;;3667:4:1;3655:17;;;3637:36;;3625:2;3610:18;43972:85:0;3495:184:1;47812:613:0;;;;;;;;;;-1:-1:-1;47812:613:0;;;;;:::i;:::-;;:::i;45338:299::-;;;;;;;;;;-1:-1:-1;45338:299:0;;;;;:::i;:::-;;:::i;46253:720::-;;;;;;;;;;-1:-1:-1;46253:720:0;;;;;:::i;:::-;;:::i;28120:29::-;;;;;;;;;;-1:-1:-1;28120:29:0;;;;-1:-1:-1;;;;;28120:29:0;;;53162:701;;;;;;;;;;-1:-1:-1;53162:701:0;;;;;:::i;:::-;;:::i;47308:496::-;;;;;;;;;;-1:-1:-1;47308:496:0;;;;;:::i;:::-;;:::i;28354:49::-;;;;;;;;;;-1:-1:-1;28354:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28078:35;;;;;;;;;;-1:-1:-1;28078:35:0;;;;-1:-1:-1;;;28078:35:0;;;;;;27939:28;;;;;;;;;;-1:-1:-1;27939:28:0;;;;-1:-1:-1;;;27939:28:0;;;;;;36538:754;;;;;;;;;;-1:-1:-1;36538:754:0;;;;;:::i;:::-;;:::i;27903:29::-;;;;;;;;;;-1:-1:-1;27903:29:0;;;;-1:-1:-1;;;27903:29:0;;;;;;44170:198;;;;;;;;;;-1:-1:-1;44170:198:0;;;;;:::i;:::-;;:::i;12459:103::-;;;;;;;;;;;;;:::i;54522:322::-;;;;;;;;;;-1:-1:-1;54522:322:0;;;;;:::i;:::-;;:::i;28041:30::-;;;;;;;;;;-1:-1:-1;28041:30:0;;;;-1:-1:-1;;;;;28041:30:0;;;27865:29;;;;;;;;;;-1:-1:-1;27865:29:0;;;;-1:-1:-1;;;27865:29:0;;;;;;26514:120;;;;;;;;;;;;26591:42;26514:120;;26731:31;;;;;;;;;;-1:-1:-1;26731:31:0;;;;-1:-1:-1;;;;;26731:31:0;;;53871:643;;;;;;;;;;-1:-1:-1;53871:643:0;;;;;:::i;:::-;;:::i;51502:850::-;;;;;;;;;;-1:-1:-1;51502:850:0;;;;;:::i;:::-;;:::i;28322:23::-;;;;;;;;;;-1:-1:-1;28322:23:0;;;;-1:-1:-1;;;;;28322:23:0;;;45994:154;;;;;;;;;;-1:-1:-1;45994:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;46120:20:0;46091:4;46120:20;;;:11;:20;;;;;;;;;45994:154;65698:207;;;;;;;;;;-1:-1:-1;65698:207:0;;;;;:::i;:::-;;:::i;11808:87::-;;;;;;;;;;-1:-1:-1;11854:7:0;11881:6;-1:-1:-1;;;;;11881:6:0;11808:87;;63770:1732;;;:::i;35909:621::-;;;;;;;;;;-1:-1:-1;35909:621:0;;;;;:::i;:::-;;:::i;27828:30::-;;;;;;;;;;-1:-1:-1;27828:30:0;;;;-1:-1:-1;;;27828:30:0;;;;;;50672:822;;;;;;;;;;-1:-1:-1;50672:822:0;;;;;:::i;:::-;;:::i;43875:89::-;;;;;;;;;;;;;:::i;54852:163::-;;;;;;;;;;-1:-1:-1;54852:163:0;;;;;:::i;:::-;;:::i;45645:341::-;;;;;;;;;;-1:-1:-1;45645:341:0;;;;;:::i;:::-;;:::i;44376:201::-;;;;;;;;;;-1:-1:-1;44376:201:0;;;;;:::i;:::-;;:::i;39931:367::-;;;;;;;;;;-1:-1:-1;39931:367:0;;;;;:::i;:::-;;:::i;27976:25::-;;;;;;;;;;-1:-1:-1;27976:25:0;;;;-1:-1:-1;;;27976:25:0;;;;;;28483:57;;;;;;;;;;-1:-1:-1;28483:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28233:35;;;;;;;;;;;;;;;;49802:862;;;;;;;;;;-1:-1:-1;49802:862:0;;;;;:::i;:::-;;:::i;28279:36::-;;;;;;;;;;-1:-1:-1;28279:36:0;;;;-1:-1:-1;;;;;28279:36:0;;;48932:862;;;;;;;;;;-1:-1:-1;48932:862:0;;;;;:::i;:::-;;:::i;44585:186::-;;;;;;;;;;-1:-1:-1;44585:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;44736:18:0;;;44704:7;44736:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;44585:186;27686:27;;;;;;;;;;-1:-1:-1;27686:27:0;;;;;;;;;;;55517:234;;;;;;;;;;-1:-1:-1;55517:234:0;;;;;:::i;:::-;;:::i;65508:184::-;;;;;;;;;;;;;:::i;28008:24::-;;;;;;;;;;-1:-1:-1;28008:24:0;;;;-1:-1:-1;;;28008:24:0;;;;;;28410:66;;;;;;;;;;-1:-1:-1;28410:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27790:29;;;;;;;;;;-1:-1:-1;27790:29:0;;;;-1:-1:-1;;;27790:29:0;;;;;;12717:201;;;;;;;;;;-1:-1:-1;12717:201:0;;;;;:::i;:::-;;:::i;27753:30::-;;;;;;;;;;-1:-1:-1;27753:30:0;;;;-1:-1:-1;;;27753:30:0;;;;;;28202:24;;;;;;;;;;;;;;;;28162:33;;;;;;;;;;;;;;;;43782:85;43821:13;43854:5;43847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43782:85;:::o;44779:193::-;44881:4;44903:39;11262:10;44926:7;44935:6;44903:8;:39::i;:::-;-1:-1:-1;44960:4:0;44779:193;;;;;:::o;39680:243::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;;;;;;;;;39785:5:::1;39775:7;;:15;;;;:::i;:::-;39763:10;:27;;39755:73;;;::::0;-1:-1:-1;;;39755:73:0;;6621:2:1;39755:73:0::1;::::0;::::1;6603:21:1::0;6660:2;6640:18;;;6633:30;6699:34;6679:18;;;6672:62;-1:-1:-1;;;6750:18:1;;;6743:31;6791:19;;39755:73:0::1;6419:397:1::0;39755:73:0::1;39872:9;::::0;39844:38:::1;::::0;;6995:25:1;;;7051:2;7036:18;;7029:34;;;;39844:38:0::1;::::0;6968:18:1;39844:38:0::1;;;;;;;39893:9;:22:::0;39680:243::o;52360:794::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;52572:13:::1;::::0;52589:3:::1;::::0;52572:13:::1;;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52554:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52534:16:0;::::1;::::0;::::1;::::0;52501:31:::1;::::0;-1:-1:-1;;;52515:16:0;;::::1;;52501:12:::0;:31:::1;:::i;:::-;:50;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;;;:::i;:::-;:91;;;;52479:162;;;;-1:-1:-1::0;;;52479:162:0::1;;;;;;;:::i;:::-;52741:12;::::0;52757:3:::1;::::0;52741:12:::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;52724:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52705:15:0;::::1;::::0;::::1;::::0;52674:29:::1;::::0;-1:-1:-1;;;52687:15:0;;::::1;;52674:11:::0;:29:::1;:::i;:::-;:47;;;;:::i;:::-;:64;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;52652:156;;;;-1:-1:-1::0;;;52652:156:0::1;;;;;;;:::i;:::-;52842:3;52827:12;:18;;;;52819:46;;;;-1:-1:-1::0;;;52819:46:0::1;;;;;;;:::i;:::-;52898:3;52884:11;:17;;;;52876:44;;;;-1:-1:-1::0;;;52876:44:0::1;;;;;;;:::i;:::-;53018:11;::::0;52936:130:::1;::::0;;53018:11:::1;8899:15:1::0;;;8881:34;;8951:15;;;8946:2;8931:18;;8924:43;-1:-1:-1;;;53018:11:0;::::1;::::0;::::1;8983:18:1::0;;;8976:43;-1:-1:-1;;;53045:10:0;;::::1;::::0;;::::1;9050:2:1::0;9035:18;;9028:43;52936:130:0;::::1;::::0;;;;8843:3:1;52936:130:0;;::::1;53077:11;:26:::0;;-1:-1:-1;;;;53114:24:0;-1:-1:-1;;;53077:26:0::1;::::0;;::::1;;-1:-1:-1::0;;;;53114:24:0;;-1:-1:-1;;;53114:24:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;52360:794::o;44980:350::-;45114:4;45131:36;45141:6;45149:9;45160:6;45131:9;:36::i;:::-;-1:-1:-1;;;;;45249:19:0;;;;;;:11;:19;;;;;;;;11262:10;45249:33;;;;;;;;;45178:122;;45201:6;;45249:40;;45283:6;;45249:40;:::i;:::-;45178:8;:122::i;:::-;-1:-1:-1;45318:4:0;44980:350;;;;;;:::o;55759:323::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55889:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;55881:69:::1;;;::::0;-1:-1:-1;;;55881:69:0;;9417:2:1;55881:69:0::1;::::0;::::1;9399:21:1::0;9456:1;9436:18;;;9429:29;-1:-1:-1;;;9474:18:1;;;9467:37;9521:18;;55881:69:0::1;9215:330:1::0;55881:69:0::1;-1:-1:-1::0;;;;;55961:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:50;;-1:-1:-1;;55961:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;56027:47;;1487:41:1;;;56027:47:0::1;::::0;1460:18:1;56027:47:0::1;;;;;;;;55759:323:::0;;:::o;46981:319::-;47075:7;47133;;47122;:18;;47100:110;;;;-1:-1:-1;;;47100:110:0;;9752:2:1;47100:110:0;;;9734:21:1;9791:2;9771:18;;;9764:30;9830:34;9810:18;;;9803:62;-1:-1:-1;;;9881:18:1;;;9874:40;9931:19;;47100:110:0;9550:406:1;47100:110:0;47221:19;47243:10;:8;:10::i;:::-;47221:32;-1:-1:-1;47271:21:0;47221:32;47271:7;:21;:::i;47812:613::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47890:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;47882:56;;;::::0;-1:-1:-1;;;47882:56:0;;10163:2:1;47882:56:0::1;::::0;::::1;10145:21:1::0;10202:2;10182:18;;;10175:30;10241:25;10221:18;;;10214:53;10284:18;;47882:56:0::1;9961:347:1::0;47882:56:0::1;47954:9;47949:469;47973:9;:16:::0;47969:20;::::1;47949:469;;;48031:7;-1:-1:-1::0;;;;;48015:23:0::1;:9;48025:1;48015:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;48015:12:0::1;:23:::0;48011:396:::1;;-1:-1:-1::0;;;;;48079:16:0;::::1;48059:19;48079:16:::0;;;:7:::1;:16;::::0;;;;;48148:10:::1;:8;:10::i;:::-;-1:-1:-1::0;;;;;48131:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;:27:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;48114:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:44;;;48185:7:::1;::::0;:19:::1;::::0;48193:11;;48185:19:::1;:::i;:::-;:36;;;;:::i;:::-;48177:7;:44:::0;-1:-1:-1;;;;;48240:20:0;::::1;48263:5;48240:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;48240:28:0::1;::::0;;48302:9:::1;48312:16:::0;;:20:::1;::::0;48240:28;;48312:20:::1;:::i;:::-;48302:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;48287:9:::1;:12:::0;;-1:-1:-1;;;;;48302:31:0;;::::1;::::0;48297:1;;48287:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;48287:46:0::1;;;;;-1:-1:-1::0;;;;;48287:46:0::1;;;;;;48352:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;48352:15:0;;;;;-1:-1:-1;;;;;;48352:15:0::1;::::0;;;;;-1:-1:-1;47949:469:0::1;47812:613:::0;:::o;48011:396::-:1;47991:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47949:469;;;;47812:613:::0;:::o;45338:299::-;11262:10;45455:4;45549:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45549:34:0;;;;;;;;;;45455:4;;45477:130;;45527:7;;45549:47;;45585:10;;45549:47;:::i;46253:720::-;46373:7;46417;;46406;:18;;46398:62;;;;-1:-1:-1;;;46398:62:0;;11222:2:1;46398:62:0;;;11204:21:1;11261:2;11241:18;;;11234:30;11300:33;11280:18;;;11273:61;11351:18;;46398:62:0;11020:355:1;46398:62:0;46471:19;46493:10;:8;:10::i;:::-;46471:32;;46519:17;46514:452;;46565:15;46583:19;46591:11;46583:7;:19;:::i;:::-;46565:37;-1:-1:-1;46617:14:0;;-1:-1:-1;;46617:14:0;46514:452;46694:23;46827:20;46839:7;46827:11;:20::i;:::-;46664:183;;;;;;;46862:23;46906:11;46888:15;:29;;;;:::i;:::-;46862:55;-1:-1:-1;46932:22:0;;-1:-1:-1;;;46932:22:0;46514:452;46387:586;46253:720;;;;:::o;53162:701::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53313:30:0;::::1;53305:70;;;::::0;-1:-1:-1;;;53305:70:0;;11582:2:1;53305:70:0::1;::::0;::::1;11564:21:1::0;11621:2;11601:18;;;11594:30;11660:29;11640:18;;;11633:57;11707:18;;53305:70:0::1;11380:351:1::0;53305:70:0::1;53414:14;::::0;-1:-1:-1;;;;;53414:14:0;;::::1;53394:34:::0;;::::1;::::0;53386:98:::1;;;;-1:-1:-1::0;;;53386:98:0::1;;;;;;;:::i;:::-;53579:15;::::0;53500:120:::1;::::0;;12343:14:1;;12336:22;12318:41;;-1:-1:-1;;;53596:23:0;::::1;;;12402:14:1::0;12395:22;12390:2;12375:18;;12368:50;-1:-1:-1;;;;;53579:15:0;;::::1;::::0;53500:120;::::1;::::0;::::1;::::0;12291:18:1;53500:120:0::1;;;;;;;53631:15;:34:::0;;53676:50;::::1;;-1:-1:-1::0;;;53676:50:0::1;-1:-1:-1::0;;;;;;53676:50:0;;;-1:-1:-1;;;;;53631:34:0;;::::1;53676:50:::0;;;;;;::::1;::::0;;53631:15:::1;53737:35:::0;;;:17:::1;:35;::::0;;;;;;;:42;;-1:-1:-1;;53737:42:0;;::::1;53631:34:::0;53737:42;;::::1;::::0;;;53794:34:::1;:52:::0;;;;;:57;;;;::::1;::::0;;::::1;::::0;;53162:701::o;47308:496::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47389:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;47388:21;47380:61;;;::::0;-1:-1:-1;;;47380:61:0;;12631:2:1;47380:61:0::1;::::0;::::1;12613:21:1::0;12670:2;12650:18;;;12643:30;12709:29;12689:18;;;12682:57;12756:18;;47380:61:0::1;12429:351:1::0;47380:61:0::1;47474:9;:16:::0;47498:2:::1;::::0;47474:20:::1;::::0;47493:1:::1;47474:20;:::i;:::-;:26;;47452:153;;;::::0;-1:-1:-1;;;47452:153:0;;12987:2:1;47452:153:0::1;::::0;::::1;12969:21:1::0;13026:2;13006:18;;;12999:30;13065:34;13045:18;;;13038:62;13136:34;13116:18;;;13109:62;-1:-1:-1;;;13187:19:1;;;13180:44;13241:19;;47452:153:0::1;12785:481:1::0;47452:153:0::1;-1:-1:-1::0;;;;;47620:16:0;::::1;47639:1;47620:16:::0;;;:7:::1;:16;::::0;;;;;:20;47616:109:::1;;-1:-1:-1::0;;;;;47696:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;47676:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;47657:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;47616:109:::1;-1:-1:-1::0;;;;;47735:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;47735:27:0::1;47758:4;47735:27:::0;;::::1;::::0;;;47773:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;47773:23:0::1;::::0;;::::1;::::0;;47308:496::o;36538:754::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;36661:10:::1;::::0;-1:-1:-1;;;;;36661:10:0;;::::1;36639:33:::0;;::::1;::::0;36617:118:::1;;;::::0;-1:-1:-1;;;36617:118:0;;13473:2:1;36617:118:0::1;::::0;::::1;13455:21:1::0;13512:2;13492:18;;;13485:30;13551:34;13531:18;;;13524:62;-1:-1:-1;;;13602:18:1;;;13595:33;13645:19;;36617:118:0::1;13271:399:1::0;36617:118:0::1;36793:10;::::0;36751:54:::1;::::0;-1:-1:-1;;;;;36793:10:0;;::::1;::::0;36751:54;::::1;::::0;::::1;::::0;36793:10:::1;::::0;36751:54:::1;36816:10;:43:::0;;-1:-1:-1;;;;;;36816:43:0::1;-1:-1:-1::0;;;;;36816:43:0;::::1;::::0;;::::1;::::0;;;36870:49:::1;::::0;36887:4:::1;::::0;-1:-1:-1;;36870:8:0::1;:49::i;:::-;36953:10;;;;;;;;;-1:-1:-1::0;;;;;36953:10:0::1;-1:-1:-1::0;;;;;36953:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36933:16;::::0;-1:-1:-1;;;;;36933:16:0;;::::1;:37:::0;::::1;;36930:138;;36993:16;::::0;37027:10:::1;::::0;36986:58:::1;::::0;-1:-1:-1;;;36986:58:0;;-1:-1:-1;;;;;37027:10:0;;::::1;36986:58;::::0;::::1;14105:51:1::0;-1:-1:-1;;14172:18:1;;;14165:34;36993:16:0;::::1;::::0;36986:32:::1;::::0;14078:18:1;;36986:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36930:138;37119:10;::::0;:20:::1;::::0;;-1:-1:-1;;;37119:20:0;;;;37081:17:::1;::::0;-1:-1:-1;;;;;37119:10:0::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:20:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37181:16;::::0;37101:97:::1;::::0;-1:-1:-1;;;37101:97:0;;37174:4:::1;37101:97;::::0;::::1;14672:34:1::0;-1:-1:-1;;;;;37181:16:0;;::::1;14722:18:1::0;;;14715:43;37101:64:0;::::1;::::0;::::1;::::0;14607:18:1;;37101:97:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37209:8;:20:::0;;-1:-1:-1;;;;;;37209:20:0::1;-1:-1:-1::0;;;;;37209:20:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;37240:44:0::1;::::0;-1:-1:-1;37240:28:0::1;:44::i;44170:198::-:0;-1:-1:-1;;;;;44260:20:0;;44236:7;44260:20;;;:11;:20;;;;;;;;44256:49;;;-1:-1:-1;;;;;;44289:16:0;;;;;:7;:16;;;;;;;44170:198::o;44256:49::-;-1:-1:-1;;;;;44343:16:0;;;;;;:7;:16;;;;;;44323:37;;:19;:37::i;12459:103::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;12524:30:::1;12551:1;12524:18;:30::i;:::-;12459:103::o:0;54522:322::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;54668:1:::1;54646:19;:23;54638:58;;;::::0;-1:-1:-1;;;54638:58:0;;14971:2:1;54638:58:0::1;::::0;::::1;14953:21:1::0;15010:2;14990:18;;;14983:30;-1:-1:-1;;;15029:18:1;;;15022:52;15091:18;;54638:58:0::1;14769:346:1::0;54638:58:0::1;54758:18;::::0;54712:65:::1;::::0;;6995:25:1;;;7051:2;7036:18;;7029:34;;;;54712:65:0::1;::::0;6968:18:1;54712:65:0::1;;;;;;;54788:18;:40:::0;54522:322::o;53871:643::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53980:29:0;::::1;53972:68;;;::::0;-1:-1:-1;;;53972:68:0;;15322:2:1;53972:68:0::1;::::0;::::1;15304:21:1::0;15361:2;15341:18;;;15334:30;15400:28;15380:18;;;15373:56;15446:18;;53972:68:0::1;15120:350:1::0;53972:68:0::1;54086:4;-1:-1:-1::0;;;;;54059:32:0;::::1;::::0;54051:87:::1;;;::::0;-1:-1:-1;;;54051:87:0;;15677:2:1;54051:87:0::1;::::0;::::1;15659:21:1::0;15716:2;15696:18;;;15689:30;15755:34;15735:18;;;15728:62;-1:-1:-1;;;15806:18:1;;;15799:40;15856:19;;54051:87:0::1;15475:406:1::0;54051:87:0::1;54157:15;::::0;-1:-1:-1;;;;;54157:34:0;;::::1;:15:::0;::::1;:34:::0;54149:98:::1;;;;-1:-1:-1::0;;;54149:98:0::1;;;;;;;:::i;:::-;54314:14;::::0;54263:66:::1;::::0;-1:-1:-1;;;;;54314:14:0;;::::1;::::0;54263:66;::::1;::::0;::::1;::::0;54314:14:::1;::::0;54263:66:::1;54340:14;:32:::0;;-1:-1:-1;;;;;54340:32:0;;::::1;-1:-1:-1::0;;;;;;54340:32:0;;::::1;::::0;::::1;::::0;;:14:::1;54383:34:::0;;;:17:::1;:34;::::0;;;;;;;:41;;-1:-1:-1;;54383:41:0;;::::1;54340:32:::0;54383:41;;::::1;::::0;;;54439:34:::1;:51:::0;;;;;:56;;;;::::1;::::0;;::::1;::::0;;53871:643::o;51502:850::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;51728:11:::1;::::0;51743:3:::1;::::0;51728:11:::1;-1:-1:-1::0;;;51728:11:0;::::1;::::0;::::1;::::0;::::1;51712:13:::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;51692:16:0;::::1;::::0;::::1;::::0;51655:35:::1;::::0;-1:-1:-1;;;51673:16:0;;::::1;;51655::::0;:35:::1;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:91;;;;51633:162;;;;-1:-1:-1::0;;;51633:162:0::1;;;;;;;:::i;:::-;51897:10;::::0;51911:3:::1;::::0;51897:10:::1;-1:-1:-1::0;;;51897:10:0;::::1;::::0;::::1;::::0;51882:12;;::::1;::::0;::::1;::::0;-1:-1:-1;;;51863:15:0;::::1;::::0;::::1;::::0;51828:33:::1;::::0;-1:-1:-1;;;51845:15:0;;::::1;;51828::::0;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;51806:156;;;;-1:-1:-1::0;;;51806:156:0::1;;;;;;;:::i;:::-;52000:3;51981:16;:22;;;;51973:50;;;;-1:-1:-1::0;;;51973:50:0::1;;;;;;;:::i;:::-;52060:3;52042:15;:21;;;;52034:48;;;;-1:-1:-1::0;;;52034:48:0::1;;;;;;;:::i;:::-;52192:15;::::0;52098:150:::1;::::0;;52192:15:::1;8899::1::0;;;8881:34;;8951:15;;;8946:2;8931:18;;8924:43;-1:-1:-1;;;52192:15:0;::::1;::::0;::::1;8983:18:1::0;;;8976:43;-1:-1:-1;;;52223:14:0;;::::1;::::0;;::::1;9050:2:1::0;9035:18;;9028:43;52098:150:0;::::1;::::0;;;;8843:3:1;52098:150:0;;::::1;52259:15;:34:::0;;-1:-1:-1;;;;52304:32:0;-1:-1:-1;;;52259:34:0::1;::::0;;::::1;;-1:-1:-1::0;;;;52304:32:0;;-1:-1:-1;;;52304:32:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;51502:850::o;65698:207::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65773:22:0;::::1;65781:4;65773:22:::0;65765:46:::1;;;::::0;-1:-1:-1;;;65765:46:0;;16088:2:1;65765:46:0::1;::::0;::::1;16070:21:1::0;16127:2;16107:18;;;16100:30;-1:-1:-1;;;16146:18:1;;;16139:41;16197:18;;65765:46:0::1;15886:335:1::0;65765:46:0::1;65822:75;65849:7;11854::::0;11881:6;-1:-1:-1;;;;;11881:6:0;;11808:87;65849:7:::1;65858:38;::::0;-1:-1:-1;;;65858:38:0;;65890:4:::1;65858:38;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;65858:23:0;::::1;::::0;::::1;::::0;146:18:1;;65858:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65822:26:0;::::1;::::0;:75;:26:::1;:75::i;:::-;65698:207:::0;:::o;63770:1732::-;63845:16;;;63859:1;63845:16;;;;;;;;63821:21;;63845:16;;;;;;;;-1:-1:-1;;63882:16:0;;63872:7;;;;-1:-1:-1;;;;;;63882:16:0;;63872:7;;-1:-1:-1;63882:16:0;;63872:7;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;63872:26:0;;;-1:-1:-1;;;;;63872:26:0;;;;;63927:4;63909;63914:1;63909:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63909:23:0;;;:7;;;;;;;;;;:23;;;;63968:10;;:17;;;-1:-1:-1;;;63968:17:0;;;;:10;;;;;:15;;:17;;;;;63909:7;;63968:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63957:28:0;:4;63962:1;63957:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;63957:28:0;;63953:749;;64001:10;;64175:14;;64001:237;;-1:-1:-1;;;64001:237:0;;-1:-1:-1;;;;;64001:10:0;;;;:61;;64069:9;;64001:237;;:10;;64152:4;;64175:14;;;64208:15;;64001:237;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63953:749;;;64293:16;;64269:14;;-1:-1:-1;;;;;64293:16:0;64286:34;11262:10;64286:48;;-1:-1:-1;;;;;;64286:48:0;;;;;;;-1:-1:-1;;;;;191:32:1;;;64286:48:0;;;173:51:1;146:18;;64286:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64269:65;-1:-1:-1;64349:78:0;11262:10;64356:16;;-1:-1:-1;;;;;64356:16:0;;64413:4;64420:6;64349:41;:78::i;:::-;64442:10;;64627:14;;64442:248;;-1:-1:-1;;;64442:248:0;;-1:-1:-1;;;;;64442:10:0;;;;:64;;:248;;64525:6;;64442:10;;64604:4;;64627:14;;;64660:15;;64442:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64254:448;63953:749;64768:14;;-1:-1:-1;;;;;64768:14:0;64756:27;;;;:11;:27;;;;;;;;64753:723;;;64831:14;;-1:-1:-1;;;;;64831:14:0;64823:23;;;;:7;:23;;;;;;64813:7;;:33;;64823:23;64813:33;:::i;:::-;64803:7;:43;64893:14;;-1:-1:-1;;;;;64893:14:0;64885:23;;;;:7;:23;;;;;;64875:7;;:33;;64885:23;64875:33;:::i;:::-;64865:7;:43;64941:14;;-1:-1:-1;;;;;64941:14:0;64965:1;64969:23;;;:7;:23;;;;;;;;;64932:61;;1878:25:1;;;64965:1:0;;64941:14;-1:-1:-1;;;;;;;;;;;64932:61:0;1851:18:1;64932:61:0;;;;;;;65020:14;;;-1:-1:-1;;;;;65020:14:0;;;65038:1;65012:23;;;:7;:23;;;;;;;;:27;;;65066:14;;;;;65058:23;;:7;:23;;;;;;:27;65698:207;:::o;64753:723::-;65175:14;;-1:-1:-1;;;;;65175:14:0;65130;65167:23;;;:7;:23;;;;;;65147:44;;:19;:44::i;:::-;65130:61;;65230:6;65220:7;;:16;;;;:::i;:::-;65210:7;:26;65283:14;;-1:-1:-1;;;;;65283:14:0;65275:23;;;;:7;:23;;;;;;65265:7;;:33;;65275:23;65265:33;:::i;:::-;65255:7;:43;65331:14;;65322:44;;1878:25:1;;;65355:1:0;;-1:-1:-1;;;;;65331:14:0;;-1:-1:-1;;;;;;;;;;;65322:44:0;1866:2:1;1851:18;65322:44:0;;;;;;;-1:-1:-1;65393:14:0;;;-1:-1:-1;;;;;65393:14:0;;;65411:1;65385:23;;;:7;:23;;;;;;;;:27;;;65439:14;;;;;65431:23;;:7;:23;;;;;;:27;63810:1692;63770:1732::o;35909:621::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;36043:16:::1;::::0;-1:-1:-1;;;;;36043:16:0;;::::1;36022:37:::0;;::::1;::::0;36000:132:::1;;;::::0;-1:-1:-1;;;36000:132:0;;18317:2:1;36000:132:0::1;::::0;::::1;18299:21:1::0;18356:2;18336:18;;;18329:30;18395:34;18375:18;;;18368:62;-1:-1:-1;;;18446:18:1;;;18439:43;18499:19;;36000:132:0::1;18115:409:1::0;36000:132:0::1;36143:16;:34:::0;;-1:-1:-1;;;;;;36143:34:0::1;-1:-1:-1::0;;;;;36143:34:0;;::::1;::::0;;;::::1;::::0;;;36217:10:::1;::::0;:20:::1;::::0;;-1:-1:-1;;;36217:20:0;;;;:10;;;::::1;::::0;:18:::1;::::0;:20:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:20:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36292:16;::::0;36199:120:::1;::::0;-1:-1:-1;;;36199:120:0;;36272:4:::1;36199:120;::::0;::::1;14672:34:1::0;-1:-1:-1;;;;;36292:16:0;;::::1;14722:18:1::0;;;14715:43;36199:50:0;::::1;::::0;::::1;::::0;14607:18:1;;36199:120:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36188:8;:131:::0;;-1:-1:-1;;;;;;36188:131:0::1;-1:-1:-1::0;;;;;36188:131:0;;::::1;;::::0;;36353:10:::1;::::0;:17:::1;::::0;;-1:-1:-1;;;36353:17:0;;;;:10;;;::::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36333:16;::::0;-1:-1:-1;;;;;36333:16:0;;::::1;:37:::0;::::1;;36330:138;;36393:16;::::0;36427:10:::1;::::0;36386:58:::1;::::0;-1:-1:-1;;;36386:58:0;;-1:-1:-1;;;;;36427:10:0;;::::1;36386:58;::::0;::::1;14105:51:1::0;-1:-1:-1;;14172:18:1;;;14165:34;36393:16:0;::::1;::::0;36386:32:::1;::::0;14078:18:1;;36386:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36330:138;36507:8;::::0;36478:44:::1;::::0;-1:-1:-1;;;;;36507:8:0::1;::::0;36478:28:::1;:44::i;50672:822::-:0;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;50892:11:::1;::::0;50907:3:::1;::::0;50892:11:::1;-1:-1:-1::0;;;50892:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;50874:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;50854:16:0;::::1;::::0;::::1;::::0;50819:33:::1;::::0;-1:-1:-1;;;50835:16:0;;::::1;;50819:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:91;;;;50797:162;;;;-1:-1:-1::0;;;50797:162:0::1;;;;;;;:::i;:::-;51061:10;::::0;51075:3:::1;::::0;51061:10:::1;-1:-1:-1::0;;;51061:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;51044:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;51025:15:0;::::1;::::0;::::1;::::0;50992:31:::1;::::0;-1:-1:-1;;;51007:15:0;;::::1;;50992:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;50970:156;;;;-1:-1:-1::0;;;50970:156:0::1;;;;;;;:::i;:::-;51162:3;51145:14;:20;;;;51137:48;;;;-1:-1:-1::0;;;51137:48:0::1;;;;;;;:::i;:::-;51220:3;51204:13;:19;;;;51196:46;;;;-1:-1:-1::0;;;51196:46:0::1;;;;;;;:::i;:::-;51346:13;::::0;51258:140:::1;::::0;;51346:13:::1;8899:15:1::0;;;8881:34;;8951:15;;;8946:2;8931:18;;8924:43;51346:13:0::1;::::0;::::1;::::0;::::1;8983:18:1::0;;;8976:43;51375:12:0;;;::::1;::::0;;::::1;9050:2:1::0;9035:18;;9028:43;51258:140:0;::::1;::::0;;;;8843:3:1;51258:140:0;;::::1;51409:13;:30:::0;;-1:-1:-1;;51450:28:0;51409:30:::1;;::::0;;::::1;;-1:-1:-1::0;;51450:28:0;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;50672:822::o;43875:89::-;43916:13;43949:7;43942:14;;;;;:::i;54852:163::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;54966:41:::1;54995:4;55001:5;54966:28;:41::i;45645:341::-:0;11262:10;45767:4;45861:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45861:34:0;;;;;;;;;;45767:4;;45789:167;;45839:7;;45861:84;;45915:15;;45861:84;:::i;44376:201::-;44483:4;44505:42;11262:10;44529:9;44540:6;44505:9;:42::i;39931:367::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;40092:5:::1;40082:7;;:15;;;;:::i;:::-;40059:21;:38;;40051:95;;;::::0;-1:-1:-1;;;40051:95:0;;18731:2:1;40051:95:0::1;::::0;::::1;18713:21:1::0;18770:2;18750:18;;;18743:30;18809:34;18789:18;;;18782:62;-1:-1:-1;;;18860:18:1;;;18853:42;18912:19;;40051:95:0::1;18529:408:1::0;40051:95:0::1;40214:20;::::0;40164:71:::1;::::0;;6995:25:1;;;7051:2;7036:18;;7029:34;;;;40164:71:0::1;::::0;6968:18:1;40164:71:0::1;;;;;;;40246:20;:44:::0;39931:367::o;49802:862::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;50031:11:::1;::::0;50046:3:::1;::::0;50031:11:::1;-1:-1:-1::0;;;50031:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;50013:15:0;::::1;::::0;::::1;::::0;50031:11:::1;49996:13:::0;::::1;::::0;::::1;::::0;49958:36:::1;::::0;-1:-1:-1;;;49977:16:0;;::::1;;49958:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:91;;;;49936:162;;;;-1:-1:-1::0;;;49936:162:0::1;;;;;;;:::i;:::-;50200:10;::::0;50214:3:::1;::::0;50200:10:::1;-1:-1:-1::0;;;50200:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;50183:14:0;::::1;::::0;::::1;::::0;50167:12;;::::1;::::0;::::1;::::0;50131:34:::1;::::0;-1:-1:-1;;;50149:15:0;;::::1;;50131:16:::0;:34:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;50109:156;;;;-1:-1:-1::0;;;50109:156:0::1;;;;;;;:::i;:::-;50304:3;50284:17;:23;;;;50276:51;;;;-1:-1:-1::0;;;50276:51:0::1;;;;;;;:::i;:::-;50365:3;50346:16;:22;;;;50338:49;;;;-1:-1:-1::0;;;50338:49:0::1;;;;;;;:::i;:::-;50499:16;::::0;50403:153:::1;::::0;;50499:16:::1;8899:15:1::0;;;8881:34;;8951:15;;;8946:2;8931:18;;8924:43;-1:-1:-1;;;50499:16:0;::::1;::::0;::::1;8983:18:1::0;;;8976:43;-1:-1:-1;;;50530:15:0;;::::1;::::0;;::::1;9050:2:1::0;9035:18;;9028:43;50403:153:0;::::1;::::0;;;;8843:3:1;50403:153:0;;::::1;50567:16;:36:::0;;-1:-1:-1;;50614:34:0;-1:-1:-1;;;50567:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;50614:34:0;;-1:-1:-1;;;50614:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;49802:862::o;48932:::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;49161:11:::1;::::0;49176:3:::1;::::0;49161:11:::1;-1:-1:-1::0;;;49161:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;49143:15:0;::::1;::::0;::::1;::::0;49161:11:::1;49126:13:::0;::::1;::::0;::::1;::::0;49088:36:::1;::::0;-1:-1:-1;;;49107:16:0;;::::1;;49088:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:91;;;;49066:162;;;;-1:-1:-1::0;;;49066:162:0::1;;;;;;;:::i;:::-;49330:10;::::0;49344:3:::1;::::0;49330:10:::1;-1:-1:-1::0;;;49330:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;49313:14:0;::::1;::::0;::::1;::::0;49297:12;;::::1;::::0;::::1;::::0;49261:34:::1;::::0;-1:-1:-1;;;49279:15:0;;::::1;;49261:16:::0;:34:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:86;;;;49239:156;;;;-1:-1:-1::0;;;49239:156:0::1;;;;;;;:::i;:::-;49434:3;49414:17;:23;;;;49406:51;;;;-1:-1:-1::0;;;49406:51:0::1;;;;;;;:::i;:::-;49495:3;49476:16;:22;;;;49468:49;;;;-1:-1:-1::0;;;49468:49:0::1;;;;;;;:::i;:::-;49629:16;::::0;49533:153:::1;::::0;;49629:16:::1;8899:15:1::0;;;8881:34;;8951:15;;;8946:2;8931:18;;8924:43;-1:-1:-1;;;49629:16:0;::::1;::::0;::::1;8983:18:1::0;;;8976:43;-1:-1:-1;;;49660:15:0;;::::1;::::0;;::::1;9050:2:1::0;9035:18;;9028:43;49533:153:0;::::1;::::0;;;;8843:3:1;49533:153:0;;::::1;49697:16;:36:::0;;-1:-1:-1;;49744:34:0;-1:-1:-1;;;49697:36:0::1;::::0;;::::1;;-1:-1:-1::0;;49744:34:0;;-1:-1:-1;;;49744:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;48932:862::o;55517:234::-;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55607:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:34;::::1;;:26;::::0;;::::1;:34;;::::0;55599:54:::1;;;::::0;-1:-1:-1;;;55599:54:0;;9417:2:1;55599:54:0::1;::::0;::::1;9399:21:1::0;9456:1;9436:18;;;9429:29;-1:-1:-1;;;9474:18:1;;;9467:37;9521:18;;55599:54:0::1;9215:330:1::0;55599:54:0::1;-1:-1:-1::0;;;;;55664:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:33;;-1:-1:-1;;55664:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;55713:30;;1487:41:1;;;55713:30:0::1;::::0;1460:18:1;55713:30:0::1;1347:187:1::0;65508:184:0;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;65562:12:::1;11881:6:::0;;65578:55:::1;::::0;-1:-1:-1;;;;;11881:6:0;;;;65607:21:::1;::::0;65562:12;65578:55;65562:12;65578:55;65607:21;11881:6;65578:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65561:72;;;65652:7;65644:40;;;::::0;-1:-1:-1;;;65644:40:0;;19354:2:1;65644:40:0::1;::::0;::::1;19336:21:1::0;19393:2;19373:18;;;19366:30;-1:-1:-1;;;19412:18:1;;;19405:50;19472:18;;65644:40:0::1;19152:344:1::0;12717:201:0;11854:7;11881:6;-1:-1:-1;;;;;11881:6:0;11262:10;12028:23;12020:68;;;;-1:-1:-1;;;12020:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12806:22:0;::::1;12798:73;;;::::0;-1:-1:-1;;;12798:73:0;;19703:2:1;12798:73:0::1;::::0;::::1;19685:21:1::0;19742:2;19722:18;;;19715:30;19781:34;19761:18;;;19754:62;-1:-1:-1;;;19832:18:1;;;19825:36;19878:19;;12798:73:0::1;19501:402:1::0;12798:73:0::1;12882:28;12901:8;12882:18;:28::i;48433:371::-:0;-1:-1:-1;;;;;48560:19:0;;48552:68;;;;-1:-1:-1;;;48552:68:0;;20110:2:1;48552:68:0;;;20092:21:1;20149:2;20129:18;;;20122:30;20188:34;20168:18;;;20161:62;-1:-1:-1;;;20239:18:1;;;20232:34;20283:19;;48552:68:0;19908:400:1;48552:68:0;-1:-1:-1;;;;;48639:21:0;;48631:68;;;;-1:-1:-1;;;48631:68:0;;20515:2:1;48631:68:0;;;20497:21:1;20554:2;20534:18;;;20527:30;20593:34;20573:18;;;20566:62;-1:-1:-1;;;20644:18:1;;;20637:32;20686:19;;48631:68:0;20313:398:1;48631:68:0;-1:-1:-1;;;;;48712:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;48764:32;;1878:25:1;;;48764:32:0;;1851:18:1;48764:32:0;;;;;;;48433:371;;;:::o;56090:2151::-;-1:-1:-1;;;;;56212:18:0;;56204:68;;;;-1:-1:-1;;;56204:68:0;;20918:2:1;56204:68:0;;;20900:21:1;20957:2;20937:18;;;20930:30;20996:34;20976:18;;;20969:62;-1:-1:-1;;;21047:18:1;;;21040:35;21092:19;;56204:68:0;20716:401:1;56204:68:0;-1:-1:-1;;;;;56291:16:0;;56283:64;;;;-1:-1:-1;;;56283:64:0;;21324:2:1;56283:64:0;;;21306:21:1;21363:2;21343:18;;;21336:30;21402:34;21382:18;;;21375:62;-1:-1:-1;;;21453:18:1;;;21446:33;21496:19;;56283:64:0;21122:399:1;56283:64:0;56366:28;56397:24;56415:4;56397:9;:24::i;:::-;56500:18;;56571:16;;56366:55;;-1:-1:-1;56463:55:0;;;;56571:16;;56570:17;:57;;;;;56604:23;56570:57;:97;;;;-1:-1:-1;56654:8:0;;56666:1;;56644:19;;-1:-1:-1;;;;;56654:8:0;56644:9;:19::i;:::-;:23;56570:97;:143;;;;-1:-1:-1;;;;;;56684:29:0;;;;;;:25;:29;;;;;;;;56570:143;56552:209;;;56740:9;:7;:9::i;:::-;56771:14;41985:10;;;41964:18;:31;42030:13;;;42006:21;:37;42078:13;;;42054:21;:37;42125:12;;;42102:20;:35;42167:8;;;42148:16;:27;-1:-1:-1;42188:12:0;;;;42211:16;;;;42238:17;;;;42266:14;;;;42291:17;41921:395;56771:14;56901:16;;;;56900:17;:58;;;;-1:-1:-1;;;;;;56935:23:0;;;;;;:17;:23;;;;;;;;56934:24;56900:58;:97;;;;-1:-1:-1;;;;;;56976:21:0;;;;;;:17;:21;;;;;;;;56975:22;56900:97;56882:786;;;-1:-1:-1;;;;;57048:31:0;;;;;;:25;:31;;;;;;;;57044:613;;;57113:12;;;;;;;;57100:10;:25;-1:-1:-1;;;57160:15:0;;;;57144:13;:31;-1:-1:-1;;;57210:15:0;;;;57194:13;:31;-1:-1:-1;;;57259:14:0;;;;57244:12;:29;-1:-1:-1;;;57303:10:0;;;;57292:8;:21;57044:613;;;-1:-1:-1;;;;;57373:29:0;;;;;;:25;:29;;;;;;;;57369:288;;;57436:13;;;;;;;;57423:10;:26;-1:-1:-1;;;57484:16:0;;;;57468:13;:32;-1:-1:-1;;;57535:16:0;;;;57519:13;:32;-1:-1:-1;;;57585:15:0;;;;57570:12;:30;-1:-1:-1;;;57630:11:0;;;;57619:8;:22;57369:288;57678:32;57693:4;57699:2;57703:6;57678:14;:32::i;:::-;57721:15;42379:16;;42368:8;:27;42421:20;;42406:12;:35;42465:18;;42452:10;:31;42510:21;;42494:13;:37;42558:21;;42542:13;:37;42324:263;57721:15;57752:16;;;;57747:487;;-1:-1:-1;;;;;57790:40:0;;;;;;:34;:40;;;;;;;;57785:214;;57890:20;;57881:6;:29;57851:132;;;;-1:-1:-1;;;57851:132:0;;21728:2:1;57851:132:0;;;21710:21:1;21767:2;21747:18;;;21740:30;21806:31;21786:18;;;21779:59;21855:18;;57851:132:0;21526:353:1;57851:132:0;-1:-1:-1;;;;;58018:38:0;;;;;;:34;:38;;;;;;;;58013:210;;58123:9;;58107:13;58117:2;58107:9;:13::i;:::-;:25;58077:130;;;;-1:-1:-1;;;58077:130:0;;22086:2:1;58077:130:0;;;22068:21:1;22125:2;22105:18;;;22098:30;22164:33;22144:18;;;22137:61;22215:18;;58077:130:0;21884:355:1;58077:130:0;56193:2048;;56090:2151;;;:::o;41148:161::-;41190:7;41211:15;41228;41247:19;:17;:19::i;:::-;41210:56;;-1:-1:-1;41210:56:0;-1:-1:-1;41284:17:0;41210:56;;41284:17;:::i;:::-;41277:24;;;;41148:161;:::o;40456:684::-;40557:7;40579;40601;40623;40645;40667;40702:12;40717:27;40736:7;40717:18;:27::i;:::-;40702:42;;40755:18;40776:30;40798:7;40776:21;:30::i;:::-;40755:51;;40817:18;40838:30;40860:7;40838:21;:30::i;:::-;40817:51;;40879:17;40899:29;40920:7;40899:20;:29::i;:::-;40879:49;;40939:13;40955:25;40972:7;40955:16;:25::i;:::-;40939:41;;40991:23;41017:32;41041:7;41017:23;:32::i;:::-;40991:58;41085:4;;-1:-1:-1;41091:10:0;;-1:-1:-1;41103:10:0;;-1:-1:-1;41103:10:0;-1:-1:-1;41091:10:0;-1:-1:-1;40456:684:0;;-1:-1:-1;;;40456:684:0:o;55023:484::-;-1:-1:-1;;;;;55128:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;55106:146;;;;-1:-1:-1;;;55106:146:0;;22446:2:1;55106:146:0;;;22428:21:1;22485:2;22465:18;;;22458:30;22524:34;22504:18;;;22497:62;22595:26;22575:18;;;22568:54;22639:19;;55106:146:0;22244:420:1;55106:146:0;-1:-1:-1;;;;;55263:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;55263:39:0;;;;;;;;;;;;55313:71;;55324:23;55342:4;55324:17;:23::i;:::-;55313:71;;;55363:21;55379:4;55363:15;:21::i;:::-;-1:-1:-1;;;;;55395:40:0;;;;;;:34;:40;;;;;;;;;:48;;-1:-1:-1;;55395:48:0;;;;;;;;;;55459:40;;1487:41:1;;;55459:40:0;;1460:18:1;55459:40:0;1347:187:1;13078:191:0;13152:16;13171:6;;-1:-1:-1;;;;;13188:17:0;;;-1:-1:-1;;;;;;13188:17:0;;;;;;13221:40;;13171:6;;;;;;;13221:40;;13152:16;13221:40;13141:128;13078:191;:::o;13333:211::-;13477:58;;-1:-1:-1;;;;;14123:32:1;;13477:58:0;;;14105:51:1;14172:18;;;14165:34;;;13450:86:0;;13470:5;;-1:-1:-1;;;13500:23:0;14078:18:1;;13477:58:0;;;;-1:-1:-1;;13477:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13477:58:0;-1:-1:-1;;;;;;13477:58:0;;;;;;;;;;13450:19;:86::i;:::-;13333:211;;;:::o;13552:248::-;13723:68;;-1:-1:-1;;;;;22927:15:1;;;13723:68:0;;;22909:34:1;22979:15;;22959:18;;;22952:43;23011:18;;;23004:34;;;13696:96:0;;13716:5;;-1:-1:-1;;;13746:27:0;22844:18:1;;13723:68:0;22669:375:1;13696:96:0;13552:248;;;;:::o;58249:3886::-;48846:16;:23;;-1:-1:-1;;48846:23:0;48865:4;48846:23;;;:16;58325:24:::1;58343:4;58325:9;:24::i;:::-;58299:50;;58360:24;58431:18;;58409:19;;58387;;:41;;;;:::i;:::-;:62;;;;:::i;:::-;58360:89:::0;-1:-1:-1;58464:21:0;;;:59:::1;;;58507:16;58489:15;:34;58464:59;58460:98;;;58540:7;;;;58460:98;58619:26;58670:1;58648:19;;:23;;;;:::i;:::-;58619:52;;58682:31;58734:10;;;;;;;;;-1:-1:-1::0;;;;;58734:10:0::1;-1:-1:-1::0;;;;;58734:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58716:16;::::0;-1:-1:-1;;;;;58716:16:0;;::::1;:35:::0;::::1;;:124;;58798:16;::::0;58791:49:::1;::::0;-1:-1:-1;;;58791:49:0;;58834:4:::1;58791:49;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;58798:16:0;;::::1;::::0;58791:34:::1;::::0;146:18:1;;58791:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58716:124;;;58754:21;58716:124;58682:158;;58851:29;58891:28:::0;58934:23:::1;;;;;;;;;;;58930:2131;;;58974:21;59037:18;;59015:19;;58996:18;:38;;;;:::i;:::-;:59;;;;:::i;:::-;58974:81:::0;-1:-1:-1;59073:15:0;;59070:74:::1;;59107:37;59130:13;59107:22;:37::i;:::-;59204:10;::::0;:17:::1;::::0;;-1:-1:-1;;;59204:17:0;;;;59159:24:::1;::::0;-1:-1:-1;;;;;59204:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59186:16;::::0;-1:-1:-1;;;;;59186:16:0;;::::1;:35:::0;::::1;;:176;;59296:16;::::0;59289:49:::1;::::0;-1:-1:-1;;;59289:49:0;;59332:4:::1;59289:49;::::0;::::1;173:51:1::0;59339:23:0;;-1:-1:-1;;;;;59296:16:0::1;::::0;59289:34:::1;::::0;146:18:1;;59289:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;59186:176;;;59224:45;59246:23:::0;59224:21:::1;:45;:::i;:::-;59159:203;;59377:29;59446:13;59426:19;;59409:16;:36;;;;:::i;:::-;:50;;;;:::i;:::-;59377:82:::0;-1:-1:-1;59534:13:0;59498:35:::1;59515:18:::0;59498:16;:35:::1;:::i;:::-;:49;;;;:::i;:::-;59474:73:::0;-1:-1:-1;59474:73:0;59585:40:::1;59604:21:::0;59585:16;:40:::1;:::i;:::-;:64;;;;:::i;:::-;59562:87:::0;-1:-1:-1;59667:23:0;;59664:580:::1;;59731:10;;;;;;;;;-1:-1:-1::0;;;;;59731:10:0::1;-1:-1:-1::0;;;;;59731:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59713:16;::::0;-1:-1:-1;;;;;59713:35:0;;::::1;:16:::0;::::1;:35:::0;59710:512:::1;;59797:15;::::0;59789:63:::1;::::0;59773:12:::1;::::0;-1:-1:-1;;;;;59797:15:0::1;::::0;59826:21;;59773:12;59789:63;59773:12;59789:63;59826:21;59797:15;59789:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59772:80;;;59878:7;59875:133;;;59941:43;::::0;;59959:1:::1;6995:25:1::0;;7051:2;7036:18;;7029:34;;;59941:43:0::1;::::0;6968:18:1;59941:43:0::1;;;;;;;59875:133;59749:278;59710:512;;;60092:15;::::0;;60061:16;60054:77:::1;::::0;-1:-1:-1;;;;;60061:16:0;;::::1;::::0;60092:15:::1;60109:21:::0;60054:37:::1;:77::i;:::-;60159:43;::::0;;60177:1:::1;6995:25:1::0;;7051:2;7036:18;;7029:34;;;60159:43:0::1;::::0;6968:18:1;60159:43:0::1;;;;;;;59710:512;58959:1308;;;58930:2131;;;60288:21;60331:18;;60310;:39;;;;:::i;:::-;60288:61:::0;-1:-1:-1;60367:15:0;;60364:74:::1;;60401:37;60424:13;60401:22;:37::i;:::-;60498:10;::::0;:17:::1;::::0;;-1:-1:-1;;;60498:17:0;;;;60453:24:::1;::::0;-1:-1:-1;;;;;60498:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60480:16;::::0;-1:-1:-1;;;;;60480:16:0;;::::1;:35:::0;::::1;;:176;;60590:16;::::0;60583:49:::1;::::0;-1:-1:-1;;;60583:49:0;;60626:4:::1;60583:49;::::0;::::1;173:51:1::0;60633:23:0;;-1:-1:-1;;;;;60590:16:0::1;::::0;60583:34:::1;::::0;146:18:1;;60583:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;60480:176;;;60518:45;60540:23:::0;60518:21:::1;:45;:::i;:::-;60453:203:::0;-1:-1:-1;60731:13:0;60695:35:::1;60712:18:::0;60453:203;60695:35:::1;:::i;:::-;:49;;;;:::i;:::-;60671:73:::0;-1:-1:-1;60782:40:0::1;60671:73:::0;60782:16;:40:::1;:::i;:::-;60854:19;::::0;60759:63;;-1:-1:-1;60854:21:0;60851:187:::1;;60920:15;::::0;60937:19:::1;::::0;60895:62:::1;::::0;60913:4:::1;::::0;-1:-1:-1;;;;;60920:15:0;;::::1;::::0;60895:9:::1;:62::i;:::-;60999:19;::::0;60981:41:::1;::::0;;6995:25:1;;;61020:1:0::1;7051:2:1::0;7036:18;;7029:34;60981:41:0::1;::::0;6968:18:1;60981:41:0::1;;;;;;;60851:187;60273:788;;58930:2131;61098:1;61077:18;:22;:51;;;;;61127:1;61103:21;:25;61077:51;61073:216;;;61145:55;61158:18;61178:21;61145:12;:55::i;:::-;61220:57;::::0;;6995:25:1;;;7051:2;7036:18;;7029:34;;;61220:57:0::1;::::0;6968:18:1;61220:57:0::1;;;;;;;61073:216;61302:22:::0;;61299:522:::1;;61361:10;;;;;;;;;-1:-1:-1::0;;;;;61361:10:0::1;-1:-1:-1::0;;;;;61361:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61343:16;::::0;-1:-1:-1;;;;;61343:35:0;;::::1;:16:::0;::::1;:35:::0;61340:463:::1;;61423:14;::::0;61415:61:::1;::::0;61399:12:::1;::::0;-1:-1:-1;;;;;61423:14:0::1;::::0;61451:20;;61399:12;61415:61;61399:12;61415:61;61451:20;61423:14;61415:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61398:78;;;61498:7;61495:117;;;61554:38;::::0;1878:25:1;;;61554:38:0::1;::::0;1866:2:1;1851:18;61554:38:0::1;;;;;;;61495:117;61379:248;61340:463;;;61688:14;::::0;;61657:16;61650:75:::1;::::0;-1:-1:-1;;;;;61657:16:0;;::::1;::::0;61688:14:::1;61704:20:::0;61650:37:::1;:75::i;:::-;61749:38;::::0;1878:25:1;;;61749:38:0::1;::::0;1866:2:1;1851:18;61749:38:0::1;;;;;;;61340:463;61853:1;61831:19;:23:::0;;;61865:18:::1;:22:::0;;;61898:19:::1;:23:::0;;;11881:6;-1:-1:-1;;;;;11881:6:0;61935:19;61932:193:::1;;61969:59;61987:4;61994:7;11854::::0;11881:6;-1:-1:-1;;;;;11881:6:0;;11808:87;61994:7:::1;62003:24;62021:4;62003:9;:24::i;:::-;61969:9;:59::i;:::-;61932:193;;;62084:14;::::0;62059:66:::1;::::0;62077:4:::1;::::0;-1:-1:-1;;;;;62084:14:0::1;62100:24;62077:4:::0;62100:9:::1;:24::i;62059:66::-;58288:3847;;;;;;48880:1;48892:16:::0;:24;;-1:-1:-1;;48892:24:0;;;58249:3886::o;37302:2368::-;37456:23;37494:12;37521:18;37554;37587:17;37619:13;37646:19;37658:6;37646:11;:19::i;:::-;37430:235;;;;;;;;;;;;37676:19;37698:10;:8;:10::i;:::-;37676:32;;37774:5;37764:7;;:15;;;;:::i;:::-;37754:7;:25;37814:17;37820:11;37814:5;:17;:::i;:::-;37804:7;;:27;;;;:::i;:::-;37794:7;:37;37851:35;;1878:25:1;;;37876:1:0;;-1:-1:-1;;;;;37851:35:0;;;-1:-1:-1;;;;;;;;;;;37851:35:0;1866:2:1;1851:18;37851:35:0;;;;;;;38054:10;38034:19;;:30;;;;:::i;:::-;38012:19;:52;38101:19;;:30;;38121:10;;38101:30;:::i;:::-;38079:19;:52;38167:18;;:28;;38186:9;;38167:28;:::i;:::-;38146:18;:49;38210:17;38252:9;38230:21;38241:10;38230;:21;:::i;:::-;:31;;;;:::i;:::-;38210:51;-1:-1:-1;38324:23:0;38336:11;38210:51;38324:23;:::i;:::-;38317:4;38301:22;;;;:7;:22;;;;;;:46;;;;:::i;:::-;38292:4;38276:22;;;;:7;:22;;;;;;;;:71;;;;38366:11;:26;;;;;;38362:106;;;38452:4;38436:22;;;;:7;:22;;;;;;:32;;38459:9;;38436:32;:::i;:::-;38427:4;38411:22;;;;:7;:22;;;;;:57;38362:106;-1:-1:-1;;;;;;38494:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;38518:22:0;;;;;;:11;:22;;;;;;;;38517:23;38494:46;38490:1067;;;-1:-1:-1;;;;;38575:15:0;;;;;;:7;:15;;;;;;:22;;38591:6;;38575:22;:::i;:::-;-1:-1:-1;;;;;38557:15:0;;;;;;:7;:15;;;;;:40;38646:18;38653:11;38646:6;:18;:::i;:::-;-1:-1:-1;;;;;38630:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;38612:15:0;;;;;;:7;:15;;;;;:52;38719:27;38735:11;38719:15;:27;:::i;:::-;-1:-1:-1;;;;;38700:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;38679:18:0;;;;;;:7;:18;;;;;:67;38490:1067;;;-1:-1:-1;;;;;38769:19:0;;;;;;:11;:19;;;;;;;;38768:20;:46;;;;-1:-1:-1;;;;;;38792:22:0;;;;;;:11;:22;;;;;;;;38768:46;38764:793;;;38865:18;38872:11;38865:6;:18;:::i;:::-;-1:-1:-1;;;;;38849:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;38831:15:0;;;;;;;:7;:15;;;;;;;;:52;;;;38919:18;;;;;:7;:18;;;;;:34;;38938:15;;38919:34;:::i;:::-;-1:-1:-1;;;;;38898:18:0;;;;;;:7;:18;;;;;:55;39008:27;39024:11;39008:15;:27;:::i;38764:793::-;-1:-1:-1;;;;;39057:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;39080:22:0;;;;;;:11;:22;;;;;;;;39057:45;39053:504;;;-1:-1:-1;;;;;39137:15:0;;;;;;:7;:15;;;;;;:22;;39153:6;;39137:22;:::i;:::-;-1:-1:-1;;;;;39119:15:0;;;;;;:7;:15;;;;;:40;39208:18;39215:11;39208:6;:18;:::i;39053:504::-;39445:18;39452:11;39445:6;:18;:::i;:::-;-1:-1:-1;;;;;39429:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;39411:15:0;;;;;;:7;:15;;;;;:52;39518:27;39534:11;39518:15;:27;:::i;:::-;-1:-1:-1;;;;;39499:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;39478:18:0;;;;;;:7;:18;;;;;:67;39053:504;39567:35;39579:16;39584:11;39579:4;:16;:::i;:::-;39597:4;39567:11;:35::i;:::-;39635:9;-1:-1:-1;;;;;39618:44:0;39627:6;-1:-1:-1;;;;;39618:44:0;-1:-1:-1;;;;;;;;;;;39646:15:0;39618:44;;;;1878:25:1;;1866:2;1851:18;;1732:177;39618:44:0;;;;;;;;37419:2251;;;;;;;37302:2368;;;:::o;41317:596::-;41415:7;;41451;;41368;;;;;41469:332;41493:9;:16;41489:20;;41469:332;;;41577:7;41553;:21;41561:9;41571:1;41561:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41561:12:0;41553:21;;;;;;;;;;;;;:31;;:83;;;41629:7;41605;:21;41613:9;41623:1;41613:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41613:12:0;41605:21;;;;;;;;;;;;;:31;41553:83;41531:146;;;41660:7;;41669;;41652:25;;;;;;;41317:596;;:::o;41531:146::-;41711:7;:21;41719:9;41729:1;41719:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41719:12:0;41711:21;;;;;;;;;;;;;41702:31;;:7;:31;:::i;:::-;41692:41;;41767:7;:21;41775:9;41785:1;41775:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41775:12:0;41767:21;;;;;;;;;;;;;41758:31;;:7;:31;:::i;:::-;41748:41;-1:-1:-1;41511:3:0;;;;:::i;:::-;;;;41469:332;;;;41834:7;;41825;;:17;;;;:::i;:::-;41815:7;:27;41811:58;;;41852:7;;41861;;41844:25;;;;;;41317:596;;:::o;41811:58::-;41888:7;;41897;;-1:-1:-1;41317:596:0;-1:-1:-1;41317:596:0:o;42595:162::-;42689:7;42743:5;42730:10;;42721:7;:20;;;;:::i;:::-;:28;;;;:::i;42765:168::-;42862:7;42919:5;42903:13;;42894:7;:23;;;;:::i;42941:168::-;43038:7;43095:5;43079:13;;43070:7;:23;;;;:::i;43117:166::-;43213:7;43269:5;43254:12;;43245:7;:22;;;;:::i;43291:158::-;43383:7;43435:5;43424:8;;43415:7;:18;;;;:::i;43455:232::-;43554:7;43673:5;43657:13;;43641;;43628:10;;43613:12;;43602:8;;43595:4;:15;;;;:::i;:::-;:30;;;;:::i;:::-;:43;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;;;:::i;:::-;43586:85;;:7;:85;:::i;15906:716::-;16330:23;16356:69;16384:4;16356:69;;;;;;;;;;;;;;;;;16364:5;-1:-1:-1;;;;;16356:27:0;;;:69;;;;;:::i;:::-;16440:17;;16330:95;;-1:-1:-1;16440:21:0;16436:179;;16537:10;16526:30;;;;;;;;;;;;:::i;:::-;16518:85;;;;-1:-1:-1;;;16518:85:0;;23773:2:1;16518:85:0;;;23755:21:1;23812:2;23792:18;;;23785:30;23851:34;23831:18;;;23824:62;-1:-1:-1;;;23902:18:1;;;23895:40;23952:19;;16518:85:0;23571:406:1;62147:828:0;62243:16;;;62257:1;62243:16;;;;;;;;62219:21;;62243:16;;;;;;;;;;-1:-1:-1;62243:16:0;62219:40;;62288:4;62270;62275:1;62270:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62270:23:0;;;:7;;;;;;;;;:23;62314:16;;;62304:7;;62314:16;;;62304:4;;62314:16;62304:7;;;;;;:::i;:::-;-1:-1:-1;;;;;62304:26:0;;;:7;;;;;;;;;;:26;;;;62356:10;;:17;;;-1:-1:-1;;;62356:17:0;;;;:10;;;;;:15;;:17;;;;;62304:7;;62356:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62345:28:0;:4;62350:1;62345:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;62345:28:0;;62341:627;;62389:10;;:249;;-1:-1:-1;;;62389:249:0;;-1:-1:-1;;;;;62389:10:0;;;;:61;;:249;;62469:11;;62389:10;;62553:4;;62584;;62608:15;;62389:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47949:469:::1;47812:613:::0;:::o;62341:627::-;62769:10;;62669:287;;-1:-1:-1;;;62669:287:0;;26591:42;;62669:69;;:287;;-1:-1:-1;;;;;62769:10:0;;62803:11;;62769:10;;62895:4;;62922:15;;62669:287;;;:::i;62983:779::-;63102:10;;;;;;;;;-1:-1:-1;;;;;63102:10:0;-1:-1:-1;;;;;63102:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63082:16;;-1:-1:-1;;;;;63082:37:0;;;:16;;:37;63078:665;;63135:10;;:289;;-1:-1:-1;;;63135:289:0;;63212:4;63135:289;;;24910:34:1;24960:18;;;24953:34;;;63135:10:0;25003:18:1;;;24996:34;;;25046:18;;;25039:34;63368:6:0;25089:19:1;;;25082:44;63394:15:0;25142:19:1;;;25135:35;-1:-1:-1;;;;;63135:10:0;;;;:26;;63169:15;;24844:19:1;;63135:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;63078:665::-;63454:10;;;63528:16;63454:277;;-1:-1:-1;;;63454:277:0;;63504:4;63454:277;;;25889:34:1;-1:-1:-1;;;;;63528:16:0;;;25939:18:1;;;25932:43;25991:18;;;25984:34;;;26034:18;;;26027:34;;;63454:10:0;26077:19:1;;;26070:35;;;26121:19;;;26114:35;63675:6:0;26165:19:1;;;26158:44;63701:15:0;26218:19:1;;;26211:35;63454:10:0;;;:23;;25823:19:1;;63454:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40307:141::-;40394:4;40385:7;;:14;;;;:::i;:::-;40375:7;:24;40423:10;;:17;;40435:4;;40423:17;:::i;:::-;40410:10;:30;-1:-1:-1;;40307:141:0:o;3884:229::-;4021:12;4053:52;4075:6;4083:4;4089:1;4092:12;4053:21;:52::i;:::-;4046:59;3884:229;-1:-1:-1;;;;3884:229:0:o;5004:510::-;5174:12;5232:5;5207:21;:30;;5199:81;;;;-1:-1:-1;;;5199:81:0;;26459:2:1;5199:81:0;;;26441:21:1;26498:2;26478:18;;;26471:30;26537:34;26517:18;;;26510:62;-1:-1:-1;;;26588:18:1;;;26581:36;26634:19;;5199:81:0;26257:402:1;5199:81:0;-1:-1:-1;;;;;1434:19:0;;;5291:60;;;;-1:-1:-1;;;5291:60:0;;26866:2:1;5291:60:0;;;26848:21:1;26905:2;26885:18;;;26878:30;26944:31;26924:18;;;26917:59;26993:18;;5291:60:0;26664:353:1;5291:60:0;5365:12;5379:23;5406:6;-1:-1:-1;;;;;5406:11:0;5425:5;5432:4;5406:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5364:73;;;;5455:51;5472:7;5481:10;5493:12;5455:16;:51::i;:::-;5448:58;5004:510;-1:-1:-1;;;;;;;5004:510:0:o;7690:712::-;7840:12;7869:7;7865:530;;;-1:-1:-1;7900:10:0;7893:17;;7865:530;8014:17;;:21;8010:374;;8212:10;8206:17;8273:15;8260:10;8256:2;8252:19;8245:44;8010:374;8355:12;8348:20;;-1:-1:-1;;;8348:20:0;;;;;;;;:::i;235:250:1:-;320:1;330:113;344:6;341:1;338:13;330:113;;;420:11;;;414:18;401:11;;;394:39;366:2;359:10;330:113;;;-1:-1:-1;;477:1:1;459:16;;452:27;235:250::o;490:396::-;639:2;628:9;621:21;602:4;671:6;665:13;714:6;709:2;698:9;694:18;687:34;730:79;802:6;797:2;786:9;782:18;777:2;769:6;765:15;730:79;:::i;:::-;870:2;849:15;-1:-1:-1;;845:29:1;830:45;;;;877:2;826:54;;490:396;-1:-1:-1;;490:396:1:o;891:131::-;-1:-1:-1;;;;;966:31:1;;956:42;;946:70;;1012:1;1009;1002:12;1027:315;1095:6;1103;1156:2;1144:9;1135:7;1131:23;1127:32;1124:52;;;1172:1;1169;1162:12;1124:52;1211:9;1198:23;1230:31;1255:5;1230:31;:::i;:::-;1280:5;1332:2;1317:18;;;;1304:32;;-1:-1:-1;;;1027:315:1:o;1914:180::-;1973:6;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;-1:-1:-1;2065:23:1;;1914:180;-1:-1:-1;1914:180:1:o;2099:159::-;2166:20;;2226:6;2215:18;;2205:29;;2195:57;;2248:1;2245;2238:12;2195:57;2099:159;;;:::o;2263:256::-;2329:6;2337;2390:2;2378:9;2369:7;2365:23;2361:32;2358:52;;;2406:1;2403;2396:12;2358:52;2429:28;2447:9;2429:28;:::i;:::-;2419:38;;2476:37;2509:2;2498:9;2494:18;2476:37;:::i;:::-;2466:47;;2263:256;;;;;:::o;2524:456::-;2601:6;2609;2617;2670:2;2658:9;2649:7;2645:23;2641:32;2638:52;;;2686:1;2683;2676:12;2638:52;2725:9;2712:23;2744:31;2769:5;2744:31;:::i;:::-;2794:5;-1:-1:-1;2851:2:1;2836:18;;2823:32;2864:33;2823:32;2864:33;:::i;:::-;2524:456;;2916:7;;-1:-1:-1;;;2970:2:1;2955:18;;;;2942:32;;2524:456::o;2985:118::-;3071:5;3064:13;3057:21;3050:5;3047:32;3037:60;;3093:1;3090;3083:12;3108:382;3173:6;3181;3234:2;3222:9;3213:7;3209:23;3205:32;3202:52;;;3250:1;3247;3240:12;3202:52;3289:9;3276:23;3308:31;3333:5;3308:31;:::i;:::-;3358:5;-1:-1:-1;3415:2:1;3400:18;;3387:32;3428:30;3387:32;3428:30;:::i;:::-;3477:7;3467:17;;;3108:382;;;;;:::o;3684:247::-;3743:6;3796:2;3784:9;3775:7;3771:23;3767:32;3764:52;;;3812:1;3809;3802:12;3764:52;3851:9;3838:23;3870:31;3895:5;3870:31;:::i;3936:309::-;4001:6;4009;4062:2;4050:9;4041:7;4037:23;4033:32;4030:52;;;4078:1;4075;4068:12;4030:52;4114:9;4101:23;4091:33;;4174:2;4163:9;4159:18;4146:32;4187:28;4209:5;4187:28;:::i;4926:388::-;4994:6;5002;5055:2;5043:9;5034:7;5030:23;5026:32;5023:52;;;5071:1;5068;5061:12;5023:52;5110:9;5097:23;5129:31;5154:5;5129:31;:::i;:::-;5179:5;-1:-1:-1;5236:2:1;5221:18;;5208:32;5249:33;5208:32;5249:33;:::i;5319:380::-;5398:1;5394:12;;;;5441;;;5462:61;;5516:4;5508:6;5504:17;5494:27;;5462:61;5569:2;5561:6;5558:14;5538:18;5535:38;5532:161;;5615:10;5610:3;5606:20;5603:1;5596:31;5650:4;5647:1;5640:15;5678:4;5675:1;5668:15;5532:161;;5319:380;;;:::o;5704:356::-;5906:2;5888:21;;;5925:18;;;5918:30;5984:34;5979:2;5964:18;;5957:62;6051:2;6036:18;;5704:356::o;6065:127::-;6126:10;6121:3;6117:20;6114:1;6107:31;6157:4;6154:1;6147:15;6181:4;6178:1;6171:15;6197:217;6237:1;6263;6253:132;;6307:10;6302:3;6298:20;6295:1;6288:31;6342:4;6339:1;6332:15;6370:4;6367:1;6360:15;6253:132;-1:-1:-1;6399:9:1;;6197:217::o;7074:168::-;7141:6;7167:10;;;7179;;;7163:27;;7202:11;;;7199:37;;;7216:18;;:::i;7247:345::-;7449:2;7431:21;;;7488:2;7468:18;;;7461:30;-1:-1:-1;;;7522:2:1;7507:18;;7500:51;7583:2;7568:18;;7247:345::o;7597:344::-;7799:2;7781:21;;;7838:2;7818:18;;;7811:30;-1:-1:-1;;;7872:2:1;7857:18;;7850:50;7932:2;7917:18;;7597:344::o;7946:339::-;8148:2;8130:21;;;8187:2;8167:18;;;8160:30;-1:-1:-1;;;8221:2:1;8206:18;;8199:45;8276:2;8261:18;;7946:339::o;8290:338::-;8492:2;8474:21;;;8531:2;8511:18;;;8504:30;-1:-1:-1;;;8565:2:1;8550:18;;8543:44;8619:2;8604:18;;8290:338::o;9082:128::-;9149:9;;;9170:11;;;9167:37;;;9184:18;;:::i;10313:127::-;10374:10;10369:3;10365:20;10362:1;10355:31;10405:4;10402:1;10395:15;10429:4;10426:1;10419:15;10445:168;10518:9;;;10549;;10566:15;;;10560:22;;10546:37;10536:71;;10587:18;;:::i;10618:125::-;10683:9;;;10704:10;;;10701:36;;;10717:18;;:::i;10748:127::-;10809:10;10804:3;10800:20;10797:1;10790:31;10840:4;10837:1;10830:15;10864:4;10861:1;10854:15;10880:135;10919:3;10940:17;;;10937:43;;10960:18;;:::i;:::-;-1:-1:-1;11007:1:1;10996:13;;10880:135::o;11736:415::-;11938:2;11920:21;;;11977:2;11957:18;;;11950:30;12016:34;12011:2;11996:18;;11989:62;-1:-1:-1;;;12082:2:1;12067:18;;12060:49;12141:3;12126:19;;11736:415::o;13675:251::-;13745:6;13798:2;13786:9;13777:7;13773:23;13769:32;13766:52;;;13814:1;13811;13804:12;13766:52;13846:9;13840:16;13865:31;13890:5;13865:31;:::i;14210:245::-;14277:6;14330:2;14318:9;14309:7;14305:23;14301:32;14298:52;;;14346:1;14343;14336:12;14298:52;14378:9;14372:16;14397:28;14419:5;14397:28;:::i;16226:184::-;16296:6;16349:2;16337:9;16328:7;16324:23;16320:32;16317:52;;;16365:1;16362;16355:12;16317:52;-1:-1:-1;16388:16:1;;16226:184;-1:-1:-1;16226:184:1:o;16547:461::-;16600:3;16638:5;16632:12;16665:6;16660:3;16653:19;16691:4;16720:2;16715:3;16711:12;16704:19;;16757:2;16750:5;16746:14;16778:1;16788:195;16802:6;16799:1;16796:13;16788:195;;;16867:13;;-1:-1:-1;;;;;16863:39:1;16851:52;;16923:12;;;;16958:15;;;;16899:1;16817:9;16788:195;;;-1:-1:-1;16999:3:1;;16547:461;-1:-1:-1;;;;;16547:461:1:o;17013:510::-;17284:6;17273:9;17266:25;17327:3;17322:2;17311:9;17307:18;17300:31;17247:4;17348:57;17400:3;17389:9;17385:19;17377:6;17348:57;:::i;:::-;-1:-1:-1;;;;;17441:32:1;;;;17436:2;17421:18;;17414:60;-1:-1:-1;17505:2:1;17490:18;17483:34;17340:65;17013:510;-1:-1:-1;;17013:510:1:o;17528:582::-;17827:6;17816:9;17809:25;17870:6;17865:2;17854:9;17850:18;17843:34;17913:3;17908:2;17897:9;17893:18;17886:31;17790:4;17934:57;17986:3;17975:9;17971:19;17963:6;17934:57;:::i;:::-;-1:-1:-1;;;;;18027:32:1;;;;18022:2;18007:18;;18000:60;-1:-1:-1;18091:3:1;18076:19;18069:35;17926:65;17528:582;-1:-1:-1;;;17528:582:1:o;23982:::-;24310:1;24306;24301:3;24297:11;24293:19;24285:6;24281:32;24270:9;24263:51;24350:6;24345:2;24334:9;24330:18;24323:34;24393:6;24388:2;24377:9;24373:18;24366:34;24436:3;24431:2;24420:9;24416:18;24409:31;24244:4;24457:57;24509:3;24498:9;24494:19;24486:6;24457:57;:::i;:::-;24449:65;;24551:6;24545:3;24534:9;24530:19;24523:35;23982:582;;;;;;;;:::o;25181:306::-;25269:6;25277;25285;25338:2;25326:9;25317:7;25313:23;25309:32;25306:52;;;25354:1;25351;25344:12;25306:52;25383:9;25377:16;25367:26;;25433:2;25422:9;25418:18;25412:25;25402:35;;25477:2;25466:9;25462:18;25456:25;25446:35;;25181:306;;;;;:::o;27022:287::-;27151:3;27189:6;27183:13;27205:66;27264:6;27259:3;27252:4;27244:6;27240:17;27205:66;:::i;:::-;27287:16;;;;;27022:287;-1:-1:-1;;27022:287:1:o

Swarm Source

ipfs://4f5de6a43eec31e653f04b8bbb5462b4cb3f090da2defcffdc9d19bc2c35a58e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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