ETH Price: $2,627.87 (+1.46%)

Token

Jiong (囧)
 

Overview

Max Total Supply

1,000,000,000

Holders

111

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
9,601,928.774110877 囧

Value
$0.00
0x8fe1213dc4f8a4b3919db660bfe1b0357c8798e9
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:
Jiong

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-05-29
*/

//SPDX-License-Identifier: MIT
//
// https://twitter.com/JiongToken
//
//
//                         MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMMMMMM
//                         MMMMN0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOKNWMM
//                         MMW0:. .......................................;0MM
//                         MMXc .cO0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00c. lNM
//                         MMX; ,KMMMMMMMMMMMMWNWMMMMMMMMWNWMMMMMMMMMMMO. cNM
//                         MMX; ,KMMMMMMMMMMW0c,xWMMMMMMXl,oXWMMMMMMMMMO. cNM
//                         MMX; ,KMMMMMMMMMXd'.:0MMMMMMMWk,.,xXMMMMMMMMO. cNM
//                         MMX; ,KMMMMMMMNO; .oXMMMMMMMMMMKl..;OWMMMMMMO. cNM
//                         MMX; ,KMMMMMW0c. ;kWMMMMMMMMMMMMWO, .dNWMMMMO. cNM
//                         MMX; ,KMMMWKo..,xXWMMMMMMMMMMMMMMMXd..:OWMMMO. cNM
//                         MMX; ,KMMNd'.'dXMMMMMMMMMMMMMMMMMMMW0, .dNMMO. cNM
//                         MMX; ,KMMKl:dXWMMMMMMMMMMMMMMMMMMMMMMKl':KMMO. cNM
//                         MMX; ,KMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMWNNWMMO. cNM
//                         MMX; ,KMMMMMMMMWNK0OOOOOOOOOOOOO0XNWMMMMMMMMO. cNM
//                         MMX; ,KMMMMMMWXo'.................,oKWMMMMMMO. cNM
//                         MMX; ,KMMMMMMWd. ;k0000000000000k; .dWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .kMMMMMMMMMMMMMMMx. oWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .OMMMMMMMMMMMMMMMx..dWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .OMMMMMMMMMMMMMMMx..dWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .OMMMMMMMMMMMMMMMx..dWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .OMMMMMMMMMMMMMMMx. dWMMMMMMO. cNM
//                         MMX; ,KMMMMMMNc .OMMMMMMMMMMMMMMMx. oWMMMMMMO. cNM
//                         MMN: .l00000KO; .d000000000000000l. c0K00000l. lWM
//                         MMWO,.........   .................  ..........;OWM
//                         MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//                         MMMMX0kkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkk0XMMM
// 
//
//

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable 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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: contracts/Puppies.sol


pragma solidity ^0.8.9;


