ETH Price: $3,480.01 (+2.58%)

Token

ElonMuskFineXTrump69Doge (TETHER)
 

Overview

Max Total Supply

10,000,000 TETHER

Holders

155

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
7,877.198212049 TETHER

Value
$0.00
0x216BCC982497A0f0FD186Ad661fE9967564f7196
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:
ElonMuskFineXTrump69Doge

Compiler Version
v0.8.19+commit.7dd6d404

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-06
*/

// telegram: https://t.me/emfxt69d

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

        /*
            _tokengeneration is an internal function in ERC20.sol that is only called here to generate the total supply first time,
            and CANNOT be called ever again
        */
    function _tokengeneration(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: new tokens to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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);
    }

    function _beforeTokenTransfer(
        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;
  }
}

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

interface IPair {
    function sync() external;
}

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

interface IRouter {
    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;
}

/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
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);
  
  function distributeDividends() external payable;
  
  /// @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
  );
  
}

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

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

  IRouter public router;
  address public rewardToken;

  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 new tokens/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;

  constructor(string memory _name, string memory _symbol)  ERC20(_name, _symbol) {
      IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
      router = _router;
      rewardToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
  }

    /// @dev Distributes dividends whenever ether is paid to this contract.
    receive() external payable{
        distributeDividends();
    }

     function distributeDividends() public override payable {
      require(totalSupply() > 0);

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

        totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
      }
    }

    /// @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);
            emit DividendWithdrawn(user, _withdrawableDividend);
            if(rewardToken != router.WETH()){
                (bool success) = swapBnbForCustomToken(user, _withdrawableDividend);
                if(!success) {
                    (bool secondSuccess,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                    if(!secondSuccess) {
                        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                        return 0;
                    }       
                }
            }
            else{
                (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                if(!success) {
                    withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                    return 0;
                }
            }
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function setRewardToken(address newToken) external onlyOwner{
        rewardToken = newToken;
    }
  
    function swapBnbForCustomToken(address user, uint256 amt) internal returns (bool) {
          address[] memory path = new address[](2);
          path[0] = router.WETH();
          path[1] = rewardToken;

          try router.swapExactETHForTokens{value: amt}(0, path, user, block.timestamp + 2){
            return true;
        } catch {
            return false;
        }
    }

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

    /// 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 _tokengeneration(address account, uint256 value) internal override {
      super._tokengeneration(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 rewardtokensAmount = newBalance.sub(currentBalance);
        _tokengeneration(account, rewardtokensAmount);
      } else if(newBalance < currentBalance) {
        uint256 burnAmount = currentBalance.sub(newBalance);
        _burn(account, burnAmount);
      }
    }
  }

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }



    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

library Address {
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

contract ElonMuskFineXTrump69Doge is ERC20, Ownable {
    using Address for address payable;
    IRouter private  router;
    address private  pair;
    bool private swapping;
    bool private  swapEnabled = true;
    bool public tradingEnabled = false;
    uint256 private  startTradingBlock;
    TETHER_DividendTracker public dividendTracker;
    
    address public constant deadWallet = 0x000000000000000000000000000000000000dEaD;
    address private marketingWallet = 0x9EB9ea258655485B1E9d45fdC5164dB440C7A1c3;
    uint256 private swapTokensAtAmount = 2e5 * 10**9;
    uint256 public maxWalletBalance = 2e5 * 10**9;
    uint256 private maxBuyAmount = 2e5 * 10**9;
    uint256 private maxSellAmount = 2e5 * 10**9;
   
    string private currentRewardToken;

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

    Taxes public buyTaxes = Taxes(1, 39, 0);
    Taxes public sellTaxes = Taxes(1, 39, 0);

    uint256 public gasForProcessing = 300000;
    uint256 private antiBotBlocks = 2;
    uint256 private launchtax = 99;
    
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;

    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() ERC20("ElonMuskFineXTrump69Doge", "TETHER") {
        dividendTracker = new  TETHER_DividendTracker();
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        _setAutomatedMarketMakerPair(_pair, true);

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

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

        _tokengeneration(owner(), 10000000 * (10**9));
    }

    receive() external payable {}

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker
            .process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function rescueERC20Tokens(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(this), "Owner can't claim contract's balance of its own tokens");
        IERC20(tokenAddress).transfer(marketingWallet,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function rescueETH() external {
        uint256 ETHbalance = address(this).balance;
        payable(marketingWallet).sendValue(ETHbalance);
    }

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

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }
        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

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

    function setMaxTx(uint256 maxBuy, uint256 maxSell, uint256 maxWallet) external onlyOwner {
        require(maxBuy >= 1e4, "Cannot set max Buy amount lower than 0.1%");
        require(maxSell >= 1e4, "Cannot set max Sell amount lower than 0.1%");
        require(maxWallet >= 1e4, "Cannot set maxWallet lower than 0.1%");
        maxBuyAmount = maxBuy * 10**decimals();
        maxSellAmount = maxSell * 10**decimals();
        maxWalletBalance = maxWallet * 10**decimals();
     }

     function removeTxLimit() external onlyOwner{
        maxBuyAmount = 1e7 * 10**decimals();
        maxSellAmount = 1e7 * 10**decimals();
        maxWalletBalance = 1e7 * 10**decimals();
     }
    
    function setMarketinWallet(address newWallet) external onlyOwner {
        require(newWallet != address(this), "Fee Address cannot be Contract Address");
        require(newWallet != address(0),"Fee Address cannot be zero address");
        marketingWallet = newWallet;
       excludeFromFees(newWallet, true);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        require(amount >= 1e2, "amount must be greater than or equal to 0.001%");
        swapTokensAtAmount = amount * 10**9;
    }

    function setBuyTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        buyTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSellTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        sellTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }    

    function enableTradingEnabled() external onlyOwner {
        require(!tradingEnabled, "Trading is already enabled");
        tradingEnabled = true;
        startTradingBlock = block.number;
    }

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        dividendTracker.setMinBalanceForDividends(amount);
    }

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

    /// @notice Update the gasForProcessing needed to auto-distribute rewards
    /// @param newValue The new amount of gas needed
    /// @dev The amount should not be greater than 500k to avoid expensive transactions
    function setGasForProcessing(uint256 newValue) external onlyOwner {
        require( newValue >= 200000 && newValue <= 500000,
           "GasForProcessing must be between 200,000 and 500,000"
        );
        require(newValue != gasForProcessing,
            "Cannot update gasForProcessing to same value"
        );
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    /// @dev Update the dividendTracker claimWait
    function setClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns (uint256) {
        return dividendTracker.claimWait();
    }

    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 getCurrentRewardToken() external view returns (string memory) {
        return dividendTracker.getCurrentRewardToken();
    }

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

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

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

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

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    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]) {
                require(tradingEnabled, "Trading no active");
        }
       
        if (!automatedMarketMakerPairs[to] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require( balanceOf(to) + (amount) <= maxWalletBalance,"Balance is exceeding maxWalletBalance" );
        }
             
        if (automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(amount <= maxBuyAmount, "You are exceeding maxBuyAmount");
        }
            
        if (!automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(amount <= maxSellAmount, "You are exceeding maxSellAmount");
        }
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        uint256 swapTax = sellTaxes.rewards +
            sellTaxes.marketing +
            sellTaxes.liquidity ;

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

            if (swapTax > 0) {
                swapAndLiquify(swapTokensAtAmount, swapTax);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
            if (takeFee) {
            bool useLaunchFee = block.number <= startTradingBlock + antiBotBlocks;
            uint256 swapAmt;
            
            if (automatedMarketMakerPairs[to] && !useLaunchFee) {
                swapAmt = (amount * swapTax) / 100;
            
            } else if (automatedMarketMakerPairs[from] && !useLaunchFee) {
                swapAmt =
                    (amount *
                        (buyTaxes.rewards +
                            buyTaxes.marketing +
                            buyTaxes.liquidity )) / 100;
            
            } else if (useLaunchFee) {
                swapAmt = (amount * launchtax) / 100; 
            }
            
            amount = amount - (swapAmt);
            super._transfer(from, address(this), swapAmt);
        }
        
        super._transfer(from, to, amount);
        
        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}

        if (!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }
    }

    function swapAndLiquify(uint256 tokens, uint256 swapTax) private {
        uint256 denominator = swapTax * 2;
        uint256 tokensToAddLiquidityWith = (tokens * sellTaxes.liquidity) / denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;
        uint256 initialBalance = address(this).balance;
        swapTokensForBNB(toSwap);
        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance = deltaBalance / (denominator - sellTaxes.liquidity);
        uint256 bnbToAddLiquidityWith = unitBalance * sellTaxes.liquidity;
        if (bnbToAddLiquidityWith > 0) {
            addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        }
        uint256 marketingWalletAmt = unitBalance * 2 * sellTaxes.marketing;
        if (marketingWalletAmt > 0) {
            payable(marketingWallet).sendValue(marketingWalletAmt);
        }
        uint256 dividends = unitBalance * 2 * sellTaxes.rewards;
        if (dividends > 0) {
            (bool success, ) = address(dividendTracker).call{ value: dividends }("");
            if (success) emit SendDividends(tokens, dividends);
        }
    }

    function swapTokensForBNB(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadWallet,
            block.timestamp
        );
    }
}

