ETH Price: $1,645.63 (+5.15%)
 

Overview

Max Total Supply

333,333,333 🥚

Holders

12

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Tamago

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-09
*/

// 🥚 🏆 🐦
// SPDX-License-Identifier: MIT                                                                               
pragma solidity 0.8.13;

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

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

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

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 {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

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

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

interface DividendPayingTokenOptionalInterface {
  /// @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, address _rewardToken) 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, address _rewardToken) 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, address _rewardToken) external view returns(uint256);
}

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, address _rewardToken) external view returns(uint256);

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend(address _rewardToken) external;

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

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

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



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

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

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

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

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

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


     
}

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, 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;

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

  mapping(address => uint256) public totalDividendsDistributed;
  
  constructor(){
      IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
      uniswapV2Router = _uniswapV2Router; 
      
      // Mainnet

      rewardTokens.push(address(0x676495371D5107f870E0e7d5aFb6fed91f236f21)); // 🐦 - 0x676495371D5107f870E0e7d5aFb6fed91f236f21

      nextRewardToken = rewardTokens[0];
  }

  

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

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable { 
    require(totalBalance > 0);
    uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this));
    buyTokens(msg.value, nextRewardToken);
    uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance);
    if (newBalance > 0) {
      magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add(
        (newBalance).mul(magnitude) / totalBalance
      );
      emit DividendsDistributed(msg.sender, newBalance);

      totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance);
    }
    rewardTokenCounter = rewardTokenCounter == rewardTokens.length - 1 ? 0 : rewardTokenCounter + 1;
    nextRewardToken = rewardTokens[rewardTokenCounter];
  }
  
  // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyTokens(uint256 bnbAmountInWei, address rewardToken) internal {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = rewardToken;

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(this),
            block.timestamp
        );
    }
  
  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend(address _rewardToken) external virtual override {
    _withdrawDividendOfUser(payable(msg.sender), _rewardToken);
  }

  /// @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, address _rewardToken) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      IERC20(_rewardToken).transfer(user, _withdrawableDividend);
      return _withdrawableDividend;
    }

    return 0;
  }


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

  /// @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, address _rewardToken) public view override returns(uint256) {
    return accumulativeDividendOf(_owner,_rewardToken).sub(withdrawnDividends[_owner][_rewardToken]);
  }

  /// @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, address _rewardToken) external view override returns(uint256) {
    return withdrawnDividends[_owner][_rewardToken];
  }


  /// @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, address _rewardToken) public view override returns(uint256) {
    return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_rewardToken][_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that increases tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _increase(address account, uint256 value) internal {
    for (uint256 i; i < rewardTokens.length; i++){
        magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
          .sub((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe());
    }
  }

  /// @dev Internal function that reduces 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 _reduce(address account, uint256 value) internal {
      for (uint256 i; i < rewardTokens.length; i++){
        magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
          .add( (magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe() );
      }
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}

contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(address key) private view returns (uint) {
        return tokenHoldersMap.values[key];
    }

    function getIndexOfKey(address key) private view returns (int) {
        if(!tokenHoldersMap.inserted[key]) {
            return -1;
        }
        return int(tokenHoldersMap.indexOf[key]);
    }

    function getKeyAtIndex(uint index) private view returns (address) {
        return tokenHoldersMap.keys[index];
    }



    function size() private view returns (uint) {
        return tokenHoldersMap.keys.length;
    }

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

    function remove(address key) private {
        if (!tokenHoldersMap.inserted[key]) {
            return;
        }

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

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

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

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

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

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

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

    constructor() {
    	claimWait = 1200;
        minimumTokenBalanceForDividends = 1000 * (10**18);
    }

    function excludeFromDividends(address account) external onlyOwner {
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	remove(account);

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "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;
    }

    // Check to see if I really made this contract or if it is a clone!

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

        index = 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.add(int256(processesUntilEndOfArray));
            }
        }


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

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

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

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

        address account = getKeyAtIndex(index);

        return getAccount(account, _rewardToken);
    }

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

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

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

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

    	processAccount(account, true);
    }
    
    function process(uint256 gas) external 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.add(gasLeft.sub(newGasLeft));
    		}
    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount;
        bool paid;
        for (uint256 i; i < rewardTokens.length; i++){
            amount = _withdrawDividendOfUser(account, rewardTokens[i]);
            if(amount > 0) {
        		lastClaimTimes[account] = block.timestamp;
                emit Claim(account, amount, automatic);
                paid = true;
    	    }
        }
        return paid;
    }
}

contract Tamago is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;

    DividendTracker public dividendTracker;

    address public operationsWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
    
    uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet
    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public earlyBuyPenaltyEnd; // determines when snipers/bots can sell without extra penalty
    
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    mapping (address => bool) private _blacklist;
    bool public transferDelayEnabled = true;
    
    uint256 public constant feeDivisor = 1000;

    uint256 public totalSellFees;
    uint256 public rewardsSellFee;
    uint256 public operationsSellFee;
    uint256 public liquiditySellFee;
    
    uint256 public totalBuyFees;
    uint256 public rewardsBuyFee;
    uint256 public operationsBuyFee;
    uint256 public liquidityBuyFee;
    
    uint256 public tokensForRewards;
    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    
    uint256 public gasForProcessing = 0;

    uint256 public lpWithdrawRequestTimestamp;
    uint256 public lpWithdrawRequestDuration = 3 days;
    bool public lpWithdrawRequestPending;
    uint256 public lpPercToWithDraw;

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

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);

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

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

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

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    event ProcessedDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );

    event RequestedLPWithdraw();
    
    event WithdrewLPForMigration();

    event CanceledLpWithdrawRequest();

    constructor() ERC20("Tamago", unicode"🥚") {

        uint256 totalSupply = 333333333 * 1e18;
        
        maxTransactionAmount = totalSupply * 10 / 1000; // 0.5% maxTransactionAmountTxn
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap tokens amount
        maxWallet = totalSupply * 10 / 1000; // 0.5% Max wallet

        rewardsBuyFee = 0;
        operationsBuyFee = 0;
        liquidityBuyFee = 0;
        totalBuyFees = rewardsBuyFee + operationsBuyFee + liquidityBuyFee;
        
        rewardsSellFee = 0;
        operationsSellFee = 0;
        liquiditySellFee = 0;
        totalSellFees = rewardsSellFee + operationsSellFee + liquiditySellFee;

    	dividendTracker = new DividendTracker();
    	
    	operationsWallet = address(msg.sender); // set as operations wallet

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

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(address(0xdead));
        
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(dividendTracker), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _createInitialSupply(address(owner()), totalSupply);
    }

    receive() external payable {

  	}


     // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }

    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }
    
    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot re-enable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
    }

      function blacklistAccount (address account, bool isBlacklisted) public onlyOwner {
        _blacklist[account] = isBlacklisted;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum > (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**18);
    }
    
    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%");
        maxWallet = newNum * (10**18);
    }
    
    function updateBuyFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
        operationsBuyFee = _operationsFee;
        rewardsBuyFee = _rewardsFee;
        liquidityBuyFee = _liquidityFee;
        totalBuyFees = operationsBuyFee + rewardsBuyFee + liquidityBuyFee;
        require(totalBuyFees <= 100, "Must keep fees at 10% or less");
    }
    
    function updateSellFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
        operationsSellFee = _operationsFee;
        rewardsSellFee = _rewardsFee;
        liquiditySellFee = _liquidityFee;
        totalSellFees = operationsSellFee + rewardsSellFee + liquiditySellFee;
        require(totalSellFees <= 100, "Must keep fees at 10% or less");
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
        emit ExcludedMaxTransactionAmount(updAds, isEx);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

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

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The UniSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        excludeFromMaxTransaction(pair, value);
        
        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateOperationsWallet(address newOperationsWallet) external onlyOwner {
        require(newOperationsWallet != address(0), "may not set to 0 address");
        excludeFromFees(newOperationsWallet, true);
        emit OperationsWalletUpdated(newOperationsWallet, operationsWallet);
        operationsWallet = newOperationsWallet;
    }

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

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

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

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

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

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

	function dividendTokenBalanceOf(address account) external view returns (uint256) {
		return dividendTracker.holderBalance(account);
	}

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

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

	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 getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        transferDelayEnabled = false;
        return true;
    }
    
    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");
         require(!_blacklist[to] && !_blacklist[from], "You have been blacklisted from transfering tokens");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet.");
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
                }
            }
        }

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

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

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        
        // no taxes on transfers (non buys/sells)
        if(takeFee){
            if(tradingActiveBlock + 1 >= block.number && (automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from])){
                fees = amount.mul(99).div(100);
                tokensForLiquidity += fees * 33 / 99;
                tokensForRewards += fees * 33 / 99;
                tokensForOperations += fees * 33 / 99;
            }

            // on sell
            else if (automatedMarketMakerPairs[to] && totalSellFees > 0){
                fees = amount.mul(totalSellFees).div(feeDivisor);
                tokensForRewards += fees * rewardsSellFee / totalSellFees;
                tokensForLiquidity += fees * liquiditySellFee / totalSellFees;
                tokensForOperations += fees * operationsSellFee / totalSellFees;
            }
            
            // on buy
            else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) {
        	    fees = amount.mul(totalBuyFees).div(feeDivisor);
        	    tokensForRewards += fees * rewardsBuyFee / totalBuyFees;
                tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees;
                tokensForOperations += fees * operationsBuyFee / totalBuyFees;
            }

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

        super._transfer(from, to, amount);

        dividendTracker.setBalance(payable(from), balanceOf(from));
        dividendTracker.setBalance(payable(to), balanceOf(to));

        if(!swapping && gasForProcessing > 0) {
	    	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 swapTokensForEth(uint256 tokenAmount) private {

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    }
    
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForRewards;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForOperations = ethBalance.mul(tokensForOperations).div(totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap - (tokensForLiquidity/2));
        
        uint256 ethForLiquidity = ethBalance - ethForOperations - ethForRewards;
        
        tokensForLiquidity = 0;
        tokensForOperations = 0;
        tokensForRewards = 0;
        
        
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        // call twice to force buy of both reward tokens.
        (bool success,) = address(dividendTracker).call{value: ethForRewards}("");

        (success,) = address(operationsWallet).call{value: address(this).balance}("");
    }

    function withdrawStuckEth() external onlyOwner {
        (bool success,) = address(msg.sender).call{value: address(this).balance}("");
        require(success, "failed to withdraw");
    }

  

    function nextAvailableLpWithdrawDate() public view returns (uint256){
        if(lpWithdrawRequestPending){
            return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
        }
        else {
            return 0;  // 0 means no open requests
        }
    }

    function withdrawRequestedLP() external onlyOwner {
        require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
        lpWithdrawRequestTimestamp = 0;
        lpWithdrawRequestPending = false;

        uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
        
        lpPercToWithDraw = 0;

        IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw);
    }

   
}

Contract Security Audit

Contract ABI

