ETH Price: $3,395.11 (+1.32%)

Token

Reflection LP (RLP)
 

Overview

Max Total Supply

100,000,000 RLP

Holders

193

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000050173248 RLP

Value
$0.00
0x13d8d57aef17618b0100012e9945421e10893f27
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:
RLP

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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);
    }
}
/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * 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 default value returned by this function, unless
     * it's 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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 {}
}

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

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend() external;
  
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);


  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
  
}

interface IPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);

}

interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline) external;
}

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, Ownable {

  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  address public LP_Token;


  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;

  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;
  uint256 public totalDividendsWithdrawn;

  constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

  function distributeLPDividends(uint256 amount) public onlyOwner{
    require(totalSupply() > 0);

    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
 function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      totalDividendsWithdrawn += _withdrawableDividend;
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(LP_Token).transfer(user, _withdrawableDividend);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        totalDividendsWithdrawn -= _withdrawableDividend;
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }


  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that transfer tokens from one address to another.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param from The address to transfer from.
  /// @param to The address to transfer to.
  /// @param value The amount to be transferred.
  function _transfer(address from, address to, uint256 value) internal virtual override {
    require(false);

    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }

  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that burns an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);

    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}


contract RLPDividendTracker is Ownable, DividendPayingToken {
    struct AccountInfo {
        address account;
        uint256 withdrawableDividends;
        uint256 totalDividends;
        uint256 lastClaimTime;
    }

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    event ExcludeFromDividends(address indexed account, bool value);
    event Claim(address indexed account, uint256 amount);

    constructor()
        DividendPayingToken("Linq_Dividend_Tracker", "Linq_Dividend_Tracker")
    {}

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

    function updateLP_Token(address _lpToken) external onlyOwner {
        LP_Token = _lpToken;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Linq_Dividend_Tracker: No transfers allowed");
    }

    function excludeFromDividends(address account, bool value)
        external
        onlyOwner
    {
        require(excludedFromDividends[account] != value);
        excludedFromDividends[account] = value;
        if (value == true) {
            _setBalance(account, 0);
        } else {
            _setBalance(account, balanceOf(account));
        }
        emit ExcludeFromDividends(account, value);
    }

    function getAccount(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableDividends = withdrawableDividendOf(account);
        info.totalDividends = accumulativeDividendOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableDividends,
            info.totalDividends,
            info.lastClaimTime,
            totalDividendsWithdrawn
        );
    }

    function setBalance(address account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        _setBalance(account, newBalance);
    }

    function processAccount(address payable account)
        external
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }
}

