ETH Price: $2,915.05 (-3.80%)
Gas: 1 Gwei

Token

Ethereum (eGOD)
 

Overview

Max Total Supply

1,000,000,000 eGOD

Holders

75

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.771713480575863844 eGOD

Value
$0.00
0xaaa5bb43ba7ad68b3c46bce743dacd1fa59ba7ed
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:
EthRewards

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
https://twitter.com/EthereumGoderc

https://t.me/+gsbe33EMQ3I2OGNl

egodeth.vip
*/

// SPDX-License-Identifier: MIT                                                                           
                                                    
pragma solidity 0.8.19;

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

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

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amt) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amt) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amt) external returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract ERC20 is Context, IERC20 {
    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 amt) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amt);
        return true;
    }

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

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

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

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

        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 amt) 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 >= amt, "ERC20: transfer amt exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amt;
        }
        _balances[recipient] += amt;

        emit Transfer(sender, recipient, amt);
    }

    function _createInitialSupply(address account, uint256 amt) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

    function _approve(address owner, address spender, uint256 amt) 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] = amt;
        emit Approval(owner, spender, amt);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(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 swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, address referrer, uint deadline) external;
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    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 getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
}

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

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

  /// @notice View the amt 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 amt of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingTokenInterface {
  /// @notice View the amt of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) 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 amt 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 amt of ether transferred is greater than 0.
  function withdrawDividend() external;

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

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

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

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

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 amt of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

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

  uint256 public totalDividendsDistributed;

  /// @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 amt of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amt of ether not distributed,
  ///     the magnified amt of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amt 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 {
    if(totalBalance > 0){
        uint256 amt = msg.value;
        if (amt > 0) {
        magnifiedDividendPerShare = magnifiedDividendPerShare.add(
            (amt).mul(magnitude) / totalBalance
        );
        emit DividendsDistributed(msg.sender, amt);

        totalDividendsDistributed = totalDividendsDistributed.add(amt);
        }
    }
  }


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

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

      return _withdrawableDividend;
    }

    return 0;
  }


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

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

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


  /// @notice View the amt 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 amt of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_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 amt that will be created.
  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces an amt 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 amt that will be burnt.
  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

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

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

    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 amt, bool indexed automatic);

    constructor() {
    	claimWait = 1;
        minimumTokenBalanceForDividends = 1;
    }

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

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

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

        index = 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);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

    function setBalance(address 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) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

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

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

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

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

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

    		iterations++;

    		uint256 newGasLeft = gasleft();

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

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

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

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

    	return false;
    }
}

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

interface ILpPair {
    function sync() external;
}