API
[{"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":[],"name":"CanceledLpWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevWalletUpdated","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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"OperationsWalletUpdated","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":[],"name":"RequestedLPWithdraw","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"WithdrewLPForMigration","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","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 DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"feeDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","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"},{"internalType":"address","name":"rewardToken","type":"address"}],"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":"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":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600b819055600c819055600e805462ffffff191660019081179091556011805460ff19169091179055601d556203f480601f553480156200004657600080fd5b50604080518082018252600681527f54616d61676f000000000000000000000000000000000000000000000000000060208083019182528351808501909452600484527ff09fa59a00000000000000000000000000000000000000000000000000000000908401528151919291620000c19160039162000b89565b508051620000d790600490602084019062000b89565b5050506000620000f5620007cd640100000000026401000000009004565b60058054600160a060020a031916600160a060020a038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506b0113ba1430a5432dc03400006103e86200016082600a62000c6c565b6200016c919062000c8e565b6008556127106200017f82600562000c6c565b6200018b919062000c8e565b6009556103e86200019e82600a62000c6c565b620001aa919062000c8e565b600a556000601781905560188190556019819055620001ca818062000cca565b620001d6919062000cca565b6016556000601381905560148190556015819055620001f6818062000cca565b62000202919062000cca565b601255604051620002139062000c18565b604051809103906000f08015801562000230573d6000803e3d6000fd5b5060068054600160a060020a0392909216600160a060020a03199283161790556007805490911633179055604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620002ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f0919062000ce5565b600160a060020a031663c9c653963084600160a060020a031663ad5c46486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000ce5565b6040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a039283166004820152911660248201526044016020604051808303816000875af1158015620003e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040b919062000ce5565b600160a060020a03808416608052811660a052905062000436816001640100000000620007d1810204565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200049657600080fd5b505af1158015620004ab573d6000803e3d6000fd5b50506006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0390911692506331e79db09150602401600060405180830381600087803b1580156200050e57600080fd5b505af115801562000523573d6000803e3d6000fd5b5050600654600160a060020a031691506331e79db090506200054d640100000000620008c8810204565b6040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b158015620005a657600080fd5b505af1158015620005bb573d6000803e3d6000fd5b50506006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200062057600080fd5b505af115801562000635573d6000803e3d6000fd5b50506006546040517f31e79db000000000000000000000000000000000000000000000000000000000815261dead6004820152600160a060020a0390911692506331e79db09150602401600060405180830381600087803b1580156200069a57600080fd5b505af1158015620006af573d6000803e3d6000fd5b50505050620006e1620006d0620008c8640100000000026401000000009004565b6001640100000000620008d7810204565b620006f7306001640100000000620008d7810204565b6200070f61dead6001640100000000620008d7810204565b6200073762000726640100000000620008c8810204565b6001640100000000620009b6810204565b6200074d306001640100000000620009b6810204565b6006546200076f90600160a060020a03166001640100000000620009b6810204565b62000785826001640100000000620009b6810204565b6200079d61dead6001640100000000620009b6810204565b620007c4620007b4640100000000620008c8810204565b8464010000000062000a8a810204565b50505062000d6c565b3390565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556200080a8282640100000000620009b6810204565b80156200088c576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200087257600080fd5b505af115801562000887573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600554600160a060020a031690565b620008ea640100000000620007cd810204565b600554600160a060020a0390811691161462000956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201526000805160206200747d83398151915260448201526064015b60405180910390fd5b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b620009c9640100000000620007cd810204565b600554600160a060020a0390811691161462000a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201526000805160206200747d83398151915260448201526064016200094d565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d959101620009aa565b600160a060020a03821662000afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200094d565b806002600082825462000b10919062000cca565b9091555050600160a060020a0382166000908152602081905260408120805483929062000b3f90849062000cca565b9091555050604051818152600160a060020a038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000b979062000d17565b90600052602060002090601f01602090048101928262000bbb576000855562000c06565b82601f1062000bd657805160ff191683800117855562000c06565b8280016001018555821562000c06579182015b8281111562000c0657825182559160200191906001019062000be9565b5062000c1492915062000c26565b5090565b612321806200515c83390190565b5b8082111562000c14576000815560010162000c27565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600081600019048311821515161562000c895762000c8962000c3d565b500290565b60008262000cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111562000ce05762000ce062000c3d565b500190565b60006020828403121562000cf857600080fd5b8151600160a060020a038116811462000d1057600080fd5b9392505050565b60028104600182168062000d2c57607f821691505b60208210810362000d66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60805160a05161438462000dd86000396000818161071b015281816119ad01528181611a7101528181611f4f0152612acd01526000818161057001528181612a9001528181613a5401528181613b1001528181613b6501528181613bdf0152613c5501526143846000f3fe60806040526004361061047b5760003560e060020a900480638095d5641161024e578063c492f0461161013d578063e98030c7116100ba578063f54afa781161007e578063f54afa7814610d87578063f8b45b0514610d9d578063fb002c9714610db3578063fd361d0e14610dc9578063fd72e22a14610de357600080fd5b8063e98030c714610d05578063ee40166e14610d25578063ee44b44e14610d3b578063efcc1b2f14610d51578063f2fde38b14610d6757600080fd5b8063d0a3981411610101578063d0a3981414610c69578063dd62ed3e14610c7f578063e2f4560514610cc5578063e7841ec014610cdb578063e884f26014610cf057600080fd5b8063c492f04614610bed578063c876d0b914610c0d578063c8c8ebe414610c27578063ccb6135814610c3d578063ccd146b214610c5357600080fd5b8063a26579ad116101cb578063bbc0c7421161018f578063bbc0c74214610b4e578063c024666814610b6d578063c0f306ef14610b8d578063c17b5b8c14610bad578063c18bc19514610bcd57600080fd5b8063a26579ad14610ab3578063a457c2d714610ac8578063a9059cbb14610ae8578063b62496f514610b08578063b9e9370014610b3857600080fd5b806392b596261161021257806392b5962614610a3257806395d89b4114610a525780639a36f93214610a675780639a7a23d614610a7d5780639c1b8af514610a9d57600080fd5b80638095d5641461099f578063871c128d146109bf5780638a8c523c146109df5780638da5cb5b146109f4578063924de9b714610a1257600080fd5b80634a62bb651161036a57806370a08231116102e7578063751039fc116102ab578063751039fc1461092a5780637571336a1461093f578063763cef491461095f578063783102eb146109745780637fa787ba1461098a57600080fd5b806370a08231146108b5578063712c2985146108d5578063715018a6146108ea57806371778e7d146108ff5780637506cbd81461091457600080fd5b8063632459f01161032e578063632459f0146107db57806364b0f653146108405780636843cd84146108555780636ddd171314610875578063700bb1911461089557600080fd5b80634a62bb651461073d5780634af6f7ee146107575780634e71d92d1461076d5780634fbee193146107825780635645cd86146107bb57600080fd5b8063203e727e116103f857806330d5d18d116103bc57806330d5d18d1461068d578063313ce567146106ad57806331e79db0146106c957806339509351146106e957806349bd5a5e1461070957600080fd5b8063203e727e146105eb578063204f11a81461060d57806323b872dd1461062d5780632c1f52161461064d5780632d5a5d341461066d57600080fd5b806310d5de531161043f57806310d5de531461052e5780631694505e1461055e57806318160ddd146105aa5780631a8145bb146105bf5780631fc851bd146105d557600080fd5b8063058054c91461048757806306fdde03146104b0578063095ea7b3146104d2578063099d0d30146105025780630f4432e31461051857600080fd5b3661048257005b600080fd5b34801561049357600080fd5b5061049d601e5481565b6040519081526020015b60405180910390f35b3480156104bc57600080fd5b506104c5610e03565b6040516104a79190613d3a565b3480156104de57600080fd5b506104f26104ed366004613da4565b610e95565b60405190151581526020016104a7565b34801561050e57600080fd5b5061049d60155481565b34801561052457600080fd5b5061049d600b5481565b34801561053a57600080fd5b506104f2610549366004613dd0565b60236020526000908152604090205460ff1681565b34801561056a57600080fd5b506105927f000000000000000000000000000000000000000000000000000000000000000081565b604051600160a060020a0390911681526020016104a7565b3480156105b657600080fd5b5060025461049d565b3480156105cb57600080fd5b5061049d601c5481565b3480156105e157600080fd5b5061049d600d5481565b3480156105f757600080fd5b5061060b610606366004613ded565b610eac565b005b34801561061957600080fd5b5061049d610628366004613e06565b610fa5565b34801561063957600080fd5b506104f2610648366004613e3f565b61103c565b34801561065957600080fd5b5060065461059290600160a060020a031681565b34801561067957600080fd5b5061060b610688366004613e8e565b6110fe565b34801561069957600080fd5b5061060b6106a8366004613dd0565b611156565b3480156106b957600080fd5b50604051601281526020016104a7565b3480156106d557600080fd5b5061060b6106e4366004613dd0565b611251565b3480156106f557600080fd5b506104f2610704366004613da4565b6112fa565b34801561071557600080fd5b506105927f000000000000000000000000000000000000000000000000000000000000000081565b34801561074957600080fd5b50600e546104f29060ff1681565b34801561076357600080fd5b5061049d60175481565b34801561077957600080fd5b5061060b611336565b34801561078e57600080fd5b506104f261079d366004613dd0565b600160a060020a031660009081526022602052604090205460ff1690565b3480156107c757600080fd5b5061049d6107d6366004613dd0565b6113c7565b3480156107e757600080fd5b506107fb6107f6366004613ebc565b611450565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104a7565b34801561084c57600080fd5b5061049d61150d565b34801561086157600080fd5b5061049d610870366004613dd0565b611599565b34801561088157600080fd5b50600e546104f29062010000900460ff1681565b3480156108a157600080fd5b5061060b6108b0366004613ded565b6115e5565b3480156108c157600080fd5b5061049d6108d0366004613dd0565b6116ce565b3480156108e157600080fd5b5061049d6116e9565b3480156108f657600080fd5b5061060b61170d565b34801561090b57600080fd5b5061049d611791565b34801561092057600080fd5b5061049d60145481565b34801561093657600080fd5b506104f26117f4565b34801561094b57600080fd5b5061060b61095a366004613e8e565b611840565b34801561096b57600080fd5b5061060b6118cd565b34801561098057600080fd5b5061049d60215481565b34801561099657600080fd5b5061060b611aea565b3480156109ab57600080fd5b5061060b6109ba366004613ee1565b611bb3565b3480156109cb57600080fd5b5061060b6109da366004613ded565b611c61565b3480156109eb57600080fd5b5061060b611dc6565b348015610a0057600080fd5b50600554600160a060020a0316610592565b348015610a1e57600080fd5b5061060b610a2d366004613f0d565b611e65565b348015610a3e57600080fd5b506107fb610a4d366004613e06565b611eae565b348015610a5e57600080fd5b506104c5611f11565b348015610a7357600080fd5b5061049d6103e881565b348015610a8957600080fd5b5061060b610a98366004613e8e565b611f20565b348015610aa957600080fd5b5061049d601d5481565b348015610abf57600080fd5b5061049d612027565b348015610ad457600080fd5b506104f2610ae3366004613da4565b61208a565b348015610af457600080fd5b506104f2610b03366004613da4565b61213e565b348015610b1457600080fd5b506104f2610b23366004613dd0565b60246020526000908152604090205460ff1681565b348015610b4457600080fd5b5061049d60165481565b348015610b5a57600080fd5b50600e546104f290610100900460ff1681565b348015610b7957600080fd5b5061060b610b88366004613e8e565b61214b565b348015610b9957600080fd5b5061060b610ba8366004613dd0565b6121d0565b348015610bb957600080fd5b5061060b610bc8366004613ee1565b612248565b348015610bd957600080fd5b5061060b610be8366004613ded565b6122f1565b348015610bf957600080fd5b5061060b610c08366004613f2a565b6123e0565b348015610c1957600080fd5b506011546104f29060ff1681565b348015610c3357600080fd5b5061049d60085481565b348015610c4957600080fd5b5061049d60195481565b348015610c5f57600080fd5b5061049d60135481565b348015610c7557600080fd5b5061049d60125481565b348015610c8b57600080fd5b5061049d610c9a366004613e06565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b348015610cd157600080fd5b5061049d60095481565b348015610ce757600080fd5b5061049d6124bf565b348015610cfc57600080fd5b506104f2612522565b348015610d1157600080fd5b5061060b610d20366004613ded565b612562565b348015610d3157600080fd5b5061049d600c5481565b348015610d4757600080fd5b5061049d601f5481565b348015610d5d57600080fd5b5061049d60185481565b348015610d7357600080fd5b5061060b610d82366004613dd0565b6125d9565b348015610d9357600080fd5b5061049d601a5481565b348015610da957600080fd5b5061049d600a5481565b348015610dbf57600080fd5b5061049d601b5481565b348015610dd557600080fd5b506020546104f29060ff1681565b348015610def57600080fd5b5060075461059290600160a060020a031681565b606060038054610e1290613faf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90613faf565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b5050505050905090565b6000610ea23384846126ee565b5060015b92915050565b600554600160a060020a03163314610ee25760405160e560020a62461bcd028152600401610ed990613fec565b60405180910390fd5b670de0b6b3a76400006103e8610ef760025490565b610f0290600161403a565b610f0c9190614059565b610f169190614059565b8111610f8d5760405160e560020a62461bcd02815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ed9565b610f9f81670de0b6b3a764000061403a565b60085550565b6006546040517f204f11a8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611035919061407e565b9392505050565b600061104984848461284c565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156110e65760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610ed9565b6110f385338584036126ee565b506001949350505050565b600554600160a060020a0316331461112b5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a03919091166000908152601060205260409020805460ff1916911515919091179055565b600554600160a060020a031633146111835760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166111dc5760405160e560020a62461bcd02815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ed9565b6111e781600161214b565b600754604051600160a060020a03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a0316331461127e5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b5050505050565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610ea2918590611331908690614097565b6126ee565b6006546040517fbc4c4b3700000000000000000000000000000000000000000000000000000000815233600482015260006024820152600160a060020a039091169063bc4c4b37906044016020604051808303816000875af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c491906140af565b50565b6006546040517f4d6e5e02000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061407e565b6006546040517f8c503bf500000000000000000000000000000000000000000000000000000000815260048101849052600160a060020a0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f091906140cc565b975097509750975097509750975097509295985092959890939650565b600654604080517f09bbedde0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916309bbedde9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611594919061407e565b905090565b6006546040517fab6ddfa8000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152600092169063ab6ddfa89060240161140f565b6006546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526004810183905260009182918291600160a060020a03169063ffb2c479906024016060604051808303816000875af115801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190614136565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b600160a060020a031660009081526020819052604090205490565b60205460009060ff161561170757601f54601e546115949190614097565b50600090565b600554600160a060020a0316331461173a5760405160e560020a62461bcd028152600401610ed990613fec565b600554604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b600654604080517fad7a672f0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163ad7a672f9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146118245760405160e560020a62461bcd028152600401610ed990613fec565b50600e805460ff19908116909155601180549091169055600190565b600554600160a060020a0316331461186d5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b600554600160a060020a031633146118fa5760405160e560020a62461bcd028152600401610ed990613fec565b6119026116e9565b4210158015611918575060006119166116e9565b115b6119675760405160e560020a62461bcd02815260206004820152601660248201527f4d757374207265717565737420616e6420776169742e000000000000000000006044820152606401610ed9565b6000601e8190556020805460ff191690556021546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152606491907f0000000000000000000000000000000000000000000000000000000000000000600160a060020a0316906370a0823190602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061407e565b611a2a919061403a565b611a349190614059565b60006021556040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a03169063a9059cbb906044016020604051808303816000875af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906140af565b5050565b600554600160a060020a03163314611b175760405160e560020a62461bcd028152600401610ed990613fec565b60405160009033903031908381818185875af1925050503d8060008114611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b50509050806113c45760405160e560020a62461bcd02815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610ed9565b600554600160a060020a03163314611be05760405160e560020a62461bcd028152600401610ed990613fec565b60188390556017829055601981905580611bfa8385614097565b611c049190614097565b601681905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b505050565b600554600160a060020a03163314611c8e5760405160e560020a62461bcd028152600401610ed990613fec565b62030d408110158015611ca457506207a1208111155b611d195760405160e560020a62461bcd02815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527f6e203230302c30303020616e64203530302c30303000000000000000000000006064820152608401610ed9565b601d548103611d935760405160e560020a62461bcd02815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201527f6f2073616d652076616c756500000000000000000000000000000000000000006064820152608401610ed9565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b600554600160a060020a03163314611df35760405160e560020a62461bcd028152600401610ed990613fec565b600e54610100900460ff1615611e4e5760405160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ed9565b600e805462ffff0019166201010017905543600c55565b600554600160a060020a03163314611e925760405160e560020a62461bcd028152600401610ed990613fec565b600e8054911515620100000262ff000019909216919091179055565b6006546040517ffd590847000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114ae565b606060048054610e1290613faf565b600554600160a060020a03163314611f4d5760405160e560020a62461bcd028152600401610ed990613fec565b7f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a03160361201d5760405160e560020a62461bcd02815260206004820152604160248201527f54686520556e695377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b65725061697260648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a401610ed9565b611ae68282613458565b600654604080517f6f2789ec0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691636f2789ec9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156121275760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610ed9565b61213433858584036126ee565b5060019392505050565b6000610ea233848461284c565b600554600160a060020a031633146121785760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016118c1565b600554600160a060020a031633146121fd5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fc0f306ef000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301529091169063c0f306ef906024016112c5565b600554600160a060020a031633146122755760405160e560020a62461bcd028152600401610ed990613fec565b6014839055601382905560158190558061228f8385614097565b6122999190614097565b601281905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b600554600160a060020a0316331461231e5760405160e560020a62461bcd028152600401610ed990613fec565b670de0b6b3a7640000606461233260025490565b61233d90600161403a565b6123479190614059565b6123519190614059565b81116123c85760405160e560020a62461bcd02815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f31250000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b6123da81670de0b6b3a764000061403a565b600a5550565b600554600160a060020a0316331461240d5760405160e560020a62461bcd028152600401610ed990613fec565b60005b8281101561247e57816022600086868581811061242f5761242f614164565b90506020020160208101906124449190613dd0565b600160a060020a031681526020810191909152604001600020805460ff1916911515919091179055806124768161417d565b915050612410565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516124b293929190614196565b60405180910390a1505050565b600654604080517fe7841ec00000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163e7841ec09160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146125525760405160e560020a62461bcd028152600401610ed990613fec565b506011805460ff19169055600190565b600554600160a060020a0316331461258f5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fe98030c700000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063e98030c7906024016112c5565b600554600160a060020a031633146126065760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166126855760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ed9565b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03831661276c5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0382166127eb5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a0383166128755760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a03821661289e5760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a03821660009081526010602052604090205460ff161580156128e05750600160a060020a03831660009081526010602052604090205460ff16155b6129555760405160e560020a62461bcd02815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527f72616e73666572696e6720746f6b656e730000000000000000000000000000006064820152608401610ed9565b8060000361296957611c5c83836000613541565b600e54610100900460ff16612a0657600160a060020a03831660009081526022602052604090205460ff16806129b75750600160a060020a03821660009081526022602052604090205460ff165b612a065760405160e560020a62461bcd02815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ed9565b600e5460ff1615612e3c57600554600160a060020a03848116911614801590612a3d5750600554600160a060020a03838116911614155b8015612a515750600160a060020a03821615155b8015612a685750600160a060020a03821661dead14155b8015612a7e575060055460a060020a900460ff16155b15612e3c5760115460ff1615612bc7577f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a031614158015612b0257507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031682600160a060020a031614155b15612bc757326000908152600f60205260409020544311612bb45760405160e560020a62461bcd02815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ed9565b326000908152600f602052604090204390555b600160a060020a03831660009081526024602052604090205460ff168015612c085750600160a060020a03821660009081526023602052604090205460ff16155b15612cf457600854811115612c885760405160e560020a62461bcd02815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ed9565b600a54612c94836116ce565b612c9e9083614097565b1115612cef5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b612e3c565b600160a060020a03821660009081526024602052604090205460ff168015612d355750600160a060020a03831660009081526023602052604090205460ff16155b15612db557600854811115612cef5760405160e560020a62461bcd02815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ed9565b600160a060020a03821660009081526023602052604090205460ff16612e3c57600a54612de1836116ce565b612deb9083614097565b1115612e3c5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b6000612e47306116ce565b60095490915081108015908190612e665750600e5462010000900460ff165b8015612e7c575060055460a060020a900460ff16155b8015612ea15750600160a060020a03851660009081526024602052604090205460ff16155b8015612ec65750600160a060020a03851660009081526022602052604090205460ff16155b8015612eeb5750600160a060020a03841660009081526022602052604090205460ff16155b15612f3b576005805474ff0000000000000000000000000000000000000000191660a060020a179055612f1c6136a8565b6005805474ff0000000000000000000000000000000000000000191690555b600554600160a060020a03861660009081526022602052604090205460ff60a060020a909204821615911680612f895750600160a060020a03851660009081526022602052604090205460ff165b15612f92575060005b600081156132575743600c546001612faa9190614097565b10158015612ff25750600160a060020a03861660009081526024602052604090205460ff1680612ff25750600160a060020a03871660009081526024602052604090205460ff165b1561309e5761300d60646130078760636138d8565b90613979565b9050606361301c82602161403a565b6130269190614059565b601c60008282546130379190614097565b909155506063905061304a82602161403a565b6130549190614059565b601a60008282546130659190614097565b909155506063905061307882602161403a565b6130829190614059565b601b60008282546130939190614097565b909155506132399050565b600160a060020a03861660009081526024602052604090205460ff1680156130c857506000601254115b1561315b576130e86103e8613007601254886138d890919063ffffffff16565b9050601254601354826130fb919061403a565b6131059190614059565b601a60008282546131169190614097565b909155505060125460155461312b908361403a565b6131359190614059565b601c60008282546131469190614097565b9091555050601254601454613078908361403a565b600160a060020a03871660009081526024602052604090205460ff16801561318557506000601654115b15613239576131a56103e8613007601654886138d890919063ffffffff16565b9050601654601754826131b8919061403a565b6131c29190614059565b601a60008282546131d39190614097565b90915550506016546019546131e8908361403a565b6131f29190614059565b601c60008282546132039190614097565b9091555050601654601854613218908361403a565b6132229190614059565b601b60008282546132339190614097565b90915550505b801561324a5761324a873083613541565b61325481866142a9565b94505b613262878787613541565b600654600160a060020a031663e30443bc8861327d816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b5050600654600160a060020a0316915063e30443bc9050876132f6816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561333a57600080fd5b505af115801561334e573d6000803e3d6000fd5b505060055460a060020a900460ff1615915050801561336f57506000601d54115b1561344f57601d546006546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063ffb2c479906024016060604051808303816000875af19250505080156133f7575060408051601f3d908101601f191682019092526133f491810190614136565b60015b1561344d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556134868282611840565b8015613505576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600160a060020a03831661356a5760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a0382166135935760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a038316600090815260208190526040902054818110156136255760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0380851660009081526020819052604080822085850390559185168152908120805484929061365c908490614097565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116c091815260200190565b60006136b3306116ce565b90506000601a54601b54601c546136ca9190614097565b6136d49190614097565b90508115806136e1575080155b156136ea575050565b6000600282601c54856136fd919061403a565b6137079190614059565b6137119190614059565b9050600061371f84836139bb565b9050303161372c826139fd565b60006137393031836139bb565b905060006137676002601c5461374f9190614059565b61375990886142a9565b601b546130079085906138d8565b905060006137956002601c5461377d9190614059565b61378790896142a9565b601a546130079086906138d8565b90506000816137a484866142a9565b6137ae91906142a9565b6000601c819055601b819055601a55905086158015906137ce5750600081115b15613821576137dd8782613bd9565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b600654604051600091600160a060020a03169084908381818185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b5050600754604051919250600160a060020a031690303190600081818185875af1925050503d80600081146138c4576040519150601f19603f3d011682016040523d82523d6000602084013e6138c9565b606091505b50505050505050505050505050565b6000826000036138ea57506000610ea6565b60006138f6838561403a565b9050826139038583614059565b146110355760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600061103583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ccc565b600061103583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d06565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3257613a32614164565b6020026020010190600160a060020a03169081600160a060020a0316815250507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015613ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad791906142c0565b81600181518110613aea57613aea614164565b6020026020010190600160a060020a03169081600160a060020a031681525050613b35307f0000000000000000000000000000000000000000000000000000000000000000846126ee565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152600160a060020a037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613ba39085906000908690309042906004016142dd565b600060405180830381600087803b158015613bbd57600080fd5b505af1158015613bd1573d6000803e3d6000fd5b505050505050565b613c04307f0000000000000000000000000000000000000000000000000000000000000000846126ee565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000000000000000000000000000000000000000000000600160a060020a03169063f305d71990839060c40160606040518083038185885af1158015613ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f39190614136565b60008183613cf05760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd8486614059565b95945050505050565b60008184841115613d2d5760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd84866142a9565b600060208083528351808285015260005b81811015613d6757858101830151858201604001528201613d4b565b81811115613d79576000604083870101525b50601f01601f1916929092016040019392505050565b600160a060020a03811681146113c457600080fd5b60008060408385031215613db757600080fd5b8235613dc281613d8f565b946020939093013593505050565b600060208284031215613de257600080fd5b813561103581613d8f565b600060208284031215613dff57600080fd5b5035919050565b60008060408385031215613e1957600080fd5b8235613e2481613d8f565b91506020830135613e3481613d8f565b809150509250929050565b600080600060608486031215613e5457600080fd5b8335613e5f81613d8f565b92506020840135613e6f81613d8f565b929592945050506040919091013590565b80151581146113c457600080fd5b60008060408385031215613ea157600080fd5b8235613eac81613d8f565b91506020830135613e3481613e80565b60008060408385031215613ecf57600080fd5b823591506020830135613e3481613d8f565b600080600060608486031215613ef657600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f1f57600080fd5b813561103581613e80565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b8760208083028501011115613f8e57600080fd5b60209283019550935050840135613fa481613e80565b809150509250925092565b600281046001821680613fc357607f821691505b602082108103613fe65760e060020a634e487b7102600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b600081600019048311821515161561405457614054614021565b500290565b6000826140795760e060020a634e487b7102600052601260045260246000fd5b500490565b60006020828403121561409057600080fd5b5051919050565b600082198211156140aa576140aa614021565b500190565b6000602082840312156140c157600080fd5b815161103581613e80565b600080600080600080600080610100898b0312156140e957600080fd5b88516140f481613d8f565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561414b57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b60006001820161418f5761418f614021565b5060010190565b6040808252810183905260008460608301825b868110156141d95782356141bc81613d8f565b600160a060020a03168252602092830192909101906001016141a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000828210156142bb576142bb614021565b500390565b6000602082840312156142d257600080fd5b815161103581613d8f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432d578451600160a060020a031683529383019391830191600101614308565b5050600160a060020a0396909616606085015250505060800152939250505056fea2646970667358221220850544e7686e09195b8d6725fee5b7d2d55e3001c4a7a20a8f42dc4eefd51aa564736f6c634300080d003360c06040523480156200001157600080fd5b5060006200002764010000000062000138810204565b60008054600160a060020a031916600160a060020a0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091018054600160a060020a03191673676495371d5107f870e0e7d5afb6fed91f236f211790558154620000f357620000f36200013c565b60009182526020909120015460038054600160a060020a031916600160a060020a03909216919091179055506104b0601155683635c9adc5dea0000060a0526200016b565b3390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60805160a05161217b620001a6600039600081816104ee0152610dcb01526000818161024b015281816112f60152611417015261217b6000f3fe6080604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900480639c53c0ca1161011f578063e30443bc116100b2578063e98030c711610081578063e98030c71461060b578063f2fde38b1461062b578063fd5908471461064b578063ffb2c4791461066b57600080fd5b8063e30443bc14610570578063e6f083f414610590578063e7841ec0146105d6578063e7f4d2c3146105eb57600080fd5b8063be10b614116100ee578063be10b614146104dc578063c0f306ef14610510578063cb83bcd614610530578063cc5489df1461055057600080fd5b80639c53c0ca14610459578063ab6ddfa814610479578063ad7a672f146104a6578063bc4c4b37146104bc57600080fd5b80634d6e5e02116101975780637bb7bed1116101665780637bb7bed1146103a05780638c503bf5146103c05780638da5cb5b1461042557806393fcfe611461044357600080fd5b80634d6e5e02146103085780634e7b827f146103355780636f2789ec14610375578063715018a61461038b57600080fd5b8063204f11a8116101d3578063204f11a814610285578063226cfa3d146102a55780633009a609146102d257806331e79db0146102e857600080fd5b806303c833021461020d57806309bbedde146102155780631694505e1461023957600080fd5b36610208576102066106a6565b005b600080fd5b6102066106a6565b34801561022157600080fd5b50600a545b6040519081526020015b60405180910390f35b34801561024557600080fd5b5061026d7f000000000000000000000000000000000000000000000000000000000000000081565b604051600160a060020a039091168152602001610230565b34801561029157600080fd5b506102266102a0366004611d43565b610954565b3480156102b157600080fd5b506102266102c0366004611d7c565b60106020526000908152604090205481565b3480156102de57600080fd5b50610226600e5481565b3480156102f457600080fd5b50610206610303366004611d7c565b610993565b34801561031457600080fd5b50610226610323366004611d7c565b60096020526000908152604090205481565b34801561034157600080fd5b50610365610350366004611d7c565b600f6020526000908152604090205460ff1681565b6040519015158152602001610230565b34801561038157600080fd5b5061022660115481565b34801561039757600080fd5b50610206610a37565b3480156103ac57600080fd5b5061026d6103bb366004611d99565b610abb565b3480156103cc57600080fd5b506103e06103db366004611db2565b610ae5565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610230565b34801561043157600080fd5b50600054600160a060020a031661026d565b34801561044f57600080fd5b5061022660045481565b34801561046557600080fd5b50610206610474366004611d7c565b610b55565b34801561048557600080fd5b50610226610494366004611d7c565b60076020526000908152604090205481565b3480156104b257600080fd5b5061022660085481565b3480156104c857600080fd5b506103656104d7366004611de5565b610b63565b3480156104e857600080fd5b506102267f000000000000000000000000000000000000000000000000000000000000000081565b34801561051c57600080fd5b5061020661052b366004611d7c565b610c54565b34801561053c57600080fd5b5061022661054b366004611d43565b610cef565b34801561055c57600080fd5b5061022661056b366004611d43565b610cfb565b34801561057c57600080fd5b5061020661058b366004611e13565b610d7c565b34801561059c57600080fd5b506102266105ab366004611d43565b600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b3480156105e257600080fd5b50600e54610226565b3480156105f757600080fd5b5060035461026d90600160a060020a031681565b34801561061757600080fd5b50610206610626366004611d99565b610e2d565b34801561063757600080fd5b50610206610646366004611d7c565b610fb7565b34801561065757600080fd5b506103e0610666366004611d43565b6110cb565b34801561067757600080fd5b5061068b610686366004611d99565b6111b6565b60408051938452602084019290925290820152606001610230565b6000600854116106b557600080fd5b6003546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a0823190602401602060405180830381865afa158015610717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073b9190611e3f565b600354909150610755903490600160a060020a03166112d3565b6003546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916107e7918491600160a060020a0316906370a0823190602401602060405180830381865afa1580156107bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e19190611e3f565b9061148e565b905080156108d05760085461083c90610811837001000000000000000000000000000000006114d0565b61081b9190611e71565b600354600160a060020a031660009081526001602052604090205490611571565b600354600160a060020a0316600090815260016020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a2600354600160a060020a03166000908152600960205260409020546108b49082611571565b600354600160a060020a03166000908152600960205260409020555b6002546108df90600190611e96565b600454146108fa576004546108f5906001611ead565b6108fd565b60005b60048190555060026004548154811061091857610918611ec5565b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555050565b600160a060020a03808316600090815260066020908152604080832093851683529290529081205461098a906107e18585610cfb565b90505b92915050565b600054600160a060020a031633146109c95760405160e560020a62461bcd0281526004016109c090611ede565b60405180910390fd5b600160a060020a0381166000908152600f60205260408120805460ff191660011790556109f79082906115d3565b610a008161166c565b604051600160a060020a038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b600054600160a060020a03163314610a645760405160e560020a62461bcd0281526004016109c090611ede565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60028181548110610acb57600080fd5b600091825260209091200154600160a060020a0316905081565b600080600080600080600080610afa600a5490565b8a10610b1f575060009650600019955085945086935083925082915081905080610b48565b6000610b2a8b6117b9565b9050610b36818b6110cb565b98509850985098509850985098509850505b9295985092959890939650565b610b5f33826117ec565b5050565b60008054600160a060020a03163314610b915760405160e560020a62461bcd0281526004016109c090611ede565b60008060005b600254811015610c4b57610bd28660028381548110610bb857610bb8611ec5565b600091825260209091200154600160a060020a03166117ec565b92508215610c3957600160a060020a038616600081815260106020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c2c9087815260200190565b60405180910390a3600191505b80610c4381611f13565b915050610b97565b50949350505050565b600054600160a060020a03163314610c815760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0381166000908152600f602052604090205460ff16610ca657600080fd5b600160a060020a0381166000818152600f6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b600061098a8383610954565b600160a060020a0380821660008181526005602090815260408083209487168352938152838220546007825284832054938352600190915292812054909270010000000000000000000000000000000092610d7292610d6d9291610d6791610d62916114d0565b611932565b90611942565b611980565b61098a9190611e71565b600054600160a060020a03163314610da95760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0382166000908152600f602052604090205460ff16610b5f577f00000000000000000000000000000000000000000000000000000000000000008110610e0957610dfa82826115d3565b610e048282611993565b610e1d565b610e148260006115d3565b610e1d8261166c565b610e28826001610b63565b505050565b600054600160a060020a03163314610e5a5760405160e560020a62461bcd0281526004016109c090611ede565b6104b08110158015610e6f5750620151808111155b610f0a5760405160e560020a62461bcd02815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e642032342060648201527f686f757273000000000000000000000000000000000000000000000000000000608482015260a4016109c0565b6011548103610f845760405160e560020a62461bcd02815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c756500000000000000000060648201526084016109c0565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b600054600160a060020a03163314610fe45760405160e560020a62461bcd0281526004016109c090611ede565b600160a060020a0381166110635760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c0565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b8160008080808080806110dd88611a5e565b965060001995506000871261113f57600e5487111561110b57600e54611104908890611aa3565b955061113f565b600e54600a546000911061112057600061112f565b600e54600a5461112f9161148e565b905061113b8882611942565b9650505b611149888a610954565b9450611155888a610cfb565b600160a060020a03891660009081526010602052604090205490945092508261117f57600061118d565b60115461118d908490611571565b915042821161119d5760006111a7565b6111a7824261148e565b90509295985092959890939650565b600a54600090819081908082036111d8575050600e54600092508291506112cc565b600e546000805a90506000805b89841080156111f357508582105b156112bb578461120281611f13565b600a549096508610905061121557600094505b6000600a600001868154811061122d5761122d611ec5565b6000918252602080832090910154600160a060020a0316808352601090915260409091205490915061125e90611ae0565b156112815761126e816001610b63565b15611281578161127d81611f13565b9250505b8261128b81611f13565b93505060005a9050808511156112b2576112af6112a8868361148e565b8790611571565b95505b93506111e59050565b600e85905590975095509193505050505b9193909250565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000600160a060020a031663ad5c46486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190611f2c565b816000815181106113a5576113a5611ec5565b6020026020010190600160a060020a03169081600160a060020a03168152505081816001815181106113d9576113d9611ec5565b600160a060020a0392831660209182029290920101526040517fb6f9de950000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061145790600090869030904290600401611f49565b6000604051808303818588803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b5050505050505050565b600061098a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b07565b6000826000036114e25750600061098d565b60006114ee8385611fb3565b9050826114fb8583611e71565b1461098a5760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016109c0565b60008061157e8385611ead565b90508381101561098a5760405160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109c0565b600160a060020a03821660009081526007602052604090208054908290558082111561162f576000611605838361148e565b90506116118482611b44565b80600860008282546116239190611ead565b90915550610e28915050565b80821015610e28576000611643828461148e565b905061164f8482611c4d565b80600860008282546116619190611e96565b909155505050505050565b600160a060020a0381166000908152600d602052604090205460ff1661168f5750565b600160a060020a0381166000908152600d60209081526040808320805460ff19169055600b8252808320839055600c909152812054600a549091906116d690600190611e96565b90506000600a60000182815481106116f0576116f0611ec5565b6000918252602080832090910154600160a060020a03908116808452600c90925260408084208790559087168352822091909155600a805491925082918590811061173d5761173d611ec5565b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600a80548061178457611784611fd2565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff1916905501905550505050565b6000600a60000182815481106117d1576117d1611ec5565b600091825260209091200154600160a060020a031692915050565b6000806117f98484610954565b9050801561192857600160a060020a038085166000908152600660209081526040808320938716835292905220546118319082611571565b600160a060020a038086166000818152600660209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061188c9084815260200190565b60405180910390a26040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156118fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119209190611feb565b50905061098d565b5060009392505050565b6000818181121561098d57600080fd5b60008061194f8385612008565b9050600083121580156119625750838112155b80611977575060008312801561197757508381125b61098a57600080fd5b60008082121561198f57600080fd5b5090565b600160a060020a0382166000908152600d602052604090205460ff16156119d157600160a060020a03919091166000908152600b6020526040902055565b600160a060020a0382166000818152600d60209081526040808320805460ff19166001908117909155600b8352818420869055600a8054600c909452918420839055820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff191690911790555050565b600160a060020a0381166000908152600d602052604081205460ff16611a875750600019919050565b50600160a060020a03166000908152600c602052604090205490565b600080611ab0838561207c565b905060008312158015611ac35750838113155b806119775750600083128015611977575083811361098a57600080fd5b600042821115611af257506000919050565b601154611aff428461148e565b101592915050565b60008184841115611b2e5760405160e560020a62461bcd0281526004016109c091906120f0565b506000611b3b8486611e96565b95945050505050565b60005b600254811015610e2857611bef611b9d610d62846001600060028781548110611b7257611b72611ec5565b6000918252602080832090910154600160a060020a03168352820192909252604001902054906114d0565b6005600060028581548110611bb457611bb4611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093891682529290925290205490611aa3565b6005600060028481548110611c0657611c06611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093881682529290925290205580611c4581611f13565b915050611b47565b60005b600254811015610e2857611ccd611c7b610d62846001600060028781548110611b7257611b72611ec5565b6005600060028581548110611c9257611c92611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093891682529290925290205490611942565b6005600060028481548110611ce457611ce4611ec5565b6000918252602080832090910154600160a060020a039081168452838201949094526040928301822093881682529290925290205580611d2381611f13565b915050611c50565b600160a060020a0381168114611d4057600080fd5b50565b60008060408385031215611d5657600080fd5b8235611d6181611d2b565b91506020830135611d7181611d2b565b809150509250929050565b600060208284031215611d8e57600080fd5b813561098a81611d2b565b600060208284031215611dab57600080fd5b5035919050565b60008060408385031215611dc557600080fd5b823591506020830135611d7181611d2b565b8015158114611d4057600080fd5b60008060408385031215611df857600080fd5b8235611e0381611d2b565b91506020830135611d7181611dd7565b60008060408385031215611e2657600080fd5b8235611e3181611d2b565b946020939093013593505050565b600060208284031215611e5157600080fd5b5051919050565b60e060020a634e487b7102600052601160045260246000fd5b600082611e915760e060020a634e487b7102600052601260045260246000fd5b500490565b600082821015611ea857611ea8611e58565b500390565b60008219821115611ec057611ec0611e58565b500190565b60e060020a634e487b7102600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611f2557611f25611e58565b5060010190565b600060208284031215611f3e57600080fd5b815161098a81611d2b565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611f93578451600160a060020a031683529383019391830191600101611f6e565b5050600160a060020a039690961660408501525050506060015292915050565b6000816000190483118215151615611fcd57611fcd611e58565b500290565b60e060020a634e487b7102600052603160045260246000fd5b600060208284031215611ffd57600080fd5b815161098a81611dd7565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561204257612042611e58565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561207657612076611e58565b50500190565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156120b6576120b6611e58565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156120ea576120ea611e58565b50500390565b600060208083528351808285015260005b8181101561211d57858101830151858201604001528201612101565b8181111561212f576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212208871d7b8a628308d4c21e59b32d2760723c81b07f52e669b73a11490b012dfc464736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061047b5760003560e060020a900480638095d5641161024e578063c492f0461161013d578063e98030c7116100ba578063f54afa781161007e578063f54afa7814610d87578063f8b45b0514610d9d578063fb002c9714610db3578063fd361d0e14610dc9578063fd72e22a14610de357600080fd5b8063e98030c714610d05578063ee40166e14610d25578063ee44b44e14610d3b578063efcc1b2f14610d51578063f2fde38b14610d6757600080fd5b8063d0a3981411610101578063d0a3981414610c69578063dd62ed3e14610c7f578063e2f4560514610cc5578063e7841ec014610cdb578063e884f26014610cf057600080fd5b8063c492f04614610bed578063c876d0b914610c0d578063c8c8ebe414610c27578063ccb6135814610c3d578063ccd146b214610c5357600080fd5b8063a26579ad116101cb578063bbc0c7421161018f578063bbc0c74214610b4e578063c024666814610b6d578063c0f306ef14610b8d578063c17b5b8c14610bad578063c18bc19514610bcd57600080fd5b8063a26579ad14610ab3578063a457c2d714610ac8578063a9059cbb14610ae8578063b62496f514610b08578063b9e9370014610b3857600080fd5b806392b596261161021257806392b5962614610a3257806395d89b4114610a525780639a36f93214610a675780639a7a23d614610a7d5780639c1b8af514610a9d57600080fd5b80638095d5641461099f578063871c128d146109bf5780638a8c523c146109df5780638da5cb5b146109f4578063924de9b714610a1257600080fd5b80634a62bb651161036a57806370a08231116102e7578063751039fc116102ab578063751039fc1461092a5780637571336a1461093f578063763cef491461095f578063783102eb146109745780637fa787ba1461098a57600080fd5b806370a08231146108b5578063712c2985146108d5578063715018a6146108ea57806371778e7d146108ff5780637506cbd81461091457600080fd5b8063632459f01161032e578063632459f0146107db57806364b0f653146108405780636843cd84146108555780636ddd171314610875578063700bb1911461089557600080fd5b80634a62bb651461073d5780634af6f7ee146107575780634e71d92d1461076d5780634fbee193146107825780635645cd86146107bb57600080fd5b8063203e727e116103f857806330d5d18d116103bc57806330d5d18d1461068d578063313ce567146106ad57806331e79db0146106c957806339509351146106e957806349bd5a5e1461070957600080fd5b8063203e727e146105eb578063204f11a81461060d57806323b872dd1461062d5780632c1f52161461064d5780632d5a5d341461066d57600080fd5b806310d5de531161043f57806310d5de531461052e5780631694505e1461055e57806318160ddd146105aa5780631a8145bb146105bf5780631fc851bd146105d557600080fd5b8063058054c91461048757806306fdde03146104b0578063095ea7b3146104d2578063099d0d30146105025780630f4432e31461051857600080fd5b3661048257005b600080fd5b34801561049357600080fd5b5061049d601e5481565b6040519081526020015b60405180910390f35b3480156104bc57600080fd5b506104c5610e03565b6040516104a79190613d3a565b3480156104de57600080fd5b506104f26104ed366004613da4565b610e95565b60405190151581526020016104a7565b34801561050e57600080fd5b5061049d60155481565b34801561052457600080fd5b5061049d600b5481565b34801561053a57600080fd5b506104f2610549366004613dd0565b60236020526000908152604090205460ff1681565b34801561056a57600080fd5b506105927f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b604051600160a060020a0390911681526020016104a7565b3480156105b657600080fd5b5060025461049d565b3480156105cb57600080fd5b5061049d601c5481565b3480156105e157600080fd5b5061049d600d5481565b3480156105f757600080fd5b5061060b610606366004613ded565b610eac565b005b34801561061957600080fd5b5061049d610628366004613e06565b610fa5565b34801561063957600080fd5b506104f2610648366004613e3f565b61103c565b34801561065957600080fd5b5060065461059290600160a060020a031681565b34801561067957600080fd5b5061060b610688366004613e8e565b6110fe565b34801561069957600080fd5b5061060b6106a8366004613dd0565b611156565b3480156106b957600080fd5b50604051601281526020016104a7565b3480156106d557600080fd5b5061060b6106e4366004613dd0565b611251565b3480156106f557600080fd5b506104f2610704366004613da4565b6112fa565b34801561071557600080fd5b506105927f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee981565b34801561074957600080fd5b50600e546104f29060ff1681565b34801561076357600080fd5b5061049d60175481565b34801561077957600080fd5b5061060b611336565b34801561078e57600080fd5b506104f261079d366004613dd0565b600160a060020a031660009081526022602052604090205460ff1690565b3480156107c757600080fd5b5061049d6107d6366004613dd0565b6113c7565b3480156107e757600080fd5b506107fb6107f6366004613ebc565b611450565b60408051600160a060020a0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104a7565b34801561084c57600080fd5b5061049d61150d565b34801561086157600080fd5b5061049d610870366004613dd0565b611599565b34801561088157600080fd5b50600e546104f29062010000900460ff1681565b3480156108a157600080fd5b5061060b6108b0366004613ded565b6115e5565b3480156108c157600080fd5b5061049d6108d0366004613dd0565b6116ce565b3480156108e157600080fd5b5061049d6116e9565b3480156108f657600080fd5b5061060b61170d565b34801561090b57600080fd5b5061049d611791565b34801561092057600080fd5b5061049d60145481565b34801561093657600080fd5b506104f26117f4565b34801561094b57600080fd5b5061060b61095a366004613e8e565b611840565b34801561096b57600080fd5b5061060b6118cd565b34801561098057600080fd5b5061049d60215481565b34801561099657600080fd5b5061060b611aea565b3480156109ab57600080fd5b5061060b6109ba366004613ee1565b611bb3565b3480156109cb57600080fd5b5061060b6109da366004613ded565b611c61565b3480156109eb57600080fd5b5061060b611dc6565b348015610a0057600080fd5b50600554600160a060020a0316610592565b348015610a1e57600080fd5b5061060b610a2d366004613f0d565b611e65565b348015610a3e57600080fd5b506107fb610a4d366004613e06565b611eae565b348015610a5e57600080fd5b506104c5611f11565b348015610a7357600080fd5b5061049d6103e881565b348015610a8957600080fd5b5061060b610a98366004613e8e565b611f20565b348015610aa957600080fd5b5061049d601d5481565b348015610abf57600080fd5b5061049d612027565b348015610ad457600080fd5b506104f2610ae3366004613da4565b61208a565b348015610af457600080fd5b506104f2610b03366004613da4565b61213e565b348015610b1457600080fd5b506104f2610b23366004613dd0565b60246020526000908152604090205460ff1681565b348015610b4457600080fd5b5061049d60165481565b348015610b5a57600080fd5b50600e546104f290610100900460ff1681565b348015610b7957600080fd5b5061060b610b88366004613e8e565b61214b565b348015610b9957600080fd5b5061060b610ba8366004613dd0565b6121d0565b348015610bb957600080fd5b5061060b610bc8366004613ee1565b612248565b348015610bd957600080fd5b5061060b610be8366004613ded565b6122f1565b348015610bf957600080fd5b5061060b610c08366004613f2a565b6123e0565b348015610c1957600080fd5b506011546104f29060ff1681565b348015610c3357600080fd5b5061049d60085481565b348015610c4957600080fd5b5061049d60195481565b348015610c5f57600080fd5b5061049d60135481565b348015610c7557600080fd5b5061049d60125481565b348015610c8b57600080fd5b5061049d610c9a366004613e06565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b348015610cd157600080fd5b5061049d60095481565b348015610ce757600080fd5b5061049d6124bf565b348015610cfc57600080fd5b506104f2612522565b348015610d1157600080fd5b5061060b610d20366004613ded565b612562565b348015610d3157600080fd5b5061049d600c5481565b348015610d4757600080fd5b5061049d601f5481565b348015610d5d57600080fd5b5061049d60185481565b348015610d7357600080fd5b5061060b610d82366004613dd0565b6125d9565b348015610d9357600080fd5b5061049d601a5481565b348015610da957600080fd5b5061049d600a5481565b348015610dbf57600080fd5b5061049d601b5481565b348015610dd557600080fd5b506020546104f29060ff1681565b348015610def57600080fd5b5060075461059290600160a060020a031681565b606060038054610e1290613faf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e90613faf565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b5050505050905090565b6000610ea23384846126ee565b5060015b92915050565b600554600160a060020a03163314610ee25760405160e560020a62461bcd028152600401610ed990613fec565b60405180910390fd5b670de0b6b3a76400006103e8610ef760025490565b610f0290600161403a565b610f0c9190614059565b610f169190614059565b8111610f8d5760405160e560020a62461bcd02815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e312500000000000000000000000000000000006064820152608401610ed9565b610f9f81670de0b6b3a764000061403a565b60085550565b6006546040517f204f11a8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611035919061407e565b9392505050565b600061104984848461284c565b600160a060020a0384166000908152600160209081526040808320338452909152902054828110156110e65760405160e560020a62461bcd02815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610ed9565b6110f385338584036126ee565b506001949350505050565b600554600160a060020a0316331461112b5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a03919091166000908152601060205260409020805460ff1916911515919091179055565b600554600160a060020a031633146111835760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166111dc5760405160e560020a62461bcd02815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ed9565b6111e781600161214b565b600754604051600160a060020a03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a36007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a0316331461127e5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b5050505050565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610ea2918590611331908690614097565b6126ee565b6006546040517fbc4c4b3700000000000000000000000000000000000000000000000000000000815233600482015260006024820152600160a060020a039091169063bc4c4b37906044016020604051808303816000875af11580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c491906140af565b50565b6006546040517f4d6e5e02000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061407e565b6006546040517f8c503bf500000000000000000000000000000000000000000000000000000000815260048101849052600160a060020a0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f091906140cc565b975097509750975097509750975097509295985092959890939650565b600654604080517f09bbedde0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a0316916309bbedde9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611594919061407e565b905090565b6006546040517fab6ddfa8000000000000000000000000000000000000000000000000000000008152600160a060020a038381166004830152600092169063ab6ddfa89060240161140f565b6006546040517fffb2c4790000000000000000000000000000000000000000000000000000000081526004810183905260009182918291600160a060020a03169063ffb2c479906024016060604051808303816000875af115801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190614136565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b600160a060020a031660009081526020819052604090205490565b60205460009060ff161561170757601f54601e546115949190614097565b50600090565b600554600160a060020a0316331461173a5760405160e560020a62461bcd028152600401610ed990613fec565b600554604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b600654604080517fad7a672f0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163ad7a672f9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146118245760405160e560020a62461bcd028152600401610ed990613fec565b50600e805460ff19908116909155601180549091169055600190565b600554600160a060020a0316331461186d5760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b600554600160a060020a031633146118fa5760405160e560020a62461bcd028152600401610ed990613fec565b6119026116e9565b4210158015611918575060006119166116e9565b115b6119675760405160e560020a62461bcd02815260206004820152601660248201527f4d757374207265717565737420616e6420776169742e000000000000000000006044820152606401610ed9565b6000601e8190556020805460ff191690556021546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152606491907f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a0316906370a0823190602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061407e565b611a2a919061403a565b611a349190614059565b60006021556040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a03169063a9059cbb906044016020604051808303816000875af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906140af565b5050565b600554600160a060020a03163314611b175760405160e560020a62461bcd028152600401610ed990613fec565b60405160009033903031908381818185875af1925050503d8060008114611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b50509050806113c45760405160e560020a62461bcd02815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610ed9565b600554600160a060020a03163314611be05760405160e560020a62461bcd028152600401610ed990613fec565b60188390556017829055601981905580611bfa8385614097565b611c049190614097565b601681905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b505050565b600554600160a060020a03163314611c8e5760405160e560020a62461bcd028152600401610ed990613fec565b62030d408110158015611ca457506207a1208111155b611d195760405160e560020a62461bcd02815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527f6e203230302c30303020616e64203530302c30303000000000000000000000006064820152608401610ed9565b601d548103611d935760405160e560020a62461bcd02815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201527f6f2073616d652076616c756500000000000000000000000000000000000000006064820152608401610ed9565b601d5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601d55565b600554600160a060020a03163314611df35760405160e560020a62461bcd028152600401610ed990613fec565b600e54610100900460ff1615611e4e5760405160e560020a62461bcd02815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ed9565b600e805462ffff0019166201010017905543600c55565b600554600160a060020a03163314611e925760405160e560020a62461bcd028152600401610ed990613fec565b600e8054911515620100000262ff000019909216919091179055565b6006546040517ffd590847000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114ae565b606060048054610e1290613faf565b600554600160a060020a03163314611f4d5760405160e560020a62461bcd028152600401610ed990613fec565b7f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a031682600160a060020a03160361201d5760405160e560020a62461bcd02815260206004820152604160248201527f54686520556e695377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b65725061697260648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a401610ed9565b611ae68282613458565b600654604080517f6f2789ec0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691636f2789ec9160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b336000908152600160209081526040808320600160a060020a0386168452909152812054828110156121275760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610ed9565b61213433858584036126ee565b5060019392505050565b6000610ea233848461284c565b600554600160a060020a031633146121785760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016118c1565b600554600160a060020a031633146121fd5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fc0f306ef000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301529091169063c0f306ef906024016112c5565b600554600160a060020a031633146122755760405160e560020a62461bcd028152600401610ed990613fec565b6014839055601382905560158190558061228f8385614097565b6122999190614097565b601281905560641015611c5c5760405160e560020a62461bcd02815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ed9565b600554600160a060020a0316331461231e5760405160e560020a62461bcd028152600401610ed990613fec565b670de0b6b3a7640000606461233260025490565b61233d90600161403a565b6123479190614059565b6123519190614059565b81116123c85760405160e560020a62461bcd02815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f31250000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b6123da81670de0b6b3a764000061403a565b600a5550565b600554600160a060020a0316331461240d5760405160e560020a62461bcd028152600401610ed990613fec565b60005b8281101561247e57816022600086868581811061242f5761242f614164565b90506020020160208101906124449190613dd0565b600160a060020a031681526020810191909152604001600020805460ff1916911515919091179055806124768161417d565b915050612410565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516124b293929190614196565b60405180910390a1505050565b600654604080517fe7841ec00000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163e7841ec09160048083019260209291908290030181865afa158015611570573d6000803e3d6000fd5b600554600090600160a060020a031633146125525760405160e560020a62461bcd028152600401610ed990613fec565b506011805460ff19169055600190565b600554600160a060020a0316331461258f5760405160e560020a62461bcd028152600401610ed990613fec565b6006546040517fe98030c700000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063e98030c7906024016112c5565b600554600160a060020a031633146126065760405160e560020a62461bcd028152600401610ed990613fec565b600160a060020a0381166126855760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ed9565b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03831661276c5760405160e560020a62461bcd028152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0382166127eb5760405160e560020a62461bcd02815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600160a060020a0383166128755760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a03821661289e5760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a03821660009081526010602052604090205460ff161580156128e05750600160a060020a03831660009081526010602052604090205460ff16155b6129555760405160e560020a62461bcd02815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527f72616e73666572696e6720746f6b656e730000000000000000000000000000006064820152608401610ed9565b8060000361296957611c5c83836000613541565b600e54610100900460ff16612a0657600160a060020a03831660009081526022602052604090205460ff16806129b75750600160a060020a03821660009081526022602052604090205460ff165b612a065760405160e560020a62461bcd02815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ed9565b600e5460ff1615612e3c57600554600160a060020a03848116911614801590612a3d5750600554600160a060020a03838116911614155b8015612a515750600160a060020a03821615155b8015612a685750600160a060020a03821661dead14155b8015612a7e575060055460a060020a900460ff16155b15612e3c5760115460ff1615612bc7577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a031682600160a060020a031614158015612b0257507f000000000000000000000000f33a0c437c28c4d513d2526a4522926431124ee9600160a060020a031682600160a060020a031614155b15612bc757326000908152600f60205260409020544311612bb45760405160e560020a62461bcd02815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60648201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000608482015260a401610ed9565b326000908152600f602052604090204390555b600160a060020a03831660009081526024602052604090205460ff168015612c085750600160a060020a03821660009081526023602052604090205460ff16155b15612cf457600854811115612c885760405160e560020a62461bcd02815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e00000000000000000000006064820152608401610ed9565b600a54612c94836116ce565b612c9e9083614097565b1115612cef5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b612e3c565b600160a060020a03821660009081526024602052604090205460ff168015612d355750600160a060020a03831660009081526023602052604090205460ff16155b15612db557600854811115612cef5760405160e560020a62461bcd02815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e000000000000000000006064820152608401610ed9565b600160a060020a03821660009081526023602052604090205460ff16612e3c57600a54612de1836116ce565b612deb9083614097565b1115612e3c5760405160e560020a62461bcd02815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ed9565b6000612e47306116ce565b60095490915081108015908190612e665750600e5462010000900460ff165b8015612e7c575060055460a060020a900460ff16155b8015612ea15750600160a060020a03851660009081526024602052604090205460ff16155b8015612ec65750600160a060020a03851660009081526022602052604090205460ff16155b8015612eeb5750600160a060020a03841660009081526022602052604090205460ff16155b15612f3b576005805474ff0000000000000000000000000000000000000000191660a060020a179055612f1c6136a8565b6005805474ff0000000000000000000000000000000000000000191690555b600554600160a060020a03861660009081526022602052604090205460ff60a060020a909204821615911680612f895750600160a060020a03851660009081526022602052604090205460ff165b15612f92575060005b600081156132575743600c546001612faa9190614097565b10158015612ff25750600160a060020a03861660009081526024602052604090205460ff1680612ff25750600160a060020a03871660009081526024602052604090205460ff165b1561309e5761300d60646130078760636138d8565b90613979565b9050606361301c82602161403a565b6130269190614059565b601c60008282546130379190614097565b909155506063905061304a82602161403a565b6130549190614059565b601a60008282546130659190614097565b909155506063905061307882602161403a565b6130829190614059565b601b60008282546130939190614097565b909155506132399050565b600160a060020a03861660009081526024602052604090205460ff1680156130c857506000601254115b1561315b576130e86103e8613007601254886138d890919063ffffffff16565b9050601254601354826130fb919061403a565b6131059190614059565b601a60008282546131169190614097565b909155505060125460155461312b908361403a565b6131359190614059565b601c60008282546131469190614097565b9091555050601254601454613078908361403a565b600160a060020a03871660009081526024602052604090205460ff16801561318557506000601654115b15613239576131a56103e8613007601654886138d890919063ffffffff16565b9050601654601754826131b8919061403a565b6131c29190614059565b601a60008282546131d39190614097565b90915550506016546019546131e8908361403a565b6131f29190614059565b601c60008282546132039190614097565b9091555050601654601854613218908361403a565b6132229190614059565b601b60008282546132339190614097565b90915550505b801561324a5761324a873083613541565b61325481866142a9565b94505b613262878787613541565b600654600160a060020a031663e30443bc8861327d816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1580156132c157600080fd5b505af11580156132d5573d6000803e3d6000fd5b5050600654600160a060020a0316915063e30443bc9050876132f6816116ce565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15801561333a57600080fd5b505af115801561334e573d6000803e3d6000fd5b505060055460a060020a900460ff1615915050801561336f57506000601d54115b1561344f57601d546006546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063ffb2c479906024016060604051808303816000875af19250505080156133f7575060408051601f3d908101601f191682019092526133f491810190614136565b60015b1561344d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600160a060020a0382166000908152602460205260409020805460ff19168215151790556134868282611840565b8015613505576006546040517f31e79db0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152909116906331e79db090602401600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050505b60405181151590600160a060020a038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600160a060020a03831661356a5760405160e560020a62461bcd028152600401610ed9906141ef565b600160a060020a0382166135935760405160e560020a62461bcd028152600401610ed99061424c565b600160a060020a038316600090815260208190526040902054818110156136255760405160e560020a62461bcd02815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610ed9565b600160a060020a0380851660009081526020819052604080822085850390559185168152908120805484929061365c908490614097565b9250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116c091815260200190565b60006136b3306116ce565b90506000601a54601b54601c546136ca9190614097565b6136d49190614097565b90508115806136e1575080155b156136ea575050565b6000600282601c54856136fd919061403a565b6137079190614059565b6137119190614059565b9050600061371f84836139bb565b9050303161372c826139fd565b60006137393031836139bb565b905060006137676002601c5461374f9190614059565b61375990886142a9565b601b546130079085906138d8565b905060006137956002601c5461377d9190614059565b61378790896142a9565b601a546130079086906138d8565b90506000816137a484866142a9565b6137ae91906142a9565b6000601c819055601b819055601a55905086158015906137ce5750600081115b15613821576137dd8782613bd9565b601c54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b600654604051600091600160a060020a03169084908381818185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b5050600754604051919250600160a060020a031690303190600081818185875af1925050503d80600081146138c4576040519150601f19603f3d011682016040523d82523d6000602084013e6138c9565b606091505b50505050505050505050505050565b6000826000036138ea57506000610ea6565b60006138f6838561403a565b9050826139038583614059565b146110355760405160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610ed9565b600061103583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ccc565b600061103583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d06565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a3257613a32614164565b6020026020010190600160a060020a03169081600160a060020a0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015613ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad791906142c0565b81600181518110613aea57613aea614164565b6020026020010190600160a060020a03169081600160a060020a031681525050613b35307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126ee565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152600160a060020a037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613ba39085906000908690309042906004016142dd565b600060405180830381600087803b158015613bbd57600080fd5b505af1158015613bd1573d6000803e3d6000fd5b505050505050565b613c04307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846126ee565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600160a060020a03169063f305d71990839060c40160606040518083038185885af1158015613ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112f39190614136565b60008183613cf05760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd8486614059565b95945050505050565b60008184841115613d2d5760405160e560020a62461bcd028152600401610ed99190613d3a565b506000613cfd84866142a9565b600060208083528351808285015260005b81811015613d6757858101830151858201604001528201613d4b565b81811115613d79576000604083870101525b50601f01601f1916929092016040019392505050565b600160a060020a03811681146113c457600080fd5b60008060408385031215613db757600080fd5b8235613dc281613d8f565b946020939093013593505050565b600060208284031215613de257600080fd5b813561103581613d8f565b600060208284031215613dff57600080fd5b5035919050565b60008060408385031215613e1957600080fd5b8235613e2481613d8f565b91506020830135613e3481613d8f565b809150509250929050565b600080600060608486031215613e5457600080fd5b8335613e5f81613d8f565b92506020840135613e6f81613d8f565b929592945050506040919091013590565b80151581146113c457600080fd5b60008060408385031215613ea157600080fd5b8235613eac81613d8f565b91506020830135613e3481613e80565b60008060408385031215613ecf57600080fd5b823591506020830135613e3481613d8f565b600080600060608486031215613ef657600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f1f57600080fd5b813561103581613e80565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b8760208083028501011115613f8e57600080fd5b60209283019550935050840135613fa481613e80565b809150509250925092565b600281046001821680613fc357607f821691505b602082108103613fe65760e060020a634e487b7102600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b600081600019048311821515161561405457614054614021565b500290565b6000826140795760e060020a634e487b7102600052601260045260246000fd5b500490565b60006020828403121561409057600080fd5b5051919050565b600082198211156140aa576140aa614021565b500190565b6000602082840312156140c157600080fd5b815161103581613e80565b600080600080600080600080610100898b0312156140e957600080fd5b88516140f481613d8f565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561414b57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b60006001820161418f5761418f614021565b5060010190565b6040808252810183905260008460608301825b868110156141d95782356141bc81613d8f565b600160a060020a03168252602092830192909101906001016141a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000828210156142bb576142bb614021565b500390565b6000602082840312156142d257600080fd5b815161103581613d8f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561432d578451600160a060020a031683529383019391830191600101614308565b5050600160a060020a0396909616606085015250505060800152939250505056fea2646970667358221220850544e7686e09195b8d6725fee5b7d2d55e3001c4a7a20a8f42dc4eefd51aa564736f6c634300080d0033

Deployed Bytecode Sourcemap

41638:21846:0:-:0;;;;;;;;;;-1:-1:-1;;;41638:21846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43259:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;43259:41:0;;;;;;;;4170:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5084:169::-;;;;;;;;;;-1:-1:-1;5084:169:0;;;;;:::i;:::-;;:::i;:::-;;;1442:14:1;;1435:22;1417:41;;1405:2;1390:18;5084:169:0;1277:187:1;42896:31:0;;;;;;;;;;;;;;;;42059:39;;;;;;;;;;;;;;;;43589:64;;;;;;;;;;-1:-1:-1;43589:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41714:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1912:55:1;;;1894:74;;1882:2;1867:18;41714:51:0;1721:253:1;4491:108:0;;;;;;;;;;-1:-1:-1;4579:12:0;;4491:108;;43169:33;;;;;;;;;;;;;;;;42221;;;;;;;;;;;;;;;;48653:233;;;;;;;;;;-1:-1:-1;48653:233:0;;;;;:::i;:::-;;:::i;:::-;;52576:183;;;;;;;;;;-1:-1:-1;52576:183:0;;;;;:::i;:::-;;:::i;5261:492::-;;;;;;;;;;-1:-1:-1;5261:492:0;;;;;:::i;:::-;;:::i;41849:38::-;;;;;;;;;;-1:-1:-1;41849:38:0;;;;-1:-1:-1;;;;;41849:38:0;;;48309:135;;;;;;;;;;-1:-1:-1;48309:135:0;;;;;:::i;:::-;;:::i;51254:349::-;;;;;;;;;;-1:-1:-1;51254:349:0;;;;;:::i;:::-;;:::i;4390:93::-;;;;;;;;;;-1:-1:-1;4390:93:0;;4473:2;3933:36:1;;3921:2;3906:18;4390:93:0;3791:184:1;47662:130:0;;;;;;;;;;-1:-1:-1;47662:130:0;;;;;:::i;:::-;;:::i;5761:215::-;;;;;;;;;;-1:-1:-1;5761:215:0;;;;;:::i;:::-;;:::i;41772:38::-;;;;;;;;;;;;;;;42330:33;;;;;;;;;;-1:-1:-1;42330:33:0;;;;;;;;42974:28;;;;;;;;;;;;;;;;53896:97;;;;;;;;;;;;;:::i;52441:127::-;;;;;;;;;;-1:-1:-1;52441:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;52532:28:0;52508:4;52532:28;;;:19;:28;;;;;;;;;52441:127;52262:171;;;;;;;;;;-1:-1:-1;52262:171:0;;;;;:::i;:::-;;:::i;53265:359::-;;;;;;;;;;-1:-1:-1;53265:359:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4888:55:1;;;4870:74;;4975:2;4960:18;;4953:34;;;;5003:18;;;4996:34;;;;5061:2;5046:18;;5039:34;;;;5104:3;5089:19;;5082:35;5148:3;5133:19;;5126:35;5192:3;5177:19;;5170:35;5236:3;5221:19;;5214:35;4857:3;4842:19;53265:359:0;4531:724:1;54135:141:0;;;;;;;;;;;;;:::i;52764:136::-;;;;;;;;;;-1:-1:-1;52764:136:0;;;;;:::i;:::-;;:::i;42410:31::-;;;;;;;;;;-1:-1:-1;42410:31:0;;;;;;;;;;;53629:259;;;;;;;;;;-1:-1:-1;53629:259:0;;;;;:::i;:::-;;:::i;4607:127::-;;;;;;;;;;-1:-1:-1;4607:127:0;;;;;:::i;:::-;;:::i;62684:281::-;;;;;;;;;;;;;:::i;16351:148::-;;;;;;;;;;;;;:::i;54288:119::-;;;;;;;;;;;;;:::i;42857:32::-;;;;;;;;;;;;;;;;54463:159;;;;;;;;;;;;;:::i;49930:202::-;;;;;;;;;;-1:-1:-1;49930:202:0;;;;;:::i;:::-;;:::i;62973:501::-;;;;;;;;;;;;;:::i;43406:31::-;;;;;;;;;;;;;;;;62479:191;;;;;;;;;;;;;:::i;49121:390::-;;;;;;;;;;-1:-1:-1;49121:390:0;;;;;:::i;:::-;;:::i;51611:395::-;;;;;;;;;;-1:-1:-1;51611:395:0;;;;;:::i;:::-;;:::i;48081:218::-;;;;;;;;;;;;;:::i;15709:79::-;;;;;;;;;;-1:-1:-1;15774:6:0;;-1:-1:-1;;;;;15774:6:0;15709:79;;48544:101;;;;;;;;;;-1:-1:-1;48544:101:0;;;;;:::i;:::-;;:::i;52908:352::-;;;;;;;;;;-1:-1:-1;52908:352:0;;;;;:::i;:::-;;:::i;4278:104::-;;;;;;;;;;;;;:::i;42736:41::-;;;;;;;;;;;;42773:4;42736:41;;50646:254;;;;;;;;;;-1:-1:-1;50646:254:0;;;;;:::i;:::-;;:::i;43215:35::-;;;;;;;;;;;;;;;;52146:108;;;;;;;;;;;;;:::i;5984:413::-;;;;;;;;;;-1:-1:-1;5984:413:0;;;;;:::i;:::-;;:::i;4742:175::-;;;;;;;;;;-1:-1:-1;4742:175:0;;;;;:::i;:::-;;:::i;43811:58::-;;;;;;;;;;-1:-1:-1;43811:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42940:27;;;;;;;;;;;;;;;;42370:33;;;;;;;;;;-1:-1:-1;42370:33:0;;;;;;;;;;;50140:184;;;;;;;;;;-1:-1:-1;50140:184:0;;;;;:::i;:::-;;:::i;47897:126::-;;;;;;;;;;-1:-1:-1;47897:126:0;;;;;:::i;:::-;;:::i;49523:399::-;;;;;;;;;;-1:-1:-1;49523:399:0;;;;;:::i;:::-;;:::i;48898:211::-;;;;;;;;;;-1:-1:-1;48898:211:0;;;;;:::i;:::-;;:::i;50332:306::-;;;;;;;;;;-1:-1:-1;50332:306:0;;;;;:::i;:::-;;:::i;42684:39::-;;;;;;;;;;-1:-1:-1;42684:39:0;;;;;;;;41940:35;;;;;;;;;;;;;;;;43047:30;;;;;;;;;;;;;;;;42821:29;;;;;;;;;;;;;;;;42786:28;;;;;;;;;;;;;;;;4925:151;;;;;;;;;;-1:-1:-1;4925:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5041:18:0;;;5014:7;5041:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4925:151;41982:33;;;;;;;;;;;;;;;;54001:126;;;;;;;;;;;;;:::i;47435:134::-;;;;;;;;;;;;;:::i;52014:124::-;;;;;;;;;;-1:-1:-1;52014:124:0;;;;;:::i;:::-;;:::i;42144:37::-;;;;;;;;;;;;;;;;43307:49;;;;;;;;;;;;;;;;43009:31;;;;;;;;;;;;;;;;16654:244;;;;;;;;;;-1:-1:-1;16654:244:0;;;;;:::i;:::-;;:::i;43090:31::-;;;;;;;;;;;;;;;;42022:24;;;;;;;;;;;;;;;;43128:34;;;;;;;;;;;;;;;;43363:36;;;;;;;;;;-1:-1:-1;43363:36:0;;;;;;;;41896:31;;;;;;;;;;-1:-1:-1;41896:31:0;;;;-1:-1:-1;;;;;41896:31:0;;;4170:100;4224:13;4257:5;4250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4170:100;:::o;5084:169::-;5167:4;5184:39;271:10;5207:7;5216:6;5184:8;:39::i;:::-;-1:-1:-1;5241:4:0;5084:169;;;;;:::o;48653:233::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;;;;;;;;;48771:4:::1;48765;48745:13;4579:12:::0;;;4491:108;48745:13:::1;:17;::::0;48761:1:::1;48745:17;:::i;:::-;:24;;;;:::i;:::-;48744:31;;;;:::i;:::-;48735:6;:40;48727:100;;;::::0;-1:-1:-1;;;;;48727:100:0;;8231:2:1;48727:100:0::1;::::0;::::1;8213:21:1::0;8270:2;8250:18;;;8243:30;8309:34;8289:18;;;8282:62;8380:17;8360:18;;;8353:45;8415:19;;48727:100:0::1;8029:411:1::0;48727:100:0::1;48861:17;:6:::0;48871::::1;48861:17;:::i;:::-;48838:20;:40:::0;-1:-1:-1;48653:233:0:o;52576:183::-;52692:15;;:60;;;;;-1:-1:-1;;;;;8698:15:1;;;52692:60:0;;;8680:34:1;8750:15;;;8730:18;;;8723:43;52668:7:0;;52692:15;;:38;;8592:18:1;;52692:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52685:67;52576:183;-1:-1:-1;;;52576:183:0:o;5261:492::-;5401:4;5418:36;5428:6;5436:9;5447:6;5418:9;:36::i;:::-;-1:-1:-1;;;;;5494:19:0;;5467:24;5494:19;;;:11;:19;;;;;;;;271:10;5494:33;;;;;;;;5546:26;;;;5538:79;;;;-1:-1:-1;;;;;5538:79:0;;9168:2:1;5538:79:0;;;9150:21:1;9207:2;9187:18;;;9180:30;9246:34;9226:18;;;9219:62;9317:10;9297:18;;;9290:38;9345:19;;5538:79:0;8966:404:1;5538:79:0;5653:57;5662:6;271:10;5703:6;5684:16;:25;5653:8;:57::i;:::-;-1:-1:-1;5741:4:0;;5261:492;-1:-1:-1;;;;5261:492:0:o;48309:135::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48401:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:35;;-1:-1:-1;;48401:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48309:135::o;51254:349::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51353:33:0;::::1;51345:70;;;::::0;-1:-1:-1;;;;;51345:70:0;;9577:2:1;51345:70:0::1;::::0;::::1;9559:21:1::0;9616:2;9596:18;;;9589:30;9655:26;9635:18;;;9628:54;9699:18;;51345:70:0::1;9375:348:1::0;51345:70:0::1;51426:42;51442:19;51463:4;51426:15;:42::i;:::-;51529:16;::::0;51484:62:::1;::::0;-1:-1:-1;;;;;51529:16:0;;::::1;::::0;51484:62;::::1;::::0;::::1;::::0;51529:16:::1;::::0;51484:62:::1;51557:16;:38:::0;;-1:-1:-1;;51557:38:0::1;-1:-1:-1::0;;;;;51557:38:0;;;::::1;::::0;;;::::1;::::0;;51254:349::o;47662:130::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;47739:15:::1;::::0;:45:::1;::::0;;;;-1:-1:-1;;;;;1912:55:1;;;47739:45:0::1;::::0;::::1;1894:74:1::0;47739:15:0;;::::1;::::0;:36:::1;::::0;1867:18:1;;47739:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47662:130:::0;:::o;5761:215::-;271:10;5849:4;5898:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5898:34:0;;;;;;;;;;5849:4;;5866:80;;5889:7;;5898:47;;5935:10;;5898:47;:::i;:::-;5866:8;:80::i;53896:97::-;53927:15;;:58;;;;;53966:10;53927:58;;;10045:74:1;53927:15:0;10135:18:1;;;10128:50;-1:-1:-1;;;;;53927:15:0;;;;:30;;10018:18:1;;53927:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53896:97::o;52262:171::-;52371:15;;:54;;;;;-1:-1:-1;;;;;1912:55:1;;;52371:54:0;;;1894:74:1;52344:7:0;;52371:15;;:41;;1867:18:1;;52371:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53265:359::-;53563:15;;:53;;;;;;;;10613:25:1;;;-1:-1:-1;;;;;10674:55:1;;;10654:18;;;10647:83;53387:7:0;;;;;;;;;;;;;;;;53563:15;;;:33;;10586:18:1;;53563:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53556:60;;;;;;;;;;;;;;;;53265:359;;;;;;;;;;;:::o;54135:141::-;54227:15;;:41;;;;;;;;54200:7;;-1:-1:-1;;;;;54227:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54220:48;;54135:141;:::o;52764:136::-;52857:15;;:38;;;;;-1:-1:-1;;;;;1912:55:1;;;52857:38:0;;;1894:74:1;52836:7:0;;52857:15;;:29;;1867:18:1;;52857:38:0;1721:253:1;53629:259:0;53755:15;;:28;;;;;;;;160:25:1;;;53689:18:0;;;;;;-1:-1:-1;;;;;53755:15:0;;:23;;133:18:1;;53755:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53793:87;;;11969:25:1;;;12025:2;12010:18;;12003:34;;;12053:18;;;12046:34;;;12111:2;12096:18;;12089:34;;;53688:95:0;;-1:-1:-1;53688:95:0;;-1:-1:-1;53688:95:0;-1:-1:-1;53870:9:0;;53858:5;;53793:87;;11956:3:1;11941:19;53793:87:0;;;;;;;;53683:205;;;53629:259;:::o;4607:127::-;-1:-1:-1;;;;;4708:18:0;4681:7;4708:18;;;;;;;;;;;;4607:127::o;62684:281::-;62766:24;;62744:7;;62766:24;;62763:195;;;62842:25;;62813:26;;:54;;;;:::i;62763:195::-;-1:-1:-1;62916:1:0;;62684:281::o;16351:148::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;16442:6:::1;::::0;16421:40:::1;::::0;16458:1:::1;::::0;-1:-1:-1;;;;;16442:6:0::1;::::0;16421:40:::1;::::0;16458:1;;16421:40:::1;16472:6;:19:::0;;-1:-1:-1;;16472:19:0::1;::::0;;16351:148::o;54288:119::-;54369:15;;:30;;;;;;;;54342:7;;-1:-1:-1;;;;;54369:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;54463:159;15921:6;;54515:4;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;54531:14:0::1;:22:::0;;-1:-1:-1;;54531:22:0;;::::1;::::0;;;54564:20:::1;:28:::0;;;;::::1;::::0;;54531:22;54463:159;:::o;49930:202::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50020:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;50020:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50082:42;;1417:41:1;;;50082:42:0::1;::::0;1390:18:1;50082:42:0::1;;;;;;;;49930:202:::0;;:::o;62973:501::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;63061:29:::1;:27;:29::i;:::-;63042:15;:48;;:85;;;;;63126:1;63094:29;:27;:29::i;:::-;:33;63042:85;63034:120;;;::::0;-1:-1:-1;;;;;63034:120:0;;12336:2:1;63034:120:0::1;::::0;::::1;12318:21:1::0;12375:2;12355:18;;;12348:30;12414:24;12394:18;;;12387:52;12456:18;;63034:120:0::1;12134:346:1::0;63034:120:0::1;63194:1;63165:26;:30:::0;;;63206:24:::1;:32:::0;;-1:-1:-1;;63206:32:0::1;::::0;;63333:16:::1;::::0;63275:55:::1;::::0;;;;63324:4:::1;63275:55;::::0;::::1;1894:74:1::0;63352:3:0::1;::::0;63333:16;63290:13:::1;-1:-1:-1::0;;;;;63275:40:0::1;::::0;::::1;::::0;1867:18:1;;63275:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;;;:::i;:::-;63395:1;63376:16;:20:::0;63409:57:::1;::::0;;;;63440:10:::1;63409:57;::::0;::::1;12659:74:1::0;12749:18;;;12742:34;;;63251:104:0;;-1:-1:-1;63416:13:0::1;-1:-1:-1::0;;;;;63409:30:0::1;::::0;::::1;::::0;12632:18:1;;63409:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63023:451;62973:501::o:0;62479:191::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;62555:58:::1;::::0;62538:12:::1;::::0;62563:10:::1;::::0;62595:4:::1;62587:21;::::0;62538:12;62555:58;62538:12;62555:58;62587:21;62563:10;62555:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62537:76;;;62632:7;62624:38;;;::::0;-1:-1:-1;;;;;62624:38:0;;13199:2:1;62624:38:0::1;::::0;::::1;13181:21:1::0;13238:2;13218:18;;;13211:30;13277:20;13257:18;;;13250:48;13315:18;;62624:38:0::1;12997:342:1::0;49121:390:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49242:16:::1;:33:::0;;;49286:13:::1;:27:::0;;;49324:15:::1;:31:::0;;;49342:13;49381:32:::1;49302:11:::0;49261:14;49381:32:::1;:::i;:::-;:50;;;;:::i;:::-;49366:12;:65:::0;;;49466:3:::1;-1:-1:-1::0;49450:19:0::1;49442:61;;;::::0;-1:-1:-1;;;;;49442:61:0;;13546:2:1;49442:61:0::1;::::0;::::1;13528:21:1::0;13585:2;13565:18;;;13558:30;13624:31;13604:18;;;13597:59;13673:18;;49442:61:0::1;13344:353:1::0;49442:61:0::1;49121:390:::0;;;:::o;51611:395::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;51711:6:::1;51699:8;:18;;:40;;;;;51733:6;51721:8;:18;;51699:40;51691:106;;;::::0;-1:-1:-1;;;;;51691:106:0;;13904:2:1;51691:106:0::1;::::0;::::1;13886:21:1::0;13943:2;13923:18;;;13916:30;13982:34;13962:18;;;13955:62;14053:23;14033:18;;;14026:51;14094:19;;51691:106:0::1;13702:417:1::0;51691:106:0::1;51828:16;;51816:8;:28:::0;51808:85:::1;;;::::0;-1:-1:-1;;;;;51808:85:0;;14326:2:1;51808:85:0::1;::::0;::::1;14308:21:1::0;14365:2;14345:18;;;14338:30;14404:34;14384:18;;;14377:62;14475:14;14455:18;;;14448:42;14507:19;;51808:85:0::1;14124:408:1::0;51808:85:0::1;51943:16;::::0;51909:51:::1;::::0;51933:8;;51909:51:::1;::::0;;;::::1;51971:16;:27:::0;51611:395::o;48081:218::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;48145:13:::1;::::0;::::1;::::0;::::1;;;48144:14;48136:51;;;::::0;-1:-1:-1;;;;;48136:51:0;;14739:2:1;48136:51:0::1;::::0;::::1;14721:21:1::0;14778:2;14758:18;;;14751:30;14817:26;14797:18;;;14790:54;14861:18;;48136:51:0::1;14537:348:1::0;48136:51:0::1;48198:13;:20:::0;;-1:-1:-1;;48229:18:0;;;;;48279:12:::1;48258:18;:33:::0;48081:218::o;48544:101::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;48616:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;48616:21:0;;::::1;::::0;;;::::1;::::0;;48544:101::o;52908:352::-;53204:15;;:48;;;;;-1:-1:-1;;;;;8698:15:1;;;53204:48:0;;;8680:34:1;8750:15;;;8730:18;;;8723:43;53025:7:0;;;;;;;;;;;;;;;;53204:15;;;:26;;8592:18:1;;53204:48:0;8445:327:1;4278:104:0;4334:13;4367:7;4360:14;;;;;:::i;50646:254::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;50755:13:::1;-1:-1:-1::0;;;;;50747:21:0::1;:4;-1:-1:-1::0;;;;;50747:21:0::1;::::0;50739:99:::1;;;::::0;-1:-1:-1;;;;;50739:99:0;;15092:2:1;50739:99:0::1;::::0;::::1;15074:21:1::0;15131:2;15111:18;;;15104:30;15170:34;15150:18;;;15143:62;15241:34;15221:18;;;15214:62;15313:3;15292:19;;;15285:32;15334:19;;50739:99:0::1;14890:469:1::0;50739:99:0::1;50851:41;50880:4;50886:5;50851:28;:41::i;52146:108::-:0;52219:15;;:27;;;;;;;;52192:7;;-1:-1:-1;;;;;52219:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;5984:413;271:10;6077:4;6121:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6121:34:0;;;;;;;;;;6174:35;;;;6166:85;;;;-1:-1:-1;;;;;6166:85:0;;15566:2:1;6166:85:0;;;15548:21:1;15605:2;15585:18;;;15578:30;15644:34;15624:18;;;15617:62;15715:7;15695:18;;;15688:35;15740:19;;6166:85:0;15364:401:1;6166:85:0;6287:67;271:10;6310:7;6338:15;6319:16;:34;6287:8;:67::i;:::-;-1:-1:-1;6385:4:0;;5984:413;-1:-1:-1;;;5984:413:0:o;4742:175::-;4828:4;4845:42;271:10;4869:9;4880:6;4845:9;:42::i;50140:184::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50225:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50225:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50282:34;;1417:41:1;;;50282:34:0::1;::::0;1390:18:1;50282:34:0::1;1277:187:1::0;47897:126:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;47972:15:::1;::::0;:43:::1;::::0;;;;-1:-1:-1;;;;;1912:55:1;;;47972:43:0::1;::::0;::::1;1894:74:1::0;47972:15:0;;::::1;::::0;:34:::1;::::0;1867:18:1;;47972:43:0::1;1721:253:1::0;49523:399:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49645:17:::1;:34:::0;;;49690:14:::1;:28:::0;;;49729:16:::1;:32:::0;;;49748:13;49788:34:::1;49707:11:::0;49665:14;49788:34:::1;:::i;:::-;:53;;;;:::i;:::-;49772:13;:69:::0;;;49877:3:::1;-1:-1:-1::0;49860:20:0::1;49852:62;;;::::0;-1:-1:-1;;;;;49852:62:0;;13546:2:1;49852:62:0::1;::::0;::::1;13528:21:1::0;13585:2;13565:18;;;13558:30;13624:31;13604:18;;;13597:59;13673:18;;49852:62:0::1;13344:353:1::0;48898:211:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;49018:4:::1;49013:3;48993:13;4579:12:::0;;;4491:108;48993:13:::1;:17;::::0;49009:1:::1;48993:17;:::i;:::-;:23;;;;:::i;:::-;48992:30;;;;:::i;:::-;48983:6;:39;48975:86;;;::::0;-1:-1:-1;;;;;48975:86:0;;15972:2:1;48975:86:0::1;::::0;::::1;15954:21:1::0;16011:2;15991:18;;;15984:30;16050:34;16030:18;;;16023:62;16121:4;16101:18;;;16094:32;16143:19;;48975:86:0::1;15770:398:1::0;48975:86:0::1;49084:17;:6:::0;49094::::1;49084:17;:::i;:::-;49072:9;:29:::0;-1:-1:-1;48898:211:0:o;50332:306::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;50451:9:::1;50447:115;50466:19:::0;;::::1;50447:115;;;50542:8;50507:19;:32;50527:8;;50536:1;50527:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50507:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50507:32:0;:43;;-1:-1:-1;;50507:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50487:3;::::1;::::0;::::1;:::i;:::-;;;;50447:115;;;;50579:51;50611:8;;50621;50579:51;;;;;;;;:::i;:::-;;;;;;;;50332:306:::0;;;:::o;54001:126::-;54080:15;;:39;;;;;;;;54056:7;;-1:-1:-1;;;;;54080:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;47435:134;15921:6;;47495:4;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;47511:20:0::1;:28:::0;;-1:-1:-1;;47511:28:0::1;::::0;;;47435:134;:::o;52014:124::-;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;52088:15:::1;::::0;:42:::1;::::0;;;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;52088:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;52088:42:0::1;14:177:1::0;16654:244:0;15921:6;;-1:-1:-1;;;;;15921:6:0;271:10;15921:22;15913:67;;;;-1:-1:-1;;;;;15913:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16743:22:0;::::1;16735:73;;;::::0;-1:-1:-1;;;;;16735:73:0;;17526:2:1;16735:73:0::1;::::0;::::1;17508:21:1::0;17565:2;17545:18;;;17538:30;17604:34;17584:18;;;17577:62;17675:8;17655:18;;;17648:36;17701:19;;16735:73:0::1;17324:402:1::0;16735:73:0::1;16845:6;::::0;16824:38:::1;::::0;-1:-1:-1;;;;;16824:38:0;;::::1;::::0;16845:6:::1;::::0;16824:38:::1;::::0;16845:6:::1;::::0;16824:38:::1;16873:6;:17:::0;;-1:-1:-1;;16873:17:0::1;-1:-1:-1::0;;;;;16873:17:0;;;::::1;::::0;;;::::1;::::0;;16654:244::o;7324:380::-;-1:-1:-1;;;;;7460:19:0;;7452:68;;;;-1:-1:-1;;;;;7452:68:0;;17933:2:1;7452:68:0;;;17915:21:1;17972:2;17952:18;;;17945:30;18011:34;17991:18;;;17984:62;18082:6;18062:18;;;18055:34;18106:19;;7452:68:0;17731:400:1;7452:68:0;-1:-1:-1;;;;;7539:21:0;;7531:68;;;;-1:-1:-1;;;;;7531:68:0;;18338:2:1;7531:68:0;;;18320:21:1;18377:2;18357:18;;;18350:30;18416:34;18396:18;;;18389:62;18487:4;18467:18;;;18460:32;18509:19;;7531:68:0;18136:398:1;7531:68:0;-1:-1:-1;;;;;7612:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7664:32;;160:25:1;;;7664:32:0;;133:18:1;7664:32:0;;;;;;;7324:380;;;:::o;54634:5025::-;-1:-1:-1;;;;;54766:18:0;;54758:68;;;;-1:-1:-1;;;;;54758:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54845:16:0;;54837:64;;;;-1:-1:-1;;;;;54837:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54922:14:0;;;;;;:10;:14;;;;;;;;54921:15;:36;;;;-1:-1:-1;;;;;;54941:16:0;;;;;;:10;:16;;;;;;;;54940:17;54921:36;54913:98;;;;-1:-1:-1;;;;;54913:98:0;;19551:2:1;54913:98:0;;;19533:21:1;19590:2;19570:18;;;19563:30;19629:34;19609:18;;;19602:62;19700:19;19680:18;;;19673:47;19737:19;;54913:98:0;19349:413:1;54913:98:0;55036:6;55046:1;55036:11;55033:92;;55064:28;55080:4;55086:2;55090:1;55064:15;:28::i;55033:92::-;55149:13;;;;;;;55145:136;;-1:-1:-1;;;;;55186:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;55215:23:0;;;;;;:19;:23;;;;;;;;55186:52;55178:91;;;;-1:-1:-1;;;;;55178:91:0;;19969:2:1;55178:91:0;;;19951:21:1;20008:2;19988:18;;;19981:30;20047:28;20027:18;;;20020:56;20093:18;;55178:91:0;19767:350:1;55178:91:0;55304:14;;;;55301:1645;;;15774:6;;-1:-1:-1;;;;;55356:15:0;;;15774:6;;55356:15;;;;:49;;-1:-1:-1;15774:6:0;;-1:-1:-1;;;;;55392:13:0;;;15774:6;;55392:13;;55356:49;:86;;;;-1:-1:-1;;;;;;55426:16:0;;;;55356:86;:128;;;;-1:-1:-1;;;;;;55463:21:0;;55477:6;55463:21;;55356:128;:158;;;;-1:-1:-1;55506:8:0;;-1:-1:-1;;;55506:8:0;;;;55505:9;55356:158;55334:1601;;;55688:20;;;;55684:406;;;55750:15;-1:-1:-1;;;;;55736:30:0;:2;-1:-1:-1;;;;;55736:30:0;;;:62;;;;;55784:13;-1:-1:-1;;;;;55770:28:0;:2;-1:-1:-1;;;;;55770:28:0;;;55736:62;55732:339;;;55863:9;55834:39;;;;:28;:39;;;;;;55876:12;-1:-1:-1;55826:140:0;;;;-1:-1:-1;;;;;55826:140:0;;20324:2:1;55826:140:0;;;20306:21:1;20363:2;20343:18;;;20336:30;20402:34;20382:18;;;20375:62;20473:34;20453:18;;;20446:62;20545:11;20524:19;;;20517:40;20574:19;;55826:140:0;20122:477:1;55826:140:0;56022:9;55993:39;;;;:28;:39;;;;;56035:12;55993:54;;55732:339;-1:-1:-1;;;;;56158:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;56194:35:0;;;;;;:31;:35;;;;;;;;56193:36;56158:71;56154:766;;;56272:20;;56262:6;:30;;56254:96;;;;-1:-1:-1;;;;;56254:96:0;;20806:2:1;56254:96:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;20955:23;20935:18;;;20928:51;20996:19;;56254:96:0;20604:417:1;56254:96:0;56407:9;;56390:13;56400:2;56390:9;:13::i;:::-;56381:22;;:6;:22;:::i;:::-;:35;;56373:75;;;;-1:-1:-1;;;;;56373:75:0;;21228:2:1;56373:75:0;;;21210:21:1;21267:2;21247:18;;;21240:30;21306:29;21286:18;;;21279:57;21353:18;;56373:75:0;21026:351:1;56373:75:0;56154:766;;;-1:-1:-1;;;;;56525:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;56559:37:0;;;;;;:31;:37;;;;;;;;56558:38;56525:71;56521:399;;;56639:20;;56629:6;:30;;56621:97;;;;-1:-1:-1;;;;;56621:97:0;;21584:2:1;56621:97:0;;;21566:21:1;21623:2;21603:18;;;21596:30;21662:34;21642:18;;;21635:62;21733:24;21713:18;;;21706:52;21775:19;;56621:97:0;21382:418:1;56521:399:0;-1:-1:-1;;;;;56765:35:0;;;;;;:31;:35;;;;;;;;56761:159;;56859:9;;56842:13;56852:2;56842:9;:13::i;:::-;56833:22;;:6;:22;:::i;:::-;:35;;56825:75;;;;-1:-1:-1;;;;;56825:75:0;;21228:2:1;56825:75:0;;;21210:21:1;21267:2;21247:18;;;21240:30;21306:29;21286:18;;;21279:57;21353:18;;56825:75:0;21026:351:1;56825:75:0;56952:28;56983:24;57001:4;56983:9;:24::i;:::-;57067:18;;56952:55;;-1:-1:-1;57043:42:0;;;;;;;57116:35;;-1:-1:-1;57140:11:0;;;;;;;57116:35;:61;;;;-1:-1:-1;57169:8:0;;-1:-1:-1;;;57169:8:0;;;;57168:9;57116:61;:110;;;;-1:-1:-1;;;;;;57195:31:0;;;;;;:25;:31;;;;;;;;57194:32;57116:110;:153;;;;-1:-1:-1;;;;;;57244:25:0;;;;;;:19;:25;;;;;;;;57243:26;57116:153;:194;;;;-1:-1:-1;;;;;;57287:23:0;;;;;;:19;:23;;;;;;;;57286:24;57116:194;57098:322;;;57337:8;:15;;-1:-1:-1;;57337:15:0;-1:-1:-1;;;57337:15:0;;;57367:10;:8;:10::i;:::-;57392:8;:16;;-1:-1:-1;;57392:16:0;;;57098:322;57448:8;;-1:-1:-1;;;;;57557:25:0;;57432:12;57557:25;;;:19;:25;;;;;;57448:8;-1:-1:-1;;;57448:8:0;;;;;57447:9;;57557:25;;:52;;-1:-1:-1;;;;;;57586:23:0;;;;;;:19;:23;;;;;;;;57557:52;57554:99;;;-1:-1:-1;57636:5:0;57554:99;57673:12;57764:7;57761:1365;;;57816:12;57790:18;;57811:1;57790:22;;;;:::i;:::-;:38;;:108;;;;-1:-1:-1;;;;;;57833:29:0;;;;;;:25;:29;;;;;;;;;:64;;-1:-1:-1;;;;;;57866:31:0;;;;;;:25;:31;;;;;;;;57833:64;57787:1182;;;57925:23;57944:3;57925:14;:6;57936:2;57925:10;:14::i;:::-;:18;;:23::i;:::-;57918:30;-1:-1:-1;58001:2:0;57989:9;57918:30;57996:2;57989:9;:::i;:::-;:14;;;;:::i;:::-;57967:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;58054:2:0;;-1:-1:-1;58042:9:0;:4;58049:2;58042:9;:::i;:::-;:14;;;;:::i;:::-;58022:16;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;58110:2:0;;-1:-1:-1;58098:9:0;:4;58105:2;58098:9;:::i;:::-;:14;;;;:::i;:::-;58075:19;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;57787:1182:0;;-1:-1:-1;57787:1182:0;;-1:-1:-1;;;;;58177:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;58226:1;58210:13;;:17;58177:50;58173:796;;;58254:41;42773:4;58254:25;58265:13;;58254:6;:10;;:25;;;;:::i;:41::-;58247:48;;58358:13;;58341:14;;58334:4;:21;;;;:::i;:::-;:37;;;;:::i;:::-;58314:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;58438:13:0;;58419:16;;58412:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;58390:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;58520:13:0;;58500:17;;58493:24;;:4;:24;:::i;58173:796::-;-1:-1:-1;;;;;58608:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;58658:1;58643:12;;:16;58608:51;58605:364;;;58684:40;42773:4;58684:24;58695:12;;58684:6;:10;;:24;;;;:::i;:40::-;58677:47;;58783:12;;58767:13;;58760:4;:20;;;;:::i;:::-;:35;;;;:::i;:::-;58740:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;58861:12:0;;58843:15;;58836:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;58814:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;58941:12:0;;58922:16;;58915:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;58892:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;58605:364:0;58988:8;;58985:93;;59020:42;59036:4;59050;59057;59020:15;:42::i;:::-;59100:14;59110:4;59100:14;;:::i;:::-;;;57761:1365;59138:33;59154:4;59160:2;59164:6;59138:15;:33::i;:::-;59184:15;;-1:-1:-1;;;;;59184:15:0;:26;59219:4;59226:15;59219:4;59226:9;:15::i;:::-;59184:58;;-1:-1:-1;;;59184:58:0;;;;;;-1:-1:-1;;;;;12677:55:1;;;59184:58:0;;;12659:74:1;12749:18;;;12742:34;12632:18;;59184:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59253:15:0;;-1:-1:-1;;;;;59253:15:0;;-1:-1:-1;59253:26:0;;-1:-1:-1;59288:2:0;59293:13;59288:2;59293:9;:13::i;:::-;59253:54;;-1:-1:-1;;;59253:54:0;;;;;;-1:-1:-1;;;;;12677:55:1;;;59253:54:0;;;12659:74:1;12749:18;;;12742:34;12632:18;;59253:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59324:8:0;;-1:-1:-1;;;59324:8:0;;;;59323:9;;-1:-1:-1;;59323:33:0;;;;;59355:1;59336:16;;:20;59323:33;59320:332;;;59381:16;;59412:15;;:28;;;;;;;;160:25:1;;;-1:-1:-1;;;;;59412:15:0;;;;:23;;133:18:1;;59412:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;59412:28:0;;;;;;;;-1:-1:-1;;59412:28:0;;;;;;;;;;;;:::i;:::-;;;59408:233;;;59529:86;;;11969:25:1;;;12025:2;12010:18;;12003:34;;;12053:18;;;12046:34;;;12111:2;12096:18;;12089:34;;;59605:9:0;;59594:4;;59529:86;;11956:3:1;11941:19;59529:86:0;;;;;;;59441:184;;;59408:233;59358:294;59320:332;54747:4912;;;;54634:5025;;;:::o;50908:338::-;-1:-1:-1;;;;;50991:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50991:39:0;;;;;;;51043:38;50991:31;:39;51043:25;:38::i;:::-;51105:5;51102:79;;;51127:15;;:42;;;;;-1:-1:-1;;;;;1912:55:1;;;51127:42:0;;;1894:74:1;51127:15:0;;;;:36;;1867:18:1;;51127:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51102:79;51198:40;;;;;;-1:-1:-1;;;;;51198:40:0;;;;;;;;50908:338;;:::o;6405:614::-;-1:-1:-1;;;;;6545:20:0;;6537:70;;;;-1:-1:-1;;;;;6537:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6626:23:0;;6618:71;;;;-1:-1:-1;;;;;6618:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6726:17:0;;6702:21;6726:17;;;;;;;;;;;6762:23;;;;6754:74;;;;-1:-1:-1;;;;;6754:74:0;;22455:2:1;6754:74:0;;;22437:21:1;22494:2;22474:18;;;22467:30;22533:34;22513:18;;;22506:62;22604:8;22584:18;;;22577:36;22630:19;;6754:74:0;22253:402:1;6754:74:0;-1:-1:-1;;;;;6864:17:0;;;:9;:17;;;;;;;;;;;6884:22;;;6864:42;;6928:20;;;;;;;;:30;;6900:6;;6864:9;6928:30;;6900:6;;6928:30;:::i;:::-;;;;;;;;6993:9;-1:-1:-1;;;;;6976:35:0;6985:6;-1:-1:-1;;;;;6976:35:0;;7004:6;6976:35;;;;160:25:1;;148:2;133:18;;14:177;60819:1652:0;60858:23;60884:24;60902:4;60884:9;:24::i;:::-;60858:50;;60919:25;60990:16;;60968:19;;60947:18;;:40;;;;:::i;:::-;:59;;;;:::i;:::-;60919:87;-1:-1:-1;61030:20:0;;;:46;;-1:-1:-1;61054:22:0;;61030:46;61027:60;;;61079:7;;60819:1652::o;61027:60::-;61156:23;61241:1;61221:17;61200:18;;61182:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;61156:86;-1:-1:-1;61253:26:0;61282:36;:15;61156:86;61282:19;:36::i;:::-;61253:65;-1:-1:-1;61375:4:0;61367:21;61401:36;61253:65;61401:16;:36::i;:::-;61459:18;61480:44;61488:4;61480:21;61506:17;61480:25;:44::i;:::-;61459:65;;61545:24;61572:83;61652:1;61633:18;;:20;;;;:::i;:::-;61612:42;;:17;:42;:::i;:::-;61587:19;;61572:35;;:10;;:14;:35::i;:83::-;61545:110;;61666:21;61690:80;61767:1;61748:18;;:20;;;;:::i;:::-;61727:42;;:17;:42;:::i;:::-;61705:16;;61690:32;;:10;;:14;:32::i;:80::-;61666:104;-1:-1:-1;61791:23:0;61666:104;61817:29;61830:16;61817:10;:29;:::i;:::-;:45;;;;:::i;:::-;61904:1;61883:18;:22;;;61916:19;:23;;;61950:16;:20;61791:71;-1:-1:-1;62014:19:0;;;;;:42;;;62055:1;62037:15;:19;62014:42;62011:210;;;62072:46;62085:15;62102;62072:12;:46::i;:::-;62190:18;;62138:71;;;22862:25:1;;;22918:2;22903:18;;22896:34;;;22946:18;;;22939:34;;;;62138:71:0;;;;;;22850:2:1;62138:71:0;;;62011:210;62326:15;;62318:55;;62301:12;;-1:-1:-1;;;;;62326:15:0;;62355:13;;62301:12;62318:55;62301:12;62318:55;62355:13;62326:15;62318:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62407:16:0;;62399:64;;62300:73;;-1:-1:-1;;;;;;62407:16:0;;62445:4;62437:21;;62399:64;;;;62437:21;62407:16;62399:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;60819:1652:0:o;12107:471::-;12165:7;12410:1;12415;12410:6;12406:47;;-1:-1:-1;12440:1:0;12433:8;;12406:47;12465:9;12477:5;12481:1;12477;:5;:::i;:::-;12465:17;-1:-1:-1;12510:1:0;12501:5;12505:1;12465:17;12501:5;:::i;:::-;:10;12493:56;;;;-1:-1:-1;;;;;12493:56:0;;23186:2:1;12493:56:0;;;23168:21:1;23225:2;23205:18;;;23198:30;23264:34;23244:18;;;23237:62;23335:3;23315:18;;;23308:31;23356:19;;12493:56:0;22984:397:1;13054:132:0;13112:7;13139:39;13143:1;13146;13139:39;;;;;;;;;;;;;;;;;:3;:39::i;11217:136::-;11275:7;11302:43;11306:1;11309;11302:43;;;;;;;;;;;;;;;;;:3;:43::i;59671:601::-;59823:16;;;59837:1;59823:16;;;;;;;;59799:21;;59823:16;;;;;;;;;;-1:-1:-1;59823:16:0;59799:40;;59868:4;59850;59855:1;59850:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;59850:23:0;;;-1:-1:-1;;;;;59850:23:0;;;;;59894:15;-1:-1:-1;;;;;59894:20:0;;:22;;;;;-1:-1:-1;;;59894:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59884:4;59889:1;59884:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;59884:32:0;;;-1:-1:-1;;;;;59884:32:0;;;;;59929:62;59946:4;59961:15;59979:11;59929:8;:62::i;:::-;60030:224;;;;;-1:-1:-1;;;;;60030:15:0;:66;;;;:224;;60111:11;;60137:1;;60181:4;;60208;;60228:15;;60030:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59726:546;59671:601;:::o;60284:523::-;60432:62;60449:4;60464:15;60482:11;60432:8;:62::i;:::-;60537:260;;;;;60609:4;60537:260;;;25226:34:1;25276:18;;;25269:34;;;60655:1:0;25319:18:1;;;25312:34;;;25362:18;;;25355:34;60749:6:0;25405:19:1;;;25398:44;60771:15:0;25458:19:1;;;25451:35;60537:15:0;-1:-1:-1;;;;;60537:31:0;;;;60576:9;;25137:19:1;;60537:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13682:278::-;13768:7;13803:12;13796:5;13788:28;;;;-1:-1:-1;;;;;13788:28:0;;;;;;;;:::i;:::-;-1:-1:-1;13827:9:0;13839:5;13843:1;13839;:5;:::i;:::-;13827:17;13682:278;-1:-1:-1;;;;;13682:278:0:o;11656:192::-;11742:7;11778:12;11770:6;;;;11762:29;;;;-1:-1:-1;;;;;11762:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11802:9:0;11814:5;11818:1;11814;:5;:::i;196:597:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;798:154::-;-1:-1:-1;;;;;877:5:1;873:54;866:5;863:65;853:93;;942:1;939;932:12;957:315;1025:6;1033;1086:2;1074:9;1065:7;1061:23;1057:32;1054:52;;;1102:1;1099;1092:12;1054:52;1141:9;1128:23;1160:31;1185:5;1160:31;:::i;:::-;1210:5;1262:2;1247:18;;;;1234:32;;-1:-1:-1;;;957:315:1:o;1469:247::-;1528:6;1581:2;1569:9;1560:7;1556:23;1552:32;1549:52;;;1597:1;1594;1587:12;1549:52;1636:9;1623:23;1655:31;1680:5;1655:31;:::i;1979:180::-;2038:6;2091:2;2079:9;2070:7;2066:23;2062:32;2059:52;;;2107:1;2104;2097:12;2059:52;-1:-1:-1;2130:23:1;;1979:180;-1:-1:-1;1979:180:1:o;2164:388::-;2232:6;2240;2293:2;2281:9;2272:7;2268:23;2264:32;2261:52;;;2309:1;2306;2299:12;2261:52;2348:9;2335:23;2367:31;2392:5;2367:31;:::i;:::-;2417:5;-1:-1:-1;2474:2:1;2459:18;;2446:32;2487:33;2446:32;2487:33;:::i;:::-;2539:7;2529:17;;;2164:388;;;;;:::o;2557:456::-;2634:6;2642;2650;2703:2;2691:9;2682:7;2678:23;2674:32;2671:52;;;2719:1;2716;2709:12;2671:52;2758:9;2745:23;2777:31;2802:5;2777:31;:::i;:::-;2827:5;-1:-1:-1;2884:2:1;2869:18;;2856:32;2897:33;2856:32;2897:33;:::i;:::-;2557:456;;2949:7;;-1:-1:-1;;;3003:2:1;2988:18;;;;2975:32;;2557:456::o;3281:118::-;3367:5;3360:13;3353:21;3346:5;3343:32;3333:60;;3389:1;3386;3379:12;3404:382;3469:6;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;3585:9;3572:23;3604:31;3629:5;3604:31;:::i;:::-;3654:5;-1:-1:-1;3711:2:1;3696:18;;3683:32;3724:30;3683:32;3724:30;:::i;4211:315::-;4279:6;4287;4340:2;4328:9;4319:7;4315:23;4311:32;4308:52;;;4356:1;4353;4346:12;4308:52;4392:9;4379:23;4369:33;;4452:2;4441:9;4437:18;4424:32;4465:31;4490:5;4465:31;:::i;5260:316::-;5337:6;5345;5353;5406:2;5394:9;5385:7;5381:23;5377:32;5374:52;;;5422:1;5419;5412:12;5374:52;-1:-1:-1;;5445:23:1;;;5515:2;5500:18;;5487:32;;-1:-1:-1;5566:2:1;5551:18;;;5538:32;;5260:316;-1:-1:-1;5260:316:1:o;5581:241::-;5637:6;5690:2;5678:9;5669:7;5665:23;5661:32;5658:52;;;5706:1;5703;5696:12;5658:52;5745:9;5732:23;5764:28;5786:5;5764:28;:::i;5827:753::-;5919:6;5927;5935;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;6044:9;6031:23;6073:18;6114:2;6106:6;6103:14;6100:34;;;6130:1;6127;6120:12;6100:34;6168:6;6157:9;6153:22;6143:32;;6213:7;6206:4;6202:2;6198:13;6194:27;6184:55;;6235:1;6232;6225:12;6184:55;6275:2;6262:16;6301:2;6293:6;6290:14;6287:34;;;6317:1;6314;6307:12;6287:34;6375:7;6368:4;6360;6352:6;6348:17;6344:2;6340:26;6336:37;6333:50;6330:70;;;6396:1;6393;6386:12;6330:70;6427:4;6419:13;;;;-1:-1:-1;6451:6:1;-1:-1:-1;;6492:20:1;;6479:34;6522:28;6479:34;6522:28;:::i;:::-;6569:5;6559:15;;;5827:753;;;;;:::o;6585:437::-;6670:1;6660:12;;6717:1;6707:12;;;6728:61;;6782:4;6774:6;6770:17;6760:27;;6728:61;6835:2;6827:6;6824:14;6804:18;6801:38;6798:218;;-1:-1:-1;;;;;6869:1:1;6862:88;6973:4;6970:1;6963:15;7001:4;6998:1;6991:15;6798:218;;6585:437;;;:::o;7027:356::-;7229:2;7211:21;;;7248:18;;;7241:30;7307:34;7302:2;7287:18;;7280:62;7374:2;7359:18;;7027:356::o;7388:184::-;-1:-1:-1;;;;;7437:1:1;7430:88;7537:4;7534:1;7527:15;7561:4;7558:1;7551:15;7577:168;7617:7;7683:1;7679;7675:6;7671:14;7668:1;7665:21;7660:1;7653:9;7646:17;7642:45;7639:71;;;7690:18;;:::i;:::-;-1:-1:-1;7730:9:1;;7577:168::o;7750:274::-;7790:1;7816;7806:189;;-1:-1:-1;;;;;7848:1:1;7841:88;7952:4;7949:1;7942:15;7980:4;7977:1;7970:15;7806:189;-1:-1:-1;8009:9:1;;7750:274::o;8777:184::-;8847:6;8900:2;8888:9;8879:7;8875:23;8871:32;8868:52;;;8916:1;8913;8906:12;8868:52;-1:-1:-1;8939:16:1;;8777:184;-1:-1:-1;8777:184:1:o;9728:128::-;9768:3;9799:1;9795:6;9792:1;9789:13;9786:39;;;9805:18;;:::i;:::-;-1:-1:-1;9841:9:1;;9728:128::o;10189:245::-;10256:6;10309:2;10297:9;10288:7;10284:23;10280:32;10277:52;;;10325:1;10322;10315:12;10277:52;10357:9;10351:16;10376:28;10398:5;10376:28;:::i;10741:681::-;10872:6;10880;10888;10896;10904;10912;10920;10928;10981:3;10969:9;10960:7;10956:23;10952:33;10949:53;;;10998:1;10995;10988:12;10949:53;11030:9;11024:16;11049:31;11074:5;11049:31;:::i;:::-;11099:5;11089:15;;;11144:2;11133:9;11129:18;11123:25;11113:35;;11188:2;11177:9;11173:18;11167:25;11157:35;;11232:2;11221:9;11217:18;11211:25;11201:35;;11276:3;11265:9;11261:19;11255:26;11245:36;;11321:3;11310:9;11306:19;11300:26;11290:36;;11366:3;11355:9;11351:19;11345:26;11335:36;;11411:3;11400:9;11396:19;11390:26;11380:36;;10741:681;;;;;;;;;;;:::o;11427:306::-;11515:6;11523;11531;11584:2;11572:9;11563:7;11559:23;11555:32;11552:52;;;11600:1;11597;11590:12;11552:52;11629:9;11623:16;11613:26;;11679:2;11668:9;11664:18;11658:25;11648:35;;11723:2;11712:9;11708:18;11702:25;11692:35;;11427:306;;;;;:::o;16173:184::-;-1:-1:-1;;;;;16222:1:1;16215:88;16322:4;16319:1;16312:15;16346:4;16343:1;16336:15;16362:135;16401:3;16422:17;;;16419:43;;16442:18;;:::i;:::-;-1:-1:-1;16489:1:1;16478:13;;16362:135::o;16502:817::-;16724:2;16736:21;;;16709:18;;16792:22;;;16676:4;16871:6;16845:2;16830:18;;16676:4;16905:327;16919:6;16916:1;16913:13;16905:327;;;16994:6;16981:20;17014:31;17039:5;17014:31;:::i;:::-;-1:-1:-1;;;;;17070:54:1;17058:67;;17148:4;17207:15;;;;17172:12;;;;16941:1;16934:9;16905:327;;;16909:3;17249;17241:11;;;;17304:6;17297:14;17290:22;17283:4;17272:9;17268:20;17261:52;16502:817;;;;;;:::o;18539:401::-;18741:2;18723:21;;;18780:2;18760:18;;;18753:30;18819:34;18814:2;18799:18;;18792:62;18890:7;18885:2;18870:18;;18863:35;18930:3;18915:19;;18539:401::o;18945:399::-;19147:2;19129:21;;;19186:2;19166:18;;;19159:30;19225:34;19220:2;19205:18;;19198:62;19296:5;19291:2;19276:18;;19269:33;19334:3;19319:19;;18945:399::o;21805:125::-;21845:4;21873:1;21870;21867:8;21864:34;;;21878:18;;:::i;:::-;-1:-1:-1;21915:9:1;;21805:125::o;23575:251::-;23645:6;23698:2;23686:9;23677:7;23673:23;23669:32;23666:52;;;23714:1;23711;23704:12;23666:52;23746:9;23740:16;23765:31;23790:5;23765:31;:::i;23831:1026::-;24093:4;24141:3;24130:9;24126:19;24172:6;24161:9;24154:25;24198:2;24236:6;24231:2;24220:9;24216:18;24209:34;24279:3;24274:2;24263:9;24259:18;24252:31;24303:6;24338;24332:13;24369:6;24361;24354:22;24407:3;24396:9;24392:19;24385:26;;24446:2;24438:6;24434:15;24420:29;;24467:1;24477:218;24491:6;24488:1;24485:13;24477:218;;;24556:13;;-1:-1:-1;;;;;24552:62:1;24540:75;;24670:15;;;;24635:12;;;;24513:1;24506:9;24477:218;;;-1:-1:-1;;;;;;;24751:55:1;;;;24746:2;24731:18;;24724:83;-1:-1:-1;;;24838:3:1;24823:19;24816:35;24712:3;23831:1026;-1:-1:-1;;;23831:1026:1:o

Swarm Source

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