contract Jiong is Context, IERC20, Ownable {
  using SafeMath for uint256;
  using Address for address;

  mapping(address => uint256) private _rOwned;
  mapping(address => uint256) private _tOwned;
  mapping(address => mapping(address => uint256)) private _allowances;

  mapping(address => bool) private _isExcludedFromFee;
  mapping(address => bool) private _isExcluded;
  address[] private _excluded;

  mapping(address => bool) private botWallets;
  bool botsCantTrade = false;

  bool public canTrade = false;

  uint256 private constant MAX = ~uint256(0);
  uint256 private _tTotal = 1_000_000_000 * 10 ** 9;
  uint256 private _rTotal = (MAX - (MAX % _tTotal));
  uint256 private _tFeeTotal;
  address payable private marketingWallet;
  address payable private devTaxWallet;

  string private _name = "Jiong";
  string private _symbol = unicode"囧";
  uint8 private _decimals = 9;

  uint256 private _taxFeeOnBuy = 300; // 3%
  uint256 private _taxFeeOnSell = 300; // 3%
  uint256 public _taxFee = _taxFeeOnBuy;
  uint256 private _previousTaxFee = _taxFee;
  uint256 private _previousTaxFeeOnBuy = _taxFeeOnBuy;
  uint256 private _previousTaxFeeOnSell = _taxFeeOnSell;

  uint256 private _devFeeOnBuy = 100; // 1%
  uint256 private _devFeeOnSell = 100; // 1%
  uint256 private _devFee = _devFeeOnBuy;
  uint256 private _previousDevFee = _devFee;
  uint256 private _previousDevFeeOnBuy = _devFeeOnBuy;
  uint256 private _previousDevFeeOnSell = _devFeeOnSell;

  uint256 private _liquidityFeeOnBuy = 100; //1%
  uint256 private _liquidityFeeOnSell = 100; //1%
  uint256 public _liquidityFee = _liquidityFeeOnBuy;
  uint256 private _previousLiquidityFee = _liquidityFee;
  uint256 private _previousLiquidityFeeOnBuy = _liquidityFeeOnBuy;
  uint256 private _previousLiquidityFeeOnSell = _liquidityFeeOnSell;

  IUniswapV2Router02 public immutable uniswapV2Router;
  address public immutable uniswapV2Pair;

  bool inSwapAndLiquify = false;
  bool public swapAndLiquifyEnabled = true;

  uint256 public _maxTxAmount = 30_000_000 * 10 ** 9; // 3%
  uint256 public _maxWalletSize = 30_000_000 * 10 ** 9; // 3%
  uint256 public _swapTokensAtAmount = 2000000 * 10 ** 9; //0.01%

  event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
  event SwapAndLiquifyEnabledUpdated(bool enabled);
  event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);

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

  constructor() {
    _rOwned[_msgSender()] = _rTotal;

    IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    marketingWallet = payable(0x7aaed1EC905cF7e558fDa64c8010aa8568a9984D);
    devTaxWallet = payable(0x92d8Da3b7dF826EFEf01a48b8D45e6Ba3F0287B9);

    uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

    uniswapV2Router = _uniswapV2Router;

    //exclude owner and this contract from fee
    _isExcludedFromFee[owner()] = true;
    _isExcludedFromFee[address(this)] = true;
    _isExcludedFromFee[devTaxWallet] = true;
    _isExcludedFromFee[marketingWallet] = true;

    emit Transfer(address(0), _msgSender(), _tTotal);
  }

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

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

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

  function totalSupply() public 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) public override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

  function allowance(address owner, address spender) public 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) public override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(
      sender,
      _msgSender(),
      _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")
    );
    return true;
  }

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

  function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
    _approve(
      _msgSender(),
      spender,
      _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")
    );
    return true;
  }

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

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

  function airdrop(address recipient, uint256 amount) external onlyOwner {
    _removeAllFee();
    _transfer(_msgSender(), recipient, amount * 10 ** 9);
    _restoreAllFee();
  }

  function airdropInternal(address recipient, uint256 amount) internal {
    _removeAllFee();
    _transfer(_msgSender(), recipient, amount);
    _restoreAllFee();
  }

  function airdropArray(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
    uint256 iterator = 0;
    require(newholders.length == amounts.length, "must be the same length");
    while (iterator < newholders.length) {
      airdropInternal(newholders[iterator], amounts[iterator] * 10 ** 9);
      iterator += 1;
    }
  }

  function deliver(uint256 tAmount) public {
    address sender = _msgSender();
    require(!_isExcluded[sender], "Excluded addresses cannot call this function");
    (uint256 rAmount, , , , , ) = _getValues(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rTotal = _rTotal.sub(rAmount);
    _tFeeTotal = _tFeeTotal.add(tAmount);
  }

  function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) {
    require(tAmount <= _tTotal, "Amount must be less than supply");
    if (!deductTransferFee) {
      (uint256 rAmount, , , , , ) = _getValues(tAmount);
      return rAmount;
    } else {
      (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
      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.div(currentRate);
  }

  function excludeFromReward(address account) public onlyOwner {
    require(!_isExcluded[account], "Account is already excluded");
    if (_rOwned[account] > 0) {
      _tOwned[account] = tokenFromReflection(_rOwned[account]);
    }
    _isExcluded[account] = true;
    _excluded.push(account);
  }

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

  function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount);
    _tOwned[sender] = _tOwned[sender].sub(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function excludeFromFee(address account) public onlyOwner {
    _isExcludedFromFee[account] = true;
  }

  function includeInFee(address account) public onlyOwner {
    _isExcludedFromFee[account] = false;
  }

  function setMarketingWallet(address walletAddress) public onlyOwner {
    marketingWallet = payable(walletAddress);
  }

  function updateBuyFees(uint256 taxFeeOnBuy, uint256 liquidityFeeOnBuy, uint256 devFeeOnBuy) external onlyOwner {
    _taxFeeOnBuy = taxFeeOnBuy;
    _liquidityFeeOnBuy = liquidityFeeOnBuy;
    _devFeeOnBuy = devFeeOnBuy;
    uint256 buyTotalFees = _taxFeeOnBuy + _liquidityFeeOnBuy + _devFeeOnBuy;
    require(buyTotalFees <= 700, "Must keep fees at 7% or less");
  }

  function updateSellFees(uint256 taxFeeOnSell, uint256 liquidityFeeOnSell, uint256 devFeeOnSell) external onlyOwner {
    _taxFeeOnSell = taxFeeOnSell;
    _liquidityFeeOnSell = liquidityFeeOnSell;
    _devFeeOnSell = devFeeOnSell;
    uint256 sellTotalFees = _taxFeeOnSell + _liquidityFeeOnSell + _devFeeOnSell;
    require(sellTotalFees <= 700, "Must keep fees at 7% or less");
  }

  function removeAllFee() external onlyOwner {
    _removeAllFee();
  }

  function _removeAllFee() private {
    if (_taxFee == 0 && _liquidityFee == 0) return;

    _previousTaxFee = _taxFee;
    _previousLiquidityFee = _liquidityFee;
    _previousDevFee = _devFee;

    _previousTaxFeeOnBuy = _taxFeeOnBuy;
    _previousLiquidityFeeOnBuy = _liquidityFeeOnBuy;
    _previousDevFeeOnBuy = _devFeeOnBuy;

    _previousTaxFeeOnSell = _taxFeeOnSell;
    _previousLiquidityFeeOnSell = _liquidityFeeOnSell;
    _previousDevFeeOnSell = _devFeeOnSell;

    _devFee = 0;
    _taxFee = 0;
    _liquidityFee = 0;

    _taxFeeOnBuy = 0;
    _liquidityFeeOnBuy = 0;
    _devFeeOnBuy = 0;

    _taxFeeOnSell = 0;
    _liquidityFeeOnSell = 0;
    _devFeeOnSell = 0;
  }

  function restoreAllFee() external onlyOwner {
    _restoreAllFee();
  }

  function _restoreAllFee() private {
    _taxFee = _previousTaxFee;
    _liquidityFee = _previousLiquidityFee;
    _devFee = _previousDevFee;

    _taxFeeOnBuy = _previousTaxFeeOnBuy;
    _liquidityFeeOnBuy = _previousLiquidityFeeOnBuy;
    _devFeeOnBuy = _previousDevFeeOnBuy;

    _taxFeeOnSell = _previousTaxFeeOnSell;
    _liquidityFeeOnSell = _previousLiquidityFeeOnSell;
    _devFeeOnSell = _previousDevFeeOnSell;
  }

  function setTxLimits(uint256 maxTxAmount, uint256 maxWalletSize, uint256 SwapThresholdAmount) external onlyOwner {
    require(maxTxAmount > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    require(maxWalletSize > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    require(SwapThresholdAmount > 100_000, "Swap Threshold Amount cannot be less than 100k");
    _swapTokensAtAmount = SwapThresholdAmount * 10 ** 9;
    _maxWalletSize = maxWalletSize * 10 ** 9;
    _maxTxAmount = maxTxAmount * 10 ** 9;
  }

  function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
    require(maxTxAmount > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    _maxTxAmount = maxTxAmount * 10 ** 9;
  }

  function setMaxWalletSize(uint256 maxWalletSize) public onlyOwner {
    require(maxWalletSize > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    _maxWalletSize = maxWalletSize * 10 ** 9;
  }

  function setSwapThresholdAmount(uint256 SwapThresholdAmount) external onlyOwner {
    require(SwapThresholdAmount > 100_000, "Swap Threshold Amount cannot be less than 100k");
    _swapTokensAtAmount = SwapThresholdAmount * 10 ** 9;
  }

  function claimTokens() public onlyOwner {
    marketingWallet.transfer(address(this).balance);
  }

  function claimOtherTokens(IERC20 tokenAddress, address walletaddress) external onlyOwner {
    tokenAddress.transfer(walletaddress, tokenAddress.balanceOf(address(this)));
  }

  function clearStuckBalance(address walletAddress) external onlyOwner {
    payable(walletAddress).transfer(address(this).balance);
  }

  function addBotWallet(address botwallet) external onlyOwner {
    botWallets[botwallet] = true;
  }

  function removeBotWallet(address botwallet) external onlyOwner {
    botWallets[botwallet] = false;
  }

  function getBotWalletStatus(address botwallet) public view returns (bool) {
    return botWallets[botwallet];
  }

  function allowtrading() external onlyOwner {
    canTrade = true;
  }

  function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
    swapAndLiquifyEnabled = _enabled;
    emit SwapAndLiquifyEnabledUpdated(_enabled);
  }

  function manualswap() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractBalance = balanceOf(address(this));
    swapTokensForEth(contractBalance);
  }

  function manualsend() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractETHBalance = address(this).balance;
    uint256 marketingBalance = contractETHBalance.mul(90).div(100);
    uint256 devBalance = contractETHBalance.mul(10).div(100);
    sendETHToFee(marketingBalance, devBalance);
  }

  function manualSwapAndLiquify() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractBalance = balanceOf(address(this));
    swapAndLiquify(contractBalance);
  }

  receive() external payable {}

  fallback() external payable {}

  function _reflectFee(uint256 rFee, uint256 tFee) private {
    _rTotal = _rTotal.sub(rFee);
    _tFeeTotal = _tFeeTotal.add(tFee);
  }

  function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
    (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
    (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
    return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
  }

  function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
    uint256 tFee = calculateTaxFee(tAmount);
    uint256 tLiquidity = calculateLiquidityFee(tAmount);
    uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
    return (tTransferAmount, tFee, tLiquidity);
  }

  function _getRValues(
    uint256 tAmount,
    uint256 tFee,
    uint256 tLiquidity,
    uint256 currentRate
  ) private pure returns (uint256, uint256, uint256) {
    uint256 rAmount = tAmount.mul(currentRate);
    uint256 rFee = tFee.mul(currentRate);
    uint256 rLiquidity = tLiquidity.mul(currentRate);
    uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
    return (rAmount, rTransferAmount, rFee);
  }

  function _getRate() private view returns (uint256) {
    (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
    return rSupply.div(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.sub(_rOwned[_excluded[i]]);
      tSupply = tSupply.sub(_tOwned[_excluded[i]]);
    }
    if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
    return (rSupply, tSupply);
  }

  function _takeLiquidity(uint256 tLiquidity) private {
    uint256 currentRate = _getRate();
    uint256 rLiquidity = tLiquidity.mul(currentRate);
    _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
  }

  function calculateTaxFee(uint256 _amount) private view returns (uint256) {
    return _amount.mul(_taxFee).div(10 ** 4);
  }

  function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
    return _amount.mul(_liquidityFee).div(10 ** 4);
  }

  function isExcludedFromFee(address account) public view returns (bool) {
    return _isExcludedFromFee[account];
  }

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

  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");
    require(amount > 0, "Transfer amount must be greater than zero");
    if (from != owner() && to != owner()) require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

    if (!canTrade) {
      require(from == owner(), "TOKEN: This account cannot send tokens until trading is enabled");
    }

    if (botWallets[from] || botWallets[to]) {
      require(botsCantTrade, "bots arent allowed to trade");
    }

    if (to != uniswapV2Pair) {
      require(balanceOf(to) + amount < _maxWalletSize, "TOKEN: Balance exceeds wallet size!");
    }

    uint256 contractTokenBalance = balanceOf(address(this));

    if (contractTokenBalance >= _maxTxAmount) {
      contractTokenBalance = _maxTxAmount;
    }

    bool overMinTokenBalance = contractTokenBalance >= _swapTokensAtAmount;
    if (overMinTokenBalance && !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled) {
      swapAndLiquify(contractTokenBalance);
    }

    bool takeFee = true;

    if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
      takeFee = false;
    } else {
      if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
        _liquidityFee = _liquidityFeeOnBuy;
        _taxFee = _taxFeeOnBuy + _devFeeOnBuy;
      }

      if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
        _liquidityFee = _liquidityFeeOnSell;
        _taxFee = _taxFeeOnSell + _devFeeOnSell;
      }
    }

    _tokenTransfer(from, to, amount, takeFee);
  }

  function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
    if (contractTokenBalance > _swapTokensAtAmount * 10) {
      contractTokenBalance = _swapTokensAtAmount * 10;
    }

    uint256 totalLiquidityFee = (_liquidityFeeOnBuy + _liquidityFeeOnSell).mul(10 ** 9);
    uint256 totalDevFee = (_devFeeOnBuy + _devFeeOnSell).mul(10 ** 9);
    uint256 totalMarketingFee = (_taxFeeOnBuy + _taxFeeOnSell).mul(10 ** 9);
    uint256 totalFee = totalMarketingFee + totalLiquidityFee + totalDevFee;

    uint256 amountForLiquidity = (contractTokenBalance.mul(totalLiquidityFee)).div(totalFee);
    uint256 halfForLiquidity = amountForLiquidity.div(2);
    uint256 halfToSwapToETH = amountForLiquidity.sub(halfForLiquidity);

    uint256 amountToSwapForETH = contractTokenBalance.sub(halfForLiquidity);

    uint256 initialBalance = address(this).balance;
    swapTokensForEth(amountToSwapForETH);

    uint256 newBalance = address(this).balance.sub(initialBalance);
    uint256 newTotalFee = totalFee - totalLiquidityFee.div(2);
    uint256 ethForLiquidity = ((newBalance * totalLiquidityFee) / 2).div(newTotalFee);

    if (halfForLiquidity > 0 && ethForLiquidity > 0) {
      addLiquidity(halfForLiquidity, ethForLiquidity);
      emit SwapAndLiquify(halfToSwapToETH, newBalance, halfForLiquidity);
    }

    uint256 ethForDev = (newBalance.mul(totalDevFee)).div(newTotalFee);
    uint256 ethForMarketing = newBalance - ethForLiquidity - ethForDev;

    if (ethForMarketing > 0 && ethForDev > 0) sendETHToFee(ethForMarketing, ethForDev);
  }

  function sendETHToFee(uint256 marketingBalance, uint256 devBalance) private {
    marketingWallet.transfer(marketingBalance);
    devTaxWallet.transfer(devBalance);
  }

  function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = uniswapV2Router.WETH();
    _approve(address(this), address(uniswapV2Router), tokenAmount);
    uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      tokenAmount,
      0,
      path,
      address(this),
      block.timestamp
    );
  }

  function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
    _approve(address(this), address(uniswapV2Router), tokenAmount);

    uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, owner(), block.timestamp);
  }

  function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
    if (!takeFee) _removeAllFee();

    if (_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferFromExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
      _transferToExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferStandard(sender, recipient, amount);
    } else if (_isExcluded[sender] && _isExcluded[recipient]) {
      _transferBothExcluded(sender, recipient, amount);
    } else {
      _transferStandard(sender, recipient, amount);
    }

    if (!takeFee) _restoreAllFee();
  }

  function _transferStandard(address sender, address recipient, uint256 tAmount) private {
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount);
    _tOwned[sender] = _tOwned[sender].sub(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"botwallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowtrading","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletaddress","type":"address"}],"name":"claimOtherTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"botwallet","type":"address"}],"name":"getBotWalletStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFee","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":"manualSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","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":"removeAllFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"botwallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreAllFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletSize","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SwapThresholdAmount","type":"uint256"}],"name":"setSwapThresholdAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletSize","type":"uint256"},{"internalType":"uint256","name":"SwapThresholdAmount","type":"uint256"}],"name":"setTxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"devFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526008805461ffff19169055670de0b6b3a764000060098190556200002b906000196200043e565b620000399060001962000461565b600a556040805180820190915260058152644a696f6e6760d81b6020820152600e906200006790826200052e565b50604080518082019091526003815262e59ba760e81b6020820152600f906200009190826200052e565b506010805460ff1916600917905561012c601181905560128190556013819055601481905560158190556016556064601781905560188190556019819055601a819055601b819055601c819055601d819055601e819055601f819055602081905560218190556022556023805461ffff1916610100179055666a94d74f430000602481905560255566071afd498d00006026553480156200013157600080fd5b506200013d33620003ee565b600a543360009081526001602090815260409182902092909255600c80546001600160a01b0319908116737aaed1ec905cf7e558fda64c8010aa8568a9984d17909155600d80549091167392d8da3b7df826efef01a48b8d45e6ba3f0287b9179055805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa158015620001ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002129190620005fa565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000260573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002869190620005fa565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fa9190620005fa565b6001600160a01b0390811660a0528116608052600160046000620003266000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526004909352818320805485166001908117909155600d54821684528284208054861682179055600c54909116835291208054909216179055620003973390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600954604051620003df91815260200190565b60405180910390a3506200062c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826200045c57634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156200048357634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004b457607f821691505b602082108103620004d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200052957600081815260208120601f850160051c81016020861015620005045750805b601f850160051c820191505b81811015620005255782815560010162000510565b5050505b505050565b81516001600160401b038111156200054a576200054a62000489565b62000562816200055b84546200049f565b84620004db565b602080601f8311600181146200059a5760008415620005815750858301515b600019600386901b1c1916600185901b17855562000525565b600085815260208120601f198616915b82811015620005cb57888601518255948401946001909101908401620005aa565b5085821015620005ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200060d57600080fd5b81516001600160a01b03811681146200062557600080fd5b9392505050565b60805160a0516133346200069f6000396000818161061401528181611ceb01528181611dcd01528181611e740152611f060152600081816103dc01528181611eb001528181611f420152818161244b015281816125040152818161254001528181612959015261298001526133346000f3fe6080604052600436106103275760003560e01c806360d48489116101ae578063a457c2d7116100eb578063dd62ed3e1161008f578063ea1644d51161006c578063ea1644d5146109b9578063ea2f0b37146109d9578063ec28438a146109f9578063f2fde38b14610a1957005b8063dd62ed3e1461093e578063e46b3b3f14610984578063e7e3e3a7146109a457005b8063c17b5b8c116100c8578063c17b5b8c146108c9578063c3c8cd80146108e9578063c49b9a80146108fe578063d4a3883f1461091e57005b8063a457c2d714610874578063a633423114610894578063a9059cbb146108a957005b80637d1db4a5116101525780638ba4cc3c1161012f5780638ba4cc3c1461080b5780638da5cb5b1461082b5780638f9a55c01461084957806395d89b411461085f57005b80637d1db4a51461079c5780638095d564146107b257806388f82020146107d257005b806370a082311161018b57806370a0823114610732578063715018a614610752578063733b864f14610767578063764d72bf1461077c57005b806360d48489146106ce5780636bc87c3a146107075780636fc3eaec1461071d57005b8063313ce5671161027c5780634549b039116102205780634a74bb02116101fd5780634a74bb021461063657806352390c02146106555780635342acb4146106755780635d098b38146106ae57005b80634549b039146105cd57806348c54b9d146105ed57806349bd5a5e1461060257005b80633ae7dc20116102595780633ae7dc20146105575780633b124fe7146105775780633bd5d1731461058d578063437823ec146105ad57005b8063313ce567146104f55780633685d41914610517578063395093511461053757005b806323b872dd116102e35780632d838119116102c05780632d8381191461048b5780632f05205c146104ab5780632fd689e3146104ca578063301370af146104e057005b806323b872dd1461042b57806329e04b4a1461044b5780632a3606311461046b57005b80630305caff1461033057806306fdde0314610350578063095ea7b31461037b57806313114a9d146103ab5780631694505e146103ca57806318160ddd1461041657005b3661032e57005b005b34801561033c57600080fd5b5061032e61034b366004612dd3565b610a39565b34801561035c57600080fd5b50610365610a62565b6040516103729190612df0565b60405180910390f35b34801561038757600080fd5b5061039b610396366004612e3e565b610af4565b6040519015158152602001610372565b3480156103b757600080fd5b50600b545b604051908152602001610372565b3480156103d657600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610372565b34801561042257600080fd5b506009546103bc565b34801561043757600080fd5b5061039b610446366004612e6a565b610b0b565b34801561045757600080fd5b5061032e610466366004612eab565b610b74565b34801561047757600080fd5b5061032e610486366004612dd3565b610bbb565b34801561049757600080fd5b506103bc6104a6366004612eab565b610be7565b3480156104b757600080fd5b5060085461039b90610100900460ff1681565b3480156104d657600080fd5b506103bc60265481565b3480156104ec57600080fd5b5061032e610c6b565b34801561050157600080fd5b5060105460405160ff9091168152602001610372565b34801561052357600080fd5b5061032e610532366004612dd3565b610c7d565b34801561054357600080fd5b5061039b610552366004612e3e565b610e11565b34801561056357600080fd5b5061032e610572366004612ec4565b610e47565b34801561058357600080fd5b506103bc60135481565b34801561059957600080fd5b5061032e6105a8366004612eab565b610f35565b3480156105b957600080fd5b5061032e6105c8366004612dd3565b61101f565b3480156105d957600080fd5b506103bc6105e8366004612f0b565b61104b565b3480156105f957600080fd5b5061032e6110d8565b34801561060e57600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064257600080fd5b5060235461039b90610100900460ff1681565b34801561066157600080fd5b5061032e610670366004612dd3565b61111c565b34801561068157600080fd5b5061039b610690366004612dd3565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106ba57600080fd5b5061032e6106c9366004612dd3565b61124d565b3480156106da57600080fd5b5061039b6106e9366004612dd3565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071357600080fd5b506103bc601f5481565b34801561072957600080fd5b5061032e611277565b34801561073e57600080fd5b506103bc61074d366004612dd3565b6112e5565b34801561075e57600080fd5b5061032e611344565b34801561077357600080fd5b5061032e611356565b34801561078857600080fd5b5061032e610797366004612dd3565b6113a1565b3480156107a857600080fd5b506103bc60245481565b3480156107be57600080fd5b5061032e6107cd366004612f30565b6113de565b3480156107de57600080fd5b5061039b6107ed366004612dd3565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561081757600080fd5b5061032e610826366004612e3e565b611466565b34801561083757600080fd5b506000546001600160a01b03166103fe565b34801561085557600080fd5b506103bc60255481565b34801561086b57600080fd5b50610365611496565b34801561088057600080fd5b5061039b61088f366004612e3e565b6114a5565b3480156108a057600080fd5b5061032e6114f4565b3480156108b557600080fd5b5061039b6108c4366004612e3e565b61150d565b3480156108d557600080fd5b5061032e6108e4366004612f30565b61151a565b3480156108f557600080fd5b5061032e61153e565b34801561090a57600080fd5b5061032e610919366004612f5c565b611589565b34801561092a57600080fd5b5061032e610939366004612fc5565b6115e5565b34801561094a57600080fd5b506103bc610959366004612ec4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561099057600080fd5b5061032e61099f366004612f30565b6116b6565b3480156109b057600080fd5b5061032e61175c565b3480156109c557600080fd5b5061032e6109d4366004612eab565b61176c565b3480156109e557600080fd5b5061032e6109f4366004612dd3565b6117aa565b348015610a0557600080fd5b5061032e610a14366004612eab565b6117d3565b348015610a2557600080fd5b5061032e610a34366004612dd3565b611811565b610a41611887565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6060600e8054610a7190613031565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613031565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b6000610b013384846118e1565b5060015b92915050565b6000610b18848484611a05565b610b6a8433610b65856040518060600160405280602881526020016132b2602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190611faa565b6118e1565b5060019392505050565b610b7c611887565b620186a08111610ba75760405162461bcd60e51b8152600401610b9e9061306b565b60405180910390fd5b610bb581633b9aca006130cf565b60265550565b610bc3611887565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54821115610c4e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b9e565b6000610c58611fd6565b9050610c648382611ff9565b9392505050565b610c73611887565b610c7b612005565b565b610c85611887565b6001600160a01b03811660009081526005602052604090205460ff16610ced5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b60005b600654811015610e0d57816001600160a01b031660068281548110610d1757610d176130e6565b6000918252602090912001546001600160a01b031603610dfb5760068054610d41906001906130fc565b81548110610d5157610d516130e6565b600091825260209091200154600680546001600160a01b039092169183908110610d7d57610d7d6130e6565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610dd557610dd561310f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e0581613125565b915050610cf0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610b01918590610b65908661207f565b610e4f611887565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061313e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613157565b505050565b3360008181526005602052604090205460ff1615610faa5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610b9e565b6000610fb58361208b565b505050506001600160a01b038416600090815260016020526040902054919250610fe1919050826120da565b6001600160a01b038316600090815260016020526040902055600a5461100790826120da565b600a55600b54611017908461207f565b600b55505050565b611027611887565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b600060095483111561109f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b9e565b816110be5760006110af8461208b565b50939550610b05945050505050565b60006110c98461208b565b50929550610b05945050505050565b6110e0611887565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611119573d6000803e3d6000fd5b50565b611124611887565b6001600160a01b03811660009081526005602052604090205460ff161561118d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b6001600160a01b038116600090815260016020526040902054156111e7576001600160a01b0381166000908152600160205260409020546111cd90610be7565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b611255611887565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b0316336001600160a01b031614806112a357506000546001600160a01b031633145b6112ac57600080fd5b4760006112c560646112bf84605a6120e6565b90611ff9565b905060006112d960646112bf85600a6120e6565b9050610f3082826120f2565b6001600160a01b03811660009081526005602052604081205460ff161561132257506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610b0590610be7565b61134c611887565b610c7b6000612167565b600c546001600160a01b0316336001600160a01b0316148061138257506000546001600160a01b031633145b61138b57600080fd5b6000611396306112e5565b9050611119816121b7565b6113a9611887565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610e0d573d6000803e3d6000fd5b6113e6611887565b6011839055601d82905560178190556000816114028486613174565b61140c9190613174565b90506102bc8111156114605760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203725206f72206c657373000000006044820152606401610b9e565b50505050565b61146e611887565b611476612005565b61148e338361148984633b9aca006130cf565b611a05565b610e0d6123af565b6060600f8054610a7190613031565b6000610b013384610b65856040518060600160405280602581526020016132da602591393360009081526003602090815260408083206001600160a01b038d1684529091529020549190611faa565b6114fc611887565b6008805461ff001916610100179055565b6000610b01338484611a05565b611522611887565b6012839055601e82905560188190556000816114028486613174565b600c546001600160a01b0316336001600160a01b0316148061156a57506000546001600160a01b031633145b61157357600080fd5b600061157e306112e5565b9050611119816123e7565b611591611887565b602380548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115da90831515815260200190565b60405180910390a150565b6115ed611887565b600083821461163e5760405162461bcd60e51b815260206004820152601760248201527f6d757374206265207468652073616d65206c656e6774680000000000000000006044820152606401610b9e565b838110156116af5761169d85858381811061165b5761165b6130e6565b90506020020160208101906116709190612dd3565b848484818110611682576116826130e6565b90506020020135633b9aca0061169891906130cf565b6125be565b6116a8600182613174565b905061163e565b5050505050565b6116be611887565b6298968083116116e05760405162461bcd60e51b8152600401610b9e90613187565b6298968082116117025760405162461bcd60e51b8152600401610b9e90613187565b620186a081116117245760405162461bcd60e51b8152600401610b9e9061306b565b61173281633b9aca006130cf565b60265561174382633b9aca006130cf565b60255561175483633b9aca006130cf565b602455505050565b611764611887565b610c7b6123af565b611774611887565b6298968081116117965760405162461bcd60e51b8152600401610b9e90613187565b6117a481633b9aca006130cf565b60255550565b6117b2611887565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6117db611887565b6298968081116117fd5760405162461bcd60e51b8152600401610b9e90613187565b61180b81633b9aca006130cf565b60245550565b611819611887565b6001600160a01b03811661187e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9e565b61111981612167565b6000546001600160a01b03163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b9e565b6001600160a01b0383166119435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9e565b6001600160a01b0382166119a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b9e565b6001600160a01b038216611acb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b9e565b60008111611b2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b9e565b6000546001600160a01b03848116911614801590611b5957506000546001600160a01b03838116911614155b15611bc157602454811115611bc15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b9e565b600854610100900460ff16611c53576000546001600160a01b03848116911614611c535760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610b9e565b6001600160a01b03831660009081526007602052604090205460ff1680611c9257506001600160a01b03821660009081526007602052604090205460ff165b15611ce95760085460ff16611ce95760405162461bcd60e51b815260206004820152601b60248201527f626f7473206172656e7420616c6c6f77656420746f20747261646500000000006044820152606401610b9e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614611d925760255481611d2f846112e5565b611d399190613174565b10611d925760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610b9e565b6000611d9d306112e5565b90506024548110611dad57506024545b60265481108015908190611dc4575060235460ff16155b8015611e0257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611e155750602354610100900460ff165b15611e2357611e23826121b7565b6001600160a01b03851660009081526004602052604090205460019060ff1680611e6557506001600160a01b03851660009081526004602052604090205460ff165b15611e7257506000611f96565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316148015611ee557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b15611f0457601d54601f55601754601154611f009190613174565b6013555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316148015611f7757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b15611f9657601e54601f55601854601254611f929190613174565b6013555b611fa2868686846125d1565b505050505050565b60008184841115611fce5760405162461bcd60e51b8152600401610b9e9190612df0565b505050900390565b6000806000611fe361273f565b9092509050611ff28282611ff9565b9250505090565b6000610c6482846131d3565b6013541580156120155750601f54155b1561201c57565b60138054601455601f805460205560198054601a5560118054601555601d805460215560178054601b5560128054601655601e805460225560188054601c5560009687905597869055958590559284905590839055829055819055908190559055565b6000610c648284613174565b60008060008060008060008060006120a28a6128c1565b92509250925060008060006120c08d86866120bb611fd6565b612903565b919f909e50909c50959a5093985091965092945050505050565b6000610c6482846130fc565b6000610c6482846130cf565b600c546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561212c573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610f30573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6023805460ff191660011790556026546121d290600a6130cf565b8111156121ea576026546121e790600a6130cf565b90505b600061220a633b9aca00601e54601d546122049190613174565b906120e6565b90506000612226633b9aca006018546017546122049190613174565b90506000612242633b9aca006012546011546122049190613174565b90506000826122518584613174565b61225b9190613174565b9050600061226d826112bf88886120e6565b9050600061227c826002611ff9565b9050600061228a83836120da565b9050600061229889846120da565b9050476122a4826123e7565b60006122b047836120da565b905060006122bf8b6002611ff9565b6122c990896130fc565b905060006122e78260026122dd8f876130cf565b6112bf91906131d3565b90506000871180156122f95750600081115b1561234a576123088782612953565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b600061235a836112bf868f6120e6565b905060008161236984876130fc565b61237391906130fc565b90506000811180156123855750600082115b156123945761239481836120f2565b50506023805460ff1916905550505050505050505050505050565b601454601355602054601f55601a54601955601554601155602154601d55601b54601755601654601255602254601e55601c54601855565b6023805460ff191660011790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612429576124296130e6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906131f5565b816001815181106124de576124de6130e6565b60200260200101906001600160a01b031690816001600160a01b031681525050612529307f0000000000000000000000000000000000000000000000000000000000000000846118e1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061257e908590600090869030904290600401613212565b600060405180830381600087803b15801561259857600080fd5b505af11580156125ac573d6000803e3d6000fd5b50506023805460ff1916905550505050565b6125c6612005565b61148e338383611a05565b806125de576125de612005565b6001600160a01b03841660009081526005602052604090205460ff16801561261f57506001600160a01b03831660009081526005602052604090205460ff16155b156126345761262f848484612a52565b612732565b6001600160a01b03841660009081526005602052604090205460ff1615801561267557506001600160a01b03831660009081526005602052604090205460ff165b156126855761262f848484612b78565b6001600160a01b03841660009081526005602052604090205460ff161580156126c757506001600160a01b03831660009081526005602052604090205460ff16155b156126d75761262f848484612c21565b6001600160a01b03841660009081526005602052604090205460ff16801561271757506001600160a01b03831660009081526005602052604090205460ff165b156127275761262f848484612c65565b612732848484612c21565b80611460576114606123af565b600a546009546000918291825b6006548110156128915782600160006006848154811061276e5761276e6130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127d957508160026000600684815481106127b2576127b26130e6565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156127ef57600a54600954945094505050509091565b6128356001600060068481548110612809576128096130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906120da565b925061287d6002600060068481548110612851576128516130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906120da565b91508061288981613125565b91505061274c565b50600954600a546128a191611ff9565b8210156128b857600a546009549350935050509091565b90939092509050565b6000806000806128d085612cd8565b905060006128dd86612cf5565b905060006128f5826128ef89866120da565b906120da565b979296509094509092505050565b600080808061291288866120e6565b9050600061292088876120e6565b9050600061292e88886120e6565b90506000612940826128ef86866120da565b939b939a50919850919650505050505050565b61297e307f0000000000000000000000000000000000000000000000000000000000000000846118e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806129c56000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612a2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116af9190613283565b600080600080600080612a648761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612a9690886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612ac590876120da565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612af4908661207f565b6001600160a01b038916600090815260016020526040902055612b1681612d12565b612b208483612d9a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b6591815260200190565b60405180910390a3505050505050505050565b600080600080600080612b8a8761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612bbc90876120da565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612bf2908461207f565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612af4908661207f565b600080600080600080612c338761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612ac590876120da565b600080600080600080612c778761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612ca990886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612bbc90876120da565b6000610b056127106112bf601354856120e690919063ffffffff16565b6000610b056127106112bf601f54856120e690919063ffffffff16565b6000612d1c611fd6565b90506000612d2a83836120e6565b30600090815260016020526040902054909150612d47908261207f565b3060009081526001602090815260408083209390935560059052205460ff1615610f305730600090815260026020526040902054612d85908461207f565b30600090815260026020526040902055505050565b600a54612da790836120da565b600a55600b54612db7908261207f565b600b555050565b6001600160a01b038116811461111957600080fd5b600060208284031215612de557600080fd5b8135610c6481612dbe565b600060208083528351808285015260005b81811015612e1d57858101830151858201604001528201612e01565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612e5157600080fd5b8235612e5c81612dbe565b946020939093013593505050565b600080600060608486031215612e7f57600080fd5b8335612e8a81612dbe565b92506020840135612e9a81612dbe565b929592945050506040919091013590565b600060208284031215612ebd57600080fd5b5035919050565b60008060408385031215612ed757600080fd5b8235612ee281612dbe565b91506020830135612ef281612dbe565b809150509250929050565b801515811461111957600080fd5b60008060408385031215612f1e57600080fd5b823591506020830135612ef281612efd565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612f6e57600080fd5b8135610c6481612efd565b60008083601f840112612f8b57600080fd5b50813567ffffffffffffffff811115612fa357600080fd5b6020830191508360208260051b8501011115612fbe57600080fd5b9250929050565b60008060008060408587031215612fdb57600080fd5b843567ffffffffffffffff80821115612ff357600080fd5b612fff88838901612f79565b9096509450602087013591508082111561301857600080fd5b5061302587828801612f79565b95989497509550505050565b600181811c9082168061304557607f821691505b60208210810361306557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f53776170205468726573686f6c6420416d6f756e742063616e6e6f742062652060408201526d6c657373207468616e203130306b60901b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b0557610b056130b9565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0557610b056130b9565b634e487b7160e01b600052603160045260246000fd5b600060018201613137576131376130b9565b5060010190565b60006020828403121561315057600080fd5b5051919050565b60006020828403121561316957600080fd5b8151610c6481612efd565b80820180821115610b0557610b056130b9565b6020808252602c908201527f4d617820547820416d6f756e742063616e6e6f74206265206c6573732074686160408201526b371018981026b4b63634b7b760a11b606082015260800190565b6000826131f057634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561320757600080fd5b8151610c6481612dbe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132625784516001600160a01b03168352938301939183019160010161323d565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329857600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c6d5a32e1037b0cd73ecd5144ded34944918c80c932daf93d8302984df9ddcb264736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103275760003560e01c806360d48489116101ae578063a457c2d7116100eb578063dd62ed3e1161008f578063ea1644d51161006c578063ea1644d5146109b9578063ea2f0b37146109d9578063ec28438a146109f9578063f2fde38b14610a1957005b8063dd62ed3e1461093e578063e46b3b3f14610984578063e7e3e3a7146109a457005b8063c17b5b8c116100c8578063c17b5b8c146108c9578063c3c8cd80146108e9578063c49b9a80146108fe578063d4a3883f1461091e57005b8063a457c2d714610874578063a633423114610894578063a9059cbb146108a957005b80637d1db4a5116101525780638ba4cc3c1161012f5780638ba4cc3c1461080b5780638da5cb5b1461082b5780638f9a55c01461084957806395d89b411461085f57005b80637d1db4a51461079c5780638095d564146107b257806388f82020146107d257005b806370a082311161018b57806370a0823114610732578063715018a614610752578063733b864f14610767578063764d72bf1461077c57005b806360d48489146106ce5780636bc87c3a146107075780636fc3eaec1461071d57005b8063313ce5671161027c5780634549b039116102205780634a74bb02116101fd5780634a74bb021461063657806352390c02146106555780635342acb4146106755780635d098b38146106ae57005b80634549b039146105cd57806348c54b9d146105ed57806349bd5a5e1461060257005b80633ae7dc20116102595780633ae7dc20146105575780633b124fe7146105775780633bd5d1731461058d578063437823ec146105ad57005b8063313ce567146104f55780633685d41914610517578063395093511461053757005b806323b872dd116102e35780632d838119116102c05780632d8381191461048b5780632f05205c146104ab5780632fd689e3146104ca578063301370af146104e057005b806323b872dd1461042b57806329e04b4a1461044b5780632a3606311461046b57005b80630305caff1461033057806306fdde0314610350578063095ea7b31461037b57806313114a9d146103ab5780631694505e146103ca57806318160ddd1461041657005b3661032e57005b005b34801561033c57600080fd5b5061032e61034b366004612dd3565b610a39565b34801561035c57600080fd5b50610365610a62565b6040516103729190612df0565b60405180910390f35b34801561038757600080fd5b5061039b610396366004612e3e565b610af4565b6040519015158152602001610372565b3480156103b757600080fd5b50600b545b604051908152602001610372565b3480156103d657600080fd5b506103fe7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610372565b34801561042257600080fd5b506009546103bc565b34801561043757600080fd5b5061039b610446366004612e6a565b610b0b565b34801561045757600080fd5b5061032e610466366004612eab565b610b74565b34801561047757600080fd5b5061032e610486366004612dd3565b610bbb565b34801561049757600080fd5b506103bc6104a6366004612eab565b610be7565b3480156104b757600080fd5b5060085461039b90610100900460ff1681565b3480156104d657600080fd5b506103bc60265481565b3480156104ec57600080fd5b5061032e610c6b565b34801561050157600080fd5b5060105460405160ff9091168152602001610372565b34801561052357600080fd5b5061032e610532366004612dd3565b610c7d565b34801561054357600080fd5b5061039b610552366004612e3e565b610e11565b34801561056357600080fd5b5061032e610572366004612ec4565b610e47565b34801561058357600080fd5b506103bc60135481565b34801561059957600080fd5b5061032e6105a8366004612eab565b610f35565b3480156105b957600080fd5b5061032e6105c8366004612dd3565b61101f565b3480156105d957600080fd5b506103bc6105e8366004612f0b565b61104b565b3480156105f957600080fd5b5061032e6110d8565b34801561060e57600080fd5b506103fe7f0000000000000000000000008ab37e47ec524c71af2801f38abfb99bddedabee81565b34801561064257600080fd5b5060235461039b90610100900460ff1681565b34801561066157600080fd5b5061032e610670366004612dd3565b61111c565b34801561068157600080fd5b5061039b610690366004612dd3565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106ba57600080fd5b5061032e6106c9366004612dd3565b61124d565b3480156106da57600080fd5b5061039b6106e9366004612dd3565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071357600080fd5b506103bc601f5481565b34801561072957600080fd5b5061032e611277565b34801561073e57600080fd5b506103bc61074d366004612dd3565b6112e5565b34801561075e57600080fd5b5061032e611344565b34801561077357600080fd5b5061032e611356565b34801561078857600080fd5b5061032e610797366004612dd3565b6113a1565b3480156107a857600080fd5b506103bc60245481565b3480156107be57600080fd5b5061032e6107cd366004612f30565b6113de565b3480156107de57600080fd5b5061039b6107ed366004612dd3565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561081757600080fd5b5061032e610826366004612e3e565b611466565b34801561083757600080fd5b506000546001600160a01b03166103fe565b34801561085557600080fd5b506103bc60255481565b34801561086b57600080fd5b50610365611496565b34801561088057600080fd5b5061039b61088f366004612e3e565b6114a5565b3480156108a057600080fd5b5061032e6114f4565b3480156108b557600080fd5b5061039b6108c4366004612e3e565b61150d565b3480156108d557600080fd5b5061032e6108e4366004612f30565b61151a565b3480156108f557600080fd5b5061032e61153e565b34801561090a57600080fd5b5061032e610919366004612f5c565b611589565b34801561092a57600080fd5b5061032e610939366004612fc5565b6115e5565b34801561094a57600080fd5b506103bc610959366004612ec4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561099057600080fd5b5061032e61099f366004612f30565b6116b6565b3480156109b057600080fd5b5061032e61175c565b3480156109c557600080fd5b5061032e6109d4366004612eab565b61176c565b3480156109e557600080fd5b5061032e6109f4366004612dd3565b6117aa565b348015610a0557600080fd5b5061032e610a14366004612eab565b6117d3565b348015610a2557600080fd5b5061032e610a34366004612dd3565b611811565b610a41611887565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6060600e8054610a7190613031565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613031565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b6000610b013384846118e1565b5060015b92915050565b6000610b18848484611a05565b610b6a8433610b65856040518060600160405280602881526020016132b2602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190611faa565b6118e1565b5060019392505050565b610b7c611887565b620186a08111610ba75760405162461bcd60e51b8152600401610b9e9061306b565b60405180910390fd5b610bb581633b9aca006130cf565b60265550565b610bc3611887565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54821115610c4e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b9e565b6000610c58611fd6565b9050610c648382611ff9565b9392505050565b610c73611887565b610c7b612005565b565b610c85611887565b6001600160a01b03811660009081526005602052604090205460ff16610ced5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b60005b600654811015610e0d57816001600160a01b031660068281548110610d1757610d176130e6565b6000918252602090912001546001600160a01b031603610dfb5760068054610d41906001906130fc565b81548110610d5157610d516130e6565b600091825260209091200154600680546001600160a01b039092169183908110610d7d57610d7d6130e6565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610dd557610dd561310f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e0581613125565b915050610cf0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610b01918590610b65908661207f565b610e4f611887565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061313e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613157565b505050565b3360008181526005602052604090205460ff1615610faa5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610b9e565b6000610fb58361208b565b505050506001600160a01b038416600090815260016020526040902054919250610fe1919050826120da565b6001600160a01b038316600090815260016020526040902055600a5461100790826120da565b600a55600b54611017908461207f565b600b55505050565b611027611887565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b600060095483111561109f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b9e565b816110be5760006110af8461208b565b50939550610b05945050505050565b60006110c98461208b565b50929550610b05945050505050565b6110e0611887565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611119573d6000803e3d6000fd5b50565b611124611887565b6001600160a01b03811660009081526005602052604090205460ff161561118d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b6001600160a01b038116600090815260016020526040902054156111e7576001600160a01b0381166000908152600160205260409020546111cd90610be7565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b611255611887565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b0316336001600160a01b031614806112a357506000546001600160a01b031633145b6112ac57600080fd5b4760006112c560646112bf84605a6120e6565b90611ff9565b905060006112d960646112bf85600a6120e6565b9050610f3082826120f2565b6001600160a01b03811660009081526005602052604081205460ff161561132257506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610b0590610be7565b61134c611887565b610c7b6000612167565b600c546001600160a01b0316336001600160a01b0316148061138257506000546001600160a01b031633145b61138b57600080fd5b6000611396306112e5565b9050611119816121b7565b6113a9611887565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610e0d573d6000803e3d6000fd5b6113e6611887565b6011839055601d82905560178190556000816114028486613174565b61140c9190613174565b90506102bc8111156114605760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203725206f72206c657373000000006044820152606401610b9e565b50505050565b61146e611887565b611476612005565b61148e338361148984633b9aca006130cf565b611a05565b610e0d6123af565b6060600f8054610a7190613031565b6000610b013384610b65856040518060600160405280602581526020016132da602591393360009081526003602090815260408083206001600160a01b038d1684529091529020549190611faa565b6114fc611887565b6008805461ff001916610100179055565b6000610b01338484611a05565b611522611887565b6012839055601e82905560188190556000816114028486613174565b600c546001600160a01b0316336001600160a01b0316148061156a57506000546001600160a01b031633145b61157357600080fd5b600061157e306112e5565b9050611119816123e7565b611591611887565b602380548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115da90831515815260200190565b60405180910390a150565b6115ed611887565b600083821461163e5760405162461bcd60e51b815260206004820152601760248201527f6d757374206265207468652073616d65206c656e6774680000000000000000006044820152606401610b9e565b838110156116af5761169d85858381811061165b5761165b6130e6565b90506020020160208101906116709190612dd3565b848484818110611682576116826130e6565b90506020020135633b9aca0061169891906130cf565b6125be565b6116a8600182613174565b905061163e565b5050505050565b6116be611887565b6298968083116116e05760405162461bcd60e51b8152600401610b9e90613187565b6298968082116117025760405162461bcd60e51b8152600401610b9e90613187565b620186a081116117245760405162461bcd60e51b8152600401610b9e9061306b565b61173281633b9aca006130cf565b60265561174382633b9aca006130cf565b60255561175483633b9aca006130cf565b602455505050565b611764611887565b610c7b6123af565b611774611887565b6298968081116117965760405162461bcd60e51b8152600401610b9e90613187565b6117a481633b9aca006130cf565b60255550565b6117b2611887565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6117db611887565b6298968081116117fd5760405162461bcd60e51b8152600401610b9e90613187565b61180b81633b9aca006130cf565b60245550565b611819611887565b6001600160a01b03811661187e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9e565b61111981612167565b6000546001600160a01b03163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b9e565b6001600160a01b0383166119435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9e565b6001600160a01b0382166119a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b9e565b6001600160a01b038216611acb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b9e565b60008111611b2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b9e565b6000546001600160a01b03848116911614801590611b5957506000546001600160a01b03838116911614155b15611bc157602454811115611bc15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b9e565b600854610100900460ff16611c53576000546001600160a01b03848116911614611c535760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610b9e565b6001600160a01b03831660009081526007602052604090205460ff1680611c9257506001600160a01b03821660009081526007602052604090205460ff165b15611ce95760085460ff16611ce95760405162461bcd60e51b815260206004820152601b60248201527f626f7473206172656e7420616c6c6f77656420746f20747261646500000000006044820152606401610b9e565b7f0000000000000000000000008ab37e47ec524c71af2801f38abfb99bddedabee6001600160a01b0316826001600160a01b031614611d925760255481611d2f846112e5565b611d399190613174565b10611d925760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610b9e565b6000611d9d306112e5565b90506024548110611dad57506024545b60265481108015908190611dc4575060235460ff16155b8015611e0257507f0000000000000000000000008ab37e47ec524c71af2801f38abfb99bddedabee6001600160a01b0316856001600160a01b031614155b8015611e155750602354610100900460ff165b15611e2357611e23826121b7565b6001600160a01b03851660009081526004602052604090205460019060ff1680611e6557506001600160a01b03851660009081526004602052604090205460ff165b15611e7257506000611f96565b7f0000000000000000000000008ab37e47ec524c71af2801f38abfb99bddedabee6001600160a01b0316866001600160a01b0316148015611ee557507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b031614155b15611f0457601d54601f55601754601154611f009190613174565b6013555b7f0000000000000000000000008ab37e47ec524c71af2801f38abfb99bddedabee6001600160a01b0316856001600160a01b0316148015611f7757507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316866001600160a01b031614155b15611f9657601e54601f55601854601254611f929190613174565b6013555b611fa2868686846125d1565b505050505050565b60008184841115611fce5760405162461bcd60e51b8152600401610b9e9190612df0565b505050900390565b6000806000611fe361273f565b9092509050611ff28282611ff9565b9250505090565b6000610c6482846131d3565b6013541580156120155750601f54155b1561201c57565b60138054601455601f805460205560198054601a5560118054601555601d805460215560178054601b5560128054601655601e805460225560188054601c5560009687905597869055958590559284905590839055829055819055908190559055565b6000610c648284613174565b60008060008060008060008060006120a28a6128c1565b92509250925060008060006120c08d86866120bb611fd6565b612903565b919f909e50909c50959a5093985091965092945050505050565b6000610c6482846130fc565b6000610c6482846130cf565b600c546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561212c573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610f30573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6023805460ff191660011790556026546121d290600a6130cf565b8111156121ea576026546121e790600a6130cf565b90505b600061220a633b9aca00601e54601d546122049190613174565b906120e6565b90506000612226633b9aca006018546017546122049190613174565b90506000612242633b9aca006012546011546122049190613174565b90506000826122518584613174565b61225b9190613174565b9050600061226d826112bf88886120e6565b9050600061227c826002611ff9565b9050600061228a83836120da565b9050600061229889846120da565b9050476122a4826123e7565b60006122b047836120da565b905060006122bf8b6002611ff9565b6122c990896130fc565b905060006122e78260026122dd8f876130cf565b6112bf91906131d3565b90506000871180156122f95750600081115b1561234a576123088782612953565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b600061235a836112bf868f6120e6565b905060008161236984876130fc565b61237391906130fc565b90506000811180156123855750600082115b156123945761239481836120f2565b50506023805460ff1916905550505050505050505050505050565b601454601355602054601f55601a54601955601554601155602154601d55601b54601755601654601255602254601e55601c54601855565b6023805460ff191660011790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612429576124296130e6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906131f5565b816001815181106124de576124de6130e6565b60200260200101906001600160a01b031690816001600160a01b031681525050612529307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118e1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061257e908590600090869030904290600401613212565b600060405180830381600087803b15801561259857600080fd5b505af11580156125ac573d6000803e3d6000fd5b50506023805460ff1916905550505050565b6125c6612005565b61148e338383611a05565b806125de576125de612005565b6001600160a01b03841660009081526005602052604090205460ff16801561261f57506001600160a01b03831660009081526005602052604090205460ff16155b156126345761262f848484612a52565b612732565b6001600160a01b03841660009081526005602052604090205460ff1615801561267557506001600160a01b03831660009081526005602052604090205460ff165b156126855761262f848484612b78565b6001600160a01b03841660009081526005602052604090205460ff161580156126c757506001600160a01b03831660009081526005602052604090205460ff16155b156126d75761262f848484612c21565b6001600160a01b03841660009081526005602052604090205460ff16801561271757506001600160a01b03831660009081526005602052604090205460ff165b156127275761262f848484612c65565b612732848484612c21565b80611460576114606123af565b600a546009546000918291825b6006548110156128915782600160006006848154811061276e5761276e6130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127d957508160026000600684815481106127b2576127b26130e6565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156127ef57600a54600954945094505050509091565b6128356001600060068481548110612809576128096130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906120da565b925061287d6002600060068481548110612851576128516130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906120da565b91508061288981613125565b91505061274c565b50600954600a546128a191611ff9565b8210156128b857600a546009549350935050509091565b90939092509050565b6000806000806128d085612cd8565b905060006128dd86612cf5565b905060006128f5826128ef89866120da565b906120da565b979296509094509092505050565b600080808061291288866120e6565b9050600061292088876120e6565b9050600061292e88886120e6565b90506000612940826128ef86866120da565b939b939a50919850919650505050505050565b61297e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118e1565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806129c56000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612a2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116af9190613283565b600080600080600080612a648761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612a9690886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612ac590876120da565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612af4908661207f565b6001600160a01b038916600090815260016020526040902055612b1681612d12565b612b208483612d9a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b6591815260200190565b60405180910390a3505050505050505050565b600080600080600080612b8a8761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612bbc90876120da565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612bf2908461207f565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612af4908661207f565b600080600080600080612c338761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612ac590876120da565b600080600080600080612c778761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612ca990886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612bbc90876120da565b6000610b056127106112bf601354856120e690919063ffffffff16565b6000610b056127106112bf601f54856120e690919063ffffffff16565b6000612d1c611fd6565b90506000612d2a83836120e6565b30600090815260016020526040902054909150612d47908261207f565b3060009081526001602090815260408083209390935560059052205460ff1615610f305730600090815260026020526040902054612d85908461207f565b30600090815260026020526040902055505050565b600a54612da790836120da565b600a55600b54612db7908261207f565b600b555050565b6001600160a01b038116811461111957600080fd5b600060208284031215612de557600080fd5b8135610c6481612dbe565b600060208083528351808285015260005b81811015612e1d57858101830151858201604001528201612e01565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612e5157600080fd5b8235612e5c81612dbe565b946020939093013593505050565b600080600060608486031215612e7f57600080fd5b8335612e8a81612dbe565b92506020840135612e9a81612dbe565b929592945050506040919091013590565b600060208284031215612ebd57600080fd5b5035919050565b60008060408385031215612ed757600080fd5b8235612ee281612dbe565b91506020830135612ef281612dbe565b809150509250929050565b801515811461111957600080fd5b60008060408385031215612f1e57600080fd5b823591506020830135612ef281612efd565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612f6e57600080fd5b8135610c6481612efd565b60008083601f840112612f8b57600080fd5b50813567ffffffffffffffff811115612fa357600080fd5b6020830191508360208260051b8501011115612fbe57600080fd5b9250929050565b60008060008060408587031215612fdb57600080fd5b843567ffffffffffffffff80821115612ff357600080fd5b612fff88838901612f79565b9096509450602087013591508082111561301857600080fd5b5061302587828801612f79565b95989497509550505050565b600181811c9082168061304557607f821691505b60208210810361306557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f53776170205468726573686f6c6420416d6f756e742063616e6e6f742062652060408201526d6c657373207468616e203130306b60901b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b0557610b056130b9565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0557610b056130b9565b634e487b7160e01b600052603160045260246000fd5b600060018201613137576131376130b9565b5060010190565b60006020828403121561315057600080fd5b5051919050565b60006020828403121561316957600080fd5b8151610c6481612efd565b80820180821115610b0557610b056130b9565b6020808252602c908201527f4d617820547820416d6f756e742063616e6e6f74206265206c6573732074686160408201526b371018981026b4b63634b7b760a11b606082015260800190565b6000826131f057634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561320757600080fd5b8151610c6481612dbe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132625784516001600160a01b03168352938301939183019160010161323d565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329857600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c6d5a32e1037b0cd73ecd5144ded34944918c80c932daf93d8302984df9ddcb264736f6c63430008120033