contract EthRewards is ERC20, Ownable {

    uint256 public maxBuyAmt;
    uint256 public maxSellAmt;
    uint256 public maxWalletAmt;

    DividendTracker public dividendTracker;

    IDexRouter public immutable dexRouter;
    address public lpPair;

    IERC20 public REWARDTOKEN; 
    address public REWARDPAIRTOKEN;

    bool private swapping;
    uint256 public swapTokensAtAmt;

    address public marketingAddress;

    uint256 public tradingLiveBlock = 0; // 0 means trading is not active
    uint256 private blockForPenaltyEnd;

    bool public limitsActive = true;
    bool public tradingLive = false;
    bool public swapEnabled = false;

    uint256 public constant FEE_DIVISOR = 10000;

    uint256 public buyTotalTax;
    uint256 public buyLiquidityTax;
    uint256 public buyMarketingTax;
    uint256 public buyRewardTax;

    uint256 public sellTotalTax;
    uint256 public sellMarketingTax;
    uint256 public sellLiquidityTax;
    uint256 public sellRewardTax;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForReward;
    
    mapping (address => bool) private _isExcludedFromTax;
    mapping (address => bool) public _isExcludedMaxTransactionAmt;

    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event StartedTrading();
    event RemovedLimits();
    event ExcludeFromTax(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmt(uint256 newAmt);
    event UpdatedMaxSellAmt(uint256 newAmt);
    event UpdatedMaxWalletAmt(uint256 newAmt);
    event UpdatedBuyTax(uint256 newAmt);
    event UpdatedSellTax(uint256 newAmt);
    event UpdatedMarketingAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event TransferForeignToken(address token, uint256 amt);

    constructor() ERC20("Ethereum", "eGOD") payable {

        address _dexRouter;

        if(block.chainid == 1){
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Ethereum: Uniswap V2
        } else if(block.chainid == 56){
            _dexRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS V2
        } else {
            revert("Chain not configured");
        }

        dividendTracker = new DividendTracker();

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        dexRouter = IDexRouter(_dexRouter);

        uint256 totalSupply = 1000000000 * 1e18;
        
        maxBuyAmt = totalSupply * 2 / 100;
        maxSellAmt = totalSupply * 2/ 100;
        maxWalletAmt = totalSupply * 2 / 100;
        swapTokensAtAmt = totalSupply * 25 / 100000;

        buyMarketingTax = 800;
        buyLiquidityTax = 0;
        buyRewardTax = 200;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRewardTax;

        sellMarketingTax = 3700;
        sellLiquidityTax = 0;
        sellRewardTax = 300;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRewardTax;

        // @dev update these!
        marketingAddress = address(msg.sender);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());
        _excludeFromMaxTransaction(address(lpPair), true);
        setAutomatedMarketMakerPair(address(lpPair), true);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(dexRouter), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        _excludeFromMaxTransaction(address(marketingAddress), true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(dexRouter));
        dividendTracker.excludeFromDividends(newOwner);
        dividendTracker.excludeFromDividends(address(0xdead));

        excludeFromTax(newOwner, true);
        excludeFromTax(address(this), true);
        excludeFromTax(address(dexRouter), true);
        excludeFromTax(address(0xdead), true);
        excludeFromTax(address(marketingAddress), true);

        transferOwnership(newOwner);

        _approve(address(this), address(dexRouter), type(uint256).max);

        _createInitialSupply(address(this), totalSupply - balanceOf(newOwner));
    }

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

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsActive = false;
        emit RemovedLimits();
    }

    function updateMaxBuyAmt(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set max sell amt lower than 1%");
        maxBuyAmt = newNum * (10**18);
        emit UpdatedMaxBuyAmt(maxBuyAmt);
    }
    
    function updateMaxSellAmt(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set max sell amt lower than 1%");
        maxSellAmt = newNum * (10**18);
        emit UpdatedMaxSellAmt(maxSellAmt);
    }

    function removeMaxWallet() external onlyOwner {
        maxWalletAmt = totalSupply();
        emit UpdatedMaxWalletAmt(maxWalletAmt);
    }

    function updateSwapTokensAtAmt(uint256 newAmt) external onlyOwner {
  	    require(newAmt >= totalSupply() * 1 / 1000000, "Swap amt cannot be lower than 0.0001% total supply.");
  	    require(newAmt <= totalSupply() * 1 / 1000, "Swap amt cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmt = newAmt;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmt[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays must be the same length");
        require(wallets.length < 600, "Can only airdrop 600 wallets per txn due to gas limits");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
            dividendTracker.setBalance(payable(wallets[i]), balanceOf(wallets[i]));
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmt[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != lpPair || value, "The pair cannot be removed from automatedMarketMakerPairs");
        automatedMarketMakerPairs[pair] = value;
        _excludeFromMaxTransaction(pair, value);
        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyTax(uint256 _marketingTax, uint256 _liquidityTax, uint256 _rewardTax) external onlyOwner {
        buyMarketingTax = _marketingTax;
        buyLiquidityTax = _liquidityTax;
        buyRewardTax = _rewardTax;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRewardTax;
        require(buyTotalTax <= 2000, "Must keep tax at 20% or less");
        emit UpdatedBuyTax(buyTotalTax);
    }

    function updateSellTax(uint256 _marketingTax, uint256 _liquidityTax, uint256 _rewardTax) external onlyOwner {
        sellMarketingTax = _marketingTax;
        sellLiquidityTax = _liquidityTax;
        sellRewardTax = _rewardTax;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRewardTax;
        require(sellTotalTax <= 5000, "Must keep tax at 50% or less");
        emit UpdatedSellTax(sellTotalTax);
    }

    function excludeFromTax(address account, bool excluded) public onlyOwner {
        _isExcludedFromTax[account] = excluded;
        emit ExcludeFromTax(account, excluded);
    }

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

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

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

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

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

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

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

    function 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();
    }
    
    function _transfer(address from, address to, uint256 amt) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if(amt == 0){
            super._transfer(from, to, 0);
            return;
        }
        
        if(!tradingLive){
            require(_isExcludedFromTax[from] || _isExcludedFromTax[to], "Trading is not active.");
        }

        if(_isExcludedFromTax[from] || _isExcludedFromTax[to] || swapping){
            super._transfer(from, to, amt);
            dividendTracker.setBalance(payable(from), balanceOf(from));
            dividendTracker.setBalance(payable(to), balanceOf(to));
            return;
        }
        
        if(limitsActive){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromTax[from] && !_isExcludedFromTax[to]){
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmt[to]) {
                    require(amt <= maxBuyAmt, "Buy transfer amt exceeds the max buy.");
                    require(amt + balanceOf(to) <= maxWalletAmt, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmt[from]) {
                    require(amt <= maxSellAmt, "Sell transfer amt exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmt[to]){
                    require(amt + balanceOf(to) <= maxWalletAmt, "Cannot Exceed max wallet");
                }
            }
        }

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

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

        bool takeTax = true;
        // if any account belongs to _isExcludedFromTax account then remove the tax
        if(_isExcludedFromTax[from] || _isExcludedFromTax[to]) {
            takeTax = false;
        }
        
        uint256 tax = 0;
        // only take tax on buys/sells, do not take on wallet transfers
        if(takeTax){

            if(earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && !_isExcludedFromTax[to] && buyTotalTax > 0){
                tax = amt * 9900 / FEE_DIVISOR;
        	    tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
                tokensForMarketing += tax * buyMarketingTax / buyTotalTax;
                tokensForReward += tax * buyRewardTax / buyTotalTax;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalTax > 0){
                tax = amt * sellTotalTax / FEE_DIVISOR;
                tokensForLiquidity += tax * sellLiquidityTax / sellTotalTax;
                tokensForMarketing += tax * sellMarketingTax / sellTotalTax;
                tokensForReward += tax * sellRewardTax / sellTotalTax;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalTax > 0) {
        	    tax = amt * buyTotalTax / FEE_DIVISOR;
        	    tokensForMarketing += tax * buyMarketingTax / buyTotalTax;
        	    tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
                tokensForReward += tax * buyRewardTax / buyTotalTax;
            }
            
            if(tax > 0){    
                super._transfer(from, address(this), tax);
            }
        	
        	amt -= tax;
        }

        super._transfer(from, to, amt);

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

    function swapTokenForETH(uint256 tokenAmt) private {

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

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0, // accept any amt of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForReward;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        
        if(tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForLiquidity;
            tokensForLiquidity = 0;
        }
        
        if(contractBalance > 0){
            bool success;
            swapTokenForETH(contractBalance);
            if(tokensForReward > 0){
                uint256 rewardTokens = tokensForReward * address(this).balance / totalTokensToSwap;
                (success,) = address(dividendTracker).call{value: rewardTokens}("");
            }

            if(tokensForMarketing > 0){
                (success,) = address(marketingAddress).call{value: address(this).balance}("");
            }

            tokensForMarketing = 0;
            tokensForReward = 0;
        }
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        require(_marketingAddress != address(0), "address cannot be 0");
        marketingAddress = payable(_marketingAddress);
        emit UpdatedMarketingAddress(_marketingAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmt, "Can only swap when token amt is at or higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    function transferForeignToken(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this) || !tradingLive, "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }
    function enableTrading(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingLive, "Trading is already active, cannot relaunch.");
        tradingLive = true;
        swapEnabled = true;
        tradingLiveBlock = block.number;
        blockForPenaltyEnd = tradingLiveBlock + blocksForPenalty;
    }

    function earlyBuyPenaltyInEffect() public view returns (bool){
        return block.number < blockForPenaltyEnd;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":[],"name":"RemovedLimits","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":[],"name":"StartedTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedMarketingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxBuyAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxSellAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxWalletAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDPAIRTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDTOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","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":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"}],"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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"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":[],"name":"limitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalTax","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":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","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":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForReward","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":"tradingLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingLiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_rewardTax","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_rewardTax","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"updateSwapTokensAtAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600f556011805462ffffff19166001179055600860a090815267457468657265756d60c01b60c052610120604052600460e0908152631951d3d160e21b61010052600362000050838262000da4565b5060046200005f828262000da4565b5050506000620000746200072760201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062006502833981519152908290a350600046600103620000d85750737a250d5630b4cf539739df2c5dacb4c659f2488d6200014a565b46603803620000fd57507310ed43c718714eb63d5aa57b78b54704e256024e6200014a565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b604051620001589062000cf1565b604051809103906000f08015801562000175573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b039283161790558116608052336b033b2e3c9fd0803ce80000006064620001b482600262000e86565b620001c0919062000ea6565b6006556064620001d282600262000e86565b620001de919062000ea6565b6007556064620001f082600262000e86565b620001fc919062000ea6565b600855620186a06200021082601962000e86565b6200021c919062000ea6565b600d5561032060148190556000601381905560c860158190559162000242919062000ec9565b6200024e919062000ec9565b601255610e7460178190556000601881905561012c60198190559162000275919062000ec9565b62000281919062000ec9565b601655600e80546001600160a01b031916331790556080516040805163c45a015560e01b815290516001600160a01b03929092169163c45a0155916004808201926020929091908290030181865afa158015620002e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000308919062000edf565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000358573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037e919062000edf565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f2919062000edf565b600a80546001600160a01b0319166001600160a01b039290921691821790556200041e9060016200072b565b600a5462000437906001600160a01b031660016200078e565b620004448260016200072b565b620004513060016200072b565b608051620004619060016200072b565b6200047061dead60016200072b565b600e5462000489906001600160a01b031660016200072b565b60095460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004d057600080fd5b505af1158015620004e5573d6000803e3d6000fd5b505060095460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052f57600080fd5b505af115801562000544573d6000803e3d6000fd5b505060095460805160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200059257600080fd5b505af1158015620005a7573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620005f357600080fd5b505af115801562000608573d6000803e3d6000fd5b505060095460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200065457600080fd5b505af115801562000669573d6000803e3d6000fd5b50505050620006808260016200093d60201b60201c565b6200068d3060016200093d565b6080516200069d9060016200093d565b620006ac61dead60016200093d565b600e54620006c5906001600160a01b031660016200093d565b620006d082620009e7565b620006e73060805160001962000ae460201b60201c565b6200071e306200070c846001600160a01b031660009081526020819052604090205490565b62000718908462000f11565b62000c0c565b50505062000f27565b3390565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6005546001600160a01b03163314620007d95760405162461bcd60e51b81526020600482018190526024820152600080516020620064e2833981519152604482015260640162000141565b600a546001600160a01b038381169116141580620007f45750805b620008685760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840162000141565b6001600160a01b0382166000908152601f60205260409020805460ff19168215151790556200089882826200072b565b8015620009015760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620008e757600080fd5b505af1158015620008fc573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620009885760405162461bcd60e51b81526020600482018190526024820152600080516020620064e2833981519152604482015260640162000141565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b0316331462000a325760405162461bcd60e51b81526020600482018190526024820152600080516020620064e2833981519152604482015260640162000141565b6001600160a01b03811662000a995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000141565b6005546040516001600160a01b038084169216906000805160206200650283398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831662000b485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000141565b6001600160a01b03821662000bab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000141565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821662000c645760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000141565b806002600082825462000c78919062000ec9565b90915550506001600160a01b0382166000908152602081905260408120805483929062000ca790849062000ec9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b61181a8062004cc883390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000d2a57607f821691505b60208210810362000d4b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d9f57600081815260208120601f850160051c8101602086101562000d7a5750805b601f850160051c820191505b8181101562000d9b5782815560010162000d86565b5050505b505050565b81516001600160401b0381111562000dc05762000dc062000cff565b62000dd88162000dd1845462000d15565b8462000d51565b602080601f83116001811462000e10576000841562000df75750858301515b600019600386901b1c1916600185901b17855562000d9b565b600085815260208120601f198616915b8281101562000e415788860151825594840194600190910190840162000e20565b508582101562000e605787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000ea05762000ea062000e70565b92915050565b60008262000ec457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000ea05762000ea062000e70565b60006020828403121562000ef257600080fd5b81516001600160a01b038116811462000f0a57600080fd5b9392505050565b8181038181111562000ea05762000ea062000e70565b608051613d7762000f51600039600081816104b30152818161333801526133f00152613d776000f3fe6080604052600436106104145760003560e01c806382aa7c681161021e578063ac1b129d11610123578063dd62ed3e116100ab578063e96db1ef1161007a578063e96db1ef14610c0a578063e98030c714610c20578063f1cb24f814610c40578063f27fd25414610c56578063f2fde38b14610c7657600080fd5b8063dd62ed3e14610b79578063e27a55fe14610bbf578063e634e70a14610bd5578063e7841ec014610bf557600080fd5b8063c0f306ef116100f2578063c0f306ef14610ade578063c6a3064714610afe578063c78d0fa014610b1e578063dae6a98214610b34578063dc07b61714610b6457600080fd5b8063ac1b129d14610a1d578063ad56c13c14610a33578063b62496f514610a98578063bb81150814610ac857600080fd5b80639e93ad8e116101a6578063a2cbba2811610175578063a2cbba2814610987578063a457c2d71461099d578063a5ece941146109bd578063a8b9d240146109dd578063a9059cbb146109fd57600080fd5b80639e93ad8e14610926578063a002959c1461093c578063a0a485ca14610952578063a26579ad1461097257600080fd5b80638da5cb5b116101ed5780638da5cb5b1461089d578063906e9dd0146108bb57806395d89b41146108db5780639a7a23d6146108f05780639cf551831461091057600080fd5b806382aa7c681461081d5780638366e79a1461083d57806384d5a0f11461085d578063894dc39b1461087d57600080fd5b806333cdacd91161032457806364b0f653116102ac57806370a082311161027b57806370a082311461079e578063715018a6146107be57806371778e7d146107d3578063751039fc146107e85780637571336a146107fd57600080fd5b806364b0f653146107335780636843cd84146107485780636ab91206146107685780636ddd17131461077e57600080fd5b80634e71d92d116102f35780634e71d92d146106bc57806351f205e4146106d157806358a6d531146106e65780635df6e68e146106fd578063607b4ef31461071357600080fd5b806333cdacd9146106505780633950935114610666578063452ed4f1146106865780634a75e73c146106a657600080fd5b80631cce34ee116103a75780632c1f5216116103765780632c1f5216146105c957806330bb4cff146105e9578063313ce567146105fe57806331e79db01461061a578063330124111461063a57600080fd5b80631cce34ee146105595780631f3fed8f146105735780632307b4411461058957806323b872dd146105a957600080fd5b8063095ea7b3116103e3578063095ea7b3146104d557806311704f521461050557806318160ddd146105245780631a8145bb1461054357600080fd5b8063032c32fc1461042057806305f936501461045d57806306fdde031461047f5780630758d924146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d6104783660046136c8565b610c96565b005b34801561048b57600080fd5b50610494610d83565b6040516104549190613718565b3480156104ad57600080fd5b506104407f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e157600080fd5b506104f56104f0366004613760565b610e15565b6040519015158152602001610454565b34801561051157600080fd5b506011546104f590610100900460ff1681565b34801561053057600080fd5b506002545b604051908152602001610454565b34801561054f57600080fd5b50610535601b5481565b34801561056557600080fd5b506011546104f59060ff1681565b34801561057f57600080fd5b50610535601a5481565b34801561059557600080fd5b5061047d6105a4366004613862565b610e2c565b3480156105b557600080fd5b506104f56105c4366004613924565b61102a565b3480156105d557600080fd5b50600954610440906001600160a01b031681565b3480156105f557600080fd5b506105356110d1565b34801561060a57600080fd5b5060405160128152602001610454565b34801561062657600080fd5b5061047d610635366004613965565b611144565b34801561064657600080fd5b5061053560145481565b34801561065c57600080fd5b5061053560075481565b34801561067257600080fd5b506104f5610681366004613760565b6111d1565b34801561069257600080fd5b50600a54610440906001600160a01b031681565b3480156106b257600080fd5b5061053560155481565b3480156106c857600080fd5b5061047d61120d565b3480156106dd57600080fd5b5061047d611285565b3480156106f257600080fd5b5060105443106104f5565b34801561070957600080fd5b5061053560125481565b34801561071f57600080fd5b50600c54610440906001600160a01b031681565b34801561073f57600080fd5b5061053561138d565b34801561075457600080fd5b50610535610763366004613965565b6113d7565b34801561077457600080fd5b5061053560185481565b34801561078a57600080fd5b506011546104f59062010000900460ff1681565b3480156107aa57600080fd5b506105356107b9366004613965565b611447565b3480156107ca57600080fd5b5061047d611462565b3480156107df57600080fd5b506105356114d6565b3480156107f457600080fd5b5061047d611520565b34801561080957600080fd5b5061047d610818366004613997565b61157f565b34801561082957600080fd5b5061047d6108383660046139d0565b611647565b34801561084957600080fd5b5061047d6108583660046139e9565b611705565b34801561086957600080fd5b5061047d6108783660046139d0565b6118a8565b34801561088957600080fd5b5061047d6108983660046139d0565b611972565b3480156108a957600080fd5b506005546001600160a01b0316610440565b3480156108c757600080fd5b5061047d6108d6366004613965565b611ab8565b3480156108e757600080fd5b50610494611b78565b3480156108fc57600080fd5b5061047d61090b366004613997565b611b87565b34801561091c57600080fd5b50610535600f5481565b34801561093257600080fd5b5061053561271081565b34801561094857600080fd5b50610535601c5481565b34801561095e57600080fd5b5061047d61096d3660046136c8565b611d0d565b34801561097e57600080fd5b50610535611de4565b34801561099357600080fd5b5061053560135481565b3480156109a957600080fd5b506104f56109b8366004613760565b611e2e565b3480156109c957600080fd5b50600e54610440906001600160a01b031681565b3480156109e957600080fd5b506105356109f8366004613965565b611ec7565b348015610a0957600080fd5b506104f5610a18366004613760565b611efa565b348015610a2957600080fd5b5061053560065481565b348015610a3f57600080fd5b50610a53610a4e366004613965565b611f07565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610454565b348015610aa457600080fd5b506104f5610ab3366004613965565b601f6020526000908152604090205460ff1681565b348015610ad457600080fd5b5061053560085481565b348015610aea57600080fd5b5061047d610af9366004613965565b611fa2565b348015610b0a57600080fd5b5061047d610b19366004613997565b611ffe565b348015610b2a57600080fd5b50610535600d5481565b348015610b4057600080fd5b506104f5610b4f366004613965565b601e6020526000908152604090205460ff1681565b348015610b7057600080fd5b5061047d612087565b348015610b8557600080fd5b50610535610b943660046139e9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bcb57600080fd5b5061053560165481565b348015610be157600080fd5b5061047d610bf03660046139d0565b6120e9565b348015610c0157600080fd5b506105356121ac565b348015610c1657600080fd5b5061053560175481565b348015610c2c57600080fd5b5061047d610c3b3660046139d0565b6121f6565b348015610c4c57600080fd5b5061053560195481565b348015610c6257600080fd5b50610a53610c713660046139d0565b612251565b348015610c8257600080fd5b5061047d610c91366004613965565b612293565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613a17565b60405180910390fd5b60178390556018829055601981905580610ce38385613a62565b610ced9190613a62565b60168190556113881015610d435760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420353025206f72206c657373000000006044820152606401610cc0565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610d7691815260200190565b60405180910390a1505050565b606060038054610d9290613a75565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613a75565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b5050505050905090565b6000610e2233848461237e565b5060015b92915050565b6005546001600160a01b03163314610e565760405162461bcd60e51b8152600401610cc090613a17565b8051825114610ea75760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b610258825110610f185760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b825181101561102557610f6133848381518110610f3a57610f3a613aaf565b6020026020010151848481518110610f5457610f54613aaf565b60200260200101516124a2565b60095483516001600160a01b039091169063e30443bc90859084908110610f8a57610f8a613aaf565b6020026020010151610fb4868581518110610fa757610fa7613aaf565b6020026020010151611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b50505050808061101d90613ac5565b915050610f1b565b505050565b60006110378484846125f4565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610cc0565b6110c6853385840361237e565b506001949350505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613ade565b905090565b6005546001600160a01b0316331461116e5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e22918590611208908690613a62565b61237e565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613af7565b50565b6005546001600160a01b031633146112af5760405162461bcd60e51b8152600401610cc090613a17565b600d546112bb30611447565b101561132f5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610cc0565b600c805460ff60a01b1916600160a01b17905561134a613003565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b60095460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e269190613ade565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cc090613a17565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b0316331461154a5760405162461bcd60e51b8152600401610cc090613a17565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146115a95760405162461bcd60e51b8152600401610cc090613a17565b8061161c57600a546001600160a01b039081169083160361161c5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116715760405162461bcd60e51b8152600401610cc090613a17565b601154610100900460ff16156116dd5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610cc0565b6011805462ffff0019166201010017905543600f8190556116ff908290613a62565b60105550565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166117855760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b6001600160a01b038216301415806117a55750601154610100900460ff16155b6117f15760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185c9190613ade565b905061186983838361322c565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610d76565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a764000060646118e660025490565b6118f1906001613b14565b6118fb9190613b2b565b6119059190613b2b565b8110156119245760405162461bcd60e51b8152600401610cc090613b4d565b61193681670de0b6b3a7640000613b14565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b0316331461199c5760405162461bcd60e51b8152600401610cc090613a17565b620f42406119a960025490565b6119b4906001613b14565b6119be9190613b2b565b811015611a295760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610cc0565b6103e8611a3560025490565b611a40906001613b14565b611a4a9190613b2b565b811115611ab35760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b6064820152608401610cc0565b600d55565b6005546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b038116611b2e5760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610cc0565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610d9290613a75565b6005546001600160a01b03163314611bb15760405162461bcd60e51b8152600401610cc090613a17565b600a546001600160a01b038381169116141580611bcb5750805b611c3d5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6001600160a01b0382166000908152601f60205260409020805460ff1916821515179055611c6b828261327e565b8015611cd15760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d375760405162461bcd60e51b8152600401610cc090613a17565b60148390556013829055601581905580611d518385613a62565b611d5b9190613a62565b60128190556107d01015611db15760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420323025206f72206c657373000000006044820152606401610cc0565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610d7691815260200190565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611eb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611ebd338585840361237e565b5060019392505050565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611406565b6000610e223384846125f4565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613b92565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161119c565b6005546001600160a01b031633146120285760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b031633146120b15760405162461bcd60e51b8152600401610cc090613a17565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a5590602001611383565b6005546001600160a01b031633146121135760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a7640000606461212760025490565b612132906001613b14565b61213c9190613b2b565b6121469190613b2b565b8110156121655760405162461bcd60e51b8152600401610cc090613b4d565b61217781670de0b6b3a7640000613b14565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f790602001611967565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b031633146122205760405162461bcd60e51b8152600401610cc090613a17565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161119c565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611f45565b6005546001600160a01b031633146122bd5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0381166123225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166123e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166124415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124c85760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166124ee5760405162461bcd60e51b8152600401610cc090613c41565b6001600160a01b038316600090815260208190526040902054818110156125635760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610cc0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259a908490613a62565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e691815260200190565b60405180910390a350505050565b6001600160a01b03831661261a5760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166126405760405162461bcd60e51b8152600401610cc090613c41565b8060000361265457611025838360006124a2565b601154610100900460ff166126e7576001600160a01b0383166000908152601d602052604090205460ff16806126a257506001600160a01b0382166000908152601d602052604090205460ff165b6126e75760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b6001600160a01b0383166000908152601d602052604090205460ff168061272657506001600160a01b0382166000908152601d602052604090205460ff165b8061273a5750600c54600160a01b900460ff165b156128435761274a8383836124a2565b6009546001600160a01b031663e30443bc8461276581611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127ab57600080fd5b505af11580156127bf573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc9050836127e081611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050565b60115460ff1615612b25576005546001600160a01b0384811691161480159061287a57506005546001600160a01b03838116911614155b801561288e57506001600160a01b03821615155b80156128a557506001600160a01b03821661dead14155b80156128ca57506001600160a01b0383166000908152601d602052604090205460ff16155b80156128ef57506001600160a01b0382166000908152601d602052604090205460ff16155b15612b25576001600160a01b0383166000908152601f602052604090205460ff16801561293557506001600160a01b0382166000908152601e602052604090205460ff16155b156129fe5760065481111561299a5760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b6064820152608401610cc0565b6008546129a683611447565b6129b09083613a62565b11156129f95760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b612b25565b6001600160a01b0382166000908152601f602052604090205460ff168015612a3f57506001600160a01b0383166000908152601e602052604090205460ff16155b15612aa6576007548111156129f95760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b6064820152608401610cc0565b6001600160a01b0382166000908152601e602052604090205460ff16612b2557600854612ad283611447565b612adc9083613a62565b1115612b255760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b6000612b3030611447565b600d5490915081108015908190612b4f575060115462010000900460ff165b8015612b655750600c54600160a01b900460ff16155b8015612b8957506001600160a01b0384166000908152601f602052604090205460ff165b15612bb757600c805460ff60a01b1916600160a01b179055612ba9613003565b600c805460ff60a01b191690555b6001600160a01b0385166000908152601d602052604090205460019060ff1680612bf957506001600160a01b0385166000908152601d602052604090205460ff165b15612c02575060005b60008115612efb5760105443108015612c3357506001600160a01b0387166000908152601f602052604090205460ff165b8015612c5857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612c7d57506001600160a01b0386166000908152601d602052604090205460ff16155b8015612c8b57506000601254115b15612d4257612710612c9f866126ac613b14565b612ca99190613b2b565b905060125460135482612cbc9190613b14565b612cc69190613b2b565b601b6000828254612cd79190613a62565b9091555050601254601454612cec9083613b14565b612cf69190613b2b565b601a6000828254612d079190613a62565b9091555050601254601554612d1c9083613b14565b612d269190613b2b565b601c6000828254612d379190613a62565b90915550612edd9050565b6001600160a01b0386166000908152601f602052604090205460ff168015612d6c57506000601654115b15612dff5761271060165486612d829190613b14565b612d8c9190613b2b565b905060165460185482612d9f9190613b14565b612da99190613b2b565b601b6000828254612dba9190613a62565b9091555050601654601754612dcf9083613b14565b612dd99190613b2b565b601a6000828254612dea9190613a62565b9091555050601654601954612d1c9083613b14565b6001600160a01b0387166000908152601f602052604090205460ff168015612e2957506000601254115b15612edd5761271060125486612e3f9190613b14565b612e499190613b2b565b905060125460145482612e5c9190613b14565b612e669190613b2b565b601a6000828254612e779190613a62565b9091555050601254601354612e8c9083613b14565b612e969190613b2b565b601b6000828254612ea79190613a62565b9091555050601254601554612ebc9083613b14565b612ec69190613b2b565b601c6000828254612ed79190613a62565b90915550505b8015612eee57612eee8730836124a2565b612ef88186613c84565b94505b612f068787876124a2565b6009546001600160a01b031663e30443bc88612f2181611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc905087612f9c81611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050505050505050505050565b600061300e30611447565b90506000601c54601a54601b546130259190613a62565b61302f9190613a62565b905081158061303c575080155b15613045575050565b600d54613053906028613b14565b82111561306b57600d54613068906028613b14565b91505b601b541561312e57600081601b54846130849190613b14565b61308e9190613b2b565b600a549091506130a99030906001600160a01b0316836124a2565b600a60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130f957600080fd5b505af192505050801561310a575060015b506131158184613c84565b9250601b54826131259190613c84565b6000601b559150505b811561322857600061313f836132e1565b601c54156131bc5760008247601c546131589190613b14565b6131629190613b2b565b6009546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5090925050505b601a541561321c57600e546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b50909150505b506000601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611025908490613466565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061331657613316613aaf565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b89190613c97565b816001815181106133cb576133cb613aaf565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790613430908590600090869030904290600401613cb4565b600060405180830381600087803b15801561344a57600080fd5b505af115801561345e573d6000803e3d6000fd5b505050505050565b60006134bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135389092919063ffffffff16565b80519091501561102557808060200190518101906134d99190613af7565b6110255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc0565b6060613547848460008561354f565b949350505050565b6060824710156135b05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc0565b600080866001600160a01b031685876040516135cc9190613d25565b60006040518083038185875af1925050503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915061361f8783838761362a565b979650505050505050565b60608315613699578251600003613692576001600160a01b0385163b6136925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc0565b5081613547565b61354783838151156136ae5781518083602001fd5b8060405162461bcd60e51b8152600401610cc09190613718565b6000806000606084860312156136dd57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561370f5781810151838201526020016136f7565b50506000910152565b60208152600082518060208401526137378160408501602087016136f4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461128257600080fd5b6000806040838503121561377357600080fd5b823561377e8161374b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137cb576137cb61378c565b604052919050565b600067ffffffffffffffff8211156137ed576137ed61378c565b5060051b60200190565b600082601f83011261380857600080fd5b8135602061381d613818836137d3565b6137a2565b82815260059290921b8401810191818101908684111561383c57600080fd5b8286015b848110156138575780358352918301918301613840565b509695505050505050565b6000806040838503121561387557600080fd5b823567ffffffffffffffff8082111561388d57600080fd5b818501915085601f8301126138a157600080fd5b813560206138b1613818836137d3565b82815260059290921b840181019181810190898411156138d057600080fd5b948201945b838610156138f75785356138e88161374b565b825294820194908201906138d5565b9650508601359250508082111561390d57600080fd5b5061391a858286016137f7565b9150509250929050565b60008060006060848603121561393957600080fd5b83356139448161374b565b925060208401356139548161374b565b929592945050506040919091013590565b60006020828403121561397757600080fd5b81356139828161374b565b9392505050565b801515811461128257600080fd5b600080604083850312156139aa57600080fd5b82356139b58161374b565b915060208301356139c581613989565b809150509250929050565b6000602082840312156139e257600080fd5b5035919050565b600080604083850312156139fc57600080fd5b8235613a078161374b565b915060208301356139c58161374b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e2657610e26613a4c565b600181811c90821680613a8957607f821691505b602082108103613aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613ad757613ad7613a4c565b5060010190565b600060208284031215613af057600080fd5b5051919050565b600060208284031215613b0957600080fd5b815161398281613989565b8082028115828204841417610e2657610e26613a4c565b600082613b4857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b031215613baf57600080fd5b8851613bba8161374b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e2657610e26613a4c565b600060208284031215613ca957600080fd5b81516139828161374b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d045784516001600160a01b031683529383019391830191600101613cdf565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251613d378184602087016136f4565b919091019291505056fea2646970667358221220ff4ba442aea8f0ccb4b26ae69e7aae919faeac8f675ef0243e40119ed81ba18164736f6c6343000813003360a060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600e81905560805260805161179c61007e6000396000818161047101526109b8015261179c6000f3fe6080604052600436106101a05760003560e01c806391b89fba116100ec578063c0f306ef1161008a578063e98030c711610064578063e98030c7146104e8578063f2fde38b14610508578063fbcbc0f114610528578063ffb2c4791461054857600080fd5b8063c0f306ef14610493578063e30443bc146104b3578063e7841ec0146104d357600080fd5b8063ab6ddfa8116100c6578063ab6ddfa8146103fc578063ad7a672f14610429578063bc4c4b371461043f578063be10b6141461045f57600080fd5b806391b89fba14610386578063a8b9d240146103a6578063aafd847a146103c657600080fd5b80634e7b827f116101595780636f2789ec116101335780636f2789ec1461031d578063715018a61461033357806385a6b3ae146103485780638da5cb5b1461035e57600080fd5b80634e7b827f146102635780635183d6fd146102a35780636a4740021461030857600080fd5b806303c83302146101b457806309bbedde146101bc578063226cfa3d146101e057806327ce01471461020d5780633009a6091461022d57806331e79db01461024357600080fd5b366101af576101ad610583565b005b600080fd5b6101ad610583565b3480156101c857600080fd5b506007545b6040519081526020015b60405180910390f35b3480156101ec57600080fd5b506101cd6101fb36600461153a565b600d6020526000908152604090205481565b34801561021957600080fd5b506101cd61022836600461153a565b610607565b34801561023957600080fd5b506101cd600b5481565b34801561024f57600080fd5b506101ad61025e36600461153a565b61066a565b34801561026f57600080fd5b5061029361027e36600461153a565b600c6020526000908152604090205460ff1681565b60405190151581526020016101d7565b3480156102af57600080fd5b506102c36102be366004611557565b61070b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101d7565b34801561031457600080fd5b506101ad610778565b34801561032957600080fd5b506101cd600e5481565b34801561033f57600080fd5b506101ad610781565b34801561035457600080fd5b506101cd60065481565b34801561036a57600080fd5b506000546040516001600160a01b0390911681526020016101d7565b34801561039257600080fd5b506101cd6103a136600461153a565b6107f5565b3480156103b257600080fd5b506101cd6103c136600461153a565b6107fc565b3480156103d257600080fd5b506101cd6103e136600461153a565b6001600160a01b031660009081526003602052604090205490565b34801561040857600080fd5b506101cd61041736600461153a565b60046020526000908152604090205481565b34801561043557600080fd5b506101cd60055481565b34801561044b57600080fd5b5061029361045a366004611570565b610828565b34801561046b57600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049f57600080fd5b506101ad6104ae36600461153a565b6108d4565b3480156104bf57600080fd5b506101ad6104ce3660046115ae565b61096c565b3480156104df57600080fd5b50600b546101cd565b3480156104f457600080fd5b506101ad610503366004611557565b610a1b565b34801561051457600080fd5b506101ad61052336600461153a565b610b84565b34801561053457600080fd5b506102c361054336600461153a565b610c6e565b34801561055457600080fd5b50610568610563366004611557565b610d55565b604080519384526020840192909252908201526060016101d7565b6005541561060557348015610603576005546105ba906105a783600160801b610e72565b6105b191906115f0565b60015490610efb565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546105ff9082610efb565b6006555b505b565b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b9261065a926106559261064f9161064a9190610e72565b610f5a565b90610f6a565b610fa8565b61066491906115f0565b92915050565b6000546001600160a01b0316331461069d5760405162461bcd60e51b815260040161069490611612565b60405180910390fd5b6001600160a01b0381166000908152600c60205260408120805460ff191660011790556106cb908290610fbb565b6106d481611054565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b60008060008060008060008061072060075490565b891061074557506000965060001995508594508693508392508291508190508061076d565b60006107508a611187565b905061075b81610c6e565b98509850985098509850985098509850505b919395975091939597565b610603336111ba565b6000546001600160a01b031633146107ab5760405162461bcd60e51b815260040161069490611612565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610664825b6001600160a01b0381166000908152600360205260408120546106649061082284610607565b906112ae565b600080546001600160a01b031633146108535760405162461bcd60e51b815260040161069490611612565b600061085e846111ba565b905080156108ca576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906108b89085815260200190565b60405180910390a36001915050610664565b5060009392505050565b6000546001600160a01b031633146108fe5760405162461bcd60e51b815260040161069490611612565b6001600160a01b0381166000908152600c602052604090205460ff1661092357600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b031633146109965760405162461bcd60e51b815260040161069490611612565b6001600160a01b0382166000908152600c602052604090205460ff16610a17577f000000000000000000000000000000000000000000000000000000000000000081106109f6576109e78282610fbb565b6109f182826112f0565b610a0a565b610a01826000610fbb565b610a0a82611054565b610a15826001610828565b505b5050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260040161069490611612565b6104b08110158015610a5a5750620151808111155b610ada5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610694565b600e548103610b515760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610694565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600e55565b6000546001600160a01b03163314610bae5760405162461bcd60e51b815260040161069490611612565b6001600160a01b038116610c135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610694565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080808080610c80886113ae565b9650600019955060008712610ce257600b54871115610cae57600b54610ca79088906113f3565b9550610ce2565b600b5460075460009110610cc3576000610cd2565b600b54600754610cd2916112ae565b9050610cde8882610f6a565b9650505b610ceb886107fc565b9450610cf688610607565b6001600160a01b0389166000908152600d6020526040902054909450925082610d20576000610d2e565b600e54610d2e908490610efb565b9150428211610d3e576000610d48565b610d4882426112ae565b9050919395975091939597565b60075460009081908190808203610d77575050600b5460009250829150610e6b565b600b546000805a90506000805b8984108015610d9257508582105b15610e5a5784610da181611647565b60075490965086109050610db457600094505b600060076000018681548110610dcc57610dcc611660565b60009182526020808320909101546001600160a01b0316808352600d909152604090912054909150610dfd90611430565b15610e2057610e0d816001610828565b15610e205781610e1c81611647565b9250505b82610e2a81611647565b93505060005a905080851115610e5157610e4e610e4786836112ae565b8790610efb565b95505b9350610d849050565b600b85905590975095509193505050505b9193909250565b600082600003610e8457506000610664565b6000610e908385611676565b905082610e9d85836115f0565b14610ef45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610694565b9392505050565b600080610f08838561168d565b905083811015610ef45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610694565b6000818181121561066457600080fd5b600080610f7783856116a0565b905060008312158015610f8a5750838112155b80610f9f5750600083128015610f9f57508381125b610ef457600080fd5b600080821215610fb757600080fd5b5090565b6001600160a01b038216600090815260046020526040902080549082905580821115611017576000610fed83836112ae565b9050610ff98482611457565b806005600082825461100b919061168d565b90915550610a15915050565b80821015610a1557600061102b82846112ae565b905061103784826114b1565b806005600082825461104991906116c8565b909155505050505050565b6001600160a01b0381166000908152600a602052604090205460ff166110775750565b6001600160a01b0381166000908152600a60209081526040808320805460ff191690556008825280832083905560099091528120546007549091906110be906001906116c8565b90506000600760000182815481106110d8576110d8611660565b60009182526020808320909101546001600160a01b039081168084526009909252604080842087905590871683528220919091556007805491925082918590811061112557611125611660565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600780548061115f5761115f6116db565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b60006007600001828154811061119f5761119f611660565b6000918252602090912001546001600160a01b031692915050565b6000806111c6836107fc565b905080156112a5576001600160a01b0383166000908152600360205260409020546111f19082610efb565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112409084815260200190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611295576040519150601f19603f3d011682016040523d82523d6000602084013e61129a565b606091505b509295945050505050565b50600092915050565b6000610ef483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114eb565b6001600160a01b0382166000908152600a602052604090205460ff161561132e576001600160a01b0391909116600090815260086020526040902055565b6001600160a01b0382166000818152600a60209081526040808320805460ff1916600190811790915560088352818420869055600780546009909452918420839055820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600a602052604081205460ff166113d75750600019919050565b506001600160a01b031660009081526009602052604090205490565b60008061140083856116f1565b9050600083121580156114135750838113155b80610f9f5750600083128015610f9f5750838113610ef457600080fd5b60004282111561144257506000919050565b600e5461144f42846112ae565b101592915050565b61149161147261064a83600154610e7290919063ffffffff16565b6001600160a01b038416600090815260026020526040902054906113f3565b6001600160a01b0390921660009081526002602052604090209190915550565b6114916114cc61064a83600154610e7290919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490610f6a565b6000818484111561150f5760405162461bcd60e51b81526004016106949190611718565b50600061151c84866116c8565b95945050505050565b6001600160a01b038116811461060357600080fd5b60006020828403121561154c57600080fd5b8135610ef481611525565b60006020828403121561156957600080fd5b5035919050565b6000806040838503121561158357600080fd5b823561158e81611525565b9150602083013580151581146115a357600080fd5b809150509250929050565b600080604083850312156115c157600080fd5b82356115cc81611525565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261160d57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611659576116596115da565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610664576106646115da565b80820180821115610664576106646115da565b80820182811260008312801582168215821617156116c0576116c06115da565b505092915050565b81810381811115610664576106646115da565b634e487b7160e01b600052603160045260246000fd5b8181036000831280158383131683831282161715611711576117116115da565b5092915050565b600060208083528351808285015260005b8181101561174557858101830151858201604001528201611729565b506000604082860101526040601f19601f830116850101925050509291505056fea26469706673582212201a423bb98f0430619e7f19bb110e07e1e20a82d235d4bef5ffa10014b945f05f64736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106104145760003560e01c806382aa7c681161021e578063ac1b129d11610123578063dd62ed3e116100ab578063e96db1ef1161007a578063e96db1ef14610c0a578063e98030c714610c20578063f1cb24f814610c40578063f27fd25414610c56578063f2fde38b14610c7657600080fd5b8063dd62ed3e14610b79578063e27a55fe14610bbf578063e634e70a14610bd5578063e7841ec014610bf557600080fd5b8063c0f306ef116100f2578063c0f306ef14610ade578063c6a3064714610afe578063c78d0fa014610b1e578063dae6a98214610b34578063dc07b61714610b6457600080fd5b8063ac1b129d14610a1d578063ad56c13c14610a33578063b62496f514610a98578063bb81150814610ac857600080fd5b80639e93ad8e116101a6578063a2cbba2811610175578063a2cbba2814610987578063a457c2d71461099d578063a5ece941146109bd578063a8b9d240146109dd578063a9059cbb146109fd57600080fd5b80639e93ad8e14610926578063a002959c1461093c578063a0a485ca14610952578063a26579ad1461097257600080fd5b80638da5cb5b116101ed5780638da5cb5b1461089d578063906e9dd0146108bb57806395d89b41146108db5780639a7a23d6146108f05780639cf551831461091057600080fd5b806382aa7c681461081d5780638366e79a1461083d57806384d5a0f11461085d578063894dc39b1461087d57600080fd5b806333cdacd91161032457806364b0f653116102ac57806370a082311161027b57806370a082311461079e578063715018a6146107be57806371778e7d146107d3578063751039fc146107e85780637571336a146107fd57600080fd5b806364b0f653146107335780636843cd84146107485780636ab91206146107685780636ddd17131461077e57600080fd5b80634e71d92d116102f35780634e71d92d146106bc57806351f205e4146106d157806358a6d531146106e65780635df6e68e146106fd578063607b4ef31461071357600080fd5b806333cdacd9146106505780633950935114610666578063452ed4f1146106865780634a75e73c146106a657600080fd5b80631cce34ee116103a75780632c1f5216116103765780632c1f5216146105c957806330bb4cff146105e9578063313ce567146105fe57806331e79db01461061a578063330124111461063a57600080fd5b80631cce34ee146105595780631f3fed8f146105735780632307b4411461058957806323b872dd146105a957600080fd5b8063095ea7b3116103e3578063095ea7b3146104d557806311704f521461050557806318160ddd146105245780631a8145bb1461054357600080fd5b8063032c32fc1461042057806305f936501461045d57806306fdde031461047f5780630758d924146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d6104783660046136c8565b610c96565b005b34801561048b57600080fd5b50610494610d83565b6040516104549190613718565b3480156104ad57600080fd5b506104407f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156104e157600080fd5b506104f56104f0366004613760565b610e15565b6040519015158152602001610454565b34801561051157600080fd5b506011546104f590610100900460ff1681565b34801561053057600080fd5b506002545b604051908152602001610454565b34801561054f57600080fd5b50610535601b5481565b34801561056557600080fd5b506011546104f59060ff1681565b34801561057f57600080fd5b50610535601a5481565b34801561059557600080fd5b5061047d6105a4366004613862565b610e2c565b3480156105b557600080fd5b506104f56105c4366004613924565b61102a565b3480156105d557600080fd5b50600954610440906001600160a01b031681565b3480156105f557600080fd5b506105356110d1565b34801561060a57600080fd5b5060405160128152602001610454565b34801561062657600080fd5b5061047d610635366004613965565b611144565b34801561064657600080fd5b5061053560145481565b34801561065c57600080fd5b5061053560075481565b34801561067257600080fd5b506104f5610681366004613760565b6111d1565b34801561069257600080fd5b50600a54610440906001600160a01b031681565b3480156106b257600080fd5b5061053560155481565b3480156106c857600080fd5b5061047d61120d565b3480156106dd57600080fd5b5061047d611285565b3480156106f257600080fd5b5060105443106104f5565b34801561070957600080fd5b5061053560125481565b34801561071f57600080fd5b50600c54610440906001600160a01b031681565b34801561073f57600080fd5b5061053561138d565b34801561075457600080fd5b50610535610763366004613965565b6113d7565b34801561077457600080fd5b5061053560185481565b34801561078a57600080fd5b506011546104f59062010000900460ff1681565b3480156107aa57600080fd5b506105356107b9366004613965565b611447565b3480156107ca57600080fd5b5061047d611462565b3480156107df57600080fd5b506105356114d6565b3480156107f457600080fd5b5061047d611520565b34801561080957600080fd5b5061047d610818366004613997565b61157f565b34801561082957600080fd5b5061047d6108383660046139d0565b611647565b34801561084957600080fd5b5061047d6108583660046139e9565b611705565b34801561086957600080fd5b5061047d6108783660046139d0565b6118a8565b34801561088957600080fd5b5061047d6108983660046139d0565b611972565b3480156108a957600080fd5b506005546001600160a01b0316610440565b3480156108c757600080fd5b5061047d6108d6366004613965565b611ab8565b3480156108e757600080fd5b50610494611b78565b3480156108fc57600080fd5b5061047d61090b366004613997565b611b87565b34801561091c57600080fd5b50610535600f5481565b34801561093257600080fd5b5061053561271081565b34801561094857600080fd5b50610535601c5481565b34801561095e57600080fd5b5061047d61096d3660046136c8565b611d0d565b34801561097e57600080fd5b50610535611de4565b34801561099357600080fd5b5061053560135481565b3480156109a957600080fd5b506104f56109b8366004613760565b611e2e565b3480156109c957600080fd5b50600e54610440906001600160a01b031681565b3480156109e957600080fd5b506105356109f8366004613965565b611ec7565b348015610a0957600080fd5b506104f5610a18366004613760565b611efa565b348015610a2957600080fd5b5061053560065481565b348015610a3f57600080fd5b50610a53610a4e366004613965565b611f07565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610454565b348015610aa457600080fd5b506104f5610ab3366004613965565b601f6020526000908152604090205460ff1681565b348015610ad457600080fd5b5061053560085481565b348015610aea57600080fd5b5061047d610af9366004613965565b611fa2565b348015610b0a57600080fd5b5061047d610b19366004613997565b611ffe565b348015610b2a57600080fd5b50610535600d5481565b348015610b4057600080fd5b506104f5610b4f366004613965565b601e6020526000908152604090205460ff1681565b348015610b7057600080fd5b5061047d612087565b348015610b8557600080fd5b50610535610b943660046139e9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bcb57600080fd5b5061053560165481565b348015610be157600080fd5b5061047d610bf03660046139d0565b6120e9565b348015610c0157600080fd5b506105356121ac565b348015610c1657600080fd5b5061053560175481565b348015610c2c57600080fd5b5061047d610c3b3660046139d0565b6121f6565b348015610c4c57600080fd5b5061053560195481565b348015610c6257600080fd5b50610a53610c713660046139d0565b612251565b348015610c8257600080fd5b5061047d610c91366004613965565b612293565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613a17565b60405180910390fd5b60178390556018829055601981905580610ce38385613a62565b610ced9190613a62565b60168190556113881015610d435760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420353025206f72206c657373000000006044820152606401610cc0565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610d7691815260200190565b60405180910390a1505050565b606060038054610d9290613a75565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613a75565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b5050505050905090565b6000610e2233848461237e565b5060015b92915050565b6005546001600160a01b03163314610e565760405162461bcd60e51b8152600401610cc090613a17565b8051825114610ea75760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b610258825110610f185760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b825181101561102557610f6133848381518110610f3a57610f3a613aaf565b6020026020010151848481518110610f5457610f54613aaf565b60200260200101516124a2565b60095483516001600160a01b039091169063e30443bc90859084908110610f8a57610f8a613aaf565b6020026020010151610fb4868581518110610fa757610fa7613aaf565b6020026020010151611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b50505050808061101d90613ac5565b915050610f1b565b505050565b60006110378484846125f4565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610cc0565b6110c6853385840361237e565b506001949350505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613ade565b905090565b6005546001600160a01b0316331461116e5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e22918590611208908690613a62565b61237e565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613af7565b50565b6005546001600160a01b031633146112af5760405162461bcd60e51b8152600401610cc090613a17565b600d546112bb30611447565b101561132f5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610cc0565b600c805460ff60a01b1916600160a01b17905561134a613003565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b60095460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e269190613ade565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cc090613a17565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b0316331461154a5760405162461bcd60e51b8152600401610cc090613a17565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146115a95760405162461bcd60e51b8152600401610cc090613a17565b8061161c57600a546001600160a01b039081169083160361161c5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116715760405162461bcd60e51b8152600401610cc090613a17565b601154610100900460ff16156116dd5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610cc0565b6011805462ffff0019166201010017905543600f8190556116ff908290613a62565b60105550565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166117855760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b6001600160a01b038216301415806117a55750601154610100900460ff16155b6117f15760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185c9190613ade565b905061186983838361322c565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610d76565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a764000060646118e660025490565b6118f1906001613b14565b6118fb9190613b2b565b6119059190613b2b565b8110156119245760405162461bcd60e51b8152600401610cc090613b4d565b61193681670de0b6b3a7640000613b14565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b0316331461199c5760405162461bcd60e51b8152600401610cc090613a17565b620f42406119a960025490565b6119b4906001613b14565b6119be9190613b2b565b811015611a295760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610cc0565b6103e8611a3560025490565b611a40906001613b14565b611a4a9190613b2b565b811115611ab35760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b6064820152608401610cc0565b600d55565b6005546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b038116611b2e5760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610cc0565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610d9290613a75565b6005546001600160a01b03163314611bb15760405162461bcd60e51b8152600401610cc090613a17565b600a546001600160a01b038381169116141580611bcb5750805b611c3d5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6001600160a01b0382166000908152601f60205260409020805460ff1916821515179055611c6b828261327e565b8015611cd15760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d375760405162461bcd60e51b8152600401610cc090613a17565b60148390556013829055601581905580611d518385613a62565b611d5b9190613a62565b60128190556107d01015611db15760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420323025206f72206c657373000000006044820152606401610cc0565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610d7691815260200190565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611eb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611ebd338585840361237e565b5060019392505050565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611406565b6000610e223384846125f4565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613b92565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161119c565b6005546001600160a01b031633146120285760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b031633146120b15760405162461bcd60e51b8152600401610cc090613a17565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a5590602001611383565b6005546001600160a01b031633146121135760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a7640000606461212760025490565b612132906001613b14565b61213c9190613b2b565b6121469190613b2b565b8110156121655760405162461bcd60e51b8152600401610cc090613b4d565b61217781670de0b6b3a7640000613b14565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f790602001611967565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b031633146122205760405162461bcd60e51b8152600401610cc090613a17565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161119c565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611f45565b6005546001600160a01b031633146122bd5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0381166123225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166123e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166124415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124c85760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166124ee5760405162461bcd60e51b8152600401610cc090613c41565b6001600160a01b038316600090815260208190526040902054818110156125635760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610cc0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259a908490613a62565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e691815260200190565b60405180910390a350505050565b6001600160a01b03831661261a5760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166126405760405162461bcd60e51b8152600401610cc090613c41565b8060000361265457611025838360006124a2565b601154610100900460ff166126e7576001600160a01b0383166000908152601d602052604090205460ff16806126a257506001600160a01b0382166000908152601d602052604090205460ff165b6126e75760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b6001600160a01b0383166000908152601d602052604090205460ff168061272657506001600160a01b0382166000908152601d602052604090205460ff165b8061273a5750600c54600160a01b900460ff165b156128435761274a8383836124a2565b6009546001600160a01b031663e30443bc8461276581611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127ab57600080fd5b505af11580156127bf573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc9050836127e081611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050565b60115460ff1615612b25576005546001600160a01b0384811691161480159061287a57506005546001600160a01b03838116911614155b801561288e57506001600160a01b03821615155b80156128a557506001600160a01b03821661dead14155b80156128ca57506001600160a01b0383166000908152601d602052604090205460ff16155b80156128ef57506001600160a01b0382166000908152601d602052604090205460ff16155b15612b25576001600160a01b0383166000908152601f602052604090205460ff16801561293557506001600160a01b0382166000908152601e602052604090205460ff16155b156129fe5760065481111561299a5760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b6064820152608401610cc0565b6008546129a683611447565b6129b09083613a62565b11156129f95760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b612b25565b6001600160a01b0382166000908152601f602052604090205460ff168015612a3f57506001600160a01b0383166000908152601e602052604090205460ff16155b15612aa6576007548111156129f95760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b6064820152608401610cc0565b6001600160a01b0382166000908152601e602052604090205460ff16612b2557600854612ad283611447565b612adc9083613a62565b1115612b255760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b6000612b3030611447565b600d5490915081108015908190612b4f575060115462010000900460ff165b8015612b655750600c54600160a01b900460ff16155b8015612b8957506001600160a01b0384166000908152601f602052604090205460ff165b15612bb757600c805460ff60a01b1916600160a01b179055612ba9613003565b600c805460ff60a01b191690555b6001600160a01b0385166000908152601d602052604090205460019060ff1680612bf957506001600160a01b0385166000908152601d602052604090205460ff165b15612c02575060005b60008115612efb5760105443108015612c3357506001600160a01b0387166000908152601f602052604090205460ff165b8015612c5857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612c7d57506001600160a01b0386166000908152601d602052604090205460ff16155b8015612c8b57506000601254115b15612d4257612710612c9f866126ac613b14565b612ca99190613b2b565b905060125460135482612cbc9190613b14565b612cc69190613b2b565b601b6000828254612cd79190613a62565b9091555050601254601454612cec9083613b14565b612cf69190613b2b565b601a6000828254612d079190613a62565b9091555050601254601554612d1c9083613b14565b612d269190613b2b565b601c6000828254612d379190613a62565b90915550612edd9050565b6001600160a01b0386166000908152601f602052604090205460ff168015612d6c57506000601654115b15612dff5761271060165486612d829190613b14565b612d8c9190613b2b565b905060165460185482612d9f9190613b14565b612da99190613b2b565b601b6000828254612dba9190613a62565b9091555050601654601754612dcf9083613b14565b612dd99190613b2b565b601a6000828254612dea9190613a62565b9091555050601654601954612d1c9083613b14565b6001600160a01b0387166000908152601f602052604090205460ff168015612e2957506000601254115b15612edd5761271060125486612e3f9190613b14565b612e499190613b2b565b905060125460145482612e5c9190613b14565b612e669190613b2b565b601a6000828254612e779190613a62565b9091555050601254601354612e8c9083613b14565b612e969190613b2b565b601b6000828254612ea79190613a62565b9091555050601254601554612ebc9083613b14565b612ec69190613b2b565b601c6000828254612ed79190613a62565b90915550505b8015612eee57612eee8730836124a2565b612ef88186613c84565b94505b612f068787876124a2565b6009546001600160a01b031663e30443bc88612f2181611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc905087612f9c81611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050505050505050505050565b600061300e30611447565b90506000601c54601a54601b546130259190613a62565b61302f9190613a62565b905081158061303c575080155b15613045575050565b600d54613053906028613b14565b82111561306b57600d54613068906028613b14565b91505b601b541561312e57600081601b54846130849190613b14565b61308e9190613b2b565b600a549091506130a99030906001600160a01b0316836124a2565b600a60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130f957600080fd5b505af192505050801561310a575060015b506131158184613c84565b9250601b54826131259190613c84565b6000601b559150505b811561322857600061313f836132e1565b601c54156131bc5760008247601c546131589190613b14565b6131629190613b2b565b6009546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5090925050505b601a541561321c57600e546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b50909150505b506000601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611025908490613466565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061331657613316613aaf565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b89190613c97565b816001815181106133cb576133cb613aaf565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790613430908590600090869030904290600401613cb4565b600060405180830381600087803b15801561344a57600080fd5b505af115801561345e573d6000803e3d6000fd5b505050505050565b60006134bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135389092919063ffffffff16565b80519091501561102557808060200190518101906134d99190613af7565b6110255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc0565b6060613547848460008561354f565b949350505050565b6060824710156135b05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc0565b600080866001600160a01b031685876040516135cc9190613d25565b60006040518083038185875af1925050503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915061361f8783838761362a565b979650505050505050565b60608315613699578251600003613692576001600160a01b0385163b6136925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc0565b5081613547565b61354783838151156136ae5781518083602001fd5b8060405162461bcd60e51b8152600401610cc09190613718565b6000806000606084860312156136dd57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561370f5781810151838201526020016136f7565b50506000910152565b60208152600082518060208401526137378160408501602087016136f4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461128257600080fd5b6000806040838503121561377357600080fd5b823561377e8161374b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137cb576137cb61378c565b604052919050565b600067ffffffffffffffff8211156137ed576137ed61378c565b5060051b60200190565b600082601f83011261380857600080fd5b8135602061381d613818836137d3565b6137a2565b82815260059290921b8401810191818101908684111561383c57600080fd5b8286015b848110156138575780358352918301918301613840565b509695505050505050565b6000806040838503121561387557600080fd5b823567ffffffffffffffff8082111561388d57600080fd5b818501915085601f8301126138a157600080fd5b813560206138b1613818836137d3565b82815260059290921b840181019181810190898411156138d057600080fd5b948201945b838610156138f75785356138e88161374b565b825294820194908201906138d5565b9650508601359250508082111561390d57600080fd5b5061391a858286016137f7565b9150509250929050565b60008060006060848603121561393957600080fd5b83356139448161374b565b925060208401356139548161374b565b929592945050506040919091013590565b60006020828403121561397757600080fd5b81356139828161374b565b9392505050565b801515811461128257600080fd5b600080604083850312156139aa57600080fd5b82356139b58161374b565b915060208301356139c581613989565b809150509250929050565b6000602082840312156139e257600080fd5b5035919050565b600080604083850312156139fc57600080fd5b8235613a078161374b565b915060208301356139c58161374b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e2657610e26613a4c565b600181811c90821680613a8957607f821691505b602082108103613aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613ad757613ad7613a4c565b5060010190565b600060208284031215613af057600080fd5b5051919050565b600060208284031215613b0957600080fd5b815161398281613989565b8082028115828204841417610e2657610e26613a4c565b600082613b4857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b031215613baf57600080fd5b8851613bba8161374b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e2657610e26613a4c565b600060208284031215613ca957600080fd5b81516139828161374b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d045784516001600160a01b031683529383019391830191600101613cdf565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251613d378184602087016136f4565b919091019291505056fea2646970667358221220ff4ba442aea8f0ccb4b26ae69e7aae919faeac8f675ef0243e40119ed81ba18164736f6c63430008130033

