ETH Price: $2,371.05 (-3.43%)

Token

FCHAIN (Floki Chain)
 

Overview

Max Total Supply

100,000,000 Floki Chain

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,225,000 Floki Chain

Value
$0.00
0x9f897fa6ef3b410035d087aa52db9eb4286bc221
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:
FlokiChain

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : Token.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
pragma experimental ABIEncoderV2;
/*
    Telegam: https://t.me/FlokiChainErcToken
    Twitter: https://twitter.com/FlokiChainTeam
             https://x.com/FlokiChainTeam
    

    FLoki Chain, we are a meme building factory that is coming for all chains, all tokens, all things hot and eye catching
    
*/

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

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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
    );
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(
        address owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    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 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 FlokiChain is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    // Private variables
    bool private swapInProgress;


    // Wallets for collected fees
    address public projectWallet;

    // Anti whale strategy
    uint256 public maxTransactionAmount;
    uint256 public maxWalletHoldAmount;

    uint256 public swapTokensAtAmount;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapOfCollectedTradingFeesEnabled = false;

    // All buyers have a chance to go into the raffle
    // once the raffle is drawn the address's get cleared and we start again
    mapping(address => bool) raffleAddresses;
    address[] public addedAddresses;

    // Buy Fees and totals
    uint256 public buyLiqFee;
    uint256 public buyProjectFee;
    uint256 public buyTotalFees;

    // Sell Fees and totals
    uint256 public sellLiqFee;
    uint256 public sellProjectFee;
    uint256 public sellTotalFees;

    // Tokens Amount for fees in a swap.
    uint256 public tokensForLiquidity;
    uint256 public tokensForProject;

    /******************/

    // we will want to exclude some Address from fees and max transaction restrictions
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // Store addresses for automatic market maker pairs. Transfers to these addresses may be
    // subject to a maximum transfer amount.
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);


    event projectWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("FCHAIN", "Floki Chain") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

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


        uint256 _buyLiqFee = 1;   //inital tax is 1% 
        uint256 _buyProjectFee = 1;     //inital tax is 1% 


        uint256 _sellLiqFee = 1; //inital tax is 1% 
        uint256 _sellProjectFee = 1;   //inital tax is 1% 

        // Supply is fixed at 100 million, there is no further minting.
        uint256 totalSupply = 100_000_000 * 1e18;

        // Initially 3% is the most any wallet can hold this is to minimise whale
        // gaining too much control of the token. Limits will be removed shortly after launch

        maxTransactionAmount = 1_500_000 * 1e18; // 1.5% or 1,500,000 tokens max in one tx
        maxWalletHoldAmount = 3_000_000 * 1e18; // 3% or 3,000,000 tokens f
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05%


        
        buyLiqFee = _buyLiqFee;
        buyProjectFee = _buyProjectFee;
        buyTotalFees = buyLiqFee + buyProjectFee;

        sellLiqFee = _sellLiqFee;
        sellProjectFee = _sellProjectFee;

        sellTotalFees = sellLiqFee + sellProjectFee;

        
        projectWallet = address(0xB0b904d5F30E19d6F93BA43DD2F2Ee5a5F13EAB4); // set as project wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        /*
            _mint is an internal function in ERC20 standard we only call it for the intial mint
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    // one way switch, once switched on it can't be switched off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapOfCollectedTradingFeesEnabled = true;
    }

    // remove limits after adoptioin and token matures
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(
        uint256 newAmount
    ) external onlyOwner returns (bool) {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap must be > 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap must be < 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    //update the max transaction amount allows in a single transaction Min is 0.5%
    function updateMaxTransactionAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Must be > 0.5%"
        );
        maxTransactionAmount = newNum * (10 ** 18);
    }

    //update the max wallet amount allowed. Min is 1%
    function updateMaxWalletHoldAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 10) / 1000) / 1e18,
            "Must be > 1.0%"
        );
        maxWalletHoldAmount = newNum * (10 ** 18);
    }

    // some address are exempt, like uniswapV2Pair, router, contract, owner etc
    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // is present in case of emergency and temporary suspension of contract sales is required, a last resort
    function updateSwapOfCollectedTradingFeesEnabled(
        bool enabled
    ) external onlyOwner {
        swapOfCollectedTradingFeesEnabled = enabled;
    }

    // Function to update buy and sell fees
    function updateFees(
        uint256 _buyLiqFee,
        uint256 _buyProjectFee,
        uint256 _sellLiqFee,
        uint256 _sellProjectFee
    ) external onlyOwner {
        
        // Update buy fees
        buyLiqFee = _buyLiqFee;
        buyProjectFee = _buyProjectFee;
        buyTotalFees = buyLiqFee + buyProjectFee;
        require(buyTotalFees <= 2, "Buy fee must be <= 2");
        
        // Update sell fees
        sellLiqFee = _sellLiqFee;
        sellProjectFee = _sellProjectFee;
        sellTotalFees = sellLiqFee + sellProjectFee;
        require(sellTotalFees <= 2, "Sell fee must be <= 2");
        
    }


    // some address are exempt, like uniswapV2Pair, router, contract, owner etc
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(pair != uniswapV2Pair, "Pair removal not permitted");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    // Custom modifier to allow only the owner or the project wallet
    // used only for raffle functions adding address to raffle and clearing them
    modifier onlyOwnerOrProjectWallet() {
        require(msg.sender == owner() || msg.sender == projectWallet, "Caller is not the owner or the project wallet");
        _;
}

    //modify the project wallet address
    function updateProjectWallet(address newWallet) external onlyOwnerOrProjectWallet {
        emit projectWalletUpdated(newWallet, projectWallet);
        projectWallet = newWallet;
    }

    
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    
    function isAddressInRaffle(address account) public view returns (bool) {
        return raffleAddresses[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfering from zero address");
        require(to != address(0), "ERC20: transfering to zero address");
        require(!raffleAddresses[from], "Raffle Entry, Try Again After Raffle");
        require(!raffleAddresses[to], "Raffle Entry, Try Again After Raffle");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapInProgress
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Not Enabled."
                    );
                }

                //handle buy transaction
                if (
                    automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy > Allowed Amount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWalletHoldAmount,
                        "Max amount exceeded"
                    );
                }
                //handle sell transactions
                else if (
                    automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell > Allowed Amount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWalletHoldAmount,
                        "Max amount exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapOfCollectedTradingFeesEnabled &&
            !swapInProgress &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapInProgress = true;
            swapTradingFees();
            swapInProgress = false;
        }

        bool takeFee = !swapInProgress;

        // check fees
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // fee on buy/sell, not on transfer
        if (takeFee) {
            // sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiqFee) / sellTotalFees;
                tokensForProject += (fees * sellProjectFee) / sellTotalFees;
            }
            // buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiqFee) / buyTotalFees;
                tokensForProject += (fees * buyProjectFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees );
              
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, 
            0, 
            owner(),
            block.timestamp
        );
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        //swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, 
            path,
            address(this),
            block.timestamp
        );
    }

    function swapTradingFees() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForProject;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForProject = ethBalance.mul(tokensForProject).div(
            totalTokensToSwap - (tokensForLiquidity / 2)
        );

        uint256 ethForLiquidity = ethBalance - ethForProject;
        tokensForLiquidity = 0;
        tokensForProject = 0;

        (success, ) = address(projectWallet).call{value: ethForProject}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }
    }

    //Project wallet and Owner can run this, contract will be renounced
    //but we need to allow entries into the raffle & clear those entries
    function addRaffleEntries(address[] memory _addrs)  public  {
        for (uint i = 0; i < _addrs.length; i++) {
            address _addr = _addrs[i];
            require(
                _addr != address(uniswapV2Pair) &&
                    _addr !=
                    address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D),
                "Can't add v2 router/pool into the raffle."
            );
            if (raffleAddresses[_addr] == false) {
              addedAddresses.push(_addr); // Store the added address
            }
            raffleAddresses[_addr] = true;
        }
    }

    //Project wallet and Owner can run this, contract will be renounced
    //but we need to allow entries into the raffle & clear those entries
    function addRaffleEntry(address _addr)  public  {
     
            require(
                _addr != address(uniswapV2Pair) &&
                    _addr !=
                    address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D),
                "Can't add v2 router/pool into the raffle."
            );
            if (raffleAddresses[_addr] == false) {
              addedAddresses.push(_addr); // Store the added address
            }
            raffleAddresses[_addr] = true;
     
    }
    
    //Project wallet and Owner can run this, we will renounce the contract
    //but we need to allow entries into the raffle & clear those entries
    function clearRaffleEntries() public onlyOwner {
        for (uint i = 0; i < addedAddresses.length; i++) {
            raffleAddresses[addedAddresses[i]] = false;
        }
        delete addedAddresses; // This will clear the array and free up some gas
    }


    //Project wallet and Owner can run this, we will renounce the contract
    //but we need to allow entries into the raffle & clear those entries
    function clearRaffleEntry(address _addr) public  onlyOwner {
         if (raffleAddresses[_addr] == true) {
              raffleAddresses[_addr] = false;
            }
            
    }




    function withdrawTrappedToken() external onlyOwner {
        uint256 balance = IERC20(address(this)).balanceOf(address(this));
        IERC20(address(this)).transfer(msg.sender, balance);
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawTrappedToken(
        address _token,
        address _to
    ) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(_to, _contractBalance);
    }

    function withdrawTrappedEth(address toAddr) external onlyOwner {
        (bool success, ) = toAddr.call{value: address(this).balance}("");
        require(success, "withdrawTrappedEth failed");
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"projectWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"}],"name":"addRaffleEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addRaffleEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyProjectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearRaffleEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"clearRaffleEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"isAddressInRaffle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletHoldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellProjectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapOfCollectedTradingFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForProject","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyLiqFee","type":"uint256"},{"internalType":"uint256","name":"_buyProjectFee","type":"uint256"},{"internalType":"uint256","name":"_sellLiqFee","type":"uint256"},{"internalType":"uint256","name":"_sellProjectFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletHoldAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateProjectWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapOfCollectedTradingFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawTrappedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawTrappedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTrappedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506000600a60026101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600681526020017f46434841494e00000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f466c6f6b6920436861696e0000000000000000000000000000000000000000008152508160039081620000e0919062000cb3565b508060049081620000f2919062000cb3565b5050506200011562000109620004fa60201b60201c565b6200050260201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905062000141816001620005c860201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e7919062000e04565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000275919062000e04565b6040518363ffffffff1660e01b81526004016200029492919062000e47565b6020604051808303816000875af1158015620002b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002da919062000e04565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200032260a0516001620005c860201b60201c565b6200033760a0516001620006b260201b60201c565b60006001905060006001905060006001905060006001905060006a52b7d2dcc80cd2e400000090506a013da329b63364718000006007819055506a027b46536c66c8e300000060088190555061271060058262000395919062000ea3565b620003a1919062000f1d565b60098190555084600d8190555083600e81905550600e54600d54620003c7919062000f55565b600f819055508260108190555081601181905550601154601054620003ed919062000f55565b60128190555073b0b904d5f30e19d6f93ba43dd2f2ee5a5f13eab4600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200046a6200045c6200075360201b60201c565b60016200077d60201b60201c565b6200047d3060016200077d60201b60201c565b6200049261dead60016200077d60201b60201c565b620004b4620004a66200075360201b60201c565b6001620005c860201b60201c565b620004c7306001620005c860201b60201c565b620004dc61dead6001620005c860201b60201c565b620004ee3382620008b760201b60201c565b505050505050620010ed565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005d8620004fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005fe6200075360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000657576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064e9062000ff1565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200078d620004fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007b36200075360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200080c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008039062000ff1565b60405180910390fd5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620008ab919062001030565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000920906200109d565b60405180910390fd5b6200093d6000838362000a2f60201b60201c565b806002600082825462000951919062000f55565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620009a8919062000f55565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a0f9190620010d0565b60405180910390a362000a2b6000838362000a3460201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000abb57607f821691505b60208210810362000ad15762000ad062000a73565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b3b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000afc565b62000b47868362000afc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b9462000b8e62000b888462000b5f565b62000b69565b62000b5f565b9050919050565b6000819050919050565b62000bb08362000b73565b62000bc862000bbf8262000b9b565b84845462000b09565b825550505050565b600090565b62000bdf62000bd0565b62000bec81848462000ba5565b505050565b5b8181101562000c145762000c0860008262000bd5565b60018101905062000bf2565b5050565b601f82111562000c635762000c2d8162000ad7565b62000c388462000aec565b8101602085101562000c48578190505b62000c6062000c578562000aec565b83018262000bf1565b50505b505050565b600082821c905092915050565b600062000c886000198460080262000c68565b1980831691505092915050565b600062000ca3838362000c75565b9150826002028217905092915050565b62000cbe8262000a39565b67ffffffffffffffff81111562000cda5762000cd962000a44565b5b62000ce6825462000aa2565b62000cf382828562000c18565b600060209050601f83116001811462000d2b576000841562000d16578287015190505b62000d22858262000c95565b86555062000d92565b601f19841662000d3b8662000ad7565b60005b8281101562000d655784890151825560018201915060208501945060208101905062000d3e565b8683101562000d85578489015162000d81601f89168262000c75565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000dcc8262000d9f565b9050919050565b62000dde8162000dbf565b811462000dea57600080fd5b50565b60008151905062000dfe8162000dd3565b92915050565b60006020828403121562000e1d5762000e1c62000d9a565b5b600062000e2d8482850162000ded565b91505092915050565b62000e418162000dbf565b82525050565b600060408201905062000e5e600083018562000e36565b62000e6d602083018462000e36565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000eb08262000b5f565b915062000ebd8362000b5f565b925082820262000ecd8162000b5f565b9150828204841483151762000ee75762000ee662000e74565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000f2a8262000b5f565b915062000f378362000b5f565b92508262000f4a5762000f4962000eee565b5b828204905092915050565b600062000f628262000b5f565b915062000f6f8362000b5f565b925082820190508082111562000f8a5762000f8962000e74565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000fd960208362000f90565b915062000fe68262000fa1565b602082019050919050565b600060208201905081810360008301526200100c8162000fca565b9050919050565b60008115159050919050565b6200102a8162001013565b82525050565b60006020820190506200104760008301846200101f565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001085601f8362000f90565b915062001092826200104d565b602082019050919050565b60006020820190508181036000830152620010b88162001076565b9050919050565b620010ca8162000b5f565b82525050565b6000602082019050620010e76000830184620010bf565b92915050565b60805160a051615d2e6200114b6000396000818161112e0152818161132c01528181611d5501526127c6015260008181610ded015281816140c7015281816141a8015281816141cf0152818161426b01526142920152615d2e6000f3fe6080604052600436106103545760003560e01c80638da5cb5b116101c6578063c0246668116100f7578063dd62ed3e11610095578063e40e2b931161006f578063e40e2b9314610c85578063e7dd050b14610c9c578063e8338a1c14610cc7578063f2fde38b14610cf25761035b565b8063dd62ed3e14610bf4578063e2f4560514610c31578063e339d56014610c5c5761035b565b8063c8c8ebe4116100d1578063c8c8ebe414610b36578063d257b34f14610b61578063d85ba06314610b9e578063d9a018d514610bc95761035b565b8063c024666814610ab9578063c1aea0c314610ae2578063c6616ba114610b0d5761035b565b8063a9059cbb11610164578063b62496f51161013e578063b62496f5146109fb578063b6cf8ce614610a38578063bbc0c74214610a63578063beb08ab914610a8e5761035b565b8063a9059cbb14610958578063aa49802314610995578063aea5fff7146109be5761035b565b80639a7a23d6116101a05780639a7a23d6146108a0578063a457c2d7146108c9578063a4bb11e914610906578063a71225f51461092f5761035b565b80638da5cb5b14610821578063921a2ddc1461084c57806395d89b41146108755761035b565b806346645e78116102a05780636a486a8e1161023e5780637192762811610218578063719276281461078d578063751039fc146107b65780637571336a146107e15780638a8c523c1461080a5761035b565b80636a486a8e1461070e57806370a0823114610739578063715018a6146107765761035b565b80634fbee1931161027a5780634fbee19314610668578063519fb32d146106a557806357e6103f146106bc578063679ae7d1146106e55761035b565b806346645e78146105d557806349bd5a5e146106125780634a62bb651461063d5761035b565b806323b872dd1161030d5780632e1b0cf2116102e75780632e1b0cf214610517578063313ce56714610542578063323401ed1461056d57806339509351146105985761035b565b806323b872dd1461048657806327c8f835146104c35780632a7bab5d146104ee5761035b565b806306fdde0314610360578063095ea7b31461038b57806310d5de53146103c85780631694505e1461040557806318160ddd146104305780631a8145bb1461045b5761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610d1b565b6040516103829190614414565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906144de565b610dad565b6040516103bf9190614539565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190614554565b610dcb565b6040516103fc9190614539565b60405180910390f35b34801561041157600080fd5b5061041a610deb565b60405161042791906145e0565b60405180910390f35b34801561043c57600080fd5b50610445610e0f565b604051610452919061460a565b60405180910390f35b34801561046757600080fd5b50610470610e19565b60405161047d919061460a565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190614625565b610e1f565b6040516104ba9190614539565b60405180910390f35b3480156104cf57600080fd5b506104d8610f17565b6040516104e59190614687565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906146a2565b610f1d565b005b34801561052357600080fd5b5061052c61102c565b604051610539919061460a565b60405180910390f35b34801561054e57600080fd5b50610557611032565b60405161056491906146eb565b60405180910390f35b34801561057957600080fd5b5061058261103b565b60405161058f919061460a565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906144de565b611041565b6040516105cc9190614539565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906146a2565b6110ed565b6040516106099190614687565b60405180910390f35b34801561061e57600080fd5b5061062761112c565b6040516106349190614687565b60405180910390f35b34801561064957600080fd5b50610652611150565b60405161065f9190614539565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190614554565b611163565b60405161069c9190614539565b60405180910390f35b3480156106b157600080fd5b506106ba6111b9565b005b3480156106c857600080fd5b506106e360048036038101906106de919061484e565b6112ff565b005b3480156106f157600080fd5b5061070c60048036038101906107079190614554565b611531565b005b34801561071a57600080fd5b5061072361165d565b604051610730919061460a565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190614554565b611663565b60405161076d919061460a565b60405180910390f35b34801561078257600080fd5b5061078b6116ab565b005b34801561079957600080fd5b506107b460048036038101906107af9190614554565b611733565b005b3480156107c257600080fd5b506107cb6118c0565b6040516107d89190614539565b60405180910390f35b3480156107ed57600080fd5b50610808600480360381019061080391906148c3565b611960565b005b34801561081657600080fd5b5061081f611a37565b005b34801561082d57600080fd5b50610836611aeb565b6040516108439190614687565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614554565b611b15565b005b34801561088157600080fd5b5061088a611c45565b6040516108979190614414565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c291906148c3565b611cd7565b005b3480156108d557600080fd5b506108f060048036038101906108eb91906144de565b611def565b6040516108fd9190614539565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614903565b611eda565b005b34801561093b57600080fd5b5061095660048036038101906109519190614930565b611f73565b005b34801561096457600080fd5b5061097f600480360381019061097a91906144de565b612160565b60405161098c9190614539565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906146a2565b61217e565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190614554565b61228d565b6040516109f29190614539565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190614554565b6122e3565b604051610a2f9190614539565b60405180910390f35b348015610a4457600080fd5b50610a4d612303565b604051610a5a919061460a565b60405180910390f35b348015610a6f57600080fd5b50610a78612309565b604051610a859190614539565b60405180910390f35b348015610a9a57600080fd5b50610aa361231c565b604051610ab09190614687565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb91906148c3565b612342565b005b348015610aee57600080fd5b50610af7612467565b604051610b04919061460a565b60405180910390f35b348015610b1957600080fd5b50610b346004803603810190610b2f9190614970565b61246d565b005b348015610b4257600080fd5b50610b4b6125c3565b604051610b58919061460a565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b8391906146a2565b6125c9565b604051610b959190614539565b60405180910390f35b348015610baa57600080fd5b50610bb361271e565b604051610bc0919061460a565b60405180910390f35b348015610bd557600080fd5b50610bde612724565b604051610beb9190614539565b60405180910390f35b348015610c0057600080fd5b50610c1b6004803603810190610c169190614930565b612737565b604051610c28919061460a565b60405180910390f35b348015610c3d57600080fd5b50610c466127be565b604051610c53919061460a565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e9190614554565b6127c4565b005b348015610c9157600080fd5b50610c9a6129b6565b005b348015610ca857600080fd5b50610cb1612b79565b604051610cbe919061460a565b60405180910390f35b348015610cd357600080fd5b50610cdc612b7f565b604051610ce9919061460a565b60405180910390f35b348015610cfe57600080fd5b50610d196004803603810190610d149190614554565b612b85565b005b606060038054610d2a90614a06565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5690614a06565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000610dc1610dba612c7c565b8484612c84565b6001905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b60135481565b6000610e2c848484612e4d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e77612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614aa9565b60405180910390fd5b610f0b85610f03612c7c565b858403612c84565b60019150509392505050565b61dead81565b610f25612c7c565b73ffffffffffffffffffffffffffffffffffffffff16610f43611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614b15565b60405180910390fd5b670de0b6b3a76400006103e8600a610faf610e0f565b610fb99190614b64565b610fc39190614bd5565b610fcd9190614bd5565b81101561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690614c52565b60405180910390fd5b670de0b6b3a7640000816110239190614b64565b60088190555050565b60085481565b60006012905090565b60115481565b60006110e361104e612c7c565b84846001600061105c612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110de9190614c72565b612c84565b6001905092915050565b600c81815481106110fd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a60009054906101000a900460ff1681565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111c1612c7c565b73ffffffffffffffffffffffffffffffffffffffff166111df611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614b15565b60405180910390fd5b60005b600c805490508110156112ee576000600b6000600c848154811061125f5761125e614ca6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806112e690614cd5565b915050611238565b50600c60006112fd9190614346565b565b60005b815181101561152d5760008282815181106113205761131f614ca6565b5b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156113c65750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614d8f565b60405180910390fd5b60001515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036114c157600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061152590614cd5565b915050611302565b5050565b611539612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611557611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490614b15565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16476040516115d390614de0565b60006040518083038185875af1925050503d8060008114611610576040519150601f19603f3d011682016040523d82523d6000602084013e611615565b606091505b5050905080611659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165090614e41565b60405180910390fd5b5050565b60125481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b3612c7c565b73ffffffffffffffffffffffffffffffffffffffff166116d1611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90614b15565b60405180910390fd5b61173160006139d0565b565b61173b611aeb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614ed3565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fd0bdd1bf92049384d44f81d258f51a39b26cfc1d256348efb3b109fd8db7271160405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006118ca612c7c565b73ffffffffffffffffffffffffffffffffffffffff166118e8611aeb565b73ffffffffffffffffffffffffffffffffffffffff161461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614b15565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055506001905090565b611968612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611986611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614b15565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a3f612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611a5d611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90614b15565b60405180910390fd5b6001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b1d612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611b3b611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890614b15565b60405180910390fd5b60011515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c42576000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b606060048054611c5490614a06565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8090614a06565b8015611ccd5780601f10611ca257610100808354040283529160200191611ccd565b820191906000526020600020905b815481529060010190602001808311611cb057829003601f168201915b5050505050905090565b611cdf612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611cfd611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614b15565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614f3f565b60405180910390fd5b611deb8282613a96565b5050565b60008060016000611dfe612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614fd1565b60405180910390fd5b611ecf611ec6612c7c565b85858403612c84565b600191505092915050565b611ee2612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611f00611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90614b15565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b611f7b612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614b15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361205e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120559061503d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120999190614687565b602060405180830381865afa1580156120b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120da9190615072565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161211792919061509f565b6020604051808303816000875af1158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a91906150dd565b50505050565b600061217461216d612c7c565b8484612e4d565b6001905092915050565b612186612c7c565b73ffffffffffffffffffffffffffffffffffffffff166121a4611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614b15565b60405180910390fd5b670de0b6b3a76400006103e86005612210610e0f565b61221a9190614b64565b6122249190614bd5565b61222e9190614bd5565b811015612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790615156565b60405180910390fd5b670de0b6b3a7640000816122849190614b64565b60078190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60176020528060005260406000206000915054906101000a900460ff1681565b60105481565b600a60019054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61234a612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612368611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146123be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b590614b15565b60405180910390fd5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161245b9190614539565b60405180910390a25050565b600d5481565b612475612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612493611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614b15565b60405180910390fd5b83600d8190555082600e81905550600e54600d546125079190614c72565b600f819055506002600f541115612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a906151c2565b60405180910390fd5b81601081905550806011819055506011546010546125719190614c72565b601281905550600260125411156125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b49061522e565b60405180910390fd5b50505050565b60075481565b60006125d3612c7c565b73ffffffffffffffffffffffffffffffffffffffff166125f1611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90614b15565b60405180910390fd5b620186a06001612655610e0f565b61265f9190614b64565b6126699190614bd5565b8210156126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906152c0565b60405180910390fd5b6103e860056126b8610e0f565b6126c29190614b64565b6126cc9190614bd5565b82111561270e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270590615352565b60405180910390fd5b8160098190555060019050919050565b600f5481565b600a60029054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128605750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614d8f565b60405180910390fd5b60001515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361295b57600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6129be612c7c565b73ffffffffffffffffffffffffffffffffffffffff166129dc611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2990614b15565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a6d9190614687565b602060405180830381865afa158015612a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aae9190615072565b90503073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612aeb92919061509f565b6020604051808303816000875af1158015612b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2e91906150dd565b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612b75573d6000803e3d6000fd5b5050565b600e5481565b60145481565b612b8d612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612bab611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614b15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c67906153e4565b60405180910390fd5b612c79816139d0565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cea90615476565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990615508565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e40919061460a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb39061559a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f229061562c565b60405180910390fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf906156be565b60405180910390fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c906156be565b60405180910390fd5b6000810361305e5761305983836000613b37565b6139cb565b600a60009054906101000a900460ff16156135595761307b611aeb565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156130e957506130b9611aeb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156131225750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561315c575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156131755750600560149054906101000a900460ff16155b1561355857600a60019054906101000a900460ff1661326f57601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061322f5750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61326e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132659061572a565b60405180910390fd5b5b601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133125750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133b95760075481111561335c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335390615796565b60405180910390fd5b60085461336883611663565b826133739190614c72565b11156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab90615802565b60405180910390fd5b613557565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561345c5750601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134ab576007548111156134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349d9061586e565b60405180910390fd5b613556565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166135555760085461350883611663565b826135139190614c72565b1115613554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354b90615802565b60405180910390fd5b5b5b5b5b5b600061356430611663565b9050600060095482101590508080156135895750600a60029054906101000a900460ff165b80156135a25750600560149054906101000a900460ff16155b80156135f85750601760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561364e5750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136a45750601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156136e8576001600560146101000a81548160ff0219169083151502179055506136cc613db6565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061379e5750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137a857600090505b600081156139bb57601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561380b57506000601254115b156138a557613838606461382a60125488613fdc90919063ffffffff16565b613ff290919063ffffffff16565b90506012546010548261384b9190614b64565b6138559190614bd5565b601360008282546138669190614c72565b925050819055506012546011548261387e9190614b64565b6138889190614bd5565b601460008282546138999190614c72565b92505081905550613997565b601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561390057506000600f54115b156139965761392d606461391f600f5488613fdc90919063ffffffff16565b613ff290919063ffffffff16565b9050600f54600d54826139409190614b64565b61394a9190614bd5565b6013600082825461395b9190614c72565b92505081905550600f54600e54826139739190614b64565b61397d9190614bd5565b6014600082825461398e9190614c72565b925050819055505b5b60008111156139ac576139ab873083613b37565b5b80856139b8919061588e565b94505b6139c6878787613b37565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9d90615934565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c0c906159c6565b60405180910390fd5b613c20838383614008565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9d90615a58565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d399190614c72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613d9d919061460a565b60405180910390a3613db084848461400d565b50505050565b6000613dc130611663565b90506000601454601354613dd59190614c72565b9050600080831480613de75750600082145b15613df457505050613fda565b6014600954613e039190614b64565b831115613e1c576014600954613e199190614b64565b92505b600060028360135486613e2f9190614b64565b613e399190614bd5565b613e439190614bd5565b90506000613e5a828661401290919063ffffffff16565b90506000479050613e6a82614028565b6000613e7f824761401290919063ffffffff16565b90506000613ec36002601354613e959190614bd5565b88613ea0919061588e565b613eb560145485613fdc90919063ffffffff16565b613ff290919063ffffffff16565b905060008183613ed3919061588e565b905060006013819055506000601481905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613f2b90614de0565b60006040518083038185875af1925050503d8060008114613f68576040519150601f19603f3d011682016040523d82523d6000602084013e613f6d565b606091505b505080975050600086118015613f835750600081115b15613fd057613f928682614265565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618582601354604051613fc793929190615a78565b60405180910390a15b5050505050505050505b565b60008183613fea9190614b64565b905092915050565b600081836140009190614bd5565b905092915050565b505050565b505050565b60008183614020919061588e565b905092915050565b6000600267ffffffffffffffff8111156140455761404461470b565b5b6040519080825280602002602001820160405280156140735781602001602082028036833780820191505090505b509050308160008151811061408b5761408a614ca6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141549190615ac4565b8160018151811061416857614167614ca6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506141cd307f000000000000000000000000000000000000000000000000000000000000000084612c84565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161422f959493929190615bea565b600060405180830381600087803b15801561424957600080fd5b505af115801561425d573d6000803e3d6000fd5b505050505050565b614290307f000000000000000000000000000000000000000000000000000000000000000084612c84565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806142da611aeb565b426040518863ffffffff1660e01b81526004016142fc96959493929190615c44565b60606040518083038185885af115801561431a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061433f9190615ca5565b5050505050565b50805460008255906000526020600020908101906143649190614367565b50565b5b80821115614380576000816000905550600101614368565b5090565b600081519050919050565b600082825260208201905092915050565b60005b838110156143be5780820151818401526020810190506143a3565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e682614384565b6143f0818561438f565b93506144008185602086016143a0565b614409816143ca565b840191505092915050565b6000602082019050818103600083015261442e81846143db565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144758261444a565b9050919050565b6144858161446a565b811461449057600080fd5b50565b6000813590506144a28161447c565b92915050565b6000819050919050565b6144bb816144a8565b81146144c657600080fd5b50565b6000813590506144d8816144b2565b92915050565b600080604083850312156144f5576144f4614440565b5b600061450385828601614493565b9250506020614514858286016144c9565b9150509250929050565b60008115159050919050565b6145338161451e565b82525050565b600060208201905061454e600083018461452a565b92915050565b60006020828403121561456a57614569614440565b5b600061457884828501614493565b91505092915050565b6000819050919050565b60006145a66145a161459c8461444a565b614581565b61444a565b9050919050565b60006145b88261458b565b9050919050565b60006145ca826145ad565b9050919050565b6145da816145bf565b82525050565b60006020820190506145f560008301846145d1565b92915050565b614604816144a8565b82525050565b600060208201905061461f60008301846145fb565b92915050565b60008060006060848603121561463e5761463d614440565b5b600061464c86828701614493565b935050602061465d86828701614493565b925050604061466e868287016144c9565b9150509250925092565b6146818161446a565b82525050565b600060208201905061469c6000830184614678565b92915050565b6000602082840312156146b8576146b7614440565b5b60006146c6848285016144c9565b91505092915050565b600060ff82169050919050565b6146e5816146cf565b82525050565b600060208201905061470060008301846146dc565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614743826143ca565b810181811067ffffffffffffffff821117156147625761476161470b565b5b80604052505050565b6000614775614436565b9050614781828261473a565b919050565b600067ffffffffffffffff8211156147a1576147a061470b565b5b602082029050602081019050919050565b600080fd5b60006147ca6147c584614786565b61476b565b905080838252602082019050602084028301858111156147ed576147ec6147b2565b5b835b8181101561481657806148028882614493565b8452602084019350506020810190506147ef565b5050509392505050565b600082601f83011261483557614834614706565b5b81356148458482602086016147b7565b91505092915050565b60006020828403121561486457614863614440565b5b600082013567ffffffffffffffff81111561488257614881614445565b5b61488e84828501614820565b91505092915050565b6148a08161451e565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b600080604083850312156148da576148d9614440565b5b60006148e885828601614493565b92505060206148f9858286016148ae565b9150509250929050565b60006020828403121561491957614918614440565b5b6000614927848285016148ae565b91505092915050565b6000806040838503121561494757614946614440565b5b600061495585828601614493565b925050602061496685828601614493565b9150509250929050565b6000806000806080858703121561498a57614989614440565b5b6000614998878288016144c9565b94505060206149a9878288016144c9565b93505060406149ba878288016144c9565b92505060606149cb878288016144c9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1e57607f821691505b602082108103614a3157614a306149d7565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614a9360288361438f565b9150614a9e82614a37565b604082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614aff60208361438f565b9150614b0a82614ac9565b602082019050919050565b60006020820190508181036000830152614b2e81614af2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b6f826144a8565b9150614b7a836144a8565b9250828202614b88816144a8565b91508282048414831517614b9f57614b9e614b35565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614be0826144a8565b9150614beb836144a8565b925082614bfb57614bfa614ba6565b5b828204905092915050565b7f4d757374206265203e20312e3025000000000000000000000000000000000000600082015250565b6000614c3c600e8361438f565b9150614c4782614c06565b602082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b6000614c7d826144a8565b9150614c88836144a8565b9250828201905080821115614ca057614c9f614b35565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ce0826144a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d1257614d11614b35565b5b600182019050919050565b7f43616e27742061646420763220726f757465722f706f6f6c20696e746f20746860008201527f6520726166666c652e0000000000000000000000000000000000000000000000602082015250565b6000614d7960298361438f565b9150614d8482614d1d565b604082019050919050565b60006020820190508181036000830152614da881614d6c565b9050919050565b600081905092915050565b50565b6000614dca600083614daf565b9150614dd582614dba565b600082019050919050565b6000614deb82614dbd565b9150819050919050565b7f776974686472617754726170706564457468206661696c656400000000000000600082015250565b6000614e2b60198361438f565b9150614e3682614df5565b602082019050919050565b60006020820190508181036000830152614e5a81614e1e565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572206f7220746865207060008201527f726f6a6563742077616c6c657400000000000000000000000000000000000000602082015250565b6000614ebd602d8361438f565b9150614ec882614e61565b604082019050919050565b60006020820190508181036000830152614eec81614eb0565b9050919050565b7f506169722072656d6f76616c206e6f74207065726d6974746564000000000000600082015250565b6000614f29601a8361438f565b9150614f3482614ef3565b602082019050919050565b60006020820190508181036000830152614f5881614f1c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614fbb60258361438f565b9150614fc682614f5f565b604082019050919050565b60006020820190508181036000830152614fea81614fae565b9050919050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000615027601a8361438f565b915061503282614ff1565b602082019050919050565b600060208201905081810360008301526150568161501a565b9050919050565b60008151905061506c816144b2565b92915050565b60006020828403121561508857615087614440565b5b60006150968482850161505d565b91505092915050565b60006040820190506150b46000830185614678565b6150c160208301846145fb565b9392505050565b6000815190506150d781614897565b92915050565b6000602082840312156150f3576150f2614440565b5b6000615101848285016150c8565b91505092915050565b7f4d757374206265203e20302e3525000000000000000000000000000000000000600082015250565b6000615140600e8361438f565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f42757920666565206d757374206265203c3d2032000000000000000000000000600082015250565b60006151ac60148361438f565b91506151b782615176565b602082019050919050565b600060208201905081810360008301526151db8161519f565b9050919050565b7f53656c6c20666565206d757374206265203c3d20320000000000000000000000600082015250565b600061521860158361438f565b9150615223826151e2565b602082019050919050565b600060208201905081810360008301526152478161520b565b9050919050565b7f53776170206d757374206265203e20302e3030312520746f74616c207375707060008201527f6c792e0000000000000000000000000000000000000000000000000000000000602082015250565b60006152aa60238361438f565b91506152b58261524e565b604082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b7f53776170206d757374206265203c20302e352520746f74616c20737570706c7960008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061533c60218361438f565b9150615347826152e0565b604082019050919050565b6000602082019050818103600083015261536b8161532f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153ce60268361438f565b91506153d982615372565b604082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061546060248361438f565b915061546b82615404565b604082019050919050565b6000602082019050818103600083015261548f81615453565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154f260228361438f565b91506154fd82615496565b604082019050919050565b60006020820190508181036000830152615521816154e5565b9050919050565b7f45524332303a207472616e73666572696e672066726f6d207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061558460248361438f565b915061558f82615528565b604082019050919050565b600060208201905081810360008301526155b381615577565b9050919050565b7f45524332303a207472616e73666572696e6720746f207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061561660228361438f565b9150615621826155ba565b604082019050919050565b6000602082019050818103600083015261564581615609565b9050919050565b7f526166666c6520456e7472792c2054727920416761696e20416674657220526160008201527f66666c6500000000000000000000000000000000000000000000000000000000602082015250565b60006156a860248361438f565b91506156b38261564c565b604082019050919050565b600060208201905081810360008301526156d78161569b565b9050919050565b7f4e6f7420456e61626c65642e0000000000000000000000000000000000000000600082015250565b6000615714600c8361438f565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b7f427579203e20416c6c6f77656420416d6f756e742e0000000000000000000000600082015250565b600061578060158361438f565b915061578b8261574a565b602082019050919050565b600060208201905081810360008301526157af81615773565b9050919050565b7f4d617820616d6f756e7420657863656564656400000000000000000000000000600082015250565b60006157ec60138361438f565b91506157f7826157b6565b602082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b7f53656c6c203e20416c6c6f77656420416d6f756e742e00000000000000000000600082015250565b600061585860168361438f565b915061586382615822565b602082019050919050565b600060208201905081810360008301526158878161584b565b9050919050565b6000615899826144a8565b91506158a4836144a8565b92508282039050818111156158bc576158bb614b35565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061591e60258361438f565b9150615929826158c2565b604082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006159b060238361438f565b91506159bb82615954565b604082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615a4260268361438f565b9150615a4d826159e6565b604082019050919050565b60006020820190508181036000830152615a7181615a35565b9050919050565b6000606082019050615a8d60008301866145fb565b615a9a60208301856145fb565b615aa760408301846145fb565b949350505050565b600081519050615abe8161447c565b92915050565b600060208284031215615ada57615ad9614440565b5b6000615ae884828501615aaf565b91505092915050565b6000819050919050565b6000615b16615b11615b0c84615af1565b614581565b6144a8565b9050919050565b615b2681615afb565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615b618161446a565b82525050565b6000615b738383615b58565b60208301905092915050565b6000602082019050919050565b6000615b9782615b2c565b615ba18185615b37565b9350615bac83615b48565b8060005b83811015615bdd578151615bc48882615b67565b9750615bcf83615b7f565b925050600181019050615bb0565b5085935050505092915050565b600060a082019050615bff60008301886145fb565b615c0c6020830187615b1d565b8181036040830152615c1e8186615b8c565b9050615c2d6060830185614678565b615c3a60808301846145fb565b9695505050505050565b600060c082019050615c596000830189614678565b615c6660208301886145fb565b615c736040830187615b1d565b615c806060830186615b1d565b615c8d6080830185614678565b615c9a60a08301846145fb565b979650505050505050565b600080600060608486031215615cbe57615cbd614440565b5b6000615ccc8682870161505d565b9350506020615cdd8682870161505d565b9250506040615cee8682870161505d565b915050925092509256fea264697066735822122007a18f7a70d5574522a25e47e24d0d7c7c474c9ecf82cf694d140128838fe00e64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106103545760003560e01c80638da5cb5b116101c6578063c0246668116100f7578063dd62ed3e11610095578063e40e2b931161006f578063e40e2b9314610c85578063e7dd050b14610c9c578063e8338a1c14610cc7578063f2fde38b14610cf25761035b565b8063dd62ed3e14610bf4578063e2f4560514610c31578063e339d56014610c5c5761035b565b8063c8c8ebe4116100d1578063c8c8ebe414610b36578063d257b34f14610b61578063d85ba06314610b9e578063d9a018d514610bc95761035b565b8063c024666814610ab9578063c1aea0c314610ae2578063c6616ba114610b0d5761035b565b8063a9059cbb11610164578063b62496f51161013e578063b62496f5146109fb578063b6cf8ce614610a38578063bbc0c74214610a63578063beb08ab914610a8e5761035b565b8063a9059cbb14610958578063aa49802314610995578063aea5fff7146109be5761035b565b80639a7a23d6116101a05780639a7a23d6146108a0578063a457c2d7146108c9578063a4bb11e914610906578063a71225f51461092f5761035b565b80638da5cb5b14610821578063921a2ddc1461084c57806395d89b41146108755761035b565b806346645e78116102a05780636a486a8e1161023e5780637192762811610218578063719276281461078d578063751039fc146107b65780637571336a146107e15780638a8c523c1461080a5761035b565b80636a486a8e1461070e57806370a0823114610739578063715018a6146107765761035b565b80634fbee1931161027a5780634fbee19314610668578063519fb32d146106a557806357e6103f146106bc578063679ae7d1146106e55761035b565b806346645e78146105d557806349bd5a5e146106125780634a62bb651461063d5761035b565b806323b872dd1161030d5780632e1b0cf2116102e75780632e1b0cf214610517578063313ce56714610542578063323401ed1461056d57806339509351146105985761035b565b806323b872dd1461048657806327c8f835146104c35780632a7bab5d146104ee5761035b565b806306fdde0314610360578063095ea7b31461038b57806310d5de53146103c85780631694505e1461040557806318160ddd146104305780631a8145bb1461045b5761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b50610375610d1b565b6040516103829190614414565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906144de565b610dad565b6040516103bf9190614539565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190614554565b610dcb565b6040516103fc9190614539565b60405180910390f35b34801561041157600080fd5b5061041a610deb565b60405161042791906145e0565b60405180910390f35b34801561043c57600080fd5b50610445610e0f565b604051610452919061460a565b60405180910390f35b34801561046757600080fd5b50610470610e19565b60405161047d919061460a565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190614625565b610e1f565b6040516104ba9190614539565b60405180910390f35b3480156104cf57600080fd5b506104d8610f17565b6040516104e59190614687565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906146a2565b610f1d565b005b34801561052357600080fd5b5061052c61102c565b604051610539919061460a565b60405180910390f35b34801561054e57600080fd5b50610557611032565b60405161056491906146eb565b60405180910390f35b34801561057957600080fd5b5061058261103b565b60405161058f919061460a565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906144de565b611041565b6040516105cc9190614539565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906146a2565b6110ed565b6040516106099190614687565b60405180910390f35b34801561061e57600080fd5b5061062761112c565b6040516106349190614687565b60405180910390f35b34801561064957600080fd5b50610652611150565b60405161065f9190614539565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190614554565b611163565b60405161069c9190614539565b60405180910390f35b3480156106b157600080fd5b506106ba6111b9565b005b3480156106c857600080fd5b506106e360048036038101906106de919061484e565b6112ff565b005b3480156106f157600080fd5b5061070c60048036038101906107079190614554565b611531565b005b34801561071a57600080fd5b5061072361165d565b604051610730919061460a565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190614554565b611663565b60405161076d919061460a565b60405180910390f35b34801561078257600080fd5b5061078b6116ab565b005b34801561079957600080fd5b506107b460048036038101906107af9190614554565b611733565b005b3480156107c257600080fd5b506107cb6118c0565b6040516107d89190614539565b60405180910390f35b3480156107ed57600080fd5b50610808600480360381019061080391906148c3565b611960565b005b34801561081657600080fd5b5061081f611a37565b005b34801561082d57600080fd5b50610836611aeb565b6040516108439190614687565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614554565b611b15565b005b34801561088157600080fd5b5061088a611c45565b6040516108979190614414565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c291906148c3565b611cd7565b005b3480156108d557600080fd5b506108f060048036038101906108eb91906144de565b611def565b6040516108fd9190614539565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614903565b611eda565b005b34801561093b57600080fd5b5061095660048036038101906109519190614930565b611f73565b005b34801561096457600080fd5b5061097f600480360381019061097a91906144de565b612160565b60405161098c9190614539565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906146a2565b61217e565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190614554565b61228d565b6040516109f29190614539565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190614554565b6122e3565b604051610a2f9190614539565b60405180910390f35b348015610a4457600080fd5b50610a4d612303565b604051610a5a919061460a565b60405180910390f35b348015610a6f57600080fd5b50610a78612309565b604051610a859190614539565b60405180910390f35b348015610a9a57600080fd5b50610aa361231c565b604051610ab09190614687565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb91906148c3565b612342565b005b348015610aee57600080fd5b50610af7612467565b604051610b04919061460a565b60405180910390f35b348015610b1957600080fd5b50610b346004803603810190610b2f9190614970565b61246d565b005b348015610b4257600080fd5b50610b4b6125c3565b604051610b58919061460a565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b8391906146a2565b6125c9565b604051610b959190614539565b60405180910390f35b348015610baa57600080fd5b50610bb361271e565b604051610bc0919061460a565b60405180910390f35b348015610bd557600080fd5b50610bde612724565b604051610beb9190614539565b60405180910390f35b348015610c0057600080fd5b50610c1b6004803603810190610c169190614930565b612737565b604051610c28919061460a565b60405180910390f35b348015610c3d57600080fd5b50610c466127be565b604051610c53919061460a565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e9190614554565b6127c4565b005b348015610c9157600080fd5b50610c9a6129b6565b005b348015610ca857600080fd5b50610cb1612b79565b604051610cbe919061460a565b60405180910390f35b348015610cd357600080fd5b50610cdc612b7f565b604051610ce9919061460a565b60405180910390f35b348015610cfe57600080fd5b50610d196004803603810190610d149190614554565b612b85565b005b606060038054610d2a90614a06565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5690614a06565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000610dc1610dba612c7c565b8484612c84565b6001905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60135481565b6000610e2c848484612e4d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e77612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90614aa9565b60405180910390fd5b610f0b85610f03612c7c565b858403612c84565b60019150509392505050565b61dead81565b610f25612c7c565b73ffffffffffffffffffffffffffffffffffffffff16610f43611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614b15565b60405180910390fd5b670de0b6b3a76400006103e8600a610faf610e0f565b610fb99190614b64565b610fc39190614bd5565b610fcd9190614bd5565b81101561100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690614c52565b60405180910390fd5b670de0b6b3a7640000816110239190614b64565b60088190555050565b60085481565b60006012905090565b60115481565b60006110e361104e612c7c565b84846001600061105c612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110de9190614c72565b612c84565b6001905092915050565b600c81815481106110fd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000065bb2cd2daefd29136786ec6224a1735ad9bf04681565b600a60009054906101000a900460ff1681565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111c1612c7c565b73ffffffffffffffffffffffffffffffffffffffff166111df611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614b15565b60405180910390fd5b60005b600c805490508110156112ee576000600b6000600c848154811061125f5761125e614ca6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806112e690614cd5565b915050611238565b50600c60006112fd9190614346565b565b60005b815181101561152d5760008282815181106113205761131f614ca6565b5b602002602001015190507f00000000000000000000000065bb2cd2daefd29136786ec6224a1735ad9bf04673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156113c65750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614d8f565b60405180910390fd5b60001515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036114c157600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061152590614cd5565b915050611302565b5050565b611539612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611557611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490614b15565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff16476040516115d390614de0565b60006040518083038185875af1925050503d8060008114611610576040519150601f19603f3d011682016040523d82523d6000602084013e611615565b606091505b5050905080611659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165090614e41565b60405180910390fd5b5050565b60125481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b3612c7c565b73ffffffffffffffffffffffffffffffffffffffff166116d1611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90614b15565b60405180910390fd5b61173160006139d0565b565b61173b611aeb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614ed3565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fd0bdd1bf92049384d44f81d258f51a39b26cfc1d256348efb3b109fd8db7271160405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006118ca612c7c565b73ffffffffffffffffffffffffffffffffffffffff166118e8611aeb565b73ffffffffffffffffffffffffffffffffffffffff161461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614b15565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055506001905090565b611968612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611986611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614b15565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a3f612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611a5d611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90614b15565b60405180910390fd5b6001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b1d612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611b3b611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890614b15565b60405180910390fd5b60011515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c42576000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b606060048054611c5490614a06565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8090614a06565b8015611ccd5780601f10611ca257610100808354040283529160200191611ccd565b820191906000526020600020905b815481529060010190602001808311611cb057829003601f168201915b5050505050905090565b611cdf612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611cfd611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614b15565b60405180910390fd5b7f00000000000000000000000065bb2cd2daefd29136786ec6224a1735ad9bf04673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614f3f565b60405180910390fd5b611deb8282613a96565b5050565b60008060016000611dfe612c7c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614fd1565b60405180910390fd5b611ecf611ec6612c7c565b85858403612c84565b600191505092915050565b611ee2612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611f00611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90614b15565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b611f7b612c7c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690614b15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361205e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120559061503d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120999190614687565b602060405180830381865afa1580156120b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120da9190615072565b90508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161211792919061509f565b6020604051808303816000875af1158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a91906150dd565b50505050565b600061217461216d612c7c565b8484612e4d565b6001905092915050565b612186612c7c565b73ffffffffffffffffffffffffffffffffffffffff166121a4611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614b15565b60405180910390fd5b670de0b6b3a76400006103e86005612210610e0f565b61221a9190614b64565b6122249190614bd5565b61222e9190614bd5565b811015612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790615156565b60405180910390fd5b670de0b6b3a7640000816122849190614b64565b60078190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60176020528060005260406000206000915054906101000a900460ff1681565b60105481565b600a60019054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61234a612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612368611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146123be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b590614b15565b60405180910390fd5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161245b9190614539565b60405180910390a25050565b600d5481565b612475612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612493611aeb565b73ffffffffffffffffffffffffffffffffffffffff16146124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e090614b15565b60405180910390fd5b83600d8190555082600e81905550600e54600d546125079190614c72565b600f819055506002600f541115612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a906151c2565b60405180910390fd5b81601081905550806011819055506011546010546125719190614c72565b601281905550600260125411156125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b49061522e565b60405180910390fd5b50505050565b60075481565b60006125d3612c7c565b73ffffffffffffffffffffffffffffffffffffffff166125f1611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90614b15565b60405180910390fd5b620186a06001612655610e0f565b61265f9190614b64565b6126699190614bd5565b8210156126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a2906152c0565b60405180910390fd5b6103e860056126b8610e0f565b6126c29190614b64565b6126cc9190614bd5565b82111561270e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270590615352565b60405180910390fd5b8160098190555060019050919050565b600f5481565b600a60029054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b7f00000000000000000000000065bb2cd2daefd29136786ec6224a1735ad9bf04673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128605750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614d8f565b60405180910390fd5b60001515600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361295b57600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6129be612c7c565b73ffffffffffffffffffffffffffffffffffffffff166129dc611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2990614b15565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a6d9190614687565b602060405180830381865afa158015612a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aae9190615072565b90503073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612aeb92919061509f565b6020604051808303816000875af1158015612b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2e91906150dd565b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612b75573d6000803e3d6000fd5b5050565b600e5481565b60145481565b612b8d612c7c565b73ffffffffffffffffffffffffffffffffffffffff16612bab611aeb565b73ffffffffffffffffffffffffffffffffffffffff1614612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614b15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c67906153e4565b60405180910390fd5b612c79816139d0565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cea90615476565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990615508565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e40919061460a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb39061559a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f229061562c565b60405180910390fd5b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf906156be565b60405180910390fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303c906156be565b60405180910390fd5b6000810361305e5761305983836000613b37565b6139cb565b600a60009054906101000a900460ff16156135595761307b611aeb565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156130e957506130b9611aeb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156131225750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561315c575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156131755750600560149054906101000a900460ff16155b1561355857600a60019054906101000a900460ff1661326f57601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061322f5750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61326e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132659061572a565b60405180910390fd5b5b601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133125750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133b95760075481111561335c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335390615796565b60405180910390fd5b60085461336883611663565b826133739190614c72565b11156133b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ab90615802565b60405180910390fd5b613557565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561345c5750601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134ab576007548111156134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349d9061586e565b60405180910390fd5b613556565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166135555760085461350883611663565b826135139190614c72565b1115613554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354b90615802565b60405180910390fd5b5b5b5b5b5b600061356430611663565b9050600060095482101590508080156135895750600a60029054906101000a900460ff165b80156135a25750600560149054906101000a900460ff16155b80156135f85750601760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561364e5750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136a45750601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156136e8576001600560146101000a81548160ff0219169083151502179055506136cc613db6565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061379e5750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137a857600090505b600081156139bb57601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561380b57506000601254115b156138a557613838606461382a60125488613fdc90919063ffffffff16565b613ff290919063ffffffff16565b90506012546010548261384b9190614b64565b6138559190614bd5565b601360008282546138669190614c72565b925050819055506012546011548261387e9190614b64565b6138889190614bd5565b601460008282546138999190614c72565b92505081905550613997565b601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561390057506000600f54115b156139965761392d606461391f600f5488613fdc90919063ffffffff16565b613ff290919063ffffffff16565b9050600f54600d54826139409190614b64565b61394a9190614bd5565b6013600082825461395b9190614c72565b92505081905550600f54600e54826139739190614b64565b61397d9190614bd5565b6014600082825461398e9190614c72565b925050819055505b5b60008111156139ac576139ab873083613b37565b5b80856139b8919061588e565b94505b6139c6878787613b37565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9d90615934565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c0c906159c6565b60405180910390fd5b613c20838383614008565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9d90615a58565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d399190614c72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613d9d919061460a565b60405180910390a3613db084848461400d565b50505050565b6000613dc130611663565b90506000601454601354613dd59190614c72565b9050600080831480613de75750600082145b15613df457505050613fda565b6014600954613e039190614b64565b831115613e1c576014600954613e199190614b64565b92505b600060028360135486613e2f9190614b64565b613e399190614bd5565b613e439190614bd5565b90506000613e5a828661401290919063ffffffff16565b90506000479050613e6a82614028565b6000613e7f824761401290919063ffffffff16565b90506000613ec36002601354613e959190614bd5565b88613ea0919061588e565b613eb560145485613fdc90919063ffffffff16565b613ff290919063ffffffff16565b905060008183613ed3919061588e565b905060006013819055506000601481905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613f2b90614de0565b60006040518083038185875af1925050503d8060008114613f68576040519150601f19603f3d011682016040523d82523d6000602084013e613f6d565b606091505b505080975050600086118015613f835750600081115b15613fd057613f928682614265565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618582601354604051613fc793929190615a78565b60405180910390a15b5050505050505050505b565b60008183613fea9190614b64565b905092915050565b600081836140009190614bd5565b905092915050565b505050565b505050565b60008183614020919061588e565b905092915050565b6000600267ffffffffffffffff8111156140455761404461470b565b5b6040519080825280602002602001820160405280156140735781602001602082028036833780820191505090505b509050308160008151811061408b5761408a614ca6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141549190615ac4565b8160018151811061416857614167614ca6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506141cd307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612c84565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161422f959493929190615bea565b600060405180830381600087803b15801561424957600080fd5b505af115801561425d573d6000803e3d6000fd5b505050505050565b614290307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612c84565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806142da611aeb565b426040518863ffffffff1660e01b81526004016142fc96959493929190615c44565b60606040518083038185885af115801561431a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061433f9190615ca5565b5050505050565b50805460008255906000526020600020908101906143649190614367565b50565b5b80821115614380576000816000905550600101614368565b5090565b600081519050919050565b600082825260208201905092915050565b60005b838110156143be5780820151818401526020810190506143a3565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e682614384565b6143f0818561438f565b93506144008185602086016143a0565b614409816143ca565b840191505092915050565b6000602082019050818103600083015261442e81846143db565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144758261444a565b9050919050565b6144858161446a565b811461449057600080fd5b50565b6000813590506144a28161447c565b92915050565b6000819050919050565b6144bb816144a8565b81146144c657600080fd5b50565b6000813590506144d8816144b2565b92915050565b600080604083850312156144f5576144f4614440565b5b600061450385828601614493565b9250506020614514858286016144c9565b9150509250929050565b60008115159050919050565b6145338161451e565b82525050565b600060208201905061454e600083018461452a565b92915050565b60006020828403121561456a57614569614440565b5b600061457884828501614493565b91505092915050565b6000819050919050565b60006145a66145a161459c8461444a565b614581565b61444a565b9050919050565b60006145b88261458b565b9050919050565b60006145ca826145ad565b9050919050565b6145da816145bf565b82525050565b60006020820190506145f560008301846145d1565b92915050565b614604816144a8565b82525050565b600060208201905061461f60008301846145fb565b92915050565b60008060006060848603121561463e5761463d614440565b5b600061464c86828701614493565b935050602061465d86828701614493565b925050604061466e868287016144c9565b9150509250925092565b6146818161446a565b82525050565b600060208201905061469c6000830184614678565b92915050565b6000602082840312156146b8576146b7614440565b5b60006146c6848285016144c9565b91505092915050565b600060ff82169050919050565b6146e5816146cf565b82525050565b600060208201905061470060008301846146dc565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614743826143ca565b810181811067ffffffffffffffff821117156147625761476161470b565b5b80604052505050565b6000614775614436565b9050614781828261473a565b919050565b600067ffffffffffffffff8211156147a1576147a061470b565b5b602082029050602081019050919050565b600080fd5b60006147ca6147c584614786565b61476b565b905080838252602082019050602084028301858111156147ed576147ec6147b2565b5b835b8181101561481657806148028882614493565b8452602084019350506020810190506147ef565b5050509392505050565b600082601f83011261483557614834614706565b5b81356148458482602086016147b7565b91505092915050565b60006020828403121561486457614863614440565b5b600082013567ffffffffffffffff81111561488257614881614445565b5b61488e84828501614820565b91505092915050565b6148a08161451e565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b600080604083850312156148da576148d9614440565b5b60006148e885828601614493565b92505060206148f9858286016148ae565b9150509250929050565b60006020828403121561491957614918614440565b5b6000614927848285016148ae565b91505092915050565b6000806040838503121561494757614946614440565b5b600061495585828601614493565b925050602061496685828601614493565b9150509250929050565b6000806000806080858703121561498a57614989614440565b5b6000614998878288016144c9565b94505060206149a9878288016144c9565b93505060406149ba878288016144c9565b92505060606149cb878288016144c9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a1e57607f821691505b602082108103614a3157614a306149d7565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614a9360288361438f565b9150614a9e82614a37565b604082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614aff60208361438f565b9150614b0a82614ac9565b602082019050919050565b60006020820190508181036000830152614b2e81614af2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b6f826144a8565b9150614b7a836144a8565b9250828202614b88816144a8565b91508282048414831517614b9f57614b9e614b35565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614be0826144a8565b9150614beb836144a8565b925082614bfb57614bfa614ba6565b5b828204905092915050565b7f4d757374206265203e20312e3025000000000000000000000000000000000000600082015250565b6000614c3c600e8361438f565b9150614c4782614c06565b602082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b6000614c7d826144a8565b9150614c88836144a8565b9250828201905080821115614ca057614c9f614b35565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ce0826144a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d1257614d11614b35565b5b600182019050919050565b7f43616e27742061646420763220726f757465722f706f6f6c20696e746f20746860008201527f6520726166666c652e0000000000000000000000000000000000000000000000602082015250565b6000614d7960298361438f565b9150614d8482614d1d565b604082019050919050565b60006020820190508181036000830152614da881614d6c565b9050919050565b600081905092915050565b50565b6000614dca600083614daf565b9150614dd582614dba565b600082019050919050565b6000614deb82614dbd565b9150819050919050565b7f776974686472617754726170706564457468206661696c656400000000000000600082015250565b6000614e2b60198361438f565b9150614e3682614df5565b602082019050919050565b60006020820190508181036000830152614e5a81614e1e565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572206f7220746865207060008201527f726f6a6563742077616c6c657400000000000000000000000000000000000000602082015250565b6000614ebd602d8361438f565b9150614ec882614e61565b604082019050919050565b60006020820190508181036000830152614eec81614eb0565b9050919050565b7f506169722072656d6f76616c206e6f74207065726d6974746564000000000000600082015250565b6000614f29601a8361438f565b9150614f3482614ef3565b602082019050919050565b60006020820190508181036000830152614f5881614f1c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614fbb60258361438f565b9150614fc682614f5f565b604082019050919050565b60006020820190508181036000830152614fea81614fae565b9050919050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000615027601a8361438f565b915061503282614ff1565b602082019050919050565b600060208201905081810360008301526150568161501a565b9050919050565b60008151905061506c816144b2565b92915050565b60006020828403121561508857615087614440565b5b60006150968482850161505d565b91505092915050565b60006040820190506150b46000830185614678565b6150c160208301846145fb565b9392505050565b6000815190506150d781614897565b92915050565b6000602082840312156150f3576150f2614440565b5b6000615101848285016150c8565b91505092915050565b7f4d757374206265203e20302e3525000000000000000000000000000000000000600082015250565b6000615140600e8361438f565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f42757920666565206d757374206265203c3d2032000000000000000000000000600082015250565b60006151ac60148361438f565b91506151b782615176565b602082019050919050565b600060208201905081810360008301526151db8161519f565b9050919050565b7f53656c6c20666565206d757374206265203c3d20320000000000000000000000600082015250565b600061521860158361438f565b9150615223826151e2565b602082019050919050565b600060208201905081810360008301526152478161520b565b9050919050565b7f53776170206d757374206265203e20302e3030312520746f74616c207375707060008201527f6c792e0000000000000000000000000000000000000000000000000000000000602082015250565b60006152aa60238361438f565b91506152b58261524e565b604082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b7f53776170206d757374206265203c20302e352520746f74616c20737570706c7960008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061533c60218361438f565b9150615347826152e0565b604082019050919050565b6000602082019050818103600083015261536b8161532f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153ce60268361438f565b91506153d982615372565b604082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061546060248361438f565b915061546b82615404565b604082019050919050565b6000602082019050818103600083015261548f81615453565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154f260228361438f565b91506154fd82615496565b604082019050919050565b60006020820190508181036000830152615521816154e5565b9050919050565b7f45524332303a207472616e73666572696e672066726f6d207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061558460248361438f565b915061558f82615528565b604082019050919050565b600060208201905081810360008301526155b381615577565b9050919050565b7f45524332303a207472616e73666572696e6720746f207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061561660228361438f565b9150615621826155ba565b604082019050919050565b6000602082019050818103600083015261564581615609565b9050919050565b7f526166666c6520456e7472792c2054727920416761696e20416674657220526160008201527f66666c6500000000000000000000000000000000000000000000000000000000602082015250565b60006156a860248361438f565b91506156b38261564c565b604082019050919050565b600060208201905081810360008301526156d78161569b565b9050919050565b7f4e6f7420456e61626c65642e0000000000000000000000000000000000000000600082015250565b6000615714600c8361438f565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b7f427579203e20416c6c6f77656420416d6f756e742e0000000000000000000000600082015250565b600061578060158361438f565b915061578b8261574a565b602082019050919050565b600060208201905081810360008301526157af81615773565b9050919050565b7f4d617820616d6f756e7420657863656564656400000000000000000000000000600082015250565b60006157ec60138361438f565b91506157f7826157b6565b602082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b7f53656c6c203e20416c6c6f77656420416d6f756e742e00000000000000000000600082015250565b600061585860168361438f565b915061586382615822565b602082019050919050565b600060208201905081810360008301526158878161584b565b9050919050565b6000615899826144a8565b91506158a4836144a8565b92508282039050818111156158bc576158bb614b35565b5b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061591e60258361438f565b9150615929826158c2565b604082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006159b060238361438f565b91506159bb82615954565b604082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615a4260268361438f565b9150615a4d826159e6565b604082019050919050565b60006020820190508181036000830152615a7181615a35565b9050919050565b6000606082019050615a8d60008301866145fb565b615a9a60208301856145fb565b615aa760408301846145fb565b949350505050565b600081519050615abe8161447c565b92915050565b600060208284031215615ada57615ad9614440565b5b6000615ae884828501615aaf565b91505092915050565b6000819050919050565b6000615b16615b11615b0c84615af1565b614581565b6144a8565b9050919050565b615b2681615afb565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615b618161446a565b82525050565b6000615b738383615b58565b60208301905092915050565b6000602082019050919050565b6000615b9782615b2c565b615ba18185615b37565b9350615bac83615b48565b8060005b83811015615bdd578151615bc48882615b67565b9750615bcf83615b7f565b925050600181019050615bb0565b5085935050505092915050565b600060a082019050615bff60008301886145fb565b615c0c6020830187615b1d565b8181036040830152615c1e8186615b8c565b9050615c2d6060830185614678565b615c3a60808301846145fb565b9695505050505050565b600060c082019050615c596000830189614678565b615c6660208301886145fb565b615c736040830187615b1d565b615c806060830186615b1d565b615c8d6080830185614678565b615c9a60a08301846145fb565b979650505050505050565b600080600060608486031215615cbe57615cbd614440565b5b6000615ccc8682870161505d565b9350506020615cdd8682870161505d565b9250506040615cee8682870161505d565b915050925092509256fea264697066735822122007a18f7a70d5574522a25e47e24d0d7c7c474c9ecf82cf694d140128838fe00e64736f6c63430008130033

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.