contract RLP is ERC20, Ownable {
    IUniswapRouter public router;
    address public pair;

    bool private swapping;
    bool public swapEnabled = true;
    bool public claimEnabled;
    bool public tradingEnabled;

    RLPDividendTracker public dividendTracker;

    address public marketingWallet;

    uint256 public swapTokensAtAmount;
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    struct Taxes {
        uint256 liquidity;
        uint256 marketing;
        uint256 burn;
    }

    Taxes public buyTaxes = Taxes(3, 2, 1);
    Taxes public sellTaxes = Taxes(3, 2, 1);

    uint256 public totalBuyTax = 6;
    uint256 public totalSellTax = 6;

    mapping(address => bool) public _isBot;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    ///////////////
    //   Events  //
    ///////////////

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor(address _marketingWallet) ERC20("Reflection LP", "RLP") {
        dividendTracker = new RLPDividendTracker();
        setMarketingWallet(_marketingWallet);

        IUniswapRouter _router = IUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );

        router = _router;
        pair = _pair;
        setSwapTokensAtAmount(300000); //
        updateMaxWalletAmount(2000000);
        setMaxBuyAndSell(2000000, 2000000);

        _setAutomatedMarketMakerPair(_pair, true);

        dividendTracker.updateLP_Token(pair);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(address(0xdead), true);
        dividendTracker.excludeFromDividends(address(_router), true);

        excludeFromMaxWallet(address(_pair), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(_router), true);

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);

        _mint(owner(), 100000000 * (10**18));
    }

    receive() external payable {}

    function updateDividendTracker(address newAddress) public onlyOwner {
        RLPDividendTracker newDividendTracker = RLPDividendTracker(
            payable(newAddress)
        );
        newDividendTracker.excludeFromDividends(
            address(newDividendTracker),
            true
        );
        newDividendTracker.excludeFromDividends(address(this), true);
        newDividendTracker.excludeFromDividends(owner(), true);
        newDividendTracker.excludeFromDividends(address(router), true);
        dividendTracker = newDividendTracker;
    }

    /// @notice Manual claim the dividends
    function claim() external {
        require(claimEnabled, "Claim not enabled");
        dividendTracker.processAccount(payable(msg.sender));
    }

    function updateMaxWalletAmount(uint256 newNum) public onlyOwner {
        require(newNum >= 1000000, "Cannot set maxWallet lower than 1%");
        maxWallet = newNum * 10**18;
    }

    function setMaxBuyAndSell(uint256 maxBuy, uint256 maxSell)
        public
        onlyOwner
    {
        require(maxBuy >= 1000000, "Cannot set maxbuy lower than 1% ");
        require(maxSell >= 500000, "Cannot set maxsell lower than 0.5% ");
        maxBuyAmount = maxBuy * 10**18;
        maxSellAmount = maxSell * 10**18;
    }

    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * 10**18;
    }

    function excludeFromMaxWallet(address account, bool excluded)
        public
        onlyOwner
    {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    /// @notice Withdraw tokens sent by mistake.
    /// @param tokenAddress The address of the token to withdraw
    function rescueETH20Tokens(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).transfer(
            owner(),
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    /// @notice Send remaining ETH to dev
    /// @dev It will send all ETH to dev
    function forceSend() external onlyOwner {
        uint256 ETHbalance = address(this).balance;
        (bool success, ) = payable(marketingWallet).call{value: ETHbalance}("");
        require(success);
    }

    function trackerRescueETH20Tokens(address tokenAddress) external onlyOwner {
        dividendTracker.trackerRescueETH20Tokens(msg.sender, tokenAddress);
    }

    function updateRouter(address newRouter) external onlyOwner {
        router = IUniswapRouter(newRouter);
    }

    /////////////////////////////////
    // Exclude / Include functions //
    /////////////////////////////////

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    /// @dev "true" to exlcude, "false" to include
    function excludeFromDividends(address account, bool value)
        public
        onlyOwner
    {
        dividendTracker.excludeFromDividends(account, value);
    }

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

    function setBuyTaxes(uint256 _liquidity, uint256 _marketing, uint256 _burn) external onlyOwner {
        require(_liquidity + _marketing + _burn <= 20, "Fee must be <= 20%");
        buyTaxes = Taxes(_liquidity, _marketing, _burn);
        totalBuyTax = _liquidity + _marketing + _burn;
    }

    function setSellTaxes(uint256 _liquidity, uint256 _marketing, uint256 _burn) external onlyOwner {
        require(_liquidity + _marketing + _burn <= 20, "Fee must be <= 20%");
        sellTaxes = Taxes(_liquidity, _marketing, _burn);
        totalSellTax = _liquidity + _marketing + _burn;
    }

    /// @notice Enable or disable internal swaps
    /// @dev Set "true" to enable internal swaps for liquidity, treasury and dividends
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function activateTrading() external onlyOwner {
        require(!tradingEnabled, "Trading already enabled");
        tradingEnabled = true;
    }

    function setClaimEnabled(bool state) external onlyOwner {
        claimEnabled = state;
    }

    /// @param bot The bot address
    /// @param value "true" to blacklist, "false" to unblacklist
    function setBot(address bot, bool value) external onlyOwner {
        require(_isBot[bot] != value);
        _isBot[bot] = value;
    }

    function setLP_Token(address _lpToken) external onlyOwner {
        dividendTracker.updateLP_Token(_lpToken);
    }

    /// @dev Set new pairs created due to listing in new DEX
    function setAutomatedMarketMakerPair(address newPair, bool value)
        external
        onlyOwner
    {
        _setAutomatedMarketMakerPair(newPair, value);
    }

    function _setAutomatedMarketMakerPair(address newPair, bool value) private {
        require(
            automatedMarketMakerPairs[newPair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[newPair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(newPair, true);
        }

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    //////////////////////
    // Getter Functions //
    //////////////////////

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountInfo(address account)
        external
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    ////////////////////////
    // Transfer Functions //
    ////////////////////////

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (
            !_isExcludedFromFees[from] && !_isExcludedFromFees[to] && !swapping
        ) {
            require(tradingEnabled, "Trading not active");
            if (automatedMarketMakerPairs[to]) {
                require(
                    amount <= maxSellAmount,
                    "You are exceeding maxSellAmount"
                );
            } else if (automatedMarketMakerPairs[from])
                require(
                    amount <= maxBuyAmount,
                    "You are exceeding maxBuyAmount"
                );
            if (!_isExcludedFromMaxWallet[to]) {
                require(
                    amount + balanceOf(to) <= maxWallet,
                    "Unable to exceed Max Wallet"
                );
            }
        }

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

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

        if (
            canSwap &&
            !swapping &&
            swapEnabled &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            if (totalSellTax > 0) {
                swapAndLiquify(swapTokensAtAmount);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from])
            takeFee = false;

        if (takeFee) {
            uint256 feeAmt;
            if (automatedMarketMakerPairs[to])
                feeAmt = (amount * totalSellTax) / 100;
            else if (automatedMarketMakerPairs[from])
                feeAmt = (amount * totalBuyTax) / 100;

            amount = amount - feeAmt;
            super._transfer(from, address(this), feeAmt);
        }
        super._transfer(from, to, amount);

        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 toSwapForLiq = ((tokens * sellTaxes.liquidity) / totalSellTax) / 2;
        uint256 tokensToAddLiquidityWith = ((tokens * sellTaxes.liquidity) / totalSellTax) / 2;
        uint256 toSwapForMarketing = (tokens * sellTaxes.marketing) / totalSellTax;

        uint256 toBurn = (tokens * sellTaxes.burn) / totalSellTax;

        swapTokensForETH(toSwapForLiq);

        uint256 currentbalance = address(this).balance;

        if (currentbalance > 0) {
            // Add liquidity to uni
            addLiquidity(tokensToAddLiquidityWith, currentbalance);
        }

        swapTokensForETH(toSwapForMarketing);

        uint256 EthTaxBalance = address(this).balance;

        // Send ETH to dev
        uint256 devAmt = EthTaxBalance;

        if (devAmt > 0) {
            (bool success, ) = payable(marketingWallet).call{value: devAmt}("");
            require(success, "Failed to send ETH to dev wallet");
        }

        uint256 lpBalance = IERC20(pair).balanceOf(address(this));

        //Send LP to dividends
        uint256 dividends = lpBalance;

        if (dividends > 0) {
            bool success = IERC20(pair).transfer(
                address(dividendTracker),
                dividends
            );
            if (success) {
                dividendTracker.distributeLPDividends(dividends);
                emit SendDividends(tokens, dividends);
            }
        }

        if (toBurn > 0) {
            _burn(address(this), toBurn);
        }
    }

    // transfers LP from the owners wallet to holders // must approve this contract, on pair contract before calling
    function ManualLiquidityDistribution(uint256 amount) public onlyOwner {
        bool success = IERC20(pair).transferFrom(
            msg.sender,
            address(dividendTracker),
            amount
        );
        if (success) {
            dividendTracker.distributeLPDividends(amount);
        }
    }

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"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":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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":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"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualLiquidityDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"buyTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract RLPDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bot","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setClaimEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"setLP_Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"}],"name":"setMaxBuyAndSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","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":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"trackerRescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6007805460ff60a81b1916600160a81b17905560036080819052600260a0819052600160c0819052600e839055600f829055601081905561014060405260e0839052610100829052610120819052601192909255601255601355600660148190556015553480156200007057600080fd5b5060405162005c5338038062005c53833981016040819052620000939162000ba3565b6040518060400160405280600d81526020016c05265666c656374696f6e204c5609c1b815250604051806040016040528060038152602001620524c560ec1b8152508160039080519060200190620000ed92919062000aef565b5080516200010390600490602084019062000aef565b505050620001206200011a6200066160201b60201c565b62000665565b6040516200012e9062000b7e565b604051809103906000f0801580156200014b573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03929092169190911790556200017781620006b7565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001cc57600080fd5b505afa158015620001e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000207919062000ba3565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025057600080fd5b505afa15801562000265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028b919062000ba3565b6040518363ffffffff1660e01b8152600401620002aa92919062000be7565b602060405180830381600087803b158015620002c557600080fd5b505af1158015620002da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000300919062000ba3565b600680546001600160a01b038086166001600160a01b0319928316179092556007805492841692909116919091179055905062000340620493e0620006e3565b6200034e621e848062000707565b6200035d621e8480806200075a565b6200036a816001620007e2565b60085460075460405163225b5ecf60e11b81526001600160a01b03928316926344b6bd9e92620003a09291169060040162000bd3565b600060405180830381600087803b158015620003bb57600080fd5b505af1158015620003d0573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b039091169250630483f7a091506200040890839060019060040162000c01565b600060405180830381600087803b1580156200042357600080fd5b505af115801562000438573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b039091169250630483f7a091506200047090309060019060040162000c01565b600060405180830381600087803b1580156200048b57600080fd5b505af1158015620004a0573d6000803e3d6000fd5b50506008546001600160a01b03169150630483f7a09050620004c1620008f7565b60016040518363ffffffff1660e01b8152600401620004e292919062000c01565b600060405180830381600087803b158015620004fd57600080fd5b505af115801562000512573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b039091169250630483f7a091506200054c9061dead9060019060040162000c01565b600060405180830381600087803b1580156200056757600080fd5b505af11580156200057c573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b039091169250630483f7a09150620005b490859060019060040162000c01565b600060405180830381600087803b158015620005cf57600080fd5b505af1158015620005e4573d6000803e3d6000fd5b50505050620005fb8160016200090660201b60201c565b6200060830600162000906565b6200061582600162000906565b6200062b62000623620008f7565b60016200093b565b620006383060016200093b565b6200065862000646620008f7565b6a52b7d2dcc80cd2e4000000620009e9565b50505062000e8d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620006c162000aa2565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b620006ed62000aa2565b6200070181670de0b6b3a764000062000e18565b600a5550565b6200071162000aa2565b620f4240811015620007405760405162461bcd60e51b8152600401620007379062000cc7565b60405180910390fd5b6200075481670de0b6b3a764000062000e18565b600d5550565b6200076462000aa2565b620f42408210156200078a5760405162461bcd60e51b8152600401620007379062000d3e565b6207a120811015620007b05760405162461bcd60e51b8152600401620007379062000c27565b620007c482670de0b6b3a764000062000e18565b600b55620007db81670de0b6b3a764000062000e18565b600c555050565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415620008245760405162461bcd60e51b8152600401620007379062000c6a565b6001600160a01b0382166000908152601860205260409020805460ff19168215801591909117909155620008bb5760085460405162241fbd60e51b81526001600160a01b0390911690630483f7a0906200088690859060019060040162000c01565b600060405180830381600087803b158015620008a157600080fd5b505af1158015620008b6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6200091062000aa2565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6200094562000aa2565b6001600160a01b03821660009081526017602052604090205460ff1615158115151415620009875760405162461bcd60e51b8152600401620007379062000d73565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790620009dd90849062000c1c565b60405180910390a25050565b6001600160a01b03821662000a125760405162461bcd60e51b8152600401620007379062000dbd565b62000a206000838362000aea565b806002600082825462000a34919062000dfd565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000a8890859062000df4565b60405180910390a362000a9e6000838362000aea565b5050565b62000aac62000661565b6001600160a01b031662000abf620008f7565b6001600160a01b03161462000ae85760405162461bcd60e51b8152600401620007379062000d09565b565b505050565b82805462000afd9062000e3a565b90600052602060002090601f01602090048101928262000b21576000855562000b6c565b82601f1062000b3c57805160ff191683800117855562000b6c565b8280016001018555821562000b6c579182015b8281111562000b6c57825182559160200191906001019062000b4f565b5062000b7a92915062000b8c565b5090565b611b45806200410e83390190565b5b8082111562000b7a576000815560010162000b8d565b60006020828403121562000bb5578081fd5b81516001600160a01b038116811462000bcc578182fd5b9392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b901515815260200190565b60208082526023908201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60408201526201a92960ed1b606082015260800190565b60208082526038908201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160408201527f6c72656164792073657420746f20746861742076616c75650000000000000000606082015260800190565b60208082526022908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015261312560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e6e6f7420736574206d6178627579206c6f776572207468616e20312520604082015260600190565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6000821982111562000e135762000e1362000e77565b500190565b600081600019048311821515161562000e355762000e3562000e77565b500290565b60028104600182168062000e4f57607f821691505b6020821081141562000e7157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6132718062000e9d6000396000f3fe6080604052600436106103855760003560e01c806379b447bd116101d1578063abb8105211610102578063d2fcc001116100a0578063f2fde38b1161006f578063f2fde38b146109cb578063f66895a3146109eb578063f887ea4014610a00578063f8b45b0514610a155761038c565b8063d2fcc00114610956578063dd62ed3e14610976578063e01af92c14610996578063e2f45605146109b65761038c565b8063bdf1436d116100dc578063bdf1436d146108d6578063c0246668146108f6578063c18bc19514610916578063c851cc32146109365761038c565b8063abb8105214610876578063afa4f3b214610896578063b62496f5146108b65761038c565b806392929a091161016f578063a457c2d711610149578063a457c2d714610801578063a8aa1b3114610821578063a8b9d24014610836578063a9059cbb146108565761038c565b806392929a09146107ac57806395d89b41146107cc5780639a7a23d6146107e15761038c565b806388bdd9be116101ab57806388bdd9be1461074257806388e765ff146107625780638c9684f9146107775780638da5cb5b146107975761038c565b806379b447bd146106cd5780637b510fe8146106ed578063864701a51461071e5761038c565b806330bb4cff116102b65780634fbee193116102545780636ddd1713116102235780636ddd17131461066e57806370a0823114610683578063715018a6146106a357806375f0a874146106b85761038c565b80634fbee193146105f95780635d098b381461061957806366d602ae146106395780636843cd841461064e5761038c565b80633950935111610290578063395093511461059a57806346469afb146105ba5780634ada218b146105cf5780634e71d92d146105e45761038c565b806330bb4cff14610543578063313ce56714610558578063342aa8b51461057a5761038c565b806318160ddd1161032357806323b872dd116102fd57806323b872dd146104cc5780632866ed21146104ec5780632c1f5216146105015780632e1ab904146105235761038c565b806318160ddd146104755780631870517a146104975780631bff7898146104b75761038c565b8063095ea7b31161035f578063095ea7b3146103fe5780630a78097d1461042b5780630bd05b691461044b57806312b77e8a146104605761038c565b80630483f7a01461039157806306fdde03146103b357806308733214146103de5761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103b16103ac36600461281a565b610a2a565b005b3480156103bf57600080fd5b506103c8610a99565b6040516103d59190612a98565b60405180910390f35b3480156103ea57600080fd5b506103b16103f9366004612943565b610b2b565b34801561040a57600080fd5b5061041e610419366004612847565b610bb5565b6040516103d59190612a8d565b34801561043757600080fd5b506103b1610446366004612763565b610bd7565b34801561045757600080fd5b506103b1610ce5565b34801561046c57600080fd5b506103b1610d2c565b34801561048157600080fd5b5061048a610da6565b6040516103d591906130ae565b3480156104a357600080fd5b506103b16104b2366004612943565b610dac565b3480156104c357600080fd5b5061048a610e2d565b3480156104d857600080fd5b5061041e6104e73660046127da565b610e33565b3480156104f857600080fd5b5061041e610e61565b34801561050d57600080fd5b50610516610e71565b6040516103d5919061299e565b34801561052f57600080fd5b506103b161053e366004612763565b610e80565b34801561054f57600080fd5b5061048a610eed565b34801561056457600080fd5b5061056d610f6f565b6040516103d5919061314b565b34801561058657600080fd5b506103b161059536600461281a565b610f74565b3480156105a657600080fd5b5061041e6105b5366004612847565b610fd3565b3480156105c657600080fd5b5061048a610fff565b3480156105db57600080fd5b5061041e611005565b3480156105f057600080fd5b506103b1611015565b34801561060557600080fd5b5061041e610614366004612763565b6110c3565b34801561062557600080fd5b506103b1610634366004612763565b6110e1565b34801561064557600080fd5b5061048a61110b565b34801561065a57600080fd5b5061048a610669366004612763565b611111565b34801561067a57600080fd5b5061041e611198565b34801561068f57600080fd5b5061048a61069e366004612763565b6111a8565b3480156106af57600080fd5b506103b16111c3565b3480156106c457600080fd5b506105166111d7565b3480156106d957600080fd5b506103b16106e8366004612922565b6111e6565b3480156106f957600080fd5b5061070d610708366004612763565b611262565b6040516103d5959493929190612a5f565b34801561072a57600080fd5b506107336112fd565b6040516103d593929190613135565b34801561074e57600080fd5b506103b161075d366004612763565b611309565b34801561076e57600080fd5b5061048a6114c3565b34801561078357600080fd5b506103b1610792366004612763565b6114c9565b3480156107a357600080fd5b50610516611503565b3480156107b857600080fd5b506103b16107c73660046128ba565b611512565b3480156107d857600080fd5b506103c8611538565b3480156107ed57600080fd5b506103b16107fc36600461281a565b611547565b34801561080d57600080fd5b5061041e61081c366004612847565b611559565b34801561082d57600080fd5b506105166115a1565b34801561084257600080fd5b5061048a610851366004612763565b6115b0565b34801561086257600080fd5b5061041e610871366004612847565b6115e1565b34801561088257600080fd5b5061041e610891366004612763565b6115f9565b3480156108a257600080fd5b506103b16108b13660046128f2565b61160e565b3480156108c257600080fd5b5061041e6108d1366004612763565b61162e565b3480156108e257600080fd5b506103b16108f13660046128f2565b611643565b34801561090257600080fd5b506103b161091136600461281a565b61170f565b34801561092257600080fd5b506103b16109313660046128f2565b6117b6565b34801561094257600080fd5b506103b1610951366004612763565b6117f9565b34801561096257600080fd5b506103b161097136600461281a565b611823565b34801561098257600080fd5b5061048a6109913660046127a2565b611856565b3480156109a257600080fd5b506103b16109b13660046128ba565b611881565b3480156109c257600080fd5b5061048a6118a7565b3480156109d757600080fd5b506103b16109e6366004612763565b6118ad565b3480156109f757600080fd5b506107336118e4565b348015610a0c57600080fd5b506105166118f0565b348015610a2157600080fd5b5061048a6118ff565b610a32611905565b60085460405162241fbd60e51b81526001600160a01b0390911690630483f7a090610a6390859085906004016129f0565b600060405180830381600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050505050565b606060038054610aa8906131c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad4906131c7565b8015610b215780601f10610af657610100808354040283529160200191610b21565b820191906000526020600020905b815481529060010190602001808311610b0457829003601f168201915b5050505050905090565b610b33611905565b601481610b408486613159565b610b4a9190613159565b1115610b715760405162461bcd60e51b8152600401610b6890612b2e565b60405180910390fd5b60408051606081018252848152602081018490520181905260118390556012829055601381905580610ba38385613159565b610bad9190613159565b601555505050565b600080610bc0611944565b9050610bcd818585611948565b5060019392505050565b610bdf611905565b806001600160a01b031663a9059cbb610bf6611503565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610c2290309060040161299e565b60206040518083038186803b158015610c3a57600080fd5b505afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061290a565b6040518363ffffffff1660e01b8152600401610c8f929190612a0b565b602060405180830381600087803b158015610ca957600080fd5b505af1158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906128d6565b5050565b610ced611905565b600754600160b81b900460ff1615610d175760405162461bcd60e51b8152600401610b6890612e44565b6007805460ff60b81b1916600160b81b179055565b610d34611905565b60095460405147916000916001600160a01b03909116908390610d569061299b565b60006040518083038185875af1925050503d8060008114610d93576040519150601f19603f3d011682016040523d82523d6000602084013e610d98565b606091505b5050905080610ce157600080fd5b60025490565b610db4611905565b601481610dc18486613159565b610dcb9190613159565b1115610de95760405162461bcd60e51b8152600401610b6890612b2e565b604080516060810182528481526020810184905201819052600e839055600f829055601081905580610e1b8385613159565b610e259190613159565b601455505050565b60155481565b600080610e3e611944565b9050610e4b8582856119fc565b610e56858585611a46565b506001949350505050565b600754600160b01b900460ff1681565b6008546001600160a01b031681565b610e88611905565b60085460405163225b5ecf60e11b81526001600160a01b03909116906344b6bd9e90610eb890849060040161299e565b600060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b5050505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610f3257600080fd5b505afa158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a919061290a565b905090565b601290565b610f7c611905565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415610fa857600080fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b600080610fde611944565b9050610bcd818585610ff08589611856565b610ffa9190613159565b611948565b60145481565b600754600160b81b900460ff1681565b600754600160b01b900460ff1661103e5760405162461bcd60e51b8152600401610b6890612de4565b60085460405163807ab4f760e01b81526001600160a01b039091169063807ab4f79061106e90339060040161299e565b602060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c091906128d6565b50565b6001600160a01b031660009081526017602052604090205460ff1690565b6110e9611905565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a082319061114290859060040161299e565b60206040518083038186803b15801561115a57600080fd5b505afa15801561116e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611192919061290a565b92915050565b600754600160a81b900460ff1681565b6001600160a01b031660009081526020819052604090205490565b6111cb611905565b6111d56000611f16565b565b6009546001600160a01b031681565b6111ee611905565b620f42408210156112115760405162461bcd60e51b8152600401610b6890612f61565b6207a1208110156112345760405162461bcd60e51b8152600401610b6890612bc8565b61124682670de0b6b3a7640000613191565b600b5561125b81670de0b6b3a7640000613191565b600c555050565b60085460405163fbcbc0f160e01b815260009182918291829182916001600160a01b03169063fbcbc0f19061129b90899060040161299e565b60a06040518083038186803b1580156112b357600080fd5b505afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190612872565b939a9299509097509550909350915050565b600e54600f5460105483565b611311611905565b60405162241fbd60e51b815281906001600160a01b03821690630483f7a0906113419084906001906004016129f0565b600060405180830381600087803b15801561135b57600080fd5b505af115801561136f573d6000803e3d6000fd5b505060405162241fbd60e51b81526001600160a01b0384169250630483f7a091506113a19030906001906004016129f0565b600060405180830381600087803b1580156113bb57600080fd5b505af11580156113cf573d6000803e3d6000fd5b50505050806001600160a01b0316630483f7a06113ea611503565b60016040518363ffffffff1660e01b81526004016114099291906129f0565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060065460405162241fbd60e51b81526001600160a01b038086169450630483f7a0935061146d9216906001906004016129f0565b600060405180830381600087803b15801561148757600080fd5b505af115801561149b573d6000803e3d6000fd5b5050600880546001600160a01b0319166001600160a01b039490941693909317909255505050565b600b5481565b6114d1611905565b60085460405163497ec82360e01b81526001600160a01b039091169063497ec82390610eb890339085906004016129b2565b6005546001600160a01b031690565b61151a611905565b60078054911515600160b01b0260ff60b01b19909216919091179055565b606060048054610aa8906131c7565b61154f611905565b610ce18282611f68565b600080611564611944565b905060006115728286611856565b9050838110156115945760405162461bcd60e51b8152600401610b6890613069565b610e568286868403611948565b6007546001600160a01b031681565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d2409061114290859060040161299e565b6000806115ec611944565b9050610bcd818585611a46565b60166020526000908152604090205460ff1681565b611616611905565b61162881670de0b6b3a7640000613191565b600a5550565b60186020526000908152604090205460ff1681565b61164b611905565b6007546008546040516323b872dd60e01b81526000926001600160a01b03908116926323b872dd92611685923392169087906004016129cc565b602060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d791906128d6565b90508015610ce157600854604051633b79ab6760e21b81526001600160a01b039091169063ede6ad9c90610a639085906004016130ae565b611717611905565b6001600160a01b03821660009081526017602052604090205460ff16151581151514156117565760405162461bcd60e51b8152600401610b689061301f565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7906117aa908490612a8d565b60405180910390a25050565b6117be611905565b620f42408110156117e15760405162461bcd60e51b8152600401610b6890612d25565b6117f381670de0b6b3a7640000613191565b600d5550565b611801611905565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61182b611905565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611889611905565b60078054911515600160a81b0260ff60a81b19909216919091179055565b600a5481565b6118b5611905565b6001600160a01b0381166118db5760405162461bcd60e51b8152600401610b6890612c0b565b6110c081611f16565b60115460125460135483565b6006546001600160a01b031681565b600d5481565b61190d611944565b6001600160a01b031661191e611503565b6001600160a01b0316146111d55760405162461bcd60e51b8152600401610b6890612e0f565b3390565b6001600160a01b03831661196e5760405162461bcd60e51b8152600401610b6890612fdb565b6001600160a01b0382166119945760405162461bcd60e51b8152600401610b6890612c51565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906119ef9085906130ae565b60405180910390a3505050565b6000611a088484611856565b90506000198114611a405781811015611a335760405162461bcd60e51b8152600401610b6890612d67565b611a408484848403611948565b50505050565b6001600160a01b038316611a6c5760405162461bcd60e51b8152600401610b6890612f96565b6001600160a01b038216611a925760405162461bcd60e51b8152600401610b6890612aeb565b6001600160a01b03831660009081526017602052604090205460ff16158015611ad457506001600160a01b03821660009081526017602052604090205460ff16155b8015611aea5750600754600160a01b900460ff16155b15611bf757600754600160b81b900460ff16611b185760405162461bcd60e51b8152600401610b6890612b9c565b6001600160a01b03821660009081526018602052604090205460ff1615611b6057600c54811115611b5b5760405162461bcd60e51b8152600401610b6890612eb2565b611ba3565b6001600160a01b03831660009081526018602052604090205460ff1615611ba357600b54811115611ba35760405162461bcd60e51b8152600401610b6890612ee9565b6001600160a01b03821660009081526019602052604090205460ff16611bf757600d54611bcf836111a8565b611bd99083613159565b1115611bf75760405162461bcd60e51b8152600401610b6890612e7b565b80611c0d57611c0883836000612075565b611f11565b6000611c18306111a8565b600a5490915081108015908190611c395750600754600160a01b900460ff16155b8015611c4e5750600754600160a81b900460ff165b8015611c7257506001600160a01b03841660009081526018602052604090205460ff165b8015611c9757506001600160a01b03851660009081526017602052604090205460ff16155b8015611cbc57506001600160a01b03841660009081526017602052604090205460ff16155b15611cf5576007805460ff60a01b1916600160a01b17905560155415611ce757611ce7600a54612176565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526017602052604090205460ff600160a01b909204821615911680611d4357506001600160a01b03851660009081526017602052604090205460ff165b15611d4c575060005b6001600160a01b03851660009081526018602052604090205460ff16158015611d8e57506001600160a01b03861660009081526018602052604090205460ff16155b15611d97575060005b8015611e36576001600160a01b03851660009081526018602052604081205460ff1615611ddf57606460155486611dce9190613191565b611dd89190613171565b9050611e1d565b6001600160a01b03871660009081526018602052604090205460ff1615611e1d57606460145486611e109190613191565b611e1a9190613171565b90505b611e2781866131b0565b9450611e34873083612075565b505b611e41868686612075565b6008546001600160a01b031663e30443bc87611e5c816111a8565b6040518363ffffffff1660e01b8152600401611e79929190612a0b565b600060405180830381600087803b158015611e9357600080fd5b505af1925050508015611ea4575060015b506008546001600160a01b031663e30443bc86611ec0816111a8565b6040518363ffffffff1660e01b8152600401611edd929190612a0b565b600060405180830381600087803b158015611ef757600080fd5b505af1925050508015611f08575060015b610a9157610a91565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415611fa75760405162461bcd60e51b8152600401610b6890612c93565b6001600160a01b0382166000908152601860205260409020805460ff191682158015919091179091556120395760085460405162241fbd60e51b81526001600160a01b0390911690630483f7a0906120069085906001906004016129f0565b600060405180830381600087803b15801561202057600080fd5b505af1158015612034573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661209b5760405162461bcd60e51b8152600401610b6890612f96565b6001600160a01b0382166120c15760405162461bcd60e51b8152600401610b6890612aeb565b6120cc838383611f11565b6001600160a01b038316600090815260208190526040902054818110156121055760405162461bcd60e51b8152600401610b6890612d9e565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121639086906130ae565b60405180910390a3611a40848484611f11565b60155460115460009160029161218c9085613191565b6121969190613171565b6121a09190613171565b905060006002601554601160000154856121ba9190613191565b6121c49190613171565b6121ce9190613171565b6015546012549192506000916121e49086613191565b6121ee9190613171565b6015546013549192506000916122049087613191565b61220e9190613171565b905061221984612496565b47801561222a5761222a84826125e5565b61223383612496565b478080156122be576009546040516000916001600160a01b03169083906122599061299b565b60006040518083038185875af1925050503d8060008114612296576040519150601f19603f3d011682016040523d82523d6000602084013e61229b565b606091505b50509050806122bc5760405162461bcd60e51b8152600401610b6890612cf0565b505b6007546040516370a0823160e01b81526000916001600160a01b0316906370a08231906122ef90309060040161299e565b60206040518083038186803b15801561230757600080fd5b505afa15801561231b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233f919061290a565b905080801561247a5760075460085460405163a9059cbb60e01b81526000926001600160a01b039081169263a9059cbb9261238292909116908690600401612a0b565b602060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d491906128d6565b9050801561247857600854604051633b79ab6760e21b81526001600160a01b039091169063ede6ad9c9061240c9085906004016130ae565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38b8360405161246f929190613127565b60405180910390a15b505b851561248a5761248a308761268c565b50505050505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124d957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561252d57600080fd5b505afa158015612541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125659190612786565b8160018151811061258657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546125ac9130911684611948565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610a639085906000908690309042906004016130b7565b6006546125fd9030906001600160a01b031684611948565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061263a9030908790600090819084904290600401612a24565b6060604051808303818588803b15801561265357600080fd5b505af1158015612667573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee6919061296e565b6001600160a01b0382166126b25760405162461bcd60e51b8152600401610b6890612f20565b6126be82600083611f11565b6001600160a01b038216600090815260208190526040902054818110156126f75760405162461bcd60e51b8152600401610b6890612b5a565b6001600160a01b0383166000818152602081905260408082208585039055600280548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061274f9086906130ae565b60405180910390a3611f1183600084611f11565b600060208284031215612774578081fd5b813561277f81613218565b9392505050565b600060208284031215612797578081fd5b815161277f81613218565b600080604083850312156127b4578081fd5b82356127bf81613218565b915060208301356127cf81613218565b809150509250929050565b6000806000606084860312156127ee578081fd5b83356127f981613218565b9250602084013561280981613218565b929592945050506040919091013590565b6000806040838503121561282c578182fd5b823561283781613218565b915060208301356127cf8161322d565b60008060408385031215612859578182fd5b823561286481613218565b946020939093013593505050565b600080600080600060a08688031215612889578081fd5b855161289481613218565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000602082840312156128cb578081fd5b813561277f8161322d565b6000602082840312156128e7578081fd5b815161277f8161322d565b600060208284031215612903578081fd5b5035919050565b60006020828403121561291b578081fd5b5051919050565b60008060408385031215612934578182fd5b50508035926020909101359150565b600080600060608486031215612957578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612982578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b901515815260200190565b6000602080835283518082850152825b81811015612ac457858101830151858201604001528201612aa8565b81811115612ad55783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260129082015271466565206d757374206265203c3d2032302560701b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526012908201527154726164696e67206e6f742061637469766560701b604082015260600190565b60208082526023908201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60408201526201a92960ed1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526038908201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160408201527f6c72656164792073657420746f20746861742076616c75650000000000000000606082015260800190565b6020808252818101527f4661696c656420746f2073656e642045544820746f206465762077616c6c6574604082015260600190565b60208082526022908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015261312560f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526011908201527010db185a5b481b9bdd08195b98589b1959607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54726164696e6720616c726561647920656e61626c6564000000000000000000604082015260600190565b6020808252601b908201527f556e61626c6520746f20657863656564204d61782057616c6c65740000000000604082015260600190565b6020808252601f908201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604082015260600190565b6020808252601e908201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252818101527f43616e6e6f7420736574206d6178627579206c6f776572207468616e20312520604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156131065784516001600160a01b0316835293830193918301916001016130e1565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561316c5761316c613202565b500190565b60008261318c57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156131ab576131ab613202565b500290565b6000828210156131c2576131c2613202565b500390565b6002810460018216806131db57607f821691505b602082108114156131fc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146110c057600080fd5b80151581146110c057600080fdfea2646970667358221220ab2916f68a075f4de1876f58c4fdb0c9adc2d8f9ba4abb171d18c9060e517ba264736f6c6343000800003360806040523480156200001157600080fd5b5060408051808201825260158082527f4c696e715f4469766964656e645f547261636b65720000000000000000000000602080840182815285518087019096529285528401528151919291839183916200006e91600391620000ff565b50805162000084906004906020840190620000ff565b505050620000a16200009b620000a960201b60201c565b620000ad565b5050620001e2565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010d90620001a5565b90600052602060002090601f0160209004810192826200013157600085556200017c565b82601f106200014c57805160ff19168380011785556200017c565b828001600101855582156200017c579182015b828111156200017c5782518255916020019190600101906200015f565b506200018a9291506200018e565b5090565b5b808211156200018a57600081556001016200018f565b600281046001821680620001ba57607f821691505b60208210811415620001dc57634e487b7160e01b600052602260045260246000fd5b50919050565b61195380620001f26000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063a8b9d240116100a2578063e30443bc11610071578063e30443bc146103c9578063ede6ad9c146103dc578063f2fde38b146103ef578063fbcbc0f114610402576101e5565b8063a8b9d2401461037d578063a9059cbb14610390578063aafd847a146103a3578063dd62ed3e146103b6576101e5565b806391b89fba116100de57806391b89fba1461034757806395d89b411461035a5780639e1e066114610362578063a457c2d71461036a576101e5565b8063715018a61461031c578063807ab4f71461032457806385a6b3ae146103375780638da5cb5b1461033f576101e5565b806327ce014711610187578063497ec82311610156578063497ec823146102db5780634e7b827f146102ee5780636a4740021461030157806370a0823114610309576101e5565b806327ce01471461028d578063313ce567146102a057806339509351146102b557806344b6bd9e146102c8576101e5565b80631162c4b6116101c35780631162c4b61461023d57806318160ddd14610252578063226cfa3d1461026757806323b872dd1461027a576101e5565b80630483f7a0146101ea57806306fdde03146101ff578063095ea7b31461021d575b600080fd5b6101fd6101f836600461134d565b610426565b005b6102076104f0565b6040516102149190611457565b60405180910390f35b61023061022b36600461137a565b610582565b604051610214919061144c565b6102456105a6565b60405161021491906113f1565b61025a6105b5565b60405161021491906117a4565b61025a6102753660046112b9565b6105bb565b61023061028836600461130d565b6105cd565b61025a61029b3660046112b9565b6105fb565b6102a861065c565b60405161021491906117ad565b6102306102c336600461137a565b610661565b6101fd6102d63660046112b9565b61068d565b6101fd6102e93660046112d5565b6106b7565b6102306102fc3660046112b9565b6107b9565b6101fd6107ce565b61025a6103173660046112b9565b6107da565b6101fd6107f5565b6102306103323660046112b9565b610809565b61025a61088c565b610245610892565b61025a6103553660046112b9565b6108a1565b6102076108ac565b61025a6108bb565b61023061037836600461137a565b6108c1565b61025a61038b3660046112b9565b610912565b61023061039e36600461137a565b61093e565b61025a6103b13660046112b9565b610956565b61025a6103c43660046112d5565b610971565b6101fd6103d736600461137a565b61099c565b6101fd6103ea3660046113c1565b6109d8565b6101fd6103fd3660046112b9565b610a76565b6104156104103660046112b9565b610aad565b60405161021495949392919061141e565b61042e610b29565b6001600160a01b0382166000908152600c602052604090205460ff161515811515141561045a57600080fd5b6001600160a01b0382166000908152600c60205260409020805460ff19168215159081179091556001141561049957610494826000610b68565b6104ab565b6104ab826104a6846107da565b610b68565b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be826040516104e4919061144c565b60405180910390a25050565b6060600380546104ff906118a9565b80601f016020809104026020016040519081016040528092919081815260200182805461052b906118a9565b80156105785780601f1061054d57610100808354040283529160200191610578565b820191906000526020600020905b81548152906001019060200180831161055b57829003601f168201915b5050505050905090565b60008061058d610bc1565b905061059a818585610bc5565b60019150505b92915050565b6006546001600160a01b031681565b60025490565b600d6020526000908152604090205481565b6000806105d8610bc1565b90506105e5858285610c79565b6105f0858585610cbd565b506001949350505050565b6001600160a01b038116600090815260086020526040812054600160801b9061064a906106459061063f61063a610631886107da565b60075490610cd5565b610d21565b90610d31565b610d6f565b6106549190611814565b90505b919050565b601290565b60008061066c610bc1565b905061059a81858561067e8589610971565b61068891906117fc565b610bc5565b610695610b29565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6106bf610b29565b6040516370a0823160e01b81526001600160a01b0382169063a9059cbb90849083906370a08231906106f59030906004016113f1565b60206040518083038186803b15801561070d57600080fd5b505afa158015610721573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074591906113d9565b6040518363ffffffff1660e01b8152600401610762929190611405565b602060405180830381600087803b15801561077c57600080fd5b505af1158015610790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b491906113a5565b505050565b600c6020526000908152604090205460ff1681565b6107d733610d82565b50565b6001600160a01b031660009081526020819052604090205490565b6107fd610b29565b6108076000610f25565b565b6000610813610b29565b600061081e83610d82565b90508015610883576001600160a01b0383166000818152600d602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4906108719084906117a4565b60405180910390a26001915050610657565b50600092915050565b600a5481565b6005546001600160a01b031690565b600061065482610912565b6060600480546104ff906118a9565b600b5481565b6000806108cc610bc1565b905060006108da8286610971565b9050838110156109055760405162461bcd60e51b81526004016108fc90611728565b60405180910390fd5b6105f08286868403610bc5565b6001600160a01b03811660009081526009602052604081205461065490610938846105fb565b90610f77565b600080610949610bc1565b905061059a818585610cbd565b6001600160a01b031660009081526009602052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6109a4610b29565b6001600160a01b0382166000908152600c602052604090205460ff16156109ca576109d4565b6109d48282610b68565b5050565b6109e0610b29565b60006109ea6105b5565b116109f457600080fd5b80156107d757610a26610a056105b5565b610a1383600160801b610cd5565b610a1d9190611814565b60075490610fb9565b60075560405133907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651190610a5b9084906117a4565b60405180910390a2600a54610a709082610fb9565b600a5550565b610a7e610b29565b6001600160a01b038116610aa45760405162461bcd60e51b81526004016108fc906114ec565b6107d781610f25565b6000806000806000610abd611288565b6001600160a01b0387168152610ad287610912565b6020820152610ae0876105fb565b60408281019182526001600160a01b03989098166000908152600d60209081529890205460608301819052825198909201519051600b5498999198909750919550909350915050565b610b31610bc1565b6001600160a01b0316610b42610892565b6001600160a01b0316146108075760405162461bcd60e51b81526004016108fc9061166e565b6000610b73836107da565b905080821115610b9b576000610b898383610f77565b9050610b958482610fe8565b506107b4565b808210156107b4576000610baf8284610f77565b9050610bbb848261104c565b50505050565b3390565b6001600160a01b038316610beb5760405162461bcd60e51b81526004016108fc906116e4565b6001600160a01b038216610c115760405162461bcd60e51b81526004016108fc90611532565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610c6c9085906117a4565b60405180910390a3505050565b6000610c858484610971565b90506000198114610bbb5781811015610cb05760405162461bcd60e51b81526004016108fc906115ab565b610bbb8484848403610bc5565b60405162461bcd60e51b81526004016108fc90611623565b600082610ce4575060006105a0565b6000610cf08385611834565b905082610cfd8583611814565b14610d1a5760405162461bcd60e51b81526004016108fc906115e2565b9392505050565b6000818181121561065457600080fd5b600080610d3e83856117bb565b905060008312158015610d515750838112155b80610d665750600083128015610d6657508381125b610d1a57600080fd5b600080821215610d7e57600080fd5b5090565b600080610d8e83610912565b90508015610883576001600160a01b038316600090815260096020526040902054610db99082610fb9565b6001600160a01b038416600090815260096020526040812091909155600b8054839290610de79084906117fc565b92505081905550826001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051610e2791906117a4565b60405180910390a260065460405163a9059cbb60e01b81526000916001600160a01b03169063a9059cbb90610e629087908690600401611405565b602060405180830381600087803b158015610e7c57600080fd5b505af1158015610e90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb491906113a5565b905080610f1d576001600160a01b038416600090815260096020526040902054610ede9083610f77565b6001600160a01b038516600090815260096020526040812091909155600b8054849290610f0c908490611892565b909155506000935061065792505050565b509050610657565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610d1a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611090565b600080610fc683856117fc565b905083811015610d1a5760405162461bcd60e51b81526004016108fc90611574565b610ff282826110ca565b61102c61100d61063a83600754610cd590919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611174565b6001600160a01b0390921660009081526008602052604090209190915550565b61105682826111b1565b61102c61107161063a83600754610cd590919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490610d31565b600081848411156110b45760405162461bcd60e51b81526004016108fc9190611457565b5060006110c18486611892565b95945050505050565b6001600160a01b0382166110f05760405162461bcd60e51b81526004016108fc9061176d565b6110fc600083836107b4565b806002600082825461110e91906117fc565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906111609085906117a4565b60405180910390a36109d4600083836107b4565b6000806111818385611853565b9050600083121580156111945750838113155b80610d665750600083128015610d665750838113610d1a57600080fd5b6001600160a01b0382166111d75760405162461bcd60e51b81526004016108fc906116a3565b6111e3826000836107b4565b6001600160a01b0382166000908152602081905260409020548181101561121c5760405162461bcd60e51b81526004016108fc906114aa565b6001600160a01b0383166000818152602081905260408082208585039055600280548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112749086906117a4565b60405180910390a36107b4836000846107b4565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6000602082840312156112ca578081fd5b8135610d1a816118fa565b600080604083850312156112e7578081fd5b82356112f2816118fa565b91506020830135611302816118fa565b809150509250929050565b600080600060608486031215611321578081fd5b833561132c816118fa565b9250602084013561133c816118fa565b929592945050506040919091013590565b6000806040838503121561135f578182fd5b823561136a816118fa565b915060208301356113028161190f565b6000806040838503121561138c578182fd5b8235611397816118fa565b946020939093013593505050565b6000602082840312156113b6578081fd5b8151610d1a8161190f565b6000602082840312156113d2578081fd5b5035919050565b6000602082840312156113ea578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b901515815260200190565b6000602080835283518082850152825b8181101561148357858101830151858201604001528201611467565b818111156114945783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602b908201527f4c696e715f4469766964656e645f547261636b65723a204e6f207472616e736660408201526a195c9cc8185b1b1bddd95960aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b600080821280156001600160ff1b03849003851316156117dd576117dd6118e4565b600160ff1b83900384128116156117f6576117f66118e4565b50500190565b6000821982111561180f5761180f6118e4565b500190565b60008261182f57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561184e5761184e6118e4565b500290565b60008083128015600160ff1b850184121615611871576118716118e4565b6001600160ff1b038401831381161561188c5761188c6118e4565b50500390565b6000828210156118a4576118a46118e4565b500390565b6002810460018216806118bd57607f821691505b602082108114156118de57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146107d757600080fd5b80151581146107d757600080fdfea2646970667358221220c6d190e4b1869c5c303cd5dbc77b0b0d2e7e0b5d1bd8f4013a5b441aa99d3c8764736f6c6343000800003300000000000000000000000071037a7be709694ef1bd3cc1ed6ed01a6fa83867

Deployed Bytecode

0x6080604052600436106103855760003560e01c806379b447bd116101d1578063abb8105211610102578063d2fcc001116100a0578063f2fde38b1161006f578063f2fde38b146109cb578063f66895a3146109eb578063f887ea4014610a00578063f8b45b0514610a155761038c565b8063d2fcc00114610956578063dd62ed3e14610976578063e01af92c14610996578063e2f45605146109b65761038c565b8063bdf1436d116100dc578063bdf1436d146108d6578063c0246668146108f6578063c18bc19514610916578063c851cc32146109365761038c565b8063abb8105214610876578063afa4f3b214610896578063b62496f5146108b65761038c565b806392929a091161016f578063a457c2d711610149578063a457c2d714610801578063a8aa1b3114610821578063a8b9d24014610836578063a9059cbb146108565761038c565b806392929a09146107ac57806395d89b41146107cc5780639a7a23d6146107e15761038c565b806388bdd9be116101ab57806388bdd9be1461074257806388e765ff146107625780638c9684f9146107775780638da5cb5b146107975761038c565b806379b447bd146106cd5780637b510fe8146106ed578063864701a51461071e5761038c565b806330bb4cff116102b65780634fbee193116102545780636ddd1713116102235780636ddd17131461066e57806370a0823114610683578063715018a6146106a357806375f0a874146106b85761038c565b80634fbee193146105f95780635d098b381461061957806366d602ae146106395780636843cd841461064e5761038c565b80633950935111610290578063395093511461059a57806346469afb146105ba5780634ada218b146105cf5780634e71d92d146105e45761038c565b806330bb4cff14610543578063313ce56714610558578063342aa8b51461057a5761038c565b806318160ddd1161032357806323b872dd116102fd57806323b872dd146104cc5780632866ed21146104ec5780632c1f5216146105015780632e1ab904146105235761038c565b806318160ddd146104755780631870517a146104975780631bff7898146104b75761038c565b8063095ea7b31161035f578063095ea7b3146103fe5780630a78097d1461042b5780630bd05b691461044b57806312b77e8a146104605761038c565b80630483f7a01461039157806306fdde03146103b357806308733214146103de5761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103b16103ac36600461281a565b610a2a565b005b3480156103bf57600080fd5b506103c8610a99565b6040516103d59190612a98565b60405180910390f35b3480156103ea57600080fd5b506103b16103f9366004612943565b610b2b565b34801561040a57600080fd5b5061041e610419366004612847565b610bb5565b6040516103d59190612a8d565b34801561043757600080fd5b506103b1610446366004612763565b610bd7565b34801561045757600080fd5b506103b1610ce5565b34801561046c57600080fd5b506103b1610d2c565b34801561048157600080fd5b5061048a610da6565b6040516103d591906130ae565b3480156104a357600080fd5b506103b16104b2366004612943565b610dac565b3480156104c357600080fd5b5061048a610e2d565b3480156104d857600080fd5b5061041e6104e73660046127da565b610e33565b3480156104f857600080fd5b5061041e610e61565b34801561050d57600080fd5b50610516610e71565b6040516103d5919061299e565b34801561052f57600080fd5b506103b161053e366004612763565b610e80565b34801561054f57600080fd5b5061048a610eed565b34801561056457600080fd5b5061056d610f6f565b6040516103d5919061314b565b34801561058657600080fd5b506103b161059536600461281a565b610f74565b3480156105a657600080fd5b5061041e6105b5366004612847565b610fd3565b3480156105c657600080fd5b5061048a610fff565b3480156105db57600080fd5b5061041e611005565b3480156105f057600080fd5b506103b1611015565b34801561060557600080fd5b5061041e610614366004612763565b6110c3565b34801561062557600080fd5b506103b1610634366004612763565b6110e1565b34801561064557600080fd5b5061048a61110b565b34801561065a57600080fd5b5061048a610669366004612763565b611111565b34801561067a57600080fd5b5061041e611198565b34801561068f57600080fd5b5061048a61069e366004612763565b6111a8565b3480156106af57600080fd5b506103b16111c3565b3480156106c457600080fd5b506105166111d7565b3480156106d957600080fd5b506103b16106e8366004612922565b6111e6565b3480156106f957600080fd5b5061070d610708366004612763565b611262565b6040516103d5959493929190612a5f565b34801561072a57600080fd5b506107336112fd565b6040516103d593929190613135565b34801561074e57600080fd5b506103b161075d366004612763565b611309565b34801561076e57600080fd5b5061048a6114c3565b34801561078357600080fd5b506103b1610792366004612763565b6114c9565b3480156107a357600080fd5b50610516611503565b3480156107b857600080fd5b506103b16107c73660046128ba565b611512565b3480156107d857600080fd5b506103c8611538565b3480156107ed57600080fd5b506103b16107fc36600461281a565b611547565b34801561080d57600080fd5b5061041e61081c366004612847565b611559565b34801561082d57600080fd5b506105166115a1565b34801561084257600080fd5b5061048a610851366004612763565b6115b0565b34801561086257600080fd5b5061041e610871366004612847565b6115e1565b34801561088257600080fd5b5061041e610891366004612763565b6115f9565b3480156108a257600080fd5b506103b16108b13660046128f2565b61160e565b3480156108c257600080fd5b5061041e6108d1366004612763565b61162e565b3480156108e257600080fd5b506103b16108f13660046128f2565b611643565b34801561090257600080fd5b506103b161091136600461281a565b61170f565b34801561092257600080fd5b506103b16109313660046128f2565b6117b6565b34801561094257600080fd5b506103b1610951366004612763565b6117f9565b34801561096257600080fd5b506103b161097136600461281a565b611823565b34801561098257600080fd5b5061048a6109913660046127a2565b611856565b3480156109a257600080fd5b506103b16109b13660046128ba565b611881565b3480156109c257600080fd5b5061048a6118a7565b3480156109d757600080fd5b506103b16109e6366004612763565b6118ad565b3480156109f757600080fd5b506107336118e4565b348015610a0c57600080fd5b506105166118f0565b348015610a2157600080fd5b5061048a6118ff565b610a32611905565b60085460405162241fbd60e51b81526001600160a01b0390911690630483f7a090610a6390859085906004016129f0565b600060405180830381600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050505050565b606060038054610aa8906131c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad4906131c7565b8015610b215780601f10610af657610100808354040283529160200191610b21565b820191906000526020600020905b815481529060010190602001808311610b0457829003601f168201915b5050505050905090565b610b33611905565b601481610b408486613159565b610b4a9190613159565b1115610b715760405162461bcd60e51b8152600401610b6890612b2e565b60405180910390fd5b60408051606081018252848152602081018490520181905260118390556012829055601381905580610ba38385613159565b610bad9190613159565b601555505050565b600080610bc0611944565b9050610bcd818585611948565b5060019392505050565b610bdf611905565b806001600160a01b031663a9059cbb610bf6611503565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610c2290309060040161299e565b60206040518083038186803b158015610c3a57600080fd5b505afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c72919061290a565b6040518363ffffffff1660e01b8152600401610c8f929190612a0b565b602060405180830381600087803b158015610ca957600080fd5b505af1158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906128d6565b5050565b610ced611905565b600754600160b81b900460ff1615610d175760405162461bcd60e51b8152600401610b6890612e44565b6007805460ff60b81b1916600160b81b179055565b610d34611905565b60095460405147916000916001600160a01b03909116908390610d569061299b565b60006040518083038185875af1925050503d8060008114610d93576040519150601f19603f3d011682016040523d82523d6000602084013e610d98565b606091505b5050905080610ce157600080fd5b60025490565b610db4611905565b601481610dc18486613159565b610dcb9190613159565b1115610de95760405162461bcd60e51b8152600401610b6890612b2e565b604080516060810182528481526020810184905201819052600e839055600f829055601081905580610e1b8385613159565b610e259190613159565b601455505050565b60155481565b600080610e3e611944565b9050610e4b8582856119fc565b610e56858585611a46565b506001949350505050565b600754600160b01b900460ff1681565b6008546001600160a01b031681565b610e88611905565b60085460405163225b5ecf60e11b81526001600160a01b03909116906344b6bd9e90610eb890849060040161299e565b600060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b5050505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610f3257600080fd5b505afa158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a919061290a565b905090565b601290565b610f7c611905565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415610fa857600080fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b600080610fde611944565b9050610bcd818585610ff08589611856565b610ffa9190613159565b611948565b60145481565b600754600160b81b900460ff1681565b600754600160b01b900460ff1661103e5760405162461bcd60e51b8152600401610b6890612de4565b60085460405163807ab4f760e01b81526001600160a01b039091169063807ab4f79061106e90339060040161299e565b602060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c091906128d6565b50565b6001600160a01b031660009081526017602052604090205460ff1690565b6110e9611905565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a082319061114290859060040161299e565b60206040518083038186803b15801561115a57600080fd5b505afa15801561116e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611192919061290a565b92915050565b600754600160a81b900460ff1681565b6001600160a01b031660009081526020819052604090205490565b6111cb611905565b6111d56000611f16565b565b6009546001600160a01b031681565b6111ee611905565b620f42408210156112115760405162461bcd60e51b8152600401610b6890612f61565b6207a1208110156112345760405162461bcd60e51b8152600401610b6890612bc8565b61124682670de0b6b3a7640000613191565b600b5561125b81670de0b6b3a7640000613191565b600c555050565b60085460405163fbcbc0f160e01b815260009182918291829182916001600160a01b03169063fbcbc0f19061129b90899060040161299e565b60a06040518083038186803b1580156112b357600080fd5b505afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190612872565b939a9299509097509550909350915050565b600e54600f5460105483565b611311611905565b60405162241fbd60e51b815281906001600160a01b03821690630483f7a0906113419084906001906004016129f0565b600060405180830381600087803b15801561135b57600080fd5b505af115801561136f573d6000803e3d6000fd5b505060405162241fbd60e51b81526001600160a01b0384169250630483f7a091506113a19030906001906004016129f0565b600060405180830381600087803b1580156113bb57600080fd5b505af11580156113cf573d6000803e3d6000fd5b50505050806001600160a01b0316630483f7a06113ea611503565b60016040518363ffffffff1660e01b81526004016114099291906129f0565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060065460405162241fbd60e51b81526001600160a01b038086169450630483f7a0935061146d9216906001906004016129f0565b600060405180830381600087803b15801561148757600080fd5b505af115801561149b573d6000803e3d6000fd5b5050600880546001600160a01b0319166001600160a01b039490941693909317909255505050565b600b5481565b6114d1611905565b60085460405163497ec82360e01b81526001600160a01b039091169063497ec82390610eb890339085906004016129b2565b6005546001600160a01b031690565b61151a611905565b60078054911515600160b01b0260ff60b01b19909216919091179055565b606060048054610aa8906131c7565b61154f611905565b610ce18282611f68565b600080611564611944565b905060006115728286611856565b9050838110156115945760405162461bcd60e51b8152600401610b6890613069565b610e568286868403611948565b6007546001600160a01b031681565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d2409061114290859060040161299e565b6000806115ec611944565b9050610bcd818585611a46565b60166020526000908152604090205460ff1681565b611616611905565b61162881670de0b6b3a7640000613191565b600a5550565b60186020526000908152604090205460ff1681565b61164b611905565b6007546008546040516323b872dd60e01b81526000926001600160a01b03908116926323b872dd92611685923392169087906004016129cc565b602060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d791906128d6565b90508015610ce157600854604051633b79ab6760e21b81526001600160a01b039091169063ede6ad9c90610a639085906004016130ae565b611717611905565b6001600160a01b03821660009081526017602052604090205460ff16151581151514156117565760405162461bcd60e51b8152600401610b689061301f565b6001600160a01b03821660008181526017602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7906117aa908490612a8d565b60405180910390a25050565b6117be611905565b620f42408110156117e15760405162461bcd60e51b8152600401610b6890612d25565b6117f381670de0b6b3a7640000613191565b600d5550565b611801611905565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61182b611905565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611889611905565b60078054911515600160a81b0260ff60a81b19909216919091179055565b600a5481565b6118b5611905565b6001600160a01b0381166118db5760405162461bcd60e51b8152600401610b6890612c0b565b6110c081611f16565b60115460125460135483565b6006546001600160a01b031681565b600d5481565b61190d611944565b6001600160a01b031661191e611503565b6001600160a01b0316146111d55760405162461bcd60e51b8152600401610b6890612e0f565b3390565b6001600160a01b03831661196e5760405162461bcd60e51b8152600401610b6890612fdb565b6001600160a01b0382166119945760405162461bcd60e51b8152600401610b6890612c51565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906119ef9085906130ae565b60405180910390a3505050565b6000611a088484611856565b90506000198114611a405781811015611a335760405162461bcd60e51b8152600401610b6890612d67565b611a408484848403611948565b50505050565b6001600160a01b038316611a6c5760405162461bcd60e51b8152600401610b6890612f96565b6001600160a01b038216611a925760405162461bcd60e51b8152600401610b6890612aeb565b6001600160a01b03831660009081526017602052604090205460ff16158015611ad457506001600160a01b03821660009081526017602052604090205460ff16155b8015611aea5750600754600160a01b900460ff16155b15611bf757600754600160b81b900460ff16611b185760405162461bcd60e51b8152600401610b6890612b9c565b6001600160a01b03821660009081526018602052604090205460ff1615611b6057600c54811115611b5b5760405162461bcd60e51b8152600401610b6890612eb2565b611ba3565b6001600160a01b03831660009081526018602052604090205460ff1615611ba357600b54811115611ba35760405162461bcd60e51b8152600401610b6890612ee9565b6001600160a01b03821660009081526019602052604090205460ff16611bf757600d54611bcf836111a8565b611bd99083613159565b1115611bf75760405162461bcd60e51b8152600401610b6890612e7b565b80611c0d57611c0883836000612075565b611f11565b6000611c18306111a8565b600a5490915081108015908190611c395750600754600160a01b900460ff16155b8015611c4e5750600754600160a81b900460ff165b8015611c7257506001600160a01b03841660009081526018602052604090205460ff165b8015611c9757506001600160a01b03851660009081526017602052604090205460ff16155b8015611cbc57506001600160a01b03841660009081526017602052604090205460ff16155b15611cf5576007805460ff60a01b1916600160a01b17905560155415611ce757611ce7600a54612176565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526017602052604090205460ff600160a01b909204821615911680611d4357506001600160a01b03851660009081526017602052604090205460ff165b15611d4c575060005b6001600160a01b03851660009081526018602052604090205460ff16158015611d8e57506001600160a01b03861660009081526018602052604090205460ff16155b15611d97575060005b8015611e36576001600160a01b03851660009081526018602052604081205460ff1615611ddf57606460155486611dce9190613191565b611dd89190613171565b9050611e1d565b6001600160a01b03871660009081526018602052604090205460ff1615611e1d57606460145486611e109190613191565b611e1a9190613171565b90505b611e2781866131b0565b9450611e34873083612075565b505b611e41868686612075565b6008546001600160a01b031663e30443bc87611e5c816111a8565b6040518363ffffffff1660e01b8152600401611e79929190612a0b565b600060405180830381600087803b158015611e9357600080fd5b505af1925050508015611ea4575060015b506008546001600160a01b031663e30443bc86611ec0816111a8565b6040518363ffffffff1660e01b8152600401611edd929190612a0b565b600060405180830381600087803b158015611ef757600080fd5b505af1925050508015611f08575060015b610a9157610a91565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415611fa75760405162461bcd60e51b8152600401610b6890612c93565b6001600160a01b0382166000908152601860205260409020805460ff191682158015919091179091556120395760085460405162241fbd60e51b81526001600160a01b0390911690630483f7a0906120069085906001906004016129f0565b600060405180830381600087803b15801561202057600080fd5b505af1158015612034573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661209b5760405162461bcd60e51b8152600401610b6890612f96565b6001600160a01b0382166120c15760405162461bcd60e51b8152600401610b6890612aeb565b6120cc838383611f11565b6001600160a01b038316600090815260208190526040902054818110156121055760405162461bcd60e51b8152600401610b6890612d9e565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121639086906130ae565b60405180910390a3611a40848484611f11565b60155460115460009160029161218c9085613191565b6121969190613171565b6121a09190613171565b905060006002601554601160000154856121ba9190613191565b6121c49190613171565b6121ce9190613171565b6015546012549192506000916121e49086613191565b6121ee9190613171565b6015546013549192506000916122049087613191565b61220e9190613171565b905061221984612496565b47801561222a5761222a84826125e5565b61223383612496565b478080156122be576009546040516000916001600160a01b03169083906122599061299b565b60006040518083038185875af1925050503d8060008114612296576040519150601f19603f3d011682016040523d82523d6000602084013e61229b565b606091505b50509050806122bc5760405162461bcd60e51b8152600401610b6890612cf0565b505b6007546040516370a0823160e01b81526000916001600160a01b0316906370a08231906122ef90309060040161299e565b60206040518083038186803b15801561230757600080fd5b505afa15801561231b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233f919061290a565b905080801561247a5760075460085460405163a9059cbb60e01b81526000926001600160a01b039081169263a9059cbb9261238292909116908690600401612a0b565b602060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d491906128d6565b9050801561247857600854604051633b79ab6760e21b81526001600160a01b039091169063ede6ad9c9061240c9085906004016130ae565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38b8360405161246f929190613127565b60405180910390a15b505b851561248a5761248a308761268c565b50505050505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124d957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561252d57600080fd5b505afa158015612541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125659190612786565b8160018151811061258657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546125ac9130911684611948565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610a639085906000908690309042906004016130b7565b6006546125fd9030906001600160a01b031684611948565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061263a9030908790600090819084904290600401612a24565b6060604051808303818588803b15801561265357600080fd5b505af1158015612667573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee6919061296e565b6001600160a01b0382166126b25760405162461bcd60e51b8152600401610b6890612f20565b6126be82600083611f11565b6001600160a01b038216600090815260208190526040902054818110156126f75760405162461bcd60e51b8152600401610b6890612b5a565b6001600160a01b0383166000818152602081905260408082208585039055600280548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061274f9086906130ae565b60405180910390a3611f1183600084611f11565b600060208284031215612774578081fd5b813561277f81613218565b9392505050565b600060208284031215612797578081fd5b815161277f81613218565b600080604083850312156127b4578081fd5b82356127bf81613218565b915060208301356127cf81613218565b809150509250929050565b6000806000606084860312156127ee578081fd5b83356127f981613218565b9250602084013561280981613218565b929592945050506040919091013590565b6000806040838503121561282c578182fd5b823561283781613218565b915060208301356127cf8161322d565b60008060408385031215612859578182fd5b823561286481613218565b946020939093013593505050565b600080600080600060a08688031215612889578081fd5b855161289481613218565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000602082840312156128cb578081fd5b813561277f8161322d565b6000602082840312156128e7578081fd5b815161277f8161322d565b600060208284031215612903578081fd5b5035919050565b60006020828403121561291b578081fd5b5051919050565b60008060408385031215612934578182fd5b50508035926020909101359150565b600080600060608486031215612957578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612982578283fd5b8351925060208401519150604084015190509250925092565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b901515815260200190565b6000602080835283518082850152825b81811015612ac457858101830151858201604001528201612aa8565b81811115612ad55783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260129082015271466565206d757374206265203c3d2032302560701b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526012908201527154726164696e67206e6f742061637469766560701b604082015260600190565b60208082526023908201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60408201526201a92960ed1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526038908201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160408201527f6c72656164792073657420746f20746861742076616c75650000000000000000606082015260800190565b6020808252818101527f4661696c656420746f2073656e642045544820746f206465762077616c6c6574604082015260600190565b60208082526022908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015261312560f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526011908201527010db185a5b481b9bdd08195b98589b1959607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54726164696e6720616c726561647920656e61626c6564000000000000000000604082015260600190565b6020808252601b908201527f556e61626c6520746f20657863656564204d61782057616c6c65740000000000604082015260600190565b6020808252601f908201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604082015260600190565b6020808252601e908201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252818101527f43616e6e6f7420736574206d6178627579206c6f776572207468616e20312520604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156131065784516001600160a01b0316835293830193918301916001016130e1565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561316c5761316c613202565b500190565b60008261318c57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156131ab576131ab613202565b500290565b6000828210156131c2576131c2613202565b500390565b6002810460018216806131db57607f821691505b602082108114156131fc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146110c057600080fd5b80151581146110c057600080fdfea2646970667358221220ab2916f68a075f4de1876f58c4fdb0c9adc2d8f9ba4abb171d18c9060e517ba264736f6c63430008000033

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

00000000000000000000000071037a7be709694ef1bd3cc1ed6ed01a6fa83867

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0x71037a7Be709694ef1bD3Cc1Ed6eD01a6fA83867

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000071037a7be709694ef1bd3cc1ed6ed01a6fa83867


Deployed Bytecode Sourcemap

40292:15443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46409:170;;;;;;;;;;-1:-1:-1;46409:170:0;;;;;:::i;:::-;;:::i;:::-;;8556:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47009:299;;;;;;;;;;-1:-1:-1;47009:299:0;;;;;:::i;:::-;;:::i;10916:201::-;;;;;;;;;;-1:-1:-1;10916:201:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45094:209::-;;;;;;;;;;-1:-1:-1;45094:209:0;;;;;:::i;:::-;;:::i;47561:148::-;;;;;;;;;;;;;:::i;45396:210::-;;;;;;;;;;;;;:::i;9685:108::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46705:296::-;;;;;;;;;;-1:-1:-1;46705:296:0;;;;;:::i;:::-;;:::i;40993:31::-;;;;;;;;;;;;;:::i;11697:261::-;;;;;;;;;;-1:-1:-1;11697:261:0;;;;;:::i;:::-;;:::i;40458:24::-;;;;;;;;;;;;;:::i;40524:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48068:117::-;;;;;;;;;;-1:-1:-1;48068:117:0;;;;;:::i;:::-;;:::i;48986:141::-;;;;;;;;;;;;;:::i;9527:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47922:138::-;;;;;;;;;;-1:-1:-1;47922:138:0;;;;;:::i;:::-;;:::i;12367:238::-;;;;;;;;;;-1:-1:-1;12367:238:0;;;;;:::i;:::-;;:::i;40956:30::-;;;;;;;;;;;;;:::i;40489:26::-;;;;;;;;;;;;;:::i;43980:149::-;;;;;;;;;;;;;:::i;49135:126::-;;;;;;;;;;-1:-1:-1;49135:126:0;;;;;:::i;:::-;;:::i;46587:110::-;;;;;;;;;;-1:-1:-1;46587:110:0;;;;;:::i;:::-;;:::i;40687:28::-;;;;;;;;;;;;;:::i;49461:171::-;;;;;;;;;;-1:-1:-1;49461:171:0;;;;;:::i;:::-;;:::i;40421:30::-;;;;;;;;;;;;;:::i;9856:127::-;;;;;;;;;;-1:-1:-1;9856:127:0;;;;;:::i;:::-;;:::i;5215:103::-;;;;;;;;;;;;;:::i;40574:30::-;;;;;;;;;;;;;:::i;44330:340::-;;;;;;;;;;-1:-1:-1;44330:340:0;;;;;:::i;:::-;;:::i;49640:278::-;;;;;;;;;;-1:-1:-1;49640:278:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;40863:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;43360:568::-;;;;;;;;;;-1:-1:-1;43360:568:0;;;;;:::i;:::-;;:::i;40653:27::-;;;;;;;;;;;;;:::i;45614:160::-;;;;;;;;;;-1:-1:-1;45614:160:0;;;;;:::i;:::-;;:::i;4574:87::-;;;;;;;;;;;;;:::i;47717:95::-;;;;;;;;;;-1:-1:-1;47717:95:0;;;;;:::i;:::-;;:::i;8775:104::-;;;;;;;;;;;;;:::i;48255:171::-;;;;;;;;;;-1:-1:-1;48255:171:0;;;;;:::i;:::-;;:::i;13108:436::-;;;;;;;;;;-1:-1:-1;13108:436:0;;;;;:::i;:::-;;:::i;40365:19::-;;;;;;;;;;;;;:::i;49269:184::-;;;;;;;;;;-1:-1:-1;49269:184:0;;;;;:::i;:::-;;:::i;10189:193::-;;;;;;;;;;-1:-1:-1;10189:193:0;;;;;:::i;:::-;;:::i;41033:38::-;;;;;;;;;;-1:-1:-1;41033:38:0;;;;;:::i;:::-;;:::i;44678:119::-;;;;;;;;;;-1:-1:-1;44678:119:0;;;;;:::i;:::-;;:::i;41139:57::-;;;;;;;;;;-1:-1:-1;41139:57:0;;;;;:::i;:::-;;:::i;54393:320::-;;;;;;;;;;-1:-1:-1;54393:320:0;;;;;:::i;:::-;;:::i;46022:327::-;;;;;;;;;;-1:-1:-1;46022:327:0;;;;;:::i;:::-;;:::i;44137:185::-;;;;;;;;;;-1:-1:-1;44137:185:0;;;;;:::i;:::-;;:::i;45782:113::-;;;;;;;;;;-1:-1:-1;45782:113:0;;;;;:::i;:::-;;:::i;44805:165::-;;;;;;;;;;-1:-1:-1;44805:165:0;;;;;:::i;:::-;;:::i;10445:151::-;;;;;;;;;;-1:-1:-1;10445:151:0;;;;;:::i;:::-;;:::i;47454:99::-;;;;;;;;;;-1:-1:-1;47454:99:0;;;;;:::i;:::-;;:::i;40613:33::-;;;;;;;;;;;;;:::i;5473:201::-;;;;;;;;;;-1:-1:-1;5473:201:0;;;;;:::i;:::-;;:::i;40908:39::-;;;;;;;;;;;;;:::i;40330:28::-;;;;;;;;;;;;;:::i;40722:24::-;;;;;;;;;;;;;:::i;46409:170::-;4460:13;:11;:13::i;:::-;46519:15:::1;::::0;:52:::1;::::0;-1:-1:-1;;;46519:52:0;;-1:-1:-1;;;;;46519:15:0;;::::1;::::0;:36:::1;::::0;:52:::1;::::0;46556:7;;46565:5;;46519:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46409:170:::0;;:::o;8556:100::-;8610:13;8643:5;8636:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8556:100;:::o;47009:299::-;4460:13;:11;:13::i;:::-;47159:2:::1;47150:5:::0;47124:23:::1;47137:10:::0;47124;:23:::1;:::i;:::-;:31;;;;:::i;:::-;:37;;47116:68;;;;-1:-1:-1::0;;;47116:68:0::1;;;;;;;:::i;:::-;;;;;;;;;47207:36;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;47195:9:::1;:48:::0;;;;;;;;;;;47237:5;47269:23:::1;47225:10:::0;47213;47269:23:::1;:::i;:::-;:31;;;;:::i;:::-;47254:12;:46:::0;-1:-1:-1;;;47009:299:0:o;10916:201::-;10999:4;11016:13;11032:12;:10;:12::i;:::-;11016:28;;11055:32;11064:5;11071:7;11080:6;11055:8;:32::i;:::-;-1:-1:-1;11105:4:0;;10916:201;-1:-1:-1;;;10916:201:0:o;45094:209::-;4460:13;:11;:13::i;:::-;45180:12:::1;-1:-1:-1::0;;;;;45173:29:0::1;;45217:7;:5;:7::i;:::-;45239:45;::::0;-1:-1:-1;;;45239:45:0;;-1:-1:-1;;;;;45239:30:0;::::1;::::0;::::1;::::0;:45:::1;::::0;45278:4:::1;::::0;45239:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45173:122;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45094:209:::0;:::o;47561:148::-;4460:13;:11;:13::i;:::-;47627:14:::1;::::0;-1:-1:-1;;;47627:14:0;::::1;;;47626:15;47618:51;;;;-1:-1:-1::0;;;47618:51:0::1;;;;;;;:::i;:::-;47680:14;:21:::0;;-1:-1:-1;;;;47680:21:0::1;-1:-1:-1::0;;;47680:21:0::1;::::0;;47561:148::o;45396:210::-;4460:13;:11;:13::i;:::-;45527:15:::1;::::0;45519:52:::1;::::0;45468:21:::1;::::0;45447:18:::1;::::0;-1:-1:-1;;;;;45527:15:0;;::::1;::::0;45468:21;;45519:52:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45500:71;;;45590:7;45582:16;;;::::0;::::1;9685:108:::0;9773:12;;9685:108;:::o;46705:296::-;4460:13;:11;:13::i;:::-;46854:2:::1;46845:5:::0;46819:23:::1;46832:10:::0;46819;:23:::1;:::i;:::-;:31;;;;:::i;:::-;:37;;46811:68;;;;-1:-1:-1::0;;;46811:68:0::1;;;;;;;:::i;:::-;46901:36;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;46890:8:::1;:47:::0;;;;;;;;;;;46931:5;46962:23:::1;46919:10:::0;46907;46962:23:::1;:::i;:::-;:31;;;;:::i;:::-;46948:11;:45:::0;-1:-1:-1;;;46705:296:0:o;40993:31::-;;;;:::o;11697:261::-;11794:4;11811:15;11829:12;:10;:12::i;:::-;11811:30;;11852:38;11868:4;11874:7;11883:6;11852:15;:38::i;:::-;11901:27;11911:4;11917:2;11921:6;11901:9;:27::i;:::-;-1:-1:-1;11946:4:0;;11697:261;-1:-1:-1;;;;11697:261:0:o;40458:24::-;;;-1:-1:-1;;;40458:24:0;;;;;:::o;40524:41::-;;;-1:-1:-1;;;;;40524:41:0;;:::o;48068:117::-;4460:13;:11;:13::i;:::-;48137:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;48137:40:0;;-1:-1:-1;;;;;48137:15:0;;::::1;::::0;:30:::1;::::0;:40:::1;::::0;48168:8;;48137:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48068:117:::0;:::o;48986:141::-;49076:15;;:43;;;-1:-1:-1;;;49076:43:0;;;;49049:7;;-1:-1:-1;;;;;49076:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49069:50;;48986:141;:::o;9527:93::-;9610:2;9527:93;:::o;47922:138::-;4460:13;:11;:13::i;:::-;-1:-1:-1;;;;;48001:11:0;::::1;;::::0;;;:6:::1;:11;::::0;;;;;::::1;;:20;;::::0;::::1;;;;47993:29;;;::::0;::::1;;-1:-1:-1::0;;;;;48033:11:0;;;::::1;;::::0;;;:6:::1;:11;::::0;;;;:19;;-1:-1:-1;;48033:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47922:138::o;12367:238::-;12455:4;12472:13;12488:12;:10;:12::i;:::-;12472:28;;12511:64;12520:5;12527:7;12564:10;12536:25;12546:5;12553:7;12536:9;:25::i;:::-;:38;;;;:::i;:::-;12511:8;:64::i;40956:30::-;;;;:::o;40489:26::-;;;-1:-1:-1;;;40489:26:0;;;;;:::o;43980:149::-;44025:12;;-1:-1:-1;;;44025:12:0;;;;44017:42;;;;-1:-1:-1;;;44017:42:0;;;;;;;:::i;:::-;44070:15;;:51;;-1:-1:-1;;;44070:51:0;;-1:-1:-1;;;;;44070:15:0;;;;:30;;:51;;44109:10;;44070:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43980:149::o;49135:126::-;-1:-1:-1;;;;;49225:28:0;49201:4;49225:28;;;:19;:28;;;;;;;;;49135:126::o;46587:110::-;4460:13;:11;:13::i;:::-;46662:15:::1;:27:::0;;-1:-1:-1;;;;;;46662:27:0::1;-1:-1:-1::0;;;;;46662:27:0;;;::::1;::::0;;;::::1;::::0;;46587:110::o;40687:28::-;;;;:::o;49461:171::-;49590:15;;:34;;-1:-1:-1;;;49590:34:0;;49558:7;;-1:-1:-1;;;;;49590:15:0;;:25;;:34;;49616:7;;49590:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49583:41;49461:171;-1:-1:-1;;49461:171:0:o;40421:30::-;;;-1:-1:-1;;;40421:30:0;;;;;:::o;9856:127::-;-1:-1:-1;;;;;9957:18:0;9930:7;9957:18;;;;;;;;;;;;9856:127::o;5215:103::-;4460:13;:11;:13::i;:::-;5280:30:::1;5307:1;5280:18;:30::i;:::-;5215:103::o:0;40574:30::-;;;-1:-1:-1;;;;;40574:30:0;;:::o;44330:340::-;4460:13;:11;:13::i;:::-;44458:7:::1;44448:6;:17;;44440:62;;;;-1:-1:-1::0;;;44440:62:0::1;;;;;;;:::i;:::-;44532:6;44521:7;:17;;44513:65;;;;-1:-1:-1::0;;;44513:65:0::1;;;;;;;:::i;:::-;44604:15;:6:::0;44613::::1;44604:15;:::i;:::-;44589:12;:30:::0;44646:16:::1;:7:::0;44656:6:::1;44646:16;:::i;:::-;44630:13;:32:::0;-1:-1:-1;;44330:340:0:o;49640:278::-;49875:15;;:35;;-1:-1:-1;;;49875:35:0;;49745:7;;;;;;;;;;-1:-1:-1;;;;;49875:15:0;;:26;;:35;;49902:7;;49875:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49868:42;;;;-1:-1:-1;49868:42:0;;-1:-1:-1;49868:42:0;-1:-1:-1;49868:42:0;;-1:-1:-1;49640:278:0;-1:-1:-1;;49640:278:0:o;40863:38::-;;;;;;;;:::o;43360:568::-;4460:13;:11;:13::i;:::-;43553:111:::1;::::0;-1:-1:-1;;;43553:111:0;;43520:10;;-1:-1:-1;;;;;43553:39:0;::::1;::::0;::::1;::::0;:111:::1;::::0;43520:10;;43649:4:::1;::::0;43553:111:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43675:60:0::1;::::0;-1:-1:-1;;;43675:60:0;;-1:-1:-1;;;;;43675:39:0;::::1;::::0;-1:-1:-1;43675:39:0::1;::::0;-1:-1:-1;43675:60:0::1;::::0;43723:4:::1;::::0;43730::::1;::::0;43675:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43746:18;-1:-1:-1::0;;;;;43746:39:0::1;;43786:7;:5;:7::i;:::-;43795:4;43746:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43859:6:0::1;::::0;43811:62:::1;::::0;-1:-1:-1;;;43811:62:0;;-1:-1:-1;;;;;43811:39:0;;::::1;::::0;-1:-1:-1;43811:39:0::1;::::0;-1:-1:-1;43811:62:0::1;::::0;43859:6:::1;::::0;;;43811:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43884:15:0::1;:36:::0;;-1:-1:-1;;;;;;43884:36:0::1;-1:-1:-1::0;;;;;43884:36:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;43360:568:0:o;40653:27::-;;;;:::o;45614:160::-;4460:13;:11;:13::i;:::-;45700:15:::1;::::0;:66:::1;::::0;-1:-1:-1;;;45700:66:0;;-1:-1:-1;;;;;45700:15:0;;::::1;::::0;:40:::1;::::0;:66:::1;::::0;45741:10:::1;::::0;45753:12;;45700:66:::1;;;:::i;4574:87::-:0;4647:6;;-1:-1:-1;;;;;4647:6:0;4574:87;:::o;47717:95::-;4460:13;:11;:13::i;:::-;47784:12:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;47784:20:0::1;-1:-1:-1::0;;;;47784:20:0;;::::1;::::0;;;::::1;::::0;;47717:95::o;8775:104::-;8831:13;8864:7;8857:14;;;;;:::i;48255:171::-;4460:13;:11;:13::i;:::-;48374:44:::1;48403:7;48412:5;48374:28;:44::i;13108:436::-:0;13201:4;13218:13;13234:12;:10;:12::i;:::-;13218:28;;13257:24;13284:25;13294:5;13301:7;13284:9;:25::i;:::-;13257:52;;13348:15;13328:16;:35;;13320:85;;;;-1:-1:-1;;;13320:85:0;;;;;;;:::i;:::-;13441:60;13450:5;13457:7;13485:15;13466:16;:34;13441:8;:60::i;40365:19::-;;;-1:-1:-1;;;;;40365:19:0;;:::o;49269:184::-;49398:15;;:47;;-1:-1:-1;;;49398:47:0;;49366:7;;-1:-1:-1;;;;;49398:15:0;;:38;;:47;;49437:7;;49398:47;;;:::i;10189:193::-;10268:4;10285:13;10301:12;:10;:12::i;:::-;10285:28;;10324;10334:5;10341:2;10345:6;10324:9;:28::i;41033:38::-;;;;;;;;;;;;;;;:::o;44678:119::-;4460:13;:11;:13::i;:::-;44774:15:::1;:6:::0;44783::::1;44774:15;:::i;:::-;44753:18;:36:::0;-1:-1:-1;44678:119:0:o;41139:57::-;;;;;;;;;;;;;;;:::o;54393:320::-;4460:13;:11;:13::i;:::-;54496:4:::1;::::0;54562:15:::1;::::0;54489:121:::1;::::0;-1:-1:-1;;;54489:121:0;;54474:12:::1;::::0;-1:-1:-1;;;;;54496:4:0;;::::1;::::0;54489:25:::1;::::0;:121:::1;::::0;54529:10:::1;::::0;54562:15:::1;::::0;54593:6;;54489:121:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54474:136;;54625:7;54621:85;;;54649:15;::::0;:45:::1;::::0;-1:-1:-1;;;54649:45:0;;-1:-1:-1;;;;;54649:15:0;;::::1;::::0;:37:::1;::::0;:45:::1;::::0;54687:6;;54649:45:::1;;;:::i;46022:327::-:0;4460:13;:11;:13::i;:::-;-1:-1:-1;;;;;46129:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;46107:132;;;;-1:-1:-1::0;;;46107:132:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46250:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;46250:39:0::1;::::0;::::1;;;::::0;;46307:34;::::1;::::0;::::1;::::0;46250:39;;46307:34:::1;:::i;:::-;;;;;;;;46022:327:::0;;:::o;44137:185::-;4460:13;:11;:13::i;:::-;44230:7:::1;44220:6;:17;;44212:64;;;;-1:-1:-1::0;;;44212:64:0::1;;;;;;;:::i;:::-;44299:15;:6:::0;44308::::1;44299:15;:::i;:::-;44287:9;:27:::0;-1:-1:-1;44137:185:0:o;45782:113::-;4460:13;:11;:13::i;:::-;45853:6:::1;:34:::0;;-1:-1:-1;;;;;;45853:34:0::1;-1:-1:-1::0;;;;;45853:34:0;;;::::1;::::0;;;::::1;::::0;;45782:113::o;44805:165::-;4460:13;:11;:13::i;:::-;-1:-1:-1;;;;;44918:33:0;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:44;;-1:-1:-1;;44918:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44805:165::o;10445:151::-;-1:-1:-1;;;;;10561:18:0;;;10534:7;10561:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10445:151::o;47454:99::-;4460:13;:11;:13::i;:::-;47523:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;47523:22:0::1;-1:-1:-1::0;;;;47523:22:0;;::::1;::::0;;;::::1;::::0;;47454:99::o;40613:33::-;;;;:::o;5473:201::-;4460:13;:11;:13::i;:::-;-1:-1:-1;;;;;5562:22:0;::::1;5554:73;;;;-1:-1:-1::0;;;5554:73:0::1;;;;;;;:::i;:::-;5638:28;5657:8;5638:18;:28::i;40908:39::-:0;;;;;;;;:::o;40330:28::-;;;-1:-1:-1;;;;;40330:28:0;;:::o;40722:24::-;;;;:::o;4739:132::-;4814:12;:10;:12::i;:::-;-1:-1:-1;;;;;4803:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4803:23:0;;4795:68;;;;-1:-1:-1;;;4795:68:0;;;;;;;:::i;600:98::-;680:10;600:98;:::o;17101:346::-;-1:-1:-1;;;;;17203:19:0;;17195:68;;;;-1:-1:-1;;;17195:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17282:21:0;;17274:68;;;;-1:-1:-1;;;17274:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17355:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;17407:32;;;;;17385:6;;17407:32;:::i;:::-;;;;;;;;17101:346;;;:::o;17738:419::-;17839:24;17866:25;17876:5;17883:7;17866:9;:25::i;:::-;17839:52;;-1:-1:-1;;17906:16:0;:37;17902:248;;17988:6;17968:16;:26;;17960:68;;;;-1:-1:-1;;;17960:68:0;;;;;;;:::i;:::-;18072:51;18081:5;18088:7;18116:6;18097:16;:25;18072:8;:51::i;:::-;17738:419;;;;:::o;50018:2652::-;-1:-1:-1;;;;;50150:18:0;;50142:68;;;;-1:-1:-1;;;50142:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50229:16:0;;50221:64;;;;-1:-1:-1;;;50221:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50317:25:0;;;;;;:19;:25;;;;;;;;50316:26;:54;;;;-1:-1:-1;;;;;;50347:23:0;;;;;;:19;:23;;;;;;;;50346:24;50316:54;:67;;;;-1:-1:-1;50375:8:0;;-1:-1:-1;;;50375:8:0;;;;50374:9;50316:67;50298:788;;;50418:14;;-1:-1:-1;;;50418:14:0;;;;50410:45;;;;-1:-1:-1;;;50410:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50474:29:0;;;;;;:25;:29;;;;;;;;50470:384;;;50564:13;;50554:6;:23;;50524:128;;;;-1:-1:-1;;;50524:128:0;;;;;;;:::i;:::-;50470:384;;;-1:-1:-1;;;;;50678:31:0;;;;;;:25;:31;;;;;;;;50674:180;;;50768:12;;50758:6;:22;;50728:126;;;;-1:-1:-1;;;50728:126:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50874:28:0;;;;;;:24;:28;;;;;;;;50869:206;;50979:9;;50962:13;50972:2;50962:9;:13::i;:::-;50953:22;;:6;:22;:::i;:::-;:35;;50923:136;;;;-1:-1:-1;;;50923:136:0;;;;;;;:::i;:::-;51102:11;51098:93;;51130:28;51146:4;51152:2;51156:1;51130:15;:28::i;:::-;51173:7;;51098:93;51203:28;51234:24;51252:4;51234:9;:24::i;:::-;51308:18;;51203:55;;-1:-1:-1;51284:42:0;;;;;;;51357:33;;-1:-1:-1;51382:8:0;;-1:-1:-1;;;51382:8:0;;;;51381:9;51357:33;:61;;;;-1:-1:-1;51407:11:0;;-1:-1:-1;;;51407:11:0;;;;51357:61;:107;;;;-1:-1:-1;;;;;;51435:29:0;;;;;;:25;:29;;;;;;;;51357:107;:150;;;;-1:-1:-1;;;;;;51482:25:0;;;;;;:19;:25;;;;;;;;51481:26;51357:150;:191;;;;-1:-1:-1;;;;;;51525:23:0;;;;;;:19;:23;;;;;;;;51524:24;51357:191;51339:403;;;51575:8;:15;;-1:-1:-1;;;;51575:15:0;-1:-1:-1;;;51575:15:0;;;51611:12;;:16;51607:91;;51648:34;51663:18;;51648:14;:34::i;:::-;51714:8;:16;;-1:-1:-1;;;;51714:16:0;;;51339:403;51770:8;;-1:-1:-1;;;;;51880:25:0;;51754:12;51880:25;;;:19;:25;;;;;;51770:8;-1:-1:-1;;;51770:8:0;;;;;51769:9;;51880:25;;:52;;-1:-1:-1;;;;;;51909:23:0;;;;;;:19;:23;;;;;;;;51880:52;51876:100;;;-1:-1:-1;51959:5:0;51876:100;-1:-1:-1;;;;;51993:29:0;;;;;;:25;:29;;;;;;;;51992:30;:66;;;;-1:-1:-1;;;;;;52027:31:0;;;;;;:25;:31;;;;;;;;52026:32;51992:66;51988:100;;;-1:-1:-1;52083:5:0;51988:100;52105:7;52101:370;;;-1:-1:-1;;;;;52162:29:0;;52129:14;52162:29;;;:25;:29;;;;;;;;52158:201;;;52245:3;52229:12;;52220:6;:21;;;;:::i;:::-;52219:29;;;;:::i;:::-;52210:38;;52158:201;;;-1:-1:-1;;;;;52272:31:0;;;;;;:25;:31;;;;;;;;52268:91;;;52356:3;52341:11;;52332:6;:20;;;;:::i;:::-;52331:28;;;;:::i;:::-;52322:37;;52268:91;52385:15;52394:6;52385;:15;:::i;:::-;52376:24;;52415:44;52431:4;52445;52452:6;52415:15;:44::i;:::-;52101:370;;52481:33;52497:4;52503:2;52507:6;52481:15;:33::i;:::-;52531:15;;-1:-1:-1;;;;;52531:15:0;:26;52558:4;52564:15;52558:4;52564:9;:15::i;:::-;52531:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52527:65;52606:15;;-1:-1:-1;;;;;52606:15:0;:26;52633:2;52637:13;52633:2;52637:9;:13::i;:::-;52606:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52602:61;;;;50018:2652;;;;:::o;5834:191::-;5927:6;;;-1:-1:-1;;;;;5944:17:0;;;-1:-1:-1;;;;;;5944:17:0;;;;;;;5977:40;;5927:6;;;5944:17;5927:6;;5977:40;;5908:16;;5977:40;5834:191;;:::o;48434:458::-;-1:-1:-1;;;;;48542:34:0;;;;;;:25;:34;;;;;;;;:43;;;;;;;48520:149;;;;-1:-1:-1;;;48520:149:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48680:34:0;;;;;;:25;:34;;;;;:42;;-1:-1:-1;;48680:42:0;;;;;;;;;;;;48735:89;;48761:15;;:51;;-1:-1:-1;;;48761:51:0;;-1:-1:-1;;;;;48761:15:0;;;;:36;;:51;;48798:7;;48761:15;;:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48735:89;48841:43;;;;;;-1:-1:-1;;;;;48841:43:0;;;;;;;;48434:458;;:::o;14014:806::-;-1:-1:-1;;;;;14111:18:0;;14103:68;;;;-1:-1:-1;;;14103:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14190:16:0;;14182:64;;;;-1:-1:-1;;;14182:64:0;;;;;;;:::i;:::-;14259:38;14280:4;14286:2;14290:6;14259:20;:38::i;:::-;-1:-1:-1;;;;;14332:15:0;;14310:19;14332:15;;;;;;;;;;;14366:21;;;;14358:72;;;;-1:-1:-1;;;14358:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14466:15:0;;;:9;:15;;;;;;;;;;;14484:20;;;14466:38;;14684:13;;;;;;;;;;:23;;;;;;14736:26;;;;;;14498:6;;14736:26;:::i;:::-;;;;;;;;14775:37;14795:4;14801:2;14805:6;14775:19;:37::i;52678:1589::-;52794:12;;52771:9;:19;52737:20;;52810:1;;52762:28;;:6;:28;:::i;:::-;52761:45;;;;:::i;:::-;52760:51;;;;:::i;:::-;52737:74;;52822:32;52907:1;52891:12;;52868:9;:19;;;52859:6;:28;;;;:::i;:::-;52858:45;;;;:::i;:::-;52857:51;;;;:::i;:::-;52981:12;;52958:19;;52822:86;;-1:-1:-1;52919:26:0;;52949:28;;:6;:28;:::i;:::-;52948:45;;;;:::i;:::-;53051:12;;53033:14;;52919:74;;-1:-1:-1;53006:14:0;;53024:23;;:6;:23;:::i;:::-;53023:40;;;;:::i;:::-;53006:57;;53076:30;53093:12;53076:16;:30::i;:::-;53144:21;53182:18;;53178:142;;53254:54;53267:24;53293:14;53254:12;:54::i;:::-;53332:36;53349:18;53332:16;:36::i;:::-;53405:21;;53514:10;;53510:177;;53568:15;;53560:48;;53542:12;;-1:-1:-1;;;;;53568:15:0;;53597:6;;53560:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53541:67;;;53631:7;53623:52;;;;-1:-1:-1;;;53623:52:0;;;;;;;:::i;:::-;53510:177;;53726:4;;53719:37;;-1:-1:-1;;;53719:37:0;;53699:17;;-1:-1:-1;;;;;53726:4:0;;53719:22;;:37;;53750:4;;53719:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53699:57;-1:-1:-1;53699:57:0;53847:13;;53843:334;;53899:4;;53940:15;;53892:107;;-1:-1:-1;;;53892:107:0;;53877:12;;-1:-1:-1;;;;;53899:4:0;;;;53892:21;;:107;;53940:15;;;;53975:9;;53892:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53877:122;;54018:7;54014:152;;;54046:15;;:48;;-1:-1:-1;;;54046:48:0;;-1:-1:-1;;;;;54046:15:0;;;;:37;;:48;;54084:9;;54046:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54118:32;54132:6;54140:9;54118:32;;;;;;;:::i;:::-;;;;;;;;54014:152;53843:334;;54193:10;;54189:71;;54220:28;54234:4;54241:6;54220:5;:28::i;:::-;52678:1589;;;;;;;;;;:::o;54721:502::-;54811:16;;;54825:1;54811:16;;;;;;;;54787:21;;54811:16;;;;;;;;;;-1:-1:-1;54811:16:0;54787:40;;54856:4;54838;54843:1;54838:7;;;;;;-1:-1:-1;;;54838:7:0;;;;;;;;;-1:-1:-1;;;;;54838:23:0;;;:7;;;;;;;;;;:23;;;;54882:6;;:13;;;-1:-1:-1;;;54882:13:0;;;;:6;;;;;:11;;:13;;;;;54838:7;;54882:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54872:4;54877:1;54872:7;;;;;;-1:-1:-1;;;54872:7:0;;;;;;;;;-1:-1:-1;;;;;54872:23:0;;;:7;;;;;;;;;:23;54940:6;;54908:53;;54925:4;;54940:6;54949:11;54908:8;:53::i;:::-;55000:6;;:215;;-1:-1:-1;;;55000:215:0;;-1:-1:-1;;;;;55000:6:0;;;;:57;;:215;;55072:11;;55000:6;;55142:4;;55169;;55189:15;;55000:215;;;:::i;55231:501::-;55411:6;;55379:53;;55396:4;;-1:-1:-1;;;;;55411:6:0;55420:11;55379:8;:53::i;:::-;55475:6;;:249;;-1:-1:-1;;;55475:249:0;;-1:-1:-1;;;;;55475:6:0;;;;:22;;55505:9;;55475:249;;55538:4;;55558:11;;55475:6;;;;55538:4;;55698:15;;55475:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15988:675::-;-1:-1:-1;;;;;16072:21:0;;16064:67;;;;-1:-1:-1;;;16064:67:0;;;;;;;:::i;:::-;16144:49;16165:7;16182:1;16186:6;16144:20;:49::i;:::-;-1:-1:-1;;;;;16231:18:0;;16206:22;16231:18;;;;;;;;;;;16268:24;;;;16260:71;;;;-1:-1:-1;;;16260:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16367:18:0;;:9;:18;;;;;;;;;;;16388:23;;;16367:44;;16506:12;:22;;;;;;;16557:37;16367:9;;:18;16557:37;;;;16405:6;;16557:37;:::i;:::-;;;;;;;;16607:48;16627:7;16644:1;16648:6;16607:19;:48::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;:::-;262:5;84:189;-1:-1:-1;;;84:189:1:o;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:1;1398:18;;;;1385:32;;1057:366::o;1428:396::-;;;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1575:6;1567;1560:22;1522:2;1619:9;1606:23;1638:33;1665:5;1638:33;:::i;:::-;1690:5;-1:-1:-1;1747:2:1;1732:18;;1719:32;1760;1719;1760;:::i;1829:327::-;;;1958:2;1946:9;1937:7;1933:23;1929:32;1926:2;;;1979:6;1971;1964:22;1926:2;2023:9;2010:23;2042:33;2069:5;2042:33;:::i;:::-;2094:5;2146:2;2131:18;;;;2118:32;;-1:-1:-1;;;1916:240:1:o;2161:509::-;;;;;;2352:3;2340:9;2331:7;2327:23;2323:33;2320:2;;;2374:6;2366;2359:22;2320:2;2411:9;2405:16;2430:33;2457:5;2430:33;:::i;:::-;2527:2;2512:18;;2506:25;2571:2;2556:18;;2550:25;2615:2;2600:18;;2594:25;2659:3;2644:19;;;2638:26;2482:5;;2506:25;;-1:-1:-1;2550:25:1;2594;-1:-1:-1;2638:26:1;;-1:-1:-1;2310:360:1;-1:-1:-1;;;2310:360:1:o;2675:253::-;;2784:2;2772:9;2763:7;2759:23;2755:32;2752:2;;;2805:6;2797;2790:22;2752:2;2849:9;2836:23;2868:30;2892:5;2868:30;:::i;2933:257::-;;3053:2;3041:9;3032:7;3028:23;3024:32;3021:2;;;3074:6;3066;3059:22;3021:2;3111:9;3105:16;3130:30;3154:5;3130:30;:::i;3195:190::-;;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3328:6;3320;3313:22;3275:2;-1:-1:-1;3356:23:1;;3265:120;-1:-1:-1;3265:120:1:o;3390:194::-;;3513:2;3501:9;3492:7;3488:23;3484:32;3481:2;;;3534:6;3526;3519:22;3481:2;-1:-1:-1;3562:16:1;;3471:113;-1:-1:-1;3471:113:1:o;3589:258::-;;;3718:2;3706:9;3697:7;3693:23;3689:32;3686:2;;;3739:6;3731;3724:22;3686:2;-1:-1:-1;;3767:23:1;;;3837:2;3822:18;;;3809:32;;-1:-1:-1;3676:171:1:o;3852:326::-;;;;3998:2;3986:9;3977:7;3973:23;3969:32;3966:2;;;4019:6;4011;4004:22;3966:2;-1:-1:-1;;4047:23:1;;;4117:2;4102:18;;4089:32;;-1:-1:-1;4168:2:1;4153:18;;;4140:32;;3956:222;-1:-1:-1;3956:222:1:o;4183:316::-;;;;4340:2;4328:9;4319:7;4315:23;4311:32;4308:2;;;4361:6;4353;4346:22;4308:2;4395:9;4389:16;4379:26;;4445:2;4434:9;4430:18;4424:25;4414:35;;4489:2;4478:9;4474:18;4468:25;4458:35;;4298:201;;;;;:::o;4504:205::-;4704:3;4695:14::o;4714:203::-;-1:-1:-1;;;;;4878:32:1;;;;4860:51;;4848:2;4833:18;;4815:102::o;5146:304::-;-1:-1:-1;;;;;5376:15:1;;;5358:34;;5428:15;;5423:2;5408:18;;5401:43;5308:2;5293:18;;5275:175::o;5455:375::-;-1:-1:-1;;;;;5713:15:1;;;5695:34;;5765:15;;;;5760:2;5745:18;;5738:43;5812:2;5797:18;;5790:34;;;;5645:2;5630:18;;5612:218::o;5835:284::-;-1:-1:-1;;;;;6021:32:1;;;;6003:51;;6097:14;6090:22;6085:2;6070:18;;6063:50;5991:2;5976:18;;5958:161::o;6124:274::-;-1:-1:-1;;;;;6316:32:1;;;;6298:51;;6380:2;6365:18;;6358:34;6286:2;6271:18;;6253:145::o;6403:607::-;-1:-1:-1;;;;;6762:15:1;;;6744:34;;6809:2;6794:18;;6787:34;;;;6852:2;6837:18;;6830:34;;;;6895:2;6880:18;;6873:34;;;;6944:15;;;6938:3;6923:19;;6916:44;6724:3;6976:19;;6969:35;;;;6693:3;6678:19;;6660:350::o;7015:489::-;-1:-1:-1;;;;;7292:32:1;;;;7274:51;;7356:2;7341:18;;7334:34;;;;7399:2;7384:18;;7377:34;;;;7442:2;7427:18;;7420:34;7485:3;7470:19;;7463:35;7261:3;7246:19;;7228:276::o;7509:187::-;7674:14;;7667:22;7649:41;;7637:2;7622:18;;7604:92::o;8167:603::-;;8308:2;8337;8326:9;8319:21;8369:6;8363:13;8412:6;8407:2;8396:9;8392:18;8385:34;8437:4;8450:140;8464:6;8461:1;8458:13;8450:140;;;8559:14;;;8555:23;;8549:30;8525:17;;;8544:2;8521:26;8514:66;8479:10;;8450:140;;;8608:6;8605:1;8602:13;8599:2;;;8678:4;8673:2;8664:6;8653:9;8649:22;8645:31;8638:45;8599:2;-1:-1:-1;8754:2:1;8733:15;-1:-1:-1;;8729:29:1;8714:45;;;;8761:2;8710:54;;8288:482;-1:-1:-1;;;8288:482:1:o;8775:399::-;8977:2;8959:21;;;9016:2;8996:18;;;8989:30;9055:34;9050:2;9035:18;;9028:62;-1:-1:-1;;;9121:2:1;9106:18;;9099:33;9164:3;9149:19;;8949:225::o;9179:342::-;9381:2;9363:21;;;9420:2;9400:18;;;9393:30;-1:-1:-1;;;9454:2:1;9439:18;;9432:48;9512:2;9497:18;;9353:168::o;9526:398::-;9728:2;9710:21;;;9767:2;9747:18;;;9740:30;9806:34;9801:2;9786:18;;9779:62;-1:-1:-1;;;9872:2:1;9857:18;;9850:32;9914:3;9899:19;;9700:224::o;9929:342::-;10131:2;10113:21;;;10170:2;10150:18;;;10143:30;-1:-1:-1;;;10204:2:1;10189:18;;10182:48;10262:2;10247:18;;10103:168::o;10276:399::-;10478:2;10460:21;;;10517:2;10497:18;;;10490:30;10556:34;10551:2;10536:18;;10529:62;-1:-1:-1;;;10622:2:1;10607:18;;10600:33;10665:3;10650:19;;10450:225::o;10680:402::-;10882:2;10864:21;;;10921:2;10901:18;;;10894:30;10960:34;10955:2;10940:18;;10933:62;-1:-1:-1;;;11026:2:1;11011:18;;11004:36;11072:3;11057:19;;10854:228::o;11087:398::-;11289:2;11271:21;;;11328:2;11308:18;;;11301:30;11367:34;11362:2;11347:18;;11340:62;-1:-1:-1;;;11433:2:1;11418:18;;11411:32;11475:3;11460:19;;11261:224::o;11490:420::-;11692:2;11674:21;;;11731:2;11711:18;;;11704:30;11770:34;11765:2;11750:18;;11743:62;11841:26;11836:2;11821:18;;11814:54;11900:3;11885:19;;11664:246::o;11915:356::-;12117:2;12099:21;;;12136:18;;;12129:30;12195:34;12190:2;12175:18;;12168:62;12262:2;12247:18;;12089:182::o;12276:398::-;12478:2;12460:21;;;12517:2;12497:18;;;12490:30;12556:34;12551:2;12536:18;;12529:62;-1:-1:-1;;;12622:2:1;12607:18;;12600:32;12664:3;12649:19;;12450:224::o;12679:353::-;12881:2;12863:21;;;12920:2;12900:18;;;12893:30;12959:31;12954:2;12939:18;;12932:59;13023:2;13008:18;;12853:179::o;13037:402::-;13239:2;13221:21;;;13278:2;13258:18;;;13251:30;13317:34;13312:2;13297:18;;13290:62;-1:-1:-1;;;13383:2:1;13368:18;;13361:36;13429:3;13414:19;;13211:228::o;13444:341::-;13646:2;13628:21;;;13685:2;13665:18;;;13658:30;-1:-1:-1;;;13719:2:1;13704:18;;13697:47;13776:2;13761:18;;13618:167::o;13790:356::-;13992:2;13974:21;;;14011:18;;;14004:30;14070:34;14065:2;14050:18;;14043:62;14137:2;14122:18;;13964:182::o;14151:347::-;14353:2;14335:21;;;14392:2;14372:18;;;14365:30;14431:25;14426:2;14411:18;;14404:53;14489:2;14474:18;;14325:173::o;14503:351::-;14705:2;14687:21;;;14744:2;14724:18;;;14717:30;14783:29;14778:2;14763:18;;14756:57;14845:2;14830:18;;14677:177::o;14859:355::-;15061:2;15043:21;;;15100:2;15080:18;;;15073:30;15139:33;15134:2;15119:18;;15112:61;15205:2;15190:18;;15033:181::o;15219:354::-;15421:2;15403:21;;;15460:2;15440:18;;;15433:30;15499:32;15494:2;15479:18;;15472:60;15564:2;15549:18;;15393:180::o;15578:397::-;15780:2;15762:21;;;15819:2;15799:18;;;15792:30;15858:34;15853:2;15838:18;;15831:62;-1:-1:-1;;;15924:2:1;15909:18;;15902:31;15965:3;15950:19;;15752:223::o;15980:356::-;16182:2;16164:21;;;16201:18;;;16194:30;16260:34;16255:2;16240:18;;16233:62;16327:2;16312:18;;16154:182::o;16341:401::-;16543:2;16525:21;;;16582:2;16562:18;;;16555:30;16621:34;16616:2;16601:18;;16594:62;-1:-1:-1;;;16687:2:1;16672:18;;16665:35;16732:3;16717:19;;16515:227::o;16747:400::-;16949:2;16931:21;;;16988:2;16968:18;;;16961:30;17027:34;17022:2;17007:18;;17000:62;-1:-1:-1;;;17093:2:1;17078:18;;17071:34;17137:3;17122:19;;16921:226::o;17152:406::-;17354:2;17336:21;;;17393:2;17373:18;;;17366:30;17432:34;17427:2;17412:18;;17405:62;-1:-1:-1;;;17498:2:1;17483:18;;17476:40;17548:3;17533:19;;17326:232::o;17563:401::-;17765:2;17747:21;;;17804:2;17784:18;;;17777:30;17843:34;17838:2;17823:18;;17816:62;-1:-1:-1;;;17909:2:1;17894:18;;17887:35;17954:3;17939:19;;17737:227::o;17969:177::-;18115:25;;;18103:2;18088:18;;18070:76::o;18151:983::-;;18461:3;18450:9;18446:19;18492:6;18481:9;18474:25;18518:2;18556:6;18551:2;18540:9;18536:18;18529:34;18599:3;18594:2;18583:9;18579:18;18572:31;18623:6;18658;18652:13;18689:6;18681;18674:22;18727:3;18716:9;18712:19;18705:26;;18766:2;18758:6;18754:15;18740:29;;18787:4;18800:195;18814:6;18811:1;18808:13;18800:195;;;18879:13;;-1:-1:-1;;;;;18875:39:1;18863:52;;18970:15;;;;18935:12;;;;18911:1;18829:9;18800:195;;;-1:-1:-1;;;;;;;19051:32:1;;;;19046:2;19031:18;;19024:60;-1:-1:-1;;;19115:3:1;19100:19;19093:35;19012:3;18422:712;-1:-1:-1;;;18422:712:1:o;19139:248::-;19313:25;;;19369:2;19354:18;;19347:34;19301:2;19286:18;;19268:119::o;19392:319::-;19594:25;;;19650:2;19635:18;;19628:34;;;;19693:2;19678:18;;19671:34;19582:2;19567:18;;19549:162::o;19716:184::-;19888:4;19876:17;;;;19858:36;;19846:2;19831:18;;19813:87::o;19905:128::-;;19976:1;19972:6;19969:1;19966:13;19963:2;;;19982:18;;:::i;:::-;-1:-1:-1;20018:9:1;;19953:80::o;20038:217::-;;20104:1;20094:2;;-1:-1:-1;;;20129:31:1;;20183:4;20180:1;20173:15;20211:4;20136:1;20201:15;20094:2;-1:-1:-1;20240:9:1;;20084:171::o;20260:168::-;;20366:1;20362;20358:6;20354:14;20351:1;20348:21;20343:1;20336:9;20329:17;20325:45;20322:2;;;20373:18;;:::i;:::-;-1:-1:-1;20413:9:1;;20312:116::o;20433:125::-;;20501:1;20498;20495:8;20492:2;;;20506:18;;:::i;:::-;-1:-1:-1;20543:9:1;;20482:76::o;20563:380::-;20648:1;20638:12;;20695:1;20685:12;;;20706:2;;20760:4;20752:6;20748:17;20738:27;;20706:2;20813;20805:6;20802:14;20782:18;20779:38;20776:2;;;20859:10;20854:3;20850:20;20847:1;20840:31;20894:4;20891:1;20884:15;20922:4;20919:1;20912:15;20776:2;;20618:325;;;:::o;20948:127::-;21009:10;21004:3;21000:20;20997:1;20990:31;21040:4;21037:1;21030:15;21064:4;21061:1;21054:15;21080:133;-1:-1:-1;;;;;21157:31:1;;21147:42;;21137:2;;21203:1;21200;21193:12;21218:120;21306:5;21299:13;21292:21;21285:5;21282:32;21272:2;;21328:1;21325;21318:12

Swarm Source

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