ETH Price: $3,280.01 (+0.01%)
Gas: 9 Gwei

Token

InfinityGaming ($PLAY)
 

Overview

Max Total Supply

1,000,000,000,000 $PLAY

Holders

355

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,087,695,021.881804711 $PLAY

Value
$0.00
0x28F88736Fd6F72255F6b7E2994a6589afF20b8E4
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:
InfinityGaming

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-06
*/

/** 

Telegram Portal: https://t.me/infinityxplay_portal
Website: infinitygaming.io
Twitter: https://twitter.com/infinityxplay

*/


pragma solidity ^0.8.10;

// SPDX-License-Identifier: Unlicensed
interface IERC20 {
    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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev 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.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(
            _previousOwner == msg.sender,
            "You don't have permission to unlock"
        );
        require(block.timestamp > _lockTime, "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

// pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// 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,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// pragma solidity >=0.6.2;

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

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

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

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

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

contract InfinityGaming 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 _isBlackListedBot;

    mapping(address => bool) private _isExcludedFromLimit;
    address[] private _blackListedBots;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000 * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    address payable public _marketingAddress =
        payable(0x3158dc6cDcd11F013343DE8C3f090063C4562420);
    address payable public _devwallet =
        payable(address(0x9e031969A54337d7a5B0edB5a068c07280132C98));
    address private _donationAddress =
        0x000000000000000000000000000000000000dEaD;

    string private _name = "InfinityGaming";
    string private _symbol = "$PLAY";
    uint8 private _decimals = 9;

    struct BuyFee {
        uint16 tax;
        uint16 liquidity;
        uint16 marketing;
        uint16 dev;
        uint16 donation;
    }

    struct SellFee {
        uint16 tax;
        uint16 liquidity;
        uint16 marketing;
        uint16 dev;
        uint16 donation;
    }

    BuyFee public buyFee;
    SellFee public sellFee;

    uint16 private _taxFee;
    uint16 private _liquidityFee;
    uint16 private _marketingFee;
    uint16 private _devFee;
    uint16 private _donationFee;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public _maxTxAmount = 3500 * 10**6 * 10**9;
    uint256 private numTokensSellToAddToLiquidity = 5000 * 10**6 * 10**9;
    uint256 public _maxWalletSize = 30000 * 10**6 * 10**9;

    event botAddedToBlacklist(address account);
    event botRemovedFromBlacklist(address account);

    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;

        buyFee.tax = 0;
        buyFee.liquidity = 45;
        buyFee.marketing = 47;
        buyFee.dev = 1;
        buyFee.donation = 0;

        sellFee.tax = 0;
        sellFee.liquidity = 10;
        sellFee.marketing = 20;
        sellFee.dev = 0;
        sellFee.donation = 0;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;

        // exclude owner, dev wallet, and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_marketingAddress] = true;
        _isExcludedFromFee[_devwallet] = true;
        _isExcludedFromFee[0xb67d3F8Fb72a062B4DA1D28c6d302BbEe518a58b] = true;
        _isExcludedFromFee[0x9CFCf822Ea9F938D148d4De0F7d704C48bc19013 ] = true;
        _isExcludedFromFee[0x48E67bbB2Ed59BE8c153bBdd9B346d25D41f86EE ] = true;

        _isExcludedFromLimit[_marketingAddress] = true;
        _isExcludedFromLimit[_devwallet] = true;
        _isExcludedFromLimit[owner()] = true;
        _isExcludedFromLimit[0xb67d3F8Fb72a062B4DA1D28c6d302BbEe518a58b] = true;
        _isExcludedFromLimit[address(this)] = true;
        _isExcludedFromLimit[0x9CFCf822Ea9F938D148d4De0F7d704C48bc19013 ] = true;
        _isExcludedFromLimit[0x48E67bbB2Ed59BE8c153bBdd9B346d25D41f86EE ] = 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 donationAddress() public view returns (address) {
        return _donationAddress;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );

        (
            ,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, , ) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

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

        (
            ,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, ) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

        if (!deductTransferFee) {
            return rAmount;
        } else {
            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 addBotToBlacklist(address account) external onlyOwner {
        require(
            account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,
            "We cannot blacklist UniSwap router"
        );
        require(!_isBlackListedBot[account], "Account is already blacklisted");
        _isBlackListedBot[account] = true;
        _blackListedBots.push(account);
    }

    function removeBotFromBlacklist(address account) external onlyOwner {
        require(_isBlackListedBot[account], "Account is not blacklisted");
        for (uint256 i = 0; i < _blackListedBots.length; i++) {
            if (_blackListedBots[i] == account) {
                _blackListedBots[i] = _blackListedBots[
                    _blackListedBots.length - 1
                ];
                _isBlackListedBot[account] = false;
                _blackListedBots.pop();
                break;
            }
        }
    }

    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 not 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 excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

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

    function excludeFromLimit(address account) public onlyOwner {
        _isExcludedFromLimit[account] = true;
    }

    function includeInLimit(address account) public onlyOwner {
        _isExcludedFromLimit[account] = false;
    }

    function setSellFee(
        uint16 tax,
        uint16 liquidity,
        uint16 marketing,
        uint16 dev,
        uint16 donation
    ) external onlyOwner {
        sellFee.tax = tax;
        sellFee.marketing = marketing;
        sellFee.liquidity = liquidity;
        sellFee.dev = dev;
        sellFee.donation = donation;
    }

    function setBuyFee(
        uint16 tax,
        uint16 liquidity,
        uint16 marketing,
        uint16 dev,
        uint16 donation
    ) external onlyOwner {
        buyFee.tax = tax;
        buyFee.marketing = marketing;
        buyFee.liquidity = liquidity;
        buyFee.dev = dev;
        buyFee.donation = donation;
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**3);
    }

    function _setMaxWalletSizePercent(uint256 maxWalletSize)
        external
        onlyOwner
    {
        _maxWalletSize = _tTotal.mul(maxWalletSize).div(10**3);
    }

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

    //to recieve ETH from uniswapV2Router when swapping
    receive() external payable {}

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

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tWallet = calculateMarketingFee(tAmount) +
            calculateDevFee(tAmount);
        uint256 tDonation = calculateDonationFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        tTransferAmount = tTransferAmount.sub(tWallet);
        tTransferAmount = tTransferAmount.sub(tDonation);

        return (tTransferAmount, tFee, tLiquidity, tWallet, tDonation);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 tWallet,
        uint256 tDonation,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rWallet = tWallet.mul(currentRate);
        uint256 rDonation = tDonation.mul(currentRate);
        uint256 rTransferAmount = rAmount
            .sub(rFee)
            .sub(rLiquidity)
            .sub(rWallet)
            .sub(rDonation);
        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 _takeWalletFee(uint256 tWallet) private {
        uint256 currentRate = _getRate();
        uint256 rWallet = tWallet.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rWallet);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tWallet);
    }

    function _takeDonationFee(uint256 tDonation) private {
        uint256 currentRate = _getRate();
        uint256 rDonation = tDonation.mul(currentRate);
        _rOwned[_donationAddress] = _rOwned[_donationAddress].add(rDonation);
        if (_isExcluded[_donationAddress])
            _tOwned[_donationAddress] = _tOwned[_donationAddress].add(
                tDonation
            );
    }

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

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

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_marketingFee).div(10**2);
    }

    function calculateDonationFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_donationFee).div(10**2);
    }

    function calculateDevFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_devFee).div(10**2);
    }

    function removeAllFee() private {
        _taxFee = 0;
        _liquidityFee = 0;
        _marketingFee = 0;
        _donationFee = 0;
        _devFee = 0;
    }

    function setBuy() private {
        _taxFee = buyFee.tax;
        _liquidityFee = buyFee.liquidity;
        _marketingFee = buyFee.marketing;
        _donationFee = buyFee.donation;
        _devFee = buyFee.dev;
    }

    function setSell() private {
        _taxFee = sellFee.tax;
        _liquidityFee = sellFee.liquidity;
        _marketingFee = sellFee.marketing;
        _donationFee = sellFee.donation;
        _devFee = sellFee.dev;
    }

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

    function isExcludedFromLimit(address account) public view returns (bool) {
        return _isExcludedFromLimit[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");
        require(!_isBlackListedBot[from], "You are blacklisted");
        require(!_isBlackListedBot[msg.sender], "blacklisted");
        require(!_isBlackListedBot[tx.origin], "blacklisted");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

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

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee) {
            if (!_isExcludedFromLimit[from] && !_isExcludedFromLimit[to]) {
                require(
                    amount <= _maxTxAmount,
                    "Transfer amount exceeds the maxTxAmount."
                );
                if (to != uniswapV2Pair) {
                    require(
                        amount + balanceOf(to) <= _maxWalletSize,
                        "Recipient exceeds max wallet size."
                    );
                }
            }
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        // Split the contract balance into halves
        uint256 denominator = (buyFee.liquidity +
            sellFee.liquidity +
            buyFee.marketing +
            sellFee.marketing +
            buyFee.dev +
            sellFee.dev) * 2;
        uint256 tokensToAddLiquidityWith = (tokens *
            (buyFee.liquidity + sellFee.liquidity)) / denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(toSwap);

        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance = deltaBalance /
            (denominator - (buyFee.liquidity + sellFee.liquidity));
        uint256 bnbToAddLiquidityWith = unitBalance *
            (buyFee.liquidity + sellFee.liquidity);

        if (bnbToAddLiquidityWith > 0) {
            // Add liquidity to pancake
            addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        }

        // Send ETH to marketing
        uint256 marketingAmt = unitBalance *
            2 *
            (buyFee.marketing + sellFee.marketing);
        uint256 devAmt = unitBalance * 2 * (buyFee.dev + sellFee.dev) >
            address(this).balance
            ? address(this).balance
            : unitBalance * 2 * (buyFee.dev + sellFee.dev);

        if (marketingAmt > 0) {
            payable(_marketingAddress).transfer(marketingAmt);
        }

        if (devAmt > 0) {
            _devwallet.transfer(devAmt);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (takeFee) {
            removeAllFee();

            if (sender == uniswapV2Pair) {
                setBuy();
            }
            if (recipient == uniswapV2Pair) {
                setSell();
            }
        }

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

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _takeDonationFee(tDonation);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _takeDonationFee(tDonation);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _takeDonationFee(tDonation);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
            uint256 tDonation
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            tDonation,
            _getRate()
        );

        _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);
        _takeWalletFee(tWallet);
        _takeDonationFee(tDonation);
        _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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"botAddedToBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"botRemovedFromBlacklist","type":"event"},{"inputs":[],"name":"_devwallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"maxWalletSize","type":"uint256"}],"name":"_setMaxWalletSizePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBotToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"donation","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"donationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"includeInLimit","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":"isExcludedFromLimit","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":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","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":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBotFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"donation","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"donation","type":"uint16"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"donation","type":"uint16"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","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":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052683635c9adc5dea00000600c819055620000219060001962000653565b6200002f9060001962000676565b600d55600f80546001600160a01b0319908116733158dc6cdcd11f013343de8c3f090063c456242017909155601080548216739e031969a54337d7a5b0edb5a068c07280132c981790556011805490911661dead17905560408051808201909152600e8082526d496e66696e69747947616d696e6760901b6020909201918252620000bd91601291620005ad565b506040805180820190915260058082526424504c415960d81b6020909201918252620000ec91601391620005ad565b506014805460ff191660091790556017805460ff60581b19166b0100000000000000000000001790556730927f74c9de0000601855674563918244f400006019556801a055690d9db80000601a553480156200014757600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d543360009081526003602090815260409182902092909255601580546001600160501b03199081166601002f002d000017909155601680549091166414000a0000179055805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa1580156200021c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024291906200069c565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b691906200069c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032a91906200069c565b6001600160a01b0390811660a0528116608052600160066000620003566000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260068452828120805486166001908117909155600f8054841683528483208054881683179055601080548516845285842080548916841790557f34824e5cf58fd784dacd601e5b9a5afb5c887a8af0d1836de3769489c6ce1fed80548916841790557f8c00861e279ec0016fdb21c25a9ebfbd0cb2a3812a9370292596b7a1d9322bbf80548916841790557fa7c37ff9753a1ec380e09e2d822b253c025cddb9aaded9d5a4a3d163da45222d8054891684179055905484168352600a95869052848320805488168317905554909216815291822080549094168117909355620004786000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055600a9092527f5d420876c737dceb5c2363bcdd0a072de4d590c976faad847c44dc1fbb12799b80548416600190811790915530835290822080548416821790557f993ce75f038534a8074e6214022ad6b671075436b2c9e73efabf3a4032ec058980548416821790557348e67bbb2ed59be8c153bbdd9b346d25d41f86ee9091527f0d0ce6da364ef13fb43a2ee20418841bf154ecefdf806651da0b4aa5c01df0bd8054909216179055620005563390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600c546040516200059e91815260200190565b60405180910390a3506200070b565b828054620005bb90620006ce565b90600052602060002090601f016020900481019282620005df57600085556200062a565b82601f10620005fa57805160ff19168380011785556200062a565b828001600101855582156200062a579182015b828111156200062a5782518255916020019190600101906200060d565b50620006389291506200063c565b5090565b5b808211156200063857600081556001016200063d565b6000826200067157634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200069757634e487b7160e01b600052601160045260246000fd5b500390565b600060208284031215620006af57600080fd5b81516001600160a01b0381168114620006c757600080fd5b9392505050565b600181811c90821680620006e357607f821691505b602082108114156200070557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161367c62000770600039600081816105c601528181611d9b01528181611ef501528181612575015261262001526000818161036601528181612ad101528181612b8a01528181612bc601528181612c380152612c94015261367c6000f3fe60806040526004361061028c5760003560e01c80635342acb41161015a578063af2ce614116100c1578063d94160e01161007a578063d94160e014610879578063dd467064146108b2578063dd62ed3e146108d2578063ea2f0b3714610918578063ec034bed14610938578063f2fde38b1461095657600080fd5b8063af2ce614146107c4578063b030b34a146107e4578063b6c5232414610804578063c49b9a8014610819578063caac793414610839578063d543dbeb1461085957600080fd5b80638f9a55c0116101135780638f9a55c01461072457806391d919a91461073a57806395d89b411461075a578063a457c2d71461076f578063a69df4b51461078f578063a9059cbb146107a457600080fd5b80635342acb41461064957806370a0823114610682578063715018a6146106a25780637d1db4a5146106b757806388f82020146106cd5780638da5cb5b1461070657600080fd5b80632d838119116101fe5780634549b039116101b75780634549b03914610550578063470624021461057057806349bd5a5e146105b45780634a74bb02146105e85780634cfd4a921461060957806352390c021461062957600080fd5b80632d8381191461048e578063313ce567146104ae5780633685d419146104d057806339509351146104f05780633bd5d17314610510578063437823ec1461053057600080fd5b80631694505e116102505780631694505e1461035457806318160ddd146103a05780631c4a78ef146103b55780631d7ef879146103d557806323b872dd146103f55780632b14ca561461041557600080fd5b806306fdde0314610298578063095ea7b3146102c35780630bd3a7f9146102f357806313114a9d146103155780631465d9291461033457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610976565b6040516102ba9190613174565b60405180910390f35b3480156102cf57600080fd5b506102e36102de3660046131e1565b610a08565b60405190151581526020016102ba565b3480156102ff57600080fd5b5061031361030e36600461320d565b610a1f565b005b34801561032157600080fd5b50600e545b6040519081526020016102ba565b34801561034057600080fd5b5061031361034f366004613241565b610a76565b34801561036057600080fd5b506103887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102ba565b3480156103ac57600080fd5b50600c54610326565b3480156103c157600080fd5b50601054610388906001600160a01b031681565b3480156103e157600080fd5b506103136103f036600461320d565b610b12565b34801561040157600080fd5b506102e36104103660046132a6565b610c83565b34801561042157600080fd5b506016546104599061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b6040805161ffff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102ba565b34801561049a57600080fd5b506103266104a93660046132e7565b610cec565b3480156104ba57600080fd5b5060145460405160ff90911681526020016102ba565b3480156104dc57600080fd5b506103136104eb36600461320d565b610d70565b3480156104fc57600080fd5b506102e361050b3660046131e1565b610f27565b34801561051c57600080fd5b5061031361052b3660046132e7565b610f5d565b34801561053c57600080fd5b5061031361054b36600461320d565b61106b565b34801561055c57600080fd5b5061032661056b366004613310565b6110b9565b34801561057c57600080fd5b506015546104599061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b3480156105c057600080fd5b506103887f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f457600080fd5b506017546102e390600160581b900460ff1681565b34801561061557600080fd5b50610313610624366004613241565b61115c565b34801561063557600080fd5b5061031361064436600461320d565b6111f8565b34801561065557600080fd5b506102e361066436600461320d565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561068e57600080fd5b5061032661069d36600461320d565b61134b565b3480156106ae57600080fd5b506103136113aa565b3480156106c357600080fd5b5061032660185481565b3480156106d957600080fd5b506102e36106e836600461320d565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071257600080fd5b506000546001600160a01b0316610388565b34801561073057600080fd5b50610326601a5481565b34801561074657600080fd5b5061031361075536600461320d565b61140c565b34801561076657600080fd5b506102ad611457565b34801561077b57600080fd5b506102e361078a3660046131e1565b611466565b34801561079b57600080fd5b506103136114b5565b3480156107b057600080fd5b506102e36107bf3660046131e1565b6115bb565b3480156107d057600080fd5b506103136107df3660046132e7565b6115c8565b3480156107f057600080fd5b506103136107ff36600461320d565b611619565b34801561081057600080fd5b50600254610326565b34801561082557600080fd5b5061031361083436600461333c565b61179d565b34801561084557600080fd5b50600f54610388906001600160a01b031681565b34801561086557600080fd5b506103136108743660046132e7565b61181f565b34801561088557600080fd5b506102e361089436600461320d565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156108be57600080fd5b506103136108cd3660046132e7565b61186a565b3480156108de57600080fd5b506103266108ed366004613357565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561092457600080fd5b5061031361093336600461320d565b6118ef565b34801561094457600080fd5b506011546001600160a01b0316610388565b34801561096257600080fd5b5061031361097136600461320d565b61193a565b60606012805461098590613390565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190613390565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a15338484611a12565b5060015b92915050565b6000546001600160a01b03163314610a525760405162461bcd60e51b8152600401610a49906133cb565b60405180910390fd5b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6000546001600160a01b03163314610aa05760405162461bcd60e51b8152600401610a49906133cb565b6015805461ffff928316600160401b0261ffff60401b19948416600160301b0261ffff60301b1997851662010000029790971667ffff0000ffff000019968516600160201b0265ffff0000ffff1990931694909816939093171793909316949094179290921791909116919091179055565b6000546001600160a01b03163314610b3c5760405162461bcd60e51b8152600401610a49906133cb565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415610bb45760405162461bcd60e51b815260206004820152602260248201527f57652063616e6e6f7420626c61636b6c69737420556e695377617020726f757460448201526132b960f11b6064820152608401610a49565b6001600160a01b03811660009081526009602052604090205460ff1615610c1d5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610a49565b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6000610c90848484611b36565b610ce28433610cdd856040518060600160405280602881526020016135da602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611faf565b611a12565b5060019392505050565b6000600d54821115610d535760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a49565b6000610d5d611fe9565b9050610d69838261200c565b9392505050565b6000546001600160a01b03163314610d9a5760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526007602052604090205460ff16610e025760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610a49565b60005b600854811015610f2357816001600160a01b031660088281548110610e2c57610e2c613400565b6000918252602090912001546001600160a01b03161415610f115760088054610e579060019061342c565b81548110610e6757610e67613400565b600091825260209091200154600880546001600160a01b039092169183908110610e9357610e93613400565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610eeb57610eeb613443565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f1b81613459565b915050610e05565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610a15918590610cdd908661204e565b3360008181526007602052604090205460ff1615610fd25760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a49565b600080600080610fe1866120ad565b94509450945094505060006110018786868686610ffc611fe9565b61213c565b50506001600160a01b03871660009081526003602052604090205490915061102990826121b0565b6001600160a01b038716600090815260036020526040902055600d5461104f90826121b0565b600d55600e5461105f908861204e565b600e5550505050505050565b6000546001600160a01b031633146110955760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600c5483111561110d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a49565b60008060008061111c876120ad565b9450945094509450506000806111388987878787610ffc611fe9565b50915091508761114f57509450610a199350505050565b9550610a19945050505050565b6000546001600160a01b031633146111865760405162461bcd60e51b8152600401610a49906133cb565b6016805461ffff928316600160401b0261ffff60401b19948416600160301b0261ffff60301b1997851662010000029790971667ffff0000ffff000019968516600160201b0265ffff0000ffff1990931694909816939093171793909316949094179290921791909116919091179055565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526007602052604090205460ff161561128b5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a49565b6001600160a01b038116600090815260036020526040902054156112e5576001600160a01b0381166000908152600360205260409020546112cb90610cec565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b03811660009081526007602052604081205460ff161561138857506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610a1990610cec565b6000546001600160a01b031633146113d45760405162461bcd60e51b8152600401610a49906133cb565b600080546040516001600160a01b0390911690600080516020613602833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146114365760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b60606013805461098590613390565b6000610a153384610cdd85604051806060016040528060258152602001613622602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611faf565b6001546001600160a01b0316331461151b5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610a49565b600254421161156c5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a49565b600154600080546040516001600160a01b03938416939091169160008051602061360283398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610a15338484611b36565b6000546001600160a01b031633146115f25760405162461bcd60e51b8152600401610a49906133cb565b6116136103e861160d83600c546121f290919063ffffffff16565b9061200c565b601a5550565b6000546001600160a01b031633146116435760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526009602052604090205460ff166116ab5760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610a49565b60005b600b54811015610f2357816001600160a01b0316600b82815481106116d5576116d5613400565b6000918252602090912001546001600160a01b0316141561178b57600b80546117009060019061342c565b8154811061171057611710613400565b600091825260209091200154600b80546001600160a01b03909216918390811061173c5761173c613400565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600990915260409020805460ff19169055600b805480610eeb57610eeb613443565b8061179581613459565b9150506116ae565b6000546001600160a01b031633146117c75760405162461bcd60e51b8152600401610a49906133cb565b60178054821515600160581b0260ff60581b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061181490831515815260200190565b60405180910390a150565b6000546001600160a01b031633146118495760405162461bcd60e51b8152600401610a49906133cb565b6118646103e861160d83600c546121f290919063ffffffff16565b60185550565b6000546001600160a01b031633146118945760405162461bcd60e51b8152600401610a49906133cb565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556118c38142613474565b600255600080546040516001600160a01b0390911690600080516020613602833981519152908390a350565b6000546001600160a01b031633146119195760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146119645760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b0381166119c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a49565b600080546040516001600160a01b038085169392169160008051602061360283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611a745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6001600160a01b038216611ad55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a49565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b9a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a49565b6001600160a01b038216611bfc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a49565b60008111611c5e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a49565b6001600160a01b03831660009081526009602052604090205460ff1615611cbd5760405162461bcd60e51b8152602060048201526013602482015272165bdd48185c9948189b1858dadb1a5cdd1959606a1b6044820152606401610a49565b3360009081526009602052604090205460ff1615611d0b5760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610a49565b3260009081526009602052604090205460ff1615611d595760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610a49565b6000611d643061134b565b90506018548110611d7457506018545b60195481108015908190611d925750601754600160501b900460ff16155b8015611dd057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611de55750601754600160581b900460ff165b15611df8576019549150611df882612271565b6001600160a01b03851660009081526006602052604090205460019060ff1680611e3a57506001600160a01b03851660009081526006602052604090205460ff165b15611e43575060005b8015611f9b576001600160a01b0386166000908152600a602052604090205460ff16158015611e8b57506001600160a01b0385166000908152600a602052604090205460ff16155b15611f9b57601854841115611ef35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a49565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614611f9b57601a54611f388661134b565b611f429086613474565b1115611f9b5760405162461bcd60e51b815260206004820152602260248201527f526563697069656e742065786365656473206d61782077616c6c65742073697a604482015261329760f11b6064820152608401610a49565b611fa786868684612555565b505050505050565b60008184841115611fd35760405162461bcd60e51b8152600401610a499190613174565b506000611fe0848661342c565b95945050505050565b6000806000611ff6612823565b9092509050612005828261200c565b9250505090565b6000610d6983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129a5565b60008061205b8385613474565b905083811015610d695760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a49565b6000806000806000806120bf876129d3565b905060006120cc886129ef565b905060006120d989612a11565b6120e28a612a34565b6120ec9190613474565b905060006120f98a612a57565b905060006121118461210b8d886121b0565b906121b0565b905061211d81846121b0565b905061212981836121b0565b9b949a5092985090965094509092505050565b600080808061214b8a866121f2565b905060006121598a876121f2565b905060006121678a886121f2565b905060006121758a896121f2565b905060006121838a8a6121f2565b905060006121998261210b858188818c8c6121b0565b959f959e50939c50939a5050505050505050505050565b6000610d6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611faf565b60008261220157506000610a19565b600061220d838561348c565b90508261221a85836134ab565b14610d695760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a49565b6017805460ff60501b1916600160501b17905560165460155460009161ffff600160301b808304821693908104821692600160201b8082048416939083048116926122c99262010000908190048316929104166134cd565b6122d391906134cd565b6122dd91906134cd565b6122e791906134cd565b6122f191906134cd565b6122fc9060026134f3565b60165460155461ffff92831693506000928492612327926201000091829004831692919004166134cd565b6123359061ffff168561348c565b61233f91906134ab565b9050600061234d828561342c565b90504761235982612a7a565b6000612365824761342c565b60165460155491925060009161238d9161ffff620100009182900481169291909104166134cd565b61239b9061ffff168761342c565b6123a590836134ab565b6016546015549192506000916123cd9161ffff620100009182900481169291909104166134cd565b6123db9061ffff168361348c565b905080156123ed576123ed8682612c32565b6016546015546000916124129161ffff600160201b92839004811692909104166134cd565b61ffff1661242184600261348c565b61242b919061348c565b60165460155491925060009147916124559161ffff600160301b92839004811692909104166134cd565b61ffff1661246486600261348c565b61246e919061348c565b116124b4576016546015546124969161ffff600160301b9182900481169291909104166134cd565b61ffff166124a585600261348c565b6124af919061348c565b6124b6565b475b905081156124fa57600f546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156124f8573d6000803e3d6000fd5b505b801561253c576010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561253a573d6000803e3d6000fd5b505b50506017805460ff60501b191690555050505050505050565b80156126c9576125736017805469ffffffffffffffffffff19169055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316141561261e576015546017805461ffff80841663ffffffff1990921691909117620100008085048316021769ffff0000ffff000000001916600160201b80850483160261ffff60401b191617600160401b8085048316021761ffff60301b1916600160301b93849004919091169092029190911790555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156126c9576016546017805461ffff80841663ffffffff1990921691909117620100008085048316021769ffff0000ffff000000001916600160201b80850483160261ffff60401b191617600160401b8085048316021761ffff60301b1916600160301b93849004919091169092029190911790555b6001600160a01b03841660009081526007602052604090205460ff16801561270a57506001600160a01b03831660009081526007602052604090205460ff16155b1561271f5761271a848484612d12565b61281d565b6001600160a01b03841660009081526007602052604090205460ff1615801561276057506001600160a01b03831660009081526007602052604090205460ff165b156127705761271a848484612e63565b6001600160a01b03841660009081526007602052604090205460ff161580156127b257506001600160a01b03831660009081526007602052604090205460ff16155b156127c25761271a848484612f23565b6001600160a01b03841660009081526007602052604090205460ff16801561280257506001600160a01b03831660009081526007602052604090205460ff165b156128125761271a848484612f7e565b61281d848484612f23565b50505050565b600d54600c546000918291825b6008548110156129755782600360006008848154811061285257612852613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806128bd575081600460006008848154811061289657612896613400565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156128d357600d54600c54945094505050509091565b61291960036000600884815481106128ed576128ed613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906121b0565b9250612961600460006008848154811061293557612935613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906121b0565b91508061296d81613459565b915050612830565b50600c54600d546129859161200c565b82101561299c57600d54600c549350935050509091565b90939092509050565b600081836129c65760405162461bcd60e51b8152600401610a499190613174565b506000611fe084866134ab565b601754600090610a199060649061160d90859061ffff166121f2565b601754600090610a199060649061160d90859062010000900461ffff166121f2565b601754600090610a199060649061160d908590600160301b900461ffff166121f2565b601754600090610a199060649061160d908590600160201b900461ffff166121f2565b601754600090610a199060649061160d908590600160401b900461ffff166121f2565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612aaf57612aaf613400565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b51919061351d565b81600181518110612b6457612b64613400565b60200260200101906001600160a01b031690816001600160a01b031681525050612baf307f000000000000000000000000000000000000000000000000000000000000000084611a12565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612c0490859060009086903090429060040161353a565b600060405180830381600087803b158015612c1e57600080fd5b505af1158015611fa7573d6000803e3d6000fd5b612c5d307f000000000000000000000000000000000000000000000000000000000000000084611a12565b60405163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612ce6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d0b91906135ab565b5050505050565b6000806000806000612d23866120ad565b945094509450945094506000806000612d428988888888610ffc611fe9565b6001600160a01b038e166000908152600460205260409020549295509093509150612d6d908a6121b0565b6001600160a01b038c16600090815260046020908152604080832093909355600390522054612d9c90846121b0565b6001600160a01b03808d1660009081526003602052604080822093909355908c1681522054612dcb908361204e565b6001600160a01b038b16600090815260036020526040902055612ded86613008565b612df685613008565b612dff84613091565b612e098188613150565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051612e4e91815260200190565b60405180910390a35050505050505050505050565b6000806000806000612e74866120ad565b945094509450945094506000806000612e938988888888610ffc611fe9565b6001600160a01b038e166000908152600360205260409020549295509093509150612ebe90846121b0565b6001600160a01b03808d16600090815260036020908152604080832094909455918d16815260049091522054612ef4908961204e565b6001600160a01b038b16600090815260046020908152604080832093909355600390522054612dcb908361204e565b6000806000806000612f34866120ad565b945094509450945094506000806000612f538988888888610ffc611fe9565b6001600160a01b038e166000908152600360205260409020549295509093509150612d9c90846121b0565b6000806000806000612f8f866120ad565b945094509450945094506000806000612fae8988888888610ffc611fe9565b6001600160a01b038e166000908152600460205260409020549295509093509150612fd9908a6121b0565b6001600160a01b038c16600090815260046020908152604080832093909355600390522054612ebe90846121b0565b6000613012611fe9565b9050600061302083836121f2565b3060009081526003602052604090205490915061303d908261204e565b3060009081526003602090815260408083209390935560079052205460ff161561308c573060009081526004602052604090205461307b908461204e565b306000908152600460205260409020555b505050565b600061309b611fe9565b905060006130a983836121f2565b6011546001600160a01b03166000908152600360205260409020549091506130d1908261204e565b601180546001600160a01b03908116600090815260036020908152604080832095909555925490911681526007909152205460ff161561308c576011546001600160a01b0316600090815260046020526040902054613130908461204e565b6011546001600160a01b0316600090815260046020526040902055505050565b600d5461315d90836121b0565b600d55600e5461316d908261204e565b600e555050565b600060208083528351808285015260005b818110156131a157858101830151858201604001528201613185565b818111156131b3576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146131de57600080fd5b50565b600080604083850312156131f457600080fd5b82356131ff816131c9565b946020939093013593505050565b60006020828403121561321f57600080fd5b8135610d69816131c9565b803561ffff8116811461323c57600080fd5b919050565b600080600080600060a0868803121561325957600080fd5b6132628661322a565b94506132706020870161322a565b935061327e6040870161322a565b925061328c6060870161322a565b915061329a6080870161322a565b90509295509295909350565b6000806000606084860312156132bb57600080fd5b83356132c6816131c9565b925060208401356132d6816131c9565b929592945050506040919091013590565b6000602082840312156132f957600080fd5b5035919050565b8035801515811461323c57600080fd5b6000806040838503121561332357600080fd5b8235915061333360208401613300565b90509250929050565b60006020828403121561334e57600080fd5b610d6982613300565b6000806040838503121561336a57600080fd5b8235613375816131c9565b91506020830135613385816131c9565b809150509250929050565b600181811c908216806133a457607f821691505b602082108114156133c557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561343e5761343e613416565b500390565b634e487b7160e01b600052603160045260246000fd5b600060001982141561346d5761346d613416565b5060010190565b6000821982111561348757613487613416565b500190565b60008160001904831182151516156134a6576134a6613416565b500290565b6000826134c857634e487b7160e01b600052601260045260246000fd5b500490565b600061ffff8083168185168083038211156134ea576134ea613416565b01949350505050565b600061ffff8083168185168183048111821515161561351457613514613416565b02949350505050565b60006020828403121561352f57600080fd5b8151610d69816131c9565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561358a5784516001600160a01b031683529383019391830191600101613565565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156135c057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220225fa5566034d185b2e128085da518d8aefba505dbf170f5597ddf03a2f2de8864736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80635342acb41161015a578063af2ce614116100c1578063d94160e01161007a578063d94160e014610879578063dd467064146108b2578063dd62ed3e146108d2578063ea2f0b3714610918578063ec034bed14610938578063f2fde38b1461095657600080fd5b8063af2ce614146107c4578063b030b34a146107e4578063b6c5232414610804578063c49b9a8014610819578063caac793414610839578063d543dbeb1461085957600080fd5b80638f9a55c0116101135780638f9a55c01461072457806391d919a91461073a57806395d89b411461075a578063a457c2d71461076f578063a69df4b51461078f578063a9059cbb146107a457600080fd5b80635342acb41461064957806370a0823114610682578063715018a6146106a25780637d1db4a5146106b757806388f82020146106cd5780638da5cb5b1461070657600080fd5b80632d838119116101fe5780634549b039116101b75780634549b03914610550578063470624021461057057806349bd5a5e146105b45780634a74bb02146105e85780634cfd4a921461060957806352390c021461062957600080fd5b80632d8381191461048e578063313ce567146104ae5780633685d419146104d057806339509351146104f05780633bd5d17314610510578063437823ec1461053057600080fd5b80631694505e116102505780631694505e1461035457806318160ddd146103a05780631c4a78ef146103b55780631d7ef879146103d557806323b872dd146103f55780632b14ca561461041557600080fd5b806306fdde0314610298578063095ea7b3146102c35780630bd3a7f9146102f357806313114a9d146103155780631465d9291461033457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610976565b6040516102ba9190613174565b60405180910390f35b3480156102cf57600080fd5b506102e36102de3660046131e1565b610a08565b60405190151581526020016102ba565b3480156102ff57600080fd5b5061031361030e36600461320d565b610a1f565b005b34801561032157600080fd5b50600e545b6040519081526020016102ba565b34801561034057600080fd5b5061031361034f366004613241565b610a76565b34801561036057600080fd5b506103887f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102ba565b3480156103ac57600080fd5b50600c54610326565b3480156103c157600080fd5b50601054610388906001600160a01b031681565b3480156103e157600080fd5b506103136103f036600461320d565b610b12565b34801561040157600080fd5b506102e36104103660046132a6565b610c83565b34801561042157600080fd5b506016546104599061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b6040805161ffff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102ba565b34801561049a57600080fd5b506103266104a93660046132e7565b610cec565b3480156104ba57600080fd5b5060145460405160ff90911681526020016102ba565b3480156104dc57600080fd5b506103136104eb36600461320d565b610d70565b3480156104fc57600080fd5b506102e361050b3660046131e1565b610f27565b34801561051c57600080fd5b5061031361052b3660046132e7565b610f5d565b34801561053c57600080fd5b5061031361054b36600461320d565b61106b565b34801561055c57600080fd5b5061032661056b366004613310565b6110b9565b34801561057c57600080fd5b506015546104599061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b3480156105c057600080fd5b506103887f00000000000000000000000066a7ad3454f63a373d29c0363f0cba3b6ac152b181565b3480156105f457600080fd5b506017546102e390600160581b900460ff1681565b34801561061557600080fd5b50610313610624366004613241565b61115c565b34801561063557600080fd5b5061031361064436600461320d565b6111f8565b34801561065557600080fd5b506102e361066436600461320d565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561068e57600080fd5b5061032661069d36600461320d565b61134b565b3480156106ae57600080fd5b506103136113aa565b3480156106c357600080fd5b5061032660185481565b3480156106d957600080fd5b506102e36106e836600461320d565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071257600080fd5b506000546001600160a01b0316610388565b34801561073057600080fd5b50610326601a5481565b34801561074657600080fd5b5061031361075536600461320d565b61140c565b34801561076657600080fd5b506102ad611457565b34801561077b57600080fd5b506102e361078a3660046131e1565b611466565b34801561079b57600080fd5b506103136114b5565b3480156107b057600080fd5b506102e36107bf3660046131e1565b6115bb565b3480156107d057600080fd5b506103136107df3660046132e7565b6115c8565b3480156107f057600080fd5b506103136107ff36600461320d565b611619565b34801561081057600080fd5b50600254610326565b34801561082557600080fd5b5061031361083436600461333c565b61179d565b34801561084557600080fd5b50600f54610388906001600160a01b031681565b34801561086557600080fd5b506103136108743660046132e7565b61181f565b34801561088557600080fd5b506102e361089436600461320d565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156108be57600080fd5b506103136108cd3660046132e7565b61186a565b3480156108de57600080fd5b506103266108ed366004613357565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561092457600080fd5b5061031361093336600461320d565b6118ef565b34801561094457600080fd5b506011546001600160a01b0316610388565b34801561096257600080fd5b5061031361097136600461320d565b61193a565b60606012805461098590613390565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190613390565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a15338484611a12565b5060015b92915050565b6000546001600160a01b03163314610a525760405162461bcd60e51b8152600401610a49906133cb565b60405180910390fd5b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6000546001600160a01b03163314610aa05760405162461bcd60e51b8152600401610a49906133cb565b6015805461ffff928316600160401b0261ffff60401b19948416600160301b0261ffff60301b1997851662010000029790971667ffff0000ffff000019968516600160201b0265ffff0000ffff1990931694909816939093171793909316949094179290921791909116919091179055565b6000546001600160a01b03163314610b3c5760405162461bcd60e51b8152600401610a49906133cb565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415610bb45760405162461bcd60e51b815260206004820152602260248201527f57652063616e6e6f7420626c61636b6c69737420556e695377617020726f757460448201526132b960f11b6064820152608401610a49565b6001600160a01b03811660009081526009602052604090205460ff1615610c1d5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610a49565b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6000610c90848484611b36565b610ce28433610cdd856040518060600160405280602881526020016135da602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611faf565b611a12565b5060019392505050565b6000600d54821115610d535760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a49565b6000610d5d611fe9565b9050610d69838261200c565b9392505050565b6000546001600160a01b03163314610d9a5760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526007602052604090205460ff16610e025760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610a49565b60005b600854811015610f2357816001600160a01b031660088281548110610e2c57610e2c613400565b6000918252602090912001546001600160a01b03161415610f115760088054610e579060019061342c565b81548110610e6757610e67613400565b600091825260209091200154600880546001600160a01b039092169183908110610e9357610e93613400565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610eeb57610eeb613443565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610f1b81613459565b915050610e05565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610a15918590610cdd908661204e565b3360008181526007602052604090205460ff1615610fd25760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a49565b600080600080610fe1866120ad565b94509450945094505060006110018786868686610ffc611fe9565b61213c565b50506001600160a01b03871660009081526003602052604090205490915061102990826121b0565b6001600160a01b038716600090815260036020526040902055600d5461104f90826121b0565b600d55600e5461105f908861204e565b600e5550505050505050565b6000546001600160a01b031633146110955760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600c5483111561110d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a49565b60008060008061111c876120ad565b9450945094509450506000806111388987878787610ffc611fe9565b50915091508761114f57509450610a199350505050565b9550610a19945050505050565b6000546001600160a01b031633146111865760405162461bcd60e51b8152600401610a49906133cb565b6016805461ffff928316600160401b0261ffff60401b19948416600160301b0261ffff60301b1997851662010000029790971667ffff0000ffff000019968516600160201b0265ffff0000ffff1990931694909816939093171793909316949094179290921791909116919091179055565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526007602052604090205460ff161561128b5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a49565b6001600160a01b038116600090815260036020526040902054156112e5576001600160a01b0381166000908152600360205260409020546112cb90610cec565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b03811660009081526007602052604081205460ff161561138857506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610a1990610cec565b6000546001600160a01b031633146113d45760405162461bcd60e51b8152600401610a49906133cb565b600080546040516001600160a01b0390911690600080516020613602833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146114365760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b60606013805461098590613390565b6000610a153384610cdd85604051806060016040528060258152602001613622602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611faf565b6001546001600160a01b0316331461151b5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610a49565b600254421161156c5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a49565b600154600080546040516001600160a01b03938416939091169160008051602061360283398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610a15338484611b36565b6000546001600160a01b031633146115f25760405162461bcd60e51b8152600401610a49906133cb565b6116136103e861160d83600c546121f290919063ffffffff16565b9061200c565b601a5550565b6000546001600160a01b031633146116435760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03811660009081526009602052604090205460ff166116ab5760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610a49565b60005b600b54811015610f2357816001600160a01b0316600b82815481106116d5576116d5613400565b6000918252602090912001546001600160a01b0316141561178b57600b80546117009060019061342c565b8154811061171057611710613400565b600091825260209091200154600b80546001600160a01b03909216918390811061173c5761173c613400565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600990915260409020805460ff19169055600b805480610eeb57610eeb613443565b8061179581613459565b9150506116ae565b6000546001600160a01b031633146117c75760405162461bcd60e51b8152600401610a49906133cb565b60178054821515600160581b0260ff60581b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061181490831515815260200190565b60405180910390a150565b6000546001600160a01b031633146118495760405162461bcd60e51b8152600401610a49906133cb565b6118646103e861160d83600c546121f290919063ffffffff16565b60185550565b6000546001600160a01b031633146118945760405162461bcd60e51b8152600401610a49906133cb565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556118c38142613474565b600255600080546040516001600160a01b0390911690600080516020613602833981519152908390a350565b6000546001600160a01b031633146119195760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146119645760405162461bcd60e51b8152600401610a49906133cb565b6001600160a01b0381166119c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a49565b600080546040516001600160a01b038085169392169160008051602061360283398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611a745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a49565b6001600160a01b038216611ad55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a49565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b9a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a49565b6001600160a01b038216611bfc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a49565b60008111611c5e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a49565b6001600160a01b03831660009081526009602052604090205460ff1615611cbd5760405162461bcd60e51b8152602060048201526013602482015272165bdd48185c9948189b1858dadb1a5cdd1959606a1b6044820152606401610a49565b3360009081526009602052604090205460ff1615611d0b5760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610a49565b3260009081526009602052604090205460ff1615611d595760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610a49565b6000611d643061134b565b90506018548110611d7457506018545b60195481108015908190611d925750601754600160501b900460ff16155b8015611dd057507f00000000000000000000000066a7ad3454f63a373d29c0363f0cba3b6ac152b16001600160a01b0316856001600160a01b031614155b8015611de55750601754600160581b900460ff165b15611df8576019549150611df882612271565b6001600160a01b03851660009081526006602052604090205460019060ff1680611e3a57506001600160a01b03851660009081526006602052604090205460ff165b15611e43575060005b8015611f9b576001600160a01b0386166000908152600a602052604090205460ff16158015611e8b57506001600160a01b0385166000908152600a602052604090205460ff16155b15611f9b57601854841115611ef35760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a49565b7f00000000000000000000000066a7ad3454f63a373d29c0363f0cba3b6ac152b16001600160a01b0316856001600160a01b031614611f9b57601a54611f388661134b565b611f429086613474565b1115611f9b5760405162461bcd60e51b815260206004820152602260248201527f526563697069656e742065786365656473206d61782077616c6c65742073697a604482015261329760f11b6064820152608401610a49565b611fa786868684612555565b505050505050565b60008184841115611fd35760405162461bcd60e51b8152600401610a499190613174565b506000611fe0848661342c565b95945050505050565b6000806000611ff6612823565b9092509050612005828261200c565b9250505090565b6000610d6983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129a5565b60008061205b8385613474565b905083811015610d695760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a49565b6000806000806000806120bf876129d3565b905060006120cc886129ef565b905060006120d989612a11565b6120e28a612a34565b6120ec9190613474565b905060006120f98a612a57565b905060006121118461210b8d886121b0565b906121b0565b905061211d81846121b0565b905061212981836121b0565b9b949a5092985090965094509092505050565b600080808061214b8a866121f2565b905060006121598a876121f2565b905060006121678a886121f2565b905060006121758a896121f2565b905060006121838a8a6121f2565b905060006121998261210b858188818c8c6121b0565b959f959e50939c50939a5050505050505050505050565b6000610d6983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611faf565b60008261220157506000610a19565b600061220d838561348c565b90508261221a85836134ab565b14610d695760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a49565b6017805460ff60501b1916600160501b17905560165460155460009161ffff600160301b808304821693908104821692600160201b8082048416939083048116926122c99262010000908190048316929104166134cd565b6122d391906134cd565b6122dd91906134cd565b6122e791906134cd565b6122f191906134cd565b6122fc9060026134f3565b60165460155461ffff92831693506000928492612327926201000091829004831692919004166134cd565b6123359061ffff168561348c565b61233f91906134ab565b9050600061234d828561342c565b90504761235982612a7a565b6000612365824761342c565b60165460155491925060009161238d9161ffff620100009182900481169291909104166134cd565b61239b9061ffff168761342c565b6123a590836134ab565b6016546015549192506000916123cd9161ffff620100009182900481169291909104166134cd565b6123db9061ffff168361348c565b905080156123ed576123ed8682612c32565b6016546015546000916124129161ffff600160201b92839004811692909104166134cd565b61ffff1661242184600261348c565b61242b919061348c565b60165460155491925060009147916124559161ffff600160301b92839004811692909104166134cd565b61ffff1661246486600261348c565b61246e919061348c565b116124b4576016546015546124969161ffff600160301b9182900481169291909104166134cd565b61ffff166124a585600261348c565b6124af919061348c565b6124b6565b475b905081156124fa57600f546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156124f8573d6000803e3d6000fd5b505b801561253c576010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561253a573d6000803e3d6000fd5b505b50506017805460ff60501b191690555050505050505050565b80156126c9576125736017805469ffffffffffffffffffff19169055565b7f00000000000000000000000066a7ad3454f63a373d29c0363f0cba3b6ac152b16001600160a01b0316846001600160a01b0316141561261e576015546017805461ffff80841663ffffffff1990921691909117620100008085048316021769ffff0000ffff000000001916600160201b80850483160261ffff60401b191617600160401b8085048316021761ffff60301b1916600160301b93849004919091169092029190911790555b7f00000000000000000000000066a7ad3454f63a373d29c0363f0cba3b6ac152b16001600160a01b0316836001600160a01b031614156126c9576016546017805461ffff80841663ffffffff1990921691909117620100008085048316021769ffff0000ffff000000001916600160201b80850483160261ffff60401b191617600160401b8085048316021761ffff60301b1916600160301b93849004919091169092029190911790555b6001600160a01b03841660009081526007602052604090205460ff16801561270a57506001600160a01b03831660009081526007602052604090205460ff16155b1561271f5761271a848484612d12565b61281d565b6001600160a01b03841660009081526007602052604090205460ff1615801561276057506001600160a01b03831660009081526007602052604090205460ff165b156127705761271a848484612e63565b6001600160a01b03841660009081526007602052604090205460ff161580156127b257506001600160a01b03831660009081526007602052604090205460ff16155b156127c25761271a848484612f23565b6001600160a01b03841660009081526007602052604090205460ff16801561280257506001600160a01b03831660009081526007602052604090205460ff165b156128125761271a848484612f7e565b61281d848484612f23565b50505050565b600d54600c546000918291825b6008548110156129755782600360006008848154811061285257612852613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806128bd575081600460006008848154811061289657612896613400565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156128d357600d54600c54945094505050509091565b61291960036000600884815481106128ed576128ed613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906121b0565b9250612961600460006008848154811061293557612935613400565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906121b0565b91508061296d81613459565b915050612830565b50600c54600d546129859161200c565b82101561299c57600d54600c549350935050509091565b90939092509050565b600081836129c65760405162461bcd60e51b8152600401610a499190613174565b506000611fe084866134ab565b601754600090610a199060649061160d90859061ffff166121f2565b601754600090610a199060649061160d90859062010000900461ffff166121f2565b601754600090610a199060649061160d908590600160301b900461ffff166121f2565b601754600090610a199060649061160d908590600160201b900461ffff166121f2565b601754600090610a199060649061160d908590600160401b900461ffff166121f2565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612aaf57612aaf613400565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b51919061351d565b81600181518110612b6457612b64613400565b60200260200101906001600160a01b031690816001600160a01b031681525050612baf307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611a12565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612c0490859060009086903090429060040161353a565b600060405180830381600087803b158015612c1e57600080fd5b505af1158015611fa7573d6000803e3d6000fd5b612c5d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611a12565b60405163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612ce6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d0b91906135ab565b5050505050565b6000806000806000612d23866120ad565b945094509450945094506000806000612d428988888888610ffc611fe9565b6001600160a01b038e166000908152600460205260409020549295509093509150612d6d908a6121b0565b6001600160a01b038c16600090815260046020908152604080832093909355600390522054612d9c90846121b0565b6001600160a01b03808d1660009081526003602052604080822093909355908c1681522054612dcb908361204e565b6001600160a01b038b16600090815260036020526040902055612ded86613008565b612df685613008565b612dff84613091565b612e098188613150565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051612e4e91815260200190565b60405180910390a35050505050505050505050565b6000806000806000612e74866120ad565b945094509450945094506000806000612e938988888888610ffc611fe9565b6001600160a01b038e166000908152600360205260409020549295509093509150612ebe90846121b0565b6001600160a01b03808d16600090815260036020908152604080832094909455918d16815260049091522054612ef4908961204e565b6001600160a01b038b16600090815260046020908152604080832093909355600390522054612dcb908361204e565b6000806000806000612f34866120ad565b945094509450945094506000806000612f538988888888610ffc611fe9565b6001600160a01b038e166000908152600360205260409020549295509093509150612d9c90846121b0565b6000806000806000612f8f866120ad565b945094509450945094506000806000612fae8988888888610ffc611fe9565b6001600160a01b038e166000908152600460205260409020549295509093509150612fd9908a6121b0565b6001600160a01b038c16600090815260046020908152604080832093909355600390522054612ebe90846121b0565b6000613012611fe9565b9050600061302083836121f2565b3060009081526003602052604090205490915061303d908261204e565b3060009081526003602090815260408083209390935560079052205460ff161561308c573060009081526004602052604090205461307b908461204e565b306000908152600460205260409020555b505050565b600061309b611fe9565b905060006130a983836121f2565b6011546001600160a01b03166000908152600360205260409020549091506130d1908261204e565b601180546001600160a01b03908116600090815260036020908152604080832095909555925490911681526007909152205460ff161561308c576011546001600160a01b0316600090815260046020526040902054613130908461204e565b6011546001600160a01b0316600090815260046020526040902055505050565b600d5461315d90836121b0565b600d55600e5461316d908261204e565b600e555050565b600060208083528351808285015260005b818110156131a157858101830151858201604001528201613185565b818111156131b3576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146131de57600080fd5b50565b600080604083850312156131f457600080fd5b82356131ff816131c9565b946020939093013593505050565b60006020828403121561321f57600080fd5b8135610d69816131c9565b803561ffff8116811461323c57600080fd5b919050565b600080600080600060a0868803121561325957600080fd5b6132628661322a565b94506132706020870161322a565b935061327e6040870161322a565b925061328c6060870161322a565b915061329a6080870161322a565b90509295509295909350565b6000806000606084860312156132bb57600080fd5b83356132c6816131c9565b925060208401356132d6816131c9565b929592945050506040919091013590565b6000602082840312156132f957600080fd5b5035919050565b8035801515811461323c57600080fd5b6000806040838503121561332357600080fd5b8235915061333360208401613300565b90509250929050565b60006020828403121561334e57600080fd5b610d6982613300565b6000806040838503121561336a57600080fd5b8235613375816131c9565b91506020830135613385816131c9565b809150509250929050565b600181811c908216806133a457607f821691505b602082108114156133c557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561343e5761343e613416565b500390565b634e487b7160e01b600052603160045260246000fd5b600060001982141561346d5761346d613416565b5060010190565b6000821982111561348757613487613416565b500190565b60008160001904831182151516156134a6576134a6613416565b500290565b6000826134c857634e487b7160e01b600052601260045260246000fd5b500490565b600061ffff8083168185168083038211156134ea576134ea613416565b01949350505050565b600061ffff8083168185168183048111821515161561351457613514613416565b02949350505050565b60006020828403121561352f57600080fd5b8151610d69816131c9565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561358a5784516001600160a01b031683529383019391830191600101613565565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156135c057600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220225fa5566034d185b2e128085da518d8aefba505dbf170f5597ddf03a2f2de8864736f6c634300080a0033