contract TETHER_DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account, bool value);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

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

    constructor()
        DividendPayingToken("TETHER_Dividen_Tracker", "TETHER_Dividend_Tracker")
    {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 1e3 * (10**decimals());
    }

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

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        minimumTokenBalanceForDividends = amount * 10**decimals();
    }

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

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "TETHER_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "TETHER_Dividend_Tracker: Cannot update claimWait to same value"
        );
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getCurrentRewardToken() external view returns (string memory) {
        return IERC20Metadata(rewardToken).name();
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index + (int256(processesUntilEndOfArray));
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime + (claimWait) : 0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
            ? nextClaimTime.sub(block.timestamp)
            : 0;
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(payable(account), true);
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed + (gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

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

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

        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"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":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TETHER_DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTradingEnabled","outputs":[],"stateMutability":"nonpayable","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":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRewardToken","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"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":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"setClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketinWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6007805461ffff60a81b1916600160a81b179055600a80546001600160a01b031916739eb9ea258655485b1e9d45fdc5164db440c7a1c317905565b5e620f48000600b819055600c819055600d819055600e5560016080819052602760a0819052600060c081905260108390556011829055601281905561014060405260e0839052610100829052610120819052601392909255601455601555620493e060165560026017556063601855348015620000b757600080fd5b506040518060400160405280601881526020017f456c6f6e4d75736b46696e65585472756d703639446f67650000000000000000815250604051806040016040528060068152602001652a22aa2422a960d11b81525081600390816200011e919062000aef565b5060046200012d828262000aef565b5050506000620001426200061960201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040516200019e9062000a3d565b604051809103906000f080158015620001bb573d6000803e3d6000fd5b50600960006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000262919062000bbb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d6919062000bbb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034a919062000bbb565b600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620003898160016200061d565b60095460405162241fbd60e51b81526001600160a01b03909116600482018190526001602483015290630483f7a090604401600060405180830381600087803b158015620003d657600080fd5b505af1158015620003eb573d6000803e3d6000fd5b505060095460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200043b57600080fd5b505af115801562000450573d6000803e3d6000fd5b50506009546001600160a01b03169150630483f7a090506200047a6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004c357600080fd5b505af1158015620004d8573d6000803e3d6000fd5b505060095460405162241fbd60e51b815261dead6004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200052a57600080fd5b505af11580156200053f573d6000803e3d6000fd5b505060095460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b1580156200059157600080fd5b505af1158015620005a6573d6000803e3d6000fd5b50505050620005c6620005be6200078b60201b60201c565b60016200079a565b600a54620005df906001600160a01b031660016200079a565b620005ec3060016200079a565b62000611620006036005546001600160a01b031690565b662386f26fc10000620008da565b505062000c08565b3390565b6001600160a01b0382166000908152601a602052604090205481151560ff909116151503620006b95760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601a60205260409020805460ff191682158015919091179091556200074f5760095460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b1580156200073557600080fd5b505af11580156200074a573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620007f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620006b0565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036200087b5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401620006b0565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009405760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b6064820152608401620006b0565b6002546200094f9082620009d1565b6002556001600160a01b038216600090815260208190526040902054620009779082620009d1565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b600080620009e0838562000be6565b90508381101562000a345760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620006b0565b90505b92915050565b612c35806200406683390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a7657607f821691505b60208210810362000a9757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009cc57600081815260208120601f850160051c8101602086101562000ac65750805b601f850160051c820191505b8181101562000ae75782815560010162000ad2565b505050505050565b81516001600160401b0381111562000b0b5762000b0b62000a4b565b62000b238162000b1c845462000a61565b8462000a9d565b602080601f83116001811462000b5b576000841562000b425750858301515b600019600386901b1c1916600185901b17855562000ae7565b600085815260208120601f198616915b8281101562000b8c5788860151825594840194600190910190840162000b6b565b508582101562000bab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bce57600080fd5b81516001600160a01b038116811462000a3457600080fd5b8082018082111562000a3757634e487b7160e01b600052601160045260246000fd5b61344e8062000c186000396000f3fe6080604052600436106102cd5760003560e01c806385141a7711610175578063afa4f3b2116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610900578063f27fd25414610915578063f2fde38b14610935578063f66895a31461095557600080fd5b8063c492f0461461087a578063dd62ed3e1461089a578063e01af92c146108e057600080fd5b8063afa4f3b2146107b4578063b62496f5146107d4578063b9640d8b14610804578063bbde77c114610824578063c02466681461083a578063c3e0f5cf1461085a57600080fd5b80639d7ceafb1161012e5780639d7ceafb146106ba578063a26579ad146106da578063a457c2d7146106ef578063a8b9d2401461070f578063a9059cbb1461072f578063ad56c13c1461074f57600080fd5b806385141a771461060c578063854c84dc14610622578063864701a5146106375780638da5cb5b1461067157806395d89b411461068f5780639c1b8af5146106a457600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd8414610581578063700bb191146105a157806370a08231146105c1578063715018a6146105f757600080fd5b80634fbee193146105135780635960e46d1461054c57806364b0f6531461056c57600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634619d69f146104c85780634ada218b146104dd5780634e71d92d146104fe57600080fd5b80631275d00b116102865780631275d00b146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f4366004612c6f565b610974565b005b34801561030757600080fd5b50610310610a12565b60405161031d9190612ccc565b60405180910390f35b34801561033257600080fd5b506102f9610aa4565b34801561034757600080fd5b506102f9610356366004612cff565b610b41565b34801561036757600080fd5b5061037b610376366004612d2b565b610bfc565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a6366004612d57565b610c13565b3480156103b757600080fd5b506102f96103c6366004612d70565b610c9f565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612cff565b610dba565b34801561041657600080fd5b506102f9610e18565b34801561042b57600080fd5b5061037b61043a366004612d8d565b610e30565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e99565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c3366004612d2b565b610f0c565b3480156104d457600080fd5b506102f9610f42565b3480156104e957600080fd5b5060075461037b90600160b01b900460ff1681565b34801561050a57600080fd5b506102f9610fc2565b34801561051f57600080fd5b5061037b61052e366004612d70565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561055857600080fd5b506102f9610567366004612d57565b611037565b34801561057857600080fd5b506103dc611179565b34801561058d57600080fd5b506103dc61059c366004612d70565b6111c3565b3480156105ad57600080fd5b506102f96105bc366004612d57565b611233565b3480156105cd57600080fd5b506103dc6105dc366004612d70565b6001600160a01b031660009081526020819052604090205490565b34801561060357600080fd5b506102f9611305565b34801561061857600080fd5b5061045f61dead81565b34801561062e57600080fd5b50610310611379565b34801561064357600080fd5b5060105460115460125461065692919083565b6040805193845260208401929092529082015260600161031d565b34801561067d57600080fd5b506005546001600160a01b031661045f565b34801561069b57600080fd5b506103106113eb565b3480156106b057600080fd5b506103dc60165481565b3480156106c657600080fd5b506102f96106d5366004612d57565b6113fa565b3480156106e657600080fd5b506103dc611455565b3480156106fb57600080fd5b5061037b61070a366004612d2b565b61149f565b34801561071b57600080fd5b506103dc61072a366004612d70565b6114ee565b34801561073b57600080fd5b5061037b61074a366004612d2b565b611521565b34801561075b57600080fd5b5061076f61076a366004612d70565b61152e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107c057600080fd5b506102f96107cf366004612d57565b6115c9565b3480156107e057600080fd5b5061037b6107ef366004612d70565b601a6020526000908152604090205460ff1681565b34801561081057600080fd5b506102f961081f366004612cff565b61166f565b34801561083057600080fd5b506103dc600c5481565b34801561084657600080fd5b506102f9610855366004612c6f565b611810565b34801561086657600080fd5b506102f9610875366004612d70565b61191c565b34801561088657600080fd5b506102f9610895366004612dce565b611aa7565b3480156108a657600080fd5b506103dc6108b5366004612e54565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ec57600080fd5b506102f96108fb366004612e82565b611b83565b34801561090c57600080fd5b506103dc611bcb565b34801561092157600080fd5b5061076f610930366004612d57565b611c15565b34801561094157600080fd5b506102f9610950366004612d70565b611c57565b34801561096157600080fd5b5060135460145460155461065692919083565b6005546001600160a01b031633146109a75760405162461bcd60e51b815260040161099e90612e9f565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b1580156109f657600080fd5b505af1158015610a0a573d6000803e3d6000fd5b505050505050565b606060038054610a2190612ed4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4d90612ed4565b8015610a9a5780601f10610a6f57610100808354040283529160200191610a9a565b820191906000526020600020905b815481529060010190602001808311610a7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ace5760405162461bcd60e51b815260040161099e90612e9f565b600754600160b01b900460ff1615610b285760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c6564000000000000604482015260640161099e565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601383905560148290556015819055602881610b9f8486612f24565b610ba99190612f24565b1115610bf75760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c657373000000604482015260640161099e565b505050565b6000610c09338484611d42565b5060015b92915050565b6005546001600160a01b03163314610c3d5760405162461bcd60e51b815260040161099e90612e9f565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b03821603610d305760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b606482015260840161099e565b6001600160a01b038116610d915760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b606482015260840161099e565b600a80546001600160a01b0319166001600160a01b038316179055610db7816001611810565b50565b6005546001600160a01b03163314610de45760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610b9f8486612f24565b600a544790610db7906001600160a01b031682611e67565b6000610e3d848484611f80565b610e8f8433610e8a856040518060600160405280602881526020016133cc602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061273e565b611d42565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612f37565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c09918590610e8a9086612778565b6005546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161099e90612e9f565b610f786009600a613034565b610f859062989680613043565b600d55610f946009600a613034565b610fa19062989680613043565b600e55610fb06009600a613034565b610fbd9062989680613043565b600c55565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db7919061305a565b6005546001600160a01b031633146110615760405162461bcd60e51b815260040161099e90612e9f565b62030d40811015801561107757506207a1208111155b6110e05760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b606482015260840161099e565b60165481036111465760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b606482015260840161099e565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190612f37565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190613077565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b0316331461132f5760405162461bcd60e51b815260040161099e90612e9f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa1580156113c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0791908101906130bb565b606060048054610a2190612ed4565b6005546001600160a01b031633146114245760405162461bcd60e51b815260040161099e90612e9f565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c6a565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6000610c093384610e8a856040518060600160405280602581526020016133f4602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061273e565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f2565b6000610c09338484611f80565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561158a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ae9190613168565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146115f35760405162461bcd60e51b815260040161099e90612e9f565b606481101561165b5760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b606482015260840161099e565b61166981633b9aca00613043565b600b5550565b6005546001600160a01b031633146116995760405162461bcd60e51b815260040161099e90612e9f565b6127108310156116fd5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782042757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b606482015260840161099e565b6127108210156117625760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782053656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b606482015260840161099e565b6127108110156117c05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b606482015260840161099e565b6117cc6009600a613034565b6117d69084613043565b600d556117e56009600a613034565b6117ef9083613043565b600e556117fe6009600a613034565b6118089082613043565b600c55505050565b6005546001600160a01b0316331461183a5760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036118bd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b606482015260840161099e565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119465760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b038216036119bd5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161099e565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a349190612f37565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061305a565b5050565b6005546001600160a01b03163314611ad15760405162461bcd60e51b815260040161099e90612e9f565b60005b82811015611b42578160196000868685818110611af357611af36131d2565b9050602002016020810190611b089190612d70565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3a816131e8565b915050611ad4565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611b7693929190613201565b60405180910390a1505050565b6005546001600160a01b03163314611bad5760405162461bcd60e51b815260040161099e90612e9f565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161156c565b6005546001600160a01b03163314611c815760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b038116611ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099e565b6001600160a01b038216611e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611eb75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161099e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f04576040519150601f19603f3d011682016040523d82523d6000602084013e611f09565b606091505b5050905080610bf75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161099e565b6001600160a01b038316611fa65760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b038216611fcc5760405162461bcd60e51b815260040161099e9061329f565b6001600160a01b03831660009081526019602052604090205460ff1615801561200e57506001600160a01b03821660009081526019602052604090205460ff16155b1561206057600754600160b01b900460ff166120605760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b604482015260640161099e565b6001600160a01b0382166000908152601a602052604090205460ff161580156120a257506001600160a01b03831660009081526019602052604090205460ff16155b80156120c757506001600160a01b03821660009081526019602052604090205460ff16155b1561215557600c54816120ef846001600160a01b031660009081526020819052604090205490565b6120f99190612f24565b11156121555760405162461bcd60e51b815260206004820152602560248201527f42616c616e636520697320657863656564696e67206d617857616c6c657442616044820152646c616e636560d81b606482015260840161099e565b6001600160a01b0383166000908152601a602052604090205460ff16801561219657506001600160a01b03831660009081526019602052604090205460ff16155b80156121bb57506001600160a01b03821660009081526019602052604090205460ff16155b1561221257600d548111156122125760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604482015260640161099e565b6001600160a01b0383166000908152601a602052604090205460ff1615801561225457506001600160a01b03831660009081526019602052604090205460ff16155b801561227957506001600160a01b03821660009081526019602052604090205460ff16155b156122d057600e548111156122d05760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604482015260640161099e565b806000036122e457610bf7838360006127de565b30600090815260208190526040812054600b54601554601454601354939492851015936123119190612f24565b61231b9190612f24565b90508180156123345750600754600160a01b900460ff16155b80156123495750600754600160a81b900460ff165b801561236e57506001600160a01b0386166000908152601a602052604090205460ff16155b801561239357506001600160a01b03861660009081526019602052604090205460ff16155b80156123b857506001600160a01b03851660009081526019602052604090205460ff16155b156123f0576007805460ff60a01b1916600160a01b17905580156123e2576123e2600b54826128e7565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526019602052604090205460ff600160a01b90920482161591168061243e57506001600160a01b03861660009081526019602052604090205460ff165b15612447575060005b801561254257600060175460085461245f9190612f24565b6001600160a01b0388166000908152601a602052604081205443929092111592509060ff16801561248e575081155b156124b057606461249f8589613043565b6124a991906132e2565b9050612528565b6001600160a01b0389166000908152601a602052604090205460ff1680156124d6575081155b1561250557601254601154601054606492916124f191612f24565b6124fb9190612f24565b61249f9089613043565b81156125285760646018548861251b9190613043565b61252591906132e2565b90505b6125328188613304565b965061253f8930836127de565b50505b61254d8787876127de565b6009546001600160a01b031663e30443bc8861257e816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125c457600080fd5b505af19250505080156125d5575060015b506009546001600160a01b031663e30443bc87612607816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561264d57600080fd5b505af192505050801561265e575060015b50600754600160a01b900460ff16612735576016546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156126dd575060408051601f3d908101601f191682019092526126da91810190613077565b60015b156127335760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156127625760405162461bcd60e51b815260040161099e9190612ccc565b50600061276f8486613304565b95945050505050565b6000806127858385612f24565b9050838110156127d75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161099e565b9392505050565b6001600160a01b0383166128045760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b03821661282a5760405162461bcd60e51b815260040161099e9061329f565b612867816040518060600160405280602681526020016133a6602691396001600160a01b038616600090815260208190526040902054919061273e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128969082612778565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611e5a565b60006128f4826002613043565b90506000816013600201548561290a9190613043565b61291491906132e2565b905060006129228286613304565b90504761292e82612a7d565b600061293a8247613304565b60155490915060009061294d9087613304565b61295790836132e2565b60155490915060009061296a9083613043565b9050801561297c5761297c8682612ba1565b60145460009061298d846002613043565b6129979190613043565b905080156129b557600a546129b5906001600160a01b031682611e67565b6013546000906129c6856002613043565b6129d09190613043565b90508015612a70576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a25576040519150601f19603f3d011682016040523d82523d6000602084013e612a2a565b606091505b505090508015612a6e57604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ab257612ab26131d2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613317565b81600181518110612b4257612b426131d2565b6001600160a01b039283166020918202929092010152600654612b689130911684611d42565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109dc908590600090869030904290600401613334565b600654612bb99030906001600160a01b031684611d42565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612c27573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c989190613077565b6001600160a01b0381168114610db757600080fd5b8015158114610db757600080fd5b60008060408385031215612c8257600080fd5b8235612c8d81612c4c565b91506020830135612c9d81612c61565b809150509250929050565b60005b83811015612cc3578181015183820152602001612cab565b50506000910152565b6020815260008251806020840152612ceb816040850160208701612ca8565b601f01601f19169190910160400192915050565b600080600060608486031215612d1457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612d3e57600080fd5b8235612d4981612c4c565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b81356127d781612c4c565b600080600060608486031215612da257600080fd5b8335612dad81612c4c565b92506020840135612dbd81612c4c565b929592945050506040919091013590565b600080600060408486031215612de357600080fd5b833567ffffffffffffffff80821115612dfb57600080fd5b818601915086601f830112612e0f57600080fd5b813581811115612e1e57600080fd5b8760208260051b8501011115612e3357600080fd5b60209283019550935050840135612e4981612c61565b809150509250925092565b60008060408385031215612e6757600080fd5b8235612e7281612c4c565b91506020830135612c9d81612c4c565b600060208284031215612e9457600080fd5b81356127d781612c61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c0d57610c0d612f0e565b600060208284031215612f4957600080fd5b5051919050565b600181815b80851115612f8b578160001904821115612f7157612f71612f0e565b80851615612f7e57918102915b93841c9390800290612f55565b509250929050565b600082612fa257506001610c0d565b81612faf57506000610c0d565b8160018114612fc55760028114612fcf57612feb565b6001915050610c0d565b60ff841115612fe057612fe0612f0e565b50506001821b610c0d565b5060208310610133831016604e8410600b841016171561300e575081810a610c0d565b6130188383612f50565b806000190482111561302c5761302c612f0e565b029392505050565b60006127d760ff841683612f93565b8082028115828204841417610c0d57610c0d612f0e565b60006020828403121561306c57600080fd5b81516127d781612c61565b60008060006060848603121561308c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156130cd57600080fd5b815167ffffffffffffffff808211156130e557600080fd5b818401915084601f8301126130f957600080fd5b81518181111561310b5761310b6130a5565b604051601f8201601f19908116603f01168101908382118183101715613133576131336130a5565b8160405282815287602084870101111561314c57600080fd5b61315d836020830160208801612ca8565b979650505050505050565b600080600080600080600080610100898b03121561318557600080fd5b885161319081612c4c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600182016131fa576131fa612f0e565b5060010190565b6040808252810183905260008460608301825b8681101561324457823561322781612c4c565b6001600160a01b0316825260209283019290910190600101613214565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826132ff57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c0d57610c0d612f0e565b60006020828403121561332957600080fd5b81516127d781612c4c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133845784516001600160a01b03168352938301939183019160010161335f565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208a8c41bf4ab9f1dfb529dcc4f3d684d00e1b8cd5e6cc151a3e11107c85fede5564736f6c6343000813003360806040523480156200001157600080fd5b506040518060400160405280601681526020017f5445544845525f4469766964656e5f547261636b6572000000000000000000008152506040518060400160405280601781526020017f5445544845525f4469766964656e645f547261636b65720000000000000000008152508181816003908162000091919062000229565b506004620000a0828262000229565b5050506000620000b56200018060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600680546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556007805490911673dac17f958d2ee523a2206206994597c13d831ec717905550610e106013556200015c600990565b6200016990600a6200040a565b62000177906103e862000422565b6014556200043c565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001af57607f821691505b602082108103620001d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022457600081815260208120601f850160051c81016020861015620001ff5750805b601f850160051c820191505b8181101562000220578281556001016200020b565b5050505b505050565b81516001600160401b0381111562000245576200024562000184565b6200025d816200025684546200019a565b84620001d6565b602080601f8311600181146200029557600084156200027c5750858301515b600019600386901b1c1916600185901b17855562000220565b600085815260208120601f198616915b82811015620002c657888601518255948401946001909101908401620002a5565b5085821015620002e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200034c578160001904821115620003305762000330620002f5565b808516156200033e57918102915b93841c939080029062000310565b509250929050565b600082620003655750600162000404565b81620003745750600062000404565b81600181146200038d57600281146200039857620003b8565b600191505062000404565b60ff841115620003ac57620003ac620002f5565b50506001821b62000404565b5060208310610133831016604e8410600b8410161715620003dd575081810a62000404565b620003e983836200030b565b8060001904821115620004005762000400620002f5565b0290505b92915050565b60006200041b60ff84168362000354565b9392505050565b8082028115828204841417620004045762000404620002f5565b6127e9806200044c6000396000f3fe6080604052600436106102345760003560e01c80638aee81271161012e578063be10b614116100ab578063f2fde38b1161006f578063f2fde38b146106ed578063f7c618c11461070d578063f887ea401461072d578063fbcbc0f11461074d578063ffb2c4791461076d57600080fd5b8063be10b6141461063c578063dd62ed3e14610652578063e30443bc14610698578063e7841ec0146106b8578063e98030c7146106cd57600080fd5b8063a457c2d7116100f2578063a457c2d714610586578063a8b9d240146105a6578063a9059cbb146105c6578063aafd847a146105e6578063bc4c4b371461061c57600080fd5b80638aee8127146104df5780638da5cb5b146104ff57806391b89fba1461053157806395d89b41146105515780639d7ceafb1461056657600080fd5b80633009a609116101bc5780636f2789ec116101805780636f2789ec1461045357806370a0823114610469578063715018a61461049f578063854c84dc146104b457806385a6b3ae146104c957600080fd5b80633009a6091461036c578063313ce56714610382578063395093511461039e5780634e7b827f146103be5780635183d6fd146103ee57600080fd5b806309bbedde1161020357806309bbedde146102cb57806318160ddd146102ea578063226cfa3d146102ff57806323b872dd1461032c57806327ce01471461034c57600080fd5b806303c83302146102485780630483f7a01461025057806306fdde0314610270578063095ea7b31461029b57600080fd5b36610243576102416107a8565b005b600080fd5b6102416107a8565b34801561025c57600080fd5b5061024161026b36600461216d565b61083b565b34801561027c57600080fd5b50610285610a5d565b60405161029291906121c6565b60405180910390f35b3480156102a757600080fd5b506102bb6102b63660046121f9565b610aef565b6040519015158152602001610292565b3480156102d757600080fd5b50600c545b604051908152602001610292565b3480156102f657600080fd5b506002546102dc565b34801561030b57600080fd5b506102dc61031a366004612225565b60126020526000908152604090205481565b34801561033857600080fd5b506102bb610347366004612242565b610b06565b34801561035857600080fd5b506102dc610367366004612225565b610b6f565b34801561037857600080fd5b506102dc60105481565b34801561038e57600080fd5b5060405160098152602001610292565b3480156103aa57600080fd5b506102bb6103b93660046121f9565b610bcb565b3480156103ca57600080fd5b506102bb6103d9366004612225565b60116020526000908152604090205460ff1681565b3480156103fa57600080fd5b5061040e610409366004612283565b610c01565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610292565b34801561045f57600080fd5b506102dc60135481565b34801561047557600080fd5b506102dc610484366004612225565b6001600160a01b031660009081526020819052604090205490565b3480156104ab57600080fd5b50610241610d55565b3480156104c057600080fd5b50610285610dc9565b3480156104d557600080fd5b506102dc600b5481565b3480156104eb57600080fd5b506102416104fa366004612225565b610e40565b34801561050b57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610292565b34801561053d57600080fd5b506102dc61054c366004612225565b610e8c565b34801561055d57600080fd5b50610285610e97565b34801561057257600080fd5b50610241610581366004612283565b610ea6565b34801561059257600080fd5b506102bb6105a13660046121f9565b610eec565b3480156105b257600080fd5b506102dc6105c1366004612225565b610f3b565b3480156105d257600080fd5b506102bb6105e13660046121f9565b610f67565b3480156105f257600080fd5b506102dc610601366004612225565b6001600160a01b03166000908152600a602052604090205490565b34801561062857600080fd5b506102bb61063736600461216d565b610f74565b34801561064857600080fd5b506102dc60145481565b34801561065e57600080fd5b506102dc61066d36600461229c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156106a457600080fd5b506102416106b33660046121f9565b611022565b3480156106c457600080fd5b506010546102dc565b3480156106d957600080fd5b506102416106e8366004612283565b61118c565b3480156106f957600080fd5b50610241610708366004612225565b6112fc565b34801561071957600080fd5b50600754610519906001600160a01b031681565b34801561073957600080fd5b50600654610519906001600160a01b031681565b34801561075957600080fd5b5061040e610768366004612225565b6113e7565b34801561077957600080fd5b5061078d610788366004612283565b61154f565b60408051938452602084019290925290820152606001610292565b60006107b360025490565b116107bd57600080fd5b3415610839576107f06107cf60025490565b6107dd34600160801b61166c565b6107e791906122eb565b600854906116f5565b60085560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b5461083590346116f5565b600b555b565b6005546001600160a01b0316331461086e5760405162461bcd60e51b81526004016108659061230d565b60405180910390fd5b6001600160a01b03821660009081526011602052604090205481151560ff90911615150361089b57600080fd5b6001600160a01b0382166000908152601160205260409020805460ff191682151590811790915560010361094b576108d4826000611754565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152732da33fed9ea279150eb179a70df4c6b8f2e27ebf90634c60db9c9060440160006040518083038186803b15801561092e57600080fd5b505af4158015610942573d6000803e3d6000fd5b50505050610a14565b6109738261096e846001600160a01b031660009081526020819052604090205490565b611754565b732da33fed9ea279150eb179a70df4c6b8f2e27ebf63bc2b405c600c846109af816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b1580156109fb57600080fd5b505af4158015610a0f573d6000803e3d6000fd5b505050505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610a51911515815260200190565b60405180910390a25050565b606060038054610a6c90612342565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9890612342565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b5050505050905090565b6000610afc3384846117b9565b5060015b92915050565b6000610b138484846118dd565b610b658433610b6085604051806060016040528060288152602001612767602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061193b565b6117b9565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600854600160801b92610bc192610bbc92610bb691610bb1919061166c565b611975565b90611985565b6119c3565b610b0091906122eb565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610afc918590610b6090866116f5565b600080600080600080600080600c732da33fed9ea279150eb179a70df4c6b8f2e27ebf63deb3d89690916040518263ffffffff1660e01b8152600401610c4991815260200190565b602060405180830381865af4158015610c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8a919061237c565b8910610caf575060009650600019955085945086935083925082915081905080610d4a565b6040516368d54f3f60e11b8152600c6004820152602481018a9052600090732da33fed9ea279150eb179a70df4c6b8f2e27ebf9063d1aa9e7e90604401602060405180830381865af4158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190612395565b9050610d38816113e7565b98509850985098509850985098509850505b919395975091939597565b6005546001600160a01b03163314610d7f5760405162461bcd60e51b81526004016108659061230d565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600754604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde039160048083019260009291908290030181865afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b91908101906123f9565b905090565b6005546001600160a01b03163314610e6a5760405162461bcd60e51b81526004016108659061230d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b0082610f3b565b606060048054610a6c90612342565b6005546001600160a01b03163314610ed05760405162461bcd60e51b81526004016108659061230d565b610edc6009600a612571565b610ee69082612580565b60145550565b6000610afc3384610b608560405180606001604052806025815260200161278f602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061193b565b6001600160a01b0381166000908152600a6020526040812054610b0090610f6184610b6f565b906119d6565b6000610afc3384846118dd565b6005546000906001600160a01b03163314610fa15760405162461bcd60e51b81526004016108659061230d565b6000610fac84611a18565b90508015611018576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906110069085815260200190565b60405180910390a36001915050610b00565b5060009392505050565b6005546001600160a01b0316331461104c5760405162461bcd60e51b81526004016108659061230d565b6001600160a01b03821660009081526011602052604090205460ff166111885760145481106110fd5761107f8282611754565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052732da33fed9ea279150eb179a70df4c6b8f2e27ebf9063bc2b405c9060640160006040518083038186803b1580156110e057600080fd5b505af41580156110f4573d6000803e3d6000fd5b5050505061117b565b611108826000611754565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152732da33fed9ea279150eb179a70df4c6b8f2e27ebf90634c60db9c9060440160006040518083038186803b15801561116257600080fd5b505af4158015611176573d6000803e3d6000fd5b505050505b611186826001610f74565b505b5050565b6005546001600160a01b031633146111b65760405162461bcd60e51b81526004016108659061230d565b610e1081101580156111cb5750620151808111155b6112525760405162461bcd60e51b815260206004820152604c60248201527f5445544845525f4469766964656e645f547261636b65723a20636c61696d576160448201527f6974206d757374206265207570646174656420746f206265747765656e20312060648201526b616e6420323420686f75727360a01b608482015260a401610865565b60135481036112c95760405162461bcd60e51b815260206004820152603e60248201527f5445544845525f4469766964656e645f547261636b65723a2043616e6e6f742060448201527f75706461746520636c61696d5761697420746f2073616d652076616c756500006064820152608401610865565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b6005546001600160a01b031633146113265760405162461bcd60e51b81526004016108659061230d565b6001600160a01b03811661138b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b03821660248201528190600090819081908190819081908190732da33fed9ea279150eb179a70df4c6b8f2e27ebf906317e142d190604401602060405180830381865af4158015611457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147b919061237c565b96506000199550600087126114dd576010548711156114a9576010546114a2908890611cae565b95506114dd565b601054600c54600091106114be5760006114cd565b601054600c546114cd916119d6565b90506114d98189612597565b9650505b6114e688610f3b565b94506114f188610b6f565b6001600160a01b03891660009081526012602052604090205490945092508261151b576000611528565b60135461152890846125bf565b9150428211611538576000611542565b61154282426119d6565b9050919395975091939597565b600c546000908190819080820361157157505060105460009250829150611665565b6010546000805a90506000805b898410801561158c57508582105b15611654578461159b816125d2565b600c54909650861090506115ae57600094505b6000600c60000186815481106115c6576115c66125eb565b60009182526020808320909101546001600160a01b031680835260129091526040909120549091506115f790611ceb565b1561161a57611607816001610f74565b1561161a5781611616816125d2565b9250505b82611624816125d2565b93505060005a90508085111561164b5761163e85826119d6565b61164890876125bf565b95505b935061157e9050565b601085905590975095509193505050505b9193909250565b60008260000361167e57506000610b00565b600061168a8385612580565b90508261169785836122eb565b146116ee5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610865565b9392505050565b60008061170283856125bf565b9050838110156116ee5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610865565b6001600160a01b0382166000908152602081905260409020548082111561179357600061178183836119d6565b905061178d8482611d12565b50611186565b808210156111865760006117a782846119d6565b90506117b38482611d76565b50505050565b6001600160a01b03831661181b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b6001600160a01b03821661187c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610865565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f5445544845525f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610865565b6000818484111561195f5760405162461bcd60e51b815260040161086591906121c6565b50600061196c8486612601565b95945050505050565b60008181811215610b0057600080fd5b6000806119928385612597565b9050600083121580156119a55750838112155b806119ba57506000831280156119ba57508381125b6116ee57600080fd5b6000808212156119d257600080fd5b5090565b60006116ee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061193b565b600080611a2483610f3b565b90508015611ca5576001600160a01b0383166000908152600a6020526040902054611a4f90826116f5565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611a9e9084815260200190565b60405180910390a2600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d9190612395565b6007546001600160a01b03908116911614611bf6576000611b3e8483611dba565b905080611bf0576000846001600160a01b031683610bb890604051600060405180830381858888f193505050503d8060008114611b97576040519150601f19603f3d011682016040523d82523d6000602084013e611b9c565b606091505b5050905080611bee576001600160a01b0385166000908152600a6020526040902054611bc890846119d6565b6001600160a01b039095166000908152600a602052604081209590955550929392505050565b505b50610b00565b6000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114611c48576040519150601f19603f3d011682016040523d82523d6000602084013e611c4d565b606091505b5050905080611c9e576001600160a01b0384166000908152600a6020526040902054611c7990836119d6565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b600080611cbb8385612614565b905060008312158015611cce5750838113155b806119ba57506000831280156119ba57508381136116ee57600080fd5b600042821115611cfd57506000919050565b601354611d0a42846119d6565b101592915050565b611d1c8282611f37565b611d56611d37610bb18360085461166c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611cae565b6001600160a01b0390921660009081526009602052604090209190915550565b611d808282612030565b611d56611d9b610bb18360085461166c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611985565b604080516002808252606082018352600092839291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4c9190612395565b81600081518110611e5f57611e5f6125eb565b6001600160a01b039283166020918202929092010152600754825191169082906001908110611e9057611e906125eb565b6001600160a01b03928316602091820292909201015260065416637ff36ab58460008488611ebf4260026125bf565b6040518663ffffffff1660e01b8152600401611ede9493929190612634565b60006040518083038185885af193505050508015611f1e57506040513d6000823e601f3d908101601f19168201604052611f1b919081019061269e565b60015b611f2c576000915050610b00565b506001915050610b00565b6001600160a01b038216611f9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610865565b611fa760008383611186565b600254611fb490826116f5565b6002556001600160a01b038216600090815260208190526040902054611fda90826116f5565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166120905760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b61209c82600083611186565b6120d981604051806060016040528060228152602001612745602291396001600160a01b038516600090815260208190526040902054919061193b565b6001600160a01b0383166000908152602081905260409020556002546120ff90826119d6565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612024565b6001600160a01b038116811461215557600080fd5b50565b8035801515811461216857600080fd5b919050565b6000806040838503121561218057600080fd5b823561218b81612140565b915061219960208401612158565b90509250929050565b60005b838110156121bd5781810151838201526020016121a5565b50506000910152565b60208152600082518060208401526121e58160408501602087016121a2565b601f01601f19169190910160400192915050565b6000806040838503121561220c57600080fd5b823561221781612140565b946020939093013593505050565b60006020828403121561223757600080fd5b81356116ee81612140565b60008060006060848603121561225757600080fd5b833561226281612140565b9250602084013561227281612140565b929592945050506040919091013590565b60006020828403121561229557600080fd5b5035919050565b600080604083850312156122af57600080fd5b82356122ba81612140565b915060208301356122ca81612140565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261230857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061235657607f821691505b60208210810361237657634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561238e57600080fd5b5051919050565b6000602082840312156123a757600080fd5b81516116ee81612140565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123f1576123f16123b2565b604052919050565b60006020828403121561240b57600080fd5b815167ffffffffffffffff8082111561242357600080fd5b818401915084601f83011261243757600080fd5b815181811115612449576124496123b2565b61245c601f8201601f19166020016123c8565b915080825285602082850101111561247357600080fd5b6124848160208401602086016121a2565b50949350505050565b600181815b808511156124c85781600019048211156124ae576124ae6122d5565b808516156124bb57918102915b93841c9390800290612492565b509250929050565b6000826124df57506001610b00565b816124ec57506000610b00565b8160018114612502576002811461250c57612528565b6001915050610b00565b60ff84111561251d5761251d6122d5565b50506001821b610b00565b5060208310610133831016604e8410600b841016171561254b575081810a610b00565b612555838361248d565b8060001904821115612569576125696122d5565b029392505050565b60006116ee60ff8416836124d0565b8082028115828204841417610b0057610b006122d5565b80820182811260008312801582168215821617156125b7576125b76122d5565b505092915050565b80820180821115610b0057610b006122d5565b6000600182016125e4576125e46122d5565b5060010190565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0057610b006122d5565b8181036000831280158383131683831282161715611c9e57611c9e6122d5565b600060808201868352602060808185015281875180845260a086019150828901935060005b8181101561267e5784516001600160a01b031683529383019391830191600101612659565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083850312156126b157600080fd5b825167ffffffffffffffff808211156126c957600080fd5b818501915085601f8301126126dd57600080fd5b8151818111156126ef576126ef6123b2565b8060051b91506127008483016123c8565b818152918301840191848101908884111561271a57600080fd5b938501935b838510156127385784518252938501939085019061271f565b9897505050505050505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c6774a4d7ae731b7105c89babd0ef1d5ff11e3503a14ea58a588acc1ad200d3764736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806385141a7711610175578063afa4f3b2116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610900578063f27fd25414610915578063f2fde38b14610935578063f66895a31461095557600080fd5b8063c492f0461461087a578063dd62ed3e1461089a578063e01af92c146108e057600080fd5b8063afa4f3b2146107b4578063b62496f5146107d4578063b9640d8b14610804578063bbde77c114610824578063c02466681461083a578063c3e0f5cf1461085a57600080fd5b80639d7ceafb1161012e5780639d7ceafb146106ba578063a26579ad146106da578063a457c2d7146106ef578063a8b9d2401461070f578063a9059cbb1461072f578063ad56c13c1461074f57600080fd5b806385141a771461060c578063854c84dc14610622578063864701a5146106375780638da5cb5b1461067157806395d89b411461068f5780639c1b8af5146106a457600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd8414610581578063700bb191146105a157806370a08231146105c1578063715018a6146105f757600080fd5b80634fbee193146105135780635960e46d1461054c57806364b0f6531461056c57600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634619d69f146104c85780634ada218b146104dd5780634e71d92d146104fe57600080fd5b80631275d00b116102865780631275d00b146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f4366004612c6f565b610974565b005b34801561030757600080fd5b50610310610a12565b60405161031d9190612ccc565b60405180910390f35b34801561033257600080fd5b506102f9610aa4565b34801561034757600080fd5b506102f9610356366004612cff565b610b41565b34801561036757600080fd5b5061037b610376366004612d2b565b610bfc565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a6366004612d57565b610c13565b3480156103b757600080fd5b506102f96103c6366004612d70565b610c9f565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612cff565b610dba565b34801561041657600080fd5b506102f9610e18565b34801561042b57600080fd5b5061037b61043a366004612d8d565b610e30565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e99565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c3366004612d2b565b610f0c565b3480156104d457600080fd5b506102f9610f42565b3480156104e957600080fd5b5060075461037b90600160b01b900460ff1681565b34801561050a57600080fd5b506102f9610fc2565b34801561051f57600080fd5b5061037b61052e366004612d70565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561055857600080fd5b506102f9610567366004612d57565b611037565b34801561057857600080fd5b506103dc611179565b34801561058d57600080fd5b506103dc61059c366004612d70565b6111c3565b3480156105ad57600080fd5b506102f96105bc366004612d57565b611233565b3480156105cd57600080fd5b506103dc6105dc366004612d70565b6001600160a01b031660009081526020819052604090205490565b34801561060357600080fd5b506102f9611305565b34801561061857600080fd5b5061045f61dead81565b34801561062e57600080fd5b50610310611379565b34801561064357600080fd5b5060105460115460125461065692919083565b6040805193845260208401929092529082015260600161031d565b34801561067d57600080fd5b506005546001600160a01b031661045f565b34801561069b57600080fd5b506103106113eb565b3480156106b057600080fd5b506103dc60165481565b3480156106c657600080fd5b506102f96106d5366004612d57565b6113fa565b3480156106e657600080fd5b506103dc611455565b3480156106fb57600080fd5b5061037b61070a366004612d2b565b61149f565b34801561071b57600080fd5b506103dc61072a366004612d70565b6114ee565b34801561073b57600080fd5b5061037b61074a366004612d2b565b611521565b34801561075b57600080fd5b5061076f61076a366004612d70565b61152e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107c057600080fd5b506102f96107cf366004612d57565b6115c9565b3480156107e057600080fd5b5061037b6107ef366004612d70565b601a6020526000908152604090205460ff1681565b34801561081057600080fd5b506102f961081f366004612cff565b61166f565b34801561083057600080fd5b506103dc600c5481565b34801561084657600080fd5b506102f9610855366004612c6f565b611810565b34801561086657600080fd5b506102f9610875366004612d70565b61191c565b34801561088657600080fd5b506102f9610895366004612dce565b611aa7565b3480156108a657600080fd5b506103dc6108b5366004612e54565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ec57600080fd5b506102f96108fb366004612e82565b611b83565b34801561090c57600080fd5b506103dc611bcb565b34801561092157600080fd5b5061076f610930366004612d57565b611c15565b34801561094157600080fd5b506102f9610950366004612d70565b611c57565b34801561096157600080fd5b5060135460145460155461065692919083565b6005546001600160a01b031633146109a75760405162461bcd60e51b815260040161099e90612e9f565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b1580156109f657600080fd5b505af1158015610a0a573d6000803e3d6000fd5b505050505050565b606060038054610a2190612ed4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4d90612ed4565b8015610a9a5780601f10610a6f57610100808354040283529160200191610a9a565b820191906000526020600020905b815481529060010190602001808311610a7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ace5760405162461bcd60e51b815260040161099e90612e9f565b600754600160b01b900460ff1615610b285760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c6564000000000000604482015260640161099e565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601383905560148290556015819055602881610b9f8486612f24565b610ba99190612f24565b1115610bf75760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c657373000000604482015260640161099e565b505050565b6000610c09338484611d42565b5060015b92915050565b6005546001600160a01b03163314610c3d5760405162461bcd60e51b815260040161099e90612e9f565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b03821603610d305760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b606482015260840161099e565b6001600160a01b038116610d915760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b606482015260840161099e565b600a80546001600160a01b0319166001600160a01b038316179055610db7816001611810565b50565b6005546001600160a01b03163314610de45760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610b9f8486612f24565b600a544790610db7906001600160a01b031682611e67565b6000610e3d848484611f80565b610e8f8433610e8a856040518060600160405280602881526020016133cc602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061273e565b611d42565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612f37565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c09918590610e8a9086612778565b6005546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161099e90612e9f565b610f786009600a613034565b610f859062989680613043565b600d55610f946009600a613034565b610fa19062989680613043565b600e55610fb06009600a613034565b610fbd9062989680613043565b600c55565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db7919061305a565b6005546001600160a01b031633146110615760405162461bcd60e51b815260040161099e90612e9f565b62030d40811015801561107757506207a1208111155b6110e05760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b606482015260840161099e565b60165481036111465760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b606482015260840161099e565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190612f37565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190613077565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b0316331461132f5760405162461bcd60e51b815260040161099e90612e9f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa1580156113c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0791908101906130bb565b606060048054610a2190612ed4565b6005546001600160a01b031633146114245760405162461bcd60e51b815260040161099e90612e9f565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c6a565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6000610c093384610e8a856040518060600160405280602581526020016133f4602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061273e565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f2565b6000610c09338484611f80565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561158a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ae9190613168565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146115f35760405162461bcd60e51b815260040161099e90612e9f565b606481101561165b5760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b606482015260840161099e565b61166981633b9aca00613043565b600b5550565b6005546001600160a01b031633146116995760405162461bcd60e51b815260040161099e90612e9f565b6127108310156116fd5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782042757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b606482015260840161099e565b6127108210156117625760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782053656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b606482015260840161099e565b6127108110156117c05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b606482015260840161099e565b6117cc6009600a613034565b6117d69084613043565b600d556117e56009600a613034565b6117ef9083613043565b600e556117fe6009600a613034565b6118089082613043565b600c55505050565b6005546001600160a01b0316331461183a5760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036118bd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b606482015260840161099e565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119465760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b038216036119bd5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161099e565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a349190612f37565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061305a565b5050565b6005546001600160a01b03163314611ad15760405162461bcd60e51b815260040161099e90612e9f565b60005b82811015611b42578160196000868685818110611af357611af36131d2565b9050602002016020810190611b089190612d70565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3a816131e8565b915050611ad4565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611b7693929190613201565b60405180910390a1505050565b6005546001600160a01b03163314611bad5760405162461bcd60e51b815260040161099e90612e9f565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161156c565b6005546001600160a01b03163314611c815760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b038116611ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099e565b6001600160a01b038216611e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611eb75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161099e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f04576040519150601f19603f3d011682016040523d82523d6000602084013e611f09565b606091505b5050905080610bf75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161099e565b6001600160a01b038316611fa65760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b038216611fcc5760405162461bcd60e51b815260040161099e9061329f565b6001600160a01b03831660009081526019602052604090205460ff1615801561200e57506001600160a01b03821660009081526019602052604090205460ff16155b1561206057600754600160b01b900460ff166120605760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b604482015260640161099e565b6001600160a01b0382166000908152601a602052604090205460ff161580156120a257506001600160a01b03831660009081526019602052604090205460ff16155b80156120c757506001600160a01b03821660009081526019602052604090205460ff16155b1561215557600c54816120ef846001600160a01b031660009081526020819052604090205490565b6120f99190612f24565b11156121555760405162461bcd60e51b815260206004820152602560248201527f42616c616e636520697320657863656564696e67206d617857616c6c657442616044820152646c616e636560d81b606482015260840161099e565b6001600160a01b0383166000908152601a602052604090205460ff16801561219657506001600160a01b03831660009081526019602052604090205460ff16155b80156121bb57506001600160a01b03821660009081526019602052604090205460ff16155b1561221257600d548111156122125760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604482015260640161099e565b6001600160a01b0383166000908152601a602052604090205460ff1615801561225457506001600160a01b03831660009081526019602052604090205460ff16155b801561227957506001600160a01b03821660009081526019602052604090205460ff16155b156122d057600e548111156122d05760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604482015260640161099e565b806000036122e457610bf7838360006127de565b30600090815260208190526040812054600b54601554601454601354939492851015936123119190612f24565b61231b9190612f24565b90508180156123345750600754600160a01b900460ff16155b80156123495750600754600160a81b900460ff165b801561236e57506001600160a01b0386166000908152601a602052604090205460ff16155b801561239357506001600160a01b03861660009081526019602052604090205460ff16155b80156123b857506001600160a01b03851660009081526019602052604090205460ff16155b156123f0576007805460ff60a01b1916600160a01b17905580156123e2576123e2600b54826128e7565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526019602052604090205460ff600160a01b90920482161591168061243e57506001600160a01b03861660009081526019602052604090205460ff165b15612447575060005b801561254257600060175460085461245f9190612f24565b6001600160a01b0388166000908152601a602052604081205443929092111592509060ff16801561248e575081155b156124b057606461249f8589613043565b6124a991906132e2565b9050612528565b6001600160a01b0389166000908152601a602052604090205460ff1680156124d6575081155b1561250557601254601154601054606492916124f191612f24565b6124fb9190612f24565b61249f9089613043565b81156125285760646018548861251b9190613043565b61252591906132e2565b90505b6125328188613304565b965061253f8930836127de565b50505b61254d8787876127de565b6009546001600160a01b031663e30443bc8861257e816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125c457600080fd5b505af19250505080156125d5575060015b506009546001600160a01b031663e30443bc87612607816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561264d57600080fd5b505af192505050801561265e575060015b50600754600160a01b900460ff16612735576016546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156126dd575060408051601f3d908101601f191682019092526126da91810190613077565b60015b156127335760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156127625760405162461bcd60e51b815260040161099e9190612ccc565b50600061276f8486613304565b95945050505050565b6000806127858385612f24565b9050838110156127d75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161099e565b9392505050565b6001600160a01b0383166128045760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b03821661282a5760405162461bcd60e51b815260040161099e9061329f565b612867816040518060600160405280602681526020016133a6602691396001600160a01b038616600090815260208190526040902054919061273e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128969082612778565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611e5a565b60006128f4826002613043565b90506000816013600201548561290a9190613043565b61291491906132e2565b905060006129228286613304565b90504761292e82612a7d565b600061293a8247613304565b60155490915060009061294d9087613304565b61295790836132e2565b60155490915060009061296a9083613043565b9050801561297c5761297c8682612ba1565b60145460009061298d846002613043565b6129979190613043565b905080156129b557600a546129b5906001600160a01b031682611e67565b6013546000906129c6856002613043565b6129d09190613043565b90508015612a70576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a25576040519150601f19603f3d011682016040523d82523d6000602084013e612a2a565b606091505b505090508015612a6e57604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ab257612ab26131d2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613317565b81600181518110612b4257612b426131d2565b6001600160a01b039283166020918202929092010152600654612b689130911684611d42565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109dc908590600090869030904290600401613334565b600654612bb99030906001600160a01b031684611d42565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612c27573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c989190613077565b6001600160a01b0381168114610db757600080fd5b8015158114610db757600080fd5b60008060408385031215612c8257600080fd5b8235612c8d81612c4c565b91506020830135612c9d81612c61565b809150509250929050565b60005b83811015612cc3578181015183820152602001612cab565b50506000910152565b6020815260008251806020840152612ceb816040850160208701612ca8565b601f01601f19169190910160400192915050565b600080600060608486031215612d1457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612d3e57600080fd5b8235612d4981612c4c565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b81356127d781612c4c565b600080600060608486031215612da257600080fd5b8335612dad81612c4c565b92506020840135612dbd81612c4c565b929592945050506040919091013590565b600080600060408486031215612de357600080fd5b833567ffffffffffffffff80821115612dfb57600080fd5b818601915086601f830112612e0f57600080fd5b813581811115612e1e57600080fd5b8760208260051b8501011115612e3357600080fd5b60209283019550935050840135612e4981612c61565b809150509250925092565b60008060408385031215612e6757600080fd5b8235612e7281612c4c565b91506020830135612c9d81612c4c565b600060208284031215612e9457600080fd5b81356127d781612c61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c0d57610c0d612f0e565b600060208284031215612f4957600080fd5b5051919050565b600181815b80851115612f8b578160001904821115612f7157612f71612f0e565b80851615612f7e57918102915b93841c9390800290612f55565b509250929050565b600082612fa257506001610c0d565b81612faf57506000610c0d565b8160018114612fc55760028114612fcf57612feb565b6001915050610c0d565b60ff841115612fe057612fe0612f0e565b50506001821b610c0d565b5060208310610133831016604e8410600b841016171561300e575081810a610c0d565b6130188383612f50565b806000190482111561302c5761302c612f0e565b029392505050565b60006127d760ff841683612f93565b8082028115828204841417610c0d57610c0d612f0e565b60006020828403121561306c57600080fd5b81516127d781612c61565b60008060006060848603121561308c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156130cd57600080fd5b815167ffffffffffffffff808211156130e557600080fd5b818401915084601f8301126130f957600080fd5b81518181111561310b5761310b6130a5565b604051601f8201601f19908116603f01168101908382118183101715613133576131336130a5565b8160405282815287602084870101111561314c57600080fd5b61315d836020830160208801612ca8565b979650505050505050565b600080600080600080600080610100898b03121561318557600080fd5b885161319081612c4c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600182016131fa576131fa612f0e565b5060010190565b6040808252810183905260008460608301825b8681101561324457823561322781612c4c565b6001600160a01b0316825260209283019290910190600101613214565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826132ff57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c0d57610c0d612f0e565b60006020828403121561332957600080fd5b81516127d781612c4c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133845784516001600160a01b03168352938301939183019160010161335f565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208a8c41bf4ab9f1dfb529dcc4f3d684d00e1b8cd5e6cc151a3e11107c85fede5564736f6c63430008130033

Libraries Used

IterableMapping : 0x2da33fed9ea279150eb179a70df4c6b8f2e27ebfUnverified

Deployed Bytecode Sourcemap

34990:15751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39508:149;;;;;;;;;;-1:-1:-1;39508:149:0;;;;;:::i;:::-;;:::i;:::-;;4586:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41558:199;;;;;;;;;;;;;:::i;41177:262::-;;;;;;;;;;-1:-1:-1;41177:262:0;;;;;:::i;:::-;;:::i;6752:169::-;;;;;;;;;;-1:-1:-1;6752:169:0;;;;;:::i;:::-;;:::i;:::-;;;2122:14:1;;2115:22;2097:41;;2085:2;2070:18;6752:169:0;1957:187:1;43057:121:0;;;;;;;;;;-1:-1:-1;43057:121:0;;;;;:::i;:::-;;:::i;40369:321::-;;;;;;;;;;-1:-1:-1;40369:321:0;;;;;:::i;:::-;;:::i;5705:108::-;;;;;;;;;;-1:-1:-1;5793:12:0;;5705:108;;;2732:25:1;;;2720:2;2705:18;5705:108:0;2586:177:1;40909:260:0;;;;;;;;;;-1:-1:-1;40909:260:0;;;;;:::i;:::-;;:::i;38631:148::-;;;;;;;;;;;;;:::i;7403:355::-;;;;;;;;;;-1:-1:-1;7403:355:0;;;;;:::i;:::-;;:::i;35296:45::-;;;;;;;;;;-1:-1:-1;35296:45:0;;;;-1:-1:-1;;;;;35296:45:0;;;;;;-1:-1:-1;;;;;3432:32:1;;;3414:51;;3402:2;3387:18;35296:45:0;3229:242:1;43303:141:0;;;;;;;;;;;;;:::i;5548:92::-;;;;;;;;;;-1:-1:-1;5548:92:0;;5631:1;3618:36:1;;3606:2;3591:18;5548:92:0;3476:184:1;8167:218:0;;;;;;;;;;-1:-1:-1;8167:218:0;;;;;:::i;:::-;;:::i;40162:195::-;;;;;;;;;;;;;:::i;35214:34::-;;;;;;;;;;-1:-1:-1;35214:34:0;;;;-1:-1:-1;;;35214:34:0;;;;;;38226:103;;;;;;;;;;;;;:::i;43452:126::-;;;;;;;;;;-1:-1:-1;43452:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;43542:28:0;43518:4;43542:28;;;:19;:28;;;;;;;;;43452:126;42561:437;;;;;;;;;;-1:-1:-1;42561:437:0;;;;;:::i;:::-;;:::i;44903:142::-;;;;;;;;;;;;;:::i;43890:139::-;;;;;;;;;;-1:-1:-1;43890:139:0;;;;;:::i;:::-;;:::i;37844:374::-;;;;;;;;;;-1:-1:-1;37844:374:0;;;;;:::i;:::-;;:::i;5876:127::-;;;;;;;;;;-1:-1:-1;5876:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;5977:18:0;5950:7;5977:18;;;;;;;;;;;;5876:127;20546:148;;;;;;;;;;;;;:::i;35354:79::-;;;;;;;;;;;;35391:42;35354:79;;43746:136;;;;;;;;;;;;;:::i;35887:39::-;;;;;;;;;;-1:-1:-1;35887:39:0;;;;;;;;;;;;;;;;4075:25:1;;;4131:2;4116:18;;4109:34;;;;4159:18;;;4152:34;4063:2;4048:18;35887:39:0;3873:319:1;19904:79:0;;;;;;;;;;-1:-1:-1;19969:6:0;;-1:-1:-1;;;;;19969:6:0;19904:79;;4805:104;;;;;;;;;;;;;:::i;35982:40::-;;;;;;;;;;;;;;;;41765:138;;;;;;;;;;-1:-1:-1;41765:138:0;;;;;:::i;:::-;;:::i;43186:109::-;;;;;;;;;;;;;:::i;8888:269::-;;;;;;;;;;-1:-1:-1;8888:269:0;;;;;:::i;:::-;;:::i;43586:152::-;;;;;;;;;;-1:-1:-1;43586:152:0;;;;;:::i;:::-;;:::i;6216:175::-;;;;;;;;;;-1:-1:-1;6216:175:0;;;;;:::i;:::-;;:::i;44037:351::-;;;;;;;;;;-1:-1:-1;44037:351:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4554:32:1;;;4536:51;;4618:2;4603:18;;4596:34;;;;4646:18;;;4639:34;;;;4704:2;4689:18;;4682:34;;;;4747:3;4732:19;;4725:35;4574:3;4776:19;;4769:35;4835:3;4820:19;;4813:35;4879:3;4864:19;;4857:35;4523:3;4508:19;44037:351:0;4197:701:1;40698:203:0;;;;;;;;;;-1:-1:-1;40698:203:0;;;;;:::i;:::-;;:::i;36171:57::-;;;;;;;;;;-1:-1:-1;36171:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39665:488;;;;;;;;;;-1:-1:-1;39665:488:0;;;;;:::i;:::-;;:::i;35578:45::-;;;;;;;;;;;;;;;;38787:327;;;;;;;;;;-1:-1:-1;38787:327:0;;;;;:::i;:::-;;:::i;38337:286::-;;;;;;;;;;-1:-1:-1;38337:286:0;;;;;:::i;:::-;;:::i;39122:326::-;;;;;;;;;;-1:-1:-1;39122:326:0;;;;;:::i;:::-;;:::i;6454:151::-;;;;;;;;;;-1:-1:-1;6454:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;6570:18:0;;;6543:7;6570:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6454:151;41447:99;;;;;;;;;;-1:-1:-1;41447:99:0;;;;;:::i;:::-;;:::i;44765:130::-;;;;;;;;;;;;;:::i;44396:361::-;;;;;;;;;;-1:-1:-1;44396:361:0;;;;;:::i;:::-;;:::i;20849:244::-;;;;;;;;;;-1:-1:-1;20849:244:0;;;;;:::i;:::-;;:::i;35933:40::-;;;;;;;;;;-1:-1:-1;35933:40:0;;;;;;;;;;;;39508:149;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;;;;;;;;;39597:15:::1;::::0;:52:::1;::::0;-1:-1:-1;;;39597:52:0;;-1:-1:-1;;;;;6844:32:1;;;39597:52:0::1;::::0;::::1;6826:51:1::0;6920:14;;6913:22;6893:18;;;6886:50;39597:15:0;;::::1;::::0;:36:::1;::::0;6799:18:1;;39597:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39508:149:::0;;:::o;4586:100::-;4640:13;4673:5;4666:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4586:100;:::o;41558:199::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;41629:14:::1;::::0;-1:-1:-1;;;41629:14:0;::::1;;;41628:15;41620:54;;;::::0;-1:-1:-1;;;41620:54:0;;7534:2:1;41620:54:0::1;::::0;::::1;7516:21:1::0;7573:2;7553:18;;;7546:30;7612:28;7592:18;;;7585:56;7658:18;;41620:54:0::1;7332:350:1::0;41620:54:0::1;41685:14;:21:::0;;-1:-1:-1;;;;41685:21:0::1;-1:-1:-1::0;;;41685:21:0::1;::::0;;41737:12:::1;41717:17;:32:::0;41558:199::o;41177:262::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;41297:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;41285:9:::1;:50:::0;;;;;;;;;;;41395:2:::1;41324:10:::0;41355:20:::1;41313:9:::0;41303:8;41355:20:::1;:::i;:::-;:34;;;;:::i;:::-;41354:43;;41346:85;;;::::0;-1:-1:-1;;;41346:85:0;;8151:2:1;41346:85:0::1;::::0;::::1;8133:21:1::0;8190:2;8170:18;;;8163:30;8229:31;8209:18;;;8202:59;8278:18;;41346:85:0::1;7949:353:1::0;41346:85:0::1;41177:262:::0;;;:::o;6752:169::-;6835:4;6852:39;210:10;6875:7;6884:6;6852:8;:39::i;:::-;-1:-1:-1;6909:4:0;6752:169;;;;;:::o;43057:121::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;43128:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;43128:42:0;;::::1;::::0;::::1;2732:25:1::0;;;-1:-1:-1;;;;;43128:15:0;;::::1;::::0;:31:::1;::::0;2705:18:1;;43128:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43057:121:::0;:::o;40369:321::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;40474:4:::1;-1:-1:-1::0;;;;;40453:26:0;::::1;::::0;40445:77:::1;;;::::0;-1:-1:-1;;;40445:77:0;;8509:2:1;40445:77:0::1;::::0;::::1;8491:21:1::0;8548:2;8528:18;;;8521:30;8587:34;8567:18;;;8560:62;-1:-1:-1;;;8638:18:1;;;8631:36;8684:19;;40445:77:0::1;8307:402:1::0;40445:77:0::1;-1:-1:-1::0;;;;;40541:23:0;::::1;40533:69;;;::::0;-1:-1:-1;;;40533:69:0;;8916:2:1;40533:69:0::1;::::0;::::1;8898:21:1::0;8955:2;8935:18;;;8928:30;8994:34;8974:18;;;8967:62;-1:-1:-1;;;9045:18:1;;;9038:32;9087:19;;40533:69:0::1;8714:398:1::0;40533:69:0::1;40613:15;:27:::0;;-1:-1:-1;;;;;;40613:27:0::1;-1:-1:-1::0;;;;;40613:27:0;::::1;;::::0;;40650:32:::1;40613:27:::0;-1:-1:-1;40650:15:0::1;:32::i;:::-;40369:321:::0;:::o;40909:260::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;41027:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;41016:8:::1;:49:::0;;;;;;;;;;;41125:2:::1;41054:10:::0;41085:20:::1;41043:9:::0;41033:8;41085:20:::1;:::i;38631:148::-:0;38733:15;;38693:21;;38725:46;;-1:-1:-1;;;;;38733:15:0;38693:21;38725:34;:46::i;7403:355::-;7543:4;7560:36;7570:6;7578:9;7589:6;7560:9;:36::i;:::-;7607:121;7616:6;210:10;7638:89;7676:6;7638:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7638:19:0;;;;;;:11;:19;;;;;;;;210:10;7638:33;;;;;;;;;;:37;:89::i;:::-;7607:8;:121::i;:::-;-1:-1:-1;7746:4:0;7403:355;;;;;:::o;43303:141::-;43393:15;;:43;;;-1:-1:-1;;;43393:43:0;;;;43366:7;;-1:-1:-1;;;;;43393:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43386:50;;43303:141;:::o;8167:218::-;210:10;8255:4;8304:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8304:34:0;;;;;;;;;;8255:4;;8272:83;;8295:7;;8304:50;;8343:10;8304:38;:50::i;40162:195::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;40237:14:::1;5631:1:::0;40237:2:::1;:14;:::i;:::-;40231:20;::::0;:3:::1;:20;:::i;:::-;40216:12;:35:::0;40284:14:::1;5631:1:::0;40284:2:::1;:14;:::i;:::-;40278:20;::::0;:3:::1;:20;:::i;:::-;40262:13;:36:::0;40334:14:::1;5631:1:::0;40334:2:::1;:14;:::i;:::-;40328:20;::::0;:3:::1;:20;:::i;:::-;40309:16;:39:::0;40162:195::o;38226:103::-;38263:15;;:58;;-1:-1:-1;;;38263:58:0;;38302:10;38263:58;;;6826:51:1;38263:15:0;6893:18:1;;;6886:50;-1:-1:-1;;;;;38263:15:0;;;;:30;;6799:18:1;;38263:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42561:437::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;42659:6:::1;42647:8;:18;;:40;;;;;42681:6;42669:8;:18;;42647:40;42638:128;;;::::0;-1:-1:-1;;;42638:128:0;;11619:2:1;42638:128:0::1;::::0;::::1;11601:21:1::0;11658:2;11638:18;;;11631:30;11697:34;11677:18;;;11670:62;-1:-1:-1;;;11748:18:1;;;11741:50;11808:19;;42638:128:0::1;11417:416:1::0;42638:128:0::1;42797:16;;42785:8;:28:::0;42777:108:::1;;;::::0;-1:-1:-1;;;42777:108:0;;12040:2:1;42777:108:0::1;::::0;::::1;12022:21:1::0;12079:2;12059:18;;;12052:30;12118:34;12098:18;;;12091:62;-1:-1:-1;;;12169:18:1;;;12162:42;12221:19;;42777:108:0::1;11838:408:1::0;42777:108:0::1;42935:16;::::0;42901:51:::1;::::0;42925:8;;42901:51:::1;::::0;;;::::1;42963:16;:27:::0;42561:437::o;44903:142::-;44996:15;;:41;;;-1:-1:-1;;;44996:41:0;;;;44969:7;;-1:-1:-1;;;;;44996:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;43890:139;43987:15;;:34;;-1:-1:-1;;;43987:34:0;;-1:-1:-1;;;;;3432:32:1;;;43987:34:0;;;3414:51:1;43960:7:0;;43987:15;;:25;;3387:18:1;;43987:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37844:374::-;37976:15;;:42;;-1:-1:-1;;;;;;37976:42:0;;;;;2732:25:1;;;37910:18:0;;;;;;-1:-1:-1;;;;;37976:15:0;;:37;;2705:18:1;;37976:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38034:176;;;12793:25:1;;;12849:2;12834:18;;12827:34;;;12877:18;;;12870:34;;;12935:2;12920:18;;12913:34;;;37909:109:0;;-1:-1:-1;37909:109:0;;-1:-1:-1;37909:109:0;-1:-1:-1;38190:9:0;;38152:5;;38034:176;;12780:3:1;12765:19;38034:176:0;;;;;;;37898:320;;;37844:374;:::o;20546:148::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;20637:6:::1;::::0;20616:40:::1;::::0;20653:1:::1;::::0;-1:-1:-1;;;;;20637:6:0::1;::::0;20616:40:::1;::::0;20653:1;;20616:40:::1;20667:6;:19:::0;;-1:-1:-1;;;;;;20667:19:0::1;::::0;;20546:148::o;43746:136::-;43835:15;;:39;;;-1:-1:-1;;;43835:39:0;;;;43802:13;;-1:-1:-1;;;;;43835:15:0;;:37;;:39;;;;;:15;;:39;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43835:39:0;;;;;;;;;;;;:::i;4805:104::-;4861:13;4894:7;4887:14;;;;;:::i;41765:138::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;41846:15:::1;::::0;:49:::1;::::0;-1:-1:-1;;;41846:49:0;;::::1;::::0;::::1;2732:25:1::0;;;-1:-1:-1;;;;;41846:15:0;;::::1;::::0;:41:::1;::::0;2705:18:1;;41846:49:0::1;2586:177:1::0;43186:109:0;43260:15;;:27;;;-1:-1:-1;;;43260:27:0;;;;43233:7;;-1:-1:-1;;;;;43260:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;8888:269;8981:4;8998:129;210:10;9021:7;9030:96;9069:15;9030:96;;;;;;;;;;;;;;;;;210:10;9030:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9030:34:0;;;;;;;;;;;;:38;:96::i;43586:152::-;43683:15;;:47;;-1:-1:-1;;;43683:47:0;;-1:-1:-1;;;;;3432:32:1;;;43683:47:0;;;3414:51:1;43656:7:0;;43683:15;;:38;;3387:18:1;;43683:47:0;3229:242:1;6216:175:0;6302:4;6319:42;210:10;6343:9;6354:6;6319:9;:42::i;44037:351::-;44345:15;;:35;;-1:-1:-1;;;44345:35:0;;-1:-1:-1;;;;;3432:32:1;;;44345:35:0;;;3414:51:1;44151:7:0;;;;;;;;;;;;;;;;44345:15;;;:26;;3387:18:1;;44345:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44338:42;;;;;;;;;;;;;;;;44037:351;;;;;;;;;:::o;40698:203::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;40793:3:::1;40783:6;:13;;40775:72;;;::::0;-1:-1:-1;;;40775:72:0;;14880:2:1;40775:72:0::1;::::0;::::1;14862:21:1::0;14919:2;14899:18;;;14892:30;14958:34;14938:18;;;14931:62;-1:-1:-1;;;15009:18:1;;;15002:44;15063:19;;40775:72:0::1;14678:410:1::0;40775:72:0::1;40879:14;:6:::0;40888:5:::1;40879:14;:::i;:::-;40858:18;:35:::0;-1:-1:-1;40698:203:0:o;39665:488::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;39783:3:::1;39773:6;:13;;39765:67;;;::::0;-1:-1:-1;;;39765:67:0;;15295:2:1;39765:67:0::1;::::0;::::1;15277:21:1::0;15334:2;15314:18;;;15307:30;15373:34;15353:18;;;15346:62;-1:-1:-1;;;15424:18:1;;;15417:39;15473:19;;39765:67:0::1;15093:405:1::0;39765:67:0::1;39862:3;39851:7;:14;;39843:69;;;::::0;-1:-1:-1;;;39843:69:0;;15705:2:1;39843:69:0::1;::::0;::::1;15687:21:1::0;15744:2;15724:18;;;15717:30;15783:34;15763:18;;;15756:62;-1:-1:-1;;;15834:18:1;;;15827:40;15884:19;;39843:69:0::1;15503:406:1::0;39843:69:0::1;39944:3;39931:9;:16;;39923:65;;;::::0;-1:-1:-1;;;39923:65:0;;16116:2:1;39923:65:0::1;::::0;::::1;16098:21:1::0;16155:2;16135:18;;;16128:30;16194:34;16174:18;;;16167:62;-1:-1:-1;;;16245:18:1;;;16238:34;16289:19;;39923:65:0::1;15914:400:1::0;39923:65:0::1;40023:14;5631:1:::0;40023:2:::1;:14;:::i;:::-;40014:23;::::0;:6;:23:::1;:::i;:::-;39999:12;:38:::0;40074:14:::1;5631:1:::0;40074:2:::1;:14;:::i;:::-;40064:24;::::0;:7;:24:::1;:::i;:::-;40048:13;:40:::0;40130:14:::1;5631:1:::0;40130:2:::1;:14;:::i;:::-;40118:26;::::0;:9;:26:::1;:::i;:::-;40099:16;:45:::0;-1:-1:-1;;;39665:488:0:o;38787:327::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38894:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;38872:132:::1;;;::::0;-1:-1:-1;;;38872:132:0;;16521:2:1;38872:132:0::1;::::0;::::1;16503:21:1::0;16560:2;16540:18;;;16533:30;16599:34;16579:18;;;16572:62;-1:-1:-1;;;16650:18:1;;;16643:40;16700:19;;38872:132:0::1;16319:406:1::0;38872:132:0::1;-1:-1:-1::0;;;;;39015:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;39015:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39072:34;;2097:41:1;;;39072:34:0::1;::::0;2070:18:1;39072:34:0::1;;;;;;;38787:327:::0;;:::o;38337:286::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;38448:4:::1;-1:-1:-1::0;;;;;38424:29:0;::::1;::::0;38416:96:::1;;;::::0;-1:-1:-1;;;38416:96:0;;16932:2:1;38416:96:0::1;::::0;::::1;16914:21:1::0;16971:2;16951:18;;;16944:30;17010:34;16990:18;;;16983:62;-1:-1:-1;;;17061:18:1;;;17054:52;17123:19;;38416:96:0::1;16730:418:1::0;38416:96:0::1;38553:15;::::0;38569:45:::1;::::0;-1:-1:-1;;;38569:45:0;;38608:4:::1;38569:45;::::0;::::1;3414:51:1::0;-1:-1:-1;;;;;38523:29:0;;::::1;::::0;::::1;::::0;38553:15;::::1;::::0;38523:29;;38569:30:::1;::::0;3387:18:1;;38569:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38523:92;::::0;-1:-1:-1;;;;;;38523:92:0::1;::::0;;;;;;-1:-1:-1;;;;;17345:32:1;;;38523:92:0::1;::::0;::::1;17327:51:1::0;17394:18;;;17387:34;17300:18;;38523:92:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38337:286:::0;:::o;39122:326::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;39263:9:::1;39258:116;39278:19:::0;;::::1;39258:116;;;39354:8;39319:19;:32;39339:8;;39348:1;39339:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39319:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39319:32:0;:43;;-1:-1:-1;;39319:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39299:3;::::1;::::0;::::1;:::i;:::-;;;;39258:116;;;;39389:51;39421:8;;39431;39389:51;;;;;;;;:::i;:::-;;;;;;;;39122:326:::0;;;:::o;41447:99::-;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;41516:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;41516:22:0::1;-1:-1:-1::0;;;;41516:22:0;;::::1;::::0;;;::::1;::::0;;41447:99::o;44765:130::-;44848:15;;:39;;;-1:-1:-1;;;44848:39:0;;;;44821:7;;-1:-1:-1;;;;;44848:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;44396:361;44709:15;;:40;;-1:-1:-1;;;44709:40:0;;;;;2732:25:1;;;44515:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44709:15:0;;;;:33;;2705:18:1;;44709:40:0;2586:177:1;20849:244:0;20116:6;;-1:-1:-1;;;;;20116:6:0;210:10;20116:22;20108:67;;;;-1:-1:-1;;;20108:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20938:22:0;::::1;20930:73;;;::::0;-1:-1:-1;;;20930:73:0;;18705:2:1;20930:73:0::1;::::0;::::1;18687:21:1::0;18744:2;18724:18;;;18717:30;18783:34;18763:18;;;18756:62;-1:-1:-1;;;18834:18:1;;;18827:36;18880:19;;20930:73:0::1;18503:402:1::0;20930:73:0::1;21040:6;::::0;21019:38:::1;::::0;-1:-1:-1;;;;;21019:38:0;;::::1;::::0;21040:6:::1;::::0;21019:38:::1;::::0;21040:6:::1;::::0;21019:38:::1;21068:6;:17:::0;;-1:-1:-1;;;;;;21068:17:0::1;-1:-1:-1::0;;;;;21068:17:0;;;::::1;::::0;;;::::1;::::0;;20849:244::o;12014:380::-;-1:-1:-1;;;;;12150:19:0;;12142:68;;;;-1:-1:-1;;;12142:68:0;;19112:2:1;12142:68:0;;;19094:21:1;19151:2;19131:18;;;19124:30;19190:34;19170:18;;;19163:62;-1:-1:-1;;;19241:18:1;;;19234:34;19285:19;;12142:68:0;18910:400:1;12142:68:0;-1:-1:-1;;;;;12229:21:0;;12221:68;;;;-1:-1:-1;;;12221:68:0;;19517:2:1;12221:68:0;;;19499:21:1;19556:2;19536:18;;;19529:30;19595:34;19575:18;;;19568:62;-1:-1:-1;;;19646:18:1;;;19639:32;19688:19;;12221:68:0;19315:398:1;12221:68:0;-1:-1:-1;;;;;12302:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12354:32;;2732:25:1;;;12354:32:0;;2705:18:1;12354:32:0;;;;;;;;12014:380;;;:::o;34664:319::-;34779:6;34754:21;:31;;34746:73;;;;-1:-1:-1;;;34746:73:0;;19920:2:1;34746:73:0;;;19902:21:1;19959:2;19939:18;;;19932:30;19998:31;19978:18;;;19971:59;20047:18;;34746:73:0;19718:353:1;34746:73:0;34833:12;34851:9;-1:-1:-1;;;;;34851:14:0;34874:6;34851:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34832:54;;;34905:7;34897:78;;;;-1:-1:-1;;;34897:78:0;;20488:2:1;34897:78:0;;;20470:21:1;20527:2;20507:18;;;20500:30;20566:34;20546:18;;;20539:62;20637:28;20617:18;;;20610:56;20683:19;;34897:78:0;20286:422:1;45053:3613:0;-1:-1:-1;;;;;45185:18:0;;45177:68;;;;-1:-1:-1;;;45177:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45264:16:0;;45256:64;;;;-1:-1:-1;;;45256:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45338:25:0;;;;;;:19;:25;;;;;;;;45337:26;:54;;;;-1:-1:-1;;;;;;45368:23:0;;;;;;:19;:23;;;;;;;;45367:24;45337:54;45333:135;;;45420:14;;-1:-1:-1;;;45420:14:0;;;;45412:44;;;;-1:-1:-1;;;45412:44:0;;21725:2:1;45412:44:0;;;21707:21:1;21764:2;21744:18;;;21737:30;-1:-1:-1;;;21783:18:1;;;21776:47;21840:18;;45412:44:0;21523:341:1;45412:44:0;-1:-1:-1;;;;;45492:29:0;;;;;;:25;:29;;;;;;;;45491:30;:60;;;;-1:-1:-1;;;;;;45526:25:0;;;;;;:19;:25;;;;;;;;45525:26;45491:60;:88;;;;-1:-1:-1;;;;;;45556:23:0;;;;;;:19;:23;;;;;;;;45555:24;45491:88;45487:220;;;45637:16;;45626:6;45609:13;45619:2;-1:-1:-1;;;;;5977:18:0;5950:7;5977:18;;;;;;;;;;;;5876:127;45609:13;:24;;;;:::i;:::-;:44;;45600:95;;;;-1:-1:-1;;;45600:95:0;;22071:2:1;45600:95:0;;;22053:21:1;22110:2;22090:18;;;22083:30;22149:34;22129:18;;;22122:62;-1:-1:-1;;;22200:18:1;;;22193:35;22245:19;;45600:95:0;21869:401:1;45600:95:0;-1:-1:-1;;;;;45736:31:0;;;;;;:25;:31;;;;;;;;:61;;;;-1:-1:-1;;;;;;45772:25:0;;;;;;:19;:25;;;;;;;;45771:26;45736:61;:89;;;;-1:-1:-1;;;;;;45802:23:0;;;;;;:19;:23;;;;;;;;45801:24;45736:89;45732:191;;;45864:12;;45854:6;:22;;45846:65;;;;-1:-1:-1;;;45846:65:0;;22477:2:1;45846:65:0;;;22459:21:1;22516:2;22496:18;;;22489:30;22555:32;22535:18;;;22528:60;22605:18;;45846:65:0;22275:354:1;45846:65:0;-1:-1:-1;;;;;45952:31:0;;;;;;:25;:31;;;;;;;;45951:32;:62;;;;-1:-1:-1;;;;;;45988:25:0;;;;;;:19;:25;;;;;;;;45987:26;45951:62;:90;;;;-1:-1:-1;;;;;;46018:23:0;;;;;;:19;:23;;;;;;;;46017:24;45951:90;45947:194;;;46080:13;;46070:6;:23;;46062:67;;;;-1:-1:-1;;;46062:67:0;;22836:2:1;46062:67:0;;;22818:21:1;22875:2;22855:18;;;22848:30;22914:33;22894:18;;;22887:61;22965:18;;46062:67:0;22634:355:1;46062:67:0;46155:6;46165:1;46155:11;46151:93;;46183:28;46199:4;46205:2;46209:1;46183:15;:28::i;46151:93::-;46305:4;46256:28;5977:18;;;;;;;;;;;46361;;46476:19;;46441;;46476:9;46408:17;5977:18;;46337:42;;;;;46408:52;;46441:19;46408:52;:::i;:::-;:87;;;;:::i;:::-;46390:105;;46527:7;:33;;;;-1:-1:-1;46552:8:0;;-1:-1:-1;;;46552:8:0;;;;46551:9;46527:33;:61;;;;-1:-1:-1;46577:11:0;;-1:-1:-1;;;46577:11:0;;;;46527:61;:110;;;;-1:-1:-1;;;;;;46606:31:0;;;;;;:25;:31;;;;;;;;46605:32;46527:110;:153;;;;-1:-1:-1;;;;;;46655:25:0;;;;;;:19;:25;;;;;;;;46654:26;46527:153;:194;;;;-1:-1:-1;;;;;;46698:23:0;;;;;;:19;:23;;;;;;;;46697:24;46527:194;46509:410;;;46748:8;:15;;-1:-1:-1;;;;46748:15:0;-1:-1:-1;;;46748:15:0;;;46784:11;;46780:95;;46816:43;46831:18;;46851:7;46816:14;:43::i;:::-;46891:8;:16;;-1:-1:-1;;;;46891:16:0;;;46509:410;46947:8;;-1:-1:-1;;;;;46972:25:0;;46931:12;46972:25;;;:19;:25;;;;;;46947:8;-1:-1:-1;;;46947:8:0;;;;;46946:9;;46972:25;;:52;;-1:-1:-1;;;;;;47001:23:0;;;;;;:19;:23;;;;;;;;46972:52;46968:100;;;-1:-1:-1;47051:5:0;46968:100;47086:7;47082:815;;;47110:17;47166:13;;47146:17;;:33;;;;:::i;:::-;-1:-1:-1;;;;;47242:29:0;;47194:15;47242:29;;;:25;:29;;;;;;47130:12;:49;;;;;;-1:-1:-1;47194:15:0;47242:29;;:46;;;;;47276:12;47275:13;47242:46;47238:532;;;47340:3;47320:16;47329:7;47320:6;:16;:::i;:::-;47319:24;;;;:::i;:::-;47309:34;;47238:532;;;-1:-1:-1;;;;;47383:31:0;;;;;;:25;:31;;;;;;;;:48;;;;;47419:12;47418:13;47383:48;47379:391;;;47617:18;;47567;;47617:8;47519:16;47641:3;;47617:18;47519:66;;;:::i;:::-;:116;;;;:::i;:::-;47484:153;;:6;:153;:::i;47379:391::-;47684:12;47680:90;;;47750:3;47737:9;;47728:6;:18;;;;:::i;:::-;47727:26;;;;:::i;:::-;47717:36;;47680:90;47807:18;47817:7;47807:6;:18;:::i;:::-;47798:27;;47840:45;47856:4;47870;47877:7;47840:15;:45::i;:::-;47095:802;;47082:815;47917:33;47933:4;47939:2;47943:6;47917:15;:33::i;:::-;47975:15;;-1:-1:-1;;;;;47975:15:0;:26;48002:4;48008:15;48002:4;-1:-1:-1;;;;;5977:18:0;5950:7;5977:18;;;;;;;;;;;;5876:127;48008:15;47975:49;;-1:-1:-1;;;;;;47975:49:0;;;;;;;-1:-1:-1;;;;;17345:32:1;;;47975:49:0;;;17327:51:1;17394:18;;;17387:34;17300:18;;47975:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47971:65;48050:15;;-1:-1:-1;;;;;48050:15:0;:26;48077:2;48081:13;48077:2;-1:-1:-1;;;;;5977:18:0;5950:7;5977:18;;;;;;;;;;;;5876:127;48081:13;48050:45;;-1:-1:-1;;;;;;48050:45:0;;;;;;;-1:-1:-1;;;;;17345:32:1;;;48050:45:0;;;17327:51:1;17394:18;;;17387:34;17300:18;;48050:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48046:61;48124:8;;-1:-1:-1;;;48124:8:0;;;;48119:540;;48163:16;;48200:15;;:28;;-1:-1:-1;;;;;;48200:28:0;;;;;2732:25:1;;;-1:-1:-1;;;;;48200:15:0;;;;:23;;2705:18:1;;48200:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48200:28:0;;;;;;;;-1:-1:-1;;48200:28:0;;;;;;;;;;;;:::i;:::-;;;48196:452;;;48392:231;;;12793:25:1;;;12849:2;12834:18;;12827:34;;;12877:18;;;12870:34;;;12935:2;12920:18;;12913:34;;;48595:9:0;;48542:4;;48392:231;;12780:3:1;12765:19;48392:231:0;;;;;;;48229:410;;;48196:452;48134:525;48119:540;45166:3500;;;;45053:3613;;;:::o;13700:192::-;13786:7;13822:12;13814:6;;;;13806:29;;;;-1:-1:-1;;;13806:29:0;;;;;;;;:::i;:::-;-1:-1:-1;13846:9:0;13858:5;13862:1;13858;:5;:::i;:::-;13846:17;13700:192;-1:-1:-1;;;;;13700:192:0:o;12797:181::-;12855:7;;12887:5;12891:1;12887;:5;:::i;:::-;12875:17;;12916:1;12911;:6;;12903:46;;;;-1:-1:-1;;;12903:46:0;;23551:2:1;12903:46:0;;;23533:21:1;23590:2;23570:18;;;23563:30;23629:29;23609:18;;;23602:57;23676:18;;12903:46:0;23349:351:1;12903:46:0;12969:1;12797:181;-1:-1:-1;;;12797:181:0:o;9647:573::-;-1:-1:-1;;;;;9787:20:0;;9779:70;;;;-1:-1:-1;;;9779:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9868:23:0;;9860:71;;;;-1:-1:-1;;;9860:71:0;;;;;;;:::i;:::-;10024;10046:6;10024:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10024:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10004:17:0;;;:9;:17;;;;;;;;;;;:91;;;;10129:20;;;;;;;:32;;10154:6;10129:24;:32::i;:::-;-1:-1:-1;;;;;10106:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10177:35;2732:25:1;;;10106:20:0;;10177:35;;;;;;2705:18:1;10177:35:0;2586:177:1;48674:1175:0;48750:19;48772:11;:7;48782:1;48772:11;:::i;:::-;48750:33;;48794:32;48862:11;48839:9;:19;;;48830:6;:28;;;;:::i;:::-;48829:44;;;;:::i;:::-;48794:79;-1:-1:-1;48884:14:0;48901:33;48794:79;48901:6;:33;:::i;:::-;48884:50;-1:-1:-1;48970:21:0;49002:24;48884:50;49002:16;:24::i;:::-;49037:20;49060:38;49084:14;49060:21;:38;:::i;:::-;49161:19;;49037:61;;-1:-1:-1;49109:19:0;;49147:33;;:11;:33;:::i;:::-;49131:50;;:12;:50;:::i;:::-;49238:19;;49109:72;;-1:-1:-1;49192:29:0;;49224:33;;49109:72;49224:33;:::i;:::-;49192:65;-1:-1:-1;49272:25:0;;49268:119;;49314:61;49327:24;49353:21;49314:12;:61::i;:::-;49444:19;;49397:26;;49426:15;:11;49440:1;49426:15;:::i;:::-;:37;;;;:::i;:::-;49397:66;-1:-1:-1;49478:22:0;;49474:109;;49525:15;;49517:54;;-1:-1:-1;;;;;49525:15:0;49552:18;49517:34;:54::i;:::-;49631:9;:17;49593;;49613:15;:11;49627:1;49613:15;:::i;:::-;:35;;;;:::i;:::-;49593:55;-1:-1:-1;49663:13:0;;49659:183;;49720:15;;49712:53;;49694:12;;-1:-1:-1;;;;;49720:15:0;;49750:9;;49694:12;49712:53;49694:12;49712:53;49750:9;49720:15;49712:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49693:72;;;49784:7;49780:50;;;49798:32;;;23879:25:1;;;23935:2;23920:18;;23913:34;;;49798:32:0;;23852:18:1;49798:32:0;;;;;;;49780:50;49678:164;49659:183;48739:1110;;;;;;;;;48674:1175;;:::o;49857:472::-;49947:16;;;49961:1;49947:16;;;;;;;;49923:21;;49947:16;;;;;;;;;;-1:-1:-1;49947:16:0;49923:40;;49992:4;49974;49979:1;49974:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49974:23:0;;;:7;;;;;;;;;;:23;;;;50018:6;;:13;;;-1:-1:-1;;;50018:13:0;;;;:6;;;;;:11;;:13;;;;;49974:7;;50018:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50008:4;50013:1;50008:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50008:23:0;;;:7;;;;;;;;;:23;50074:6;;50042:53;;50059:4;;50074:6;50083:11;50042:8;:53::i;:::-;50106:6;;:215;;-1:-1:-1;;;50106:215:0;;-1:-1:-1;;;;;50106:6:0;;;;:57;;:215;;50178:11;;50106:6;;50248:4;;50275;;50295:15;;50106:215;;;:::i;50337:401::-;50450:6;;50418:53;;50435:4;;-1:-1:-1;;;;;50450:6:0;50459:11;50418:8;:53::i;:::-;50482:6;;:248;;-1:-1:-1;;;50482:248:0;;50547:4;50482:248;;;25540:34:1;25590:18;;;25583:34;;;50482:6:0;25633:18:1;;;25626:34;;;25676:18;;;25669:34;35391:42:0;25719:19:1;;;25712:44;50704:15:0;25772:19:1;;;25765:35;-1:-1:-1;;;;;50482:6:0;;;;:22;;50513:9;;25474:19:1;;50482:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:1;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:250::-;745:1;755:113;769:6;766:1;763:13;755:113;;;845:11;;;839:18;826:11;;;819:39;791:2;784:10;755:113;;;-1:-1:-1;;902:1:1;884:16;;877:27;660:250::o;915:396::-;1064:2;1053:9;1046:21;1027:4;1096:6;1090:13;1139:6;1134:2;1123:9;1119:18;1112:34;1155:79;1227:6;1222:2;1211:9;1207:18;1202:2;1194:6;1190:15;1155:79;:::i;:::-;1295:2;1274:15;-1:-1:-1;;1270:29:1;1255:45;;;;1302:2;1251:54;;915:396;-1:-1:-1;;915:396:1:o;1316:316::-;1393:6;1401;1409;1462:2;1450:9;1441:7;1437:23;1433:32;1430:52;;;1478:1;1475;1468:12;1430:52;-1:-1:-1;;1501:23:1;;;1571:2;1556:18;;1543:32;;-1:-1:-1;1622:2:1;1607:18;;;1594:32;;1316:316;-1:-1:-1;1316:316:1:o;1637:315::-;1705:6;1713;1766:2;1754:9;1745:7;1741:23;1737:32;1734:52;;;1782:1;1779;1772:12;1734:52;1821:9;1808:23;1840:31;1865:5;1840:31;:::i;:::-;1890:5;1942:2;1927:18;;;;1914:32;;-1:-1:-1;;;1637:315:1:o;2149:180::-;2208:6;2261:2;2249:9;2240:7;2236:23;2232:32;2229:52;;;2277:1;2274;2267:12;2229:52;-1:-1:-1;2300:23:1;;2149:180;-1:-1:-1;2149:180:1:o;2334:247::-;2393:6;2446:2;2434:9;2425:7;2421:23;2417:32;2414:52;;;2462:1;2459;2452:12;2414:52;2501:9;2488:23;2520:31;2545:5;2520:31;:::i;2768:456::-;2845:6;2853;2861;2914:2;2902:9;2893:7;2889:23;2885:32;2882:52;;;2930:1;2927;2920:12;2882:52;2969:9;2956:23;2988:31;3013:5;2988:31;:::i;:::-;3038:5;-1:-1:-1;3095:2:1;3080:18;;3067:32;3108:33;3067:32;3108:33;:::i;:::-;2768:456;;3160:7;;-1:-1:-1;;;3214:2:1;3199:18;;;;3186:32;;2768:456::o;4903:750::-;4995:6;5003;5011;5064:2;5052:9;5043:7;5039:23;5035:32;5032:52;;;5080:1;5077;5070:12;5032:52;5120:9;5107:23;5149:18;5190:2;5182:6;5179:14;5176:34;;;5206:1;5203;5196:12;5176:34;5244:6;5233:9;5229:22;5219:32;;5289:7;5282:4;5278:2;5274:13;5270:27;5260:55;;5311:1;5308;5301:12;5260:55;5351:2;5338:16;5377:2;5369:6;5366:14;5363:34;;;5393:1;5390;5383:12;5363:34;5448:7;5441:4;5431:6;5428:1;5424:14;5420:2;5416:23;5412:34;5409:47;5406:67;;;5469:1;5466;5459:12;5406:67;5500:4;5492:13;;;;-1:-1:-1;5524:6:1;-1:-1:-1;;5565:20:1;;5552:34;5595:28;5552:34;5595:28;:::i;:::-;5642:5;5632:15;;;4903:750;;;;;:::o;5658:388::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5842:9;5829:23;5861:31;5886:5;5861:31;:::i;:::-;5911:5;-1:-1:-1;5968:2:1;5953:18;;5940:32;5981:33;5940:32;5981:33;:::i;6051:241::-;6107:6;6160:2;6148:9;6139:7;6135:23;6131:32;6128:52;;;6176:1;6173;6166:12;6128:52;6215:9;6202:23;6234:28;6256:5;6234:28;:::i;6297:356::-;6499:2;6481:21;;;6518:18;;;6511:30;6577:34;6572:2;6557:18;;6550:62;6644:2;6629:18;;6297:356::o;6947:380::-;7026:1;7022:12;;;;7069;;;7090:61;;7144:4;7136:6;7132:17;7122:27;;7090:61;7197:2;7189:6;7186:14;7166:18;7163:38;7160:161;;7243:10;7238:3;7234:20;7231:1;7224:31;7278:4;7275:1;7268:15;7306:4;7303:1;7296:15;7160:161;;6947:380;;;:::o;7687:127::-;7748:10;7743:3;7739:20;7736:1;7729:31;7779:4;7776:1;7769:15;7803:4;7800:1;7793:15;7819:125;7884:9;;;7905:10;;;7902:36;;;7918:18;;:::i;9117:184::-;9187:6;9240:2;9228:9;9219:7;9215:23;9211:32;9208:52;;;9256:1;9253;9246:12;9208:52;-1:-1:-1;9279:16:1;;9117:184;-1:-1:-1;9117:184:1:o;9306:422::-;9395:1;9438:5;9395:1;9452:270;9473:7;9463:8;9460:21;9452:270;;;9532:4;9528:1;9524:6;9520:17;9514:4;9511:27;9508:53;;;9541:18;;:::i;:::-;9591:7;9581:8;9577:22;9574:55;;;9611:16;;;;9574:55;9690:22;;;;9650:15;;;;9452:270;;;9456:3;9306:422;;;;;:::o;9733:806::-;9782:5;9812:8;9802:80;;-1:-1:-1;9853:1:1;9867:5;;9802:80;9901:4;9891:76;;-1:-1:-1;9938:1:1;9952:5;;9891:76;9983:4;10001:1;9996:59;;;;10069:1;10064:130;;;;9976:218;;9996:59;10026:1;10017:10;;10040:5;;;10064:130;10101:3;10091:8;10088:17;10085:43;;;10108:18;;:::i;:::-;-1:-1:-1;;10164:1:1;10150:16;;10179:5;;9976:218;;10278:2;10268:8;10265:16;10259:3;10253:4;10250:13;10246:36;10240:2;10230:8;10227:16;10222:2;10216:4;10213:12;10209:35;10206:77;10203:159;;;-1:-1:-1;10315:19:1;;;10347:5;;10203:159;10394:34;10419:8;10413:4;10394:34;:::i;:::-;10464:6;10460:1;10456:6;10452:19;10443:7;10440:32;10437:58;;;10475:18;;:::i;:::-;10513:20;;9733:806;-1:-1:-1;;;9733:806:1:o;10544:140::-;10602:5;10631:47;10672:4;10662:8;10658:19;10652:4;10631:47;:::i;10689:168::-;10762:9;;;10793;;10810:15;;;10804:22;;10790:37;10780:71;;10831:18;;:::i;11167:245::-;11234:6;11287:2;11275:9;11266:7;11262:23;11258:32;11255:52;;;11303:1;11300;11293:12;11255:52;11335:9;11329:16;11354:28;11376:5;11354:28;:::i;12251:306::-;12339:6;12347;12355;12408:2;12396:9;12387:7;12383:23;12379:32;12376:52;;;12424:1;12421;12414:12;12376:52;12453:9;12447:16;12437:26;;12503:2;12492:9;12488:18;12482:25;12472:35;;12547:2;12536:9;12532:18;12526:25;12516:35;;12251:306;;;;;:::o;12958:127::-;13019:10;13014:3;13010:20;13007:1;13000:31;13050:4;13047:1;13040:15;13074:4;13071:1;13064:15;13090:897;13170:6;13223:2;13211:9;13202:7;13198:23;13194:32;13191:52;;;13239:1;13236;13229:12;13191:52;13272:9;13266:16;13301:18;13342:2;13334:6;13331:14;13328:34;;;13358:1;13355;13348:12;13328:34;13396:6;13385:9;13381:22;13371:32;;13441:7;13434:4;13430:2;13426:13;13422:27;13412:55;;13463:1;13460;13453:12;13412:55;13492:2;13486:9;13514:2;13510;13507:10;13504:36;;;13520:18;;:::i;:::-;13595:2;13589:9;13563:2;13649:13;;-1:-1:-1;;13645:22:1;;;13669:2;13641:31;13637:40;13625:53;;;13693:18;;;13713:22;;;13690:46;13687:72;;;13739:18;;:::i;:::-;13779:10;13775:2;13768:22;13814:2;13806:6;13799:18;13854:7;13849:2;13844;13840;13836:11;13832:20;13829:33;13826:53;;;13875:1;13872;13865:12;13826:53;13888:68;13953:2;13948;13940:6;13936:15;13931:2;13927;13923:11;13888:68;:::i;:::-;13975:6;13090:897;-1:-1:-1;;;;;;;13090:897:1:o;13992:681::-;14123:6;14131;14139;14147;14155;14163;14171;14179;14232:3;14220:9;14211:7;14207:23;14203:33;14200:53;;;14249:1;14246;14239:12;14200:53;14281:9;14275:16;14300:31;14325:5;14300:31;:::i;:::-;14350:5;14340:15;;;14395:2;14384:9;14380:18;14374:25;14364:35;;14439:2;14428:9;14424:18;14418:25;14408:35;;14483:2;14472:9;14468:18;14462:25;14452:35;;14527:3;14516:9;14512:19;14506:26;14496:36;;14572:3;14561:9;14557:19;14551:26;14541:36;;14617:3;14606:9;14602:19;14596:26;14586:36;;14662:3;14651:9;14647:19;14641:26;14631:36;;13992:681;;;;;;;;;;;:::o;17432:127::-;17493:10;17488:3;17484:20;17481:1;17474:31;17524:4;17521:1;17514:15;17548:4;17545:1;17538:15;17564:135;17603:3;17624:17;;;17621:43;;17644:18;;:::i;:::-;-1:-1:-1;17691:1:1;17680:13;;17564:135::o;17704:794::-;17926:2;17938:21;;;17911:18;;17994:22;;;17878:4;18073:6;18047:2;18032:18;;17878:4;18107:304;18121:6;18118:1;18115:13;18107:304;;;18196:6;18183:20;18216:31;18241:5;18216:31;:::i;:::-;-1:-1:-1;;;;;18272:31:1;18260:44;;18327:4;18386:15;;;;18351:12;;;;18300:1;18136:9;18107:304;;;18111:3;18428;18420:11;;;;18483:6;18476:14;18469:22;18462:4;18451:9;18447:20;18440:52;17704:794;;;;;;:::o;20713:401::-;20915:2;20897:21;;;20954:2;20934:18;;;20927:30;20993:34;20988:2;20973:18;;20966:62;-1:-1:-1;;;21059:2:1;21044:18;;21037:35;21104:3;21089:19;;20713:401::o;21119:399::-;21321:2;21303:21;;;21360:2;21340:18;;;21333:30;21399:34;21394:2;21379:18;;21372:62;-1:-1:-1;;;21465:2:1;21450:18;;21443:33;21508:3;21493:19;;21119:399::o;22994:217::-;23034:1;23060;23050:132;;23104:10;23099:3;23095:20;23092:1;23085:31;23139:4;23136:1;23129:15;23167:4;23164:1;23157:15;23050:132;-1:-1:-1;23196:9:1;;22994:217::o;23216:128::-;23283:9;;;23304:11;;;23301:37;;;23318:18;;:::i;23958:251::-;24028:6;24081:2;24069:9;24060:7;24056:23;24052:32;24049:52;;;24097:1;24094;24087:12;24049:52;24129:9;24123:16;24148:31;24173:5;24148:31;:::i;24214:980::-;24476:4;24524:3;24513:9;24509:19;24555:6;24544:9;24537:25;24581:2;24619:6;24614:2;24603:9;24599:18;24592:34;24662:3;24657:2;24646:9;24642:18;24635:31;24686:6;24721;24715:13;24752:6;24744;24737:22;24790:3;24779:9;24775:19;24768:26;;24829:2;24821:6;24817:15;24803:29;;24850:1;24860:195;24874:6;24871:1;24868:13;24860:195;;;24939:13;;-1:-1:-1;;;;;24935:39:1;24923:52;;25030:15;;;;24995:12;;;;24971:1;24889:9;24860:195;;;-1:-1:-1;;;;;;;25111:32:1;;;;25106:2;25091:18;;25084:60;-1:-1:-1;;;25175:3:1;25160:19;25153:35;25072:3;24214:980;-1:-1:-1;;;24214:980:1:o

Swarm Source

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