Deployed Bytecode Sourcemap

33528:23746:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46225:105;;;;;;;;;;-1:-1:-1;46225:105:0;;;;;:::i;:::-;;:::i;36865:77::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37713:151;;;;;;;;;;-1:-1:-1;37713:151:0;;;;;:::i;:::-;;:::i;:::-;;;1440:14:1;;1433:22;1415:41;;1403:2;1388:18;37713:151:0;1275:187:1;38830:81:0;;;;;;;;;;-1:-1:-1;38895:10:0;;38830:81;;;1613:25:1;;;1601:2;1586:18;38830:81:0;1467:177:1;35392:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1839:32:1;;;1821:51;;1809:2;1794:18;35392:51:0;1649:229:1;37118:89:0;;;;;;;;;;-1:-1:-1;37194:7:0;;37118:89;;37870:327;;;;;;;;;;-1:-1:-1;37870:327:0;;;;;:::i;:::-;;:::i;45442:239::-;;;;;;;;;;-1:-1:-1;45442:239:0;;;;;:::i;:::-;;:::i;46118:101::-;;;;;;;;;;-1:-1:-1;46118:101:0;;;;;:::i;:::-;;:::i;40417:239::-;;;;;;;;;;-1:-1:-1;40417:239:0;;;;;:::i;:::-;;:::i;34029:28::-;;;;;;;;;;-1:-1:-1;34029:28:0;;;;;;;;;;;35698:54;;;;;;;;;;;;;;;;43165:71;;;;;;;;;;;;;:::i;37035:77::-;;;;;;;;;;-1:-1:-1;37097:9:0;;37035:77;;37097:9;;;;2671:36:1;;2659:2;2644:18;37035:77:0;2529:184:1;40972:411:0;;;;;;;;;;-1:-1:-1;40972:411:0;;;;;:::i;:::-;;:::i;38203:208::-;;;;;;;;;;-1:-1:-1;38203:208:0;;;;;:::i;:::-;;:::i;45793:177::-;;;;;;;;;;-1:-1:-1;45793:177:0;;;;;:::i;:::-;;:::i;34539:37::-;;;;;;;;;;;;;;;;39644:356;;;;;;;;;;-1:-1:-1;39644:356:0;;;;;:::i;:::-;;:::i;42044:105::-;;;;;;;;;;-1:-1:-1;42044:105:0;;;;;:::i;:::-;;:::i;40006:405::-;;;;;;;;;;-1:-1:-1;40006:405:0;;;;;:::i;:::-;;:::i;45687:100::-;;;;;;;;;;;;;:::i;35448:38::-;;;;;;;;;;;;;;;35527:40;;;;;;;;;;-1:-1:-1;35527:40:0;;;;;;;;;;;40662:304;;;;;;;;;;-1:-1:-1;40662:304:0;;;;;:::i;:::-;;:::i;50157:118::-;;;;;;;;;;-1:-1:-1;50157:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;50242:27:0;50222:4;50242:27;;;:18;:27;;;;;;;;;50157:118;42265:121;;;;;;;;;;-1:-1:-1;42265:121:0;;;;;:::i;:::-;;:::i;46336:115::-;;;;;;;;;;-1:-1:-1;46336:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;46424:21:0;46404:4;46424:21;;;:10;:21;;;;;;;;;46336:115;35140:49;;;;;;;;;;;;;;;;46915:349;;;;;;;;;;;;;:::i;37213:188::-;;;;;;;;;;-1:-1:-1;37213:188:0;;;;;:::i;:::-;;:::i;13298:103::-;;;;;;;;;;;;;:::i;47270:216::-;;;;;;;;;;;;;:::i;45976:136::-;;;;;;;;;;-1:-1:-1;45976:136:0;;;;;:::i;:::-;;:::i;35574:50::-;;;;;;;;;;;;;;;;42392:373;;;;;;;;;;-1:-1:-1;42392:373:0;;;;;:::i;:::-;;:::i;38710:114::-;;;;;;;;;;-1:-1:-1;38710:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;38798:20:0;38778:4;38798:20;;;:11;:20;;;;;;;;;38710:114;38917:181;;;;;;;;;;-1:-1:-1;38917:181:0;;;;;:::i;:::-;;:::i;12650:87::-;;;;;;;;;;-1:-1:-1;12696:7:0;12723:6;-1:-1:-1;;;;;12723:6:0;12650:87;;35635:52;;;;;;;;;;;;;;;;36948:81;;;;;;;;;;;;;:::i;38417:287::-;;;;;;;;;;-1:-1:-1;38417:287:0;;;;;:::i;:::-;;:::i;46457:71::-;;;;;;;;;;;;;:::i;37407:157::-;;;;;;;;;;-1:-1:-1;37407:157:0;;;;;:::i;:::-;;:::i;42771:388::-;;;;;;;;;;-1:-1:-1;42771:388:0;;;;;:::i;:::-;;:::i;46701:208::-;;;;;;;;;;;;;:::i;46534:161::-;;;;;;;;;;-1:-1:-1;46534:161:0;;;;;:::i;:::-;;:::i;39279:359::-;;;;;;;;;;-1:-1:-1;39279:359:0;;;;;:::i;:::-;;:::i;37570:137::-;;;;;;;;;;-1:-1:-1;37570:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;37674:18:0;;;37651:7;37674:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37570:137;44474:540;;;;;;;;;;-1:-1:-1;44474:540:0;;;;;:::i;:::-;;:::i;43955:73::-;;;;;;;;;;;;;:::i;45227:209::-;;;;;;;;;;-1:-1:-1;45227:209:0;;;;;:::i;:::-;;:::i;42155:104::-;;;;;;;;;;-1:-1:-1;42155:104:0;;;;;:::i;:::-;;:::i;45020:201::-;;;;;;;;;;-1:-1:-1;45020:201:0;;;;;:::i;:::-;;:::i;13556:::-;;;;;;;;;;-1:-1:-1;13556:201:0;;;;;:::i;:::-;;:::i;46225:105::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;46295:21:0::1;46319:5;46295:21:::0;;;:10:::1;:21;::::0;;;;:29;;-1:-1:-1;;46295:29:0::1;::::0;;46225:105::o;36865:77::-;36902:13;36931:5;36924:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36865:77;:::o;37713:151::-;37788:4;37801:39;11281:10;37824:7;37833:6;37801:8;:39::i;:::-;-1:-1:-1;37854:4:0;37713:151;;;;;:::o;37870:327::-;37968:4;37981:36;37991:6;37999:9;38010:6;37981:9;:36::i;:::-;38024:149;38041:6;11281:10;38077:89;38115:6;38077:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38077:19:0;;;;;;:11;:19;;;;;;;;11281:10;38077:33;;;;;;;;;;:37;:89::i;:::-;38024:8;:149::i;:::-;-1:-1:-1;38187:4:0;37870:327;;;;;:::o;45442:239::-;12536:13;:11;:13::i;:::-;45559:7:::1;45537:19;:29;45529:88;;;;-1:-1:-1::0;;;45529:88:0::1;;;;;;;:::i;:::-;;;;;;;;;45646:29;:19:::0;45668:7:::1;45646:29;:::i;:::-;45624:19;:51:::0;-1:-1:-1;45442:239:0:o;46118:101::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;46185:21:0::1;;::::0;;;:10:::1;:21;::::0;;;;:28;;-1:-1:-1;;46185:28:0::1;46209:4;46185:28;::::0;;46118:101::o;40417:239::-;40484:7;40519;;40508;:18;;40500:73;;;;-1:-1:-1;;;40500:73:0;;7188:2:1;40500:73:0;;;7170:21:1;7227:2;7207:18;;;7200:30;7266:34;7246:18;;;7239:62;-1:-1:-1;;;7317:18:1;;;7310:40;7367:19;;40500:73:0;6986:406:1;40500:73:0;40580:19;40602:10;:8;:10::i;:::-;40580:32;-1:-1:-1;40626:24:0;:7;40580:32;40626:11;:24::i;:::-;40619:31;40417:239;-1:-1:-1;;;40417:239:0:o;43165:71::-;12536:13;:11;:13::i;:::-;43215:15:::1;:13;:15::i;:::-;43165:71::o:0;40972:411::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;41048:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;41040:60;;;::::0;-1:-1:-1;;;41040:60:0;;7599:2:1;41040:60:0::1;::::0;::::1;7581:21:1::0;7638:2;7618:18;;;7611:30;7677:29;7657:18;;;7650:57;7724:18;;41040:60:0::1;7397:351:1::0;41040:60:0::1;41112:9;41107:271;41131:9;:16:::0;41127:20;::::1;41107:271;;;41183:7;-1:-1:-1::0;;;;;41167:23:0::1;:9;41177:1;41167:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41167:12:0::1;:23:::0;41163:208:::1;;41218:9;41228:16:::0;;:20:::1;::::0;41247:1:::1;::::0;41228:20:::1;:::i;:::-;41218:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41203:9:::1;:12:::0;;-1:-1:-1;;;;;41218:31:0;;::::1;::::0;41213:1;;41203:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;41203:46:0::1;-1:-1:-1::0;;;;;41203:46:0;;::::1;;::::0;;41260:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;41291:11:::1;:20:::0;;;;:28;;-1:-1:-1;;41291:28:0::1;::::0;;41330:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;41330:15:0;;;;;-1:-1:-1;;;;;;41330:15:0::1;::::0;;;;;41107:271:::1;40972:411:::0;:::o;41163:208::-:1;41149:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41107:271;;;;40972:411:::0;:::o;38203:208::-;11281:10;38291:4;38336:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38336:34:0;;;;;;;;;;38291:4;;38304:83;;38327:7;;38336:50;;38375:10;38336:38;:50::i;45793:177::-;12536:13;:11;:13::i;:::-;45926:37:::1;::::0;-1:-1:-1;;;45926:37:0;;45957:4:::1;45926:37;::::0;::::1;1821:51:1::0;-1:-1:-1;;;;;45889:21:0;::::1;::::0;::::1;::::0;45911:13;;45889:21;;45926:22:::1;::::0;1794:18:1;;45926:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45889:75;::::0;-1:-1:-1;;;;;;45889:75:0::1;::::0;;;;;;-1:-1:-1;;;;;8671:32:1;;;45889:75:0::1;::::0;::::1;8653:51:1::0;8720:18;;;8713:34;8626:18;;45889:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45793:177:::0;;:::o;39644:356::-;11281:10;39692:14;39737:19;;;:11;:19;;;;;;;;39736:20;39728:77;;;;-1:-1:-1;;;39728:77:0;;9210:2:1;39728:77:0;;;9192:21:1;9249:2;9229:18;;;9222:30;9288:34;9268:18;;;9261:62;-1:-1:-1;;;9339:18:1;;;9332:42;9391:19;;39728:77:0;9008:408:1;39728:77:0;39813:15;39842:19;39853:7;39842:10;:19::i;:::-;-1:-1:-1;;;;;;;;;39886:15:0;;;;;;:7;:15;;;;;;39812:49;;-1:-1:-1;39886:28:0;;:15;-1:-1:-1;39812:49:0;39886:19;:28::i;:::-;-1:-1:-1;;;;;39868:15:0;;;;;;:7;:15;;;;;:46;39931:7;;:20;;39943:7;39931:11;:20::i;:::-;39921:7;:30;39971:10;;:23;;39986:7;39971:14;:23::i;:::-;39958:10;:36;-1:-1:-1;;;39644:356:0:o;42044:105::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;42109:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;42109:34:0::1;42139:4;42109:34;::::0;;42044:105::o;40006:405::-;40097:7;40132;;40121;:18;;40113:62;;;;-1:-1:-1;;;40113:62:0;;9623:2:1;40113:62:0;;;9605:21:1;9662:2;9642:18;;;9635:30;9701:33;9681:18;;;9674:61;9752:18;;40113:62:0;9421:355:1;40113:62:0;40187:17;40182:224;;40216:15;40245:19;40256:7;40245:10;:19::i;:::-;-1:-1:-1;40215:49:0;;-1:-1:-1;40273:14:0;;-1:-1:-1;;;;;40273:14:0;40182:224;40313:23;40348:19;40359:7;40348:10;:19::i;:::-;-1:-1:-1;40310:57:0;;-1:-1:-1;40376:22:0;;-1:-1:-1;;;;;40376:22:0;45687:100;12536:13;:11;:13::i;:::-;45734:15:::1;::::0;:47:::1;::::0;-1:-1:-1;;;;;45734:15:0;;::::1;::::0;45759:21:::1;45734:47:::0;::::1;;;::::0;:15:::1;:47:::0;:15;:47;45759:21;45734:15;:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;45687:100::o:0;40662:304::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;40739:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;40738:21;40730:61;;;::::0;-1:-1:-1;;;40730:61:0;;7599:2:1;40730:61:0::1;::::0;::::1;7581:21:1::0;7638:2;7618:18;;;7611:30;7677:29;7657:18;;;7650:57;7724:18;;40730:61:0::1;7397:351:1::0;40730:61:0::1;-1:-1:-1::0;;;;;40802:16:0;::::1;40821:1;40802:16:::0;;;:7:::1;:16;::::0;;;;;:20;40798:99:::1;;-1:-1:-1::0;;;;;40872:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;40852:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;40833:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;40798:99:::1;-1:-1:-1::0;;;;;40903:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;40903:27:0::1;40926:4;40903:27:::0;;::::1;::::0;;;40937:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;40937:23:0::1;::::0;;::::1;::::0;;40662:304::o;42265:121::-;12536:13;:11;:13::i;:::-;42340:15:::1;:40:::0;;-1:-1:-1;;;;;;42340:40:0::1;-1:-1:-1::0;;;;;42340:40:0;;;::::1;::::0;;;::::1;::::0;;42265:121::o;46915:349::-;46977:15;;-1:-1:-1;;;;;46977:15:0;11281:10;-1:-1:-1;;;;;46961:31:0;;:58;;;-1:-1:-1;12696:7:0;12723:6;-1:-1:-1;;;;;12723:6:0;11281:10;46996:23;46961:58;46953:67;;;;;;47056:21;47027:26;47111:35;47142:3;47111:26;47056:21;47134:2;47111:22;:26::i;:::-;:30;;:35::i;:::-;47084:62;-1:-1:-1;47153:18:0;47174:35;47205:3;47174:26;:18;47197:2;47174:22;:26::i;:35::-;47153:56;;47216:42;47229:16;47247:10;47216:12;:42::i;37213:188::-;-1:-1:-1;;;;;37299:20:0;;37279:7;37299:20;;;:11;:20;;;;;;;;37295:49;;;-1:-1:-1;;;;;;37328:16:0;;;;;:7;:16;;;;;;;37213:188::o;37295:49::-;-1:-1:-1;;;;;37378:16:0;;;;;;:7;:16;;;;;;37358:37;;:19;:37::i;13298:103::-;12536:13;:11;:13::i;:::-;13363:30:::1;13390:1;13363:18;:30::i;47270:216::-:0;47342:15;;-1:-1:-1;;;;;47342:15:0;11281:10;-1:-1:-1;;;;;47326:31:0;;:58;;;-1:-1:-1;12696:7:0;12723:6;-1:-1:-1;;;;;12723:6:0;11281:10;47361:23;47326:58;47318:67;;;;;;47392:23;47418:24;47436:4;47418:9;:24::i;:::-;47392:50;;47449:31;47464:15;47449:14;:31::i;45976:136::-;12536:13;:11;:13::i;:::-;46052:54:::1;::::0;-1:-1:-1;;;;;46052:31:0;::::1;::::0;46084:21:::1;46052:54:::0;::::1;;;::::0;::::1;::::0;;;46084:21;46052:31;:54;::::1;;;;;;;;;;;;;::::0;::::1;;;;42392:373:::0;12536:13;:11;:13::i;:::-;42510:12:::1;:26:::0;;;42543:18:::1;:38:::0;;;42588:12:::1;:26:::0;;;-1:-1:-1;42603:11:0;42644:33:::1;42564:17:::0;42525:11;42644:33:::1;:::i;:::-;:48;;;;:::i;:::-;42621:71;;42723:3;42707:12;:19;;42699:60;;;::::0;-1:-1:-1;;;42699:60:0;;10113:2:1;42699:60:0::1;::::0;::::1;10095:21:1::0;10152:2;10132:18;;;10125:30;10191;10171:18;;;10164:58;10239:18;;42699:60:0::1;9911:352:1::0;42699:60:0::1;42503:262;42392:373:::0;;;:::o;38917:181::-;12536:13;:11;:13::i;:::-;38995:15:::1;:13;:15::i;:::-;39017:52;11281:10:::0;39041:9;39052:16:::1;:6:::0;39061:7:::1;39052:16;:::i;:::-;39017:9;:52::i;:::-;39076:16;:14;:16::i;36948:81::-:0;36987:13;37016:7;37009:14;;;;;:::i;38417:287::-;38510:4;38523:157;11281:10;38561:7;38577:96;38616:15;38577:96;;;;;;;;;;;;;;;;;11281:10;38577:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;38577:34:0;;;;;;;;;;;;:38;:96::i;46457:71::-;12536:13;:11;:13::i;:::-;46507:8:::1;:15:::0;;-1:-1:-1;;46507:15:0::1;;;::::0;;46457:71::o;37407:157::-;37485:4;37498:42;11281:10;37522:9;37533:6;37498:9;:42::i;42771:388::-;12536:13;:11;:13::i;:::-;42893::::1;:28:::0;;;42928:19:::1;:40:::0;;;42975:13:::1;:28:::0;;;-1:-1:-1;42991:12:0;43034:35:::1;42950:18:::0;42909:12;43034:35:::1;:::i;46701:208::-:0;46763:15;;-1:-1:-1;;;;;46763:15:0;11281:10;-1:-1:-1;;;;;46747:31:0;;:58;;;-1:-1:-1;12696:7:0;12723:6;-1:-1:-1;;;;;12723:6:0;11281:10;46782:23;46747:58;46739:67;;;;;;46813:23;46839:24;46857:4;46839:9;:24::i;:::-;46813:50;;46870:33;46887:15;46870:16;:33::i;46534:161::-;12536:13;:11;:13::i;:::-;46607:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;46607:32:0;;::::1;;::::0;;46651:38:::1;::::0;::::1;::::0;::::1;::::0;46631:8;1440:14:1;1433:22;1415:41;;1403:2;1388:18;;1275:187;46651:38:0::1;;;;;;;;46534:161:::0;:::o;39279:359::-;12536:13;:11;:13::i;:::-;39386:16:::1;39421:35:::0;;::::1;39413:71;;;::::0;-1:-1:-1;;;39413:71:0;;10470:2:1;39413:71:0::1;::::0;::::1;10452:21:1::0;10509:2;10489:18;;;10482:30;10548:25;10528:18;;;10521:53;10591:18;;39413:71:0::1;10268:347:1::0;39413:71:0::1;39498:28:::0;;::::1;39491:142;;;39537:66;39553:10;;39564:8;39553:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39575:7;;39583:8;39575:17;;;;;;;:::i;:::-;;;;;;;39595:7;39575:27;;;;:::i;:::-;39537:15;:66::i;:::-;39612:13;39624:1;39612:13:::0;::::1;:::i;:::-;;;39491:142;;;39379:259;39279:359:::0;;;;:::o;44474:540::-;12536:13;:11;:13::i;:::-;44616:10:::1;44602:11;:24;44594:81;;;;-1:-1:-1::0;;;44594:81:0::1;;;;;;;:::i;:::-;44706:10;44690:13;:26;44682:83;;;;-1:-1:-1::0;;;44682:83:0::1;;;;;;;:::i;:::-;44802:7;44780:19;:29;44772:88;;;;-1:-1:-1::0;;;44772:88:0::1;;;;;;;:::i;:::-;44889:29;:19:::0;44911:7:::1;44889:29;:::i;:::-;44867:19;:51:::0;44942:23:::1;:13:::0;44958:7:::1;44942:23;:::i;:::-;44925:14;:40:::0;44987:21:::1;:11:::0;45001:7:::1;44987:21;:::i;:::-;44972:12;:36:::0;-1:-1:-1;;;44474:540:0:o;43955:73::-;12536:13;:11;:13::i;:::-;44006:16:::1;:14;:16::i;45227:209::-:0;12536:13;:11;:13::i;:::-;45324:10:::1;45308:13;:26;45300:83;;;;-1:-1:-1::0;;;45300:83:0::1;;;;;;;:::i;:::-;45407:23;:13:::0;45423:7:::1;45407:23;:::i;:::-;45390:14;:40:::0;-1:-1:-1;45227:209:0:o;42155:104::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;42218:27:0::1;42248:5;42218:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;42218:35:0::1;::::0;;42155:104::o;45020:201::-;12536:13;:11;:13::i;:::-;45113:10:::1;45099:11;:24;45091:81;;;;-1:-1:-1::0;;;45091:81:0::1;;;;;;;:::i;:::-;45194:21;:11:::0;45208:7:::1;45194:21;:::i;:::-;45179:12;:36:::0;-1:-1:-1;45020:201:0:o;13556:::-;12536:13;:11;:13::i;:::-;-1:-1:-1;;;;;13645:22:0;::::1;13637:73;;;::::0;-1:-1:-1;;;13637:73:0;;11235:2:1;13637:73:0::1;::::0;::::1;11217:21:1::0;11274:2;11254:18;;;11247:30;11313:34;11293:18;;;11286:62;-1:-1:-1;;;11364:18:1;;;11357:36;11410:19;;13637:73:0::1;11033:402:1::0;13637:73:0::1;13721:28;13740:8;13721:18;:28::i;12815:132::-:0;12696:7;12723:6;-1:-1:-1;;;;;12723:6:0;11281:10;12879:23;12871:68;;;;-1:-1:-1;;;12871:68:0;;11642:2:1;12871:68:0;;;11624:21:1;;;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;11772:18;;12871:68:0;11440:356:1;50281:319:0;-1:-1:-1;;;;;50370:19:0;;50362:68;;;;-1:-1:-1;;;50362:68:0;;12003:2:1;50362:68:0;;;11985:21:1;12042:2;12022:18;;;12015:30;12081:34;12061:18;;;12054:62;-1:-1:-1;;;12132:18:1;;;12125:34;12176:19;;50362:68:0;11801:400:1;50362:68:0;-1:-1:-1;;;;;50445:21:0;;50437:68;;;;-1:-1:-1;;;50437:68:0;;12408:2:1;50437:68:0;;;12390:21:1;12447:2;12427:18;;;12420:30;12486:34;12466:18;;;12459:62;-1:-1:-1;;;12537:18:1;;;12530:32;12579:19;;50437:68:0;12206:398:1;50437:68:0;-1:-1:-1;;;;;50514:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;50562:32;;1613:25:1;;;50562:32:0;;1586:18:1;50562:32:0;;;;;;;50281:319;;;:::o;50606:1735::-;-1:-1:-1;;;;;50690:18:0;;50682:68;;;;-1:-1:-1;;;50682:68:0;;12811:2:1;50682:68:0;;;12793:21:1;12850:2;12830:18;;;12823:30;12889:34;12869:18;;;12862:62;-1:-1:-1;;;12940:18:1;;;12933:35;12985:19;;50682:68:0;12609:401:1;50682:68:0;-1:-1:-1;;;;;50765:16:0;;50757:64;;;;-1:-1:-1;;;50757:64:0;;13217:2:1;50757:64:0;;;13199:21:1;13256:2;13236:18;;;13229:30;13295:34;13275:18;;;13268:62;-1:-1:-1;;;13346:18:1;;;13339:33;13389:19;;50757:64:0;13015:399:1;50757:64:0;50845:1;50836:6;:10;50828:64;;;;-1:-1:-1;;;50828:64:0;;13621:2:1;50828:64:0;;;13603:21:1;13660:2;13640:18;;;13633:30;13699:34;13679:18;;;13672:62;-1:-1:-1;;;13750:18:1;;;13743:39;13799:19;;50828:64:0;13419:405:1;50828:64:0;12696:7;12723:6;-1:-1:-1;;;;;50903:15:0;;;12723:6;;50903:15;;;;:32;;-1:-1:-1;12696:7:0;12723:6;-1:-1:-1;;;;;50922:13:0;;;12723:6;;50922:13;;50903:32;50899:113;;;50955:12;;50945:6;:22;;50937:75;;;;-1:-1:-1;;;50937:75:0;;14031:2:1;50937:75:0;;;14013:21:1;14070:2;14050:18;;;14043:30;14109:34;14089:18;;;14082:62;-1:-1:-1;;;14160:18:1;;;14153:38;14208:19;;50937:75:0;13829:404:1;50937:75:0;51026:8;;;;;;;51021:123;;12696:7;12723:6;-1:-1:-1;;;;;51053:15:0;;;12723:6;;51053:15;51045:91;;;;-1:-1:-1;;;51045:91:0;;14440:2:1;51045:91:0;;;14422:21:1;14479:2;14459:18;;;14452:30;14518:34;14498:18;;;14491:62;14589:33;14569:18;;;14562:61;14640:19;;51045:91:0;14238:427:1;51045:91:0;-1:-1:-1;;;;;51156:16:0;;;;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;51176:14:0;;;;;;:10;:14;;;;;;;;51156:34;51152:110;;;51209:13;;;;51201:53;;;;-1:-1:-1;;;51201:53:0;;14872:2:1;51201:53:0;;;14854:21:1;14911:2;14891:18;;;14884:30;14950:29;14930:18;;;14923:57;14997:18;;51201:53:0;14670:351:1;51201:53:0;51280:13;-1:-1:-1;;;;;51274:19:0;:2;-1:-1:-1;;;;;51274:19:0;;51270:129;;51337:14;;51328:6;51312:13;51322:2;51312:9;:13::i;:::-;:22;;;;:::i;:::-;:39;51304:87;;;;-1:-1:-1;;;51304:87:0;;15228:2:1;51304:87:0;;;15210:21:1;15267:2;15247:18;;;15240:30;15306:34;15286:18;;;15279:62;-1:-1:-1;;;15357:18:1;;;15350:33;15400:19;;51304:87:0;15026:399:1;51304:87:0;51407:28;51438:24;51456:4;51438:9;:24::i;:::-;51407:55;;51499:12;;51475:20;:36;51471:94;;-1:-1:-1;51545:12:0;;51471:94;51624:19;;51600:43;;;;;;;51654:40;;-1:-1:-1;51678:16:0;;;;51677:17;51654:40;:65;;;;;51706:13;-1:-1:-1;;;;;51698:21:0;:4;-1:-1:-1;;;;;51698:21:0;;;51654:65;:90;;;;-1:-1:-1;51723:21:0;;;;;;;51654:90;51650:149;;;51755:36;51770:20;51755:14;:36::i;:::-;-1:-1:-1;;;;;51839:24:0;;51807:12;51839:24;;;:18;:24;;;;;;51822:4;;51839:24;;;:50;;-1:-1:-1;;;;;;51867:22:0;;;;;;:18;:22;;;;;;;;51839:50;51835:451;;;-1:-1:-1;51910:5:0;51835:451;;;51950:13;-1:-1:-1;;;;;51942:21:0;:4;-1:-1:-1;;;;;51942:21:0;;:55;;;;;51981:15;-1:-1:-1;;;;;51967:30:0;:2;-1:-1:-1;;;;;51967:30:0;;;51942:55;51938:164;;;52026:18;;52010:13;:34;52080:12;;52065;;:27;;52080:12;52065:27;:::i;:::-;52055:7;:37;51938:164;52122:13;-1:-1:-1;;;;;52116:19:0;:2;-1:-1:-1;;;;;52116:19:0;;:55;;;;;52155:15;-1:-1:-1;;;;;52139:32:0;:4;-1:-1:-1;;;;;52139:32:0;;;52116:55;52112:167;;;52200:19;;52184:13;:35;52256:13;;52240;;:29;;52256:13;52240:29;:::i;:::-;52230:7;:39;52112:167;52294:41;52309:4;52315:2;52319:6;52327:7;52294:14;:41::i;:::-;50675:1666;;;50606:1735;;;:::o;19270:240::-;19390:7;19451:12;19443:6;;;;19435:29;;;;-1:-1:-1;;;19435:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;19486:5:0;;;19270:240::o;48873:154::-;48915:7;48932:15;48949;48968:19;:17;:19::i;:::-;48931:56;;-1:-1:-1;48931:56:0;-1:-1:-1;49001:20:0;48931:56;;49001:11;:20::i;:::-;48994:27;;;;48873:154;:::o;18128:98::-;18186:7;18213:5;18217:1;18213;:5;:::i;43242:707::-;43286:7;;:12;:34;;;;-1:-1:-1;43302:13:0;;:18;43286:34;43282:47;;;43242:707::o;43282:47::-;43355:7;;;43337:15;:25;43393:13;;;43369:21;:37;43431:7;;;43413:15;:25;43470:12;;;43447:20;:35;43518:18;;;43489:26;:47;43566:12;;;43543:20;:35;43611:13;;;43587:21;:37;43661:19;;;43631:27;:49;43711:13;;;43687:21;:37;-1:-1:-1;43733:11:0;;;;43751;;;;43769:17;;;;43795:16;;;;43818:22;;;;43847:16;;;43872:17;;;43896:23;;;;43926:17;;43242:707::o;16991:98::-;17049:7;17076:5;17080:1;17076;:5;:::i;47706:405::-;47765:7;47774;47783;47792;47801;47810;47827:23;47852:12;47866:18;47888:20;47900:7;47888:11;:20::i;:::-;47826:82;;;;;;47916:15;47933:23;47958:12;47974:50;47986:7;47995:4;48001:10;48013;:8;:10::i;:::-;47974:11;:50::i;:::-;47915:109;;;;-1:-1:-1;47915:109:0;;-1:-1:-1;48071:15:0;;-1:-1:-1;48088:4:0;;-1:-1:-1;48094:10:0;;-1:-1:-1;47706:405:0;;-1:-1:-1;;;;;47706:405:0:o;17372:98::-;17430:7;17457:5;17461:1;17457;:5;:::i;17729:98::-;17787:7;17814:5;17818:1;17814;:5;:::i;53940:171::-;54023:15;;:42;;-1:-1:-1;;;;;54023:15:0;;;;:42;;;;;54048:16;;54023:15;:42;:15;:42;54048:16;54023:15;:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54072:12:0;;:33;;-1:-1:-1;;;;;54072:12:0;;;;:33;;;;;54094:10;;54072:12;:33;:12;:33;54094:10;54072:12;:33;;;;;;;;;;;;;;;;;;;13917:191;13991:16;14010:6;;-1:-1:-1;;;;;14027:17:0;;;-1:-1:-1;;;;;;14027:17:0;;;;;;14060:40;;14010:6;;;;;;;14060:40;;13991:16;14060:40;13980:128;13917:191;:::o;52347:1587::-;36015:16;:23;;-1:-1:-1;;36015:23:0;36034:4;36015:23;;;52455:19:::1;::::0;:24:::1;::::0;52477:2:::1;52455:24;:::i;:::-;52432:20;:47;52428:117;;;52513:19;::::0;:24:::1;::::0;52535:2:::1;52513:24;:::i;:::-;52490:47;;52428:117;52553:25;52581:55;52628:7;52603:19;;52582:18;;:40;;;;:::i;:::-;52581:46:::0;::::1;:55::i;:::-;52553:83;;52643:19;52665:43;52700:7;52681:13;;52666:12;;:28;;;;:::i;52665:43::-;52643:65;;52715:25;52743:43;52778:7;52759:13;;52744:12;;:28;;;;:::i;52743:43::-;52715:71:::0;-1:-1:-1;52793:16:0::1;52852:11:::0;52812:37:::1;52832:17:::0;52715:71;52812:37:::1;:::i;:::-;:51;;;;:::i;:::-;52793:70:::0;-1:-1:-1;52872:26:0::1;52901:59;52793:70:::0;52902:43:::1;:20:::0;52927:17;52902:24:::1;:43::i;52901:59::-;52872:88:::0;-1:-1:-1;52967:24:0::1;52994:25;52872:88:::0;53017:1:::1;52994:22;:25::i;:::-;52967:52:::0;-1:-1:-1;53026:23:0::1;53052:40;:18:::0;52967:52;53052:22:::1;:40::i;:::-;53026:66:::0;-1:-1:-1;53101:26:0::1;53130:42;:20:::0;53155:16;53130:24:::1;:42::i;:::-;53101:71:::0;-1:-1:-1;53206:21:0::1;53234:36;53101:71:::0;53234:16:::1;:36::i;:::-;53279:18;53300:41;:21;53326:14:::0;53300:25:::1;:41::i;:::-;53279:62:::0;-1:-1:-1;53348:19:0::1;53381:24;:17:::0;53403:1:::1;53381:21;:24::i;:::-;53370:35;::::0;:8;:35:::1;:::i;:::-;53348:57:::0;-1:-1:-1;53412:23:0::1;53438:55;53348:57:::0;53474:1:::1;53440:30;53453:17:::0;53440:10;:30:::1;:::i;:::-;53439:36;;;;:::i;53438:55::-;53412:81;;53525:1;53506:16;:20;:43;;;;;53548:1;53530:15;:19;53506:43;53502:188;;;53560:47;53573:16;53591:15;53560:12;:47::i;:::-;53621:61;::::0;;15854:25:1;;;15910:2;15895:18;;15888:34;;;15938:18;;;15931:34;;;53621:61:0::1;::::0;15842:2:1;15827:18;53621:61:0::1;;;;;;;53502:188;53698:17;53718:46;53752:11:::0;53719:27:::1;:10:::0;53734:11;53719:14:::1;:27::i;53718:46::-;53698:66:::0;-1:-1:-1;53771:23:0::1;53698:66:::0;53797:28:::1;53810:15:::0;53797:10;:28:::1;:::i;:::-;:40;;;;:::i;:::-;53771:66;;53868:1;53850:15;:19;:36;;;;;53885:1;53873:9;:13;53850:36;53846:82;;;53888:40;53901:15;53918:9;53888:12;:40::i;:::-;-1:-1:-1::0;;36053:16:0;:24;;-1:-1:-1;;36053:24:0;;;-1:-1:-1;;;;;;;;;;;;;52347:1587:0:o;44034:434::-;44085:15;;44075:7;:25;44123:21;;44107:13;:37;44161:15;;44151:7;:25;44200:20;;44185:12;:35;44248:26;;44227:18;:47;44296:20;;44281:12;:35;44341:21;;44325:13;:37;44391:27;;44369:19;:49;44441:21;;44425:13;:37;44034:434::o;54117:427::-;36015:16;:23;;-1:-1:-1;;36015:23:0;36034:4;36015:23;;;54215:16:::1;::::0;;54229:1:::1;54215:16:::0;;;;;::::1;::::0;;-1:-1:-1;;54215:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;54215:16:0::1;54191:40;;54256:4;54238;54243:1;54238:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;54238:23:0::1;;;-1:-1:-1::0;;;;;54238:23:0::1;;;::::0;::::1;54278:15;-1:-1:-1::0;;;;;54278:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54268:4;54273:1;54268:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;54268:32:0::1;;;-1:-1:-1::0;;;;;54268:32:0::1;;;::::0;::::1;54307:62;54324:4;54339:15;54357:11;54307:8;:62::i;:::-;54376:162;::::0;-1:-1:-1;;;54376:162:0;;-1:-1:-1;;;;;54376:15:0::1;:66;::::0;::::1;::::0;:162:::1;::::0;54451:11;;54471:1:::1;::::0;54481:4;;54502::::1;::::0;54516:15:::1;::::0;54376:162:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36053:16:0;:24;;-1:-1:-1;;36053:24:0;;;-1:-1:-1;;;;54117:427:0:o;39104:169::-;39180:15;:13;:15::i;:::-;39202:42;11281:10;39226:9;39237:6;39202:9;:42::i;54819:733::-;54928:7;54923:29;;54937:15;:13;:15::i;:::-;-1:-1:-1;;;;;54965:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;54989:22:0;;;;;;:11;:22;;;;;;;;54988:23;54965:46;54961:547;;;55022:48;55044:6;55052:9;55063:6;55022:21;:48::i;:::-;54961:547;;;-1:-1:-1;;;;;55089:19:0;;;;;;:11;:19;;;;;;;;55088:20;:46;;;;-1:-1:-1;;;;;;55112:22:0;;;;;;:11;:22;;;;;;;;55088:46;55084:424;;;55145:46;55165:6;55173:9;55184:6;55145:19;:46::i;55084:424::-;-1:-1:-1;;;;;55210:19:0;;;;;;:11;:19;;;;;;;;55209:20;:47;;;;-1:-1:-1;;;;;;55234:22:0;;;;;;:11;:22;;;;;;;;55233:23;55209:47;55205:303;;;55267:44;55285:6;55293:9;55304:6;55267:17;:44::i;55205:303::-;-1:-1:-1;;;;;55329:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;55352:22:0;;;;;;:11;:22;;;;;;;;55329:45;55325:183;;;55385:48;55407:6;55415:9;55426:6;55385:21;:48::i;55325:183::-;55456:44;55474:6;55482:9;55493:6;55456:17;:44::i;:::-;55521:7;55516:30;;55530:16;:14;:16::i;49033:512::-;49127:7;;49159;;49084;;;;;49173:267;49197:9;:16;49193:20;;49173:267;;;49257:7;49233;:21;49241:9;49251:1;49241:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49241:12:0;49233:21;;;;;;;;;;;;;:31;;:66;;;49292:7;49268;:21;49276:9;49286:1;49276:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49276:12:0;49268:21;;;;;;;;;;;;;:31;49233:66;49229:97;;;49309:7;;49318;;49301:25;;;;;;;49033:512;;:::o;49229:97::-;49345:34;49357:7;:21;49365:9;49375:1;49365:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49365:12:0;49357:21;;;;;;;;;;;;;49345:7;;:11;:34::i;:::-;49335:44;;49398:34;49410:7;:21;49418:9;49428:1;49418:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49418:12:0;49410:21;;;;;;;;;;;;;49398:7;;:11;:34::i;:::-;49388:44;-1:-1:-1;49215:3:0;;;;:::i;:::-;;;;49173:267;;;-1:-1:-1;49472:7:0;;49460;;:20;;:11;:20::i;:::-;49450:7;:30;49446:61;;;49490:7;;49499;;49482:25;;;;;;49033:512;;:::o;49446:61::-;49522:7;;49531;;-1:-1:-1;49033:512:0;-1:-1:-1;49033:512:0:o;48117:312::-;48177:7;48186;48195;48211:12;48226:24;48242:7;48226:15;:24::i;:::-;48211:39;;48257:18;48278:30;48300:7;48278:21;:30::i;:::-;48257:51;-1:-1:-1;48315:23:0;48341:33;48257:51;48341:17;:7;48353:4;48341:11;:17::i;:::-;:21;;:33::i;:::-;48315:59;48406:4;;-1:-1:-1;48412:10:0;;-1:-1:-1;48117:312:0;;-1:-1:-1;;;48117:312:0:o;48435:432::-;48575:7;;;;48627:24;:7;48639:11;48627;:24::i;:::-;48609:42;-1:-1:-1;48658:12:0;48673:21;:4;48682:11;48673:8;:21::i;:::-;48658:36;-1:-1:-1;48701:18:0;48722:27;:10;48737:11;48722:14;:27::i;:::-;48701:48;-1:-1:-1;48756:23:0;48782:33;48701:48;48782:17;:7;48794:4;48782:11;:17::i;:33::-;48830:7;;;;-1:-1:-1;48856:4:0;;-1:-1:-1;48435:432:0;;-1:-1:-1;;;;;;;48435:432:0:o;54550:263::-;54627:62;54644:4;54659:15;54677:11;54627:8;:62::i;:::-;54698:15;-1:-1:-1;;;;;54698:31:0;;54737:9;54756:4;54763:11;54776:1;54779;54782:7;12696;12723:6;-1:-1:-1;;;;;12723:6:0;;12650:87;54782:7;54698:109;;;;;;-1:-1:-1;;;;;;54698:109:0;;;-1:-1:-1;;;;;17708:15:1;;;54698:109:0;;;17690:34:1;17740:18;;;17733:34;;;;17783:18;;;17776:34;;;;17826:18;;;17819:34;17890:15;;;17869:19;;;17862:44;54791:15:0;17922:19:1;;;17915:35;17624:19;;54698:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;56689:582::-;56796:15;56820:23;56852:12;56873:23;56905:12;56926:18;56954:19;56965:7;56954:10;:19::i;:::-;-1:-1:-1;;;;;56998:15:0;;;;;;:7;:15;;;;;;56787:186;;-1:-1:-1;56787:186:0;;-1:-1:-1;56787:186:0;;-1:-1:-1;56787:186:0;-1:-1:-1;56787:186:0;-1:-1:-1;56787:186:0;-1:-1:-1;56998:28:0;;57018:7;56998:19;:28::i;:::-;-1:-1:-1;;;;;56980:15:0;;;;;;:7;:15;;;;;;;;:46;;;;57051:7;:15;;;;:28;;57071:7;57051:19;:28::i;:::-;-1:-1:-1;;;;;57033:15:0;;;;;;;:7;:15;;;;;;:46;;;;57107:18;;;;;;;:39;;57130:15;57107:22;:39::i;:::-;-1:-1:-1;;;;;57086:18:0;;;;;;:7;:18;;;;;:60;57153:26;57168:10;57153:14;:26::i;:::-;57186:23;57198:4;57204;57186:11;:23::i;:::-;57238:9;-1:-1:-1;;;;;57221:44:0;57230:6;-1:-1:-1;;;;;57221:44:0;;57249:15;57221:44;;;;1613:25:1;;1601:2;1586:18;;1467:177;57221:44:0;;;;;;;;56780:491;;;;;;56689:582;;;:::o;56089:594::-;56194:15;56218:23;56250:12;56271:23;56303:12;56324:18;56352:19;56363:7;56352:10;:19::i;:::-;-1:-1:-1;;;;;56396:15:0;;;;;;:7;:15;;;;;;56185:186;;-1:-1:-1;56185:186:0;;-1:-1:-1;56185:186:0;;-1:-1:-1;56185:186:0;-1:-1:-1;56185:186:0;-1:-1:-1;56185:186:0;-1:-1:-1;56396:28:0;;56185:186;56396:19;:28::i;:::-;-1:-1:-1;;;;;56378:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;56452:18;;;;;:7;:18;;;;;:39;;56475:15;56452:22;:39::i;:::-;-1:-1:-1;;;;;56431:18:0;;;;;;:7;:18;;;;;;;;:60;;;;56519:7;:18;;;;:39;;56542:15;56519:22;:39::i;55558:525::-;55661:15;55685:23;55717:12;55738:23;55770:12;55791:18;55819:19;55830:7;55819:10;:19::i;:::-;-1:-1:-1;;;;;55863:15:0;;;;;;:7;:15;;;;;;55652:186;;-1:-1:-1;55652:186:0;;-1:-1:-1;55652:186:0;;-1:-1:-1;55652:186:0;-1:-1:-1;55652:186:0;-1:-1:-1;55652:186:0;-1:-1:-1;55863:28:0;;55652:186;55863:19;:28::i;41389:649::-;41496:15;41520:23;41552:12;41573:23;41605:12;41626:18;41654:19;41665:7;41654:10;:19::i;:::-;-1:-1:-1;;;;;41698:15:0;;;;;;:7;:15;;;;;;41487:186;;-1:-1:-1;41487:186:0;;-1:-1:-1;41487:186:0;;-1:-1:-1;41487:186:0;-1:-1:-1;41487:186:0;-1:-1:-1;41487:186:0;-1:-1:-1;41698:28:0;;41718:7;41698:19;:28::i;:::-;-1:-1:-1;;;;;41680:15:0;;;;;;:7;:15;;;;;;;;:46;;;;41751:7;:15;;;;:28;;41771:7;41751:19;:28::i;49881:126::-;49945:7;49968:33;49993:7;49968:20;49980:7;;49968;:11;;:20;;;;:::i;50013:138::-;50083:7;50106:39;50137:7;50106:26;50118:13;;50106:7;:11;;:26;;;;:::i;49551:324::-;49610:19;49632:10;:8;:10::i;:::-;49610:32;-1:-1:-1;49649:18:0;49670:27;:10;49610:32;49670:14;:27::i;:::-;49745:4;49729:22;;;;:7;:22;;;;;;49649:48;;-1:-1:-1;49729:38:0;;49649:48;49729:26;:38::i;:::-;49720:4;49704:22;;;;:7;:22;;;;;;;;:63;;;;49778:11;:26;;;;;;49774:95;;;49847:4;49831:22;;;;:7;:22;;;;;;:38;;49858:10;49831:26;:38::i;:::-;49822:4;49806:22;;;;:7;:22;;;;;:63;49603:272;;49551:324;:::o;47563:137::-;47637:7;;:17;;47649:4;47637:11;:17::i;:::-;47627:7;:27;47674:10;;:20;;47689:4;47674:14;:20::i;:::-;47661:10;:33;-1:-1:-1;;47563:137:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:548::-;514:4;543:2;572;561:9;554:21;604:6;598:13;647:6;642:2;631:9;627:18;620:34;672:1;682:140;696:6;693:1;690:13;682:140;;;791:14;;;787:23;;781:30;757:17;;;776:2;753:26;746:66;711:10;;682:140;;;686:3;871:1;866:2;857:6;846:9;842:22;838:31;831:42;941:2;934;930:7;925:2;917:6;913:15;909:29;898:9;894:45;890:54;882:62;;;;402:548;;;;:::o;955:315::-;1023:6;1031;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1139:9;1126:23;1158:31;1183:5;1158:31;:::i;:::-;1208:5;1260:2;1245:18;;;;1232:32;;-1:-1:-1;;;955:315:1:o;1883:456::-;1960:6;1968;1976;2029:2;2017:9;2008:7;2004:23;2000:32;1997:52;;;2045:1;2042;2035:12;1997:52;2084:9;2071:23;2103:31;2128:5;2103:31;:::i;:::-;2153:5;-1:-1:-1;2210:2:1;2195:18;;2182:32;2223:33;2182:32;2223:33;:::i;:::-;1883:456;;2275:7;;-1:-1:-1;;;2329:2:1;2314:18;;;;2301:32;;1883:456::o;2344:180::-;2403:6;2456:2;2444:9;2435:7;2431:23;2427:32;2424:52;;;2472:1;2469;2462:12;2424:52;-1:-1:-1;2495:23:1;;2344:180;-1:-1:-1;2344:180:1:o;2718:403::-;2801:6;2809;2862:2;2850:9;2841:7;2837:23;2833:32;2830:52;;;2878:1;2875;2868:12;2830:52;2917:9;2904:23;2936:31;2961:5;2936:31;:::i;:::-;2986:5;-1:-1:-1;3043:2:1;3028:18;;3015:32;3056:33;3015:32;3056:33;:::i;:::-;3108:7;3098:17;;;2718:403;;;;;:::o;3126:118::-;3212:5;3205:13;3198:21;3191:5;3188:32;3178:60;;3234:1;3231;3224:12;3249:309;3314:6;3322;3375:2;3363:9;3354:7;3350:23;3346:32;3343:52;;;3391:1;3388;3381:12;3343:52;3427:9;3414:23;3404:33;;3487:2;3476:9;3472:18;3459:32;3500:28;3522:5;3500:28;:::i;3771:316::-;3848:6;3856;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:52;;;3933:1;3930;3923:12;3885:52;-1:-1:-1;;3956:23:1;;;4026:2;4011:18;;3998:32;;-1:-1:-1;4077:2:1;4062:18;;;4049:32;;3771:316;-1:-1:-1;3771:316:1:o;4092:241::-;4148:6;4201:2;4189:9;4180:7;4176:23;4172:32;4169:52;;;4217:1;4214;4207:12;4169:52;4256:9;4243:23;4275:28;4297:5;4275:28;:::i;4338:367::-;4401:8;4411:6;4465:3;4458:4;4450:6;4446:17;4442:27;4432:55;;4483:1;4480;4473:12;4432:55;-1:-1:-1;4506:20:1;;4549:18;4538:30;;4535:50;;;4581:1;4578;4571:12;4535:50;4618:4;4610:6;4606:17;4594:29;;4678:3;4671:4;4661:6;4658:1;4654:14;4646:6;4642:27;4638:38;4635:47;4632:67;;;4695:1;4692;4685:12;4632:67;4338:367;;;;;:::o;4710:773::-;4832:6;4840;4848;4856;4909:2;4897:9;4888:7;4884:23;4880:32;4877:52;;;4925:1;4922;4915:12;4877:52;4965:9;4952:23;4994:18;5035:2;5027:6;5024:14;5021:34;;;5051:1;5048;5041:12;5021:34;5090:70;5152:7;5143:6;5132:9;5128:22;5090:70;:::i;:::-;5179:8;;-1:-1:-1;5064:96:1;-1:-1:-1;5267:2:1;5252:18;;5239:32;;-1:-1:-1;5283:16:1;;;5280:36;;;5312:1;5309;5302:12;5280:36;;5351:72;5415:7;5404:8;5393:9;5389:24;5351:72;:::i;:::-;4710:773;;;;-1:-1:-1;5442:8:1;-1:-1:-1;;;;4710:773:1:o;5881:380::-;5960:1;5956:12;;;;6003;;;6024:61;;6078:4;6070:6;6066:17;6056:27;;6024:61;6131:2;6123:6;6120:14;6100:18;6097:38;6094:161;;6177:10;6172:3;6168:20;6165:1;6158:31;6212:4;6209:1;6202:15;6240:4;6237:1;6230:15;6094:161;;5881:380;;;:::o;6266:410::-;6468:2;6450:21;;;6507:2;6487:18;;;6480:30;6546:34;6541:2;6526:18;;6519:62;-1:-1:-1;;;6612:2:1;6597:18;;6590:44;6666:3;6651:19;;6266:410::o;6681:127::-;6742:10;6737:3;6733:20;6730:1;6723:31;6773:4;6770:1;6763:15;6797:4;6794:1;6787:15;6813:168;6886:9;;;6917;;6934:15;;;6928:22;;6914:37;6904:71;;6955:18;;:::i;7753:127::-;7814:10;7809:3;7805:20;7802:1;7795:31;7845:4;7842:1;7835:15;7869:4;7866:1;7859:15;7885:128;7952:9;;;7973:11;;;7970:37;;;7987:18;;:::i;8018:127::-;8079:10;8074:3;8070:20;8067:1;8060:31;8110:4;8107:1;8100:15;8134:4;8131:1;8124:15;8150:135;8189:3;8210:17;;;8207:43;;8230:18;;:::i;:::-;-1:-1:-1;8277:1:1;8266:13;;8150:135::o;8290:184::-;8360:6;8413:2;8401:9;8392:7;8388:23;8384:32;8381:52;;;8429:1;8426;8419:12;8381:52;-1:-1:-1;8452:16:1;;8290:184;-1:-1:-1;8290:184:1:o;8758:245::-;8825:6;8878:2;8866:9;8857:7;8853:23;8849:32;8846:52;;;8894:1;8891;8884:12;8846:52;8926:9;8920:16;8945:28;8967:5;8945:28;:::i;9781:125::-;9846:9;;;9867:10;;;9864:36;;;9880:18;;:::i;10620:408::-;10822:2;10804:21;;;10861:2;10841:18;;;10834:30;10900:34;10895:2;10880:18;;10873:62;-1:-1:-1;;;10966:2:1;10951:18;;10944:42;11018:3;11003:19;;10620:408::o;15430:217::-;15470:1;15496;15486:132;;15540:10;15535:3;15531:20;15528:1;15521:31;15575:4;15572:1;15565:15;15603:4;15600:1;15593:15;15486:132;-1:-1:-1;15632:9:1;;15430:217::o;16108:251::-;16178:6;16231:2;16219:9;16210:7;16206:23;16202:32;16199:52;;;16247:1;16244;16237:12;16199:52;16279:9;16273:16;16298:31;16323:5;16298:31;:::i;16364:980::-;16626:4;16674:3;16663:9;16659:19;16705:6;16694:9;16687:25;16731:2;16769:6;16764:2;16753:9;16749:18;16742:34;16812:3;16807:2;16796:9;16792:18;16785:31;16836:6;16871;16865:13;16902:6;16894;16887:22;16940:3;16929:9;16925:19;16918:26;;16979:2;16971:6;16967:15;16953:29;;17000:1;17010:195;17024:6;17021:1;17018:13;17010:195;;;17089:13;;-1:-1:-1;;;;;17085:39:1;17073:52;;17180:15;;;;17145:12;;;;17121:1;17039:9;17010:195;;;-1:-1:-1;;;;;;;17261:32:1;;;;17256:2;17241:18;;17234:60;-1:-1:-1;;;17325:3:1;17310:19;17303:35;17222:3;16364:980;-1:-1:-1;;;16364:980:1:o;17961:306::-;18049:6;18057;18065;18118:2;18106:9;18097:7;18093:23;18089:32;18086:52;;;18134:1;18131;18124:12;18086:52;18163:9;18157:16;18147:26;;18213:2;18202:9;18198:18;18192:25;18182:35;;18257:2;18246:9;18242:18;18236:25;18226:35;;17961:306;;;;;:::o

Swarm Source

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