Deployed Bytecode Sourcemap

27879:28345:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32328:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33313:193;;;;;;;;;;-1:-1:-1;33313:193:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;33313:193:0;1072:187:1;38842:115:0;;;;;;;;;;-1:-1:-1;38842:115:0;;;;;:::i;:::-;;:::i;:::-;;34812:87;;;;;;;;;;-1:-1:-1;34881:10:0;;34812:87;;;1662:25:1;;;1650:2;1635:18;34812:87:0;1516:177:1;39445:344:0;;;;;;;;;;-1:-1:-1;39445:344:0;;;;;:::i;:::-;;:::i;29649:51::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2532:32:1;;;2514:51;;2502:2;2487:18;29649:51:0;2341:230:1;32605:95:0;;;;;;;;;;-1:-1:-1;32685:7:0;;32605:95;;28794:105;;;;;;;;;;-1:-1:-1;28794:105:0;;;;-1:-1:-1;;;;;28794:105:0;;;36845:385;;;;;;;;;;-1:-1:-1;36845:385:0;;;;;:::i;:::-;;:::i;33514:446::-;;;;;;;;;;-1:-1:-1;33514:446:0;;;;;:::i;:::-;;:::i;29454:22::-;;;;;;;;;;-1:-1:-1;29454:22:0;;;;;;;;;;;;;;;-1:-1:-1;;;29454:22:0;;;;;-1:-1:-1;;;29454:22:0;;;;;-1:-1:-1;;;29454:22:0;;;;;;;;;;3520:6:1;3553:15;;;3535:34;;3605:15;;;3600:2;3585:18;;3578:43;3657:15;;;3637:18;;;3630:43;;;;3709:15;;3704:2;3689:18;;3682:43;3762:15;;;3756:3;3741:19;;3734:44;3497:3;3482:19;29454:22:0;3261:523:1;36515:322:0;;;;;;;;;;-1:-1:-1;36515:322:0;;;;;:::i;:::-;;:::i;32514:83::-;;;;;;;;;;-1:-1:-1;32580:9:0;;32514:83;;32580:9;;;;4116:36:1;;4104:2;4089:18;32514:83:0;3974:184:1;38124:473:0;;;;;;;;;;-1:-1:-1;38124:473:0;;;;;:::i;:::-;;:::i;33968:300::-;;;;;;;;;;-1:-1:-1;33968:300:0;;;;;:::i;:::-;;:::i;35014:739::-;;;;;;;;;;-1:-1:-1;35014:739:0;;;;;:::i;:::-;;:::i;38605:111::-;;;;;;;;;;-1:-1:-1;38605:111:0;;;;;:::i;:::-;;:::i;35761:746::-;;;;;;;;;;-1:-1:-1;35761:746:0;;;;;:::i;:::-;;:::i;29427:20::-;;;;;;;;;;-1:-1:-1;29427:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;29427:20:0;;;;;-1:-1:-1;;;29427:20:0;;;;;-1:-1:-1;;;29427:20:0;;;;;;29707:38;;;;;;;;;;;;;;;29782:40;;;;;;;;;;-1:-1:-1;29782:40:0;;;;-1:-1:-1;;;29782:40:0;;;;;;39087:350;;;;;;;;;;-1:-1:-1;39087:350:0;;;;;:::i;:::-;;:::i;37784:332::-;;;;;;;;;;-1:-1:-1;37784:332:0;;;;;:::i;:::-;;:::i;45486:124::-;;;;;;;;;;-1:-1:-1;45486:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;45575:27:0;45551:4;45575:27;;;:18;:27;;;;;;;;;45486:124;32708:198;;;;;;;;;;-1:-1:-1;32708:198:0;;;;;:::i;:::-;;:::i;17009:148::-;;;;;;;;;;;;;:::i;29831:50::-;;;;;;;;;;;;;;;;34684:120;;;;;;;;;;-1:-1:-1;34684:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;34776:20:0;34752:4;34776:20;;;:11;:20;;;;;;;;;34684:120;16367:79;;;;;;;;;;-1:-1:-1;16405:7:0;16432:6;-1:-1:-1;;;;;16432:6:0;16367:79;;29963:53;;;;;;;;;;;;;;;;38965:114;;;;;;;;;;-1:-1:-1;38965:114:0;;;;;:::i;:::-;;:::i;32419:87::-;;;;;;;;;;;;;:::i;34276:400::-;;;;;;;;;;-1:-1:-1;34276:400:0;;;;;:::i;:::-;;:::i;18064:341::-;;;;;;;;;;;;;:::i;32914:199::-;;;;;;;;;;-1:-1:-1;32914:199:0;;;;;:::i;:::-;;:::i;39941:172::-;;;;;;;;;;-1:-1:-1;39941:172:0;;;;;:::i;:::-;;:::i;37238:538::-;;;;;;;;;;-1:-1:-1;37238:538:0;;;;;:::i;:::-;;:::i;17601:89::-;;;;;;;;;;-1:-1:-1;17673:9:0;;17601:89;;40121:171;;;;;;;;;;-1:-1:-1;40121:171:0;;;;;:::i;:::-;;:::i;28684:103::-;;;;;;;;;;-1:-1:-1;28684:103:0;;;;-1:-1:-1;;;;;28684:103:0;;;39797:136;;;;;;;;;;-1:-1:-1;39797:136:0;;;;;:::i;:::-;;:::i;45618:128::-;;;;;;;;;;-1:-1:-1;45618:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;45709:29:0;45685:4;45709:29;;;:20;:29;;;;;;;;;45618:128;17766:226;;;;;;;;;;-1:-1:-1;17766:226:0;;;;;:::i;:::-;;:::i;33121:184::-;;;;;;;;;;-1:-1:-1;33121:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;33270:18:0;;;33238:7;33270:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;33121:184;38724:110;;;;;;;;;;-1:-1:-1;38724:110:0;;;;;:::i;:::-;;:::i;34907:99::-;;;;;;;;;;-1:-1:-1;34982:16:0;;-1:-1:-1;;;;;34982:16:0;34907:99;;17312:281;;;;;;;;;;-1:-1:-1;17312:281:0;;;;;:::i;:::-;;:::i;32328:83::-;32365:13;32398:5;32391:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32328:83;:::o;33313:193::-;33415:4;33437:39;8421:10;33460:7;33469:6;33437:8;:39::i;:::-;-1:-1:-1;33494:4:0;33313:193;;;;;:::o;38842:115::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;38913:29:0::1;;::::0;;;:20:::1;:29;::::0;;;;:36;;-1:-1:-1;;38913:36:0::1;38945:4;38913:36;::::0;;38842:115::o;39445:344::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;39623:6:::1;:16:::0;;::::1;39755:26:::0;;::::1;-1:-1:-1::0;;;39755:26:0::1;-1:-1:-1::0;;;;39728:16:0;;::::1;-1:-1:-1::0;;;39728:16:0::1;-1:-1:-1::0;;;;39689:28:0;;::::1;::::0;::::1;39728:16:::0;;;;-1:-1:-1;;39650:28:0;;::::1;-1:-1:-1::0;;;39650:28:0::1;-1:-1:-1::0;;39650:28:0;;;39623:16;;;::::1;39650:28:::0;;;;::::1;39728:16:::0;;;;;;;;;;;::::1;39755:26:::0;;;::::1;::::0;;;::::1;::::0;;39445:344::o;36845:385::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;36952:42:::1;-1:-1:-1::0;;;;;36941:53:0;::::1;;;36919:137;;;::::0;-1:-1:-1;;;36919:137:0;;6315:2:1;36919:137:0::1;::::0;::::1;6297:21:1::0;6354:2;6334:18;;;6327:30;6393:34;6373:18;;;6366:62;-1:-1:-1;;;6444:18:1;;;6437:32;6486:19;;36919:137:0::1;6113:398:1::0;36919:137:0::1;-1:-1:-1::0;;;;;37076:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;37075:27;37067:70;;;::::0;-1:-1:-1;;;37067:70:0;;6718:2:1;37067:70:0::1;::::0;::::1;6700:21:1::0;6757:2;6737:18;;;6730:30;6796:32;6776:18;;;6769:60;6846:18;;37067:70:0::1;6516:354:1::0;37067:70:0::1;-1:-1:-1::0;;;;;37148:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;37148:33:0::1;37177:4;37148:33:::0;;::::1;::::0;;;37192:16:::1;:30:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37192:30:0::1;::::0;;::::1;::::0;;36845:385::o;33514:446::-;33646:4;33663:36;33673:6;33681:9;33692:6;33663:9;:36::i;:::-;33710:220;33733:6;8421:10;33781:138;33837:6;33781:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33781:19:0;;;;;;:11;:19;;;;;;;;8421:10;33781:33;;;;;;;;;;:37;:138::i;:::-;33710:8;:220::i;:::-;-1:-1:-1;33948:4:0;33514:446;;;;;:::o;36515:322::-;36609:7;36667;;36656;:18;;36634:110;;;;-1:-1:-1;;;36634:110:0;;7077:2:1;36634:110:0;;;7059:21:1;7116:2;7096:18;;;7089:30;7155:34;7135:18;;;7128:62;-1:-1:-1;;;7206:18:1;;;7199:40;7256:19;;36634:110:0;6875:406:1;36634:110:0;36755:19;36777:10;:8;:10::i;:::-;36755:32;-1:-1:-1;36805:24:0;:7;36755:32;36805:11;:24::i;:::-;36798:31;36515:322;-1:-1:-1;;;36515:322:0:o;38124:473::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38204:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;38196:56;;;::::0;-1:-1:-1;;;38196:56:0;;7488:2:1;38196:56:0::1;::::0;::::1;7470:21:1::0;7527:2;7507:18;;;7500:30;7566:25;7546:18;;;7539:53;7609:18;;38196:56:0::1;7286:347:1::0;38196:56:0::1;38268:9;38263:327;38287:9;:16:::0;38283:20;::::1;38263:327;;;38345:7;-1:-1:-1::0;;;;;38329:23:0::1;:9;38339:1;38329:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38329:12:0::1;:23;38325:254;;;38388:9;38398:16:::0;;:20:::1;::::0;38417:1:::1;::::0;38398:20:::1;:::i;:::-;38388:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;38373:9:::1;:12:::0;;-1:-1:-1;;;;;38388:31:0;;::::1;::::0;38383:1;;38373:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;38373:46:0::1;-1:-1:-1::0;;;;;38373:46:0;;::::1;;::::0;;38438:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;38477:11:::1;:20:::0;;;;:28;;-1:-1:-1;;38477:28:0::1;::::0;;38524:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;38524:15:0;;;;;-1:-1:-1;;;;;;38524:15:0::1;::::0;;;;;38263:327:::1;38124:473:::0;:::o;38325:254::-:1;38305:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38263:327;;;;38124:473:::0;:::o;33968:300::-;8421:10;34083:4;34177:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34177:34:0;;;;;;;;;;34083:4;;34105:133;;34155:7;;34177:50;;34216:10;34177:38;:50::i;35014:739::-;8421:10;35066:14;35129:19;;;:11;:19;;;;;;;;35128:20;35106:114;;;;-1:-1:-1;;;35106:114:0;;8506:2:1;35106:114:0;;;8488:21:1;8545:2;8525:18;;;8518:30;8584:34;8564:18;;;8557:62;-1:-1:-1;;;8635:18:1;;;8628:42;8687:19;;35106:114:0;8304:408:1;35106:114:0;35263:12;35290:18;35323:15;35353:17;35384:20;35396:7;35384:11;:20::i;:::-;35233:171;;;;;;;;;35416:15;35439:159;35465:7;35487:4;35506:10;35531:7;35553:9;35577:10;:8;:10::i;:::-;35439:11;:159::i;:::-;-1:-1:-1;;;;;;;35629:15:0;;;;;;:7;:15;;;;;;35415:183;;-1:-1:-1;35629:28:0;;35415:183;35629:19;:28::i;:::-;-1:-1:-1;;;;;35611:15:0;;;;;;:7;:15;;;;;:46;35678:7;;:20;;35690:7;35678:11;:20::i;:::-;35668:7;:30;35722:10;;:23;;35737:7;35722:14;:23::i;:::-;35709:10;:36;-1:-1:-1;;;;;;;35014:739:0:o;38605:111::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38674:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;38674:34:0::1;38704:4;38674:34;::::0;;38605:111::o;35761:746::-;35879:7;35923;;35912;:18;;35904:62;;;;-1:-1:-1;;;35904:62:0;;8919:2:1;35904:62:0;;;8901:21:1;8958:2;8938:18;;;8931:30;8997:33;8977:18;;;8970:61;9048:18;;35904:62:0;8717:355:1;35904:62:0;36009:12;36036:18;36069:15;36099:17;36130:20;36142:7;36130:11;:20::i;:::-;35979:171;;;;;;;;;36162:15;36179:23;36208:159;36234:7;36256:4;36275:10;36300:7;36322:9;36346:10;:8;:10::i;36208:159::-;36161:206;;;;;36385:17;36380:120;;-1:-1:-1;36426:7:0;-1:-1:-1;36419:14:0;;-1:-1:-1;;;;36419:14:0;36380:120;36473:15;-1:-1:-1;36466:22:0;;-1:-1:-1;;;;;36466:22:0;39087:350;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;39266:7:::1;:17:::0;;::::1;39402:27:::0;;::::1;-1:-1:-1::0;;;39402:27:0::1;-1:-1:-1::0;;;;39374:17:0;;::::1;-1:-1:-1::0;;;39374:17:0::1;-1:-1:-1::0;;;;39334:29:0;;::::1;::::0;::::1;39374:17:::0;;;;-1:-1:-1;;39294:29:0;;::::1;-1:-1:-1::0;;;39294:29:0::1;-1:-1:-1::0;;39294:29:0;;;39266:17;;;::::1;39294:29:::0;;;;::::1;39374:17:::0;;;;;;;;;;;::::1;39402:27:::0;;;::::1;::::0;;;::::1;::::0;;39087:350::o;37784:332::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37865:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37864:21;37856:61;;;::::0;-1:-1:-1;;;37856:61:0;;9279:2:1;37856:61:0::1;::::0;::::1;9261:21:1::0;9318:2;9298:18;;;9291:30;9357:29;9337:18;;;9330:57;9404:18;;37856:61:0::1;9077:351:1::0;37856:61:0::1;-1:-1:-1::0;;;;;37932:16:0;::::1;37951:1;37932:16:::0;;;:7:::1;:16;::::0;;;;;:20;37928:109:::1;;-1:-1:-1::0;;;;;38008:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;37988:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;37969:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;37928:109:::1;-1:-1:-1::0;;;;;38047:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;38047:27:0::1;38070:4;38047:27:::0;;::::1;::::0;;;38085:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;38085:23:0::1;::::0;;::::1;::::0;;37784:332::o;32708:198::-;-1:-1:-1;;;;;32798:20:0;;32774:7;32798:20;;;:11;:20;;;;;;;;32794:49;;;-1:-1:-1;;;;;;32827:16:0;;;;;:7;:16;;;;;;;32708:198::o;32794:49::-;-1:-1:-1;;;;;32881:16:0;;;;;;:7;:16;;;;;;32861:37;;:19;:37::i;17009:148::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;17116:1:::1;17100:6:::0;;17079:40:::1;::::0;-1:-1:-1;;;;;17100:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;17079:40:0;17116:1;;17079:40:::1;17147:1;17130:19:::0;;-1:-1:-1;;;;;;17130:19:0::1;::::0;;17009:148::o;38965:114::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39034:29:0::1;39066:5;39034:29:::0;;;:20:::1;:29;::::0;;;;:37;;-1:-1:-1;;39034:37:0::1;::::0;;38965:114::o;32419:87::-;32458:13;32491:7;32484:14;;;;;:::i;34276:400::-;34396:4;34418:228;8421:10;34468:7;34490:145;34547:15;34490:145;;;;;;;;;;;;;;;;;8421:10;34490:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34490:34:0;;;;;;;;;;;;:38;:145::i;18064:341::-;18130:14;;-1:-1:-1;;;;;18130:14:0;18148:10;18130:28;18108:113;;;;-1:-1:-1;;;18108:113:0;;9635:2:1;18108:113:0;;;9617:21:1;9674:2;9654:18;;;9647:30;9713:34;9693:18;;;9686:62;-1:-1:-1;;;9764:18:1;;;9757:33;9807:19;;18108:113:0;9433:399:1;18108:113:0;18258:9;;18240:15;:27;18232:71;;;;-1:-1:-1;;;18232:71:0;;10039:2:1;18232:71:0;;;10021:21:1;10078:2;10058:18;;;10051:30;10117:33;10097:18;;;10090:61;10168:18;;18232:71:0;9837:355:1;18232:71:0;18348:14;;;18340:6;;18319:44;;-1:-1:-1;;;;;18348:14:0;;;;18340:6;;;;-1:-1:-1;;;;;;;;;;;18319:44:0;;18383:14;;;18374:23;;-1:-1:-1;;;;;;18374:23:0;-1:-1:-1;;;;;18383:14:0;;;18374:23;;;;;;18064:341::o;32914:199::-;33019:4;33041:42;8421:10;33065:9;33076:6;33041:9;:42::i;39941:172::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;40068:37:::1;40099:5;40068:26;40080:13;40068:7;;:11;;:26;;;;:::i;:::-;:30:::0;::::1;:37::i;:::-;40051:14;:54:::0;-1:-1:-1;39941:172:0:o;37238:538::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37325:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;37317:65;;;::::0;-1:-1:-1;;;37317:65:0;;10399:2:1;37317:65:0::1;::::0;::::1;10381:21:1::0;10438:2;10418:18;;;10411:30;10477:28;10457:18;;;10450:56;10523:18;;37317:65:0::1;10197:350:1::0;37317:65:0::1;37398:9;37393:376;37417:16;:23:::0;37413:27;::::1;37393:376;;;37489:7;-1:-1:-1::0;;;;;37466:30:0::1;:16;37483:1;37466:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37466:19:0::1;:30;37462:296;;;37539:16;37578:23:::0;;:27:::1;::::0;37604:1:::1;::::0;37578:27:::1;:::i;:::-;37539:85;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;37517:16:::1;:19:::0;;-1:-1:-1;;;;;37539:85:0;;::::1;::::0;37534:1;;37517:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:107:::0;;-1:-1:-1;;;;;;37517:107:0::1;-1:-1:-1::0;;;;;37517:107:0;;::::1;;::::0;;37643:26;;::::1;::::0;;:17:::1;:26:::0;;;;;;:34;;-1:-1:-1;;37643:34:0::1;::::0;;37696:16:::1;:22:::0;;;::::1;;;;:::i;37462:296::-;37442:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37393:376;;40121:171:::0;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;40198:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;40198:32:0::1;-1:-1:-1::0;;;;40198:32:0;;::::1;;::::0;;40246:38:::1;::::0;::::1;::::0;::::1;::::0;40222:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;40246:38:0::1;;;;;;;;40121:171:::0;:::o;39797:136::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;39889:36:::1;39919:5;39889:25;39901:12;39889:7;;:11;;:25;;;;:::i;:36::-;39874:12;:51:::0;-1:-1:-1;39797:136:0:o;17766:226::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;17847:6:::1;::::0;;;17830:23;;-1:-1:-1;;;;;;17830:23:0;;::::1;-1:-1:-1::0;;;;;17847:6:0;::::1;17830:23;::::0;;;17864:19:::1;::::0;;17906:22:::1;17924:4:::0;17906:15:::1;:22;:::i;:::-;17894:9;:34:::0;17981:1:::1;17965:6:::0;;17944:40:::1;::::0;-1:-1:-1;;;;;17965:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;17944:40:0;17981:1;;17944:40:::1;17766:226:::0;:::o;38724:110::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38791:27:0::1;38821:5;38791:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;38791:35:0::1;::::0;;38724:110::o;17312:281::-;16579:6;;-1:-1:-1;;;;;16579:6:0;8421:10;16579:22;16571:67;;;;-1:-1:-1;;;16571:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17415:22:0;::::1;17393:110;;;::::0;-1:-1:-1;;;17393:110:0;;10887:2:1;17393:110:0::1;::::0;::::1;10869:21:1::0;10926:2;10906:18;;;10899:30;10965:34;10945:18;;;10938:62;-1:-1:-1;;;11016:18:1;;;11009:36;11062:19;;17393:110:0::1;10685:402:1::0;17393:110:0::1;17540:6;::::0;;17519:38:::1;::::0;-1:-1:-1;;;;;17519:38:0;;::::1;::::0;17540:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;17519:38:0;::::1;17568:6;:17:::0;;-1:-1:-1;;;;;;17568:17:0::1;-1:-1:-1::0;;;;;17568:17:0;;;::::1;::::0;;;::::1;::::0;;17312:281::o;45754:371::-;-1:-1:-1;;;;;45881:19:0;;45873:68;;;;-1:-1:-1;;;45873:68:0;;11294:2:1;45873:68:0;;;11276:21:1;11333:2;11313:18;;;11306:30;11372:34;11352:18;;;11345:62;-1:-1:-1;;;11423:18:1;;;11416:34;11467:19;;45873:68:0;11092:400:1;45873:68:0;-1:-1:-1;;;;;45960:21:0;;45952:68;;;;-1:-1:-1;;;45952:68:0;;11699:2:1;45952:68:0;;;11681:21:1;11738:2;11718:18;;;11711:30;11777:34;11757:18;;;11750:62;-1:-1:-1;;;11828:18:1;;;11821:32;11870:19;;45952:68:0;11497:398:1;45952:68:0;-1:-1:-1;;;;;46033:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;46085:32;;1662:25:1;;;46085:32:0;;1635:18:1;46085:32:0;;;;;;;45754:371;;;:::o;46133:2371::-;-1:-1:-1;;;;;46255:18:0;;46247:68;;;;-1:-1:-1;;;46247:68:0;;12102:2:1;46247:68:0;;;12084:21:1;12141:2;12121:18;;;12114:30;12180:34;12160:18;;;12153:62;-1:-1:-1;;;12231:18:1;;;12224:35;12276:19;;46247:68:0;11900:401:1;46247:68:0;-1:-1:-1;;;;;46334:16:0;;46326:64;;;;-1:-1:-1;;;46326:64:0;;12508:2:1;46326:64:0;;;12490:21:1;12547:2;12527:18;;;12520:30;12586:34;12566:18;;;12559:62;-1:-1:-1;;;12637:18:1;;;12630:33;12680:19;;46326:64:0;12306:399:1;46326:64:0;46418:1;46409:6;:10;46401:64;;;;-1:-1:-1;;;46401:64:0;;12912:2:1;46401:64:0;;;12894:21:1;12951:2;12931:18;;;12924:30;12990:34;12970:18;;;12963:62;-1:-1:-1;;;13041:18:1;;;13034:39;13090:19;;46401:64:0;12710:405:1;46401:64:0;-1:-1:-1;;;;;46485:23:0;;;;;;:17;:23;;;;;;;;46484:24;46476:56;;;;-1:-1:-1;;;46476:56:0;;13322:2:1;46476:56:0;;;13304:21:1;13361:2;13341:18;;;13334:30;-1:-1:-1;;;13380:18:1;;;13373:49;13439:18;;46476:56:0;13120:343:1;46476:56:0;46570:10;46552:29;;;;:17;:29;;;;;;;;46551:30;46543:54;;;;-1:-1:-1;;;46543:54:0;;13670:2:1;46543:54:0;;;13652:21:1;13709:2;13689:18;;;13682:30;-1:-1:-1;;;13728:18:1;;;13721:41;13779:18;;46543:54:0;13468:335:1;46543:54:0;46635:9;46617:28;;;;:17;:28;;;;;;;;46616:29;46608:53;;;;-1:-1:-1;;;46608:53:0;;13670:2:1;46608:53:0;;;13652:21:1;13709:2;13689:18;;;13682:30;-1:-1:-1;;;13728:18:1;;;13721:41;13779:18;;46608:53:0;13468:335:1;46608:53:0;46956:28;46987:24;47005:4;46987:9;:24::i;:::-;46956:55;;47052:12;;47028:20;:36;47024:104;;-1:-1:-1;47104:12:0;;47024:104;47204:29;;47167:66;;;;;;;47262:53;;-1:-1:-1;47299:16:0;;-1:-1:-1;;;47299:16:0;;;;47298:17;47262:53;:91;;;;;47340:13;-1:-1:-1;;;;;47332:21:0;:4;-1:-1:-1;;;;;47332:21:0;;;47262:91;:129;;;;-1:-1:-1;47370:21:0;;-1:-1:-1;;;47370:21:0;;;;47262:129;47244:318;;;47441:29;;47418:52;;47514:36;47529:20;47514:14;:36::i;:::-;-1:-1:-1;;;;;47755:24:0;;47635:12;47755:24;;;:18;:24;;;;;;47650:4;;47755:24;;;:50;;-1:-1:-1;;;;;;47783:22:0;;;;;;:18;:22;;;;;;;;47755:50;47751:98;;;-1:-1:-1;47832:5:0;47751:98;47863:7;47859:518;;;-1:-1:-1;;;;;47892:26:0;;;;;;:20;:26;;;;;;;;47891:27;:56;;;;-1:-1:-1;;;;;;47923:24:0;;;;;;:20;:24;;;;;;;;47922:25;47891:56;47887:479;;;48008:12;;47998:6;:22;;47968:136;;;;-1:-1:-1;;;47968:136:0;;14010:2:1;47968:136:0;;;13992:21:1;14049:2;14029:18;;;14022:30;14088:34;14068:18;;;14061:62;-1:-1:-1;;;14139:18:1;;;14132:38;14187:19;;47968:136:0;13808:404:1;47968:136:0;48133:13;-1:-1:-1;;;;;48127:19:0;:2;-1:-1:-1;;;;;48127:19:0;;48123:228;;48231:14;;48214:13;48224:2;48214:9;:13::i;:::-;48205:22;;:6;:22;:::i;:::-;:40;;48171:160;;;;-1:-1:-1;;;48171:160:0;;14419:2:1;48171:160:0;;;14401:21:1;14458:2;14438:18;;;14431:30;14497:34;14477:18;;;14470:62;-1:-1:-1;;;14548:18:1;;;14541:32;14590:19;;48171:160:0;14217:398:1;48171:160:0;48455:41;48470:4;48476:2;48480:6;48488:7;48455:14;:41::i;:::-;46236:2268;;;46133:2371;;;:::o;4633:226::-;4753:7;4789:12;4781:6;;;;4773:29;;;;-1:-1:-1;;;4773:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4813:9:0;4825:5;4829:1;4825;:5;:::i;:::-;4813:17;4633:226;-1:-1:-1;;;;;4633:226:0:o;42120:164::-;42162:7;42183:15;42200;42219:19;:17;:19::i;:::-;42182:56;;-1:-1:-1;42182:56:0;-1:-1:-1;42256:20:0;42182:56;;42256:11;:20::i;:::-;42249:27;;;;42120:164;:::o;6065:132::-;6123:7;6150:39;6154:1;6157;6150:39;;;;;;;;;;;;;;;;;:3;:39::i;3730:181::-;3788:7;;3820:5;3824:1;3820;:5;:::i;:::-;3808:17;;3849:1;3844;:6;;3836:46;;;;-1:-1:-1;;;3836:46:0;;14822:2:1;3836:46:0;;;14804:21:1;14861:2;14841:18;;;14834:30;14900:29;14880:18;;;14873:57;14947:18;;3836:46:0;14620:351:1;40549:753:0;40650:7;40672;40694;40716;40738;40773:12;40788:24;40804:7;40788:15;:24::i;:::-;40773:39;;40823:18;40844:30;40866:7;40844:21;:30::i;:::-;40823:51;;40885:15;40949:24;40965:7;40949:15;:24::i;:::-;40903:30;40925:7;40903:21;:30::i;:::-;:70;;;;:::i;:::-;40885:88;;40984:17;41004:29;41025:7;41004:20;:29::i;:::-;40984:49;-1:-1:-1;41044:23:0;41070:33;41092:10;41070:17;:7;41082:4;41070:11;:17::i;:::-;:21;;:33::i;:::-;41044:59;-1:-1:-1;41132:28:0;41044:59;41152:7;41132:19;:28::i;:::-;41114:46;-1:-1:-1;41189:30:0;41114:46;41209:9;41189:19;:30::i;:::-;41171:48;41257:4;;-1:-1:-1;41263:10:0;;-1:-1:-1;41275:7:0;;-1:-1:-1;41263:10:0;-1:-1:-1;40549:753:0;;-1:-1:-1;;;40549:753:0:o;41310:802::-;41563:7;;;;41660:24;:7;41672:11;41660;:24::i;:::-;41642:42;-1:-1:-1;41695:12:0;41710:21;:4;41719:11;41710:8;:21::i;:::-;41695:36;-1:-1:-1;41742:18:0;41763:27;:10;41778:11;41763:14;:27::i;:::-;41742:48;-1:-1:-1;41801:15:0;41819:24;:7;41831:11;41819;:24::i;:::-;41801:42;-1:-1:-1;41854:17:0;41874:26;:9;41888:11;41874:13;:26::i;:::-;41854:46;-1:-1:-1;41911:23:0;41937:117;41854:46;41937:88;42017:7;41937:88;41987:10;41937:88;:7;41963:4;41937:25;:31::i;:117::-;42073:7;;;;-1:-1:-1;42099:4:0;;-1:-1:-1;41310:802:0;;-1:-1:-1;;;;;;;;;;;41310:802:0:o;4194:136::-;4252:7;4279:43;4283:1;4286;4279:43;;;;;;;;;;;;;;;;;:3;:43::i;5118:471::-;5176:7;5421:6;5417:47;;-1:-1:-1;5451:1:0;5444:8;;5417:47;5476:9;5488:5;5492:1;5488;:5;:::i;:::-;5476:17;-1:-1:-1;5521:1:0;5512:5;5516:1;5476:17;5512:5;:::i;:::-;:10;5504:56;;;;-1:-1:-1;;;5504:56:0;;15573:2:1;5504:56:0;;;15555:21:1;15612:2;15592:18;;;15585:30;15651:34;15631:18;;;15624:62;-1:-1:-1;;;15702:18:1;;;15695:31;15743:19;;5504:56:0;15371:397:1;48512:1623:0;30421:16;:23;;-1:-1:-1;;;;30421:23:0;-1:-1:-1;;;30421:23:0;;;48813:7:::1;:11:::0;48787:6:::1;:10:::0;30421:23;;48813:11:::1;-1:-1:-1::0;;;48813:11:0;;::::1;::::0;::::1;::::0;48787:10;;::::1;::::0;::::1;::::0;-1:-1:-1;;;48754:17:0;;::::1;::::0;::::1;::::0;48722:16;;::::1;::::0;::::1;::::0;48657:49:::1;::::0;48689:17;;;;::::1;::::0;::::1;::::0;48657:16;::::1;;:49;:::i;:::-;:81;;;;:::i;:::-;:114;;;;:::i;:::-;:140;;;;:::i;:::-;:167;;;;:::i;:::-;48656:173;::::0;48828:1:::1;48656:173;:::i;:::-;48918:7;:17:::0;48899:6:::1;:16:::0;48634:195:::1;::::0;;::::1;::::0;-1:-1:-1;48840:32:0::1;::::0;48634:195;;48899:36:::1;::::0;48918:17;;;;::::1;::::0;::::1;::::0;48899:16;;::::1;;:36;:::i;:::-;48876:60;::::0;::::1;;:6:::0;:60:::1;:::i;:::-;48875:76;;;;:::i;:::-;48840:111:::0;-1:-1:-1;48962:14:0::1;48979:33;48840:111:::0;48979:6;:33:::1;:::i;:::-;48962:50:::0;-1:-1:-1;49050:21:0::1;49084:24;48962:50:::0;49084:16:::1;:24::i;:::-;49121:20;49144:38;49168:14:::0;49144:21:::1;:38;:::i;:::-;49278:7;:17:::0;49259:6:::1;:16:::0;49121:61;;-1:-1:-1;49193:19:0::1;::::0;49259:36:::1;::::0;49278:17:::1;::::0;;;;::::1;::::0;::::1;::::0;49259:16;;;::::1;;:36;:::i;:::-;49244:52;::::0;::::1;;:11:::0;:52:::1;:::i;:::-;49215:82;::::0;:12;:82:::1;:::i;:::-;49387:7;:17:::0;49368:6:::1;:16:::0;49193:104;;-1:-1:-1;49308:29:0::1;::::0;49368:36:::1;::::0;49387:17:::1;::::0;;;;::::1;::::0;::::1;::::0;49368:16;;;::::1;;:36;:::i;:::-;49340:65;::::0;::::1;;:11:::0;:65:::1;:::i;:::-;49308:97:::0;-1:-1:-1;49422:25:0;;49418:160:::1;;49505:61;49518:24;49544:21;49505:12;:61::i;:::-;49711:7;:17:::0;49692:6:::1;:16:::0;49624:20:::1;::::0;49692:36:::1;::::0;49711:17:::1;-1:-1:-1::0;;;49711:17:0;;;::::1;::::0;::::1;::::0;49692:16;;::::1;;:36;:::i;:::-;49647:82;;:28;:11:::0;49674:1:::1;49647:28;:::i;:::-;:82;;;;:::i;:::-;49789:7;:11:::0;49776:6:::1;:10:::0;49624:105;;-1:-1:-1;49740:14:0::1;::::0;49817:21:::1;::::0;49776:24:::1;::::0;49789:11:::1;-1:-1:-1::0;;;49789:11:0;;;::::1;::::0;::::1;::::0;49776:10;;::::1;;:24;:::i;:::-;49757:44;;:15;:11:::0;49771:1:::1;49757:15;:::i;:::-;:44;;;;:::i;:::-;:81;:178;;49923:7;:11:::0;49910:6:::1;:10:::0;:24:::1;::::0;49923:11:::1;-1:-1:-1::0;;;49923:11:0;;;::::1;::::0;::::1;::::0;49910:10;;;::::1;;:24;:::i;:::-;49891:44;;:15;:11:::0;49905:1:::1;49891:15;:::i;:::-;:44;;;;:::i;:::-;49757:178;;;49854:21;49757:178;49740:195:::0;-1:-1:-1;49952:16:0;;49948:98:::1;;49993:17;::::0;49985:49:::1;::::0;-1:-1:-1;;;;;49993:17:0;;::::1;::::0;49985:49;::::1;;;::::0;50021:12;;49993:17:::1;49985:49:::0;49993:17;49985:49;50021:12;49993:17;49985:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49948:98;50062:10:::0;;50058:70:::1;;50089:10;::::0;:27:::1;::::0;-1:-1:-1;;;;;50089:10:0;;::::1;::::0;:27;::::1;;;::::0;50109:6;;50089:10:::1;:27:::0;:10;:27;50109:6;50089:10;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50058:70;-1:-1:-1::0;;30467:16:0;:24;;-1:-1:-1;;;;30467:24:0;;;-1:-1:-1;;;;;;;;48512:1623:0:o;51340:999::-;51495:7;51491:232;;;51519:14;44886:7;:11;;-1:-1:-1;;44991:11:0;;;44843:167;51519:14;51564:13;-1:-1:-1;;;;;51554:23:0;:6;-1:-1:-1;;;;;51554:23:0;;51550:72;;;45065:6;:10;45055:7;:20;;45065:10;;;;-1:-1:-1;;45086:32:0;;;;;;;45102:16;;;;;;45086:32;;-1:-1:-1;;45172:30:0;-1:-1:-1;;;45145:16:0;;;;;45129:32;-1:-1:-1;;;;45172:30:0;;-1:-1:-1;;;45187:15:0;;;;;45172:30;;-1:-1:-1;;;;45213:20:0;-1:-1:-1;;;45223:10:0;;;;;;;;45213:20;;;;;;;;;51598:8;51653:13;-1:-1:-1;;;;;51640:26:0;:9;-1:-1:-1;;;;;51640:26:0;;51636:76;;;45297:7;:11;45287:7;:21;;45297:11;;;;-1:-1:-1;;45319:33:0;;;;;;;45335:17;;;;;;45319:33;;-1:-1:-1;;45407:31:0;-1:-1:-1;;;45379:17:0;;;;;45363:33;-1:-1:-1;;;;45407:31:0;;-1:-1:-1;;;45422:16:0;;;;;45407:31;;-1:-1:-1;;;;45449:21:0;-1:-1:-1;;;45459:11:0;;;;;;;;45449:21;;;;;;;;;51687:9;-1:-1:-1;;;;;51739:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;51763:22:0;;;;;;:11;:22;;;;;;;;51762:23;51739:46;51735:597;;;51802:48;51824:6;51832:9;51843:6;51802:21;:48::i;:::-;51735:597;;;-1:-1:-1;;;;;51873:19:0;;;;;;:11;:19;;;;;;;;51872:20;:46;;;;-1:-1:-1;;;;;;51896:22:0;;;;;;:11;:22;;;;;;;;51872:46;51868:464;;;51935:46;51955:6;51963:9;51974:6;51935:19;:46::i;51868:464::-;-1:-1:-1;;;;;52004:19:0;;;;;;:11;:19;;;;;;;;52003:20;:47;;;;-1:-1:-1;;;;;;52028:22:0;;;;;;:11;:22;;;;;;;;52027:23;52003:47;51999:333;;;52067:44;52085:6;52093:9;52104:6;52067:17;:44::i;51999:333::-;-1:-1:-1;;;;;52133:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;52156:22:0;;;;;;:11;:22;;;;;;;;52133:45;52129:203;;;52195:48;52217:6;52225:9;52236:6;52195:21;:48::i;52129:203::-;52276:44;52294:6;52302:9;52313:6;52276:17;:44::i;:::-;51340:999;;;;:::o;42292:605::-;42390:7;;42426;;42343;;;;;42444:338;42468:9;:16;42464:20;;42444:338;;;42552:7;42528;:21;42536:9;42546:1;42536:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42536:12:0;42528:21;;;;;;;;;;;;;:31;;:83;;;42604:7;42580;:21;42588:9;42598:1;42588:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42588:12:0;42580:21;;;;;;;;;;;;;:31;42528:83;42506:146;;;42635:7;;42644;;42627:25;;;;;;;42292:605;;:::o;42506:146::-;42677:34;42689:7;:21;42697:9;42707:1;42697:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42697:12:0;42689:21;;;;;;;;;;;;;42677:7;;:11;:34::i;:::-;42667:44;;42736:34;42748:7;:21;42756:9;42766:1;42756:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42756:12:0;42748:21;;;;;;;;;;;;;42736:7;;:11;:34::i;:::-;42726:44;-1:-1:-1;42486:3:0;;;;:::i;:::-;;;;42444:338;;;-1:-1:-1;42818:7:0;;42806;;:20;;:11;:20::i;:::-;42796:7;:30;42792:61;;;42836:7;;42845;;42828:25;;;;;;42292:605;;:::o;42792:61::-;42872:7;;42881;;-1:-1:-1;42292:605:0;-1:-1:-1;42292:605:0:o;6693:312::-;6813:7;6848:12;6841:5;6833:28;;;;-1:-1:-1;;;6833:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6872:9:0;6884:5;6888:1;6884;:5;:::i;44023:130::-;44126:7;;44087;;44114:31;;44139:5;;44114:20;;:7;;44126;;44114:11;:20::i;44161:174::-;44302:13;;44258:7;;44290:37;;44321:5;;44290:26;;:7;;44302:13;;;;;44290:11;:26::i;44705:130::-;44808:7;;44769;;44796:31;;44821:5;;44796:20;;:7;;-1:-1:-1;;;44808:7:0;;;;44796:11;:20::i;44343:174::-;44484:13;;44440:7;;44472:37;;44503:5;;44472:26;;:7;;-1:-1:-1;;;44484:13:0;;;;44472:11;:26::i;44525:172::-;44665:12;;44621:7;;44653:36;;44683:5;;44653:25;;:7;;-1:-1:-1;;;44665:12:0;;;;44653:11;:25::i;50143:589::-;50293:16;;;50307:1;50293:16;;;;;;;;50269:21;;50293:16;;;;;;;;;;-1:-1:-1;50293:16:0;50269:40;;50338:4;50320;50325:1;50320:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50320:23:0;;;-1:-1:-1;;;;;50320:23:0;;;;;50364:15;-1:-1:-1;;;;;50364:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50354:4;50359:1;50354:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;50354:32:0;;;-1:-1:-1;;;;;50354:32:0;;;;;50399:62;50416:4;50431:15;50449:11;50399:8;:62::i;:::-;50500:224;;-1:-1:-1;;;50500:224:0;;-1:-1:-1;;;;;50500:15:0;:66;;;;:224;;50581:11;;50607:1;;50651:4;;50678;;50698:15;;50500:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50740:519;50888:62;50905:4;50920:15;50938:11;50888:8;:62::i;:::-;50993:258;;-1:-1:-1;;;50993:258:0;;51065:4;50993:258;;;17979:34:1;;;18029:18;;;18022:34;;;51111:1:0;18072:18:1;;;18065:34;;;18115:18;;;18108:34;18158:19;;;18151:44;51225:15:0;18211:19:1;;;18204:35;50993:15:0;-1:-1:-1;;;;;50993:31:0;;;;51032:9;;17913:19:1;;50993:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50740:519;;:::o;54228:957::-;54379:23;54417:12;54444:18;54477:15;54507:17;54538:20;54550:7;54538:11;:20::i;:::-;54364:194;;;;;;;;;;54570:15;54587:23;54612:12;54628:159;54654:7;54676:4;54695:10;54720:7;54742:9;54766:10;:8;:10::i;54628:159::-;-1:-1:-1;;;;;54818:15:0;;;;;;:7;:15;;;;;;54569:218;;-1:-1:-1;54569:218:0;;-1:-1:-1;54569:218:0;-1:-1:-1;54818:28:0;;54838:7;54818:19;:28::i;:::-;-1:-1:-1;;;;;54800:15:0;;;;;;:7;:15;;;;;;;;:46;;;;54875:7;:15;;;;:28;;54895:7;54875:19;:28::i;:::-;-1:-1:-1;;;;;54857:15:0;;;;;;;:7;:15;;;;;;:46;;;;54935:18;;;;;;;:39;;54958:15;54935:22;:39::i;:::-;-1:-1:-1;;;;;54914:18:0;;;;;;:7;:18;;;;;:60;54985:26;55000:10;54985:14;:26::i;:::-;55022:23;55037:7;55022:14;:23::i;:::-;55056:27;55073:9;55056:16;:27::i;:::-;55094:23;55106:4;55112;55094:11;:23::i;:::-;55150:9;-1:-1:-1;;;;;55133:44:0;55142:6;-1:-1:-1;;;;;55133:44:0;;55161:15;55133:44;;;;1662:25:1;;1650:2;1635:18;;1516:177;55133:44:0;;;;;;;;54353:832;;;;;;;;54228:957;;;:::o;53251:969::-;53400:23;53438:12;53465:18;53498:15;53528:17;53559:20;53571:7;53559:11;:20::i;:::-;53385:194;;;;;;;;;;53591:15;53608:23;53633:12;53649:159;53675:7;53697:4;53716:10;53741:7;53763:9;53787:10;:8;:10::i;53649:159::-;-1:-1:-1;;;;;53839:15:0;;;;;;:7;:15;;;;;;53590:218;;-1:-1:-1;53590:218:0;;-1:-1:-1;53590:218:0;-1:-1:-1;53839:28:0;;53590:218;53839:19;:28::i;:::-;-1:-1:-1;;;;;53821:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;53899:18;;;;;:7;:18;;;;;:39;;53922:15;53899:22;:39::i;:::-;-1:-1:-1;;;;;53878:18:0;;;;;;:7;:18;;;;;;;;:60;;;;53970:7;:18;;;;:39;;53993:15;53970:22;:39::i;52347:896::-;52494:23;52532:12;52559:18;52592:15;52622:17;52653:20;52665:7;52653:11;:20::i;:::-;52479:194;;;;;;;;;;52685:15;52702:23;52727:12;52743:159;52769:7;52791:4;52810:10;52835:7;52857:9;52881:10;:8;:10::i;52743:159::-;-1:-1:-1;;;;;52933:15:0;;;;;;:7;:15;;;;;;52684:218;;-1:-1:-1;52684:218:0;;-1:-1:-1;52684:218:0;-1:-1:-1;52933:28:0;;52684:218;52933:19;:28::i;55193:1028::-;55344:23;55382:12;55409:18;55442:15;55472:17;55503:20;55515:7;55503:11;:20::i;:::-;55329:194;;;;;;;;;;55535:15;55552:23;55577:12;55593:159;55619:7;55641:4;55660:10;55685:7;55707:9;55731:10;:8;:10::i;55593:159::-;-1:-1:-1;;;;;55783:15:0;;;;;;:7;:15;;;;;;55534:218;;-1:-1:-1;55534:218:0;;-1:-1:-1;55534:218:0;-1:-1:-1;55783:28:0;;55803:7;55783:19;:28::i;:::-;-1:-1:-1;;;;;55765:15:0;;;;;;:7;:15;;;;;;;;:46;;;;55840:7;:15;;;;:28;;55860:7;55840:19;:28::i;42905:355::-;42968:19;42990:10;:8;:10::i;:::-;42968:32;-1:-1:-1;43011:18:0;43032:27;:10;42968:32;43032:14;:27::i;:::-;43111:4;43095:22;;;;:7;:22;;;;;;43011:48;;-1:-1:-1;43095:38:0;;43011:48;43095:26;:38::i;:::-;43086:4;43070:22;;;;:7;:22;;;;;;;;:63;;;;43148:11;:26;;;;;;43144:108;;;43230:4;43214:22;;;;:7;:22;;;;;;:38;;43241:10;43214:26;:38::i;:::-;43205:4;43189:22;;;;:7;:22;;;;;:63;43144:108;42957:303;;42905:355;:::o;43616:399::-;43680:19;43702:10;:8;:10::i;:::-;43680:32;-1:-1:-1;43723:17:0;43743:26;:9;43680:32;43743:13;:26::i;:::-;43816:16;;-1:-1:-1;;;;;43816:16:0;43808:25;;;;:7;:25;;;;;;43723:46;;-1:-1:-1;43808:40:0;;43723:46;43808:29;:40::i;:::-;43788:16;;;-1:-1:-1;;;;;43788:16:0;;;43780:25;;;;:7;:25;;;;;;;;:68;;;;43875:16;;;;;43863:29;;:11;:29;;;;;;;43859:148;;;43943:16;;-1:-1:-1;;;;;43943:16:0;43935:25;;;;:7;:25;;;;;;:72;;43983:9;43935:29;:72::i;:::-;43915:16;;-1:-1:-1;;;;;43915:16:0;43907:25;;;;:7;:25;;;;;:100;43669:346;;43616:399;:::o;40394:147::-;40472:7;;:17;;40484:4;40472:11;:17::i;:::-;40462:7;:27;40513:10;;:20;;40528:4;40513:14;:20::i;:::-;40500:10;:33;-1:-1:-1;;40394:147:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;671:70;616:131;:::o;752:315::-;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:247::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;1431:9;1418:23;1450:31;1475:5;1450:31;:::i;1698:159::-;1765:20;;1825:6;1814:18;;1804:29;;1794:57;;1847:1;1844;1837:12;1794:57;1698:159;;;:::o;1862:474::-;1952:6;1960;1968;1976;1984;2037:3;2025:9;2016:7;2012:23;2008:33;2005:53;;;2054:1;2051;2044:12;2005:53;2077:28;2095:9;2077:28;:::i;:::-;2067:38;;2124:37;2157:2;2146:9;2142:18;2124:37;:::i;:::-;2114:47;;2180:37;2213:2;2202:9;2198:18;2180:37;:::i;:::-;2170:47;;2236:37;2269:2;2258:9;2254:18;2236:37;:::i;:::-;2226:47;;2292:38;2325:3;2314:9;2310:19;2292:38;:::i;:::-;2282:48;;1862:474;;;;;;;;:::o;2800:456::-;2877:6;2885;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:52;;;2962:1;2959;2952:12;2914:52;3001:9;2988:23;3020:31;3045:5;3020:31;:::i;:::-;3070:5;-1:-1:-1;3127:2:1;3112:18;;3099:32;3140:33;3099:32;3140:33;:::i;:::-;2800:456;;3192:7;;-1:-1:-1;;;3246:2:1;3231:18;;;;3218:32;;2800:456::o;3789:180::-;3848:6;3901:2;3889:9;3880:7;3876:23;3872:32;3869:52;;;3917:1;3914;3907:12;3869:52;-1:-1:-1;3940:23:1;;3789:180;-1:-1:-1;3789:180:1:o;4163:160::-;4228:20;;4284:13;;4277:21;4267:32;;4257:60;;4313:1;4310;4303:12;4328:248;4393:6;4401;4454:2;4442:9;4433:7;4429:23;4425:32;4422:52;;;4470:1;4467;4460:12;4422:52;4506:9;4493:23;4483:33;;4535:35;4566:2;4555:9;4551:18;4535:35;:::i;:::-;4525:45;;4328:248;;;;;:::o;4789:180::-;4845:6;4898:2;4886:9;4877:7;4873:23;4869:32;4866:52;;;4914:1;4911;4904:12;4866:52;4937:26;4953:9;4937:26;:::i;4974:388::-;5042:6;5050;5103:2;5091:9;5082:7;5078:23;5074:32;5071:52;;;5119:1;5116;5109:12;5071:52;5158:9;5145:23;5177:31;5202:5;5177:31;:::i;:::-;5227:5;-1:-1:-1;5284:2:1;5269:18;;5256:32;5297:33;5256:32;5297:33;:::i;:::-;5349:7;5339:17;;;4974:388;;;;;:::o;5367:380::-;5446:1;5442:12;;;;5489;;;5510:61;;5564:4;5556:6;5552:17;5542:27;;5510:61;5617:2;5609:6;5606:14;5586:18;5583:38;5580:161;;;5663:10;5658:3;5654:20;5651:1;5644:31;5698:4;5695:1;5688:15;5726:4;5723:1;5716:15;5580:161;;5367:380;;;:::o;5752:356::-;5954:2;5936:21;;;5973:18;;;5966:30;6032:34;6027:2;6012:18;;6005:62;6099:2;6084:18;;5752:356::o;7638:127::-;7699:10;7694:3;7690:20;7687:1;7680:31;7730:4;7727:1;7720:15;7754:4;7751:1;7744:15;7770:127;7831:10;7826:3;7822:20;7819:1;7812:31;7862:4;7859:1;7852:15;7886:4;7883:1;7876:15;7902:125;7942:4;7970:1;7967;7964:8;7961:34;;;7975:18;;:::i;:::-;-1:-1:-1;8012:9:1;;7902:125::o;8032:127::-;8093:10;8088:3;8084:20;8081:1;8074:31;8124:4;8121:1;8114:15;8148:4;8145:1;8138:15;8164:135;8203:3;-1:-1:-1;;8224:17:1;;8221:43;;;8244:18;;:::i;:::-;-1:-1:-1;8291:1:1;8280:13;;8164:135::o;10552:128::-;10592:3;10623:1;10619:6;10616:1;10613:13;10610:39;;;10629:18;;:::i;:::-;-1:-1:-1;10665:9:1;;10552:128::o;14976:168::-;15016:7;15082:1;15078;15074:6;15070:14;15067:1;15064:21;15059:1;15052:9;15045:17;15041:45;15038:71;;;15089:18;;:::i;:::-;-1:-1:-1;15129:9:1;;14976:168::o;15149:217::-;15189:1;15215;15205:132;;15259:10;15254:3;15250:20;15247:1;15240:31;15294:4;15291:1;15284:15;15322:4;15319:1;15312:15;15205:132;-1:-1:-1;15351:9:1;;15149:217::o;15773:224::-;15812:3;15840:6;15873:2;15870:1;15866:10;15903:2;15900:1;15896:10;15934:3;15930:2;15926:12;15921:3;15918:21;15915:47;;;15942:18;;:::i;:::-;15978:13;;15773:224;-1:-1:-1;;;;15773:224:1:o;16002:258::-;16041:7;16073:6;16106:2;16103:1;16099:10;16136:2;16133:1;16129:10;16192:3;16188:2;16184:12;16179:3;16176:21;16169:3;16162:11;16155:19;16151:47;16148:73;;;16201:18;;:::i;:::-;16241:13;;16002:258;-1:-1:-1;;;;16002:258:1:o;16397:251::-;16467:6;16520:2;16508:9;16499:7;16495:23;16491:32;16488:52;;;16536:1;16533;16526:12;16488:52;16568:9;16562:16;16587:31;16612:5;16587:31;:::i;16653:980::-;16915:4;16963:3;16952:9;16948:19;16994:6;16983:9;16976:25;17020:2;17058:6;17053:2;17042:9;17038:18;17031:34;17101:3;17096:2;17085:9;17081:18;17074:31;17125:6;17160;17154:13;17191:6;17183;17176:22;17229:3;17218:9;17214:19;17207:26;;17268:2;17260:6;17256:15;17242:29;;17289:1;17299:195;17313:6;17310:1;17307:13;17299:195;;;17378:13;;-1:-1:-1;;;;;17374:39:1;17362:52;;17469:15;;;;17434:12;;;;17410:1;17328:9;17299:195;;;-1:-1:-1;;;;;;;17550:32:1;;;;17545:2;17530:18;;17523:60;-1:-1:-1;;;17614:3:1;17599:19;17592:35;17511:3;16653:980;-1:-1:-1;;;16653:980:1:o;18250:306::-;18338:6;18346;18354;18407:2;18395:9;18386:7;18382:23;18378:32;18375:52;;;18423:1;18420;18413:12;18375:52;18452:9;18446:16;18436:26;;18502:2;18491:9;18487:18;18481:25;18471:35;;18546:2;18535:9;18531:18;18525:25;18515:35;;18250:306;;;;;:::o

Swarm Source

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