Deployed Bytecode Sourcemap

39236:18170:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39503:25;;;;;;;;;;-1:-1:-1;39503:25:0;;;;-1:-1:-1;;;;;39503:25:0;;;;;;-1:-1:-1;;;;;192:32:1;;;174:51;;162:2;147:18;39503:25:0;;;;;;;;47408:432;;;;;;;;;;-1:-1:-1;47408:432:0;;;;;:::i;:::-;;:::i;:::-;;8616:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39429:37::-;;;;;;;;;;;;;;;9524:163;;;;;;;;;;-1:-1:-1;9524:163:0;;;;;:::i;:::-;;:::i;:::-;;;2061:14:1;;2054:22;2036:41;;2024:2;2009:18;9524:163:0;1896:187:1;39838:31:0;;;;;;;;;;-1:-1:-1;39838:31:0;;;;;;;;;;;8937:108;;;;;;;;;;-1:-1:-1;9025:12:0;;8937:108;;;2234:25:1;;;2222:2;2207:18;8937:108:0;2088:177:1;40298:33:0;;;;;;;;;;;;;;;;39800:31;;;;;;;;;;-1:-1:-1;39800:31:0;;;;;;;;40258:33;;;;;;;;;;;;;;;;45737:520;;;;;;;;;;-1:-1:-1;45737:520:0;;;;;:::i;:::-;;:::i;9695:443::-;;;;;;;;;;-1:-1:-1;9695:443:0;;;;;:::i;:::-;;:::i;39382:38::-;;;;;;;;;;-1:-1:-1;39382:38:0;;;;-1:-1:-1;;;;;39382:38:0;;;48283:141;;;;;;;;;;;;;:::i;8836:93::-;;;;;;;;;;-1:-1:-1;8836:93:0;;8919:2;5600:36:1;;5588:2;5573:18;8836:93:0;5458:184:1;43977:130:0;;;;;;;;;;-1:-1:-1;43977:130:0;;;;;:::i;:::-;;:::i;40038:30::-;;;;;;;;;;;;;;;;39314:25;;;;;;;;;;;;;;;;10146:215;;;;;;;;;;-1:-1:-1;10146:215:0;;;;;:::i;:::-;;:::i;39473:21::-;;;;;;;;;;-1:-1:-1;39473:21:0;;;;-1:-1:-1;;;;;39473:21:0;;;40075:27;;;;;;;;;;;;;;;;49382:97;;;;;;;;;;;;;:::i;56139:306::-;;;;;;;;;;;;;:::i;57246:120::-;;;;;;;;;;-1:-1:-1;57340:18:0;;57325:12;:33;57246:120;;39968:26;;;;;;;;;;;;;;;;39536:30;;;;;;;;;;-1:-1:-1;39536:30:0;;;;-1:-1:-1;;;;;39536:30:0;;;49621:141;;;;;;;;;;;;;:::i;48584:134::-;;;;;;;;;;-1:-1:-1;48584:134:0;;;;;:::i;:::-;;:::i;40183:31::-;;;;;;;;;;;;;;;;39876;;;;;;;;;;-1:-1:-1;39876:31:0;;;;;;;;;;;9053:127;;;;;;;;;;-1:-1:-1;9053:127:0;;;;;:::i;:::-;;:::i;12529:150::-;;;;;;;;;;;;;:::i;49774:119::-;;;;;;;;;;;;;:::i;44390:113::-;;;;;;;;;;;;;:::i;46269:257::-;;;;;;;;;;-1:-1:-1;46269:257:0;;;;;:::i;:::-;;:::i;56916:322::-;;;;;;;;;;-1:-1:-1;56916:322:0;;;;;:::i;:::-;;:::i;56453:457::-;;;;;;;;;;-1:-1:-1;56453:457:0;;;;;:::i;:::-;;:::i;44511:252::-;;;;;;;;;;-1:-1:-1;44511:252:0;;;;;:::i;:::-;;:::i;45189:324::-;;;;;;;;;;-1:-1:-1;45189:324:0;;;;;:::i;:::-;;:::i;12315:79::-;;;;;;;;;;-1:-1:-1;12380:6:0;;-1:-1:-1;;;;;12380:6:0;12315:79;;55816:271;;;;;;;;;;-1:-1:-1;55816:271:0;;;;;:::i;:::-;;:::i;8724:104::-;;;;;;;;;;;;;:::i;46534:437::-;;;;;;;;;;-1:-1:-1;46534:437:0;;;;;:::i;:::-;;:::i;39682:35::-;;;;;;;;;;;;;;;;39916:43;;;;;;;;;;;;39954:5;39916:43;;40338:30;;;;;;;;;;;;;;;;46979:421;;;;;;;;;;-1:-1:-1;46979:421:0;;;;;:::i;:::-;;:::i;48167:108::-;;;;;;;;;;;;;:::i;40001:30::-;;;;;;;;;;;;;;;;10369:413;;;;;;;;;;-1:-1:-1;10369:413:0;;;;;:::i;:::-;;:::i;39642:31::-;;;;;;;;;;-1:-1:-1;39642:31:0;;;;-1:-1:-1;;;;;39642:31:0;;;48432:147;;;;;;;;;;-1:-1:-1;48432:147:0;;;;;:::i;:::-;;:::i;9188:169::-;;;;;;;;;;-1:-1:-1;9188:169:0;;;;;:::i;:::-;;:::i;39283:24::-;;;;;;;;;;;;;;;;48726:318;;;;;;;;;;-1:-1:-1;48726:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7552:32:1;;;7534:51;;7616:2;7601:18;;7594:34;;;;7644:18;;;7637:34;;;;7702:2;7687:18;;7680:34;;;;7745:3;7730:19;;7723:35;7572:3;7774:19;;7767:35;7833:3;7818:19;;7811:35;7877:3;7862:19;;7855:35;7521:3;7506:19;48726:318:0;7195:701:1;40510:58:0;;;;;;;;;;-1:-1:-1;40510:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39346:27;;;;;;;;;;;;;;;;44212:126;;;;;;;;;;-1:-1:-1;44212:126:0;;;;;:::i;:::-;;:::i;47848:179::-;;;;;;;;;;-1:-1:-1;47848:179:0;;;;;:::i;:::-;;:::i;39603:30::-;;;;;;;;;;;;;;;;40440:61;;;;;;;;;;-1:-1:-1;40440:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45039:142;;;;;;;;;;;;;:::i;9365:151::-;;;;;;;;;;-1:-1:-1;9365:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9481:18:0;;;9454:7;9481:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9365:151;40111:27;;;;;;;;;;;;;;;;44775:256;;;;;;;;;;-1:-1:-1;44775:256:0;;;;;:::i;:::-;;:::i;49487:126::-;;;;;;;;;;;;;:::i;40145:31::-;;;;;;;;;;;;;;;;48035:124;;;;;;;;;;-1:-1:-1;48035:124:0;;;;;:::i;:::-;;:::i;40221:28::-;;;;;;;;;;;;;;;;49049:325;;;;;;;;;;-1:-1:-1;49049:325:0;;;;;:::i;:::-;;:::i;12687:244::-;;;;;;;;;;-1:-1:-1;12687:244:0;;;;;:::i;:::-;;:::i;47408:432::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;;;;;;;;;47527:16:::1;:32:::0;;;47570:16:::1;:32:::0;;;47613:13:::1;:26:::0;;;47629:10;47665:35:::1;47589:13:::0;47546;47665:35:::1;:::i;:::-;:51;;;;:::i;:::-;47650:12;:66:::0;;;47751:4:::1;-1:-1:-1::0;47735:20:0::1;47727:61;;;::::0;-1:-1:-1;;;47727:61:0;;8726:2:1;47727:61:0::1;::::0;::::1;8708:21:1::0;8765:2;8745:18;;;8738:30;8804;8784:18;;;8777:58;8852:18;;47727:61:0::1;8524:352:1::0;47727:61:0::1;47804:28;47819:12;;47804:28;;;;2234:25:1::0;;2222:2;2207:18;;2088:177;47804:28:0::1;;;;;;;;47408:432:::0;;;:::o;8616:100::-;8670:13;8703:5;8696:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8616:100;:::o;9524:163::-;9604:4;9621:36;397:10;9644:7;9653:3;9621:8;:36::i;:::-;-1:-1:-1;9675:4:0;9524:163;;;;;:::o;45737:520::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;45876:12:::1;:19;45858:7;:14;:37;45850:80;;;::::0;-1:-1:-1;;;45850:80:0;;9468:2:1;45850:80:0::1;::::0;::::1;9450:21:1::0;9507:2;9487:18;;;9480:30;9546:32;9526:18;;;9519:60;9596:18;;45850:80:0::1;9266:354:1::0;45850:80:0::1;45966:3;45949:7;:14;:20;45941:87;;;::::0;-1:-1:-1;;;45941:87:0;;9827:2:1;45941:87:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;9905:34;9885:18;;;9878:62;-1:-1:-1;;;9956:18:1;;;9949:52;10018:19;;45941:87:0::1;9625:418:1::0;45941:87:0::1;46043:9;46039:211;46062:7;:14;46058:1;:18;46039:211;;;46097:56;46113:10;46125:7;46133:1;46125:10;;;;;;;;:::i;:::-;;;;;;;46137:12;46150:1;46137:15;;;;;;;;:::i;:::-;;;;;;;46097;:56::i;:::-;46168:15;::::0;46203:10;;-1:-1:-1;;;;;46168:15:0;;::::1;::::0;:26:::1;::::0;46203:7;;46211:1;;46203:10;::::1;;;;;:::i;:::-;;;;;;;46216:21;46226:7;46234:1;46226:10;;;;;;;;:::i;:::-;;;;;;;46216:9;:21::i;:::-;46168:70;::::0;-1:-1:-1;;;;;;46168:70:0::1;::::0;;;;;;-1:-1:-1;;;;;10388:32:1;;;46168:70:0::1;::::0;::::1;10370:51:1::0;10437:18;;;10430:34;10343:18;;46168:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46078:3;;;;;:::i;:::-;;;;46039:211;;;;45737:520:::0;;:::o;9695:443::-;9798:4;9815:33;9825:6;9833:9;9844:3;9815:9;:33::i;:::-;-1:-1:-1;;;;;9888:19:0;;9861:24;9888:19;;;:11;:19;;;;;;;;397:10;9888:33;;;;;;;;9940:23;;;;9932:73;;;;-1:-1:-1;;;9932:73:0;;10817:2:1;9932:73:0;;;10799:21:1;10856:2;10836:18;;;10829:30;10895:34;10875:18;;;10868:62;-1:-1:-1;;;10946:18:1;;;10939:35;10991:19;;9932:73:0;10615:401:1;9932:73:0;10041:54;10050:6;397:10;10091:3;10072:16;:22;10041:8;:54::i;:::-;-1:-1:-1;10126:4:0;;9695:443;-1:-1:-1;;;;9695:443:0:o;48283:141::-;48373:15;;:43;;;-1:-1:-1;;;48373:43:0;;;;48346:7;;-1:-1:-1;;;;;48373:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48366:50;;48283:141;:::o;43977:130::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;44054:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;44054:45:0;;-1:-1:-1;;;;;192:32:1;;;44054:45:0::1;::::0;::::1;174:51:1::0;44054:15:0;;::::1;::::0;:36:::1;::::0;147:18:1;;44054:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43977:130:::0;:::o;10146:215::-;397:10;10234:4;10283:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10283:34:0;;;;;;;;;;10234:4;;10251:80;;10274:7;;10283:47;;10320:10;;10283:47;:::i;:::-;10251:8;:80::i;49382:97::-;49413:15;;:58;;-1:-1:-1;;;49413:58:0;;49452:10;49413:58;;;11394:51:1;49413:15:0;11461:18:1;;;11454:50;-1:-1:-1;;;;;49413:15:0;;;;:30;;11367:18:1;;49413:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49382:97::o;56139:306::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;56230:15:::1;;56202:24;56220:4;56202:9;:24::i;:::-;:43;;56194:117;;;::::0;-1:-1:-1;;;56194:117:0;;11967:2:1;56194:117:0::1;::::0;::::1;11949:21:1::0;12006:2;11986:18;;;11979:30;12045:34;12025:18;;;12018:62;12116:31;12096:18;;;12089:59;12165:19;;56194:117:0::1;11765:425:1::0;56194:117:0::1;56322:8;:15:::0;;-1:-1:-1;;;;56322:15:0::1;-1:-1:-1::0;;;56322:15:0::1;::::0;;56348:10:::1;:8;:10::i;:::-;56369:8;:16:::0;;-1:-1:-1;;;;56369:16:0::1;::::0;;56401:36:::1;::::0;56421:15:::1;2234:25:1::0;;56401:36:0::1;::::0;2222:2:1;2207:18;56401:36:0::1;;;;;;;;56139:306::o:0;49621:141::-;49713:15;;:41;;;-1:-1:-1;;;49713:41:0;;;;49686:7;;-1:-1:-1;;;;;49713:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;48584:134;48675:15;;:38;;-1:-1:-1;;;48675:38:0;;-1:-1:-1;;;;;192:32:1;;;48675:38:0;;;174:51:1;48654:7:0;;48675:15;;:29;;147:18:1;;48675:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9053:127::-;-1:-1:-1;;;;;9154:18:0;9127:7;9154:18;;;;;;;;;;;;9053:127::o;12529:150::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;12622:6:::1;::::0;12601:40:::1;::::0;12638:1:::1;::::0;-1:-1:-1;;;;;12622:6:0::1;::::0;12601:40:::1;::::0;12638:1;;12601:40:::1;12652:6;:19:::0;;-1:-1:-1;;;;;;12652:19:0::1;::::0;;12529:150::o;49774:119::-;49855:15;;:30;;;-1:-1:-1;;;49855:30:0;;;;49828:7;;-1:-1:-1;;;;;49855:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;44390:113;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;44444:12:::1;:20:::0;;-1:-1:-1;;44444:20:0::1;::::0;;44480:15:::1;::::0;::::1;::::0;44459:5:::1;::::0;44480:15:::1;44390:113::o:0;46269:257::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;46365:4:::1;46361:104;;46403:6;::::0;-1:-1:-1;;;;;46403:6:0;;::::1;46393:16:::0;;::::1;::::0;46385:68:::1;;;::::0;-1:-1:-1;;;46385:68:0;;12397:2:1;46385:68:0::1;::::0;::::1;12379:21:1::0;12436:2;12416:18;;;12409:30;12475:34;12455:18;;;12448:62;-1:-1:-1;;;12526:18:1;;;12519:37;12573:19;;46385:68:0::1;12195:403:1::0;46385:68:0::1;-1:-1:-1::0;;;;;46475:36:0;;;::::1;;::::0;;;:28:::1;:36;::::0;;;;:43;;-1:-1:-1;;46475:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46269:257::o;56916:322::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;57004:11:::1;::::0;::::1;::::0;::::1;;;57003:12;56995:68;;;::::0;-1:-1:-1;;;56995:68:0;;12805:2:1;56995:68:0::1;::::0;::::1;12787:21:1::0;12844:2;12824:18;;;12817:30;12883:34;12863:18;;;12856:62;-1:-1:-1;;;12934:18:1;;;12927:41;12985:19;;56995:68:0::1;12603:407:1::0;56995:68:0::1;57074:11;:18:::0;;-1:-1:-1;;57103:18:0;;;;;57151:12:::1;57132:16;:31:::0;;;57195:35:::1;::::0;57214:16;;57195:35:::1;:::i;:::-;57174:18;:56:::0;-1:-1:-1;56916:322:0:o;56453:457::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56550:20:0;::::1;56542:59;;;::::0;-1:-1:-1;;;56542:59:0;;13217:2:1;56542:59:0::1;::::0;::::1;13199:21:1::0;13256:2;13236:18;;;13229:30;13295:28;13275:18;;;13268:56;13341:18;;56542:59:0::1;13015:350:1::0;56542:59:0::1;-1:-1:-1::0;;;;;56620:23:0;::::1;56638:4;56620:23;;::::0;:39:::1;;-1:-1:-1::0;56648:11:0::1;::::0;::::1;::::0;::::1;;;56647:12;56620:39;56612:80;;;::::0;-1:-1:-1;;;56612:80:0;;13572:2:1;56612:80:0::1;::::0;::::1;13554:21:1::0;13611:2;13591:18;;;13584:30;13650;13630:18;;;13623:58;13698:18;;56612:80:0::1;13370:352:1::0;56612:80:0::1;56730:39;::::0;-1:-1:-1;;;56730:39:0;;56763:4:::1;56730:39;::::0;::::1;174:51:1::0;56703:24:0::1;::::0;-1:-1:-1;;;;;56730:24:0;::::1;::::0;::::1;::::0;147:18:1;;56730:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56703:66;;56780:60;56810:6;56818:3;56823:16;56780:22;:60::i;:::-;56856:46;::::0;;-1:-1:-1;;;;;10388:32:1;;10370:51;;10452:2;10437:18;;10430:34;;;56856:46:0::1;::::0;10343:18:1;56856:46:0::1;10180:290:1::0;44511:252:0;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;44626:4:::1;44621:3;44601:13;9025:12:::0;;;8937:108;44601:13:::1;:17;::::0;44617:1:::1;44601:17;:::i;:::-;:23;;;;:::i;:::-;44600:30;;;;:::i;:::-;44590:6;:40;;44582:90;;;;-1:-1:-1::0;;;44582:90:0::1;;;;;;;:::i;:::-;44695:17;:6:::0;44705::::1;44695:17;:::i;:::-;44683:9;:29:::0;;;44728:27:::1;::::0;2234:25:1;;;44728:27:0::1;::::0;2222:2:1;2207:18;44728:27:0::1;;;;;;;;44511:252:::0;:::o;45189:324::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;45303:7:::1;45283:13;9025:12:::0;;;8937:108;45283:13:::1;:17;::::0;45299:1:::1;45283:17;:::i;:::-;:27;;;;:::i;:::-;45273:6;:37;;45265:101;;;::::0;-1:-1:-1;;;45265:101:0;;15009:2:1;45265:101:0::1;::::0;::::1;14991:21:1::0;15048:2;15028:18;;;15021:30;15087:34;15067:18;;;15060:62;-1:-1:-1;;;15138:18:1;;;15131:49;15197:19;;45265:101:0::1;14807:415:1::0;45265:101:0::1;45414:4;45394:13;9025:12:::0;;;8937:108;45394:13:::1;:17;::::0;45410:1:::1;45394:17;:::i;:::-;:24;;;;:::i;:::-;45384:6;:34;;45376:96;;;::::0;-1:-1:-1;;;45376:96:0;;15429:2:1;45376:96:0::1;::::0;::::1;15411:21:1::0;15468:2;15448:18;;;15441:30;15507:34;15487:18;;;15480:62;-1:-1:-1;;;15558:18:1;;;15551:47;15615:19;;45376:96:0::1;15227:413:1::0;45376:96:0::1;45482:15;:24:::0;45189:324::o;55816:271::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55910:31:0;::::1;55902:63;;;::::0;-1:-1:-1;;;55902:63:0;;15847:2:1;55902:63:0::1;::::0;::::1;15829:21:1::0;15886:2;15866:18;;;15859:30;-1:-1:-1;;;15905:18:1;;;15898:49;15964:18;;55902:63:0::1;15645:343:1::0;55902:63:0::1;55976:16;:45:::0;;-1:-1:-1;;;;;;55976:45:0::1;-1:-1:-1::0;;;;;55976:45:0;::::1;::::0;;::::1;::::0;;;56037:42:::1;::::0;::::1;::::0;-1:-1:-1;;56037:42:0::1;55816:271:::0;:::o;8724:104::-;8780:13;8813:7;8806:14;;;;;:::i;46534:437::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;46641:6:::1;::::0;-1:-1:-1;;;;;46633:14:0;;::::1;46641:6:::0;::::1;46633:14;;::::0;:23:::1;;;46651:5;46633:23;46625:93;;;::::0;-1:-1:-1;;;46625:93:0;;16195:2:1;46625:93:0::1;::::0;::::1;16177:21:1::0;16234:2;16214:18;;;16207:30;16273:34;16253:18;;;16246:62;16344:27;16324:18;;;16317:55;16389:19;;46625:93:0::1;15993:421:1::0;46625:93:0::1;-1:-1:-1::0;;;;;46729:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;46729:39:0::1;::::0;::::1;;;::::0;;46779::::1;46729:31:::0;:39;46779:26:::1;:39::i;:::-;46832:5;46829:79;;;46854:15;::::0;:42:::1;::::0;-1:-1:-1;;;46854:42:0;;-1:-1:-1;;;;;192:32:1;;;46854:42:0::1;::::0;::::1;174:51:1::0;46854:15:0;;::::1;::::0;:36:::1;::::0;147:18:1;;46854:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46829:79;46923:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;46923:40:0;::::1;::::0;::::1;::::0;;;::::1;46534:437:::0;;:::o;46979:421::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;47097:15:::1;:31:::0;;;47139:15:::1;:31:::0;;;47181:12:::1;:25:::0;;;47196:10;47231:33:::1;47157:13:::0;47115;47231:33:::1;:::i;:::-;:48;;;;:::i;:::-;47217:11;:62:::0;;;47313:4:::1;-1:-1:-1::0;47298:19:0::1;47290:60;;;::::0;-1:-1:-1;;;47290:60:0;;16621:2:1;47290:60:0::1;::::0;::::1;16603:21:1::0;16660:2;16640:18;;;16633:30;16699;16679:18;;;16672:58;16747:18;;47290:60:0::1;16419:352:1::0;47290:60:0::1;47366:26;47380:11;;47366:26;;;;2234:25:1::0;;2222:2;2207:18;;2088:177;48167:108:0;48240:15;;:27;;;-1:-1:-1;;;48240:27:0;;;;48213:7;;-1:-1:-1;;;;;48240:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;10369:413;397:10;10462:4;10506:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10506:34:0;;;;;;;;;;10559:35;;;;10551:85;;;;-1:-1:-1;;;10551:85:0;;16978:2:1;10551:85:0;;;16960:21:1;17017:2;16997:18;;;16990:30;17056:34;17036:18;;;17029:62;-1:-1:-1;;;17107:18:1;;;17100:35;17152:19;;10551:85:0;16776:401:1;10551:85:0;10672:67;397:10;10695:7;10723:15;10704:16;:34;10672:8;:67::i;:::-;-1:-1:-1;10770:4:0;;10369:413;-1:-1:-1;;;10369:413:0:o;48432:147::-;48525:15;;:47;;-1:-1:-1;;;48525:47:0;;-1:-1:-1;;;;;192:32:1;;;48525:47:0;;;174:51:1;48501:7:0;;48525:15;;:38;;147:18:1;;48525:47:0;14:217:1;9188:169:0;9271:4;9288:39;397:10;9312:9;9323:3;9288:9;:39::i;48726:318::-;49001:15;;:35;;-1:-1:-1;;;49001:35:0;;-1:-1:-1;;;;;192:32:1;;;49001:35:0;;;174:51:1;48822:7:0;;;;;;;;;;;;;;;;49001:15;;;:26;;147:18:1;;49001:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48994:42;;;;;;;;;;;;;;;;48726:318;;;;;;;;;:::o;44212:126::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;44287:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;44287:43:0;;-1:-1:-1;;;;;192:32:1;;;44287:43:0::1;::::0;::::1;174:51:1::0;44287:15:0;;::::1;::::0;:34:::1;::::0;147:18:1;;44287:43:0::1;14:217:1::0;47848:179:0;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47932:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;47932:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47986:33;;2036:41:1;;;47986:33:0::1;::::0;2009:18:1;47986:33:0::1;;;;;;;47848:179:::0;;:::o;45039:142::-;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;9025:12;;45096::::1;:28:::0;;;45140:33:::1;::::0;2234:25:1;;;45140:33:0::1;::::0;2222:2:1;2207:18;45140:33:0::1;2088:177:1::0;44775:256:0;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;44891:4:::1;44886:3;44866:13;9025:12:::0;;;8937:108;44866:13:::1;:17;::::0;44882:1:::1;44866:17;:::i;:::-;:23;;;;:::i;:::-;44865:30;;;;:::i;:::-;44855:6;:40;;44847:90;;;;-1:-1:-1::0;;;44847:90:0::1;;;;;;;:::i;:::-;44961:17;:6:::0;44971::::1;44961:17;:::i;:::-;44948:10;:30:::0;;;44994:29:::1;::::0;2234:25:1;;;44994:29:0::1;::::0;2222:2:1;2207:18;44994:29:0::1;2088:177:1::0;49487:126:0;49566:15;;:39;;;-1:-1:-1;;;49566:39:0;;;;49542:7;;-1:-1:-1;;;;;49566:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;48035:124;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;48109:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;48109:42:0;;::::1;::::0;::::1;2234:25:1::0;;;-1:-1:-1;;;;;48109:15:0;;::::1;::::0;:31:::1;::::0;2207:18:1;;48109:42:0::1;2088:177:1::0;49049:325:0;49326:15;;:40;;-1:-1:-1;;;49326:40:0;;;;;2234:25:1;;;49150:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49326:15:0;;;;:33;;2207:18:1;;49326:40:0;2088:177:1;12687:244:0;12442:6;;-1:-1:-1;;;;;12442:6:0;397:10;12442:22;12434:67;;;;-1:-1:-1;;;12434:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12776:22:0;::::1;12768:73;;;::::0;-1:-1:-1;;;12768:73:0;;18070:2:1;12768:73:0::1;::::0;::::1;18052:21:1::0;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;-1:-1:-1;;;18199:18:1;;;18192:36;18245:19;;12768:73:0::1;17868:402:1::0;12768:73:0::1;12878:6;::::0;12857:38:::1;::::0;-1:-1:-1;;;;;12857:38:0;;::::1;::::0;12878:6:::1;::::0;12857:38:::1;::::0;12878:6:::1;::::0;12857:38:::1;12906:6;:17:::0;;-1:-1:-1;;;;;;12906:17:0::1;-1:-1:-1::0;;;;;12906:17:0;;;::::1;::::0;;;::::1;::::0;;12687:244::o;11647:337::-;-1:-1:-1;;;;;11746:19:0;;11738:68;;;;-1:-1:-1;;;11738:68:0;;18477:2:1;11738:68:0;;;18459:21:1;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:34;18650:19;;11738:68:0;18275:400:1;11738:68:0;-1:-1:-1;;;;;11825:21:0;;11817:68;;;;-1:-1:-1;;;11817:68:0;;18882:2:1;11817:68:0;;;18864:21:1;18921:2;18901:18;;;18894:30;18960:34;18940:18;;;18933:62;-1:-1:-1;;;19011:18:1;;;19004:32;19053:19;;11817:68:0;18680:398:1;11817:68:0;-1:-1:-1;;;;;11898:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:33;;;11947:29;;2234:25:1;;;11947:29:0;;2207:18:1;11947:29:0;;;;;;;11647:337;;;:::o;10790:562::-;-1:-1:-1;;;;;10893:20:0;;10885:70;;;;-1:-1:-1;;;10885:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10974:23:0;;10966:71;;;;-1:-1:-1;;;10966:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11074:17:0;;11050:21;11074:17;;;;;;;;;;;11110:20;;;;11102:68;;;;-1:-1:-1;;;11102:68:0;;20095:2:1;11102:68:0;;;20077:21:1;20134:2;20114:18;;;20107:30;20173:34;20153:18;;;20146:62;-1:-1:-1;;;20224:18:1;;;20217:33;20267:19;;11102:68:0;19893:399:1;11102:68:0;-1:-1:-1;;;;;11206:17:0;;;:9;:17;;;;;;;;;;;11226:19;;;11206:39;;11267:20;;;;;;;;:27;;11242:3;;11206:9;11267:27;;11242:3;;11267:27;:::i;:::-;;;;;;;;11329:9;-1:-1:-1;;;;;11312:32:0;11321:6;-1:-1:-1;;;;;11312:32:0;;11340:3;11312:32;;;;2234:25:1;;2222:2;2207:18;;2088:177;11312:32:0;;;;;;;;10874:478;10790:562;;;:::o;49905:3987::-;-1:-1:-1;;;;;50002:18:0;;49994:68;;;;-1:-1:-1;;;49994:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50081:16:0;;50073:64;;;;-1:-1:-1;;;50073:64:0;;;;;;;:::i;:::-;50151:3;50158:1;50151:8;50148:88;;50175:28;50191:4;50197:2;50201:1;50175:15;:28::i;50148:88::-;50260:11;;;;;;;50256:128;;-1:-1:-1;;;;;50295:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;50323:22:0;;;;;;:18;:22;;;;;;;;50295:50;50287:85;;;;-1:-1:-1;;;50287:85:0;;20499:2:1;50287:85:0;;;20481:21:1;20538:2;20518:18;;;20511:30;-1:-1:-1;;;20557:18:1;;;20550:52;20619:18;;50287:85:0;20297:346:1;50287:85:0;-1:-1:-1;;;;;50399:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;50427:22:0;;;;;;:18;:22;;;;;;;;50399:50;:62;;;-1:-1:-1;50453:8:0;;-1:-1:-1;;;50453:8:0;;;;50399:62;50396:286;;;50477:30;50493:4;50499:2;50503:3;50477:15;:30::i;:::-;50522:15;;-1:-1:-1;;;;;50522:15:0;:26;50557:4;50564:15;50557:4;50564:9;:15::i;:::-;50522:58;;-1:-1:-1;;;;;;50522:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50522:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50522:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50595:15:0;;-1:-1:-1;;;;;50595:15:0;;-1:-1:-1;50595:26:0;;-1:-1:-1;50630:2:0;50635:13;50630:2;50635:9;:13::i;:::-;50595:54;;-1:-1:-1;;;;;;50595:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50595:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50595:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49905:3987;;;:::o;50396:286::-;50705:12;;;;50702:936;;;12380:6;;-1:-1:-1;;;;;50737:15:0;;;12380:6;;50737:15;;;;:32;;-1:-1:-1;12380:6:0;;-1:-1:-1;;;;;50756:13:0;;;12380:6;;50756:13;;50737:32;:52;;;;-1:-1:-1;;;;;;50773:16:0;;;;50737:52;:77;;;;-1:-1:-1;;;;;;50793:21:0;;50807:6;50793:21;;50737:77;:106;;;;-1:-1:-1;;;;;;50819:24:0;;;;;;:18;:24;;;;;;;;50818:25;50737:106;:133;;;;-1:-1:-1;;;;;;50848:22:0;;;;;;:18;:22;;;;;;;;50847:23;50737:133;50733:894;;;-1:-1:-1;;;;;50922:31:0;;;;;;:25;:31;;;;;;;;:68;;;;-1:-1:-1;;;;;;50958:32:0;;;;;;:28;:32;;;;;;;;50957:33;50922:68;50918:694;;;51030:9;;51023:3;:16;;51015:66;;;;-1:-1:-1;;;51015:66:0;;20850:2:1;51015:66:0;;;20832:21:1;20889:2;20869:18;;;20862:30;20928:34;20908:18;;;20901:62;-1:-1:-1;;;20979:18:1;;;20972:35;21024:19;;51015:66:0;20648:401:1;51015:66:0;51135:12;;51118:13;51128:2;51118:9;:13::i;:::-;51112:19;;:3;:19;:::i;:::-;:35;;51104:72;;;;-1:-1:-1;;;51104:72:0;;21256:2:1;51104:72:0;;;21238:21:1;21295:2;21275:18;;;21268:30;-1:-1:-1;;;21314:18:1;;;21307:54;21378:18;;51104:72:0;21054:348:1;51104:72:0;50918:694;;;-1:-1:-1;;;;;51253:29:0;;;;;;:25;:29;;;;;;;;:68;;;;-1:-1:-1;;;;;;51287:34:0;;;;;;:28;:34;;;;;;;;51286:35;51253:68;51249:363;;;51361:10;;51354:3;:17;;51346:69;;;;-1:-1:-1;;;51346:69:0;;21609:2:1;51346:69:0;;;21591:21:1;21648:2;21628:18;;;21621:30;21687:34;21667:18;;;21660:62;-1:-1:-1;;;21738:18:1;;;21731:37;21785:19;;51346:69:0;21407:403:1;51249:363:0;-1:-1:-1;;;;;51464:32:0;;;;;;:28;:32;;;;;;;;51459:153;;51551:12;;51534:13;51544:2;51534:9;:13::i;:::-;51528:19;;:3;:19;:::i;:::-;:35;;51520:72;;;;-1:-1:-1;;;51520:72:0;;21256:2:1;51520:72:0;;;21238:21:1;21295:2;21275:18;;;21268:30;-1:-1:-1;;;21314:18:1;;;21307:54;21378:18;;51520:72:0;21054:348:1;51520:72:0;51650:28;51681:24;51699:4;51681:9;:24::i;:::-;51765:15;;51650:55;;-1:-1:-1;51741:39:0;;;;;;;51796:22;;-1:-1:-1;51807:11:0;;;;;;;51796:22;:35;;;;-1:-1:-1;51823:8:0;;-1:-1:-1;;;51823:8:0;;;;51822:9;51796:35;:68;;;;-1:-1:-1;;;;;;51835:29:0;;;;;;:25;:29;;;;;;;;51796:68;51793:171;;;51881:8;:15;;-1:-1:-1;;;;51881:15:0;-1:-1:-1;;;51881:15:0;;;51911:10;:8;:10::i;:::-;51936:8;:16;;-1:-1:-1;;;;51936:16:0;;;51793:171;-1:-1:-1;;;;;52094:24:0;;51976:12;52094:24;;;:18;:24;;;;;;51991:4;;52094:24;;;:50;;-1:-1:-1;;;;;;52122:22:0;;;;;;:18;:22;;;;;;;;52094:50;52091:97;;;-1:-1:-1;52171:5:0;52091:97;52208:11;52310:7;52307:1399;;;57340:18;;57325:12;:33;52338:60;;;;-1:-1:-1;;;;;;52367:31:0;;;;;;:25;:31;;;;;;;;52338:60;:94;;;;-1:-1:-1;;;;;;52403:29:0;;;;;;:25;:29;;;;;;;;52402:30;52338:94;:121;;;;-1:-1:-1;;;;;;52437:22:0;;;;;;:18;:22;;;;;;;;52436:23;52338:121;:140;;;;;52477:1;52463:11;;:15;52338:140;52335:1208;;;39954:5;52504:10;:3;52510:4;52504:10;:::i;:::-;:24;;;;:::i;:::-;52498:30;;52590:11;;52572:15;;52566:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;52544:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52666:11:0;;52648:15;;52642:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;52620:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52736:11:0;;52721:12;;52715:18;;:3;:18;:::i;:::-;:32;;;;:::i;:::-;52696:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;52335:1208:0;;-1:-1:-1;52335:1208:0;;-1:-1:-1;;;;;52810:29:0;;;;;;:25;:29;;;;;;;;:49;;;;;52858:1;52843:12;;:16;52810:49;52806:737;;;39954:5;52891:12;;52885:3;:18;;;;:::i;:::-;:32;;;;:::i;:::-;52879:38;;52983:12;;52964:16;;52958:3;:22;;;;:::i;:::-;:37;;;;:::i;:::-;52936:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53061:12:0;;53042:16;;53036:22;;:3;:22;:::i;:::-;:37;;;;:::i;:::-;53014:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53133:12:0;;53117:13;;53111:19;;:3;:19;:::i;52806:737::-;-1:-1:-1;;;;;53206:31:0;;;;;;:25;:31;;;;;;;;:50;;;;;53255:1;53241:11;;:15;53206:50;53203:340;;;39954:5;53286:11;;53280:3;:17;;;;:::i;:::-;:31;;;;:::i;:::-;53274:37;;53373:11;;53355:15;;53349:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;53327:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53446:11:0;;53428:15;;53422:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;53400:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53516:11:0;;53501:12;;53495:18;;:3;:18;:::i;:::-;:32;;;;:::i;:::-;53476:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;53203:340:0;53574:7;;53571:91;;53605:41;53621:4;53635;53642:3;53605:15;:41::i;:::-;53684:10;53691:3;53684:10;;:::i;:::-;;;52307:1399;53718:30;53734:4;53740:2;53744:3;53718:15;:30::i;:::-;53761:15;;-1:-1:-1;;;;;53761:15:0;:26;53796:4;53803:15;53796:4;53803:9;:15::i;:::-;53761:58;;-1:-1:-1;;;;;;53761:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53761:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53761:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53830:15:0;;-1:-1:-1;;;;;53830:15:0;;-1:-1:-1;53830:26:0;;-1:-1:-1;53865:2:0;53870:13;53865:2;53870:9;:13::i;:::-;53830:54;;-1:-1:-1;;;;;;53830:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53830:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53830:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49981:3911;;;;49905:3987;;;:::o;54402:1406::-;54443:23;54469:24;54487:4;54469:9;:24::i;:::-;54443:50;;54504:25;54574:15;;54553:18;;54532;;:39;;;;:::i;:::-;:57;;;;:::i;:::-;54504:85;-1:-1:-1;54613:20:0;;;:46;;-1:-1:-1;54637:22:0;;54613:46;54610:60;;;54662:7;;54402:1406::o;54610:60::-;54703:15;;:20;;54721:2;54703:20;:::i;:::-;54685:15;:38;54682:107;;;54757:15;;:20;;54775:2;54757:20;:::i;:::-;54739:38;;54682:107;54812:18;;:22;54809:396;;54850:23;54915:17;54894:18;;54876:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;54978:6;;54850:82;;-1:-1:-1;54947:55:0;;54971:4;;-1:-1:-1;;;;;54978:6:0;54850:82;54947:15;:55::i;:::-;55029:6;;;;;;;;;-1:-1:-1;;;;;55029:6:0;-1:-1:-1;;;;;55021:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55017:37;55068:34;55087:15;55068:34;;:::i;:::-;;;55138:18;;55117:39;;;;;:::i;:::-;55192:1;55171:18;:22;55117:39;-1:-1:-1;;54809:396:0;55228:19;;55225:576;;55263:12;55290:32;55306:15;55290;:32::i;:::-;55340:15;;:19;55337:226;;55379:20;55444:17;55420:21;55402:15;;:39;;;;:::i;:::-;:59;;;;:::i;:::-;55501:15;;55493:54;;55379:82;;-1:-1:-1;;;;;;55501:15:0;;55379:82;;55493:54;;;;55379:82;55501:15;55493:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55480:67:0;;-1:-1:-1;;;55337:226:0;55582:18;;:22;55579:138;;55645:16;;55637:64;;-1:-1:-1;;;;;55645:16:0;;;;55675:21;;55637:64;;;;55675:21;55645:16;55637:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55624:77:0;;-1:-1:-1;;55579:138:0;-1:-1:-1;55754:1:0;55733:18;:22;;;55770:15;:19;55225:576;54430:1378;;54402:1406::o;6819:211::-;6963:58;;;-1:-1:-1;;;;;10388:32:1;;6963:58:0;;;10370:51:1;10437:18;;;;10430:34;;;6963:58:0;;;;;;;;;;10343:18:1;;;;6963:58:0;;;;;;;;-1:-1:-1;;;;;6963:58:0;-1:-1:-1;;;6963:58:0;;;6936:86;;6956:5;;6936:19;:86::i;45525:204::-;-1:-1:-1;;;;;45613:36:0;;;;;;:28;:36;;;;;;;;;:49;;-1:-1:-1;;45613:49:0;;;;;;;;;;45678:43;;11394:51:1;;;11461:18;;;11454:50;45678:43:0;;11367:18:1;45678:43:0;;;;;;;45525:204;;:::o;53900:494::-;54048:16;;;54062:1;54048:16;;;;;;;;54024:21;;54048:16;;;;;;;;;;-1:-1:-1;54048:16:0;54024:40;;54093:4;54075;54080:1;54075:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;54075:23:0;;;-1:-1:-1;;;;;54075:23:0;;;;;54119:9;-1:-1:-1;;;;;54119:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54109:4;54114:1;54109:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54109:26:0;;;:7;;;;;;;;;:26;54174:212;;-1:-1:-1;;;54174:212:0;;:9;:60;;;;;;:212;;54249:8;;54272:1;;54313:4;;54340;;54360:15;;54174:212;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53951:443;53900:494;:::o;7038:333::-;7119:23;7145:69;7173:4;7145:69;;;;;;;;;;;;;;;;;7153:5;-1:-1:-1;;;;;7145:27:0;;;:69;;;;;:::i;:::-;7229:17;;7119:95;;-1:-1:-1;7229:21:0;7225:139;;7286:10;7275:30;;;;;;;;;;;;:::i;:::-;7267:85;;;;-1:-1:-1;;;7267:85:0;;23890:2:1;7267:85:0;;;23872:21:1;23929:2;23909:18;;;23902:30;23968:34;23948:18;;;23941:62;-1:-1:-1;;;24019:18:1;;;24012:40;24069:19;;7267:85:0;23688:406:1;1322:229:0;1459:12;1491:52;1513:6;1521:4;1527:1;1530:12;1491:21;:52::i;:::-;1484:59;1322:229;-1:-1:-1;;;;1322:229:0:o;2442:455::-;2612:12;2670:5;2645:21;:30;;2637:81;;;;-1:-1:-1;;;2637:81:0;;24301:2:1;2637:81:0;;;24283:21:1;24340:2;24320:18;;;24313:30;24379:34;24359:18;;;24352:62;-1:-1:-1;;;24430:18:1;;;24423:36;24476:19;;2637:81:0;24099:402:1;2637:81:0;2730:12;2744:23;2771:6;-1:-1:-1;;;;;2771:11:0;2790:5;2797:4;2771:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2729:73;;;;2820:69;2847:6;2855:7;2864:10;2876:12;2820:26;:69::i;:::-;2813:76;2442:455;-1:-1:-1;;;;;;;2442:455:0:o;5015:644::-;5200:12;5229:7;5225:427;;;5257:10;:17;5278:1;5257:22;5253:290;;-1:-1:-1;;;;;772:19:0;;;5467:60;;;;-1:-1:-1;;;5467:60:0;;25000:2:1;5467:60:0;;;24982:21:1;25039:2;25019:18;;;25012:30;25078:31;25058:18;;;25051:59;25127:18;;5467:60:0;24798:353:1;5467:60:0;-1:-1:-1;5564:10:0;5557:17;;5225:427;5607:33;5615:10;5627:12;6362:17;;:21;6358:388;;6594:10;6588:17;6651:15;6638:10;6634:2;6630:19;6623:44;6358:388;6721:12;6714:20;;-1:-1:-1;;;6714:20:0;;;;;;;;:::i;236:316:1:-;313:6;321;329;382:2;370:9;361:7;357:23;353:32;350:52;;;398:1;395;388:12;350:52;-1:-1:-1;;421:23:1;;;491:2;476:18;;463:32;;-1:-1:-1;542:2:1;527:18;;;514:32;;236:316;-1:-1:-1;236:316:1:o;557:250::-;642:1;652:113;666:6;663:1;660:13;652:113;;;742:11;;;736:18;723:11;;;716:39;688:2;681:10;652:113;;;-1:-1:-1;;799:1:1;781:16;;774:27;557:250::o;812:396::-;961:2;950:9;943:21;924:4;993:6;987:13;1036:6;1031:2;1020:9;1016:18;1009:34;1052:79;1124:6;1119:2;1108:9;1104:18;1099:2;1091:6;1087:15;1052:79;:::i;:::-;1192:2;1171:15;-1:-1:-1;;1167:29:1;1152:45;;;;1199:2;1148:54;;812:396;-1:-1:-1;;812:396:1:o;1440:131::-;-1:-1:-1;;;;;1515:31:1;;1505:42;;1495:70;;1561:1;1558;1551:12;1576:315;1644:6;1652;1705:2;1693:9;1684:7;1680:23;1676:32;1673:52;;;1721:1;1718;1711:12;1673:52;1760:9;1747:23;1779:31;1804:5;1779:31;:::i;:::-;1829:5;1881:2;1866:18;;;;1853:32;;-1:-1:-1;;;1576:315:1:o;2270:127::-;2331:10;2326:3;2322:20;2319:1;2312:31;2362:4;2359:1;2352:15;2386:4;2383:1;2376:15;2402:275;2473:2;2467:9;2538:2;2519:13;;-1:-1:-1;;2515:27:1;2503:40;;2573:18;2558:34;;2594:22;;;2555:62;2552:88;;;2620:18;;:::i;:::-;2656:2;2649:22;2402:275;;-1:-1:-1;2402:275:1:o;2682:183::-;2742:4;2775:18;2767:6;2764:30;2761:56;;;2797:18;;:::i;:::-;-1:-1:-1;2842:1:1;2838:14;2854:4;2834:25;;2682:183::o;2870:662::-;2924:5;2977:3;2970:4;2962:6;2958:17;2954:27;2944:55;;2995:1;2992;2985:12;2944:55;3031:6;3018:20;3057:4;3081:60;3097:43;3137:2;3097:43;:::i;:::-;3081:60;:::i;:::-;3175:15;;;3261:1;3257:10;;;;3245:23;;3241:32;;;3206:12;;;;3285:15;;;3282:35;;;3313:1;3310;3303:12;3282:35;3349:2;3341:6;3337:15;3361:142;3377:6;3372:3;3369:15;3361:142;;;3443:17;;3431:30;;3481:12;;;;3394;;3361:142;;;-1:-1:-1;3521:5:1;2870:662;-1:-1:-1;;;;;;2870:662:1:o;3537:1215::-;3655:6;3663;3716:2;3704:9;3695:7;3691:23;3687:32;3684:52;;;3732:1;3729;3722:12;3684:52;3772:9;3759:23;3801:18;3842:2;3834:6;3831:14;3828:34;;;3858:1;3855;3848:12;3828:34;3896:6;3885:9;3881:22;3871:32;;3941:7;3934:4;3930:2;3926:13;3922:27;3912:55;;3963:1;3960;3953:12;3912:55;3999:2;3986:16;4021:4;4045:60;4061:43;4101:2;4061:43;:::i;4045:60::-;4139:15;;;4221:1;4217:10;;;;4209:19;;4205:28;;;4170:12;;;;4245:19;;;4242:39;;;4277:1;4274;4267:12;4242:39;4301:11;;;;4321:217;4337:6;4332:3;4329:15;4321:217;;;4417:3;4404:17;4434:31;4459:5;4434:31;:::i;:::-;4478:18;;4354:12;;;;4516;;;;4321:217;;;4557:5;-1:-1:-1;;4600:18:1;;4587:32;;-1:-1:-1;;4631:16:1;;;4628:36;;;4660:1;4657;4650:12;4628:36;;4683:63;4738:7;4727:8;4716:9;4712:24;4683:63;:::i;:::-;4673:73;;;3537:1215;;;;;:::o;4757:456::-;4834:6;4842;4850;4903:2;4891:9;4882:7;4878:23;4874:32;4871:52;;;4919:1;4916;4909:12;4871:52;4958:9;4945:23;4977:31;5002:5;4977:31;:::i;:::-;5027:5;-1:-1:-1;5084:2:1;5069:18;;5056:32;5097:33;5056:32;5097:33;:::i;:::-;4757:456;;5149:7;;-1:-1:-1;;;5203:2:1;5188:18;;;;5175:32;;4757:456::o;5647:247::-;5706:6;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5814:9;5801:23;5833:31;5858:5;5833:31;:::i;:::-;5883:5;5647:247;-1:-1:-1;;;5647:247:1:o;6107:118::-;6193:5;6186:13;6179:21;6172:5;6169:32;6159:60;;6215:1;6212;6205:12;6230:382;6295:6;6303;6356:2;6344:9;6335:7;6331:23;6327:32;6324:52;;;6372:1;6369;6362:12;6324:52;6411:9;6398:23;6430:31;6455:5;6430:31;:::i;:::-;6480:5;-1:-1:-1;6537:2:1;6522:18;;6509:32;6550:30;6509:32;6550:30;:::i;:::-;6599:7;6589:17;;;6230:382;;;;;:::o;6617:180::-;6676:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:52;;;6745:1;6742;6735:12;6697:52;-1:-1:-1;6768:23:1;;6617:180;-1:-1:-1;6617:180:1:o;6802:388::-;6870:6;6878;6931:2;6919:9;6910:7;6906:23;6902:32;6899:52;;;6947:1;6944;6937:12;6899:52;6986:9;6973:23;7005:31;7030:5;7005:31;:::i;:::-;7055:5;-1:-1:-1;7112:2:1;7097:18;;7084:32;7125:33;7084:32;7125:33;:::i;7901:356::-;8103:2;8085:21;;;8122:18;;;8115:30;8181:34;8176:2;8161:18;;8154:62;8248:2;8233:18;;7901:356::o;8262:127::-;8323:10;8318:3;8314:20;8311:1;8304:31;8354:4;8351:1;8344:15;8378:4;8375:1;8368:15;8394:125;8459:9;;;8480:10;;;8477:36;;;8493:18;;:::i;8881:380::-;8960:1;8956:12;;;;9003;;;9024:61;;9078:4;9070:6;9066:17;9056:27;;9024:61;9131:2;9123:6;9120:14;9100:18;9097:38;9094:161;;9177:10;9172:3;9168:20;9165:1;9158:31;9212:4;9209:1;9202:15;9240:4;9237:1;9230:15;9094:161;;8881:380;;;:::o;10048:127::-;10109:10;10104:3;10100:20;10097:1;10090:31;10140:4;10137:1;10130:15;10164:4;10161:1;10154:15;10475:135;10514:3;10535:17;;;10532:43;;10555:18;;:::i;:::-;-1:-1:-1;10602:1:1;10591:13;;10475:135::o;11021:184::-;11091:6;11144:2;11132:9;11123:7;11119:23;11115:32;11112:52;;;11160:1;11157;11150:12;11112:52;-1:-1:-1;11183:16:1;;11021:184;-1:-1:-1;11021:184:1:o;11515:245::-;11582:6;11635:2;11623:9;11614:7;11610:23;11606:32;11603:52;;;11651:1;11648;11641:12;11603:52;11683:9;11677:16;11702:28;11724:5;11702:28;:::i;14006:168::-;14079:9;;;14110;;14127:15;;;14121:22;;14107:37;14097:71;;14148:18;;:::i;14179:217::-;14219:1;14245;14235:132;;14289:10;14284:3;14280:20;14277:1;14270:31;14324:4;14321:1;14314:15;14352:4;14349:1;14342:15;14235:132;-1:-1:-1;14381:9:1;;14179:217::o;14401:401::-;14603:2;14585:21;;;14642:2;14622:18;;;14615:30;14681:34;14676:2;14661:18;;14654:62;-1:-1:-1;;;14747:2:1;14732:18;;14725:35;14792:3;14777:19;;14401:401::o;17182:681::-;17313:6;17321;17329;17337;17345;17353;17361;17369;17422:3;17410:9;17401:7;17397:23;17393:33;17390:53;;;17439:1;17436;17429:12;17390:53;17471:9;17465:16;17490:31;17515:5;17490:31;:::i;:::-;17540:5;17530:15;;;17585:2;17574:9;17570:18;17564:25;17554:35;;17629:2;17618:9;17614:18;17608:25;17598:35;;17673:2;17662:9;17658:18;17652:25;17642:35;;17717:3;17706:9;17702:19;17696:26;17686:36;;17762:3;17751:9;17747:19;17741:26;17731:36;;17807:3;17796:9;17792:19;17786:26;17776:36;;17852:3;17841:9;17837:19;17831:26;17821:36;;17182:681;;;;;;;;;;;:::o;19083:401::-;19285:2;19267:21;;;19324:2;19304:18;;;19297:30;19363:34;19358:2;19343:18;;19336:62;-1:-1:-1;;;19429:2:1;19414:18;;19407:35;19474:3;19459:19;;19083:401::o;19489:399::-;19691:2;19673:21;;;19730:2;19710:18;;;19703:30;19769:34;19764:2;19749:18;;19742:62;-1:-1:-1;;;19835:2:1;19820:18;;19813:33;19878:3;19863:19;;19489:399::o;21815:128::-;21882:9;;;21903:11;;;21900:37;;;21917:18;;:::i;22447:251::-;22517:6;22570:2;22558:9;22549:7;22545:23;22541:32;22538:52;;;22586:1;22583;22576:12;22538:52;22618:9;22612:16;22637:31;22662:5;22637:31;:::i;22703:980::-;22965:4;23013:3;23002:9;22998:19;23044:6;23033:9;23026:25;23070:2;23108:6;23103:2;23092:9;23088:18;23081:34;23151:3;23146:2;23135:9;23131:18;23124:31;23175:6;23210;23204:13;23241:6;23233;23226:22;23279:3;23268:9;23264:19;23257:26;;23318:2;23310:6;23306:15;23292:29;;23339:1;23349:195;23363:6;23360:1;23357:13;23349:195;;;23428:13;;-1:-1:-1;;;;;23424:39:1;23412:52;;23519:15;;;;23484:12;;;;23460:1;23378:9;23349:195;;;-1:-1:-1;;;;;;;23600:32:1;;;;23595:2;23580:18;;23573:60;-1:-1:-1;;;23664:3:1;23649:19;23642:35;23561:3;22703:980;-1:-1:-1;;;22703:980:1:o;24506:287::-;24635:3;24673:6;24667:13;24689:66;24748:6;24743:3;24736:4;24728:6;24724:17;24689:66;:::i;:::-;24771:16;;;;;24506:287;-1:-1:-1;;24506:287:1:o

Swarm Source

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